OSDN Git Service

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