OSDN Git Service

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