OSDN Git Service

#24280 ベースの入力デバイス記録がギターのそれになる問題の修正
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / スコア、曲 / CDTX.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Runtime.InteropServices;\r
5 using System.Drawing;\r
6 using System.Diagnostics;\r
7 using System.IO;\r
8 using System.Security.Cryptography;\r
9 using System.Reflection;\r
10 using System.Globalization;\r
11 using FDK;\r
12 \r
13 namespace DTXMania\r
14 {\r
15         internal class CDTX : CActivity\r
16         {\r
17                 // 定数\r
18 \r
19                 public enum E種別\r
20                 {\r
21                         DTX,\r
22                         GDA,\r
23                         G2D,\r
24                         BMS,\r
25                         BME,\r
26                         SMF\r
27                 }\r
28 \r
29                 // クラス\r
30 \r
31                 public class CAVI : IDisposable\r
32                 {\r
33                         public CAvi avi;\r
34                         private bool bDisposed;\r
35                         public int n番号;\r
36                         public string strコメント文 = "";\r
37                         public string strファイル名 = "";\r
38 \r
39                         public void OnDeviceCreated()\r
40                         {\r
41                                 string str;\r
42                                 string str2 = CDTXMania.DTX.PATH_WAV;\r
43                                 if( ( str2 != null ) && ( str2.Length > 0 ) )\r
44                                 {\r
45                                         str = str2 + this.strファイル名;\r
46                                 }\r
47                                 else\r
48                                 {\r
49                                         str = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
50                                 }\r
51                                 if( File.Exists( str ) )\r
52                                 {\r
53                                         try\r
54                                         {\r
55                                                 this.avi = new CAvi( str );\r
56                                                 Trace.TraceInformation( "動画を生成しました。({0})({1})({2}frames)", new object[] { this.strコメント文, str, this.avi.GetMaxFrameCount() } );\r
57                                         }\r
58                                         catch( Exception exception )\r
59                                         {\r
60                                                 Trace.TraceError( exception.Message );\r
61                                                 Trace.TraceError( "動画の生成に失敗しました。({0})({1})", new object[] { this.strコメント文, str } );\r
62                                                 this.avi = null;\r
63                                         }\r
64                                 }\r
65                                 else\r
66                                 {\r
67                                         Trace.TraceWarning( "ファイルが存在しません。({0})({1})", new object[] { this.strコメント文, str } );\r
68                                         this.avi = null;\r
69                                 }\r
70                         }\r
71                         public override string ToString()\r
72                         {\r
73                                 return string.Format( "CAVI{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
74                         }\r
75 \r
76                         #region [ IDisposable 実装 ]\r
77                         //-----------------\r
78                         public void Dispose()\r
79                         {\r
80                                 if( !this.bDisposed )\r
81                                 {\r
82                                         if( this.avi != null )\r
83                                         {\r
84                                                 string str;\r
85                                                 string str2 = CDTXMania.DTX.PATH_WAV;\r
86                                                 if( ( str2 != null ) && ( str2.Length > 0 ) )\r
87                                                 {\r
88                                                         str = str2 + this.strファイル名;\r
89                                                 }\r
90                                                 else\r
91                                                 {\r
92                                                         str = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
93                                                 }\r
94                                                 this.avi.Dispose();\r
95                                                 this.avi = null;\r
96                                                 Trace.TraceInformation( "動画を解放しました。({0})({1})", new object[] { this.strコメント文, str } );\r
97                                         }\r
98                                         this.bDisposed = true;\r
99                                 }\r
100                         }\r
101                         //-----------------\r
102                         #endregion\r
103                 }\r
104                 public class CAVIPAN\r
105                 {\r
106                         public int nAVI番号;\r
107                         public int n移動時間ct;\r
108                         public int n番号;\r
109                         public Point pt動画側開始位置 = new Point( 0, 0 );\r
110                         public Point pt動画側終了位置 = new Point( 0, 0 );\r
111                         public Point pt表示側開始位置 = new Point( 0, 0 );\r
112                         public Point pt表示側終了位置 = new Point( 0, 0 );\r
113                         public Size sz開始サイズ = new Size( 0, 0 );\r
114                         public Size sz終了サイズ = new Size( 0, 0 );\r
115 \r
116                         public override string ToString()\r
117                         {\r
118                                 return string.Format( "CAVIPAN{0}: AVI:{14}, 開始サイズ:{1}x{2}, 終了サイズ:{3}x{4}, 動画側開始位置:{5}x{6}, 動画側終了位置:{7}x{8}, 表示側開始位置:{9}x{10}, 表示側終了位置:{11}x{12}, 移動時間:{13}ct", new object[] { CDTX.tZZ( this.n番号 ), this.sz開始サイズ.Width, this.sz開始サイズ.Height, this.sz終了サイズ.Width, this.sz終了サイズ.Height, this.pt動画側開始位置.X, this.pt動画側開始位置.Y, this.pt動画側終了位置.X, this.pt動画側終了位置.Y, this.pt表示側開始位置.X, this.pt表示側開始位置.Y, this.pt表示側終了位置.X, this.pt表示側終了位置.Y, this.n移動時間ct, CDTX.tZZ( this.nAVI番号 ) } );\r
119                         }\r
120                 }\r
121                 public class CBGA\r
122                 {\r
123                         public int nBMP番号;\r
124                         public int n番号;\r
125                         public Point pt画像側右下座標 = new Point( 0, 0 );\r
126                         public Point pt画像側左上座標 = new Point( 0, 0 );\r
127                         public Point pt表示座標 = new Point( 0, 0 );\r
128 \r
129                         public override string ToString()\r
130                         {\r
131                                 return string.Format( "CBGA{0}, BMP:{1}, 画像側左上座標:{2}x{3}, 画像側右下座標:{4}x{5}, 表示座標:{6}x{7}", new object[] { CDTX.tZZ( this.n番号 ), CDTX.tZZ( this.nBMP番号 ), this.pt画像側左上座標.X, this.pt画像側左上座標.Y, this.pt画像側右下座標.X, this.pt画像側右下座標.Y, this.pt表示座標.X, this.pt表示座標.Y } );\r
132                         }\r
133                 }\r
134                 public class CBGAPAN\r
135                 {\r
136                         public int nBMP番号;\r
137                         public int n移動時間ct;\r
138                         public int n番号;\r
139                         public Point pt画像側開始位置 = new Point( 0, 0 );\r
140                         public Point pt画像側終了位置 = new Point( 0, 0 );\r
141                         public Point pt表示側開始位置 = new Point( 0, 0 );\r
142                         public Point pt表示側終了位置 = new Point( 0, 0 );\r
143                         public Size sz開始サイズ = new Size( 0, 0 );\r
144                         public Size sz終了サイズ = new Size( 0, 0 );\r
145 \r
146                         public override string ToString()\r
147                         {\r
148                                 return string.Format( "CBGAPAN{0}: BMP:{14}, 開始サイズ:{1}x{2}, 終了サイズ:{3}x{4}, 画像側開始位置:{5}x{6}, 画像側終了位置:{7}x{8}, 表示側開始位置:{9}x{10}, 表示側終了位置:{11}x{12}, 移動時間:{13}ct", new object[] { CDTX.tZZ( this.nBMP番号 ), this.sz開始サイズ.Width, this.sz開始サイズ.Height, this.sz終了サイズ.Width, this.sz終了サイズ.Height, this.pt画像側開始位置.X, this.pt画像側開始位置.Y, this.pt画像側終了位置.X, this.pt画像側終了位置.Y, this.pt表示側開始位置.X, this.pt表示側開始位置.Y, this.pt表示側終了位置.X, this.pt表示側終了位置.Y, this.n移動時間ct, CDTX.tZZ( this.nBMP番号 ) } );\r
149                         }\r
150                 }\r
151                 public class CBMP : IDisposable\r
152                 {\r
153                         public bool bUse;\r
154                         public int n番号;\r
155                         public string strコメント文 = "";\r
156                         public string strファイル名 = "";\r
157                         public CTexture tx画像;\r
158                         public int n高さ\r
159                         {\r
160                                 get\r
161                                 {\r
162                                         return this.tx画像.sz画像サイズ.Height;\r
163                                 }\r
164                         }\r
165                         public int n幅\r
166                         {\r
167                                 get\r
168                                 {\r
169                                         return this.tx画像.sz画像サイズ.Width;\r
170                                 }\r
171                         }\r
172 \r
173                         public void OnDeviceCreated()\r
174                         {\r
175                                 string str;\r
176                                 string str2 = CDTXMania.DTX.PATH_WAV;\r
177                                 if( ( str2 != null ) && ( str2.Length > 0 ) )\r
178                                 {\r
179                                         str = str2 + this.strファイル名;\r
180                                 }\r
181                                 else\r
182                                 {\r
183                                         str = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
184                                 }\r
185                                 if( File.Exists( str ) )\r
186                                 {\r
187                                         this.tx画像 = CDTXMania.tテクスチャの生成( str, true );\r
188                                         if( this.tx画像 != null )\r
189                                         {\r
190                                                 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
191                                                 {\r
192                                                         Trace.TraceInformation( "テクスチャを生成しました。({0})({1})({2}x{3})", new object[] { this.strコメント文, str, this.n幅, this.n高さ } );\r
193                                                 }\r
194                                                 this.bUse = true;\r
195                                         }\r
196                                         else\r
197                                         {\r
198                                                 Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", new object[] { this.strコメント文, str } );\r
199                                                 this.tx画像 = null;\r
200                                         }\r
201                                 }\r
202                                 else\r
203                                 {\r
204                                         Trace.TraceWarning( "ファイルが存在しません。({0})({1})", new object[] { this.strコメント文, str } );\r
205                                         this.tx画像 = null;\r
206                                 }\r
207                         }\r
208                         public override string ToString()\r
209                         {\r
210                                 return string.Format( "CBMP{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
211                         }\r
212 \r
213                         #region [ IDisposable 実装 ]\r
214                         //-----------------\r
215                         public void Dispose()\r
216                         {\r
217                                 if( !this.bDisposed済み )\r
218                                 {\r
219                                         if( this.tx画像 != null )\r
220                                         {\r
221                                                 string str;\r
222                                                 string str2 = CDTXMania.DTX.PATH_WAV;\r
223                                                 if( ( str2 != null ) && ( str2.Length > 0 ) )\r
224                                                 {\r
225                                                         str = str2 + this.strファイル名;\r
226                                                 }\r
227                                                 else\r
228                                                 {\r
229                                                         str = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
230                                                 }\r
231                                                 CDTXMania.tテクスチャの解放( ref this.tx画像 );\r
232                                                 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
233                                                 {\r
234                                                         Trace.TraceInformation( "テクスチャを解放しました。({0})({1})", new object[] { this.strコメント文, str } );\r
235                                                 }\r
236                                         }\r
237                                         this.bUse = false;\r
238                                         this.bDisposed済み = true;\r
239                                 }\r
240                         }\r
241                         //-----------------\r
242                         #endregion\r
243 \r
244                         #region [ private ]\r
245                         //-----------------\r
246                         private bool bDisposed済み;\r
247                         //-----------------\r
248                         #endregion\r
249                 }\r
250                 public class CBMPTEX : IDisposable\r
251                 {\r
252                         public bool bUse;\r
253                         public int n番号;\r
254                         public string strコメント文 = "";\r
255                         public string strファイル名 = "";\r
256                         public CTexture tx画像;\r
257                         public int n高さ\r
258                         {\r
259                                 get\r
260                                 {\r
261                                         return this.tx画像.sz画像サイズ.Height;\r
262                                 }\r
263                         }\r
264                         public int n幅\r
265                         {\r
266                                 get\r
267                                 {\r
268                                         return this.tx画像.sz画像サイズ.Width;\r
269                                 }\r
270                         }\r
271 \r
272                         public void OnDeviceCreated()\r
273                         {\r
274                                 string str;\r
275                                 string str2 = CDTXMania.DTX.PATH_WAV;\r
276                                 if( ( str2 != null ) && ( str2.Length > 0 ) )\r
277                                 {\r
278                                         str = str2 + this.strファイル名;\r
279                                 }\r
280                                 else\r
281                                 {\r
282                                         str = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
283                                 }\r
284                                 if( File.Exists( str ) )\r
285                                 {\r
286                                         this.tx画像 = CDTXMania.tテクスチャの生成( str );\r
287                                         if( this.tx画像 != null )\r
288                                         {\r
289                                                 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
290                                                 {\r
291                                                         Trace.TraceInformation( "テクスチャを生成しました。({0})({1})(Gr:{2}x{3})(Tx:{4}x{5})", new object[] { this.strコメント文, str, this.tx画像.sz画像サイズ.Width, this.tx画像.sz画像サイズ.Height, this.tx画像.szテクスチャサイズ.Width, this.tx画像.szテクスチャサイズ.Height } );\r
292                                                 }\r
293                                                 this.bUse = true;\r
294                                         }\r
295                                         else\r
296                                         {\r
297                                                 Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", new object[] { this.strコメント文, str } );\r
298                                         }\r
299                                 }\r
300                                 else\r
301                                 {\r
302                                         Trace.TraceWarning( "ファイルが存在しません。({0})({1})", new object[] { this.strコメント文, str } );\r
303                                         this.tx画像 = null;\r
304                                 }\r
305                         }\r
306                         public override string ToString()\r
307                         {\r
308                                 return string.Format( "CBMPTEX{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );\r
309                         }\r
310 \r
311                         #region [ IDisposable 実装 ]\r
312                         //-----------------\r
313                         public void Dispose()\r
314                         {\r
315                                 if( !this.bDisposed済み )\r
316                                 {\r
317                                         if( this.tx画像 != null )\r
318                                         {\r
319                                                 string str;\r
320                                                 string str2 = CDTXMania.DTX.PATH_WAV;\r
321                                                 if( ( str2 != null ) && ( str2.Length > 0 ) )\r
322                                                 {\r
323                                                         str = str2 + this.strファイル名;\r
324                                                 }\r
325                                                 else\r
326                                                 {\r
327                                                         str = CDTXMania.DTX.strフォルダ名 + this.strファイル名;\r
328                                                 }\r
329                                                 CDTXMania.tテクスチャの解放( ref this.tx画像 );\r
330                                                 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
331                                                 {\r
332                                                         Trace.TraceInformation( "テクスチャを解放しました。({0})({1})", new object[] { this.strコメント文, str } );\r
333                                                 }\r
334                                         }\r
335                                         this.bUse = false;\r
336                                         this.bDisposed済み = true;\r
337                                 }\r
338                         }\r
339                         //-----------------\r
340                         #endregion\r
341 \r
342                         #region [ private ]\r
343                         //-----------------\r
344                         private bool bDisposed済み;\r
345                         //-----------------\r
346                         #endregion\r
347                 }\r
348                 public class CBPM\r
349                 {\r
350                         public double dbBPM値;\r
351                         public int n内部番号;\r
352                         public int n表記上の番号;\r
353 \r
354                         public override string ToString()\r
355                         {\r
356                                 StringBuilder builder = new StringBuilder( 0x80 );\r
357                                 if( this.n内部番号 != this.n表記上の番号 )\r
358                                 {\r
359                                         builder.Append( string.Format( "CBPM{0}(内部{1})", CDTX.tZZ( this.n表記上の番号 ), this.n内部番号 ) );\r
360                                 }\r
361                                 else\r
362                                 {\r
363                                         builder.Append( string.Format( "CBPM{0}", CDTX.tZZ( this.n表記上の番号 ) ) );\r
364                                 }\r
365                                 builder.Append( string.Format( ", BPM:{0}", this.dbBPM値 ) );\r
366                                 return builder.ToString();\r
367                         }\r
368                 }\r
369                 public class CChip : IComparable<CDTX.CChip>\r
370                 {\r
371                         public bool bHit;\r
372                         public bool b可視 = true;\r
373                         public double dbチップサイズ倍率 = 1.0;\r
374                         public double db実数値;\r
375                         public EAVI種別 eAVI種別;\r
376                         public EBGA種別 eBGA種別;\r
377                         public E楽器パート e楽器パート = E楽器パート.UNKNOWN;\r
378                         public int nチャンネル番号;\r
379                         public STDGBVALUE<int> nバーからの距離dot;\r
380                         public int n整数値;\r
381                         public int n整数値・内部番号;\r
382                         public int n総移動時間;\r
383                         public int n透明度 = 0xff;\r
384                         public int n発声位置;\r
385                         public int n発声時刻ms;\r
386                         public CDTX.CAVI rAVI;\r
387                         public CDTX.CAVIPAN rAVIPan;\r
388                         public CDTX.CBGA rBGA;\r
389                         public CDTX.CBGAPAN rBGAPan;\r
390                         public CDTX.CBMP rBMP;\r
391                         public CDTX.CBMPTEX rBMPTEX;\r
392                         public bool bBPMチップである\r
393                         {\r
394                                 get\r
395                                 {\r
396                                         if (this.nチャンネル番号 == 3 || this.nチャンネル番号 == 8) {\r
397                                                 return true;\r
398                                         } else {\r
399                                                 return false;\r
400                                         }\r
401                                 }\r
402                         }\r
403                         public bool bWAVを使うチャンネルである\r
404                         {\r
405                                 get\r
406                                 {\r
407                                         switch( this.nチャンネル番号 )\r
408                                         {\r
409                                                 case 0x01:\r
410                                                 case 0x11:\r
411                                                 case 0x12:\r
412                                                 case 0x13:\r
413                                                 case 0x14:\r
414                                                 case 0x15:\r
415                                                 case 0x16:\r
416                                                 case 0x17:\r
417                                                 case 0x18:\r
418                                                 case 0x19:\r
419                                                 case 0x1a:\r
420                                                 case 0x1f:\r
421                                                 case 0x20:\r
422                                                 case 0x21:\r
423                                                 case 0x22:\r
424                                                 case 0x23:\r
425                                                 case 0x24:\r
426                                                 case 0x25:\r
427                                                 case 0x26:\r
428                                                 case 0x27:\r
429                                                 case 0x2f:\r
430                                                 case 0x31:\r
431                                                 case 0x32:\r
432                                                 case 0x33:\r
433                                                 case 0x34:\r
434                                                 case 0x35:\r
435                                                 case 0x36:\r
436                                                 case 0x37:\r
437                                                 case 0x38:\r
438                                                 case 0x39:\r
439                                                 case 0x3a:\r
440                                                 case 0x61:\r
441                                                 case 0x62:\r
442                                                 case 0x63:\r
443                                                 case 0x64:\r
444                                                 case 0x65:\r
445                                                 case 0x66:\r
446                                                 case 0x67:\r
447                                                 case 0x68:\r
448                                                 case 0x69:\r
449                                                 case 0x70:\r
450                                                 case 0x71:\r
451                                                 case 0x72:\r
452                                                 case 0x73:\r
453                                                 case 0x74:\r
454                                                 case 0x75:\r
455                                                 case 0x76:\r
456                                                 case 0x77:\r
457                                                 case 0x78:\r
458                                                 case 0x79:\r
459                                                 case 0x80:\r
460                                                 case 0x81:\r
461                                                 case 0x82:\r
462                                                 case 0x83:\r
463                                                 case 0x84:\r
464                                                 case 0x85:\r
465                                                 case 0x86:\r
466                                                 case 0x87:\r
467                                                 case 0x88:\r
468                                                 case 0x89:\r
469                                                 case 0x90:\r
470                                                 case 0x91:\r
471                                                 case 0x92:\r
472                                                 case 0xa0:\r
473                                                 case 0xa1:\r
474                                                 case 0xa2:\r
475                                                 case 0xa3:\r
476                                                 case 0xa4:\r
477                                                 case 0xa5:\r
478                                                 case 0xa6:\r
479                                                 case 0xa7:\r
480                                                 case 0xaf:\r
481                                                 case 0xb1:\r
482                                                 case 0xb2:\r
483                                                 case 0xb3:\r
484                                                 case 0xb4:\r
485                                                 case 0xb5:\r
486                                                 case 0xb6:\r
487                                                 case 0xb7:\r
488                                                 case 0xb8:\r
489                                                 case 0xb9:\r
490                                                 case 0xba:\r
491                                                 case 0xbb:\r
492                                                 case 0xbc:\r
493                                                         return true;\r
494                                         }\r
495                                         return false;\r
496                                 }\r
497                         }\r
498                         public bool b自動再生音チャンネルである\r
499                         {\r
500                                 get\r
501                                 {\r
502                                         int num = this.nチャンネル番号;\r
503                                         if( ( ( ( num != 1 ) && ( ( 0x61 > num ) || ( num > 0x69 ) ) ) && ( ( 0x70 > num ) || ( num > 0x79 ) ) ) && ( ( 0x80 > num ) || ( num > 0x89 ) ) )\r
504                                         {\r
505                                                 return ( ( 0x90 <= num ) && ( num <= 0x92 ) );\r
506                                         }\r
507                                         return true;\r
508                                 }\r
509                         }\r
510 \r
511                         public CChip()\r
512                         {\r
513                                 STDGBVALUE<int> stdgbvalue = new STDGBVALUE<int>();\r
514                                 stdgbvalue.Drums = 0;\r
515                                 stdgbvalue.Guitar = 0;\r
516                                 stdgbvalue.Bass = 0;\r
517                                 this.nバーからの距離dot = stdgbvalue;\r
518                         }\r
519                         public void t初期化()\r
520                         {\r
521                                 this.nチャンネル番号 = 0;\r
522                                 this.n整数値 = 0;\r
523                                 this.n整数値・内部番号 = 0;\r
524                                 this.db実数値 = 0.0;\r
525                                 this.n発声位置 = 0;\r
526                                 this.n発声時刻ms = 0;\r
527                                 this.dbチップサイズ倍率 = 1.0;\r
528                                 this.bHit = false;\r
529                                 this.b可視 = true;\r
530                                 this.e楽器パート = E楽器パート.UNKNOWN;\r
531                                 this.n透明度 = 0xff;\r
532                                 this.nバーからの距離dot.Drums = 0;\r
533                                 this.nバーからの距離dot.Guitar = 0;\r
534                                 this.nバーからの距離dot.Bass = 0;\r
535                                 this.n総移動時間 = 0;\r
536                         }\r
537                         public override string ToString()\r
538                         {\r
539                                 string str = "";\r
540                                 switch( this.nチャンネル番号 )\r
541                                 {\r
542                                         case 1:\r
543                                                 str = "バックコーラス";\r
544                                                 break;\r
545 \r
546                                         case 2:\r
547                                                 str = "小節長変更";\r
548                                                 break;\r
549 \r
550                                         case 3:\r
551                                                 str = "BPM変更";\r
552                                                 break;\r
553 \r
554                                         case 4:\r
555                                                 str = "BMPレイヤ1";\r
556                                                 break;\r
557 \r
558                                         case 7:\r
559                                                 str = "BMPレイヤ2";\r
560                                                 break;\r
561 \r
562                                         case 8:\r
563                                                 str = "BPM変更(拡張)";\r
564                                                 break;\r
565 \r
566                                         case 0x11:\r
567                                                 str = "HHClose";\r
568                                                 break;\r
569 \r
570                                         case 0x12:\r
571                                                 str = "Snare";\r
572                                                 break;\r
573 \r
574                                         case 0x13:\r
575                                                 str = "Kick";\r
576                                                 break;\r
577 \r
578                                         case 20:\r
579                                                 str = "HiTom";\r
580                                                 break;\r
581 \r
582                                         case 0x15:\r
583                                                 str = "LowTom";\r
584                                                 break;\r
585 \r
586                                         case 0x16:\r
587                                                 str = "Cymbal";\r
588                                                 break;\r
589 \r
590                                         case 0x17:\r
591                                                 str = "FloorTom";\r
592                                                 break;\r
593 \r
594                                         case 0x18:\r
595                                                 str = "HHOpen";\r
596                                                 break;\r
597 \r
598                                         case 0x19:\r
599                                                 str = "RideCymbal";\r
600                                                 break;\r
601 \r
602                                         case 0x1a:\r
603                                                 str = "LeftCymbal";\r
604                                                 break;\r
605 \r
606                                         case 0x1f:\r
607                                                 str = "ドラム歓声切替";\r
608                                                 break;\r
609 \r
610                                         case 0x20:\r
611                                                 str = "ギターOPEN";\r
612                                                 break;\r
613 \r
614                                         case 0x21:\r
615                                                 str = "ギター - - B";\r
616                                                 break;\r
617 \r
618                                         case 0x22:\r
619                                                 str = "ギター - G -";\r
620                                                 break;\r
621 \r
622                                         case 0x23:\r
623                                                 str = "ギター - G B";\r
624                                                 break;\r
625 \r
626                                         case 0x24:\r
627                                                 str = "ギター R - -";\r
628                                                 break;\r
629 \r
630                                         case 0x25:\r
631                                                 str = "ギター R - B";\r
632                                                 break;\r
633 \r
634                                         case 0x26:\r
635                                                 str = "ギター R G -";\r
636                                                 break;\r
637 \r
638                                         case 0x27:\r
639                                                 str = "ギター R G B";\r
640                                                 break;\r
641 \r
642                                         case 40:\r
643                                                 str = "ギターWailing";\r
644                                                 break;\r
645 \r
646                                         case 0x2f:\r
647                                                 str = "ギターWailing音切替";\r
648                                                 break;\r
649 \r
650                                         case 0x31:\r
651                                                 str = "HHClose(不可視)";\r
652                                                 break;\r
653 \r
654                                         case 50:\r
655                                                 str = "Snare(不可視)";\r
656                                                 break;\r
657 \r
658                                         case 0x33:\r
659                                                 str = "Kick(不可視)";\r
660                                                 break;\r
661 \r
662                                         case 0x34:\r
663                                                 str = "HiTom(不可視)";\r
664                                                 break;\r
665 \r
666                                         case 0x35:\r
667                                                 str = "LowTom(不可視)";\r
668                                                 break;\r
669 \r
670                                         case 0x36:\r
671                                                 str = "Cymbal(不可視)";\r
672                                                 break;\r
673 \r
674                                         case 0x37:\r
675                                                 str = "FloorTom(不可視)";\r
676                                                 break;\r
677 \r
678                                         case 0x38:\r
679                                                 str = "HHOpen(不可視)";\r
680                                                 break;\r
681 \r
682                                         case 0x39:\r
683                                                 str = "RideCymbal(不可視)";\r
684                                                 break;\r
685 \r
686                                         case 0x3a:\r
687                                                 str = "LeftCymbal(不可視)";\r
688                                                 break;\r
689 \r
690                                         case 80:\r
691                                                 str = "小節線";\r
692                                                 break;\r
693 \r
694                                         case 0x51:\r
695                                                 str = "拍線";\r
696                                                 break;\r
697 \r
698                                         case 0x52:\r
699                                                 str = "MIDIコーラス";\r
700                                                 break;\r
701 \r
702                                         case 0x53:\r
703                                                 str = "フィルイン";\r
704                                                 break;\r
705 \r
706                                         case 0x54:\r
707                                                 str = "AVI";\r
708                                                 break;\r
709 \r
710                                         case 0x55:\r
711                                                 str = "BMPレイヤ3";\r
712                                                 break;\r
713 \r
714                                         case 0x56:\r
715                                                 str = "BMPレイヤ4";\r
716                                                 break;\r
717 \r
718                                         case 0x57:\r
719                                                 str = "BMPレイヤ5";\r
720                                                 break;\r
721 \r
722                                         case 0x58:\r
723                                                 str = "BMPレイヤ6";\r
724                                                 break;\r
725 \r
726                                         case 0x59:\r
727                                                 str = "BMPレイヤ7";\r
728                                                 break;\r
729 \r
730                                         case 0x60:\r
731                                                 str = "BMPレイヤ8";\r
732                                                 break;\r
733 \r
734                                         case 0x61:\r
735                                                 str = "SE01";\r
736                                                 break;\r
737 \r
738                                         case 0x62:\r
739                                                 str = "SE02";\r
740                                                 break;\r
741 \r
742                                         case 0x63:\r
743                                                 str = "SE03";\r
744                                                 break;\r
745 \r
746                                         case 100:\r
747                                                 str = "SE04";\r
748                                                 break;\r
749 \r
750                                         case 0x65:\r
751                                                 str = "SE05";\r
752                                                 break;\r
753 \r
754                                         case 0x66:\r
755                                                 str = "SE06";\r
756                                                 break;\r
757 \r
758                                         case 0x67:\r
759                                                 str = "SE07";\r
760                                                 break;\r
761 \r
762                                         case 0x68:\r
763                                                 str = "SE08";\r
764                                                 break;\r
765 \r
766                                         case 0x69:\r
767                                                 str = "SE09";\r
768                                                 break;\r
769 \r
770                                         case 0x70:\r
771                                                 str = "SE10";\r
772                                                 break;\r
773 \r
774                                         case 0x71:\r
775                                                 str = "SE11";\r
776                                                 break;\r
777 \r
778                                         case 0x72:\r
779                                                 str = "SE12";\r
780                                                 break;\r
781 \r
782                                         case 0x73:\r
783                                                 str = "SE13";\r
784                                                 break;\r
785 \r
786                                         case 0x74:\r
787                                                 str = "SE14";\r
788                                                 break;\r
789 \r
790                                         case 0x75:\r
791                                                 str = "SE15";\r
792                                                 break;\r
793 \r
794                                         case 0x76:\r
795                                                 str = "SE16";\r
796                                                 break;\r
797 \r
798                                         case 0x77:\r
799                                                 str = "SE17";\r
800                                                 break;\r
801 \r
802                                         case 120:\r
803                                                 str = "SE18";\r
804                                                 break;\r
805 \r
806                                         case 0x79:\r
807                                                 str = "SE19";\r
808                                                 break;\r
809 \r
810                                         case 0x80:\r
811                                                 str = "SE20";\r
812                                                 break;\r
813 \r
814                                         case 0x81:\r
815                                                 str = "SE21";\r
816                                                 break;\r
817 \r
818                                         case 130:\r
819                                                 str = "SE22";\r
820                                                 break;\r
821 \r
822                                         case 0x83:\r
823                                                 str = "SE23";\r
824                                                 break;\r
825 \r
826                                         case 0x84:\r
827                                                 str = "SE24";\r
828                                                 break;\r
829 \r
830                                         case 0x85:\r
831                                                 str = "SE25";\r
832                                                 break;\r
833 \r
834                                         case 0x86:\r
835                                                 str = "SE26";\r
836                                                 break;\r
837 \r
838                                         case 0x87:\r
839                                                 str = "SE27";\r
840                                                 break;\r
841 \r
842                                         case 0x88:\r
843                                                 str = "SE28";\r
844                                                 break;\r
845 \r
846                                         case 0x89:\r
847                                                 str = "SE29";\r
848                                                 break;\r
849 \r
850                                         case 0x90:\r
851                                                 str = "SE30";\r
852                                                 break;\r
853 \r
854                                         case 0x91:\r
855                                                 str = "SE31";\r
856                                                 break;\r
857 \r
858                                         case 0x92:\r
859                                                 str = "SE32";\r
860                                                 break;\r
861 \r
862                                         case 160:\r
863                                                 str = "ベースOPEN";\r
864                                                 break;\r
865 \r
866                                         case 0xa1:\r
867                                                 str = "ベース - - B";\r
868                                                 break;\r
869 \r
870                                         case 0xa2:\r
871                                                 str = "ベース - G -";\r
872                                                 break;\r
873 \r
874                                         case 0xa3:\r
875                                                 str = "ベース - G B";\r
876                                                 break;\r
877 \r
878                                         case 0xa4:\r
879                                                 str = "ベース R - -";\r
880                                                 break;\r
881 \r
882                                         case 0xa5:\r
883                                                 str = "ベース R - B";\r
884                                                 break;\r
885 \r
886                                         case 0xa6:\r
887                                                 str = "ベース R G -";\r
888                                                 break;\r
889 \r
890                                         case 0xa7:\r
891                                                 str = "ベース R G B";\r
892                                                 break;\r
893 \r
894                                         case 0xa8:\r
895                                                 str = "ベースWailing";\r
896                                                 break;\r
897 \r
898                                         case 0xaf:\r
899                                                 str = "ベースWailing音切替";\r
900                                                 break;\r
901 \r
902                                         case 0xb1:\r
903                                                 str = "HHClose(空うち)";\r
904                                                 break;\r
905 \r
906                                         case 0xb2:\r
907                                                 str = "Snare(空うち)";\r
908                                                 break;\r
909 \r
910                                         case 0xb3:\r
911                                                 str = "Kick(空うち)";\r
912                                                 break;\r
913 \r
914                                         case 180:\r
915                                                 str = "HiTom(空うち)";\r
916                                                 break;\r
917 \r
918                                         case 0xb5:\r
919                                                 str = "LowTom(空うち)";\r
920                                                 break;\r
921 \r
922                                         case 0xb6:\r
923                                                 str = "Cymbal(空うち)";\r
924                                                 break;\r
925 \r
926                                         case 0xb7:\r
927                                                 str = "FloorTom(空うち)";\r
928                                                 break;\r
929 \r
930                                         case 0xb8:\r
931                                                 str = "HHOpen(空うち)";\r
932                                                 break;\r
933 \r
934                                         case 0xb9:\r
935                                                 str = "RideCymbal(空うち)";\r
936                                                 break;\r
937 \r
938                                         case 0xba:\r
939                                                 str = "ギター(空打ち)";\r
940                                                 break;\r
941 \r
942                                         case 0xbb:\r
943                                                 str = "ベース(空打ち)";\r
944                                                 break;\r
945 \r
946                                         case 0xbc:\r
947                                                 str = "LeftCymbal(空うち)";\r
948                                                 break;\r
949 \r
950                                         case 0xc4:\r
951                                                 str = "BGAスコープ画像切替1";\r
952                                                 break;\r
953 \r
954                                         case 0xc7:\r
955                                                 str = "BGAスコープ画像切替2";\r
956                                                 break;\r
957 \r
958                                         case 0xd5:\r
959                                                 str = "BGAスコープ画像切替3";\r
960                                                 break;\r
961 \r
962                                         case 0xd6:\r
963                                                 str = "BGAスコープ画像切替4";\r
964                                                 break;\r
965 \r
966                                         case 0xd7:\r
967                                                 str = "BGAスコープ画像切替5";\r
968                                                 break;\r
969 \r
970                                         case 0xd8:\r
971                                                 str = "BGAスコープ画像切替6";\r
972                                                 break;\r
973 \r
974                                         case 0xd9:\r
975                                                 str = "BGAスコープ画像切替7";\r
976                                                 break;\r
977 \r
978                                         case 0xe0:\r
979                                                 str = "BGAスコープ画像切替8";\r
980                                                 break;\r
981 \r
982                                         default:\r
983                                                 str = "??";\r
984                                                 break;\r
985                                 }\r
986                                 return string.Format( "CChip: 位置:{0:D4}.{1:D3}, 時刻{2:D6}, Ch:{3:X2}({4}), Pn:{5}({11})(内部{6}), Pd:{7}, Sz:{8}, UseWav:{9}, Auto:{10}", new object[] { this.n発声位置 / 384, this.n発声位置 % 384, this.n発声時刻ms, this.nチャンネル番号, str, this.n整数値, this.n整数値・内部番号, this.db実数値, this.dbチップサイズ倍率, this.bWAVを使うチャンネルである, this.b自動再生音チャンネルである, CDTX.tZZ( this.n整数値 ) } );\r
987                         }\r
988 \r
989                         #region [ IComparable 実装 ]\r
990                         //-----------------\r
991                         public int CompareTo( CDTX.CChip other )\r
992                         {\r
993                                 byte[] buffer = new byte[] { \r
994                 5, 5, 3, 3, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, \r
995                 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, \r
996                 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, \r
997                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
998                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
999                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1000                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1001                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1002                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1003                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1004                 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5, \r
1005                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1006                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1007                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1008                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, \r
1009                 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5\r
1010              };\r
1011                                 if( this.n発声位置 < other.n発声位置 )\r
1012                                 {\r
1013                                         return -1;\r
1014                                 }\r
1015                                 if( this.n発声位置 > other.n発声位置 )\r
1016                                 {\r
1017                                         return 1;\r
1018                                 }\r
1019                                 if( buffer[ this.nチャンネル番号 ] < buffer[ other.nチャンネル番号 ] )\r
1020                                 {\r
1021                                         return -1;\r
1022                                 }\r
1023                                 if( buffer[ this.nチャンネル番号 ] > buffer[ other.nチャンネル番号 ] )\r
1024                                 {\r
1025                                         return 1;\r
1026                                 }\r
1027                                 return 0;\r
1028                         }\r
1029                         //-----------------\r
1030                         #endregion\r
1031                 }\r
1032                 public class CWAV : IDisposable\r
1033                 {\r
1034                         public bool bBGMとして使う;\r
1035                         public List<int> listこのWAVを使用するチャンネル番号の集合 = new List<int>( 0x10 );\r
1036                         public int nチップサイズ = 100;\r
1037                         public int n位置;\r
1038                         public long[] n一時停止時刻 = new long[ 4 ];\r
1039                         public int n音量 = 100;\r
1040                         public int n現在再生中のサウンド番号;\r
1041                         public long[] n再生開始時刻 = new long[ 4 ];\r
1042                         public int n内部番号;\r
1043                         public int n表記上の番号;\r
1044                         public CSound[] rSound = new CSound[ 4 ];\r
1045                         public string strコメント文 = "";\r
1046                         public string strファイル名 = "";\r
1047                         public bool bBGMとして使わない\r
1048                         {\r
1049                                 get\r
1050                                 {\r
1051                                         return !this.bBGMとして使う;\r
1052                                 }\r
1053                                 set\r
1054                                 {\r
1055                                         this.bBGMとして使う = !value;\r
1056                                 }\r
1057                         }\r
1058 \r
1059                         public override string ToString()\r
1060                         {\r
1061                                 StringBuilder builder = new StringBuilder( 0x80 );\r
1062                                 if( this.n表記上の番号 == this.n内部番号 )\r
1063                                 {\r
1064                                         builder.Append( string.Format( "CWAV{0}: ", CDTX.tZZ( this.n表記上の番号 ) ) );\r
1065                                 }\r
1066                                 else\r
1067                                 {\r
1068                                         builder.Append( string.Format( "CWAV{0}(内部{1}): ", CDTX.tZZ( this.n表記上の番号 ), this.n内部番号 ) );\r
1069                                 }\r
1070                                 builder.Append( string.Format( "音量:{0}, 位置:{1}, サイズ:{2}, BGM:{3}, File:{4}, Comment:{5}", new object[] { this.n音量, this.n位置, this.nチップサイズ, this.bBGMとして使う ? 'Y' : 'N', this.strファイル名, this.strコメント文 } ) );\r
1071                                 return builder.ToString();\r
1072                         }\r
1073 \r
1074                         #region [ IDisposable+α実装 ]\r
1075                         //-----------------\r
1076                         public void Dispose()\r
1077                         {\r
1078                                 this.Dispose( true );\r
1079                         }\r
1080                         public void Dispose( bool bサウンドのDisposeも行う )\r
1081                         {\r
1082                                 if( !this.bDisposed済み )\r
1083                                 {\r
1084                                         for( int i = 0; i < 4; i++ )\r
1085                                         {\r
1086                                                 if( bサウンドのDisposeも行う && ( this.rSound[ i ] != null ) )\r
1087                                                 {\r
1088                                                         CDTXMania.Sound管理.tサウンドを破棄する( this.rSound[ i ] );\r
1089                                                 }\r
1090                                                 this.rSound[ i ] = null;\r
1091                                                 if( ( i == 0 ) && CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
1092                                                 {\r
1093                                                         Trace.TraceInformation( "サウンドを解放しました。({0})({1})", new object[] { this.strコメント文, this.strファイル名 } );\r
1094                                                 }\r
1095                                         }\r
1096                                         this.bDisposed済み = true;\r
1097                                 }\r
1098                         }\r
1099                         //-----------------\r
1100                         #endregion\r
1101 \r
1102                         #region [ private ]\r
1103                         //-----------------\r
1104                         private bool bDisposed済み;\r
1105                         //-----------------\r
1106                         #endregion\r
1107                 }\r
1108                 \r
1109 \r
1110                 // 構造体\r
1111 \r
1112                 [StructLayout( LayoutKind.Sequential )]\r
1113                 public struct STLANEINT\r
1114                 {\r
1115                         public int HH;\r
1116                         public int SD;\r
1117                         public int BD;\r
1118                         public int HT;\r
1119                         public int LT;\r
1120                         public int CY;\r
1121                         public int FT;\r
1122                         public int HHO;\r
1123                         public int RD;\r
1124                         public int LC;\r
1125                         public int Guitar;\r
1126                         public int Bass;\r
1127                         public int this[ int index ]\r
1128                         {\r
1129                                 get\r
1130                                 {\r
1131                                         switch( index )\r
1132                                         {\r
1133                                                 case 0:\r
1134                                                         return this.HH;\r
1135 \r
1136                                                 case 1:\r
1137                                                         return this.SD;\r
1138 \r
1139                                                 case 2:\r
1140                                                         return this.BD;\r
1141 \r
1142                                                 case 3:\r
1143                                                         return this.HT;\r
1144 \r
1145                                                 case 4:\r
1146                                                         return this.LT;\r
1147 \r
1148                                                 case 5:\r
1149                                                         return this.CY;\r
1150 \r
1151                                                 case 6:\r
1152                                                         return this.FT;\r
1153 \r
1154                                                 case 7:\r
1155                                                         return this.HHO;\r
1156 \r
1157                                                 case 8:\r
1158                                                         return this.RD;\r
1159 \r
1160                                                 case 9:\r
1161                                                         return this.LC;\r
1162 \r
1163                                                 case 10:\r
1164                                                         return this.Guitar;\r
1165 \r
1166                                                 case 11:\r
1167                                                         return this.Bass;\r
1168                                         }\r
1169                                         throw new IndexOutOfRangeException();\r
1170                                 }\r
1171                                 set\r
1172                                 {\r
1173                                         if( value < 0 )\r
1174                                         {\r
1175                                                 throw new ArgumentOutOfRangeException();\r
1176                                         }\r
1177                                         switch( index )\r
1178                                         {\r
1179                                                 case 0:\r
1180                                                         this.HH = value;\r
1181                                                         return;\r
1182 \r
1183                                                 case 1:\r
1184                                                         this.SD = value;\r
1185                                                         return;\r
1186 \r
1187                                                 case 2:\r
1188                                                         this.BD = value;\r
1189                                                         return;\r
1190 \r
1191                                                 case 3:\r
1192                                                         this.HT = value;\r
1193                                                         return;\r
1194 \r
1195                                                 case 4:\r
1196                                                         this.LT = value;\r
1197                                                         return;\r
1198 \r
1199                                                 case 5:\r
1200                                                         this.CY = value;\r
1201                                                         return;\r
1202 \r
1203                                                 case 6:\r
1204                                                         this.FT = value;\r
1205                                                         return;\r
1206 \r
1207                                                 case 7:\r
1208                                                         this.HHO = value;\r
1209                                                         return;\r
1210 \r
1211                                                 case 8:\r
1212                                                         this.RD = value;\r
1213                                                         return;\r
1214 \r
1215                                                 case 9:\r
1216                                                         this.LC = value;\r
1217                                                         return;\r
1218 \r
1219                                                 case 10:\r
1220                                                         this.Guitar = value;\r
1221                                                         return;\r
1222 \r
1223                                                 case 11:\r
1224                                                         this.Bass = value;\r
1225                                                         return;\r
1226                                         }\r
1227                                         throw new IndexOutOfRangeException();\r
1228                                 }\r
1229                         }\r
1230                         public int Drums\r
1231                         {\r
1232                                 get\r
1233                                 {\r
1234                                         return this.HH + this.SD + this.BD + this.HT + this.LT + this.CY + this.FT + this.HHO + this.RD + this.LC;\r
1235                                 }\r
1236                         }\r
1237                 }\r
1238                 \r
1239                 [StructLayout( LayoutKind.Sequential )]\r
1240                 public struct STRESULT\r
1241                 {\r
1242                         public string SS;\r
1243                         public string S;\r
1244                         public string A;\r
1245                         public string B;\r
1246                         public string C;\r
1247                         public string D;\r
1248                         public string E;\r
1249                         public string this[ int index ]\r
1250                         {\r
1251                                 get\r
1252                                 {\r
1253                                         switch( index )\r
1254                                         {\r
1255                                                 case 0:\r
1256                                                         return this.SS;\r
1257 \r
1258                                                 case 1:\r
1259                                                         return this.S;\r
1260 \r
1261                                                 case 2:\r
1262                                                         return this.A;\r
1263 \r
1264                                                 case 3:\r
1265                                                         return this.B;\r
1266 \r
1267                                                 case 4:\r
1268                                                         return this.C;\r
1269 \r
1270                                                 case 5:\r
1271                                                         return this.D;\r
1272 \r
1273                                                 case 6:\r
1274                                                         return this.E;\r
1275                                         }\r
1276                                         throw new IndexOutOfRangeException();\r
1277                                 }\r
1278                                 set\r
1279                                 {\r
1280                                         switch( index )\r
1281                                         {\r
1282                                                 case 0:\r
1283                                                         this.SS = value;\r
1284                                                         return;\r
1285 \r
1286                                                 case 1:\r
1287                                                         this.S = value;\r
1288                                                         return;\r
1289 \r
1290                                                 case 2:\r
1291                                                         this.A = value;\r
1292                                                         return;\r
1293 \r
1294                                                 case 3:\r
1295                                                         this.B = value;\r
1296                                                         return;\r
1297 \r
1298                                                 case 4:\r
1299                                                         this.C = value;\r
1300                                                         return;\r
1301 \r
1302                                                 case 5:\r
1303                                                         this.D = value;\r
1304                                                         return;\r
1305 \r
1306                                                 case 6:\r
1307                                                         this.E = value;\r
1308                                                         return;\r
1309                                         }\r
1310                                         throw new IndexOutOfRangeException();\r
1311                                 }\r
1312                         }\r
1313                 }\r
1314                 \r
1315                 [StructLayout( LayoutKind.Sequential )]\r
1316                 public struct STチップがある\r
1317                 {\r
1318                         public bool Drums;\r
1319                         public bool Guitar;\r
1320                         public bool Bass;\r
1321                         public bool HHOpen;\r
1322                         public bool Ride;\r
1323                         public bool LeftCymbal;\r
1324                         public bool OpenGuitar;\r
1325                         public bool OpenBass;\r
1326                         public bool this[ int index ]\r
1327                         {\r
1328                                 get\r
1329                                 {\r
1330                                         switch( index )\r
1331                                         {\r
1332                                                 case 0:\r
1333                                                         return this.Drums;\r
1334 \r
1335                                                 case 1:\r
1336                                                         return this.Guitar;\r
1337 \r
1338                                                 case 2:\r
1339                                                         return this.Bass;\r
1340 \r
1341                                                 case 3:\r
1342                                                         return this.HHOpen;\r
1343 \r
1344                                                 case 4:\r
1345                                                         return this.Ride;\r
1346 \r
1347                                                 case 5:\r
1348                                                         return this.LeftCymbal;\r
1349 \r
1350                                                 case 6:\r
1351                                                         return this.OpenGuitar;\r
1352 \r
1353                                                 case 7:\r
1354                                                         return this.OpenBass;\r
1355                                         }\r
1356                                         throw new IndexOutOfRangeException();\r
1357                                 }\r
1358                                 set\r
1359                                 {\r
1360                                         switch( index )\r
1361                                         {\r
1362                                                 case 0:\r
1363                                                         this.Drums = value;\r
1364                                                         return;\r
1365 \r
1366                                                 case 1:\r
1367                                                         this.Guitar = value;\r
1368                                                         return;\r
1369 \r
1370                                                 case 2:\r
1371                                                         this.Bass = value;\r
1372                                                         return;\r
1373 \r
1374                                                 case 3:\r
1375                                                         this.HHOpen = value;\r
1376                                                         return;\r
1377 \r
1378                                                 case 4:\r
1379                                                         this.Ride = value;\r
1380                                                         return;\r
1381 \r
1382                                                 case 5:\r
1383                                                         this.LeftCymbal = value;\r
1384                                                         return;\r
1385 \r
1386                                                 case 6:\r
1387                                                         this.OpenGuitar = value;\r
1388                                                         return;\r
1389 \r
1390                                                 case 7:\r
1391                                                         this.OpenBass = value;\r
1392                                                         return;\r
1393                                         }\r
1394                                         throw new IndexOutOfRangeException();\r
1395                                 }\r
1396                         }\r
1397                 }\r
1398 \r
1399 \r
1400                 // プロパティ\r
1401 \r
1402                 public int nBGMAdjust\r
1403                 {\r
1404                         get; \r
1405                         private set;\r
1406                 }\r
1407                 public string ARTIST;\r
1408                 public string BACKGROUND;\r
1409                 public string BACKGROUND_GR;\r
1410                 public double BASEBPM;\r
1411                 public bool BLACKCOLORKEY;\r
1412                 public double BPM;\r
1413                 public STチップがある bチップがある;\r
1414                 public string COMMENT;\r
1415                 public double db再生速度;\r
1416                 public E種別 e種別;\r
1417                 public string GENRE;\r
1418                 public bool HIDDENLEVEL;\r
1419                 public STDGBVALUE<int> LEVEL;\r
1420                 public Dictionary<int, CAVI> listAVI;\r
1421                 public Dictionary<int, CAVIPAN> listAVIPAN;\r
1422                 public Dictionary<int, CBGA> listBGA;\r
1423                 public Dictionary<int, CBGAPAN> listBGAPAN;\r
1424                 public Dictionary<int, CBMP> listBMP;\r
1425                 public Dictionary<int, CBMPTEX> listBMPTEX;\r
1426                 public Dictionary<int, CBPM> listBPM;\r
1427                 public List<CChip> listChip;\r
1428                 public Dictionary<int, CWAV> listWAV;\r
1429                 public string MIDIFILE;\r
1430                 public bool MIDINOTE;\r
1431                 public int MIDIレベル;\r
1432                 public STLANEINT n可視チップ数;\r
1433                 public const int n最大音数 = 4;\r
1434                 public const int n小節の解像度 = 384;\r
1435                 public string PANEL;\r
1436                 public string PATH_WAV;\r
1437                 public string PREIMAGE;\r
1438                 public string PREMOVIE;\r
1439                 public string PREVIEW;\r
1440                 public STRESULT RESULTIMAGE;\r
1441                 public STRESULT RESULTMOVIE;\r
1442                 public STRESULT RESULTSOUND;\r
1443                 public string SOUND_AUDIENCE;\r
1444                 public string SOUND_FULLCOMBO;\r
1445                 public string SOUND_NOWLOADING;\r
1446                 public string SOUND_STAGEFAILED;\r
1447                 public string STAGEFILE;\r
1448                 public string strハッシュofDTXファイル;\r
1449                 public string strファイル名;\r
1450                 public string strファイル名の絶対パス;\r
1451                 public string strフォルダ名;\r
1452                 public string TITLE;\r
1453 #if TEST_NOTEOFFMODE\r
1454                 public bool bHH演奏で直前のHHを消音する;\r
1455                 public bool bGUITAR演奏で直前のGUITARを消音する;\r
1456                 public bool bBASS演奏で直前のBASSを消音する;\r
1457 #endif\r
1458                 // コンストラクタ\r
1459 \r
1460                 public CDTX()\r
1461                 {\r
1462                         this.TITLE = "";\r
1463                         this.ARTIST = "";\r
1464                         this.COMMENT = "";\r
1465                         this.PANEL = "";\r
1466                         this.GENRE = "";\r
1467                         this.PREVIEW = "";\r
1468                         this.PREIMAGE = "";\r
1469                         this.PREMOVIE = "";\r
1470                         this.STAGEFILE = "";\r
1471                         this.BACKGROUND = "";\r
1472                         this.BACKGROUND_GR = "";\r
1473                         this.PATH_WAV = "";\r
1474                         this.MIDIFILE = "";\r
1475                         this.SOUND_STAGEFAILED = "";\r
1476                         this.SOUND_FULLCOMBO = "";\r
1477                         this.SOUND_NOWLOADING = "";\r
1478                         this.SOUND_AUDIENCE = "";\r
1479                         this.BPM = 120.0;\r
1480                         this.BLACKCOLORKEY = true;\r
1481                         STDGBVALUE<int> stdgbvalue = new STDGBVALUE<int>();\r
1482                         stdgbvalue.Drums = 0;\r
1483                         stdgbvalue.Guitar = 0;\r
1484                         stdgbvalue.Bass = 0;\r
1485                         this.LEVEL = stdgbvalue;\r
1486 \r
1487 #if true        // 2010.12.31 yyagi #RESULTxxxのリファクタ後。ここはnew()して参照渡ししなくてもいいよね?\r
1488                         for (int i = 0; i < 7; i++) {\r
1489                                 this.RESULTIMAGE[i] = "";\r
1490                                 this.RESULTMOVIE[i] = "";\r
1491                                 this.RESULTSOUND[i] = "";\r
1492                         }\r
1493 #else           // #RESULTxxxのリファクタ前\r
1494                         STRESULT stresult4 = new STRESULT();\r
1495                         STRESULT stresult = stresult4;\r
1496                         stresult.SS = "";\r
1497                         stresult.S = "";\r
1498                         stresult.A = "";\r
1499                         stresult.B = "";\r
1500                         stresult.C = "";\r
1501                         stresult.D = "";\r
1502                         stresult.E = "";\r
1503                         this.RESULTIMAGE = stresult;\r
1504                         stresult4 = new STRESULT();\r
1505                         STRESULT stresult2 = stresult4;\r
1506                         stresult2.SS = "";\r
1507                         stresult2.S = "";\r
1508                         stresult2.A = "";\r
1509                         stresult2.B = "";\r
1510                         stresult2.C = "";\r
1511                         stresult2.D = "";\r
1512                         stresult2.E = "";\r
1513                         this.RESULTMOVIE = stresult2;\r
1514                         STRESULT stresult3 = new STRESULT();\r
1515                         stresult3.SS = "";\r
1516                         stresult3.S = "";\r
1517                         stresult3.A = "";\r
1518                         stresult3.B = "";\r
1519                         stresult3.C = "";\r
1520                         stresult3.D = "";\r
1521                         stresult3.E = "";\r
1522                         this.RESULTSOUND = stresult3;\r
1523 #endif\r
1524                         this.db再生速度 = 1.0;\r
1525                         this.strハッシュofDTXファイル = "";\r
1526                         STチップがある stチップがある = new STチップがある();\r
1527                         stチップがある.Drums = false;\r
1528                         stチップがある.Guitar = false;\r
1529                         stチップがある.Bass = false;\r
1530                         stチップがある.HHOpen = false;\r
1531                         stチップがある.Ride = false;\r
1532                         stチップがある.LeftCymbal = false;\r
1533                         stチップがある.OpenGuitar = false;\r
1534                         stチップがある.OpenBass = false;\r
1535                         this.bチップがある = stチップがある;\r
1536                         this.strファイル名 = "";\r
1537                         this.strフォルダ名 = "";\r
1538                         this.strファイル名の絶対パス = "";\r
1539                         this.n無限管理WAV = new int[ 36 * 36 ];\r
1540                         this.n無限管理BPM = new int[ 36 * 36 ];\r
1541                         this.n無限管理VOL = new int[ 36 * 36 ];\r
1542                         this.n無限管理PAN = new int[ 36 * 36 ];\r
1543                         this.n無限管理SIZE = new int[ 36 * 36 ];\r
1544                         this.nRESULTIMAGE用優先順位 = new int[ 7 ];\r
1545                         this.nRESULTMOVIE用優先順位 = new int[ 7 ];\r
1546                         this.nRESULTSOUND用優先順位 = new int[ 7 ];\r
1547 \r
1548 #if true        // 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ後\r
1549                         STGDAPARAM[] stgdaparamArray = new STGDAPARAM[] {               // GDA->DTX conversion table\r
1550                                 new STGDAPARAM("TC", 0x03),     new STGDAPARAM("BL", 0x02),     new STGDAPARAM("GS", 0x29),\r
1551                                 new STGDAPARAM("DS", 0x30),     new STGDAPARAM("FI", 0x53),     new STGDAPARAM("HH", 0x11),\r
1552                                 new STGDAPARAM("SD", 0x12),     new STGDAPARAM("BD", 0x13),     new STGDAPARAM("HT", 0x14),\r
1553                                 new STGDAPARAM("LT", 0x15),     new STGDAPARAM("CY", 0x16),     new STGDAPARAM("G1", 0x21),\r
1554                                 new STGDAPARAM("G2", 0x22),     new STGDAPARAM("G3", 0x23),     new STGDAPARAM("G4", 0x24),\r
1555                                 new STGDAPARAM("G5", 0x25),     new STGDAPARAM("G6", 0x26),     new STGDAPARAM("G7", 0x27),\r
1556                                 new STGDAPARAM("GW", 0x28),     new STGDAPARAM("01", 0x61),     new STGDAPARAM("02", 0x62),\r
1557                                 new STGDAPARAM("03", 0x63),     new STGDAPARAM("04", 0x64),     new STGDAPARAM("05", 0x65),\r
1558                                 new STGDAPARAM("06", 0x66),     new STGDAPARAM("07", 0x67),     new STGDAPARAM("08", 0x68),\r
1559                                 new STGDAPARAM("09", 0x69),     new STGDAPARAM("0A", 0x70),     new STGDAPARAM("0B", 0x71),\r
1560                                 new STGDAPARAM("0C", 0x72),     new STGDAPARAM("0D", 0x73),     new STGDAPARAM("0E", 0x74),\r
1561                                 new STGDAPARAM("0F", 0x75),     new STGDAPARAM("10", 0x76),     new STGDAPARAM("11", 0x77),\r
1562                                 new STGDAPARAM("12", 0x78),     new STGDAPARAM("13", 0x79),     new STGDAPARAM("14", 0x80),\r
1563                                 new STGDAPARAM("15", 0x81),     new STGDAPARAM("16", 0x82),     new STGDAPARAM("17", 0x83),\r
1564                                 new STGDAPARAM("18", 0x84),     new STGDAPARAM("19", 0x85),     new STGDAPARAM("1A", 0x86),\r
1565                                 new STGDAPARAM("1B", 0x87),     new STGDAPARAM("1C", 0x88),     new STGDAPARAM("1D", 0x89),\r
1566                                 new STGDAPARAM("1E", 0x90),     new STGDAPARAM("1F", 0x91),     new STGDAPARAM("20", 0x92),\r
1567                                 new STGDAPARAM("B1", 0xA1),     new STGDAPARAM("B2", 0xA2),     new STGDAPARAM("B3", 0xA3),\r
1568                                 new STGDAPARAM("B4", 0xA4),     new STGDAPARAM("B5", 0xA5),     new STGDAPARAM("B6", 0xA6),\r
1569                                 new STGDAPARAM("B7", 0xA7),     new STGDAPARAM("BW", 0xA8),     new STGDAPARAM("G0", 0x20),\r
1570                                 new STGDAPARAM("B0", 0xA0)\r
1571                         };\r
1572 #else   // 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ前\r
1573                         STGDAPARAM[] stgdaparamArray = new STGDAPARAM[62];\r
1574                         STGDAPARAM stgdaparam62 = new STGDAPARAM();\r
1575                         STGDAPARAM stgdaparam = stgdaparam62;\r
1576                         stgdaparam.s = "TC";\r
1577                         stgdaparam.c = 3;\r
1578                         stgdaparamArray[ 0 ] = stgdaparam;\r
1579                         stgdaparam62 = new STGDAPARAM();\r
1580                         STGDAPARAM stgdaparam2 = stgdaparam62;\r
1581                         stgdaparam2.s = "BL";\r
1582                         stgdaparam2.c = 2;\r
1583                         stgdaparamArray[ 1 ] = stgdaparam2;\r
1584                         stgdaparam62 = new STGDAPARAM();\r
1585                         STGDAPARAM stgdaparam3 = stgdaparam62;\r
1586                         stgdaparam3.s = "GS";\r
1587                         stgdaparam3.c = 0x29;\r
1588                         stgdaparamArray[ 2 ] = stgdaparam3;\r
1589                         stgdaparam62 = new STGDAPARAM();\r
1590                         STGDAPARAM stgdaparam4 = stgdaparam62;\r
1591                         stgdaparam4.s = "DS";\r
1592                         stgdaparam4.c = 0x30;\r
1593                         stgdaparamArray[ 3 ] = stgdaparam4;\r
1594                         stgdaparam62 = new STGDAPARAM();\r
1595                         STGDAPARAM stgdaparam5 = stgdaparam62;\r
1596                         stgdaparam5.s = "FI";\r
1597                         stgdaparam5.c = 0x53;\r
1598                         stgdaparamArray[ 4 ] = stgdaparam5;\r
1599                         stgdaparam62 = new STGDAPARAM();\r
1600                         STGDAPARAM stgdaparam6 = stgdaparam62;\r
1601                         stgdaparam6.s = "HH";\r
1602                         stgdaparam6.c = 0x11;\r
1603                         stgdaparamArray[ 5 ] = stgdaparam6;\r
1604                         stgdaparam62 = new STGDAPARAM();\r
1605                         STGDAPARAM stgdaparam7 = stgdaparam62;\r
1606                         stgdaparam7.s = "SD";\r
1607                         stgdaparam7.c = 0x12;\r
1608                         stgdaparamArray[ 6 ] = stgdaparam7;\r
1609                         stgdaparam62 = new STGDAPARAM();\r
1610                         STGDAPARAM stgdaparam8 = stgdaparam62;\r
1611                         stgdaparam8.s = "BD";\r
1612                         stgdaparam8.c = 0x13;\r
1613                         stgdaparamArray[ 7 ] = stgdaparam8;\r
1614                         stgdaparam62 = new STGDAPARAM();\r
1615                         STGDAPARAM stgdaparam9 = stgdaparam62;\r
1616                         stgdaparam9.s = "HT";\r
1617                         stgdaparam9.c = 20;\r
1618                         stgdaparamArray[ 8 ] = stgdaparam9;\r
1619                         stgdaparam62 = new STGDAPARAM();\r
1620                         STGDAPARAM stgdaparam10 = stgdaparam62;\r
1621                         stgdaparam10.s = "LT";\r
1622                         stgdaparam10.c = 0x15;\r
1623                         stgdaparamArray[ 9 ] = stgdaparam10;\r
1624                         stgdaparam62 = new STGDAPARAM();\r
1625                         STGDAPARAM stgdaparam11 = stgdaparam62;\r
1626                         stgdaparam11.s = "CY";\r
1627                         stgdaparam11.c = 0x16;\r
1628                         stgdaparamArray[ 10 ] = stgdaparam11;\r
1629                         stgdaparam62 = new STGDAPARAM();\r
1630                         STGDAPARAM stgdaparam12 = stgdaparam62;\r
1631                         stgdaparam12.s = "G1";\r
1632                         stgdaparam12.c = 0x21;\r
1633                         stgdaparamArray[ 11 ] = stgdaparam12;\r
1634                         stgdaparam62 = new STGDAPARAM();\r
1635                         STGDAPARAM stgdaparam13 = stgdaparam62;\r
1636                         stgdaparam13.s = "G2";\r
1637                         stgdaparam13.c = 0x22;\r
1638                         stgdaparamArray[ 12 ] = stgdaparam13;\r
1639                         stgdaparam62 = new STGDAPARAM();\r
1640                         STGDAPARAM stgdaparam14 = stgdaparam62;\r
1641                         stgdaparam14.s = "G3";\r
1642                         stgdaparam14.c = 0x23;\r
1643                         stgdaparamArray[ 13 ] = stgdaparam14;\r
1644                         stgdaparam62 = new STGDAPARAM();\r
1645                         STGDAPARAM stgdaparam15 = stgdaparam62;\r
1646                         stgdaparam15.s = "G4";\r
1647                         stgdaparam15.c = 0x24;\r
1648                         stgdaparamArray[ 14 ] = stgdaparam15;\r
1649                         stgdaparam62 = new STGDAPARAM();\r
1650                         STGDAPARAM stgdaparam16 = stgdaparam62;\r
1651                         stgdaparam16.s = "G5";\r
1652                         stgdaparam16.c = 0x25;\r
1653                         stgdaparamArray[ 15 ] = stgdaparam16;\r
1654                         stgdaparam62 = new STGDAPARAM();\r
1655                         STGDAPARAM stgdaparam17 = stgdaparam62;\r
1656                         stgdaparam17.s = "G6";\r
1657                         stgdaparam17.c = 0x26;\r
1658                         stgdaparamArray[ 0x10 ] = stgdaparam17;\r
1659                         stgdaparam62 = new STGDAPARAM();\r
1660                         STGDAPARAM stgdaparam18 = stgdaparam62;\r
1661                         stgdaparam18.s = "G7";\r
1662                         stgdaparam18.c = 0x27;\r
1663                         stgdaparamArray[ 0x11 ] = stgdaparam18;\r
1664                         stgdaparam62 = new STGDAPARAM();\r
1665                         STGDAPARAM stgdaparam19 = stgdaparam62;\r
1666                         stgdaparam19.s = "GW";\r
1667                         stgdaparam19.c = 40;\r
1668                         stgdaparamArray[ 0x12 ] = stgdaparam19;\r
1669                         stgdaparam62 = new STGDAPARAM();\r
1670                         STGDAPARAM stgdaparam20 = stgdaparam62;\r
1671                         stgdaparam20.s = "01";\r
1672                         stgdaparam20.c = 0x61;\r
1673                         stgdaparamArray[ 0x13 ] = stgdaparam20;\r
1674                         stgdaparam62 = new STGDAPARAM();\r
1675                         STGDAPARAM stgdaparam21 = stgdaparam62;\r
1676                         stgdaparam21.s = "02";\r
1677                         stgdaparam21.c = 0x62;\r
1678                         stgdaparamArray[ 20 ] = stgdaparam21;\r
1679                         stgdaparam62 = new STGDAPARAM();\r
1680                         STGDAPARAM stgdaparam22 = stgdaparam62;\r
1681                         stgdaparam22.s = "03";\r
1682                         stgdaparam22.c = 0x63;\r
1683                         stgdaparamArray[ 0x15 ] = stgdaparam22;\r
1684                         stgdaparam62 = new STGDAPARAM();\r
1685                         STGDAPARAM stgdaparam23 = stgdaparam62;\r
1686                         stgdaparam23.s = "04";\r
1687                         stgdaparam23.c = 100;\r
1688                         stgdaparamArray[ 0x16 ] = stgdaparam23;\r
1689                         stgdaparam62 = new STGDAPARAM();\r
1690                         STGDAPARAM stgdaparam24 = stgdaparam62;\r
1691                         stgdaparam24.s = "05";\r
1692                         stgdaparam24.c = 0x65;\r
1693                         stgdaparamArray[ 0x17 ] = stgdaparam24;\r
1694                         stgdaparam62 = new STGDAPARAM();\r
1695                         STGDAPARAM stgdaparam25 = stgdaparam62;\r
1696                         stgdaparam25.s = "06";\r
1697                         stgdaparam25.c = 0x66;\r
1698                         stgdaparamArray[ 0x18 ] = stgdaparam25;\r
1699                         stgdaparam62 = new STGDAPARAM();\r
1700                         STGDAPARAM stgdaparam26 = stgdaparam62;\r
1701                         stgdaparam26.s = "07";\r
1702                         stgdaparam26.c = 0x67;\r
1703                         stgdaparamArray[ 0x19 ] = stgdaparam26;\r
1704                         stgdaparam62 = new STGDAPARAM();\r
1705                         STGDAPARAM stgdaparam27 = stgdaparam62;\r
1706                         stgdaparam27.s = "08";\r
1707                         stgdaparam27.c = 0x68;\r
1708                         stgdaparamArray[ 0x1a ] = stgdaparam27;\r
1709                         stgdaparam62 = new STGDAPARAM();\r
1710                         STGDAPARAM stgdaparam28 = stgdaparam62;\r
1711                         stgdaparam28.s = "09";\r
1712                         stgdaparam28.c = 0x69;\r
1713                         stgdaparamArray[ 0x1b ] = stgdaparam28;\r
1714                         stgdaparam62 = new STGDAPARAM();\r
1715                         STGDAPARAM stgdaparam29 = stgdaparam62;\r
1716                         stgdaparam29.s = "0A";\r
1717                         stgdaparam29.c = 0x70;\r
1718                         stgdaparamArray[ 0x1c ] = stgdaparam29;\r
1719                         stgdaparam62 = new STGDAPARAM();\r
1720                         STGDAPARAM stgdaparam30 = stgdaparam62;\r
1721                         stgdaparam30.s = "0B";\r
1722                         stgdaparam30.c = 0x71;\r
1723                         stgdaparamArray[ 0x1d ] = stgdaparam30;\r
1724                         stgdaparam62 = new STGDAPARAM();\r
1725                         STGDAPARAM stgdaparam31 = stgdaparam62;\r
1726                         stgdaparam31.s = "0C";\r
1727                         stgdaparam31.c = 0x72;\r
1728                         stgdaparamArray[ 30 ] = stgdaparam31;\r
1729                         stgdaparam62 = new STGDAPARAM();\r
1730                         STGDAPARAM stgdaparam32 = stgdaparam62;\r
1731                         stgdaparam32.s = "0D";\r
1732                         stgdaparam32.c = 0x73;\r
1733                         stgdaparamArray[ 0x1f ] = stgdaparam32;\r
1734                         stgdaparam62 = new STGDAPARAM();\r
1735                         STGDAPARAM stgdaparam33 = stgdaparam62;\r
1736                         stgdaparam33.s = "0E";\r
1737                         stgdaparam33.c = 0x74;\r
1738                         stgdaparamArray[ 0x20 ] = stgdaparam33;\r
1739                         stgdaparam62 = new STGDAPARAM();\r
1740                         STGDAPARAM stgdaparam34 = stgdaparam62;\r
1741                         stgdaparam34.s = "0F";\r
1742                         stgdaparam34.c = 0x75;\r
1743                         stgdaparamArray[ 0x21 ] = stgdaparam34;\r
1744                         stgdaparam62 = new STGDAPARAM();\r
1745                         STGDAPARAM stgdaparam35 = stgdaparam62;\r
1746                         stgdaparam35.s = "10";\r
1747                         stgdaparam35.c = 0x76;\r
1748                         stgdaparamArray[ 0x22 ] = stgdaparam35;\r
1749                         stgdaparam62 = new STGDAPARAM();\r
1750                         STGDAPARAM stgdaparam36 = stgdaparam62;\r
1751                         stgdaparam36.s = "11";\r
1752                         stgdaparam36.c = 0x77;\r
1753                         stgdaparamArray[ 0x23 ] = stgdaparam36;\r
1754                         stgdaparam62 = new STGDAPARAM();\r
1755                         STGDAPARAM stgdaparam37 = stgdaparam62;\r
1756                         stgdaparam37.s = "12";\r
1757                         stgdaparam37.c = 120;\r
1758                         stgdaparamArray[ 0x24 ] = stgdaparam37;\r
1759                         stgdaparam62 = new STGDAPARAM();\r
1760                         STGDAPARAM stgdaparam38 = stgdaparam62;\r
1761                         stgdaparam38.s = "13";\r
1762                         stgdaparam38.c = 0x79;\r
1763                         stgdaparamArray[ 0x25 ] = stgdaparam38;\r
1764                         stgdaparam62 = new STGDAPARAM();\r
1765                         STGDAPARAM stgdaparam39 = stgdaparam62;\r
1766                         stgdaparam39.s = "14";\r
1767                         stgdaparam39.c = 0x80;\r
1768                         stgdaparamArray[ 0x26 ] = stgdaparam39;\r
1769                         stgdaparam62 = new STGDAPARAM();\r
1770                         STGDAPARAM stgdaparam40 = stgdaparam62;\r
1771                         stgdaparam40.s = "15";\r
1772                         stgdaparam40.c = 0x81;\r
1773                         stgdaparamArray[ 0x27 ] = stgdaparam40;\r
1774                         stgdaparam62 = new STGDAPARAM();\r
1775                         STGDAPARAM stgdaparam41 = stgdaparam62;\r
1776                         stgdaparam41.s = "16";\r
1777                         stgdaparam41.c = 130;\r
1778                         stgdaparamArray[ 40 ] = stgdaparam41;\r
1779                         stgdaparam62 = new STGDAPARAM();\r
1780                         STGDAPARAM stgdaparam42 = stgdaparam62;\r
1781                         stgdaparam42.s = "17";\r
1782                         stgdaparam42.c = 0x83;\r
1783                         stgdaparamArray[ 0x29 ] = stgdaparam42;\r
1784                         stgdaparam62 = new STGDAPARAM();\r
1785                         STGDAPARAM stgdaparam43 = stgdaparam62;\r
1786                         stgdaparam43.s = "18";\r
1787                         stgdaparam43.c = 0x84;\r
1788                         stgdaparamArray[ 0x2a ] = stgdaparam43;\r
1789                         stgdaparam62 = new STGDAPARAM();\r
1790                         STGDAPARAM stgdaparam44 = stgdaparam62;\r
1791                         stgdaparam44.s = "19";\r
1792                         stgdaparam44.c = 0x85;\r
1793                         stgdaparamArray[ 0x2b ] = stgdaparam44;\r
1794                         stgdaparam62 = new STGDAPARAM();\r
1795                         STGDAPARAM stgdaparam45 = stgdaparam62;\r
1796                         stgdaparam45.s = "1A";\r
1797                         stgdaparam45.c = 0x86;\r
1798                         stgdaparamArray[ 0x2c ] = stgdaparam45;\r
1799                         stgdaparam62 = new STGDAPARAM();\r
1800                         STGDAPARAM stgdaparam46 = stgdaparam62;\r
1801                         stgdaparam46.s = "1B";\r
1802                         stgdaparam46.c = 0x87;\r
1803                         stgdaparamArray[ 0x2d ] = stgdaparam46;\r
1804                         stgdaparam62 = new STGDAPARAM();\r
1805                         STGDAPARAM stgdaparam47 = stgdaparam62;\r
1806                         stgdaparam47.s = "1C";\r
1807                         stgdaparam47.c = 0x88;\r
1808                         stgdaparamArray[ 0x2e ] = stgdaparam47;\r
1809                         stgdaparam62 = new STGDAPARAM();\r
1810                         STGDAPARAM stgdaparam48 = stgdaparam62;\r
1811                         stgdaparam48.s = "1D";\r
1812                         stgdaparam48.c = 0x89;\r
1813                         stgdaparamArray[ 0x2f ] = stgdaparam48;\r
1814                         stgdaparam62 = new STGDAPARAM();\r
1815                         STGDAPARAM stgdaparam49 = stgdaparam62;\r
1816                         stgdaparam49.s = "1E";\r
1817                         stgdaparam49.c = 0x90;\r
1818                         stgdaparamArray[ 0x30 ] = stgdaparam49;\r
1819                         stgdaparam62 = new STGDAPARAM();\r
1820                         STGDAPARAM stgdaparam50 = stgdaparam62;\r
1821                         stgdaparam50.s = "1F";\r
1822                         stgdaparam50.c = 0x91;\r
1823                         stgdaparamArray[ 0x31 ] = stgdaparam50;\r
1824                         stgdaparam62 = new STGDAPARAM();\r
1825                         STGDAPARAM stgdaparam51 = stgdaparam62;\r
1826                         stgdaparam51.s = "20";\r
1827                         stgdaparam51.c = 0x92;\r
1828                         stgdaparamArray[ 50 ] = stgdaparam51;\r
1829                         stgdaparam62 = new STGDAPARAM();\r
1830                         STGDAPARAM stgdaparam52 = stgdaparam62;\r
1831                         stgdaparam52.s = "B1";\r
1832                         stgdaparam52.c = 0xa1;\r
1833                         stgdaparamArray[ 0x33 ] = stgdaparam52;\r
1834                         stgdaparam62 = new STGDAPARAM();\r
1835                         STGDAPARAM stgdaparam53 = stgdaparam62;\r
1836                         stgdaparam53.s = "B2";\r
1837                         stgdaparam53.c = 0xa2;\r
1838                         stgdaparamArray[ 0x34 ] = stgdaparam53;\r
1839                         stgdaparam62 = new STGDAPARAM();\r
1840                         STGDAPARAM stgdaparam54 = stgdaparam62;\r
1841                         stgdaparam54.s = "B3";\r
1842                         stgdaparam54.c = 0xa3;\r
1843                         stgdaparamArray[ 0x35 ] = stgdaparam54;\r
1844                         stgdaparam62 = new STGDAPARAM();\r
1845                         STGDAPARAM stgdaparam55 = stgdaparam62;\r
1846                         stgdaparam55.s = "B4";\r
1847                         stgdaparam55.c = 0xa4;\r
1848                         stgdaparamArray[ 0x36 ] = stgdaparam55;\r
1849                         stgdaparam62 = new STGDAPARAM();\r
1850                         STGDAPARAM stgdaparam56 = stgdaparam62;\r
1851                         stgdaparam56.s = "B5";\r
1852                         stgdaparam56.c = 0xa5;\r
1853                         stgdaparamArray[ 0x37 ] = stgdaparam56;\r
1854                         stgdaparam62 = new STGDAPARAM();\r
1855                         STGDAPARAM stgdaparam57 = stgdaparam62;\r
1856                         stgdaparam57.s = "B6";\r
1857                         stgdaparam57.c = 0xa6;\r
1858                         stgdaparamArray[ 0x38 ] = stgdaparam57;\r
1859                         stgdaparam62 = new STGDAPARAM();\r
1860                         STGDAPARAM stgdaparam58 = stgdaparam62;\r
1861                         stgdaparam58.s = "B7";\r
1862                         stgdaparam58.c = 0xa7;\r
1863                         stgdaparamArray[ 0x39 ] = stgdaparam58;\r
1864                         stgdaparam62 = new STGDAPARAM();\r
1865                         STGDAPARAM stgdaparam59 = stgdaparam62;\r
1866                         stgdaparam59.s = "BW";\r
1867                         stgdaparam59.c = 0xa8;\r
1868                         stgdaparamArray[ 0x3a ] = stgdaparam59;\r
1869                         stgdaparam62 = new STGDAPARAM();\r
1870                         STGDAPARAM stgdaparam60 = stgdaparam62;\r
1871                         stgdaparam60.s = "G0";\r
1872                         stgdaparam60.c = 0x20;\r
1873                         stgdaparamArray[ 0x3b ] = stgdaparam60;\r
1874                         STGDAPARAM stgdaparam61 = new STGDAPARAM();\r
1875                         stgdaparam61.s = "B0";\r
1876                         stgdaparam61.c = 160;\r
1877                         stgdaparamArray[ 60 ] = stgdaparam61;\r
1878 #endif\r
1879                         this.stGDAParam = stgdaparamArray;\r
1880                         this.nBGMAdjust = 0;\r
1881 \r
1882 #if TEST_NOTEOFFMODE\r
1883                         this.bHH演奏で直前のHHを消音する = true;\r
1884                         this.bGUITAR演奏で直前のGUITARを消音する = true;\r
1885                         this.bBASS演奏で直前のBASSを消音する = true;\r
1886 #endif\r
1887         \r
1888                 }\r
1889                 public CDTX( string str全入力文字列 )\r
1890                         : this()\r
1891                 {\r
1892                         this.On活性化();\r
1893                         this.t入力・全入力文字列から( str全入力文字列 );\r
1894                 }\r
1895                 public CDTX( string strファイル名, bool bヘッダのみ )\r
1896                         : this()\r
1897                 {\r
1898                         this.On活性化();\r
1899                         this.t入力( strファイル名, bヘッダのみ );\r
1900                 }\r
1901                 public CDTX( string str全入力文字列, double db再生速度, int nBGMAdjust )\r
1902                         : this()\r
1903                 {\r
1904                         this.On活性化();\r
1905                         this.t入力・全入力文字列から( str全入力文字列, db再生速度, nBGMAdjust );\r
1906                 }\r
1907                 public CDTX( string strファイル名, bool bヘッダのみ, double db再生速度, int nBGMAdjust )\r
1908                         : this()\r
1909                 {\r
1910                         this.On活性化();\r
1911                         this.t入力( strファイル名, bヘッダのみ, db再生速度, nBGMAdjust );\r
1912                 }\r
1913 \r
1914 \r
1915                 // メソッド\r
1916 \r
1917                 public int nモニタを考慮した音量( E楽器パート part )\r
1918                 {\r
1919                         CConfigIni configIni = CDTXMania.ConfigIni;\r
1920                         switch( part )\r
1921                         {\r
1922                                 case E楽器パート.DRUMS:\r
1923                                         if( configIni.b演奏音を強調する.Drums )\r
1924                                         {\r
1925                                                 return configIni.n自動再生音量;\r
1926                                         }\r
1927                                         return configIni.n手動再生音量;\r
1928 \r
1929                                 case E楽器パート.GUITAR:\r
1930                                         if( configIni.b演奏音を強調する.Guitar )\r
1931                                         {\r
1932                                                 return configIni.n自動再生音量;\r
1933                                         }\r
1934                                         return configIni.n手動再生音量;\r
1935 \r
1936                                 case E楽器パート.BASS:\r
1937                                         if( configIni.b演奏音を強調する.Bass )\r
1938                                         {\r
1939                                                 return configIni.n自動再生音量;\r
1940                                         }\r
1941                                         return configIni.n手動再生音量;\r
1942                         }\r
1943                         if( ( !configIni.b演奏音を強調する.Drums && !configIni.b演奏音を強調する.Guitar ) && !configIni.b演奏音を強調する.Bass )\r
1944                         {\r
1945                                 return configIni.n手動再生音量;\r
1946                         }\r
1947                         return configIni.n自動再生音量;\r
1948                 }\r
1949                 public void tAVIの読み込み()\r
1950                 {\r
1951                         if( this.listAVI != null )\r
1952                         {\r
1953                                 foreach( CAVI cavi in this.listAVI.Values )\r
1954                                 {\r
1955                                         cavi.OnDeviceCreated();\r
1956                                 }\r
1957                         }\r
1958                         if( !this.bヘッダのみ )\r
1959                         {\r
1960                                 foreach( CChip chip in this.listChip )\r
1961                                 {\r
1962                                         if( chip.nチャンネル番号 == 0x54 )\r
1963                                         {\r
1964                                                 chip.eAVI種別 = EAVI種別.Unknown;\r
1965                                                 chip.rAVI = null;\r
1966                                                 chip.rAVIPan = null;\r
1967                                                 if( this.listAVIPAN.ContainsKey( chip.n整数値 ) )\r
1968                                                 {\r
1969                                                         CAVIPAN cavipan = this.listAVIPAN[ chip.n整数値 ];\r
1970                                                         if( this.listAVI.ContainsKey( cavipan.nAVI番号 ) && ( this.listAVI[ cavipan.nAVI番号 ].avi != null ) )\r
1971                                                         {\r
1972                                                                 chip.eAVI種別 = EAVI種別.AVIPAN;\r
1973                                                                 chip.rAVI = this.listAVI[ cavipan.nAVI番号 ];\r
1974                                                                 chip.rAVIPan = cavipan;\r
1975                                                                 continue;\r
1976                                                         }\r
1977                                                 }\r
1978                                                 if( this.listAVI.ContainsKey( chip.n整数値 ) && ( this.listAVI[ chip.n整数値 ].avi != null ) )\r
1979                                                 {\r
1980                                                         chip.eAVI種別 = EAVI種別.AVI;\r
1981                                                         chip.rAVI = this.listAVI[ chip.n整数値 ];\r
1982                                                 }\r
1983                                         }\r
1984                                 }\r
1985                         }\r
1986                 }\r
1987                 public void tBMP_BMPTEXの読み込み()\r
1988                 {\r
1989                         if( this.listBMP != null )\r
1990                         {\r
1991                                 foreach( CBMP cbmp in this.listBMP.Values )\r
1992                                 {\r
1993                                         cbmp.OnDeviceCreated();\r
1994                                 }\r
1995                         }\r
1996                         if( this.listBMPTEX != null )\r
1997                         {\r
1998                                 foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
1999                                 {\r
2000                                         cbmptex.OnDeviceCreated();\r
2001                                 }\r
2002                         }\r
2003                         if( !this.bヘッダのみ )\r
2004                         {\r
2005                                 foreach( CChip chip in this.listChip )\r
2006                                 {\r
2007                                         if( ( ( ( chip.nチャンネル番号 == 4 ) || ( chip.nチャンネル番号 == 7 ) ) || ( ( chip.nチャンネル番号 >= 0x55 ) && ( chip.nチャンネル番号 <= 0x59 ) ) ) || ( chip.nチャンネル番号 == 0x60 ) )\r
2008                                         {\r
2009                                                 chip.eBGA種別 = EBGA種別.Unknown;\r
2010                                                 chip.rBMP = null;\r
2011                                                 chip.rBMPTEX = null;\r
2012                                                 chip.rBGA = null;\r
2013                                                 chip.rBGAPan = null;\r
2014                                                 if( this.listBGAPAN.ContainsKey( chip.n整数値 ) )\r
2015                                                 {\r
2016                                                         CBGAPAN cbgapan = this.listBGAPAN[ chip.n整数値 ];\r
2017                                                         if( this.listBMPTEX.ContainsKey( cbgapan.nBMP番号 ) && this.listBMPTEX[ cbgapan.nBMP番号 ].bUse )\r
2018                                                         {\r
2019                                                                 chip.eBGA種別 = EBGA種別.BGAPAN;\r
2020                                                                 chip.rBMPTEX = this.listBMPTEX[ cbgapan.nBMP番号 ];\r
2021                                                                 chip.rBGAPan = cbgapan;\r
2022                                                                 continue;\r
2023                                                         }\r
2024                                                         if( this.listBMP.ContainsKey( cbgapan.nBMP番号 ) && this.listBMP[ cbgapan.nBMP番号 ].bUse )\r
2025                                                         {\r
2026                                                                 chip.eBGA種別 = EBGA種別.BGAPAN;\r
2027                                                                 chip.rBMP = this.listBMP[ cbgapan.nBMP番号 ];\r
2028                                                                 chip.rBGAPan = cbgapan;\r
2029                                                                 continue;\r
2030                                                         }\r
2031                                                 }\r
2032                                                 if( this.listBGA.ContainsKey( chip.n整数値 ) )\r
2033                                                 {\r
2034                                                         CBGA cbga = this.listBGA[ chip.n整数値 ];\r
2035                                                         if( this.listBMPTEX.ContainsKey( cbga.nBMP番号 ) && this.listBMPTEX[ cbga.nBMP番号 ].bUse )\r
2036                                                         {\r
2037                                                                 chip.eBGA種別 = EBGA種別.BGA;\r
2038                                                                 chip.rBMPTEX = this.listBMPTEX[ cbga.nBMP番号 ];\r
2039                                                                 chip.rBGA = cbga;\r
2040                                                                 continue;\r
2041                                                         }\r
2042                                                         if( this.listBMP.ContainsKey( cbga.nBMP番号 ) && this.listBMP[ cbga.nBMP番号 ].bUse )\r
2043                                                         {\r
2044                                                                 chip.eBGA種別 = EBGA種別.BGA;\r
2045                                                                 chip.rBMP = this.listBMP[ cbga.nBMP番号 ];\r
2046                                                                 chip.rBGA = cbga;\r
2047                                                                 continue;\r
2048                                                         }\r
2049                                                 }\r
2050                                                 if( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )\r
2051                                                 {\r
2052                                                         chip.eBGA種別 = EBGA種別.BMPTEX;\r
2053                                                         chip.rBMPTEX = this.listBMPTEX[ chip.n整数値 ];\r
2054                                                         continue;\r
2055                                                 }\r
2056                                                 if( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )\r
2057                                                 {\r
2058                                                         chip.eBGA種別 = EBGA種別.BMP;\r
2059                                                         chip.rBMP = this.listBMP[ chip.n整数値 ];\r
2060                                                         continue;\r
2061                                                 }\r
2062                                         }\r
2063                                         if( ( ( ( chip.nチャンネル番号 == 0xc4 ) || ( chip.nチャンネル番号 == 0xc7 ) ) || ( ( chip.nチャンネル番号 >= 0xd5 ) && ( chip.nチャンネル番号 <= 0xd9 ) ) ) || ( chip.nチャンネル番号 == 0xe0 ) )\r
2064                                         {\r
2065                                                 chip.eBGA種別 = EBGA種別.Unknown;\r
2066                                                 chip.rBMP = null;\r
2067                                                 chip.rBMPTEX = null;\r
2068                                                 chip.rBGA = null;\r
2069                                                 chip.rBGAPan = null;\r
2070                                                 if( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )\r
2071                                                 {\r
2072                                                         chip.eBGA種別 = EBGA種別.BMPTEX;\r
2073                                                         chip.rBMPTEX = this.listBMPTEX[ chip.n整数値 ];\r
2074                                                 }\r
2075                                                 else if( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )\r
2076                                                 {\r
2077                                                         chip.eBGA種別 = EBGA種別.BMP;\r
2078                                                         chip.rBMP = this.listBMP[ chip.n整数値 ];\r
2079                                                 }\r
2080                                         }\r
2081                                 }\r
2082                         }\r
2083                 }\r
2084                 public void tWave再生位置自動補正()\r
2085                 {\r
2086                         foreach( CWAV cwav in this.listWAV.Values )\r
2087                         {\r
2088                                 this.tWave再生位置自動補正( cwav );\r
2089                         }\r
2090                 }\r
2091                 public void tWave再生位置自動補正( CWAV wc )\r
2092                 {\r
2093                         for( int i = 0; i < 4; i++ )\r
2094                         {\r
2095                                 if( ( ( wc.rSound[ i ] != null ) && wc.rSound[ i ].b再生中 ) && ( wc.rSound[ i ].n総演奏時間ms >= 5000 ) )\r
2096                                 {\r
2097                                         long nCurrentTime = CDTXMania.Timer.nシステム時刻;\r
2098                                         if( nCurrentTime > wc.n再生開始時刻[ i ] )\r
2099                                         {\r
2100                                                 long nAbsTimeFromStartPlaying = nCurrentTime - wc.n再生開始時刻[ i ];\r
2101                                                 wc.rSound[ i ].t再生位置を変更する( wc.rSound[ i ].t時刻から位置を返す( nAbsTimeFromStartPlaying ) );\r
2102                                         }\r
2103                                 }\r
2104                         }\r
2105                 }\r
2106                 public void tWavの再生停止( int nWaveの内部番号 )\r
2107                 {\r
2108                         if( this.listWAV.ContainsKey( nWaveの内部番号 ) )\r
2109                         {\r
2110                                 CWAV cwav = this.listWAV[ nWaveの内部番号 ];\r
2111                                 for( int i = 0; i < 4; i++ )\r
2112                                 {\r
2113                                         if( cwav.rSound[ i ] != null )\r
2114                                         {\r
2115                                                 cwav.rSound[ i ].t再生を停止する();\r
2116                                         }\r
2117                                 }\r
2118                         }\r
2119                 }\r
2120                 public void tWAVの読み込み()\r
2121                 {\r
2122 //                      Trace.TraceInformation("WAV files={0}", this.listWAV.Count);\r
2123 //                      int count = 0;\r
2124                         foreach (CWAV cwav in this.listWAV.Values)\r
2125                         {\r
2126 //                              string strCount = count.ToString() + " / " + this.listWAV.Count.ToString();\r
2127 //                              Debug.WriteLine(strCount);\r
2128 //                              CDTXMania.act文字コンソール.tPrint(0, 0, C文字コンソール.Eフォント種別.白, strCount);\r
2129 //                              count++;\r
2130 \r
2131                                 string str = string.IsNullOrEmpty(this.PATH_WAV) ? this.strフォルダ名 : this.PATH_WAV;\r
2132                                 str = str + cwav.strファイル名;\r
2133                                 try\r
2134                                 {\r
2135                                         for( int i = 0; i < 4; i++ )\r
2136                                         {\r
2137                                                 try\r
2138                                                 {\r
2139                                                         cwav.rSound[i] = CDTXMania.Sound管理.tサウンドを生成する(str);\r
2140                                                         cwav.rSound[ i ].n音量 = 100;\r
2141                                                         if( ( i == 0 ) && CDTXMania.ConfigIni.bLog作成解放ログ出力 )\r
2142                                                         {\r
2143                                                                 Trace.TraceInformation( "サウンドを作成しました。({3})({0})({1})({2}bytes)", new object[] { cwav.strコメント文, str, cwav.rSound[ i ].nサウンドバッファサイズ, cwav.rSound[ i ].bストリーム再生する ? "Stream" : "OnMemory" } );\r
2144                                                         }\r
2145                                                 }\r
2146                                                 catch\r
2147                                                 {\r
2148                                                         cwav.rSound[ i ] = null;\r
2149                                                         if( i == 0 )\r
2150                                                         {\r
2151                                                                 Trace.TraceError( "サウンドの作成に失敗しました。({0})({1})", new object[] { cwav.strコメント文, str } );\r
2152                                                         }\r
2153                                                 }\r
2154                                                 if( ( cwav.rSound[ i ] != null ) && cwav.rSound[ i ].bストリーム再生する )\r
2155                                                 {\r
2156                                                         break;\r
2157                                                 }\r
2158 //                                              Type t = typeof(CSound);\r
2159 //                                              MethodInfo[] methods = t.GetMethods(\r
2160 //                                                      BindingFlags.Public | BindingFlags.NonPublic |\r
2161 //                                                      BindingFlags.Instance | BindingFlags.Static\r
2162 //                                              );\r
2163 \r
2164 //                                              for (int j = 1; j < 3; j++)\r
2165 //                                              {\r
2166 //                                                      SlimDX.DirectSound.SoundBuffer result;\r
2167 //                                                      CDTXMania.Sound管理.Device.DuplicateSoundBuffer(\r
2168 //                                                              cwav.rSound[0].Buffer,\r
2169 //                                                              out result);\r
2170 //                                                      cwav.rSound[j].Buffer = (SlimDX.DirectSound.SecondarySoundBuffer)result;\r
2171 //                                                      cwav.rSound[j].bストリーム再生する = cwav.rSound[0].bストリーム再生する;\r
2172 //                                                      cwav.rSound[j].bループする\r
2173 //                                                      foreach(MethodInfo m in methods) {\r
2174 //                                                              if (m cwav..rSound[j].\r
2175 //                                              }\r
2176 //                                              cwav.rSound[0].Buffer.\r
2177 \r
2178                                                 cwav.rSound[1] = cwav.rSound[0];                // #24007 2010.11.23 yyagi add: to accelerate loading chip sounds\r
2179                                                 cwav.rSound[2] = cwav.rSound[0];                //\r
2180                                                 cwav.rSound[3] = cwav.rSound[0];                //\r
2181                                                 break;                                                                  //\r
2182                                         }\r
2183                                         continue;\r
2184                                 }\r
2185                                 catch( Exception exception )\r
2186                                 {\r
2187                                         Trace.TraceError( "サウンドの生成に失敗しました。({0})({1})({2})", new object[] { exception.Message, cwav.strコメント文, str } );\r
2188                                         for( int j = 0; j < 4; j++ )\r
2189                                         {\r
2190                                                 cwav.rSound[ j ] = null;\r
2191                                         }\r
2192                                         continue;\r
2193                                 }\r
2194                         }\r
2195                 }\r
2196                 public static string tZZ( int n )\r
2197                 {\r
2198                         if( ( n < 0 ) || ( n >= 36 * 36) )\r
2199                         {\r
2200                                 return "!!";\r
2201                         }\r
2202                         string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";\r
2203                         return new string( new char[] { str[ n / 36 ], str[ n % 36 ] } );\r
2204                 }\r
2205 \r
2206                 /// <summary>\r
2207                 /// ギターのレーンビットパターン\r
2208                 /// </summary>\r
2209                 public enum Eレーンビットパターン\r
2210                 {\r
2211                         OPEN = 0,\r
2212                         xxB = 1,\r
2213                         xGx = 2,\r
2214                         xGB = 3,\r
2215                         Rxx = 4,\r
2216                         RxB = 5,\r
2217                         RGx = 6,\r
2218                         RGB = 7\r
2219                 };\r
2220                 public void tギターとベースのランダム化(E楽器パート part, Eランダムモード eRandom)\r
2221                 {\r
2222                         if( ( ( part == E楽器パート.GUITAR ) || ( part == E楽器パート.BASS ) ) && ( eRandom != Eランダムモード.OFF ) )\r
2223                         {\r
2224                                 int[,] nランダムレーン候補 = new int[ , ] { { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0, 2, 1, 3, 4, 6, 5, 7 }, { 0, 1, 4, 5, 2, 3, 6, 7 }, { 0, 2, 4, 6, 1, 3, 5, 7 }, { 0, 4, 1, 5, 2, 6, 3, 7 }, { 0, 4, 2, 6, 1, 5, 3, 7 } };\r
2225                                 int n小節番号 = -10000;\r
2226                                 int n小節内乱数6通り = 0;\r
2227                                 // int GOTO_END = 0;    // gotoの飛び先のダミーコードで使うダミー変数\r
2228                                 foreach( CChip chip in this.listChip )\r
2229                                 {\r
2230                                         int nRGBレーンビットパターン;\r
2231                                         int n新RGBレーンビットパターン = 0;                          // 「未割り当てのローカル変数」ビルドエラー回避のために0を初期値に設定\r
2232                                         bool flag;\r
2233                                         if( ( chip.n発声位置 / 384 ) != n小節番号 )             // 小節が変化したら\r
2234                                         {\r
2235                                                 n小節番号 = chip.n発声位置 / 384;\r
2236                                                 n小節内乱数6通り = CDTXMania.Random.Next( 6 );\r
2237                                         }\r
2238                                         int nランダム化前チャンネル番号 = chip.nチャンネル番号;\r
2239                                         if(             ( ( ( part != E楽器パート.GUITAR ) || ( 0x20 > nランダム化前チャンネル番号 ) ) || ( nランダム化前チャンネル番号 > 0x27 ) )\r
2240                                                 &&      ( ( ( part != E楽器パート.BASS )   || ( 0xA0 > nランダム化前チャンネル番号 ) ) || ( nランダム化前チャンネル番号 > 0xa7 ) )\r
2241                                         )\r
2242                                         {\r
2243                                                 continue;\r
2244                                         }\r
2245                                         switch( eRandom )\r
2246                                         {\r
2247                                                 case Eランダムモード.RANDOM:             // 1小節単位でレーンのR/G/Bがランダムに入れ替わる\r
2248                                                         chip.nチャンネル番号 = ( nランダム化前チャンネル番号 & 0xF0 ) | nランダムレーン候補[ n小節内乱数6通り, nランダム化前チャンネル番号 & 0x07 ];\r
2249                                                         continue;       // goto Label_02C4;\r
2250 \r
2251                                                 case Eランダムモード.SUPERRANDOM:        // チップごとにR/G/Bがランダムで入れ替わる(レーンの本数までは変わらない)。\r
2252                                                         chip.nチャンネル番号 = ( nランダム化前チャンネル番号 & 0xF0 ) | nランダムレーン候補[ CDTXMania.Random.Next( 6 ), nランダム化前チャンネル番号 & 0x07 ];\r
2253                                                         continue;       // goto Label_02C4;\r
2254 \r
2255                                                 case Eランダムモード.HYPERRANDOM:        // レーンの本数も変わる\r
2256                                                         nRGBレーンビットパターン = nランダム化前チャンネル番号 & 7;\r
2257                                                         // n新RGBレーンビットパターン = (int)Eレーンビットパターン.OPEN;   // この値は結局未使用なので削除\r
2258                                                         flag = ((part == E楽器パート.GUITAR) && this.bチップがある.OpenGuitar) || ((part == E楽器パート.BASS) && this.bチップがある.OpenBass);    // #23546 2010.10.28 yyagi fixed (bチップがある.Bass→bチップがある.OpenBass)\r
2259                                                         if (((nRGBレーンビットパターン != (int)Eレーンビットパターン.xxB) && (nRGBレーンビットパターン != (int)Eレーンビットパターン.xGx)) && (nRGBレーンビットパターン != (int)Eレーンビットパターン.Rxx))         // xxB, xGx, Rxx レーン1本相当\r
2260                                                         {\r
2261                                                                 break;                                                                                                                  // レーン1本相当でなければ、とりあえず先に進む\r
2262                                                         }\r
2263                                                         n新RGBレーンビットパターン = CDTXMania.Random.Next( 6 ) + 1;         // レーン1本相当なら、レーン1本か2本(1~6)に変化して終了\r
2264                                                         goto Label_02B2;\r
2265 \r
2266                                                 default:\r
2267                                                         continue;       // goto Label_02C4;\r
2268                                         }\r
2269                                         switch( nRGBレーンビットパターン )\r
2270                                         {\r
2271                                                 case (int)Eレーンビットパターン.xGB:  // xGB  レーン2本相当\r
2272                                                 case (int)Eレーンビットパターン.RxB:  // RxB\r
2273                                                 case (int)Eレーンビットパターン.RGx:  // RGx\r
2274                                                         n新RGBレーンビットパターン = flag ? CDTXMania.Random.Next( 8 ) : ( CDTXMania.Random.Next( 7 ) + 1 ); // OPENあり譜面ならOPENを含むランダム, OPENなし譜面ならOPENを含まないランダム\r
2275                                                         break;  // goto Label_02B2;\r
2276 \r
2277                                                 default:\r
2278                                                         if( nRGBレーンビットパターン == (int)Eレーンビットパターン.RGB )    // RGB レーン3本相当\r
2279                                                         {\r
2280                                                                 if( flag )      // OPENあり譜面の場合\r
2281                                                                 {\r
2282                                                                         int n乱数パーセント = CDTXMania.Random.Next( 100 );\r
2283                                                                         if( n乱数パーセント < 30 )\r
2284                                                                         {\r
2285                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.OPEN;\r
2286                                                                         }\r
2287                                                                         else if( n乱数パーセント < 60 )\r
2288                                                                         {\r
2289                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RGB;\r
2290                                                                         }\r
2291                                                                         else if( n乱数パーセント < 85 )\r
2292                                                                         {\r
2293                                                                                 switch( CDTXMania.Random.Next( 3 ) )\r
2294                                                                                 {\r
2295                                                                                         case 0:\r
2296                                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xGB;\r
2297                                                                                                 break;  // goto Label_02B2;\r
2298 \r
2299                                                                                         case 1:\r
2300                                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RxB;\r
2301                                                                                                 break;  // goto Label_02B2;\r
2302                                                                                 }\r
2303                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RGx;\r
2304                                                                         }\r
2305                                                                         else    // OPENでない場合\r
2306                                                                         {\r
2307                                                                                 switch( CDTXMania.Random.Next( 3 ) )\r
2308                                                                                 {\r
2309                                                                                         case 0:\r
2310                                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xxB;\r
2311                                                                                                 break;  // goto Label_02B2;\r
2312 \r
2313                                                                                         case 1:\r
2314                                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xGx;\r
2315                                                                                                 break;  // goto Label_02B2;\r
2316                                                                                 }\r
2317                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.Rxx;\r
2318                                                                         }\r
2319                                                                 }\r
2320                                                                 else    // OPENなし譜面の場合\r
2321                                                                 {\r
2322                                                                         int n乱数パーセント = CDTXMania.Random.Next( 100 );\r
2323                                                                         if( n乱数パーセント < 60 )\r
2324                                                                         {\r
2325                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RGB;\r
2326                                                                         }\r
2327                                                                         else if( n乱数パーセント < 85 )\r
2328                                                                         {\r
2329                                                                                 switch( CDTXMania.Random.Next( 3 ) )\r
2330                                                                                 {\r
2331                                                                                         case 0:\r
2332                                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xGB;\r
2333                                                                                                 break;  // goto Label_02B2;\r
2334 \r
2335                                                                                         case 1:\r
2336                                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RxB;\r
2337                                                                                                 break;  // goto Label_02B2;\r
2338                                                                                 }\r
2339                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RGx;\r
2340                                                                         }\r
2341                                                                         else\r
2342                                                                         {\r
2343                                                                                 switch( CDTXMania.Random.Next( 3 ) )\r
2344                                                                                 {\r
2345                                                                                         case 0:\r
2346                                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xxB;\r
2347                                                                                                 break;  // goto Label_02B2;\r
2348 \r
2349                                                                                         case 1:\r
2350                                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xGx;\r
2351                                                                                                 break;  // goto Label_02B2;\r
2352                                                                                 }\r
2353                                                                                 n新RGBレーンビットパターン = (int)Eレーンビットパターン.Rxx;\r
2354                                                                         }\r
2355                                                                 }\r
2356                                                         }\r
2357                                                         break;  // goto Label_02B2;\r
2358                                         }\r
2359                                 Label_02B2:\r
2360                                         chip.nチャンネル番号 = ( nランダム化前チャンネル番号 & 0xF0 ) | n新RGBレーンビットパターン;\r
2361 //                              Label_02C4:\r
2362 //                                      GOTO_END++;             // goto用のダミーコード\r
2363                                 }\r
2364                         }\r
2365                 }\r
2366                 public void tチップの再生( CChip rChip, long n再生開始システム時刻ms, int nLane )\r
2367                 {\r
2368                         this.tチップの再生( rChip, n再生開始システム時刻ms, nLane, CDTXMania.ConfigIni.n自動再生音量, false, false );\r
2369                 }\r
2370                 public void tチップの再生( CChip rChip, long n再生開始システム時刻ms, int nLane, int nVol )\r
2371                 {\r
2372                         this.tチップの再生( rChip, n再生開始システム時刻ms, nLane, nVol, false, false );\r
2373                 }\r
2374                 public void tチップの再生( CChip rChip, long n再生開始システム時刻ms, int nLane, int nVol, bool bMIDIMonitor )\r
2375                 {\r
2376                         this.tチップの再生( rChip, n再生開始システム時刻ms, nLane, nVol, bMIDIMonitor, false );\r
2377                 }\r
2378                 public void tチップの再生( CChip pChip, long n再生開始システム時刻ms, int nLane, int nVol, bool bMIDIMonitor, bool bBad )\r
2379                 {\r
2380                         if( pChip.n整数値・内部番号 >= 0 )\r
2381                         {\r
2382                                 if( ( nLane < 0 ) || ( nLane > 10 ) )\r
2383                                 {\r
2384                                         throw new ArgumentOutOfRangeException();\r
2385                                 }\r
2386                                 if( this.listWAV.ContainsKey( pChip.n整数値・内部番号 ) )\r
2387                                 {\r
2388                                         CWAV wc = this.listWAV[ pChip.n整数値・内部番号 ];\r
2389                                         int index = wc.n現在再生中のサウンド番号 = ( wc.n現在再生中のサウンド番号 + 1 ) % 4;\r
2390                                         if( ( wc.rSound[ 0 ] != null ) && wc.rSound[ 0 ].bストリーム再生する )\r
2391                                         {\r
2392                                                 index = wc.n現在再生中のサウンド番号 = 0;\r
2393                                         }\r
2394                                         CSound sound = wc.rSound[ index ];\r
2395                                         if( sound != null )\r
2396                                         {\r
2397                                                 sound.n音量 = (int) ( ( (double) ( nVol * wc.n音量 ) ) / 100.0 );\r
2398                                                 sound.n位置 = wc.n位置;\r
2399                                                 if( bBad )\r
2400                                                 {\r
2401                                                         sound.db周波数倍率 = ( (float) ( 100 + ( ( ( CDTXMania.Random.Next( 3 ) + 1 ) * 7 ) * ( 1 - ( CDTXMania.Random.Next( 2 ) * 2 ) ) ) ) ) / 100f;\r
2402                                                 }\r
2403                                                 else\r
2404                                                 {\r
2405                                                         sound.db周波数倍率 = 1.0;\r
2406                                                 }\r
2407                                                 sound.db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;\r
2408                                                 sound.t再生を開始する();\r
2409                                         }\r
2410                                         wc.n再生開始時刻[ wc.n現在再生中のサウンド番号 ] = n再生開始システム時刻ms;\r
2411                                         this.tWave再生位置自動補正( wc );\r
2412                                 }\r
2413                         }\r
2414                 }\r
2415                 public void t各自動再生音チップの再生時刻を変更する( int nBGMAdjustの増減値 )\r
2416                 {\r
2417                         this.nBGMAdjust += nBGMAdjustの増減値;\r
2418                         for( int i = 0; i < this.listChip.Count; i++ )\r
2419                         {\r
2420                                 int nChannelNumber = this.listChip[ i ].nチャンネル番号;\r
2421                                 if( ( (\r
2422                                                 ( nChannelNumber == 1 ) ||\r
2423                                                 ( ( 0x61 <= nChannelNumber ) && ( nChannelNumber <= 0x69 ) )\r
2424                                           ) ||\r
2425                                                 ( ( 0x70 <= nChannelNumber ) && ( nChannelNumber <= 0x79 ) )\r
2426                                         ) ||\r
2427                                         ( ( ( 0x80 <= nChannelNumber ) && ( nChannelNumber <= 0x89 ) ) || ( ( 0x90 <= nChannelNumber ) && ( nChannelNumber <= 0x92 ) ) )\r
2428                                   )\r
2429                                 {\r
2430                                         this.listChip[ i ].n発声時刻ms += nBGMAdjustの増減値;\r
2431                                 }\r
2432                         }\r
2433                         foreach( CWAV cwav in this.listWAV.Values )\r
2434                         {\r
2435                                 for( int j = 0; j < 4; j++ )\r
2436                                 {\r
2437                                         if( ( cwav.rSound[ j ] != null ) && cwav.rSound[ j ].b再生中 )\r
2438                                         {\r
2439                                                 cwav.n再生開始時刻[ j ] += nBGMAdjustの増減値;\r
2440                                         }\r
2441                                 }\r
2442                         }\r
2443                 }\r
2444                 public void t全チップの再生一時停止()\r
2445                 {\r
2446                         foreach( CWAV cwav in this.listWAV.Values )\r
2447                         {\r
2448                                 for( int i = 0; i < 4; i++ )\r
2449                                 {\r
2450                                         if( ( cwav.rSound[ i ] != null ) && cwav.rSound[ i ].b再生中 )\r
2451                                         {\r
2452                                                 cwav.rSound[ i ].t再生を一時停止する();\r
2453                                                 cwav.n一時停止時刻[ i ] = CDTXMania.Timer.nシステム時刻;\r
2454                                         }\r
2455                                 }\r
2456                         }\r
2457                 }\r
2458                 public void t全チップの再生再開()\r
2459                 {\r
2460                         foreach( CWAV cwav in this.listWAV.Values )\r
2461                         {\r
2462                                 for( int i = 0; i < 4; i++ )\r
2463                                 {\r
2464                                         if( ( cwav.rSound[ i ] != null ) && cwav.rSound[ i ].b一時停止中 )\r
2465                                         {\r
2466                                                 long num1 = cwav.n一時停止時刻[ i ];\r
2467                                                 long num2 = cwav.n再生開始時刻[ i ];\r
2468                                                 cwav.rSound[ i ].t再生を再開する( cwav.n一時停止時刻[ i ] - cwav.n再生開始時刻[ i ] );\r
2469                                                 cwav.n再生開始時刻[ i ] += CDTXMania.Timer.nシステム時刻 - cwav.n一時停止時刻[ i ];\r
2470                                         }\r
2471                                 }\r
2472                         }\r
2473                 }\r
2474                 public void t全チップの再生停止()\r
2475                 {\r
2476                         foreach( CWAV cwav in this.listWAV.Values )\r
2477                         {\r
2478                                 this.tWavの再生停止( cwav.n内部番号 );\r
2479                         }\r
2480                 }\r
2481                 public void t入力( string strファイル名, bool bヘッダのみ )\r
2482                 {\r
2483                         this.t入力( strファイル名, bヘッダのみ, 1.0, 0 );\r
2484                 }\r
2485                 public void t入力( string strファイル名, bool bヘッダのみ, double db再生速度, int nBGMAdjust )\r
2486                 {\r
2487                         this.bヘッダのみ = bヘッダのみ;\r
2488                         this.strファイル名の絶対パス = Path.GetFullPath( strファイル名 );\r
2489                         this.strファイル名 = Path.GetFileName( this.strファイル名の絶対パス );\r
2490                         this.strフォルダ名 = Path.GetDirectoryName( this.strファイル名の絶対パス ) + @"\";\r
2491                         string str3 = Path.GetExtension( this.strファイル名 ).ToLower();\r
2492                         if( str3 != null )\r
2493                         {\r
2494                                 if( !( str3 == ".dtx" ) )\r
2495                                 {\r
2496                                         if( str3 == ".gda" )\r
2497                                         {\r
2498                                                 this.e種別 = E種別.GDA;\r
2499                                         }\r
2500                                         else if( str3 == ".g2d" )\r
2501                                         {\r
2502                                                 this.e種別 = E種別.G2D;\r
2503                                         }\r
2504                                         else if( str3 == ".bms" )\r
2505                                         {\r
2506                                                 this.e種別 = E種別.BMS;\r
2507                                         }\r
2508                                         else if( str3 == ".bme" )\r
2509                                         {\r
2510                                                 this.e種別 = E種別.BME;\r
2511                                         }\r
2512                                         else if( str3 == ".mid" )\r
2513                                         {\r
2514                                                 this.e種別 = E種別.SMF;\r
2515                                         }\r
2516                                 }\r
2517                                 else\r
2518                                 {\r
2519                                         this.e種別 = E種別.DTX;\r
2520                                 }\r
2521                         }\r
2522                         if( this.e種別 != E種別.SMF )\r
2523                         {\r
2524                                 StreamReader reader = new StreamReader( strファイル名, Encoding.GetEncoding( "shift-jis" ) );\r
2525                                 string str2 = reader.ReadToEnd();\r
2526                                 reader.Close();\r
2527                                 this.t入力・全入力文字列から( str2, db再生速度, nBGMAdjust );\r
2528                         }\r
2529                         else\r
2530                         {\r
2531                                 Trace.TraceWarning( "SMF の演奏は未対応です。(検討中)" );\r
2532                         }\r
2533                 }\r
2534                 public void t入力・全入力文字列から( string str全入力文字列 )\r
2535                 {\r
2536                         this.t入力・全入力文字列から( str全入力文字列, 1.0, 0 );\r
2537                 }\r
2538                 public unsafe void t入力・全入力文字列から( string str全入力文字列, double db再生速度, int nBGMAdjust )\r
2539                 {\r
2540                         if( !string.IsNullOrEmpty( str全入力文字列 ) )\r
2541                         {\r
2542                                 this.db再生速度 = db再生速度;\r
2543                                 str全入力文字列 = str全入力文字列.Replace( Environment.NewLine, "\n" );\r
2544                                 str全入力文字列 = str全入力文字列.Replace( '\t', ' ' );\r
2545                                 str全入力文字列 = str全入力文字列 + "\n";\r
2546                                 for( int j = 0; j < 36 * 36; j++ )\r
2547                                 {\r
2548                                         this.n無限管理WAV[ j ] = -j;\r
2549                                         this.n無限管理BPM[ j ] = -j;\r
2550                                         this.n無限管理VOL[ j ] = -j;\r
2551                                         this.n無限管理PAN[ j ] = -10000 - j;\r
2552                                         this.n無限管理SIZE[ j ] = -j;\r
2553                                 }\r
2554                                 this.n内部番号WAV1to = 1;\r
2555                                 this.n内部番号BPM1to = 1;\r
2556                                 this.bstackIFからENDIFをスキップする = new Stack<bool>();\r
2557                                 this.bstackIFからENDIFをスキップする.Push( false );\r
2558                                 this.n現在の乱数 = 0;\r
2559                                 for( int k = 0; k < 7; k++ )\r
2560                                 {\r
2561                                         this.nRESULTIMAGE用優先順位[ k ] = 0;\r
2562                                         this.nRESULTMOVIE用優先順位[ k ] = 0;\r
2563                                         this.nRESULTSOUND用優先順位[ k ] = 0;\r
2564                                 }\r
2565                                 CharEnumerator ce = str全入力文字列.GetEnumerator();\r
2566                                 if( ce.MoveNext() )\r
2567                                 {\r
2568                                         this.n現在の行数 = 1;\r
2569                                         do\r
2570                                         {\r
2571                                                 if( !this.t入力・空白と改行をスキップする( ref ce ) )\r
2572                                                 {\r
2573                                                         break;\r
2574                                                 }\r
2575                                                 if( ce.Current == '#' )\r
2576                                                 {\r
2577                                                         if( ce.MoveNext() )\r
2578                                                         {\r
2579                                                                 StringBuilder builder = new StringBuilder( 0x20 );\r
2580                                                                 if( this.t入力・コマンド文字列を抜き出す( ref ce, ref builder ) )\r
2581                                                                 {\r
2582                                                                         StringBuilder builder2 = new StringBuilder( 0x400 );\r
2583                                                                         if( this.t入力・パラメータ文字列を抜き出す( ref ce, ref builder2 ) )\r
2584                                                                         {\r
2585                                                                                 StringBuilder builder3 = new StringBuilder( 0x400 );\r
2586                                                                                 if( this.t入力・コメント文字列を抜き出す( ref ce, ref builder3 ) )\r
2587                                                                                 {\r
2588                                                                                         this.t入力・行解析( ref builder, ref builder2, ref builder3 );\r
2589                                                                                         this.n現在の行数++;\r
2590                                                                                         continue;\r
2591                                                                                 }\r
2592                                                                         }\r
2593                                                                 }\r
2594                                                         }\r
2595                                                         break;\r
2596                                                 }\r
2597                                         }\r
2598                                         while( this.t入力・コメントをスキップする( ref ce ) );\r
2599                                         this.n無限管理WAV = null;\r
2600                                         this.n無限管理BPM = null;\r
2601                                         this.n無限管理VOL = null;\r
2602                                         this.n無限管理PAN = null;\r
2603                                         this.n無限管理SIZE = null;\r
2604                                         if( !this.bヘッダのみ )\r
2605                                         {\r
2606                                                 int num26;\r
2607                                                 CBPM cbpm = null;\r
2608                                                 foreach( CBPM cbpm2 in this.listBPM.Values )\r
2609                                                 {\r
2610                                                         if( cbpm2.n表記上の番号 == 0 )\r
2611                                                         {\r
2612                                                                 cbpm = cbpm2;\r
2613                                                                 break;\r
2614                                                         }\r
2615                                                 }\r
2616                                                 if( cbpm == null )\r
2617                                                 {\r
2618                                                         cbpm = new CBPM();\r
2619                                                         cbpm.n内部番号 = this.n内部番号BPM1to++;\r
2620                                                         cbpm.n表記上の番号 = 0;\r
2621                                                         cbpm.dbBPM値 = 120.0;\r
2622                                                         this.listBPM.Add( cbpm.n内部番号, cbpm );\r
2623                                                         CChip item = new CChip();\r
2624                                                         item.n発声位置 = 0;\r
2625                                                         item.nチャンネル番号 = 8;\r
2626                                                         item.n整数値 = 0;\r
2627                                                         item.n整数値・内部番号 = cbpm.n内部番号;\r
2628                                                         this.listChip.Add( item );\r
2629                                                 }\r
2630                                                 else\r
2631                                                 {\r
2632                                                         CChip chip2 = new CChip();\r
2633                                                         chip2.n発声位置 = 0;\r
2634                                                         chip2.nチャンネル番号 = 8;\r
2635                                                         chip2.n整数値 = 0;\r
2636                                                         chip2.n整数値・内部番号 = cbpm.n内部番号;\r
2637                                                         this.listChip.Add( chip2 );\r
2638                                                 }\r
2639                                                 if( this.listBMP.ContainsKey( 0 ) )\r
2640                                                 {\r
2641                                                         CChip chip4 = new CChip();\r
2642                                                         chip4.n発声位置 = 0;\r
2643                                                         chip4.nチャンネル番号 = 4;\r
2644                                                         chip4.n整数値 = 0;\r
2645                                                         chip4.n整数値・内部番号 = 0;\r
2646                                                         CChip chip3 = chip4;\r
2647                                                         this.listChip.Add( chip3 );\r
2648                                                 }\r
2649                                                 foreach( CWAV cwav in this.listWAV.Values )\r
2650                                                 {\r
2651                                                         if( cwav.nチップサイズ < 0 )\r
2652                                                         {\r
2653                                                                 cwav.nチップサイズ = 100;\r
2654                                                         }\r
2655                                                         if( cwav.n位置 <= -10000 )\r
2656                                                         {\r
2657                                                                 cwav.n位置 = 0;\r
2658                                                         }\r
2659                                                         if( cwav.n音量 < 0 )\r
2660                                                         {\r
2661                                                                 cwav.n音量 = 100;\r
2662                                                         }\r
2663                                                 }\r
2664                                                 foreach( CWAV cwav2 in this.listWAV.Values )\r
2665                                                 {\r
2666                                                         foreach( CChip chip5 in this.listChip )\r
2667                                                         {\r
2668                                                                 if( chip5.n整数値・内部番号 == cwav2.n内部番号 )\r
2669                                                                 {\r
2670                                                                         chip5.dbチップサイズ倍率 = ( (double) cwav2.nチップサイズ ) / 100.0;\r
2671                                                                 }\r
2672                                                         }\r
2673                                                 }\r
2674                                                 for( int m = 0xb1; m <= 0xbb; m++ )\r
2675                                                 {\r
2676                                                         foreach( CChip chip6 in this.listChip )\r
2677                                                         {\r
2678                                                                 if( chip6.nチャンネル番号 == m )\r
2679                                                                 {\r
2680                                                                         CChip chip7 = new CChip();\r
2681                                                                         chip7.n発声位置 = 0;\r
2682                                                                         chip7.nチャンネル番号 = chip6.nチャンネル番号;\r
2683                                                                         chip7.n整数値 = chip6.n整数値;\r
2684                                                                         chip7.n整数値・内部番号 = chip6.n整数値・内部番号;\r
2685                                                                         this.listChip.Add( chip7 );\r
2686                                                                         break;\r
2687                                                                 }\r
2688                                                         }\r
2689                                                 }\r
2690                                                 if( this.listChip.Count > 0 )\r
2691                                                 {\r
2692                                                         this.listChip.Sort();\r
2693                                                         double num4 = 1.0;\r
2694                                                         int num5 = ( this.listChip[ this.listChip.Count - 1 ].n発声位置 + 384 ) - ( this.listChip[ this.listChip.Count - 1 ].n発声位置 % 384 );\r
2695                                                         for( int num6 = 0; num6 <= num5; num6 += 384 )\r
2696                                                         {\r
2697                                                                 CChip chip8 = new CChip();\r
2698                                                                 chip8.n発声位置 = num6;\r
2699                                                                 chip8.nチャンネル番号 = 80;\r
2700                                                                 chip8.n整数値 = 0x50f;\r
2701                                                                 this.listChip.Add( chip8 );\r
2702                                                         }\r
2703                                                         this.listChip.Sort();\r
2704                                                         int num7 = 0;\r
2705                                                         int num8 = 0;\r
2706                                                         for( int num9 = 0; num9 < num5; num9 += 384 )\r
2707                                                         {\r
2708                                                                 int num10 = 0;\r
2709                                                                 while( ( num8 < this.listChip.Count ) && ( this.listChip[ num8 ].n発声位置 < ( num9 + 384 ) ) )\r
2710                                                                 {\r
2711                                                                         if( this.listChip[ num8 ].nチャンネル番号 == 0xc1 )\r
2712                                                                         {\r
2713                                                                                 num10 = this.listChip[ num8 ].n発声位置 - num9;\r
2714                                                                         }\r
2715                                                                         num8++;\r
2716                                                                 }\r
2717                                                                 if( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) )\r
2718                                                                 {\r
2719                                                                         num4 = 1.0;\r
2720                                                                 }\r
2721                                                                 while( ( num7 < this.listChip.Count ) && ( this.listChip[ num7 ].n発声位置 <= num9 ) )\r
2722                                                                 {\r
2723                                                                         if( this.listChip[ num7 ].nチャンネル番号 == 2 )\r
2724                                                                         {\r
2725                                                                                 num4 = this.listChip[ num7 ].db実数値;\r
2726                                                                         }\r
2727                                                                         num7++;\r
2728                                                                 }\r
2729                                                                 for( int num11 = 0; num11 < 100; num11++ )\r
2730                                                                 {\r
2731                                                                         int num12 = (int) ( ( (double) ( 384 * num11 ) ) / ( 4.0 * num4 ) );\r
2732                                                                         if( ( num12 + num10 ) >= 384 )\r
2733                                                                         {\r
2734                                                                                 break;\r
2735                                                                         }\r
2736                                                                         if( ( ( num12 + num10 ) % 384 ) != 0 )\r
2737                                                                         {\r
2738                                                                                 CChip chip9 = new CChip();\r
2739                                                                                 chip9.n発声位置 = ( num9 + num12 ) + num10;\r
2740                                                                                 chip9.nチャンネル番号 = 0x51;\r
2741                                                                                 chip9.n整数値 = 36 * 36 - 1;\r
2742                                                                                 this.listChip.Add( chip9 );\r
2743                                                                         }\r
2744                                                                 }\r
2745                                                         }\r
2746                                                         this.listChip.Sort();\r
2747                                                 }\r
2748                                                 bool flag = true;\r
2749                                                 Predicate<CChip> match = null;\r
2750                                                 for( int i = 0; i < this.listChip.Count; i++ )\r
2751                                                 {\r
2752                                                         int startIndex = i;\r
2753                                                         while( true )\r
2754                                                         {\r
2755                                                                 if( match == null )\r
2756                                                                 {\r
2757                                                                         match = delegate( CChip c )\r
2758                                                                         {\r
2759                                                                                 return ( c.nチャンネル番号 == 0xc2 ) && ( c.n発声位置 == this.listChip[ i ].n発声位置 );\r
2760                                                                         };\r
2761                                                                 }\r
2762                                                                 startIndex = this.listChip.FindIndex( startIndex, match );\r
2763                                                                 if( startIndex == -1 )\r
2764                                                                 {\r
2765                                                                         break;\r
2766                                                                 }\r
2767                                                                 if( this.listChip[ startIndex ].n整数値 == 1 )\r
2768                                                                 {\r
2769                                                                         flag = true;\r
2770                                                                 }\r
2771                                                                 if( this.listChip[ startIndex ].n整数値 == 2 )\r
2772                                                                 {\r
2773                                                                         flag = false;\r
2774                                                                 }\r
2775                                                                 startIndex++;\r
2776                                                         }\r
2777                                                         if( ( ( this.listChip[ i ].nチャンネル番号 == 80 ) || ( this.listChip[ i ].nチャンネル番号 == 0x51 ) ) && ( this.listChip[ i ].n整数値 == 0x50f ) )\r
2778                                                         {\r
2779                                                                 this.listChip[ i ].b可視 = flag;\r
2780                                                         }\r
2781                                                 }\r
2782                                                 double bpm = 120.0;\r
2783                                                 double num15 = 1.0;\r
2784                                                 int num16 = 0;\r
2785                                                 int num17 = 0;\r
2786                                                 int num18 = 0;\r
2787                                                 foreach( CChip chip10 in this.listChip )\r
2788                                                 {\r
2789                                                         chip10.n発声時刻ms = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
2790                                                         if( ( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) ) && ( ( num15 != 1.0 ) && ( ( chip10.n発声位置 / 384) != num18 ) ) )\r
2791                                                         {\r
2792                                                                 num16 = chip10.n発声位置;\r
2793                                                                 num17 = chip10.n発声時刻ms;\r
2794                                                                 num15 = 1.0;\r
2795                                                         }\r
2796                                                         num18 = chip10.n発声位置 / 384;\r
2797                                                         num26 = chip10.nチャンネル番号;\r
2798                                                         switch( num26 )\r
2799                                                         {\r
2800                                                                 case 0x02:\r
2801                                                                         {\r
2802                                                                                 num16 = chip10.n発声位置;\r
2803                                                                                 num17 = chip10.n発声時刻ms;\r
2804                                                                                 num15 = chip10.db実数値;\r
2805                                                                                 continue;\r
2806                                                                         }\r
2807                                                                 case 0x03:\r
2808                                                                         {\r
2809                                                                                 num16 = chip10.n発声位置;\r
2810                                                                                 num17 = chip10.n発声時刻ms;\r
2811                                                                                 bpm = this.BASEBPM + chip10.n整数値;\r
2812                                                                                 continue;\r
2813                                                                         }\r
2814                                                                 case 0x04:\r
2815                                                                 case 0x07:\r
2816                                                                 case 0x55:\r
2817                                                                 case 0x56:\r
2818                                                                 case 0x57:\r
2819                                                                 case 0x58:\r
2820                                                                 case 0x59:\r
2821                                                                 case 0x60:\r
2822                                                                         break;\r
2823 \r
2824                                                                 case 0x05:\r
2825                                                                 case 0x06:\r
2826                                                                 case 0x5A:\r
2827                                                                 case 0x5b:\r
2828                                                                 case 0x5c:\r
2829                                                                 case 0x5d:\r
2830                                                                 case 0x5e:\r
2831                                                                 case 0x5f:\r
2832                                                                         {\r
2833                                                                                 continue;\r
2834                                                                         }\r
2835                                                                 case 8:\r
2836                                                                         {\r
2837                                                                                 num16 = chip10.n発声位置;\r
2838                                                                                 num17 = chip10.n発声時刻ms;\r
2839                                                                                 if( this.listBPM.ContainsKey( chip10.n整数値・内部番号 ) )\r
2840                                                                                 {\r
2841                                                                                         bpm = ( ( this.listBPM[ chip10.n整数値・内部番号 ].n表記上の番号 == 0 ) ? 0.0 : this.BASEBPM ) + this.listBPM[ chip10.n整数値・内部番号 ].dbBPM値;\r
2842                                                                                 }\r
2843                                                                                 continue;\r
2844                                                                         }\r
2845                                                                 case 0x54:\r
2846                                                                         {\r
2847                                                                                 if( this.listAVIPAN.ContainsKey( chip10.n整数値 ) )\r
2848                                                                                 {\r
2849                                                                                         int num21 = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
2850                                                                                         int num22 = num17 + ( (int) ( ( ( 0x271 * ( ( chip10.n発声位置 + this.listAVIPAN[ chip10.n整数値 ].n移動時間ct ) - num16 ) ) * num15 ) / bpm ) );\r
2851                                                                                         chip10.n総移動時間 = num22 - num21;\r
2852                                                                                 }\r
2853                                                                                 continue;\r
2854                                                                         }\r
2855                                                                 default:\r
2856                                                                         {\r
2857                                                                                 continue;\r
2858                                                                         }\r
2859                                                         }\r
2860                                                         if( this.listBGAPAN.ContainsKey( chip10.n整数値 ) )\r
2861                                                         {\r
2862                                                                 int num19 = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );\r
2863                                                                 int num20 = num17 + ( (int) ( ( ( 0x271 * ( ( chip10.n発声位置 + this.listBGAPAN[ chip10.n整数値 ].n移動時間ct ) - num16 ) ) * num15 ) / bpm ) );\r
2864                                                                 chip10.n総移動時間 = num20 - num19;\r
2865                                                         }\r
2866                                                 }\r
2867                                                 if( this.db再生速度 > 0.0 )\r
2868                                                 {\r
2869                                                         foreach( CChip chip11 in this.listChip )\r
2870                                                         {\r
2871                                                                 chip11.n発声時刻ms = (int) ( ( (double) chip11.n発声時刻ms ) / this.db再生速度 );\r
2872                                                         }\r
2873                                                 }\r
2874                                                 this.nBGMAdjust = 0;\r
2875                                                 this.t各自動再生音チップの再生時刻を変更する( nBGMAdjust );\r
2876                                                 for( int n = 0; n < 12; n++ )\r
2877                                                 {\r
2878                                                         this.n可視チップ数[ n ] = 0;\r
2879                                                 }\r
2880                                                 foreach( CChip chip12 in this.listChip )\r
2881                                                 {\r
2882                                                         int num24 = chip12.nチャンネル番号;\r
2883                                                         if( ( 0x11 <= num24 ) && ( num24 <= 0x1a ) )\r
2884                                                         {\r
2885                                                                 this.n可視チップ数[ num24 - 0x11 ]++;\r
2886                                                         }\r
2887                                                         if( ( 0x20 <= num24 ) && ( num24 <= 0x27 ) )\r
2888                                                         {\r
2889                                                                 this.n可視チップ数.Guitar++;\r
2890                                                         }\r
2891                                                         if( ( 0xA0 <= num24 ) && ( num24 <= 0xa7 ) )\r
2892                                                         {\r
2893                                                                 this.n可視チップ数.Bass++;\r
2894                                                         }\r
2895                                                 }\r
2896                                                 foreach( CChip chip13 in this.listChip )\r
2897                                                 {\r
2898                                                         if( ( chip13.bWAVを使うチャンネルである && this.listWAV.ContainsKey( chip13.n整数値・内部番号 ) ) && !this.listWAV[ chip13.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Contains( chip13.nチャンネル番号 ) )\r
2899                                                         {\r
2900                                                                 this.listWAV[ chip13.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Add( chip13.nチャンネル番号 );\r
2901                                                         }\r
2902                                                 }\r
2903                                                 byte[] buffer = null;\r
2904                                                 try\r
2905                                                 {\r
2906                                                         FileStream stream = new FileStream( this.strファイル名の絶対パス, FileMode.Open, FileAccess.Read );\r
2907                                                         buffer = new byte[ stream.Length ];\r
2908                                                         stream.Read( buffer, 0, (int) stream.Length );\r
2909                                                         stream.Close();\r
2910                                                 }\r
2911                                                 catch( Exception exception )\r
2912                                                 {\r
2913                                                         Trace.TraceError( exception.Message );\r
2914                                                         Trace.TraceError( "DTXのハッシュの計算に失敗しました。({0})", new object[] { this.strファイル名の絶対パス } );\r
2915                                                 }\r
2916                                                 if( buffer != null )\r
2917                                                 {\r
2918                                                         byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash( buffer );\r
2919                                                         StringBuilder builder4 = new StringBuilder();\r
2920                                                         foreach( byte num25 in buffer2 )\r
2921                                                         {\r
2922                                                                 builder4.Append( num25.ToString( "x2" ) );\r
2923                                                         }\r
2924                                                         this.strハッシュofDTXファイル = builder4.ToString();\r
2925                                                 }\r
2926                                                 else\r
2927                                                 {\r
2928                                                         this.strハッシュofDTXファイル = "00000000000000000000000000000000";\r
2929                                                 }\r
2930                                                 if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )\r
2931                                                 {\r
2932                                                         foreach( CWAV cwav3 in this.listWAV.Values )\r
2933                                                         {\r
2934                                                                 Trace.TraceInformation( cwav3.ToString() );\r
2935                                                         }\r
2936                                                         foreach( CAVI cavi in this.listAVI.Values )\r
2937                                                         {\r
2938                                                                 Trace.TraceInformation( cavi.ToString() );\r
2939                                                         }\r
2940                                                         foreach( CAVIPAN cavipan in this.listAVIPAN.Values )\r
2941                                                         {\r
2942                                                                 Trace.TraceInformation( cavipan.ToString() );\r
2943                                                         }\r
2944                                                         foreach( CBGA cbga in this.listBGA.Values )\r
2945                                                         {\r
2946                                                                 Trace.TraceInformation( cbga.ToString() );\r
2947                                                         }\r
2948                                                         foreach( CBGAPAN cbgapan in this.listBGAPAN.Values )\r
2949                                                         {\r
2950                                                                 Trace.TraceInformation( cbgapan.ToString() );\r
2951                                                         }\r
2952                                                         foreach( CBMP cbmp in this.listBMP.Values )\r
2953                                                         {\r
2954                                                                 Trace.TraceInformation( cbmp.ToString() );\r
2955                                                         }\r
2956                                                         foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
2957                                                         {\r
2958                                                                 Trace.TraceInformation( cbmptex.ToString() );\r
2959                                                         }\r
2960                                                         foreach( CBPM cbpm3 in this.listBPM.Values )\r
2961                                                         {\r
2962                                                                 Trace.TraceInformation( cbpm3.ToString() );\r
2963                                                         }\r
2964                                                         foreach( CChip chip14 in this.listChip )\r
2965                                                         {\r
2966                                                                 Trace.TraceInformation( chip14.ToString() );\r
2967                                                         }\r
2968                                                 }\r
2969                                         }\r
2970                                 }\r
2971                         }\r
2972                 }\r
2973 \r
2974                 /// <summary>\r
2975                 /// Swap infos between Guitar and Bass\r
2976                 /// </summary>\r
2977                 public void SwapGuitarBassInfos()                                               // #24063 2011.1.24 yyagi ギターとベースの譜面情報入替\r
2978                 {\r
2979                         for (int i = this.listChip.Count - 1; i >= 0; i--) {\r
2980                                 if (listChip[i].e楽器パート == E楽器パート.BASS) {\r
2981                                         listChip[i].e楽器パート = E楽器パート.GUITAR;\r
2982                                         listChip[i].nチャンネル番号 -= ( 0xA0 - 0x20 );\r
2983                                 }\r
2984                                 else if ( listChip[i].e楽器パート == E楽器パート.GUITAR )\r
2985                                 {\r
2986                                         listChip[i].e楽器パート = E楽器パート.BASS;\r
2987                                         listChip[i].nチャンネル番号 += ( 0xA0 - 0x20 );\r
2988                                 }\r
2989                         }\r
2990 \r
2991                         int t = this.LEVEL.Bass;\r
2992                         this.LEVEL.Bass = this.LEVEL.Guitar;\r
2993                         this.LEVEL.Guitar = t;\r
2994 \r
2995                         t = this.n可視チップ数.Bass;\r
2996                         this.n可視チップ数.Bass = this.n可視チップ数.Guitar;\r
2997                         this.n可視チップ数.Guitar = t;\r
2998 \r
2999                         bool ts = this.bチップがある.Bass;\r
3000                         this.bチップがある.Bass = this.bチップがある.Guitar;\r
3001                         this.bチップがある.Guitar = ts;\r
3002 \r
3003                 }\r
3004 \r
3005                 // CActivity 実装\r
3006 \r
3007                 public override void On活性化()\r
3008                 {\r
3009                         this.listWAV = new Dictionary<int, CWAV>();\r
3010                         this.listBMP = new Dictionary<int, CBMP>();\r
3011                         this.listBMPTEX = new Dictionary<int, CBMPTEX>();\r
3012                         this.listBPM = new Dictionary<int, CBPM>();\r
3013                         this.listBGAPAN = new Dictionary<int, CBGAPAN>();\r
3014                         this.listBGA = new Dictionary<int, CBGA>();\r
3015                         this.listAVIPAN = new Dictionary<int, CAVIPAN>();\r
3016                         this.listAVI = new Dictionary<int, CAVI>();\r
3017                         this.listChip = new List<CChip>();\r
3018                         base.On活性化();\r
3019                 }\r
3020                 public override void On非活性化()\r
3021                 {\r
3022                         if( this.listWAV != null )\r
3023                         {\r
3024                                 foreach( CWAV cwav in this.listWAV.Values )\r
3025                                 {\r
3026                                         cwav.Dispose();\r
3027                                 }\r
3028                                 this.listWAV = null;\r
3029                         }\r
3030                         if( this.listBMP != null )\r
3031                         {\r
3032                                 foreach( CBMP cbmp in this.listBMP.Values )\r
3033                                 {\r
3034                                         cbmp.Dispose();\r
3035                                 }\r
3036                                 this.listBMP = null;\r
3037                         }\r
3038                         if( this.listBMPTEX != null )\r
3039                         {\r
3040                                 foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
3041                                 {\r
3042                                         cbmptex.Dispose();\r
3043                                 }\r
3044                                 this.listBMPTEX = null;\r
3045                         }\r
3046                         if( this.listAVI != null )\r
3047                         {\r
3048                                 foreach( CAVI cavi in this.listAVI.Values )\r
3049                                 {\r
3050                                         cavi.Dispose();\r
3051                                 }\r
3052                                 this.listAVI = null;\r
3053                         }\r
3054                         if( this.listBPM != null )\r
3055                         {\r
3056                                 this.listBPM.Clear();\r
3057                                 this.listBPM = null;\r
3058                         }\r
3059                         if( this.listBGAPAN != null )\r
3060                         {\r
3061                                 this.listBGAPAN.Clear();\r
3062                                 this.listBGAPAN = null;\r
3063                         }\r
3064                         if( this.listBGA != null )\r
3065                         {\r
3066                                 this.listBGA.Clear();\r
3067                                 this.listBGA = null;\r
3068                         }\r
3069                         if( this.listAVIPAN != null )\r
3070                         {\r
3071                                 this.listAVIPAN.Clear();\r
3072                                 this.listAVIPAN = null;\r
3073                         }\r
3074                         if( this.listChip != null )\r
3075                         {\r
3076                                 this.listChip.Clear();\r
3077                         }\r
3078                         base.On非活性化();\r
3079                 }\r
3080                 public override void OnManagedリソースの作成()\r
3081                 {\r
3082                         if( !base.b活性化してない )\r
3083                         {\r
3084                                 this.tBMP_BMPTEXの読み込み();\r
3085                                 this.tAVIの読み込み();\r
3086                                 base.OnManagedリソースの作成();\r
3087                         }\r
3088                 }\r
3089                 public override void OnManagedリソースの解放()\r
3090                 {\r
3091                         if( !base.b活性化してない )\r
3092                         {\r
3093                                 if( this.listBMP != null )\r
3094                                 {\r
3095                                         foreach( CBMP cbmp in this.listBMP.Values )\r
3096                                         {\r
3097                                                 cbmp.Dispose();\r
3098                                         }\r
3099                                 }\r
3100                                 if( this.listBMPTEX != null )\r
3101                                 {\r
3102                                         foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )\r
3103                                         {\r
3104                                                 cbmptex.Dispose();\r
3105                                         }\r
3106                                 }\r
3107                                 if( this.listAVI != null )\r
3108                                 {\r
3109                                         foreach( CAVI cavi in this.listAVI.Values )\r
3110                                         {\r
3111                                                 cavi.Dispose();\r
3112                                         }\r
3113                                 }\r
3114                                 base.OnManagedリソースの解放();\r
3115                         }\r
3116                 }\r
3117 \r
3118 \r
3119                 // その他\r
3120                 \r
3121                 #region [ private ]\r
3122                 //-----------------\r
3123                 [StructLayout( LayoutKind.Sequential )]\r
3124                 private struct STGDAPARAM                               // GDAチャンネル番号に対応するDTXチャンネル番号\r
3125                 {\r
3126                         public string s;                                        // GDAチャンネル番号\r
3127                         public int c;                                           // DTXチャンネル番号\r
3128 \r
3129                         public STGDAPARAM(string _s, int _c) {          // 2011.1.1 yyagi 構造体のコンストラクタ追加(初期化簡易化のため)\r
3130                                 s = _s;\r
3131                                 c = _c;\r
3132                         }\r
3133                 }\r
3134 \r
3135                 private readonly STGDAPARAM[] stGDAParam;\r
3136                 private bool bヘッダのみ;\r
3137                 private Stack<bool> bstackIFからENDIFをスキップする;\r
3138         \r
3139                 private int n現在の行数;\r
3140                 private int n現在の乱数;\r
3141 \r
3142                 private int n内部番号BPM1to;\r
3143                 private int n内部番号WAV1to;\r
3144                 private int[] n無限管理BPM;\r
3145                 private int[] n無限管理PAN;\r
3146                 private int[] n無限管理SIZE;\r
3147                 private int[] n無限管理VOL;\r
3148                 private int[] n無限管理WAV;\r
3149                 private int[] nRESULTIMAGE用優先順位;\r
3150                 private int[] nRESULTMOVIE用優先順位;\r
3151                 private int[] nRESULTSOUND用優先順位;\r
3152 \r
3153                 private bool t入力・コマンド文字列を抜き出す( ref CharEnumerator ce, ref StringBuilder sb文字列 )\r
3154                 {\r
3155                         if( this.t入力・空白をスキップする( ref ce ) )\r
3156                         {\r
3157                                 while( ( ( ce.Current != ':' ) && ( ce.Current != ' ' ) ) && ( ( ce.Current != ';' ) && ( ce.Current != '\n' ) ) )\r
3158                                 {\r
3159                                         sb文字列.Append( ce.Current );\r
3160                                         if( !ce.MoveNext() )\r
3161                                         {\r
3162                                                 return false;\r
3163                                         }\r
3164                                 }\r
3165                                 if( ce.Current == ':' )\r
3166                                 {\r
3167                                         if( !ce.MoveNext() )\r
3168                                         {\r
3169                                                 return false;\r
3170                                         }\r
3171                                         if( !this.t入力・空白をスキップする( ref ce ) )\r
3172                                         {\r
3173                                                 return false;\r
3174                                         }\r
3175                                 }\r
3176                                 return true;\r
3177                         }\r
3178                         return false;\r
3179                 }\r
3180                 private bool t入力・コメントをスキップする( ref CharEnumerator ce )\r
3181                 {\r
3182                         while( ce.Current != '\n' )\r
3183                         {\r
3184                                 if( !ce.MoveNext() )\r
3185                                 {\r
3186                                         return false;\r
3187                                 }\r
3188                         }\r
3189                         return ce.MoveNext();\r
3190                 }\r
3191                 private bool t入力・コメント文字列を抜き出す( ref CharEnumerator ce, ref StringBuilder sb文字列 )\r
3192                 {\r
3193                         if( ce.Current != ';' )\r
3194                         {\r
3195                                 return true;\r
3196                         }\r
3197                         if( ce.MoveNext() )\r
3198                         {\r
3199                                 while( ce.Current != '\n' )\r
3200                                 {\r
3201                                         sb文字列.Append( ce.Current );\r
3202                                         if( !ce.MoveNext() )\r
3203                                         {\r
3204                                                 return false;\r
3205                                         }\r
3206                                 }\r
3207                                 return true;\r
3208                         }\r
3209                         return false;\r
3210                 }\r
3211                 private void t入力・パラメータ食い込みチェック( string strコマンド名, ref string strコマンド, ref string strパラメータ )\r
3212                 {\r
3213                         if( ( strコマンド.Length > strコマンド名.Length ) && strコマンド.StartsWith( strコマンド名, StringComparison.OrdinalIgnoreCase ) )\r
3214                         {\r
3215                                 strパラメータ = strコマンド.Substring( strコマンド名.Length ).Trim();\r
3216                                 strコマンド = strコマンド.Substring( 0, strコマンド名.Length );\r
3217                         }\r
3218                 }\r
3219                 private bool t入力・パラメータ文字列を抜き出す( ref CharEnumerator ce, ref StringBuilder sb文字列 )\r
3220                 {\r
3221                         if( this.t入力・空白をスキップする( ref ce ) )\r
3222                         {\r
3223                                 while( ( ce.Current != '\n' ) && ( ce.Current != ';' ) )\r
3224                                 {\r
3225                                         sb文字列.Append( ce.Current );\r
3226                                         if( !ce.MoveNext() )\r
3227                                         {\r
3228                                                 return false;\r
3229                                         }\r
3230                                 }\r
3231                                 return true;\r
3232                         }\r
3233                         return false;\r
3234                 }\r
3235                 private bool t入力・空白と改行をスキップする( ref CharEnumerator ce )\r
3236                 {\r
3237                         while( ( ce.Current == ' ' ) || ( ce.Current == '\n' ) )\r
3238                         {\r
3239                                 if( ce.Current == '\n' )\r
3240                                 {\r
3241                                         this.n現在の行数++;\r
3242                                 }\r
3243                                 if( !ce.MoveNext() )\r
3244                                 {\r
3245                                         return false;\r
3246                                 }\r
3247                         }\r
3248                         return true;\r
3249                 }\r
3250                 private bool t入力・空白をスキップする( ref CharEnumerator ce )\r
3251                 {\r
3252                         while( ce.Current == ' ' )\r
3253                         {\r
3254                                 if( !ce.MoveNext() )\r
3255                                 {\r
3256                                         return false;\r
3257                                 }\r
3258                         }\r
3259                         return true;\r
3260                 }\r
3261                 private void t入力・行解析( ref StringBuilder sbコマンド, ref StringBuilder sbパラメータ, ref StringBuilder sbコメント )\r
3262                 {\r
3263                         string str = sbコマンド.ToString();\r
3264                         string str2 = sbパラメータ.ToString().Trim();\r
3265                         string str3 = sbコメント.ToString();\r
3266                         if( str.StartsWith( "IF", StringComparison.OrdinalIgnoreCase ) )\r
3267                         {\r
3268                                 this.t入力・パラメータ食い込みチェック( "IF", ref str, ref str2 );\r
3269                                 if( this.bstackIFからENDIFをスキップする.Count == 0xff )\r
3270                                 {\r
3271                                         Trace.TraceWarning( "#IF の入れ子の数が 255 を超えました。この #IF を無視します。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3272                                 }\r
3273                                 else if( this.bstackIFからENDIFをスキップする.Peek() )\r
3274                                 {\r
3275                                         this.bstackIFからENDIFをスキップする.Push( true );\r
3276                                 }\r
3277                                 else\r
3278                                 {\r
3279                                         int result = 0;\r
3280                                         if( !int.TryParse( str2, out result ) )\r
3281                                         {\r
3282                                                 result = 1;\r
3283                                         }\r
3284                                         this.bstackIFからENDIFをスキップする.Push( result != this.n現在の乱数 );\r
3285                                 }\r
3286                         }\r
3287                         else if( str.StartsWith( "ENDIF", StringComparison.OrdinalIgnoreCase ) )\r
3288                         {\r
3289                                 this.t入力・パラメータ食い込みチェック( "ENDIF", ref str, ref str2 );\r
3290                                 if( this.bstackIFからENDIFをスキップする.Count > 1 )\r
3291                                 {\r
3292                                         this.bstackIFからENDIFをスキップする.Pop();\r
3293                                 }\r
3294                                 else\r
3295                                 {\r
3296                                         Trace.TraceWarning( "#ENDIF に対応する #IF がありません。この #ENDIF を無視します。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3297                                 }\r
3298                         }\r
3299                         else if( !this.bstackIFからENDIFをスキップする.Peek() )\r
3300                         {\r
3301                                 if( str.StartsWith( "PATH_WAV", StringComparison.OrdinalIgnoreCase ) )\r
3302                                 {\r
3303                                         this.t入力・パラメータ食い込みチェック( "PATH_WAV", ref str, ref str2 );\r
3304                                         this.PATH_WAV = str2;\r
3305                                 }\r
3306                                 else if( str.StartsWith( "TITLE", StringComparison.OrdinalIgnoreCase ) )\r
3307                                 {\r
3308                                         this.t入力・パラメータ食い込みチェック( "TITLE", ref str, ref str2 );\r
3309                                         this.TITLE = str2;\r
3310                                 }\r
3311                                 else if( str.StartsWith( "ARTIST", StringComparison.OrdinalIgnoreCase ) )\r
3312                                 {\r
3313                                         this.t入力・パラメータ食い込みチェック( "ARTIST", ref str, ref str2 );\r
3314                                         this.ARTIST = str2;\r
3315                                 }\r
3316                                 else if( str.StartsWith( "COMMENT", StringComparison.OrdinalIgnoreCase ) )\r
3317                                 {\r
3318                                         this.t入力・パラメータ食い込みチェック( "COMMENT", ref str, ref str2 );\r
3319                                         this.COMMENT = str2;\r
3320                                 }\r
3321                                 else if( str.StartsWith( "DLEVEL", StringComparison.OrdinalIgnoreCase ) || str.StartsWith( "PLAYLEVEL", StringComparison.OrdinalIgnoreCase ) )\r
3322                                 {\r
3323                                         int dlevel;\r
3324                                         this.t入力・パラメータ食い込みチェック( "DLEVEL", ref str, ref str2 );\r
3325                                         this.t入力・パラメータ食い込みチェック( "PLAYLEVEL", ref str, ref str2 );\r
3326                                         if( int.TryParse( str2, out dlevel ) )\r
3327                                         {\r
3328                                                 if( dlevel < 0 )\r
3329                                                 {\r
3330                                                         dlevel = 0;\r
3331                                                 }\r
3332                                                 else if( dlevel > 100 )\r
3333                                                 {\r
3334                                                         dlevel = 100;\r
3335                                                 }\r
3336                                                 this.LEVEL.Drums = dlevel;\r
3337                                         }\r
3338                                 }\r
3339                                 else if( str.StartsWith( "GLEVEL", StringComparison.OrdinalIgnoreCase ) )\r
3340                                 {\r
3341                                         int glevel;\r
3342                                         this.t入力・パラメータ食い込みチェック( "GLEVEL", ref str, ref str2 );\r
3343                                         if( int.TryParse( str2, out glevel ) )\r
3344                                         {\r
3345                                                 if( glevel < 0 )\r
3346                                                 {\r
3347                                                         glevel = 0;\r
3348                                                 }\r
3349                                                 else if( glevel > 100 )\r
3350                                                 {\r
3351                                                         glevel = 100;\r
3352                                                 }\r
3353                                                 this.LEVEL.Guitar = glevel;\r
3354                                         }\r
3355                                 }\r
3356                                 else if( str.StartsWith( "BLEVEL", StringComparison.OrdinalIgnoreCase ) )\r
3357                                 {\r
3358                                         int blevel;\r
3359                                         this.t入力・パラメータ食い込みチェック( "BLEVEL", ref str, ref str2 );\r
3360                                         if( int.TryParse( str2, out blevel ) )\r
3361                                         {\r
3362                                                 if( blevel < 0 )\r
3363                                                 {\r
3364                                                         blevel = 0;\r
3365                                                 }\r
3366                                                 else if( blevel > 100 )\r
3367                                                 {\r
3368                                                         blevel = 100;\r
3369                                                 }\r
3370                                                 this.LEVEL.Bass = blevel;\r
3371                                         }\r
3372                                 }\r
3373 #if TEST_NOTEOFFMODE\r
3374                                 else if (str.StartsWith("SUPRESSNOTEOFF_HIHAT", StringComparison.OrdinalIgnoreCase)) {\r
3375                                         this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_HIHAT", ref str, ref str2);\r
3376                                         this.bHH演奏で直前のHHを消音する = !str2.ToLower().Equals("on");\r
3377                                 } \r
3378                                 else if (str.StartsWith("SUPRESSNOTEOFF_GUITAR", StringComparison.OrdinalIgnoreCase)) {\r
3379                                         this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_GUITAR", ref str, ref str2);\r
3380                                         this.bGUITAR演奏で直前のGUITARを消音する = !str2.ToLower().Equals("on");\r
3381                                 }\r
3382                                 else if (str.StartsWith("SUPRESSNOTEOFF_BASS", StringComparison.OrdinalIgnoreCase)) {\r
3383                                         this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_BASS", ref str, ref str2);\r
3384                                         this.bBASS演奏で直前のBASSを消音する = !str2.ToLower().Equals("on");\r
3385                                 }\r
3386 #endif\r
3387                                 else if (str.StartsWith("GENRE", StringComparison.OrdinalIgnoreCase)) {\r
3388                                         this.t入力・パラメータ食い込みチェック("GENRE", ref str, ref str2);\r
3389                                         this.GENRE = str2;\r
3390                                 } else {\r
3391                                         if (str.StartsWith("HIDDENLEVEL", StringComparison.OrdinalIgnoreCase)) {\r
3392                                                 this.t入力・パラメータ食い込みチェック("HIDDENLEVEL", ref str, ref str2);\r
3393                                                 this.HIDDENLEVEL = str2.ToLower().Equals("on");\r
3394                                         }\r
3395                                         if (str.StartsWith("STAGEFILE", StringComparison.OrdinalIgnoreCase)) {\r
3396                                                 this.t入力・パラメータ食い込みチェック("STAGEFILE", ref str, ref str2);\r
3397                                                 this.STAGEFILE = str2;\r
3398                                         } else if (str.StartsWith("PREVIEW", StringComparison.OrdinalIgnoreCase)) {\r
3399                                                 this.t入力・パラメータ食い込みチェック("PREVIEW", ref str, ref str2);\r
3400                                                 this.PREVIEW = str2;\r
3401                                         } else if (str.StartsWith("PREIMAGE", StringComparison.OrdinalIgnoreCase)) {\r
3402                                                 this.t入力・パラメータ食い込みチェック("PREIMAGE", ref str, ref str2);\r
3403                                                 this.PREIMAGE = str2;\r
3404                                         } else if (str.StartsWith("PREMOVIE", StringComparison.OrdinalIgnoreCase)) {\r
3405                                                 this.t入力・パラメータ食い込みチェック("PREMOVIE", ref str, ref str2);\r
3406                                                 this.PREMOVIE = str2;\r
3407                                         } else if (str.StartsWith("BACKGROUND_GR", StringComparison.OrdinalIgnoreCase)) {\r
3408                                                 this.t入力・パラメータ食い込みチェック("BACKGROUND_GR", ref str, ref str2);\r
3409                                                 this.BACKGROUND_GR = str2;\r
3410                                         } else if (str.StartsWith("BACKGROUND", StringComparison.OrdinalIgnoreCase) || str.StartsWith("WALL", StringComparison.OrdinalIgnoreCase)) {\r
3411                                                 this.t入力・パラメータ食い込みチェック("BACKGROUND", ref str, ref str2);\r
3412                                                 this.t入力・パラメータ食い込みチェック("WALL", ref str, ref str2);\r
3413                                                 this.BACKGROUND = str2;\r
3414                                         } else {\r
3415                                                 if (str.StartsWith("RANDOM", StringComparison.OrdinalIgnoreCase)) {\r
3416                                                         this.t入力・パラメータ食い込みチェック("RANDOM", ref str, ref str2);\r
3417                                                         int num5 = 1;\r
3418                                                         if (!int.TryParse(str2, out num5)) {\r
3419                                                                 num5 = 1;\r
3420                                                         }\r
3421                                                         this.n現在の乱数 = CDTXMania.Random.Next(num5) + 1;\r
3422                                                 }\r
3423                                                 if (str.StartsWith("SOUND_NOWLOADING", StringComparison.OrdinalIgnoreCase)) {\r
3424                                                         this.t入力・パラメータ食い込みチェック("SOUND_NOWLOADING", ref str, ref str2);\r
3425                                                         this.SOUND_NOWLOADING = str2;\r
3426                                                 } else if (!this.bヘッダのみ) {\r
3427                                                         if (str.StartsWith("PANEL", StringComparison.OrdinalIgnoreCase)) {\r
3428                                                                 this.t入力・パラメータ食い込みチェック("PANEL", ref str, ref str2);\r
3429                                                                 int dummyResult;                                                                // #23885 2010.12.12 yyagi: not to confuse "#PANEL strings (panel)" and "#PANEL int (panpot of EL)"\r
3430                                                                 if (!int.TryParse(str2, out dummyResult)) {             // 数値じゃないならPANELとみなす\r
3431                                                                         this.PANEL = str2;                                                      //\r
3432                                                                         goto EOL;                                                                       //\r
3433                                                                 }                                                                                               // 数値ならPAN ELとみなす\r
3434 \r
3435                                                         }\r
3436                                                         if (str.StartsWith("MIDIFILE", StringComparison.OrdinalIgnoreCase)) {\r
3437                                                                 this.t入力・パラメータ食い込みチェック("MIDIFILE", ref str, ref str2);\r
3438                                                                 this.MIDIFILE = str2;\r
3439                                                         } else {\r
3440                                                                 if (str.StartsWith("MIDINOTE", StringComparison.OrdinalIgnoreCase)) {\r
3441                                                                         this.t入力・パラメータ食い込みチェック("MIDINOTE", ref str, ref str2);\r
3442                                                                         this.MIDINOTE = str2.ToLower().Equals("on");\r
3443                                                                 }\r
3444                                                                 if (str.StartsWith("BLACKCOLORKEY", StringComparison.OrdinalIgnoreCase)) {\r
3445                                                                         this.t入力・パラメータ食い込みチェック("BLACKCOLORKEY", ref str, ref str2);\r
3446                                                                         this.BLACKCOLORKEY = str2.ToLower().Equals("on");\r
3447                                                                 }\r
3448                                                                 if (str.StartsWith("BASEBPM", StringComparison.OrdinalIgnoreCase)) {\r
3449                                                                         this.t入力・パラメータ食い込みチェック("BASEBPM", ref str, ref str2);\r
3450                                                                         double basebpm = 0.0;\r
3451                                                                         //if( double.TryParse( str2, out num6 ) && ( num6 > 0.0 ) )\r
3452                                                                         if (TryParse(str2, out basebpm) && basebpm > 0.0)       // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point\r
3453                                                                         {                                                                                                       // #24204 2011.01.21 yyagi: Fix the condition correctly\r
3454                                                                                 this.BASEBPM = basebpm;\r
3455                                                                         }\r
3456                                                                 } else if (str.StartsWith("SOUND_STAGEFAILED", StringComparison.OrdinalIgnoreCase)) {\r
3457                                                                         this.t入力・パラメータ食い込みチェック("SOUND_STAGEFAILED", ref str, ref str2);\r
3458                                                                         this.SOUND_STAGEFAILED = str2;\r
3459                                                                 } else if (str.StartsWith("SOUND_FULLCOMBO", StringComparison.OrdinalIgnoreCase)) {\r
3460                                                                         this.t入力・パラメータ食い込みチェック("SOUND_FULLCOMBO", ref str, ref str2);\r
3461                                                                         this.SOUND_FULLCOMBO = str2;\r
3462                                                                 } else if (str.StartsWith("SOUND_AUDIENCE", StringComparison.OrdinalIgnoreCase)) {\r
3463                                                                         this.t入力・パラメータ食い込みチェック("SOUND_AUDIENCE", ref str, ref str2);\r
3464                                                                         this.SOUND_AUDIENCE = str2;\r
3465                                                                 } else if (!this.t入力・行解析・WAVVOL_VOLUME(str, str2, str3) &&\r
3466                                                                           !this.t入力・行解析・WAVPAN_PAN(str, str2, str3) &&\r
3467                                                                           !this.t入力・行解析・WAV(str, str2, str3) &&\r
3468                                                                           !this.t入力・行解析・BMPTEX(str, str2, str3) &&\r
3469                                                                           !this.t入力・行解析・BMP(str, str2, str3) &&\r
3470                                                                           !this.t入力・行解析・BGAPAN(str, str2, str3) &&\r
3471                                                                           !this.t入力・行解析・BGA(str, str2, str3) &&\r
3472                                                                           !this.t入力・行解析・AVIPAN(str, str2, str3) &&\r
3473                                                                           !this.t入力・行解析・AVI_VIDEO(str, str2, str3) &&\r
3474                                                                           !this.t入力・行解析・BPM_BPMzz(str, str2, str3) &&\r
3475                                                                           !this.t入力・行解析・RESULTIMAGE(str, str2, str3) &&\r
3476                                                                           !this.t入力・行解析・RESULTMOVIE(str, str2, str3) &&\r
3477                                                                           !this.t入力・行解析・RESULTSOUND(str, str2, str3) &&\r
3478                                                                           !this.t入力・行解析・SIZE(str, str2, str3)) {\r
3479                                                                         this.t入力・行解析・チップ配置(str, str2, str3);\r
3480                                                                 }\r
3481                                                         }\r
3482                                                 EOL:\r
3483                                                         int xx = 0;             // #23885 2010.12.12 yyagi: dummy line to exit parsing the line\r
3484                                                 }\r
3485                                         }\r
3486                                 }\r
3487                         }\r
3488                 }\r
3489                 private bool t入力・行解析・AVI_VIDEO( string strコマンド, string strパラメータ, string strコメント )\r
3490                 {\r
3491                         if( strコマンド.StartsWith( "AVI", StringComparison.OrdinalIgnoreCase ) )\r
3492                         {\r
3493                                 strコマンド = strコマンド.Substring( 3 );\r
3494                         }\r
3495                         else if( strコマンド.StartsWith( "VIDEO", StringComparison.OrdinalIgnoreCase ) )\r
3496                         {\r
3497                                 strコマンド = strコマンド.Substring( 5 );\r
3498                         }\r
3499                         else\r
3500                         {\r
3501                                 return false;\r
3502                         }\r
3503                         if( strコマンド.Length < 2 )\r
3504                         {\r
3505                                 return false;\r
3506                         }\r
3507                         int key = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
3508                         if( ( key < 0 ) || ( key >= 36 * 36 ) )\r
3509                         {\r
3510                                 Trace.TraceError( "AVI(VIDEO)番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3511                                 return false;\r
3512                         }\r
3513                         CAVI cavi = new CAVI();\r
3514                         cavi.n番号 = key;\r
3515                         cavi.strファイル名 = strパラメータ;\r
3516                         cavi.strコメント文 = strコメント;\r
3517                         if( this.listAVI.ContainsKey( key ) )\r
3518                         {\r
3519                                 this.listAVI.Remove( key );\r
3520                         }\r
3521                         this.listAVI.Add( key, cavi );\r
3522                         return true;\r
3523                 }\r
3524                 private bool t入力・行解析・AVIPAN( string strコマンド, string strパラメータ, string strコメント )\r
3525                 {\r
3526                         if( strコマンド.StartsWith( "AVIPAN", StringComparison.OrdinalIgnoreCase ) )\r
3527                         {\r
3528                                 strコマンド = strコマンド.Substring( 6 );\r
3529                         }\r
3530                         else\r
3531                         {\r
3532                                 return false;\r
3533                         }\r
3534                         if( strコマンド.Length < 2 )\r
3535                         {\r
3536                                 return false;\r
3537                         }\r
3538                         int key = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
3539                         if( ( key < 0 ) || ( key >= 36 * 36 ) )\r
3540                         {\r
3541                                 Trace.TraceError( "AVIPAN番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3542                                 return false;\r
3543                         }\r
3544                         CAVIPAN cavipan = new CAVIPAN();\r
3545                         cavipan.n番号 = key;\r
3546                         string[] strArray = strパラメータ.Split( new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries );\r
3547                         if( strArray.Length < 14 )\r
3548                         {\r
3549                                 Trace.TraceError( "AVIPAN: 引数が足りません。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3550                                 return false;\r
3551                         }\r
3552                         int index = 0;\r
3553                         int result = 0;\r
3554                         if( ( strArray[ index ].Length == 0 ) || ( strArray[ index ].Length > 2 ) )\r
3555                         {\r
3556                                 Trace.TraceError( "AVIPAN: {2}番目の数(AVI番号)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3557                                 return false;\r
3558                         }\r
3559                         cavipan.nAVI番号 = C変換.n36進数2桁の文字列を数値に変換して返す( strArray[ index ] );\r
3560                         if( ( cavipan.nAVI番号 < 1 ) || ( cavipan.nAVI番号 >= 36 * 36 ) )\r
3561                         {\r
3562                                 Trace.TraceError( "AVIPAN: {2}番目の数(AVI番号)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3563                                 return false;\r
3564                         }\r
3565                         index++;\r
3566                         result = 0;\r
3567                         if( !int.TryParse( strArray[ index ], out result ) )\r
3568                         {\r
3569                                 Trace.TraceError( "AVIPAN: {2}番目の引数(開始転送サイズ・幅)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3570                                 return false;\r
3571                         }\r
3572                         cavipan.sz開始サイズ.Width = result;\r
3573                         index++;\r
3574                         result = 0;\r
3575                         if( !int.TryParse( strArray[ index ], out result ) )\r
3576                         {\r
3577                                 Trace.TraceError( "AVIPAN: {2}番目の引数(開始転送サイズ・高さ)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3578                                 return false;\r
3579                         }\r
3580                         cavipan.sz開始サイズ.Height = result;\r
3581                         index++;\r
3582                         result = 0;\r
3583                         if( !int.TryParse( strArray[ index ], out result ) )\r
3584                         {\r
3585                                 Trace.TraceError( "AVIPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3586                                 return false;\r
3587                         }\r
3588                         cavipan.sz終了サイズ.Width = result;\r
3589                         index++;\r
3590                         result = 0;\r
3591                         if( !int.TryParse( strArray[ index ], out result ) )\r
3592                         {\r
3593                                 Trace.TraceError( "AVIPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3594                                 return false;\r
3595                         }\r
3596                         cavipan.sz終了サイズ.Height = result;\r
3597                         index++;\r
3598                         result = 0;\r
3599                         if( !int.TryParse( strArray[ index ], out result ) )\r
3600                         {\r
3601                                 Trace.TraceError( "AVIPAN: {2}番目の引数(画像側開始位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3602                                 return false;\r
3603                         }\r
3604                         cavipan.pt動画側開始位置.X = result;\r
3605                         index++;\r
3606                         result = 0;\r
3607                         if( !int.TryParse( strArray[ index ], out result ) )\r
3608                         {\r
3609                                 Trace.TraceError( "AVIPAN: {2}番目の引数(画像側開始位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3610                                 return false;\r
3611                         }\r
3612                         cavipan.pt動画側開始位置.Y = result;\r
3613                         index++;\r
3614                         result = 0;\r
3615                         if( !int.TryParse( strArray[ index ], out result ) )\r
3616                         {\r
3617                                 Trace.TraceError( "AVIPAN: {2}番目の引数(画像側終了位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3618                                 return false;\r
3619                         }\r
3620                         cavipan.pt動画側終了位置.X = result;\r
3621                         index++;\r
3622                         result = 0;\r
3623                         if( !int.TryParse( strArray[ index ], out result ) )\r
3624                         {\r
3625                                 Trace.TraceError( "AVIPAN: {2}番目の引数(画像側終了位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3626                                 return false;\r
3627                         }\r
3628                         cavipan.pt動画側終了位置.Y = result;\r
3629                         index++;\r
3630                         result = 0;\r
3631                         if( !int.TryParse( strArray[ index ], out result ) )\r
3632                         {\r
3633                                 Trace.TraceError( "AVIPAN: {2}番目の引数(表示側開始位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3634                                 return false;\r
3635                         }\r
3636                         cavipan.pt表示側開始位置.X = result;\r
3637                         index++;\r
3638                         result = 0;\r
3639                         if( !int.TryParse( strArray[ index ], out result ) )\r
3640                         {\r
3641                                 Trace.TraceError( "AVIPAN: {2}番目の引数(表示側開始位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3642                                 return false;\r
3643                         }\r
3644                         cavipan.pt表示側開始位置.Y = result;\r
3645                         index++;\r
3646                         result = 0;\r
3647                         if( !int.TryParse( strArray[ index ], out result ) )\r
3648                         {\r
3649                                 Trace.TraceError( "AVIPAN: {2}番目の引数(表示側終了位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3650                                 return false;\r
3651                         }\r
3652                         cavipan.pt表示側終了位置.X = result;\r
3653                         index++;\r
3654                         result = 0;\r
3655                         if( !int.TryParse( strArray[ index ], out result ) )\r
3656                         {\r
3657                                 Trace.TraceError( "AVIPAN: {2}番目の引数(表示側終了位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3658                                 return false;\r
3659                         }\r
3660                         cavipan.pt表示側終了位置.Y = result;\r
3661                         index++;\r
3662                         result = 0;\r
3663                         if( !int.TryParse( strArray[ index ], out result ) )\r
3664                         {\r
3665                                 Trace.TraceError( "AVIPAN: {2}番目の引数(移動時間)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3666                                 return false;\r
3667                         }\r
3668                         if( result < 0 )\r
3669                         {\r
3670                                 result = 0;\r
3671                         }\r
3672                         cavipan.n移動時間ct = result;\r
3673                         index++;\r
3674                         if( this.listAVIPAN.ContainsKey( key ) )\r
3675                         {\r
3676                                 this.listAVIPAN.Remove( key );\r
3677                         }\r
3678                         this.listAVIPAN.Add( key, cavipan );\r
3679                         return true;\r
3680                 }\r
3681                 private bool t入力・行解析・BGA( string strコマンド, string strパラメータ, string strコメント )\r
3682                 {\r
3683                         if( strコマンド.StartsWith( "BGA", StringComparison.OrdinalIgnoreCase ) )\r
3684                         {\r
3685                                 strコマンド = strコマンド.Substring( 3 );\r
3686                         }\r
3687                         else\r
3688                         {\r
3689                                 return false;\r
3690                         }\r
3691                         if( strコマンド.Length < 2 )\r
3692                         {\r
3693                                 return false;\r
3694                         }\r
3695                         int key = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
3696                         if( ( key < 0 ) || ( key >= 36 * 36 ) )\r
3697                         {\r
3698                                 Trace.TraceError( "BGA番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3699                                 return false;\r
3700                         }\r
3701                         CBGA cbga = new CBGA();\r
3702                         cbga.n番号 = key;\r
3703                         string[] strArray = strパラメータ.Split( new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries );\r
3704                         if( strArray.Length < 7 )\r
3705                         {\r
3706                                 Trace.TraceError( "BGA: 引数が足りません。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3707                                 return false;\r
3708                         }\r
3709                         int index = 0;\r
3710                         int result = 0;\r
3711                         if( ( strArray[ index ].Length == 0 ) || ( strArray[ index ].Length > 2 ) )\r
3712                         {\r
3713                                 Trace.TraceError( "BGA: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3714                                 return false;\r
3715                         }\r
3716                         cbga.nBMP番号 = C変換.n36進数2桁の文字列を数値に変換して返す( strArray[ index ] );\r
3717                         if( ( cbga.nBMP番号 < 1 ) || ( cbga.nBMP番号 >= 36 * 36 ) )\r
3718                         {\r
3719                                 Trace.TraceError( "BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3720                                 return false;\r
3721                         }\r
3722                         index++;\r
3723                         result = 0;\r
3724                         if( !int.TryParse( strArray[ index ], out result ) )\r
3725                         {\r
3726                                 Trace.TraceError( "BGA: {2}番目の引数(画像側位置1・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3727                                 return false;\r
3728                         }\r
3729                         cbga.pt画像側左上座標.X = result;\r
3730                         index++;\r
3731                         result = 0;\r
3732                         if( !int.TryParse( strArray[ index ], out result ) )\r
3733                         {\r
3734                                 Trace.TraceError( "BGA: {2}番目の引数(画像側位置1・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3735                                 return false;\r
3736                         }\r
3737                         cbga.pt画像側左上座標.Y = result;\r
3738                         index++;\r
3739                         result = 0;\r
3740                         if( !int.TryParse( strArray[ index ], out result ) )\r
3741                         {\r
3742                                 Trace.TraceError( "BGA: {2}番目の引数(画像側座標2・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3743                                 return false;\r
3744                         }\r
3745                         cbga.pt画像側右下座標.X = result;\r
3746                         index++;\r
3747                         result = 0;\r
3748                         if( !int.TryParse( strArray[ index ], out result ) )\r
3749                         {\r
3750                                 Trace.TraceError( "BGA: {2}番目の引数(画像側座標2・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3751                                 return false;\r
3752                         }\r
3753                         cbga.pt画像側右下座標.Y = result;\r
3754                         index++;\r
3755                         result = 0;\r
3756                         if( !int.TryParse( strArray[ index ], out result ) )\r
3757                         {\r
3758                                 Trace.TraceError( "BGA: {2}番目の引数(表示位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3759                                 return false;\r
3760                         }\r
3761                         cbga.pt表示座標.X = result;\r
3762                         index++;\r
3763                         result = 0;\r
3764                         if( !int.TryParse( strArray[ index ], out result ) )\r
3765                         {\r
3766                                 Trace.TraceError( "BGA: {2}番目の引数(表示位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3767                                 return false;\r
3768                         }\r
3769                         cbga.pt表示座標.Y = result;\r
3770                         index++;\r
3771                         if( cbga.pt画像側左上座標.X > cbga.pt画像側右下座標.X )\r
3772                         {\r
3773                                 result = cbga.pt画像側左上座標.X;\r
3774                                 cbga.pt画像側左上座標.X = cbga.pt画像側右下座標.X;\r
3775                                 cbga.pt画像側右下座標.X = result;\r
3776                         }\r
3777                         if( cbga.pt画像側左上座標.Y > cbga.pt画像側右下座標.Y )\r
3778                         {\r
3779                                 result = cbga.pt画像側左上座標.Y;\r
3780                                 cbga.pt画像側左上座標.Y = cbga.pt画像側右下座標.Y;\r
3781                                 cbga.pt画像側右下座標.Y = result;\r
3782                         }\r
3783                         if( this.listBGA.ContainsKey( key ) )\r
3784                         {\r
3785                                 this.listBGA.Remove( key );\r
3786                         }\r
3787                         this.listBGA.Add( key, cbga );\r
3788                         return true;\r
3789                 }\r
3790                 private bool t入力・行解析・BGAPAN( string strコマンド, string strパラメータ, string strコメント )\r
3791                 {\r
3792                         if( strコマンド.StartsWith( "BGAPAN", StringComparison.OrdinalIgnoreCase ) )\r
3793                         {\r
3794                                 strコマンド = strコマンド.Substring( 6 );\r
3795                         }\r
3796                         else\r
3797                         {\r
3798                                 return false;\r
3799                         }\r
3800                         if( strコマンド.Length < 2 )\r
3801                         {\r
3802                                 return false;\r
3803                         }\r
3804                         int key = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
3805                         if( ( key < 0 ) || ( key >= 36 * 36 ) )\r
3806                         {\r
3807                                 Trace.TraceError( "BGAPAN番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3808                                 return false;\r
3809                         }\r
3810                         CBGAPAN cbgapan = new CBGAPAN();\r
3811                         cbgapan.n番号 = key;\r
3812                         string[] strArray = strパラメータ.Split( new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries );\r
3813                         if( strArray.Length < 14 )\r
3814                         {\r
3815                                 Trace.TraceError( "BGAPAN: 引数が足りません。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3816                                 return false;\r
3817                         }\r
3818                         int index = 0;\r
3819                         int result = 0;\r
3820                         if( ( strArray[ index ].Length == 0 ) || ( strArray[ index ].Length > 2 ) )\r
3821                         {\r
3822                                 Trace.TraceError( "BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3823                                 return false;\r
3824                         }\r
3825                         cbgapan.nBMP番号 = C変換.n36進数2桁の文字列を数値に変換して返す( strArray[ index ] );\r
3826                         if( ( cbgapan.nBMP番号 < 1 ) || ( cbgapan.nBMP番号 >= 36 * 36 ) )\r
3827                         {\r
3828                                 Trace.TraceError( "BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3829                                 return false;\r
3830                         }\r
3831                         index++;\r
3832                         result = 0;\r
3833                         if( !int.TryParse( strArray[ index ], out result ) )\r
3834                         {\r
3835                                 Trace.TraceError( "BGAPAN: {2}番目の引数(開始転送サイズ・幅)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3836                                 return false;\r
3837                         }\r
3838                         cbgapan.sz開始サイズ.Width = result;\r
3839                         index++;\r
3840                         result = 0;\r
3841                         if( !int.TryParse( strArray[ index ], out result ) )\r
3842                         {\r
3843                                 Trace.TraceError( "BGAPAN: {2}番目の引数(開始転送サイズ・高さ)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3844                                 return false;\r
3845                         }\r
3846                         cbgapan.sz開始サイズ.Height = result;\r
3847                         index++;\r
3848                         result = 0;\r
3849                         if( !int.TryParse( strArray[ index ], out result ) )\r
3850                         {\r
3851                                 Trace.TraceError( "BGAPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3852                                 return false;\r
3853                         }\r
3854                         cbgapan.sz終了サイズ.Width = result;\r
3855                         index++;\r
3856                         result = 0;\r
3857                         if( !int.TryParse( strArray[ index ], out result ) )\r
3858                         {\r
3859                                 Trace.TraceError( "BGAPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3860                                 return false;\r
3861                         }\r
3862                         cbgapan.sz終了サイズ.Height = result;\r
3863                         index++;\r
3864                         result = 0;\r
3865                         if( !int.TryParse( strArray[ index ], out result ) )\r
3866                         {\r
3867                                 Trace.TraceError( "BGAPAN: {2}番目の引数(画像側開始位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3868                                 return false;\r
3869                         }\r
3870                         cbgapan.pt画像側開始位置.X = result;\r
3871                         index++;\r
3872                         result = 0;\r
3873                         if( !int.TryParse( strArray[ index ], out result ) )\r
3874                         {\r
3875                                 Trace.TraceError( "BGAPAN: {2}番目の引数(画像側開始位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3876                                 return false;\r
3877                         }\r
3878                         cbgapan.pt画像側開始位置.Y = result;\r
3879                         index++;\r
3880                         result = 0;\r
3881                         if( !int.TryParse( strArray[ index ], out result ) )\r
3882                         {\r
3883                                 Trace.TraceError( "BGAPAN: {2}番目の引数(画像側終了位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3884                                 return false;\r
3885                         }\r
3886                         cbgapan.pt画像側終了位置.X = result;\r
3887                         index++;\r
3888                         result = 0;\r
3889                         if( !int.TryParse( strArray[ index ], out result ) )\r
3890                         {\r
3891                                 Trace.TraceError( "BGAPAN: {2}番目の引数(画像側終了位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3892                                 return false;\r
3893                         }\r
3894                         cbgapan.pt画像側終了位置.Y = result;\r
3895                         index++;\r
3896                         result = 0;\r
3897                         if( !int.TryParse( strArray[ index ], out result ) )\r
3898                         {\r
3899                                 Trace.TraceError( "BGAPAN: {2}番目の引数(表示側開始位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3900                                 return false;\r
3901                         }\r
3902                         cbgapan.pt表示側開始位置.X = result;\r
3903                         index++;\r
3904                         result = 0;\r
3905                         if( !int.TryParse( strArray[ index ], out result ) )\r
3906                         {\r
3907                                 Trace.TraceError( "BGAPAN: {2}番目の引数(表示側開始位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3908                                 return false;\r
3909                         }\r
3910                         cbgapan.pt表示側開始位置.Y = result;\r
3911                         index++;\r
3912                         result = 0;\r
3913                         if( !int.TryParse( strArray[ index ], out result ) )\r
3914                         {\r
3915                                 Trace.TraceError( "BGAPAN: {2}番目の引数(表示側終了位置・X)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3916                                 return false;\r
3917                         }\r
3918                         cbgapan.pt表示側終了位置.X = result;\r
3919                         index++;\r
3920                         result = 0;\r
3921                         if( !int.TryParse( strArray[ index ], out result ) )\r
3922                         {\r
3923                                 Trace.TraceError( "BGAPAN: {2}番目の引数(表示側終了位置・Y)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3924                                 return false;\r
3925                         }\r
3926                         cbgapan.pt表示側終了位置.Y = result;\r
3927                         index++;\r
3928                         result = 0;\r
3929                         if( !int.TryParse( strArray[ index ], out result ) )\r
3930                         {\r
3931                                 Trace.TraceError( "BGAPAN: {2}番目の引数(移動時間)が異常です。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数, index + 1 } );\r
3932                                 return false;\r
3933                         }\r
3934                         if( result < 0 )\r
3935                         {\r
3936                                 result = 0;\r
3937                         }\r
3938                         cbgapan.n移動時間ct = result;\r
3939                         index++;\r
3940                         if( this.listBGAPAN.ContainsKey( key ) )\r
3941                         {\r
3942                                 this.listBGAPAN.Remove( key );\r
3943                         }\r
3944                         this.listBGAPAN.Add( key, cbgapan );\r
3945                         return true;\r
3946                 }\r
3947                 private bool t入力・行解析・BMP( string strコマンド, string strパラメータ, string strコメント )\r
3948                 {\r
3949                         if( strコマンド.StartsWith( "BMP", StringComparison.OrdinalIgnoreCase ) )\r
3950                         {\r
3951                                 strコマンド = strコマンド.Substring( 3 );\r
3952                         }\r
3953                         else\r
3954                         {\r
3955                                 return false;\r
3956                         }\r
3957                         int key = 0;\r
3958                         if( strコマンド.Length < 2 )\r
3959                         {\r
3960                                 key = 0;\r
3961                         }\r
3962                         else\r
3963                         {\r
3964                                 key = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
3965                                 if( ( key < 0 ) || ( key >= 36 * 36 ) )\r
3966                                 {\r
3967                                         Trace.TraceError( "BMP番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
3968                                         return false;\r
3969                                 }\r
3970                         }\r
3971                         CBMP cbmp = new CBMP();\r
3972                         cbmp.n番号 = key;\r
3973                         cbmp.strファイル名 = strパラメータ;\r
3974                         cbmp.strコメント文 = strコメント;\r
3975                         if( this.listBMP.ContainsKey( key ) )\r
3976                         {\r
3977                                 this.listBMP.Remove( key );\r
3978                         }\r
3979                         this.listBMP.Add( key, cbmp );\r
3980                         return true;\r
3981                 }\r
3982                 private bool t入力・行解析・BMPTEX( string strコマンド, string strパラメータ, string strコメント )\r
3983                 {\r
3984                         if( strコマンド.StartsWith( "BMPTEX", StringComparison.OrdinalIgnoreCase ) )\r
3985                         {\r
3986                                 strコマンド = strコマンド.Substring( 6 );\r
3987                         }\r
3988                         else\r
3989                         {\r
3990                                 return false;\r
3991                         }\r
3992                         if( strコマンド.Length < 2 )\r
3993                         {\r
3994                                 return false;\r
3995                         }\r
3996                         int key = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
3997                         if( ( key < 0 ) || ( key >= 36 * 36 ) )\r
3998                         {\r
3999                                 Trace.TraceError( "BMPTEX番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
4000                                 return false;\r
4001                         }\r
4002                         CBMPTEX cbmptex = new CBMPTEX();\r
4003                         cbmptex.n番号 = key;\r
4004                         cbmptex.strファイル名 = strパラメータ;\r
4005                         cbmptex.strコメント文 = strコメント;\r
4006                         if( this.listBMPTEX.ContainsKey( key ) )\r
4007                         {\r
4008                                 this.listBMPTEX.Remove( key );\r
4009                         }\r
4010                         this.listBMPTEX.Add( key, cbmptex );\r
4011                         return true;\r
4012                 }\r
4013                 private bool t入力・行解析・BPM_BPMzz( string strコマンド, string strパラメータ, string strコメント )\r
4014                 {\r
4015                         if( strコマンド.StartsWith( "BPM", StringComparison.OrdinalIgnoreCase ) )\r
4016                         {\r
4017                                 strコマンド = strコマンド.Substring( 3 );\r
4018                         }\r
4019                         else\r
4020                         {\r
4021                                 return false;\r
4022                         }\r
4023                         int index = 0;\r
4024                         if( strコマンド.Length < 2 )\r
4025                         {\r
4026                                 index = 0;\r
4027                         }\r
4028                         else\r
4029                         {\r
4030                                 index = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
4031                                 if( ( index < 0 ) || ( index >= 36 * 36 ) )\r
4032                                 {\r
4033                                         Trace.TraceError( "BPM番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
4034                                         return false;\r
4035                                 }\r
4036                         }\r
4037                         double result = 0.0;\r
4038 //                      if( !double.TryParse( strパラメータ, out result ) )\r
4039                         if ( !TryParse( strパラメータ, out result) )                       // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point\r
4040                         {\r
4041                                 return false;\r
4042                         }\r
4043                         if( result <= 0.0 )\r
4044                         {\r
4045                                 return false;\r
4046                         }\r
4047                         if( index == 0 )\r
4048                         {\r
4049                                 this.BPM = result;\r
4050                         }\r
4051                         CBPM cbpm = new CBPM();\r
4052                         cbpm.n内部番号 = this.n内部番号BPM1to;\r
4053                         cbpm.n表記上の番号 = index;\r
4054                         cbpm.dbBPM値 = result;\r
4055                         this.listBPM.Add( this.n内部番号BPM1to, cbpm );\r
4056                         if( this.n無限管理BPM[ index ] == -index )\r
4057                         {\r
4058                                 for( int i = 0; i < this.listChip.Count; i++ )\r
4059                                 {\r
4060                                         CChip chip = this.listChip[ i ];\r
4061                                         if( chip.bBPMチップである && ( chip.n整数値・内部番号 == -index ) )\r
4062                                         {\r
4063                                                 chip.n整数値・内部番号 = this.n内部番号BPM1to;\r
4064                                         }\r
4065                                 }\r
4066                         }\r
4067                         this.n無限管理BPM[ index ] = this.n内部番号BPM1to;\r
4068                         this.n内部番号BPM1to++;\r
4069                         return true;\r
4070                 }\r
4071                 private bool t入力・行解析・RESULTIMAGE( string strコマンド, string strパラメータ, string strコメント )\r
4072                 {\r
4073                         if( strコマンド.StartsWith( "RESULTIMAGE", StringComparison.OrdinalIgnoreCase ) )\r
4074                         {\r
4075                                 strコマンド = strコマンド.Substring( 11 );\r
4076                         }\r
4077                         else\r
4078                         {\r
4079                                 return false;\r
4080                         }\r
4081                         if( strコマンド.Length < 2 )\r
4082                         {\r
4083                                 for( int i = 0; i < 7; i++ )\r
4084                                 {\r
4085                                         if( this.nRESULTIMAGE用優先順位[ i ] == 0 )\r
4086                                         {\r
4087                                                 this.RESULTIMAGE[ i ] = strパラメータ.Trim();\r
4088                                         }\r
4089                                 }\r
4090                         }\r
4091                         else\r
4092                         {\r
4093                                 switch( strコマンド.ToUpper() )\r
4094                                 {\r
4095                                         case "_SS":\r
4096                                                 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 0, strパラメータ );\r
4097                                                 break;\r
4098 \r
4099                                         case "_S":\r
4100                                                 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 1, strパラメータ );\r
4101                                                 break;\r
4102 \r
4103                                         case "_A":\r
4104                                                 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 2, strパラメータ );\r
4105                                                 break;\r
4106 \r
4107                                         case "_B":\r
4108                                                 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 3, strパラメータ );\r
4109                                                 break;\r
4110 \r
4111                                         case "_C":\r
4112                                                 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 4, strパラメータ );\r
4113                                                 break;\r
4114 \r
4115                                         case "_D":\r
4116                                                 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 5, strパラメータ );\r
4117                                                 break;\r
4118 \r
4119                                         case "_E":\r
4120                                                 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 6, strパラメータ );\r
4121                                                 break;\r
4122                                 }\r
4123                         }\r
4124                         return true;\r
4125                 }\r
4126                 private void t入力・行解析・RESULTIMAGE・ファイルを設定する( int nランク0to6, string strファイル名 )\r
4127                 {\r
4128                         if( ( nランク0to6 >= 0 ) && ( nランク0to6 <= 6 ) )\r
4129                         {\r
4130                                 for( int i = nランク0to6; i >= 0; i-- )\r
4131                                 {\r
4132                                         if( this.nRESULTIMAGE用優先順位[ i ] < ( 7 - nランク0to6 ) )\r
4133                                         {\r
4134                                                 this.nRESULTIMAGE用優先順位[ i ] = 7 - nランク0to6;\r
4135                                                 this.RESULTIMAGE[ i ] = strファイル名;\r
4136                                         }\r
4137                                 }\r
4138                         }\r
4139                 }\r
4140                 private bool t入力・行解析・RESULTMOVIE( string strコマンド, string strパラメータ, string strコメント )\r
4141                 {\r
4142                         if( strコマンド.StartsWith( "RESULTMOVIE", StringComparison.OrdinalIgnoreCase ) )\r
4143                         {\r
4144                                 strコマンド = strコマンド.Substring( 11 );\r
4145                         }\r
4146                         else\r
4147                         {\r
4148                                 return false;\r
4149                         }\r
4150                         if( strコマンド.Length < 2 )\r
4151                         {\r
4152                                 for( int i = 0; i < 7; i++ )\r
4153                                 {\r
4154                                         if( this.nRESULTMOVIE用優先順位[ i ] == 0 )\r
4155                                         {\r
4156                                                 this.RESULTMOVIE[ i ] = strパラメータ.Trim();\r
4157                                         }\r
4158                                 }\r
4159                         }\r
4160                         else\r
4161                         {\r
4162                                 switch( strコマンド.ToUpper() )\r
4163                                 {\r
4164                                         case "_SS":\r
4165                                                 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 0, strパラメータ );\r
4166                                                 goto Label_0142;\r
4167 \r
4168                                         case "_S":\r
4169                                                 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 1, strパラメータ );\r
4170                                                 goto Label_0142;\r
4171 \r
4172                                         case "_A":\r
4173                                                 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 2, strパラメータ );\r
4174                                                 goto Label_0142;\r
4175 \r
4176                                         case "_B":\r
4177                                                 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 3, strパラメータ );\r
4178                                                 goto Label_0142;\r
4179 \r
4180                                         case "_C":\r
4181                                                 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 4, strパラメータ );\r
4182                                                 goto Label_0142;\r
4183 \r
4184                                         case "_D":\r
4185                                                 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 5, strパラメータ );\r
4186                                                 goto Label_0142;\r
4187 \r
4188                                         case "_E":\r
4189                                                 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 6, strパラメータ );\r
4190                                                 goto Label_0142;\r
4191                                 }\r
4192                         }\r
4193                 Label_0142:\r
4194                         return true;\r
4195                 }\r
4196                 private void t入力・行解析・RESULTMOVIE・ファイルを設定する( int nランク0to6, string strファイル名 )\r
4197                 {\r
4198                         if( ( nランク0to6 >= 0 ) && ( nランク0to6 <= 6 ) )\r
4199                         {\r
4200                                 for( int i = nランク0to6; i >= 0; i-- )\r
4201                                 {\r
4202                                         if( this.nRESULTMOVIE用優先順位[ i ] < ( 7 - nランク0to6 ) )\r
4203                                         {\r
4204                                                 this.nRESULTMOVIE用優先順位[ i ] = 7 - nランク0to6;\r
4205                                                 this.RESULTMOVIE[ i ] = strファイル名;\r
4206                                         }\r
4207                                 }\r
4208                         }\r
4209                 }\r
4210                 private bool t入力・行解析・RESULTSOUND( string strコマンド, string strパラメータ, string strコメント )\r
4211                 {\r
4212                         if( strコマンド.StartsWith( "RESULTSOUND", StringComparison.OrdinalIgnoreCase ) )\r
4213                         {\r
4214                                 strコマンド = strコマンド.Substring( 11 );\r
4215                         }\r
4216                         else\r
4217                         {\r
4218                                 return false;\r
4219                         }\r
4220                         if( strコマンド.Length < 2 )\r
4221                         {\r
4222                                 for( int i = 0; i < 7; i++ )\r
4223                                 {\r
4224                                         if( this.nRESULTSOUND用優先順位[ i ] == 0 )\r
4225                                         {\r
4226                                                 this.RESULTSOUND[ i ] = strパラメータ.Trim();\r
4227                                         }\r
4228                                 }\r
4229                         }\r
4230                         else\r
4231                         {\r
4232                                 switch( strコマンド.ToUpper() )\r
4233                                 {\r
4234                                         case "_SS":\r
4235                                                 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 0, strパラメータ );\r
4236                                                 goto Label_0142;\r
4237 \r
4238                                         case "_S":\r
4239                                                 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 1, strパラメータ );\r
4240                                                 goto Label_0142;\r
4241 \r
4242                                         case "_A":\r
4243                                                 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 2, strパラメータ );\r
4244                                                 goto Label_0142;\r
4245 \r
4246                                         case "_B":\r
4247                                                 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 3, strパラメータ );\r
4248                                                 goto Label_0142;\r
4249 \r
4250                                         case "_C":\r
4251                                                 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 4, strパラメータ );\r
4252                                                 goto Label_0142;\r
4253 \r
4254                                         case "_D":\r
4255                                                 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 5, strパラメータ );\r
4256                                                 goto Label_0142;\r
4257 \r
4258                                         case "_E":\r
4259                                                 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 6, strパラメータ );\r
4260                                                 goto Label_0142;\r
4261                                 }\r
4262                         }\r
4263                 Label_0142:\r
4264                         return true;\r
4265                 }\r
4266                 private void t入力・行解析・RESULTSOUND・ファイルを設定する( int nランク0to6, string strファイル名 )\r
4267                 {\r
4268                         if( ( nランク0to6 >= 0 ) && ( nランク0to6 <= 6 ) )\r
4269                         {\r
4270                                 for( int i = nランク0to6; i >= 0; i-- )\r
4271                                 {\r
4272                                         if( this.nRESULTSOUND用優先順位[ i ] < ( 7 - nランク0to6 ) )\r
4273                                         {\r
4274                                                 this.nRESULTSOUND用優先順位[ i ] = 7 - nランク0to6;\r
4275                                                 this.RESULTSOUND[ i ] = strファイル名;\r
4276                                         }\r
4277                                 }\r
4278                         }\r
4279                 }\r
4280                 private bool t入力・行解析・SIZE( string strコマンド, string strパラメータ, string strコメント )\r
4281                 {\r
4282                         int num2;\r
4283                         if( strコマンド.StartsWith( "SIZE", StringComparison.OrdinalIgnoreCase ) )\r
4284                         {\r
4285                                 strコマンド = strコマンド.Substring( 4 );\r
4286                         }\r
4287                         else\r
4288                         {\r
4289                                 return false;\r
4290                         }\r
4291                         if( strコマンド.Length < 2 )\r
4292                         {\r
4293                                 return false;\r
4294                         }\r
4295                         int index = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
4296                         if( ( index < 0 ) || ( index >= 36 * 36 ) )\r
4297                         {\r
4298                                 Trace.TraceError( "SIZE番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
4299                                 return false;\r
4300                         }\r
4301                         if( int.TryParse( strパラメータ, out num2 ) )\r
4302                         {\r
4303                                 if( num2 < 0 )\r
4304                                 {\r
4305                                         num2 = 0;\r
4306                                 }\r
4307                                 else if( num2 > 100 )\r
4308                                 {\r
4309                                         num2 = 100;\r
4310                                 }\r
4311                                 if( this.n無限管理SIZE[ index ] == -index )\r
4312                                 {\r
4313                                         foreach( CWAV cwav in this.listWAV.Values )\r
4314                                         {\r
4315                                                 if( cwav.nチップサイズ == -index )\r
4316                                                 {\r
4317                                                         cwav.nチップサイズ = num2;\r
4318                                                 }\r
4319                                         }\r
4320                                 }\r
4321                                 this.n無限管理SIZE[ index ] = num2;\r
4322                         }\r
4323                         return true;\r
4324                 }\r
4325                 private bool t入力・行解析・WAV( string strコマンド, string strパラメータ, string strコメント )\r
4326                 {\r
4327                         if( strコマンド.StartsWith( "WAV", StringComparison.OrdinalIgnoreCase ) )\r
4328                         {\r
4329                                 strコマンド = strコマンド.Substring( 3 );\r
4330                         }\r
4331                         else\r
4332                         {\r
4333                                 return false;\r
4334                         }\r
4335                         if( strコマンド.Length < 2 )\r
4336                         {\r
4337                                 return false;\r
4338                         }\r
4339                         int index = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
4340                         if( ( index < 0 ) || ( index >= 36 * 36 ) )\r
4341                         {\r
4342                                 Trace.TraceError( "WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
4343                                 return false;\r
4344                         }\r
4345                         CWAV cwav = new CWAV();\r
4346                         cwav.n内部番号 = this.n内部番号WAV1to;\r
4347                         cwav.n表記上の番号 = index;\r
4348                         cwav.nチップサイズ = this.n無限管理SIZE[ index ];\r
4349                         cwav.n位置 = this.n無限管理PAN[ index ];\r
4350                         cwav.n音量 = this.n無限管理VOL[ index ];\r
4351                         cwav.strファイル名 = strパラメータ;\r
4352                         cwav.strコメント文 = strコメント;\r
4353                         this.listWAV.Add( this.n内部番号WAV1to, cwav );\r
4354                         if( this.n無限管理WAV[ index ] == -index )\r
4355                         {\r
4356                                 for( int i = 0; i < this.listChip.Count; i++ )\r
4357                                 {\r
4358                                         CChip chip = this.listChip[ i ];\r
4359                                         if( chip.bWAVを使うチャンネルである && ( chip.n整数値・内部番号 == -index ) )\r
4360                                         {\r
4361                                                 chip.n整数値・内部番号 = this.n内部番号WAV1to;\r
4362                                         }\r
4363                                 }\r
4364                         }\r
4365                         this.n無限管理WAV[ index ] = this.n内部番号WAV1to;\r
4366                         this.n内部番号WAV1to++;\r
4367                         return true;\r
4368                 }\r
4369                 private bool t入力・行解析・WAVPAN_PAN( string strコマンド, string strパラメータ, string strコメント )\r
4370                 {\r
4371                         int num2;\r
4372                         if( strコマンド.StartsWith( "WAVPAN", StringComparison.OrdinalIgnoreCase ) )\r
4373                         {\r
4374                                 strコマンド = strコマンド.Substring(6);\r
4375                         }\r
4376                         else if( strコマンド.StartsWith( "PAN", StringComparison.OrdinalIgnoreCase ) )\r
4377                         {\r
4378                                 strコマンド = strコマンド.Substring(3);\r
4379                         }\r
4380                         else\r
4381                         {\r
4382                                 return false;\r
4383                         }\r
4384                         if( strコマンド.Length < 2 )\r
4385                         {\r
4386                                 return false;\r
4387                         }\r
4388                         int index = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
4389                         if( ( index < 0 ) || ( index >= 36 * 36 ) )\r
4390                         {\r
4391                                 Trace.TraceError( "WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
4392                                 return false;\r
4393                         }\r
4394                         if( int.TryParse( strパラメータ, out num2 ) )\r
4395                         {\r
4396                                 if( num2 < -100 )\r
4397                                 {\r
4398                                         num2 = -100;\r
4399                                 }\r
4400                                 else if( num2 >= 100 )\r
4401                                 {\r
4402                                         num2 = 100;\r
4403                                 }\r
4404                                 if( this.n無限管理PAN[ index ] == ( -10000 - index ) )\r
4405                                 {\r
4406                                         foreach( CWAV cwav in this.listWAV.Values )\r
4407                                         {\r
4408                                                 if( cwav.n位置 == ( -10000 - index ) )\r
4409                                                 {\r
4410                                                         cwav.n位置 = num2;\r
4411                                                 }\r
4412                                         }\r
4413                                 }\r
4414                                 this.n無限管理PAN[ index ] = num2;\r
4415                         }\r
4416                         return true;\r
4417                 }\r
4418                 private bool t入力・行解析・WAVVOL_VOLUME( string strコマンド, string strパラメータ, string strコメント )\r
4419                 {\r
4420                         int num2;\r
4421                         if( strコマンド.StartsWith( "WAVVOL", StringComparison.OrdinalIgnoreCase ) )\r
4422                         {\r
4423                                 strコマンド = strコマンド.Substring( 6 );\r
4424                         }\r
4425                         else if( strコマンド.StartsWith( "VOLUME", StringComparison.OrdinalIgnoreCase ) )\r
4426                         {\r
4427                                 strコマンド = strコマンド.Substring( 6 );\r
4428                         }\r
4429                         else\r
4430                         {\r
4431                                 return false;\r
4432                         }\r
4433                         if( strコマンド.Length < 2 )\r
4434                         {\r
4435                                 return false;\r
4436                         }\r
4437                         int index = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );\r
4438                         if( ( index < 0 ) || ( index >= 36 * 36 ) )\r
4439                         {\r
4440                                 Trace.TraceError( "WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
4441                                 return false;\r
4442                         }\r
4443                         if( int.TryParse( strパラメータ, out num2 ) )\r
4444                         {\r
4445                                 if( num2 < 0 )\r
4446                                 {\r
4447                                         num2 = 0;\r
4448                                 }\r
4449                                 else if( num2 >= 100 )\r
4450                                 {\r
4451                                         num2 = 100;\r
4452                                 }\r
4453                                 if( this.n無限管理VOL[ index ] == -index )\r
4454                                 {\r
4455                                         foreach( CWAV cwav in this.listWAV.Values )\r
4456                                         {\r
4457                                                 if( cwav.n音量 == -index )\r
4458                                                 {\r
4459                                                         cwav.n音量 = num2;\r
4460                                                 }\r
4461                                         }\r
4462                                 }\r
4463                                 this.n無限管理VOL[ index ] = num2;\r
4464                         }\r
4465                         return true;\r
4466                 }\r
4467                 private bool t入力・行解析・チップ配置( string strコマンド, string strパラメータ, string strコメント )\r
4468                 {\r
4469                         if( strコマンド.Length != 5 )\r
4470                         {\r
4471                                 return false;\r
4472                         }\r
4473                         int num = C変換.n小節番号の文字列3桁を数値に変換して返す( strコマンド.Substring( 0, 3 ) );\r
4474                         if( num < 0 )\r
4475                         {\r
4476                                 return false;\r
4477                         }\r
4478                         num++;\r
4479                         int c = -1;\r
4480                         if( ( this.e種別 != E種別.GDA ) && ( this.e種別 != E種別.G2D ) )\r
4481                         {\r
4482                                 c = C変換.n16進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 3, 2 ) );\r
4483                                 if( c < 0 )\r
4484                                 {\r
4485                                         return false;\r
4486                                 }\r
4487                         }\r
4488                         else\r
4489                         {\r
4490                                 string str = strコマンド.Substring( 3, 2 );\r
4491                                 foreach( STGDAPARAM stgdaparam in this.stGDAParam )\r
4492                                 {\r
4493                                         if( str.Equals( stgdaparam.s, StringComparison.OrdinalIgnoreCase ) )\r
4494                                         {\r
4495                                                 c = stgdaparam.c;\r
4496                                                 break;\r
4497                                         }\r
4498                                 }\r
4499                                 if( c < 0 )\r
4500                                 {\r
4501                                         return false;\r
4502                                 }\r
4503                         }\r
4504                         if( ( c >= 0x11 ) && ( c <= 0x1a ) )\r
4505                         {\r
4506                                 this.bチップがある.Drums = true;\r
4507                         }\r
4508                         else if( ( c >= 0x20 ) && ( c <= 0x27 ) )\r
4509                         {\r
4510                                 this.bチップがある.Guitar = true;\r
4511                         }\r
4512                         else if( ( c >= 0xA0 ) && ( c <= 0xa7 ) )\r
4513                         {\r
4514                                 this.bチップがある.Bass = true;\r
4515                         }\r
4516                         switch( c )\r
4517                         {\r
4518                                 case 0x18:\r
4519                                         this.bチップがある.HHOpen = true;\r
4520                                         break;\r
4521 \r
4522                                 case 0x19:\r
4523                                         this.bチップがある.Ride = true;\r
4524                                         break;\r
4525 \r
4526                                 case 0x1a:\r
4527                                         this.bチップがある.LeftCymbal = true;\r
4528                                         break;\r
4529 \r
4530                                 case 0x20:\r
4531                                         this.bチップがある.OpenGuitar = true;\r
4532                                         break;\r
4533 \r
4534                                 case 0xA0:\r
4535                                         this.bチップがある.OpenBass = true;\r
4536                                         break;\r
4537 \r
4538                                 case 0x02:                      // 小節長変更\r
4539                                         {\r
4540                                                 double result = 0.0;\r
4541                                                 //if( !double.TryParse( strパラメータ, out result ) )\r
4542                                                 if (!TryParse(strパラメータ, out result))                  // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point\r
4543                                                 {\r
4544                                                         Trace.TraceError( "小節長倍率に不正な値を指定しました。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
4545                                                         return false;\r
4546                                                 }\r
4547                                                 CChip item = new CChip();\r
4548                                                 item.n発声位置 = num * 384;\r
4549                                                 item.nチャンネル番号 = c;\r
4550                                                 item.db実数値 = result;\r
4551                                                 this.listChip.Add( item );\r
4552                                                 return true;\r
4553                                         }\r
4554                         }\r
4555                         if( string.IsNullOrEmpty( strパラメータ ) )\r
4556                         {\r
4557                                 return false;\r
4558                         }\r
4559                         int num4 = 0;\r
4560                         StringBuilder builder = new StringBuilder( strパラメータ.Length );\r
4561                         CharEnumerator enumerator = strパラメータ.GetEnumerator();\r
4562                         while( enumerator.MoveNext() )\r
4563                         {\r
4564                                 if( enumerator.Current != '_' )\r
4565                                 {\r
4566                                         if( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf( enumerator.Current ) < 0 )\r
4567                                         {\r
4568                                                 Trace.TraceError( "不正なオブジェクト指定があります。[{0}: {1}行]", new object[] { this.strファイル名の絶対パス, this.n現在の行数 } );\r
4569                                                 return false;\r
4570                                         }\r
4571                                         builder.Append( enumerator.Current );\r
4572                                         num4++;\r
4573                                 }\r
4574                         }\r
4575                         strパラメータ = builder.ToString();\r
4576                         if( ( num4 % 2 ) != 0 )\r
4577                         {\r
4578                                 num4--;\r
4579                         }\r
4580                         for( int i = 0; i < ( num4 / 2 ); i++ )\r
4581                         {\r
4582                                 int index = 0;\r
4583                                 if( c == 3 )\r
4584                                 {\r
4585                                         index = C変換.n16進数2桁の文字列を数値に変換して返す( strパラメータ.Substring( i * 2, 2 ) );\r
4586                                 }\r
4587                                 else\r
4588                                 {\r
4589                                         index = C変換.n36進数2桁の文字列を数値に変換して返す( strパラメータ.Substring( i * 2, 2 ) );\r
4590                                 }\r
4591                                 if( index != 0 )\r
4592                                 {\r
4593                                         CChip chip2 = new CChip();\r
4594                                         chip2.n発声位置 = ( num * 384 ) + ( ( 384 * i ) / ( num4 / 2 ) );\r
4595                                         chip2.nチャンネル番号 = c;\r
4596                                         chip2.n整数値 = index;\r
4597                                         chip2.n整数値・内部番号 = index;\r
4598                                         if( ( c >= 0x11 ) && ( c <= 0x1a ) )\r
4599                                         {\r
4600                                                 chip2.e楽器パート = E楽器パート.DRUMS;\r
4601                                         }\r
4602                                         if( ( c >= 0x20 ) && ( c <= 0x27 ) )\r
4603                                         {\r
4604                                                 chip2.e楽器パート = E楽器パート.GUITAR;\r
4605                                         }\r
4606                                         if( ( c >= 160 ) && ( c <= 0xa7 ) )\r
4607                                         {\r
4608                                                 chip2.e楽器パート = E楽器パート.BASS;\r
4609                                         }\r
4610                                         if( chip2.bWAVを使うチャンネルである )\r
4611                                         {\r
4612                                                 chip2.n整数値・内部番号 = this.n無限管理WAV[ index ];\r
4613                                         }\r
4614                                         else if( chip2.bBPMチップである )\r
4615                                         {\r
4616                                                 chip2.n整数値・内部番号 = this.n無限管理BPM[ index ];\r
4617                                         }\r
4618                                         if( c == 0x53 )\r
4619                                         {\r
4620                                                 if( ( index > 0 ) && ( index != 2 ) )\r
4621                                                 {\r
4622                                                         chip2.n発声位置 -= 0x20;\r
4623                                                 }\r
4624                                                 else if( index == 2 )\r
4625                                                 {\r
4626                                                         chip2.n発声位置 += 0x20;\r
4627                                                 }\r
4628                                         }\r
4629                                         this.listChip.Add( chip2 );\r
4630                                 }\r
4631                         }\r
4632                         return true;\r
4633                 }\r
4634 \r
4635                 #region [#23880 2010.12.30 yyagi: コンマとスペースの両方を小数点として扱うTryParse]\r
4636                 /// <summary>\r
4637                 /// 小数点としてコンマとピリオドの両方を受け付けるTryParse()\r
4638                 /// </summary>\r
4639                 /// <param name="s">strings convert to double</param>\r
4640                 /// <param name="result">parsed double value</param>\r
4641                 /// <returns>s が正常に変換された場合は true。それ以外の場合は false。</returns>\r
4642                 /// <exception cref="ArgumentException">style が NumberStyles 値でないか、style に NumberStyles.AllowHexSpecifier 値が含まれている</exception>\r
4643                 private bool TryParse(string s, out double result) {    // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point\r
4644                                                                                                                                 // EU諸国での #BPM 123,45 のような記述に対応するため、\r
4645                                                                                                                                 // 小数点の最終位置を検出して、それをlocaleにあった\r
4646                                                                                                                                 // 文字に置き換えてからTryParse()する\r
4647                                                                                                                                 // 桁区切りの文字はスキップする\r
4648 \r
4649                         const string DecimalSeparators = ".,";                          // 小数点文字\r
4650                         const string GroupSeparators = ".,' ";                          // 桁区切り文字\r
4651                         const string NumberSymbols = "0123456789";                      // 数値文字\r
4652 \r
4653                         int len = s.Length;                                                                     // 文字列長\r
4654                         int decimalPosition = len;                                                      // 真の小数点の位置 最初は文字列終端位置に仮置きする\r
4655 \r
4656                         for (int i = 0; i < len; i++) {                                                 // まず、真の小数点(一番最後に現れる小数点)の位置を求める\r
4657                                 char c = s[i];\r
4658                                 if (NumberSymbols.IndexOf(c) >= 0) {                            // 数値だったらスキップ\r
4659                                         continue;\r
4660                                 } else if (DecimalSeparators.IndexOf(c) >= 0) {         // 小数点文字だったら、その都度位置を上書き記憶\r
4661                                         decimalPosition = i;\r
4662                                 } else if (GroupSeparators.IndexOf(c) >= 0) {           // 桁区切り文字の場合もスキップ\r
4663                                         continue;\r
4664                                 } else {                                                                                        // 数値・小数点・区切り文字以外がきたらループ終了\r
4665                                         break;\r
4666                                 }\r
4667                         }\r
4668 \r
4669                         StringBuilder decimalStr = new StringBuilder(16);\r
4670                         for (int i = 0; i < len; i++) {                                                 // 次に、localeにあった数値文字列を生成する\r
4671                                 char c = s[i];\r
4672                                 if (NumberSymbols.IndexOf(c) >= 0) {                            // 数値だったら\r
4673                                         decimalStr.Append(c);                                                   // そのままコピー\r
4674                                 } else if (DecimalSeparators.IndexOf(c) >= 0) {         // 小数点文字だったら\r
4675                                         if (i == decimalPosition) {                                             // 最後に出現した小数点文字なら、localeに合った小数点を出力する\r
4676                                                 decimalStr.Append(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);\r
4677                                         }\r
4678                                 } else if (GroupSeparators.IndexOf(c) >= 0) {           // 桁区切り文字だったら\r
4679                                         continue;                                                                               // 何もしない(スキップ)\r
4680                                 } else {\r
4681                                         break;\r
4682                                 }\r
4683                         }\r
4684                         return double.TryParse(decimalStr.ToString(), out result);      // 最後に、自分のlocale向けの文字列に対してTryParse実行\r
4685                 }\r
4686                 #endregion\r
4687                 //-----------------\r
4688                 #endregion\r
4689         }\r
4690 }\r