OSDN Git Service

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