OSDN Git Service

#26005 レーンの表示/非表示状態をDTXC終了時にDTXCreatorSetting.configに保持し、次回起動時に同設定を反映するようにした。
[dtxmania/dtxmania.git] / DTXCreatorプロジェクト / コード / 05.譜面 / C譜面管理.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Diagnostics;\r
5 using System.Drawing;\r
6 using System.Drawing.Drawing2D;\r
7 using System.Windows.Forms;\r
8 using DTXCreator.UndoRedo;\r
9 using FDK;\r
10 \r
11 namespace DTXCreator.譜面\r
12 {\r
13         internal class C譜面管理\r
14         {\r
15                 public Bitmap bmp背景画像;\r
16                 public Dictionary<int, float> dicBPx = new Dictionary<int, float>();\r
17                 public Dictionary<int, C小節> dic小節 = new Dictionary<int, C小節>();\r
18                 public List<Cレーン> listレーン = new List<Cレーン>();\r
19                 public static readonly int nレーン割付チップ番号表示高さdot = 10;\r
20                 public static readonly int nレーン番号表示高さdot = 0x20;\r
21                 public int n現在のガイド幅grid = ( C小節.n基準の高さgrid / 0x10 );\r
22                 public int n現在の譜面表示下辺の譜面先頭からの位置grid;\r
23                 public string strPATH_WAV = "";\r
24 \r
25                 public C譜面管理( Cメインフォーム cm )\r
26                 {\r
27                         this._Form = cm;\r
28                 }\r
29                 public bool bOPENチップである( Cチップ cc )\r
30                 {\r
31                         Cレーン cレーン = this.listレーン[ cc.nレーン番号0to ];\r
32                         return ( ( cc.n値・整数1to1295 == 2 ) && ( ( cレーン.eレーン種別 == Cレーン.E種別.GtR ) || ( cレーン.eレーン種別 == Cレーン.E種別.BsR ) ) );\r
33                 }\r
34                 public bool b確定選択中のチップがある()\r
35                 {\r
36                         foreach( KeyValuePair<int, C小節> pair in this.dic小節 )\r
37                         {\r
38                                 foreach( Cチップ cチップ in pair.Value.listチップ )\r
39                                 {\r
40                                         if( cチップ.b確定選択中 || cチップ.bドラッグで選択中 )\r
41                                         {\r
42                                                 return true;\r
43                                         }\r
44                                 }\r
45                         }\r
46                         return false;\r
47                 }\r
48                 public decimal dc譜面先頭からの位置gridにおけるBPMを返す( int n譜面先頭からの位置grid )\r
49                 {\r
50                         decimal num = this._Form.dc現在のBPM;\r
51                         C小節 c小節 = this.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
52                         if( c小節 != null )\r
53                         {\r
54                                 for( int i = 0; i <= c小節.n小節番号0to3599; i++ )\r
55                                 {\r
56                                         C小節 c小節2 = this.p小節を返す( i );\r
57                                         if( c小節2 != null )\r
58                                         {\r
59                                                 int num3 = this.n譜面先頭からみた小節先頭の位置gridを返す( i );\r
60                                                 foreach( Cチップ cチップ in c小節2.listチップ )\r
61                                                 {\r
62                                                         if( ( cチップ.nチャンネル番号00toFF == 8 ) && ( ( num3 + cチップ.n位置grid ) <= n譜面先頭からの位置grid ) )\r
63                                                         {\r
64                                                                 num = (decimal) cチップ.f値・浮動小数;\r
65                                                         }\r
66                                                 }\r
67                                         }\r
68                                 }\r
69                         }\r
70                         return num;\r
71                 }\r
72                 public int nX座標dotが位置するレーン番号を返す( int nXdot )\r
73                 {\r
74                         if( nXdot >= 0 )\r
75                         {\r
76                                 int num = 0;\r
77                                 int num2 = 0;\r
78                                 foreach( Cレーン cレーン in this.listレーン )\r
79                                 {\r
80                                         num += cレーン.n幅dot;\r
81                                         if( nXdot < num )\r
82                                         {\r
83                                                 return num2;\r
84                                         }\r
85                                         num2++;\r
86                                 }\r
87                         }\r
88                         return -1;\r
89                 }\r
90                 public int nY座標dotが位置するgridを返す・ガイド幅単位( int nY )\r
91                 {\r
92                         int num = this.nY座標dotが位置するgridを返す・最高解像度( nY );\r
93                         C小節 c小節 = this.p譜面先頭からの位置gridを含む小節を返す( num );\r
94                         if( c小節 == null )\r
95                         {\r
96                                 c小節 = this.p小節を返す( this.n現在の最大の小節番号を返す() );\r
97                         }\r
98                         int num2 = this.n譜面先頭からみた小節先頭の位置gridを返す( c小節.n小節番号0to3599 );\r
99                         int num3 = ( ( num - num2 ) / this.n現在のガイド幅grid ) * this.n現在のガイド幅grid;\r
100                         return ( num2 + num3 );\r
101                 }\r
102                 public int nY座標dotが位置するgridを返す・最高解像度( int nY )\r
103                 {\r
104                         int num = this._Form.pictureBox譜面パネル.ClientSize.Height - nY;\r
105                         return ( ( num / C小節.n1グリッドの高さdot ) + this.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
106                 }\r
107                 public int nレーンの左端X座標dotを返す( int nレーン番号0to )\r
108                 {\r
109                         if( ( nレーン番号0to >= 0 ) && ( nレーン番号0to < this.listレーン.Count ) )\r
110                         {\r
111                                 return this.listレーン[ nレーン番号0to ].n位置Xdot;\r
112                         }\r
113                         return -1;\r
114                 }\r
115                 public int nレーン名に対応するレーン番号を返す( string strレーン名 )\r
116                 {\r
117                         int nLaneNo = 0;\r
118                         foreach( Cレーン cレーン in this.listレーン )\r
119                         {\r
120                                 if( cレーン.strレーン名.Equals( strレーン名 ) )\r
121                                 {\r
122                                         return nLaneNo;\r
123                                 }\r
124                                 nLaneNo++;\r
125                         }\r
126                         return -1;\r
127                 }\r
128                 public int n現在の最大の小節番号を返す()\r
129                 {\r
130                         int nBar = -1;\r
131                         foreach( KeyValuePair<int, C小節> pair in this.dic小節 )\r
132                         {\r
133                                 C小節 c小節 = pair.Value;\r
134                                 if( c小節.n小節番号0to3599 > nBar )\r
135                                 {\r
136                                         nBar = c小節.n小節番号0to3599;\r
137                                 }\r
138                         }\r
139                         return nBar;\r
140                 }\r
141                 public int n全小節の高さdotの合計を返す()\r
142                 {\r
143                         int nHeights = 0;\r
144                         foreach( KeyValuePair<int, C小節> pair in this.dic小節 )\r
145                         {\r
146                                 nHeights += pair.Value.n小節長倍率を考慮した現在の小節の高さdot;\r
147                         }\r
148                         return nHeights;\r
149                 }\r
150                 public int n全小節の高さgridの合計を返す()\r
151                 {\r
152                         int num = 0;\r
153                         foreach( KeyValuePair<int, C小節> pair in this.dic小節 )\r
154                         {\r
155                                 num += pair.Value.n小節長倍率を考慮した現在の小節の高さgrid;\r
156                         }\r
157                         return num;\r
158                 }\r
159                 public int n譜面先頭からの位置gridから描画領域内のY座標dotを返す( int n譜面先頭からの位置grid, Size sz描画領域dot )\r
160                 {\r
161                         int num = n譜面先頭からの位置grid - this.n現在の譜面表示下辺の譜面先頭からの位置grid;\r
162                         return ( sz描画領域dot.Height - ( num * C小節.n1グリッドの高さdot ) );\r
163                 }\r
164                 public int n譜面先頭からみた小節先頭の位置gridを返す( int n小節番号0to3599 )\r
165                 {\r
166                         if( ( n小節番号0to3599 < 0 ) || ( n小節番号0to3599 > this.n現在の最大の小節番号を返す() ) )\r
167                         {\r
168                                 return -1;\r
169                         }\r
170                         int num = 0;\r
171                         for( int i = 0; i < n小節番号0to3599; i++ )\r
172                         {\r
173                                 C小節 c小節 = this.p小節を返す( i );\r
174                                 if( c小節 != null )\r
175                                 {\r
176                                         num += c小節.n小節長倍率を考慮した現在の小節の高さgrid;\r
177                                 }\r
178                         }\r
179                         return num;\r
180                 }\r
181                 public C小節 pチップの存在する小節を返す( Cチップ cc )\r
182                 {\r
183                         foreach( KeyValuePair<int, C小節> pair in this.dic小節 )\r
184                         {\r
185                                 C小節 c小節 = pair.Value;\r
186                                 if( c小節.listチップ.Contains( cc ) )\r
187                                 {\r
188                                         return c小節;\r
189                                 }\r
190                         }\r
191                         return null;\r
192                 }\r
193                 public Cチップ p指定された座標dotにあるチップを返す( int x, int y )\r
194                 {\r
195                         int num = this.nX座標dotが位置するレーン番号を返す( x );\r
196                         if( num >= 0 )\r
197                         {\r
198                                 int num2 = this.nY座標dotが位置するgridを返す・最高解像度( y );\r
199                                 C小節 c小節 = this.p譜面先頭からの位置gridを含む小節を返す( num2 );\r
200                                 if( c小節 == null )\r
201                                 {\r
202                                         return null;\r
203                                 }\r
204                                 int num3 = this.n譜面先頭からみた小節先頭の位置gridを返す( c小節.n小節番号0to3599 );\r
205                                 foreach( Cチップ cチップ in c小節.listチップ )\r
206                                 {\r
207                                         int num4 = num3 + cチップ.n位置grid;\r
208                                         int num5 = C小節.n位置変換dot2grid( Cチップ.nチップの高さdot );\r
209                                         if( ( ( cチップ.nレーン番号0to == num ) && ( num4 <= num2 ) ) && ( num2 <= ( num4 + num5 ) ) )\r
210                                         {\r
211                                                 return cチップ;\r
212                                         }\r
213                                 }\r
214                         }\r
215                         return null;\r
216                 }\r
217                 public Cチップ p指定位置にあるチップを返す( int n小節番号0to, int nレーン番号0to, int n小節内の位置grid )\r
218                 {\r
219                         C小節 c小節 = this.p小節を返す( n小節番号0to );\r
220                         if( c小節 != null )\r
221                         {\r
222                                 for( int i = 0; i < c小節.listチップ.Count; i++ )\r
223                                 {\r
224                                         Cチップ cチップ = c小節.listチップ[ i ];\r
225                                         if( ( cチップ.n位置grid == n小節内の位置grid ) && ( cチップ.nレーン番号0to == nレーン番号0to ) )\r
226                                         {\r
227                                                 return cチップ;\r
228                                         }\r
229                                 }\r
230                         }\r
231                         return null;\r
232                 }\r
233                 public C小節 p小節を返す( int n小節番号0to3599 )\r
234                 {\r
235                         C小節 c小節 = null;\r
236                         if( this.dic小節.TryGetValue( n小節番号0to3599, out c小節 ) )\r
237                         {\r
238                                 return c小節;\r
239                         }\r
240                         return null;\r
241                 }\r
242                 public C小節 p譜面先頭からの位置gridを含む小節を返す( int n譜面先頭からの位置grid )\r
243                 {\r
244                         int num = 0;\r
245                         int num2 = this.n現在の最大の小節番号を返す();\r
246                         for( int i = 0; i <= num2; i++ )\r
247                         {\r
248                                 C小節 c小節 = this.p小節を返す( i );\r
249                                 if( c小節 != null )\r
250                                 {\r
251                                         num += c小節.n小節長倍率を考慮した現在の小節の高さgrid;\r
252                                         if( n譜面先頭からの位置grid < num )\r
253                                         {\r
254                                                 return c小節;\r
255                                         }\r
256                                 }\r
257                         }\r
258                         return null;\r
259                 }\r
260                 public void tチップを削除する( int nレーン番号0to, int n譜面先頭からの位置grid )\r
261                 {\r
262                         C小節 c小節 = this.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
263                         if( c小節 != null )\r
264                         {\r
265                                 bool flag3;\r
266                                 int num = n譜面先頭からの位置grid - this.n譜面先頭からみた小節先頭の位置gridを返す( c小節.n小節番号0to3599 );\r
267                                 this._Form.mgrUndoRedo管理者.tトランザクション記録を開始する();\r
268                                 do\r
269                                 {\r
270                                         Cレーン cレーン = this.listレーン[ nレーン番号0to ];\r
271                                         bool flag = ( ( cレーン.eレーン種別 == Cレーン.E種別.GtR ) || ( cレーン.eレーン種別 == Cレーン.E種別.GtG ) ) || ( cレーン.eレーン種別 == Cレーン.E種別.GtB );\r
272                                         bool flag2 = ( ( cレーン.eレーン種別 == Cレーン.E種別.BsR ) || ( cレーン.eレーン種別 == Cレーン.E種別.BsG ) ) || ( cレーン.eレーン種別 == Cレーン.E種別.BsB );\r
273                                         flag3 = true;\r
274                                         foreach( Cチップ cチップ in c小節.listチップ )\r
275                                         {\r
276                                                 if( cチップ.n位置grid == num )\r
277                                                 {\r
278                                                         if( cチップ.nレーン番号0to == nレーン番号0to )\r
279                                                         {\r
280                                                                 Cチップ cc = new Cチップ();\r
281                                                                 cc.tコピーfrom( cチップ );\r
282                                                                 Cチップ配置用UndoRedo redo = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );\r
283                                                                 this._Form.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<Cチップ配置用UndoRedo>( null, new DGUndoを実行する<Cチップ配置用UndoRedo>( this.tチップ削除のUndo ), new DGRedoを実行する<Cチップ配置用UndoRedo>( this.tチップ削除のRedo ), redo, redo ) );\r
284                                                                 c小節.listチップ.Remove( cチップ );\r
285                                                                 flag3 = false;\r
286                                                                 this._Form.b未保存 = true;\r
287                                                                 break;\r
288                                                         }\r
289                                                         if( ( flag && ( this.listレーン[ cチップ.nレーン番号0to ].eレーン種別 == Cレーン.E種別.GtR ) ) && ( cチップ.n値・整数1to1295 == 2 ) )\r
290                                                         {\r
291                                                                 Cチップ cチップ3 = new Cチップ();\r
292                                                                 cチップ3.tコピーfrom( cチップ );\r
293                                                                 Cチップ配置用UndoRedo redo2 = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cチップ3 );\r
294                                                                 this._Form.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<Cチップ配置用UndoRedo>( null, new DGUndoを実行する<Cチップ配置用UndoRedo>( this.tチップ削除のUndo ), new DGRedoを実行する<Cチップ配置用UndoRedo>( this.tチップ削除のRedo ), redo2, redo2 ) );\r
295                                                                 c小節.listチップ.Remove( cチップ );\r
296                                                                 flag3 = false;\r
297                                                                 this._Form.b未保存 = true;\r
298                                                                 break;\r
299                                                         }\r
300                                                         if( ( flag2 && ( this.listレーン[ cチップ.nレーン番号0to ].eレーン種別 == Cレーン.E種別.BsR ) ) && ( cチップ.n値・整数1to1295 == 2 ) )\r
301                                                         {\r
302                                                                 Cチップ cチップ4 = new Cチップ();\r
303                                                                 cチップ4.tコピーfrom( cチップ );\r
304                                                                 Cチップ配置用UndoRedo redo3 = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cチップ4 );\r
305                                                                 this._Form.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<Cチップ配置用UndoRedo>( null, new DGUndoを実行する<Cチップ配置用UndoRedo>( this.tチップ削除のUndo ), new DGRedoを実行する<Cチップ配置用UndoRedo>( this.tチップ削除のRedo ), redo3, redo3 ) );\r
306                                                                 c小節.listチップ.Remove( cチップ );\r
307                                                                 flag3 = false;\r
308                                                                 this._Form.b未保存 = true;\r
309                                                                 break;\r
310                                                         }\r
311                                                 }\r
312                                         }\r
313                                 }\r
314                                 while( !flag3 );\r
315                                 this._Form.tUndoRedo用GUIの有効・無効を設定する();\r
316                                 this._Form.mgrUndoRedo管理者.tトランザクション記録を終了する();\r
317                         }\r
318                 }\r
319                 public void tチップを配置または置換する( int nレーン番号0to, int n譜面先頭からの位置grid, int nチップ値・整数, float fチップ値・浮動小数, bool b裏として配置 )\r
320                 {\r
321                         C小節 c小節 = this.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
322                         if( c小節 != null )\r
323                         {\r
324                                 this._Form.mgrUndoRedo管理者.tトランザクション記録を開始する();\r
325                                 this.tチップを削除する( nレーン番号0to, n譜面先頭からの位置grid );\r
326                                 if( ( ( this.listレーン[ nレーン番号0to ].eレーン種別 == Cレーン.E種別.GtR ) || ( this.listレーン[ nレーン番号0to ].eレーン種別 == Cレーン.E種別.BsR ) ) && ( nチップ値・整数 == 2 ) )\r
327                                 {\r
328                                         this.tチップを削除する( nレーン番号0to + 1, n譜面先頭からの位置grid );\r
329                                         this.tチップを削除する( nレーン番号0to + 2, n譜面先頭からの位置grid );\r
330                                 }\r
331                                 Cレーン cレーン = this.listレーン[ nレーン番号0to ];\r
332                                 Cチップ item = new Cチップ();\r
333                                 item.nチャンネル番号00toFF = b裏として配置 ? cレーン.nチャンネル番号・裏00toFF : cレーン.nチャンネル番号・表00toFF;\r
334                                 item.nレーン番号0to = nレーン番号0to;\r
335                                 item.n位置grid = n譜面先頭からの位置grid - this.n譜面先頭からみた小節先頭の位置gridを返す( c小節.n小節番号0to3599 );\r
336                                 item.n値・整数1to1295 = nチップ値・整数;\r
337                                 item.f値・浮動小数 = fチップ値・浮動小数;\r
338                                 item.b裏 = b裏として配置;\r
339                                 c小節.listチップ.Add( item );\r
340                                 Cチップ cc = new Cチップ();\r
341                                 cc.tコピーfrom( item );\r
342                                 Cチップ配置用UndoRedo redo = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );\r
343                                 this._Form.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<Cチップ配置用UndoRedo>( null, new DGUndoを実行する<Cチップ配置用UndoRedo>( this.tチップ配置のUndo ), new DGRedoを実行する<Cチップ配置用UndoRedo>( this.tチップ配置のRedo ), redo, redo ) );\r
344                                 int num = this.n現在の最大の小節番号を返す();\r
345                                 if( c小節.n小節番号0to3599 == num )\r
346                                 {\r
347                                         for( int i = num + 1; i <= ( num + 4 ); i++ )\r
348                                         {\r
349                                                 this.dic小節.Add( i, new C小節( i ) );\r
350                                                 this._Form.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<int>( null, new DGUndoを実行する<int>( this.t小節挿入のUndo ), new DGRedoを実行する<int>( this.t小節挿入のRedo ), i, i ) );\r
351                                         }\r
352                                 }\r
353                                 this._Form.mgrUndoRedo管理者.tトランザクション記録を終了する();\r
354                                 this._Form.tUndoRedo用GUIの有効・無効を設定する();\r
355                                 this._Form.b未保存 = true;\r
356                         }\r
357                 }\r
358                 public void tチップ削除のRedo( Cチップ配置用UndoRedo ur変更前, Cチップ配置用UndoRedo ur変更後 )\r
359                 {\r
360                         C小節 c小節 = this.p小節を返す( ur変更前.n小節番号0to );\r
361                         if( c小節 != null )\r
362                         {\r
363                                 for( int i = 0; i < c小節.listチップ.Count; i++ )\r
364                                 {\r
365                                         Cチップ cチップ = c小節.listチップ[ i ];\r
366                                         if( ( cチップ.n位置grid == ur変更前.cc.n位置grid ) && ( cチップ.nレーン番号0to == ur変更前.cc.nレーン番号0to ) )\r
367                                         {\r
368                                                 c小節.listチップ.RemoveAt( i );\r
369                                                 this._Form.b未保存 = true;\r
370                                                 return;\r
371                                         }\r
372                                 }\r
373                         }\r
374                 }\r
375                 public void tチップ削除のUndo( Cチップ配置用UndoRedo ur変更前, Cチップ配置用UndoRedo ur変更後 )\r
376                 {\r
377                         C小節 c小節 = this.p小節を返す( ur変更前.n小節番号0to );\r
378                         if( c小節 != null )\r
379                         {\r
380                                 Cチップ item = new Cチップ();\r
381                                 item.tコピーfrom( ur変更前.cc );\r
382                                 c小節.listチップ.Add( item );\r
383                                 this._Form.b未保存 = true;\r
384                         }\r
385                 }\r
386                 public void tチップ選択のRedo( Cチップ位置用UndoRedo ur変更前, Cチップ位置用UndoRedo ur変更後 )\r
387                 {\r
388                         Cチップ cチップ = this.p指定位置にあるチップを返す( ur変更前.n小節番号0to, ur変更前.nレーン番号0to, ur変更前.n位置grid );\r
389                         if( cチップ != null )\r
390                         {\r
391                                 cチップ.b確定選択中 = true;\r
392                         }\r
393                 }\r
394                 public void tチップ選択のUndo( Cチップ位置用UndoRedo ur変更前, Cチップ位置用UndoRedo ur変更後 )\r
395                 {\r
396                         Cチップ cチップ = this.p指定位置にあるチップを返す( ur変更前.n小節番号0to, ur変更前.nレーン番号0to, ur変更前.n位置grid );\r
397                         if( cチップ != null )\r
398                         {\r
399                                 cチップ.b確定選択中 = false;\r
400                         }\r
401                 }\r
402                 public void tチップ選択解除のRedo( Cチップ位置用UndoRedo ur変更前, Cチップ位置用UndoRedo ur変更後 )\r
403                 {\r
404                         Cチップ cチップ = this.p指定位置にあるチップを返す( ur変更前.n小節番号0to, ur変更前.nレーン番号0to, ur変更前.n位置grid );\r
405                         if( cチップ != null )\r
406                         {\r
407                                 cチップ.b確定選択中 = false;\r
408                         }\r
409                 }\r
410                 public void tチップ選択解除のUndo( Cチップ位置用UndoRedo ur変更前, Cチップ位置用UndoRedo ur変更後 )\r
411                 {\r
412                         Cチップ cチップ = this.p指定位置にあるチップを返す( ur変更前.n小節番号0to, ur変更前.nレーン番号0to, ur変更前.n位置grid );\r
413                         if( cチップ != null )\r
414                         {\r
415                                 cチップ.b確定選択中 = true;\r
416                         }\r
417                 }\r
418                 public void tチップ配置のRedo( Cチップ配置用UndoRedo ur変更前, Cチップ配置用UndoRedo ur変更後 )\r
419                 {\r
420                         C小節 c小節 = this.p小節を返す( ur変更前.n小節番号0to );\r
421                         if( c小節 != null )\r
422                         {\r
423                                 Cチップ item = new Cチップ();\r
424                                 item.tコピーfrom( ur変更前.cc );\r
425                                 c小節.listチップ.Add( item );\r
426                                 this._Form.b未保存 = true;\r
427                         }\r
428                 }\r
429                 public void tチップ配置のUndo( Cチップ配置用UndoRedo ur変更前, Cチップ配置用UndoRedo ur変更後 )\r
430                 {\r
431                         C小節 c小節 = this.p小節を返す( ur変更前.n小節番号0to );\r
432                         if( c小節 != null )\r
433                         {\r
434                                 for( int i = 0; i < c小節.listチップ.Count; i++ )\r
435                                 {\r
436                                         Cチップ cチップ = c小節.listチップ[ i ];\r
437                                         if( ( cチップ.n位置grid == ur変更前.cc.n位置grid ) && ( cチップ.nレーン番号0to == ur変更前.cc.nレーン番号0to ) )\r
438                                         {\r
439                                                 c小節.listチップ.RemoveAt( i );\r
440                                                 this._Form.b未保存 = true;\r
441                                                 return;\r
442                                         }\r
443                                 }\r
444                         }\r
445                 }\r
446                 public void tチップ番号置換のRedo( Cチップ位置用UndoRedo ur変更前, Cチップ位置用UndoRedo ur変更後 )\r
447                 {\r
448                         Cチップ cチップ = this.p指定位置にあるチップを返す( ur変更前.n小節番号0to, ur変更前.nレーン番号0to, ur変更前.n位置grid );\r
449                         if( cチップ != null )\r
450                         {\r
451                                 cチップ.n値・整数1to1295 = ur変更後.n値・整数1to1295;\r
452                                 this._Form.b未保存 = true;\r
453                         }\r
454                 }\r
455                 public void tチップ番号置換のUndo( Cチップ位置用UndoRedo ur変更前, Cチップ位置用UndoRedo ur変更後 )\r
456                 {\r
457                         Cチップ cチップ = this.p指定位置にあるチップを返す( ur変更後.n小節番号0to, ur変更後.nレーン番号0to, ur変更後.n位置grid );\r
458                         if( cチップ != null )\r
459                         {\r
460                                 cチップ.n値・整数1to1295 = ur変更前.n値・整数1to1295;\r
461                                 this._Form.b未保存 = true;\r
462                         }\r
463                 }\r
464                 public void tチップ表裏反転のRedo( Cチップ位置用UndoRedo ur変更前, Cチップ位置用UndoRedo ur変更後 )\r
465                 {\r
466                         Cチップ cチップ = this.p指定位置にあるチップを返す( ur変更前.n小節番号0to, ur変更前.nレーン番号0to, ur変更前.n位置grid );\r
467                         if( cチップ != null )\r
468                         {\r
469                                 if( cチップ.b裏 )\r
470                                 {\r
471                                         cチップ.nチャンネル番号00toFF = this.listレーン[ cチップ.nレーン番号0to ].nチャンネル番号・表00toFF;\r
472                                         cチップ.b裏 = false;\r
473                                 }\r
474                                 else\r
475                                 {\r
476                                         cチップ.nチャンネル番号00toFF = this.listレーン[ cチップ.nレーン番号0to ].nチャンネル番号・裏00toFF;\r
477                                         cチップ.b裏 = true;\r
478                                 }\r
479                                 this._Form.b未保存 = true;\r
480                         }\r
481                 }\r
482                 public void tチップ表裏反転のUndo( Cチップ位置用UndoRedo ur変更前, Cチップ位置用UndoRedo ur変更後 )\r
483                 {\r
484                         Cチップ cチップ = this.p指定位置にあるチップを返す( ur変更前.n小節番号0to, ur変更前.nレーン番号0to, ur変更前.n位置grid );\r
485                         if( cチップ != null )\r
486                         {\r
487                                 if( cチップ.b裏 )\r
488                                 {\r
489                                         cチップ.nチャンネル番号00toFF = this.listレーン[ cチップ.nレーン番号0to ].nチャンネル番号・表00toFF;\r
490                                         cチップ.b裏 = false;\r
491                                 }\r
492                                 else\r
493                                 {\r
494                                         cチップ.nチャンネル番号00toFF = this.listレーン[ cチップ.nレーン番号0to ].nチャンネル番号・裏00toFF;\r
495                                         cチップ.b裏 = true;\r
496                                 }\r
497                                 this._Form.b未保存 = true;\r
498                         }\r
499                 }\r
500                 public void t初期化()\r
501                 {\r
502                         this.t初期化・listレーンの生成();\r
503                         this.t初期化・小節を10個まで作成する();\r
504                         this.t初期化・背景画像を生成する();\r
505                         this.t初期化・スクロールバーを初期設定する();\r
506                 }\r
507                 public void t小節削除のRedo( int nダミー, int n削除する小節番号0to )\r
508                 {\r
509                         this.dic小節.Remove( n削除する小節番号0to );\r
510                         int num = this.n現在の最大の小節番号を返す();\r
511                         for( int i = n削除する小節番号0to + 1; i <= num; i++ )\r
512                         {\r
513                                 C小節 c小節 = this.p小節を返す( i );\r
514                                 if( c小節 != null )\r
515                                 {\r
516                                         this.dic小節.Remove( i );\r
517                                         c小節.n小節番号0to3599 = i - 1;\r
518                                         this.dic小節.Add( c小節.n小節番号0to3599, c小節 );\r
519                                 }\r
520                         }\r
521                         this._Form.b未保存 = true;\r
522                 }\r
523                 public void t小節削除のUndo( int n削除された小節番号0to, int nダミー )\r
524                 {\r
525                         for( int i = this.n現在の最大の小節番号を返す(); i >= n削除された小節番号0to; i-- )\r
526                         {\r
527                                 C小節 c小節 = this.p小節を返す( i );\r
528                                 if( c小節 != null )\r
529                                 {\r
530                                         this.dic小節.Remove( i );\r
531                                         c小節.n小節番号0to3599 = i + 1;\r
532                                         this.dic小節.Add( c小節.n小節番号0to3599, c小節 );\r
533                                 }\r
534                         }\r
535                         this.dic小節.Add( n削除された小節番号0to, new C小節( n削除された小節番号0to ) );\r
536                         this._Form.b未保存 = true;\r
537                 }\r
538                 public void t小節挿入のRedo( int nダミー, int n挿入する小節番号0to )\r
539                 {\r
540                         for( int i = this.n現在の最大の小節番号を返す(); i >= n挿入する小節番号0to; i-- )\r
541                         {\r
542                                 C小節 c小節 = this.p小節を返す( i );\r
543                                 if( c小節 != null )\r
544                                 {\r
545                                         this.dic小節.Remove( i );\r
546                                         c小節.n小節番号0to3599 = i + 1;\r
547                                         this.dic小節.Add( c小節.n小節番号0to3599, c小節 );\r
548                                 }\r
549                         }\r
550                         this.dic小節.Add( n挿入する小節番号0to, new C小節( n挿入する小節番号0to ) );\r
551                         this._Form.b未保存 = true;\r
552                 }\r
553                 public void t小節挿入のUndo( int n挿入された小節番号0to, int nダミー )\r
554                 {\r
555                         this.dic小節.Remove( n挿入された小節番号0to );\r
556                         int num = this.n現在の最大の小節番号を返す();\r
557                         for( int i = n挿入された小節番号0to + 1; i <= num; i++ )\r
558                         {\r
559                                 C小節 c小節 = this.p小節を返す( i );\r
560                                 if( c小節 != null )\r
561                                 {\r
562                                         this.dic小節.Remove( i );\r
563                                         c小節.n小節番号0to3599 = i - 1;\r
564                                         this.dic小節.Add( c小節.n小節番号0to3599, c小節 );\r
565                                 }\r
566                         }\r
567                         this._Form.b未保存 = true;\r
568                 }\r
569                 public void t小節長変更のRedo( C小節用UndoRedo ur変更前, C小節用UndoRedo ur変更後 )\r
570                 {\r
571                         C小節 c小節 = this.p小節を返す( ur変更後.n小節番号0to );\r
572                         if( c小節 != null )\r
573                         {\r
574                                 c小節.f小節長倍率 = ur変更後.f倍率;\r
575                                 this._Form.b未保存 = true;\r
576                         }\r
577                 }\r
578                 public void t小節長変更のUndo( C小節用UndoRedo ur変更前, C小節用UndoRedo ur変更後 )\r
579                 {\r
580                         C小節 c小節 = this.p小節を返す( ur変更前.n小節番号0to );\r
581                         if( c小節 != null )\r
582                         {\r
583                                 c小節.f小節長倍率 = ur変更前.f倍率;\r
584                                 this._Form.b未保存 = true;\r
585                         }\r
586                 }\r
587                 public void t垂直スクロールバーと譜面可視領域の上下位置の調整()\r
588                 {\r
589                         VScrollBar bar = this._Form.vScrollBar譜面用垂直スクロールバー;\r
590                         PictureBox box = this._Form.pictureBox譜面パネル;\r
591                         bar.Minimum = 0;\r
592                         bar.Maximum = this.n全小節の高さgridの合計を返す() - 1;\r
593                         bar.SmallChange = C小節.n基準の高さgrid / 0x10;\r
594                         bar.LargeChange = C小節.n基準の高さgrid;\r
595                         bar.Enabled = bar.Maximum > bar.LargeChange;\r
596                         if( bar.Enabled )\r
597                         {\r
598                                 this.n現在の譜面表示下辺の譜面先頭からの位置grid = ( ( bar.Maximum + 1 ) - bar.LargeChange ) - bar.Value;\r
599                                 box.Refresh();\r
600                         }\r
601                 }\r
602                 public void t水平スクロールバーと譜面パネル左右位置の調整()\r
603                 {\r
604                         HScrollBar bar = this._Form.hScrollBar譜面用水平スクロールバー;\r
605                         SplitContainer container = this._Form.splitContainerタブと譜面を分割;\r
606                         PictureBox box = this._Form.pictureBox譜面パネル;\r
607                         bar.Minimum = 0;\r
608                         bar.Maximum = box.Width - 1;\r
609                         bar.SmallChange = 5;\r
610                         bar.LargeChange = container.Panel2.Width;\r
611                         bar.Enabled = bar.Maximum > bar.LargeChange;\r
612                         if( bar.Enabled )\r
613                         {\r
614                                 int num = bar.Value;\r
615                                 if( ( num + bar.LargeChange ) > bar.Maximum )\r
616                                 {\r
617                                         num = ( bar.Maximum - bar.LargeChange ) + 1;\r
618                                 }\r
619                                 bar.Value = num;\r
620                                 box.Location = new Point( -num, 0 );\r
621                                 box.Refresh();\r
622                         }\r
623                 }\r
624                 public void t譜面を描画する( Graphics g, Size sz描画対象サイズdot, Rectangle rc可視領域dot )\r
625                 {\r
626                         this.strfmt小節番号文字フォーマット.LineAlignment = StringAlignment.Center;\r
627                         this.strfmt小節番号文字フォーマット.Alignment = StringAlignment.Center;\r
628                         this.strfmtレーン名文字フォーマット.LineAlignment = StringAlignment.Near;\r
629                         this.strfmtレーン名文字フォーマット.Alignment = StringAlignment.Center;\r
630                         this.strfmtレーン割付チップ番号文字フォーマット.LineAlignment = StringAlignment.Near;\r
631                         this.strfmtレーン割付チップ番号文字フォーマット.Alignment = StringAlignment.Near;\r
632                         int h = 0;\r
633                         int num2 = 0;\r
634                         int num3 = this.n現在の譜面表示下辺の譜面先頭からの位置grid * C小節.n1グリッドの高さdot;\r
635                         int num4 = num3 + rc可視領域dot.Height;\r
636                         int maxBar = this.n現在の最大の小節番号を返す();\r
637                         int bar = 0;\r
638                         while( bar <= maxBar )\r
639                         {\r
640                                 C小節 cs = this.p小節を返す( bar );\r
641                                 if( cs != null )\r
642                                 {\r
643                                         num2 = h + cs.n小節長倍率を考慮した現在の小節の高さdot;\r
644                                         if( h >= num4 )\r
645                                         {\r
646                                                 break;\r
647                                         }\r
648                                         if( num2 > num3 )\r
649                                         {\r
650                                                 Rectangle rectangle = new Rectangle( 0, sz描画対象サイズdot.Height - ( num2 - num3 ), sz描画対象サイズdot.Width, num2 - h );\r
651                                                 Rectangle rectangle2 = new Rectangle( rc可視領域dot.X, rectangle.Y, rc可視領域dot.Width, rectangle.Height );\r
652                                                 this.t譜面を描画する・1小節を描画する( g, cs, rectangle, rectangle2 );\r
653                                         }\r
654                                 }\r
655                                 bar++;\r
656                                 h = num2;\r
657                         }\r
658                         Rectangle rectangle3 = new Rectangle( 0, 0, sz描画対象サイズdot.Width, nレーン割付チップ番号表示高さdot );\r
659                         this.t譜面を描画する・レーン割付チップを描画する( g, rectangle3 );\r
660                         rectangle3 = new Rectangle( 0, 10, sz描画対象サイズdot.Width, nレーン番号表示高さdot );\r
661                         this.t譜面を描画する・レーン名を描画する( g, rectangle3 );\r
662                 }\r
663 \r
664                 /// <summary>\r
665                 /// 指定した種類のレーンを非表示にする\r
666                 /// </summary>\r
667                 /// <param name="eLaneType">非表示にするレーンの種類</param>\r
668                 public void tCollapseLanes( Cレーン.ELaneType eLaneType )\r
669                 {\r
670                         // なお、格納/展開状態を、#DTXV_COLLAPSED_LANES とかでDTXファイルに残した方がいいかも。\r
671                         int count = this.listレーン.Count;\r
672                         for ( int i = 0; i < this.listレーン.Count; i++ )\r
673                         {\r
674                                 Cレーン c = listレーン[ i ];\r
675                                 if ( c.eLaneType == eLaneType && c.bIsVisible == true ) // 対象レーンが見つかったら\r
676                                 {\r
677                                         this.listレーン[ i ].bIsVisible = false;\r
678                                         this.listレーン[ i ].n幅dot = 0;\r
679                                 }\r
680                         }\r
681                         this.tRefreshDisplayLanes();\r
682                 }\r
683                 /// <summary>\r
684                 /// 指定した種類のレーンを表示する\r
685                 /// </summary>\r
686                 /// <param name="eLaneType">表示にするレーンの種類</param>\r
687                 public void tExpandLanes( Cレーン.ELaneType eLaneType )\r
688                 {\r
689                         // tCollapseLanes()の反対の処理をする。\r
690 \r
691                         for ( int i = 0; i < this.listレーン.Count; i++ )                            // 以下本番\r
692                         {\r
693                                 Cレーン c = listレーン[ i ];\r
694                                 if ( c.eLaneType == eLaneType && c.bIsVisible == false )        // 対象レーンが見つかったら\r
695                                 {\r
696                                         this.listレーン[ i ].bIsVisible = true;\r
697                                         this.listレーン[ i ].n幅dot = Cレーン.LANEWIDTH;\r
698                                 }\r
699                         }\r
700                         this.tRefreshDisplayLanes();\r
701                 }\r
702 \r
703                 /// <summary>\r
704                 /// レーンの表示/非表示を反映する\r
705                 /// </summary>\r
706                 /// <param name="eLaneType">表示にするレーンの種類</param>\r
707                 public void tRefreshDisplayLanes()\r
708                 {\r
709                         this.tRecalc_n位置XdotX();                                                                                    // レーン位置が変わったので、レーン毎のX座標を再計算\r
710                         this.t初期化・背景画像を生成する();                                                                        // レーン数が変わったので、レーン画像を納める背景も再生成\r
711                         this.t水平スクロールバーと譜面パネル左右位置の調整();                             // レーン数が変わったので、スクロールバーの長さも再調整\r
712                 }\r
713 \r
714                 private void tRecalc_n位置XdotX()                                                                             // n位置Xdotの再計算\r
715                 {\r
716                         int x = 0;\r
717                         int count = this.listレーン.Count;\r
718                         for ( int i = 0; i < count; i++ )\r
719                         {\r
720                                 this.listレーン[ i ].n位置Xdot = x;\r
721                                 x += this.listレーン[ i ].n幅dot;\r
722                         }\r
723                 }\r
724 \r
725 \r
726                 #region [ private ]\r
727                 //-----------------\r
728                 private Cメインフォーム _Form;\r
729                 private Brush brレーン割付番号文字ブラシ = new SolidBrush( Color.White );\r
730                 private Brush brレーン割付番号文字ブラシ影 = new SolidBrush( Color.Black );\r
731                 private Brush brレーン名文字ブラシ = new SolidBrush( Color.FromArgb( 0xff, 220, 220, 220 ) );\r
732                 private Brush brレーン名文字ブラシ影 = new SolidBrush( Color.Black );\r
733                 private Brush br小節番号文字ブラシ = new SolidBrush( Color.FromArgb( 80, 0xff, 0xff, 0xff ) );\r
734                 private Font ftレーン割付チップ番号文字フォント = new Font( "MS UI Gothic", 7f, FontStyle.Regular );\r
735                 private Font ftレーン番号文字フォント = new Font( "MS US Gothic", 8f, FontStyle.Regular );\r
736                 private Font ft小節番号文字フォント = new Font( "MS UI Gothic", 50f, FontStyle.Regular );\r
737                 private Pen penガイド線ペン = new Pen( Color.FromArgb( 50, 50, 50 ) );\r
738                 private Pen penレーン区分線ペン細 = new Pen( Color.Gray );\r
739                 private Pen penレーン区分線ペン太 = new Pen( Color.White, 2f );\r
740                 private Pen pen小節線ペン = new Pen( Color.White, 2f );\r
741                 private Pen pen拍線ペン = new Pen( Color.Gray );\r
742                 private StringFormat strfmtレーン割付チップ番号文字フォーマット = new StringFormat();\r
743                 private StringFormat strfmtレーン名文字フォーマット = new StringFormat();\r
744                 private StringFormat strfmt小節番号文字フォーマット = new StringFormat();\r
745 \r
746                 private void t初期化・listレーンの生成()\r
747                 {\r
748                         this.listレーン.Clear();\r
749                         int width = Cレーン.LANEWIDTH;\r
750                         int alpha = 0x19;\r
751 \r
752                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BPM, "BPM", 0x08, 0x03, true, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.BPM, true ) );\r
753 \r
754                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "LC",  0x1a, 0x1a, true,  Color.FromArgb( alpha, 0, 0xff, 0xff ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
755                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "HH",  0x11, 0x18, false, Color.FromArgb( alpha, 0, 0xff, 0xff ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
756                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SD",  0x12, 0x12, false, Color.FromArgb( alpha, 0xff, 0xff, 0 ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
757                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "BD",  0x13, 0x13, false, Color.FromArgb( alpha, 0xff, 0x7f, 0x7f ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
758                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "HT",  0x14, 0x14, false, Color.FromArgb( alpha, 0, 0xff, 0 ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
759                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "LT",  0x15, 0x15, false, Color.FromArgb( alpha, 0xff, 0, 0 ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
760                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "FT",  0x17, 0x17, false, Color.FromArgb( alpha, 0xff, 0, 0xff ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
761                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "CY",  0x16, 0x19, false, Color.FromArgb( alpha, 0, 0xff, 0xff ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
762                         this.listレーン.Add( new Cレーン( Cレーン.E種別.FI,  "FI",  0x53, 0x53, true,  Color.FromArgb( alpha, 0xff, 0xff, 0 ), 0, width, Cレーン.ELaneType.Drums, true ) );\r
763 \r
764                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "BGM", 0x01, 0x01, true,  Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.BGM, true ) );\r
765 \r
766                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE1", 0x61, 0x61, true,  Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.SE1_5, true ) );\r
767                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE2", 0x62, 0x62, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.SE1_5, true ) );\r
768                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE3", 0x63, 0x63, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.SE1_5, true ) );\r
769                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE4", 0x64, 0x64, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.SE1_5, true ) );\r
770                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE5", 0x65, 0x65, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.SE1_5, true ) );\r
771 \r
772                         // SE6~32は、初期状態では非表示とする。(n幅dotを0にし、bIsVisibleをfalseにする)\r
773                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE6", 0x66, 0x66, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
774                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE7", 0x67, 0x67, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
775                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE8", 0x68, 0x68, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
776                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "SE9", 0x69, 0x69, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
777                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S10", 0x70, 0x70, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
778                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S11", 0x71, 0x71, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
779                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S12", 0x72, 0x72, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
780                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S13", 0x73, 0x73, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
781                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S14", 0x74, 0x74, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
782                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S15", 0x75, 0x75, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
783                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S16", 0x76, 0x76, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
784                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S17", 0x77, 0x77, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
785                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S18", 0x78, 0x78, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
786                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S19", 0x79, 0x79, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
787                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S20", 0x80, 0x80, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
788                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S21", 0x81, 0x81, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
789                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S22", 0x82, 0x82, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
790                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S23", 0x83, 0x83, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
791                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S24", 0x84, 0x84, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
792                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S25", 0x85, 0x85, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
793                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S26", 0x86, 0x86, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
794                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S27", 0x87, 0x87, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
795                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S28", 0x88, 0x88, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
796                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S29", 0x89, 0x89, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
797                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S30", 0x90, 0x90, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
798                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S31", 0x91, 0x91, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
799                         this.listレーン.Add( new Cレーン( Cレーン.E種別.WAV, "S32", 0x92, 0x92, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.SE6_32, false ) );\r
800 \r
801                         this.listレーン.Add( new Cレーン( Cレーン.E種別.GtV, "GtV", 0,    0,    true,  Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.Guitar, true ) );\r
802                         this.listレーン.Add( new Cレーン( Cレーン.E種別.GtR, "GtR", 0,    0,    false, Color.FromArgb( alpha, 0xff, 0, 0 ), 0, width, Cレーン.ELaneType.Guitar, true ) );\r
803                         this.listレーン.Add( new Cレーン( Cレーン.E種別.GtG, "GtG", 0,    0,    false, Color.FromArgb( alpha, 0, 0xff, 0 ), 0, width, Cレーン.ELaneType.Guitar, true ) );\r
804                         this.listレーン.Add( new Cレーン( Cレーン.E種別.GtB, "GtB", 0,    0,    false, Color.FromArgb( alpha, 0, 0x80, 0xff ), 0, width, Cレーン.ELaneType.Guitar, true ) );\r
805                         this.listレーン.Add( new Cレーン( Cレーン.E種別.GtW, "GtW", 0x28, 0x28, true,  Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.Guitar, true ) );\r
806                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BsV, "BsV", 0,    0,    true,  Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.Bass, true ) );\r
807                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BsR, "BsR", 0,    0,    false, Color.FromArgb( alpha, 0xff, 0, 0 ), 0, width, Cレーン.ELaneType.Bass, true ) );\r
808                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BsG, "BsG", 0,    0,    false, Color.FromArgb( alpha, 0, 0xff, 0 ), 0, width, Cレーン.ELaneType.Bass, true ) );\r
809                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BsB, "BsB", 0,    0,    false, Color.FromArgb( alpha, 0, 0x80, 0xff ), 0, width, Cレーン.ELaneType.Bass, true ) );\r
810                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BsW, "BsW", 0xa8, 0xa8, true,  Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.Bass, true ) );\r
811 \r
812                         this.listレーン.Add( new Cレーン( Cレーン.E種別.AVI, "AVI", 0x54, 0x54, true,  Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.AVI, true ) );\r
813 \r
814                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BMP, "BG1", 0x04, 0xc4, true,  Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.BGA1_5, true ) );\r
815                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BMP, "BG2", 0x07, 0xc7, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.BGA1_5, true ) );\r
816                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BMP, "BG3", 0x55, 0xd5, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.BGA1_5, true ) );\r
817                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BMP, "BG4", 0x56, 0xd6, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.BGA1_5, true ) );\r
818                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BMP, "BG5", 0x57, 0xd7, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, width, Cレーン.ELaneType.BGA1_5, true ) );\r
819 \r
820                         // BG6~8も、初期状態では非表示とする。(n幅dotを0にし、bIsVisibleをfalseにする)\r
821                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BMP, "BG6", 0x58, 0xd8, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.BGA6_8, false ) );\r
822                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BMP, "BG7", 0x59, 0xd9, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.BGA6_8, false ) );\r
823                         this.listレーン.Add( new Cレーン( Cレーン.E種別.BMP, "BG8", 0x60, 0xe0, false, Color.FromArgb( alpha, 160, 160, 160 ), 0, 0, Cレーン.ELaneType.BGA6_8, false ) );\r
824 \r
825                         this.tRecalc_n位置XdotX();    // 0で固定初期化していたn位置XdotXを、ここで計算する。\r
826                                                                                 // (初期化の際に1つ1つまじめに計算しても良いが、単純にコード記述量が減るのでここでまとめて計算している)\r
827 \r
828                 }\r
829                 private void t初期化・スクロールバーを初期設定する()\r
830                 {\r
831                         this._Form.hScrollBar譜面用水平スクロールバー.Value = 0;\r
832                         this._Form.vScrollBar譜面用垂直スクロールバー.Value = 0;\r
833                         this.t水平スクロールバーと譜面パネル左右位置の調整();\r
834                         this.t垂直スクロールバーと譜面可視領域の上下位置の調整();\r
835                         this._Form.vScrollBar譜面用垂直スクロールバー.Value = ( this._Form.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this._Form.vScrollBar譜面用垂直スクロールバー.LargeChange;\r
836                 }\r
837                 private void t初期化・小節を10個まで作成する()\r
838                 {\r
839                         for( int i = 0; i < 10; i++ )\r
840                         {\r
841                                 this.dic小節.Add( i, new C小節( i ) );\r
842                         }\r
843                 }\r
844                 private void t初期化・背景画像を生成する()\r
845                 {\r
846                         int width = 0;\r
847                         foreach( Cレーン cレーン in this.listレーン )\r
848                         {\r
849                                 width += cレーン.n幅dot;\r
850                         }\r
851                         this.bmp背景画像 = new Bitmap( width, 1 );\r
852                         Graphics graphics = Graphics.FromImage( this.bmp背景画像 );\r
853                         int x = 0;\r
854                         foreach( Cレーン cレーン in this.listレーン )\r
855                         {\r
856                                 graphics.FillRectangle( new SolidBrush( cレーン.col背景色 ), x, 0, cレーン.n幅dot, this.bmp背景画像.Height );\r
857                                 x += cレーン.n幅dot;\r
858                         }\r
859                         graphics.Dispose();\r
860                         this._Form.pictureBox譜面パネル.Width = this.bmp背景画像.Width;\r
861                         this._Form.pictureBox譜面パネル.BackgroundImage = this.bmp背景画像;\r
862                         this._Form.pictureBox譜面パネル.BackgroundImageLayout = ImageLayout.Tile;\r
863                 }\r
864                 private void t譜面を描画する・1小節を描画する( Graphics g, C小節 cs, Rectangle rc小節のPicBox内描画領域, Rectangle rc小節のPicBox内可視領域 )\r
865                 {\r
866                         this.t譜面を描画する・1小節を描画する・小節番号を描画する( g, cs, rc小節のPicBox内可視領域 );\r
867                         this.t譜面を描画する・1小節を描画する・ガイド線を描画する( g, cs, rc小節のPicBox内描画領域 );\r
868                         this.t譜面を描画する・1小節を描画する・拍線を描画する( g, cs, rc小節のPicBox内描画領域 );\r
869                         this.t譜面を描画する・1小節を描画する・レーン区分線を描画する( g, cs, rc小節のPicBox内描画領域 );\r
870                         this.t譜面を描画する・1小節を描画する・小節線を描画する( g, cs, rc小節のPicBox内描画領域 );\r
871                         this.t譜面を描画する・1小節を描画する・チップを描画する( g, cs, rc小節のPicBox内描画領域 );\r
872                 }\r
873                 private void t譜面を描画する・1小節を描画する・ガイド線を描画する( Graphics g, C小節 cs, Rectangle rc小節のPicBox内描画領域 )\r
874                 {\r
875                         if( this.n現在のガイド幅grid > 1 )\r
876                         {\r
877                                 int num = cs.n小節長倍率を考慮した現在の小節の高さgrid;\r
878                                 for( int i = 0; i < num; i += this.n現在のガイド幅grid )\r
879                                 {\r
880                                         int num3 = rc小節のPicBox内描画領域.Bottom - ( i * C小節.n1グリッドの高さdot );\r
881                                         g.DrawLine( this.penガイド線ペン, rc小節のPicBox内描画領域.X, num3, rc小節のPicBox内描画領域.Right, num3 );\r
882                                 }\r
883                         }\r
884                 }\r
885                 private void t譜面を描画する・1小節を描画する・チップを描画する( Graphics g, C小節 cs, Rectangle rc小節のPicBox内描画領域 )\r
886                 {\r
887                         cs.listチップ.Sort();\r
888                         Rectangle rectangle = new Rectangle( 0, 0, 0, 0 );\r
889                         foreach( Cチップ cチップ in cs.listチップ )\r
890                         {\r
891                                 if( cチップ.n枠外レーン数 != 0 )\r
892                                 {\r
893                                         continue;\r
894                                 }\r
895                                 int num = cチップ.n位置grid;\r
896                                 Cレーン cレーン = this.listレーン[ cチップ.nレーン番号0to ];\r
897                                 if ( !cレーン.bIsVisible )\r
898                                 {\r
899                                         continue;\r
900                                 }\r
901                                 rectangle.X = cレーン.n位置Xdot;\r
902                                 rectangle.Y = ( rc小節のPicBox内描画領域.Bottom - ( num * C小節.n1グリッドの高さdot ) ) - Cチップ.nチップの高さdot;\r
903                                 rectangle.Width = cレーン.n幅dot;\r
904                                 rectangle.Height = Cチップ.nチップの高さdot;\r
905                                 if( !cチップ.b裏 )\r
906                                 {\r
907                                         switch( cレーン.eレーン種別 )\r
908                                         {\r
909                                                 case Cレーン.E種別.GtR:\r
910                                                 case Cレーン.E種別.GtG:\r
911                                                 case Cレーン.E種別.GtB:\r
912                                                 case Cレーン.E種別.BsR:\r
913                                                 case Cレーン.E種別.BsG:\r
914                                                 case Cレーン.E種別.BsB:\r
915                                                         if( ( ( cレーン.eレーン種別 != Cレーン.E種別.GtR ) || ( cチップ.n値・整数1to1295 != 2 ) ) && ( ( cレーン.eレーン種別 != Cレーン.E種別.BsR ) || ( cチップ.n値・整数1to1295 != 2 ) ) )\r
916                                                         {\r
917                                                                 Cチップ.t表チップを描画する( g, rectangle, -1, cレーン.col背景色 );\r
918                                                                 break;\r
919                                                         }\r
920                                                         rectangle.Width = cレーン.n幅dot * 3;\r
921                                                         Cチップ.tOPENチップを描画する( g, rectangle );\r
922                                                         break;\r
923 \r
924                                                 case Cレーン.E種別.BPM:\r
925                                                         Cチップ.t表チップを描画する( g, rectangle, cチップ.f値・浮動小数, cレーン.col背景色 );\r
926                                                         break;\r
927 \r
928                                                 default:\r
929                                                         Cチップ.t表チップを描画する( g, rectangle, cチップ.n値・整数1to1295, cレーン.col背景色 );\r
930                                                         break;\r
931                                         }\r
932                                         if( cチップ.bドラッグで選択中 || cチップ.b確定選択中 )\r
933                                         {\r
934                                                 Cチップ.tチップの周囲の太枠を描画する( g, rectangle );\r
935                                         }\r
936                                 }\r
937                                 else if( cレーン.eレーン種別 == Cレーン.E種別.BPM )\r
938                                 {\r
939                                         Cチップ.t裏チップを描画する( g, rectangle, cチップ.f値・浮動小数, cレーン.col背景色 );\r
940                                 }\r
941                                 else\r
942                                 {\r
943                                         Cチップ.t裏チップを描画する( g, rectangle, cチップ.n値・整数1to1295, cレーン.col背景色 );\r
944                                 }\r
945                         }\r
946                 }\r
947                 private void t譜面を描画する・1小節を描画する・レーン区分線を描画する( Graphics g, C小節 cs, Rectangle rc小節のPicBox内描画領域 )\r
948                 {\r
949                         int num = 0;\r
950                         foreach( Cレーン cレーン in this.listレーン )\r
951                         {\r
952                                 Pen pen = cレーン.b左側の線が太線 ? this.penレーン区分線ペン太 : this.penレーン区分線ペン細;\r
953                                 g.DrawLine( pen, num, rc小節のPicBox内描画領域.Top, num, rc小節のPicBox内描画領域.Bottom );\r
954                                 num += cレーン.n幅dot;\r
955                         }\r
956                 }\r
957                 private void t譜面を描画する・1小節を描画する・小節線を描画する( Graphics g, C小節 cs, Rectangle rc小節のPicBox内描画領域 )\r
958                 {\r
959                         Rectangle rectangle = rc小節のPicBox内描画領域;\r
960                         g.DrawLine( this.pen小節線ペン, rectangle.X, rectangle.Bottom, rectangle.Right, rectangle.Bottom );\r
961                         g.DrawLine( this.pen小節線ペン, rectangle.X, rectangle.Top, rectangle.Right, rectangle.Top );\r
962                 }\r
963                 private void t譜面を描画する・1小節を描画する・小節番号を描画する( Graphics g, C小節 cs, Rectangle rc小節のPicBox内可視領域 )\r
964                 {\r
965                         g.DrawString( C変換.str小節番号を文字列3桁に変換して返す( cs.n小節番号0to3599 ), this.ft小節番号文字フォント, this.br小節番号文字ブラシ, rc小節のPicBox内可視領域, this.strfmt小節番号文字フォーマット );\r
966                 }\r
967                 private void t譜面を描画する・1小節を描画する・拍線を描画する( Graphics g, C小節 cs, Rectangle rc小節のPicBox内描画領域 )\r
968                 {\r
969                         int num = cs.n小節長倍率を考慮した現在の小節の高さgrid;\r
970                         for( int i = 0; i < num; i += C小節.n基準の高さgrid / 4 )\r
971                         {\r
972                                 int num3 = rc小節のPicBox内描画領域.Bottom - ( i * C小節.n1グリッドの高さdot );\r
973                                 g.DrawLine( this.pen拍線ペン, rc小節のPicBox内描画領域.X, num3, rc小節のPicBox内描画領域.Right, num3 );\r
974                         }\r
975                 }\r
976                 private void t譜面を描画する・レーン割付チップを描画する( Graphics g, Rectangle rc小節のPicBox内描画領域 )\r
977                 {\r
978                         LinearGradientBrush brush = new LinearGradientBrush( rc小節のPicBox内描画領域, Color.FromArgb( 0xff, 0, 0, 100 ), Color.FromArgb( 0xff, 100, 100, 0xff ), LinearGradientMode.Vertical );\r
979                         g.FillRectangle( brush, rc小節のPicBox内描画領域 );\r
980                         brush.Dispose();\r
981                         Rectangle layoutRectangle = new Rectangle( 0, 0, 0, 0 );\r
982                         foreach( Cレーン cレーン in this.listレーン )\r
983                         {\r
984                                 if ( !cレーン.bIsVisible )\r
985                                 {\r
986                                         continue;\r
987                                 }\r
988                                 layoutRectangle.X = ( rc小節のPicBox内描画領域.X + cレーン.n位置Xdot ) + 1;\r
989                                 layoutRectangle.Y = rc小節のPicBox内描画領域.Y + 1;\r
990                                 layoutRectangle.Width = cレーン.n幅dot;\r
991                                 layoutRectangle.Height = rc小節のPicBox内描画領域.Height;\r
992                                 if ( cレーン.nレーン割付チップ・表0or1to1295 > 0 )\r
993                                 {\r
994                                         string s = C変換.str数値を36進数2桁に変換して返す( cレーン.nレーン割付チップ・表0or1to1295 );\r
995                                         g.DrawString( s, this.ftレーン割付チップ番号文字フォント, this.brレーン割付番号文字ブラシ影, layoutRectangle, this.strfmtレーン割付チップ番号文字フォーマット );\r
996                                         layoutRectangle.X--;\r
997                                         layoutRectangle.Y--;\r
998                                         g.DrawString( s, this.ftレーン割付チップ番号文字フォント, this.brレーン割付番号文字ブラシ, layoutRectangle, this.strfmtレーン割付チップ番号文字フォーマット );\r
999                                         layoutRectangle.X++;\r
1000                                         layoutRectangle.Y++;\r
1001                                 }\r
1002                                 layoutRectangle.X += cレーン.n幅dot / 2;\r
1003                                 if ( cレーン.nレーン割付チップ・裏0or1to1295 > 0 )\r
1004                                 {\r
1005                                         string str2 = C変換.str数値を36進数2桁に変換して返す( cレーン.nレーン割付チップ・裏0or1to1295 );\r
1006                                         g.DrawString( str2, this.ftレーン割付チップ番号文字フォント, this.brレーン割付番号文字ブラシ影, layoutRectangle, this.strfmtレーン割付チップ番号文字フォーマット );\r
1007                                         layoutRectangle.X--;\r
1008                                         layoutRectangle.Y--;\r
1009                                         g.DrawString( str2, this.ftレーン割付チップ番号文字フォント, this.brレーン割付番号文字ブラシ, layoutRectangle, this.strfmtレーン割付チップ番号文字フォーマット );\r
1010                                 }\r
1011                         }\r
1012                 }\r
1013                 private void t譜面を描画する・レーン名を描画する( Graphics g, Rectangle rcレーン名のPicBox内描画領域 )\r
1014                 {\r
1015                         LinearGradientBrush brush = new LinearGradientBrush( rcレーン名のPicBox内描画領域, Color.FromArgb( 0xff, 100, 100, 0xff ), Color.FromArgb( 0, 0, 0, 0xff ), LinearGradientMode.Vertical );\r
1016                         g.FillRectangle( brush, rcレーン名のPicBox内描画領域 );\r
1017                         brush.Dispose();\r
1018                         Rectangle layoutRectangle = new Rectangle( 0, 0, 0, 0 );\r
1019                         foreach( Cレーン cレーン in this.listレーン )\r
1020                         {\r
1021                                 if ( !cレーン.bIsVisible )\r
1022                                 {\r
1023                                         continue;\r
1024                                 }\r
1025                                 layoutRectangle.X = ( rcレーン名のPicBox内描画領域.X + cレーン.n位置Xdot ) + 2;\r
1026                                 layoutRectangle.Y = rcレーン名のPicBox内描画領域.Y + 2;\r
1027                                 layoutRectangle.Width = cレーン.n幅dot;\r
1028                                 layoutRectangle.Height = 0x18;\r
1029                                 g.DrawString( cレーン.strレーン名, this.ftレーン番号文字フォント, this.brレーン名文字ブラシ影, layoutRectangle, this.strfmtレーン名文字フォーマット );\r
1030                                 layoutRectangle.X -= 2;\r
1031                                 layoutRectangle.Y -= 2;\r
1032                                 g.DrawString( cレーン.strレーン名, this.ftレーン番号文字フォント, this.brレーン名文字ブラシ, layoutRectangle, this.strfmtレーン名文字フォーマット );\r
1033                         }\r
1034                 }\r
1035                 //-----------------\r
1036                 #endregion\r
1037         }\r
1038 }\r