OSDN Git Service

#36043 rev.920 で手違いが起きたため、一度 rev.919 に戻し、ファイルを再修正。Ech定義の使用を CChip のプロパティを使うよう一部変更。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / スコア、曲 / CDTXInput.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 System.Threading;\r
12 using FDK;\r
13 \r
14 namespace DTXMania\r
15 {\r
16         public partial class CDTX\r
17         {\r
18                 public void t入力(string strファイル名, bool bヘッダのみ)\r
19                 {\r
20                         this.t入力(strファイル名, bヘッダのみ, 1.0, 0);\r
21                 }\r
22                 public void t入力(string strファイル名, bool bヘッダのみ, double db再生速度, int nBGMAdjust)\r
23                 {\r
24                         this.bヘッダのみ = bヘッダのみ;\r
25                         this.strファイル名の絶対パス = Path.GetFullPath(strファイル名);\r
26                         this.strファイル名 = Path.GetFileName(this.strファイル名の絶対パス);\r
27                         this.strフォルダ名 = Path.GetDirectoryName(this.strファイル名の絶対パス) + @"\";\r
28                         string ext = Path.GetExtension(this.strファイル名).ToLower();\r
29                         if (ext != null)\r
30                         {\r
31                                 if (!(ext == ".dtx"))\r
32                                 {\r
33                                         if (ext == ".gda")\r
34                                         {\r
35                                                 this.e種別 = EDTX種別.GDA;\r
36                                         }\r
37                                         else if (ext == ".g2d")\r
38                                         {\r
39                                                 this.e種別 = EDTX種別.G2D;\r
40                                         }\r
41                                         else if (ext == ".bms")\r
42                                         {\r
43                                                 this.e種別 = EDTX種別.BMS;\r
44                                         }\r
45                                         else if (ext == ".bme")\r
46                                         {\r
47                                                 this.e種別 = EDTX種別.BME;\r
48                                         }\r
49                                         else if (ext == ".mid")\r
50                                         {\r
51                                                 this.e種別 = EDTX種別.SMF;\r
52                                         }\r
53                                 }\r
54                                 else\r
55                                 {\r
56                                         this.e種別 = EDTX種別.DTX;\r
57                                 }\r
58                         }\r
59                         if (this.e種別 != EDTX種別.SMF)\r
60                         {\r
61                                 try\r
62                                 {\r
63                                         //DateTime timeBeginLoad = DateTime.Now;\r
64                                         //TimeSpan span;\r
65 \r
66                                         StreamReader reader = new StreamReader(strファイル名, Encoding.GetEncoding("Shift_JIS"));\r
67                                         string str2 = reader.ReadToEnd();\r
68                                         reader.Close();\r
69                                         //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
70                                         //Trace.TraceInformation( "DTXfileload時間:          {0}", span.ToString() );\r
71 \r
72                                         this.t入力_全入力文字列から(str2, db再生速度, nBGMAdjust);\r
73                                 }\r
74                                 catch\r
75                                 {\r
76                                 }\r
77                         }\r
78                         else\r
79                         {\r
80                                 Trace.TraceWarning("SMF の演奏は未対応です。(検討中)");\r
81                         }\r
82                 }\r
83                 public void t入力_全入力文字列から(string str全入力文字列)\r
84                 {\r
85                         this.t入力_全入力文字列から(str全入力文字列, 1.0, 0);\r
86                 }\r
87                 public unsafe void t入力_全入力文字列から(string str全入力文字列, double db再生速度, int nBGMAdjust)\r
88                 {\r
89                         //DateTime timeBeginLoad = DateTime.Now;\r
90                         //TimeSpan span;\r
91 \r
92                         if (!string.IsNullOrEmpty(str全入力文字列))\r
93                         {\r
94                                 #region [ 改行カット ]\r
95                                 this.db再生速度 = db再生速度;\r
96                                 str全入力文字列 = str全入力文字列.Replace(Environment.NewLine, "\n");\r
97                                 str全入力文字列 = str全入力文字列.Replace('\t', ' ');\r
98                                 str全入力文字列 = str全入力文字列 + "\n";\r
99                                 #endregion\r
100                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
101                                 //Trace.TraceInformation( "改行カット時間:           {0}", span.ToString() );\r
102                                 //timeBeginLoad = DateTime.Now;\r
103                                 #region [ 初期化 ]\r
104                                 for (int j = 0; j < 36 * 36; j++)\r
105                                 {\r
106                                         this.n無限管理WAV[j] = -j;\r
107                                         this.n無限管理BPM[j] = -j;\r
108                                         this.n無限管理VOL[j] = -j;\r
109                                         this.n無限管理PAN[j] = -10000 - j;\r
110                                         this.n無限管理SIZE[j] = -j;\r
111                                 }\r
112                                 this.n内部番号WAV1to = 1;\r
113                                 this.n内部番号BPM1to = 1;\r
114                                 this.bstackIFからENDIFをスキップする = new Stack<bool>();\r
115                                 this.bstackIFからENDIFをスキップする.Push(false);\r
116                                 this.n現在の乱数 = 0;\r
117                                 for (int k = 0; k < 7; k++)\r
118                                 {\r
119                                         this.nRESULTIMAGE用優先順位[k] = 0;\r
120                                         this.nRESULTMOVIE用優先順位[k] = 0;\r
121                                         this.nRESULTSOUND用優先順位[k] = 0;\r
122                                 }\r
123                                 #endregion\r
124                                 #region [ 入力/行解析 ]\r
125                                 CharEnumerator ce = str全入力文字列.GetEnumerator();\r
126                                 if (ce.MoveNext())\r
127                                 {\r
128                                         this.n現在の行数 = 1;\r
129                                         do\r
130                                         {\r
131                                                 if (!this.t入力_空白と改行をスキップする(ref ce))\r
132                                                 {\r
133                                                         break;\r
134                                                 }\r
135                                                 if (ce.Current == '#')\r
136                                                 {\r
137                                                         if (ce.MoveNext())\r
138                                                         {\r
139                                                                 StringBuilder builder = new StringBuilder(0x20);\r
140                                                                 if (this.t入力_コマンド文字列を抜き出す(ref ce, ref builder))\r
141                                                                 {\r
142                                                                         StringBuilder builder2 = new StringBuilder(0x400);\r
143                                                                         if (this.t入力_パラメータ文字列を抜き出す(ref ce, ref builder2))\r
144                                                                         {\r
145                                                                                 StringBuilder builder3 = new StringBuilder(0x400);\r
146                                                                                 if (this.t入力_コメント文字列を抜き出す(ref ce, ref builder3))\r
147                                                                                 {\r
148                                                                                         this.t入力_行解析(ref builder, ref builder2, ref builder3);\r
149                                                                                         this.n現在の行数++;\r
150                                                                                         continue;\r
151                                                                                 }\r
152                                                                         }\r
153                                                                 }\r
154                                                         }\r
155                                                         break;\r
156                                                 }\r
157                                         }\r
158                                         while (this.t入力_コメントをスキップする(ref ce));\r
159                                 #endregion\r
160                                         //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
161                                         //Trace.TraceInformation( "抜き出し時間:             {0}", span.ToString() );\r
162                                         //timeBeginLoad = DateTime.Now;\r
163                                         this.n無限管理WAV = null;\r
164                                         this.n無限管理BPM = null;\r
165                                         this.n無限管理VOL = null;\r
166                                         this.n無限管理PAN = null;\r
167                                         this.n無限管理SIZE = null;\r
168                                         if (!this.bヘッダのみ)\r
169                                         {\r
170                                                 #region [ BPM/BMP初期化 ]\r
171                                                 CBPM cbpm = null;\r
172                                                 foreach (CBPM cbpm2 in this.listBPM.Values)\r
173                                                 {\r
174                                                         if (cbpm2.n表記上の番号 == 0)\r
175                                                         {\r
176                                                                 cbpm = cbpm2;\r
177                                                                 break;\r
178                                                         }\r
179                                                 }\r
180                                                 if (cbpm == null)\r
181                                                 {\r
182                                                         cbpm = new CBPM();\r
183                                                         cbpm.n内部番号 = this.n内部番号BPM1to++;\r
184                                                         cbpm.n表記上の番号 = 0;\r
185                                                         cbpm.dbBPM値 = 120.0;\r
186                                                         this.listBPM.Add(cbpm.n内部番号, cbpm);\r
187                                                         CChip chip = new CChip(0, 0, cbpm.n内部番号, Ech定義.BPMEx);\r
188                                                         this.listChip.Insert(0, chip);\r
189                                                 }\r
190                                                 else\r
191                                                 {\r
192                                                         CChip chip = new CChip(0, 0, cbpm.n内部番号, Ech定義.BPMEx);\r
193                                                         this.listChip.Insert(0, chip);\r
194                                                 }\r
195                                                 if (this.listBMP.ContainsKey(0))\r
196                                                 {\r
197                                                         CChip chip = new CChip(0, 0, 0, Ech定義.BGALayer1);\r
198                                                         this.listChip.Insert(0, chip);\r
199                                                 }\r
200                                                 #endregion\r
201                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
202                                                 //Trace.TraceInformation( "前準備完了時間:           {0}", span.ToString() );\r
203                                                 //timeBeginLoad = DateTime.Now;\r
204                                                 #region [ CWAV初期化 ]\r
205                                                 foreach (CWAV cwav in this.listWAV.Values)\r
206                                                 {\r
207                                                         if (cwav.nチップサイズ < 0)\r
208                                                         {\r
209                                                                 cwav.nチップサイズ = 100;\r
210                                                         }\r
211                                                         if (cwav.n位置 <= -10000)\r
212                                                         {\r
213                                                                 cwav.n位置 = 0;\r
214                                                         }\r
215                                                         if (cwav.n音量 < 0)\r
216                                                         {\r
217                                                                 cwav.n音量 = 100;\r
218                                                         }\r
219                                                 }\r
220                                                 #endregion\r
221                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
222                                                 //Trace.TraceInformation( "CWAV前準備時間:           {0}", span.ToString() );\r
223                                                 //timeBeginLoad = DateTime.Now;\r
224                                                 #region [ チップ倍率設定 ]                                               // #28145 2012.4.22 yyagi 二重ループを1重ループに変更して高速化)\r
225                                                 //foreach ( CWAV cwav in this.listWAV.Values )\r
226                                                 //{\r
227                                                 //    foreach( CChip chip in this.listChip )\r
228                                                 //    {\r
229                                                 //        if( chip.n整数値・内部番号 == cwav.n内部番号 )\r
230                                                 //        {\r
231                                                 //            chip.dbチップサイズ倍率 = ( (double) cwav.nチップサイズ ) / 100.0;\r
232                                                 //            if (chip.nチャンネル番号 == 0x01 ) // BGMだったら\r
233                                                 //            {\r
234                                                 //                cwav.bIsOnBGMLane = true;\r
235                                                 //            }\r
236                                                 //        }\r
237                                                 //    }\r
238                                                 //}\r
239                                                 foreach (CChip chip in this.listChip)\r
240                                                 {\r
241                                                         if (this.listWAV.ContainsKey(chip.n整数値_内部番号))\r
242                                                         //foreach ( CWAV cwav in this.listWAV.Values )\r
243                                                         {\r
244                                                                 CWAV cwav = this.listWAV[chip.n整数値_内部番号];\r
245                                                                 //      if ( chip.n整数値・内部番号 == cwav.n内部番号 )\r
246                                                                 //      {\r
247                                                                 chip.SetDBChipSizeFactor(((double)cwav.nチップサイズ) / 100.0);\r
248                                                                 //if ( chip.nチャンネル番号 == 0x01 )    // BGMだったら\r
249                                                                 //{\r
250                                                                 //      cwav.bIsOnBGMLane = true;\r
251                                                                 //}\r
252                                                                 //      }\r
253                                                         }\r
254                                                 }\r
255                                                 #endregion\r
256                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
257                                                 //Trace.TraceInformation( "CWAV全準備時間:           {0}", span.ToString() );\r
258                                                 //timeBeginLoad = DateTime.Now;\r
259                                                 #region [ 必要に応じて空打ち音を0小節に定義する ]\r
260                                                 //for ( int m = 0xb1; m <= 0xbc; m++ )                  // #28146 2012.4.21 yyagi; bb -> bc\r
261                                                 //{\r
262                                                 //    foreach ( CChip chip in this.listChip )\r
263                                                 //    {\r
264                                                 //        if ( chip.nチャンネル番号 == m )\r
265                                                 //        {\r
266                                                 //            CChip c = new CChip();\r
267                                                 //            c.n発声位置 = 0;\r
268                                                 //            c.nチャンネル番号 = chip.nチャンネル番号;\r
269                                                 //            c.n整数値 = chip.n整数値;\r
270                                                 //            c.n整数値・内部番号 = chip.n整数値・内部番号;\r
271                                                 //            this.listChip.Insert( 0, c );\r
272                                                 //            break;\r
273                                                 //        }\r
274                                                 //    }\r
275                                                 //}\r
276                                                 #endregion\r
277                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
278                                                 //Trace.TraceInformation( "空打確認時間:             {0}", span.ToString() );\r
279                                                 //timeBeginLoad = DateTime.Now;\r
280                                                 #region [ 拍子・拍線の挿入 ]\r
281                                                 if (this.listChip.Count > 0)\r
282                                                 {\r
283                                                         this.listChip.Sort();           // 高速化のためにはこれを削りたいが、listChipの最後がn発声位置の終端である必要があるので、\r
284                                                         // 保守性確保を優先してここでのソートは残しておく\r
285                                                         // なお、093時点では、このソートを削除しても動作するようにはしてある。\r
286                                                         // (ここまでの一部チップ登録を、listChip.Add(c)から同Insert(0,c)に変更してある)\r
287                                                         // これにより、数ms程度ながらここでのソートも高速化されている。\r
288                                                         double barlength = 1.0;\r
289                                                         int nEndOfSong = (this.listChip[this.listChip.Count - 1].n発声位置 + 384) - (this.listChip[this.listChip.Count - 1].n発声位置 % 384);\r
290                                                         for (int tick384 = 0; tick384 <= nEndOfSong; tick384 += 384)    // 小節線の挿入 (後に出てくる拍子線とループをまとめようとするなら、forループの終了条件の微妙な違いに注意が必要)\r
291                                                         {\r
292                                                                 CChip chip = new CChip(tick384, 36 * 36 - 1, Ech定義.BarLine);\r
293                                                                 this.listChip.Add(chip);\r
294                                                         }\r
295                                                         //this.listChip.Sort();                         // ここでのソートは不要。ただし最後にソートすること\r
296                                                         int nChipNo_BarLength = 0;\r
297                                                         int nChipNo_C1 = 0;\r
298                                                         for (int tick384 = 0; tick384 < nEndOfSong; tick384 += 384)\r
299                                                         {\r
300                                                                 int n発声位置_C1_同一小節内 = 0;\r
301                                                                 while ((nChipNo_C1 < this.listChip.Count) && (this.listChip[nChipNo_C1].n発声位置 < (tick384 + 384)))\r
302                                                                 {\r
303                                                                         if (this.listChip[nChipNo_C1].eチャンネル番号 == Ech定義.BeatLineShift)                                // 拍線シフトの検出\r
304                                                                         {\r
305                                                                                 n発声位置_C1_同一小節内 = this.listChip[nChipNo_C1].n発声位置 - tick384;\r
306                                                                         }\r
307                                                                         nChipNo_C1++;\r
308                                                                 }\r
309                                                                 if ((this.e種別 == EDTX種別.BMS) || (this.e種別 == EDTX種別.BME))\r
310                                                                 {\r
311                                                                         barlength = 1.0;\r
312                                                                 }\r
313                                                                 while ((nChipNo_BarLength < this.listChip.Count) && (this.listChip[nChipNo_BarLength].n発声位置 <= tick384))\r
314                                                                 {\r
315                                                                         if (this.listChip[nChipNo_BarLength].eチャンネル番号 == Ech定義.BarLength)             // bar lengthの検出\r
316                                                                         {\r
317                                                                                 barlength = this.listChip[nChipNo_BarLength].db実数値;\r
318                                                                         }\r
319                                                                         nChipNo_BarLength++;\r
320                                                                 }\r
321                                                                 for (int i = 0; i < 100; i++)                                                           // 拍線の挿入\r
322                                                                 {\r
323                                                                         int tickBeat = (int)(((double)(384 * i)) / (4.0 * barlength));\r
324                                                                         if ((tickBeat + n発声位置_C1_同一小節内) >= 384)\r
325                                                                         {\r
326                                                                                 break;\r
327                                                                         }\r
328                                                                         if (((tickBeat + n発声位置_C1_同一小節内) % 384) != 0)\r
329                                                                         {\r
330                                                                                 CChip chip = new CChip(tick384 + (tickBeat + n発声位置_C1_同一小節内), 36 * 36 - 1, Ech定義.BeatLine);\r
331                                                                                 this.listChip.Add(chip);\r
332                                                                         }\r
333                                                                 }\r
334                                                         }\r
335                                                         this.listChip.Sort();\r
336                                                 }\r
337                                                 #endregion\r
338                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
339                                                 //Trace.TraceInformation( "拍子・拍線挿入時間:       {0}", span.ToString() );\r
340                                                 //timeBeginLoad = DateTime.Now;\r
341                                                 #region [ C2 [拍線・小節線表示指定] の処理 ]               // #28145 2012.4.21 yyagi; 2重ループをほぼ1重にして高速化\r
342                                                 bool bShowBeatBarLine = true;\r
343                                                 for (int i = 0; i < this.listChip.Count; i++)\r
344                                                 {\r
345                                                         bool bChangedBeatBarStatus = false;\r
346                                                         if ((this.listChip[i].eチャンネル番号 == Ech定義.BeatLineDisplay))\r
347                                                         {\r
348                                                                 if (this.listChip[i].n整数値 == 1)                           // BAR/BEAT LINE = ON\r
349                                                                 {\r
350                                                                         bShowBeatBarLine = true;\r
351                                                                         bChangedBeatBarStatus = true;\r
352                                                                 }\r
353                                                                 else if (this.listChip[i].n整数値 == 2)                      // BAR/BEAT LINE = OFF\r
354                                                                 {\r
355                                                                         bShowBeatBarLine = false;\r
356                                                                         bChangedBeatBarStatus = true;\r
357                                                                 }\r
358                                                         }\r
359                                                         int startIndex = i;\r
360                                                         if (bChangedBeatBarStatus)                                                      // C2チップの前に50/51チップが来ている可能性に配慮\r
361                                                         {\r
362                                                                 while (startIndex > 0 && this.listChip[startIndex].n発声位置 == this.listChip[i].n発声位置)\r
363                                                                 {\r
364                                                                         startIndex--;\r
365                                                                 }\r
366                                                                 startIndex++;   // 1つ小さく過ぎているので、戻す\r
367                                                         }\r
368                                                         for (int j = startIndex; j <= i; j++)\r
369                                                         {\r
370                                                                 if (((this.listChip[j].eチャンネル番号 == Ech定義.BarLine) || (this.listChip[j].eチャンネル番号 == Ech定義.BeatLine)) &&\r
371                                                                         (this.listChip[j].n整数値 == (36 * 36 - 1)))\r
372                                                                 {\r
373                                                                         this.listChip[j].b可視 = bShowBeatBarLine;\r
374                                                                 }\r
375                                                         }\r
376                                                 }\r
377                                                 #endregion\r
378                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
379                                                 //Trace.TraceInformation( "C2 [拍線・小節線表示指定]:  {0}", span.ToString() );\r
380                                                 //timeBeginLoad = DateTime.Now;\r
381                                                 #region [ 発声時刻の計算 ]\r
382                                                 double bpm = 120.0;\r
383                                                 double dbBarLength = 1.0;\r
384                                                 int nPlayPosition = 0;\r
385                                                 int ms = 0;\r
386                                                 int nBar = 0;\r
387                                                 foreach (CChip chip in this.listChip)\r
388                                                 {\r
389                                                         chip.CalculatePlayPositionMs(e種別, BASEBPM, listBPM, listAVIPAN, listBGAPAN,\r
390                                                                 ref bpm, ref dbBarLength, ref nPlayPosition, ref ms, ref nBar);\r
391                                                 }\r
392                                                 if (this.db再生速度 > 0.0)\r
393                                                 {\r
394                                                         double _db再生速度 = (CDTXMania.Instance.DTXVmode.Enabled) ? this.dbDTXVPlaySpeed : this.db再生速度;\r
395                                                         foreach (CChip chip in this.listChip)\r
396                                                         {\r
397                                                                 chip.ApplyPlaySpeed(_db再生速度);\r
398                                                         }\r
399                                                 }\r
400                                                 #endregion\r
401                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
402                                                 //Trace.TraceInformation( "発声時刻計算:             {0}", span.ToString() );\r
403                                                 //timeBeginLoad = DateTime.Now;\r
404                                                 this.nBGMAdjust = 0;\r
405                                                 this.t各自動再生音チップの再生時刻を変更する(nBGMAdjust);\r
406                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
407                                                 //Trace.TraceInformation( "再生時刻変更:             {0}", span.ToString() );\r
408                                                 //timeBeginLoad = DateTime.Now;\r
409                                                 #region [ 可視チップ数カウント ]\r
410                                                 for (int n = 0; n < 12; n++)\r
411                                                 {\r
412                                                         this.n可視チップ数[n] = 0;\r
413                                                 }\r
414                                                 foreach (CChip chip in this.listChip)\r
415                                                 {\r
416                                                         Ech定義 c = chip.eチャンネル番号;\r
417                                                         if (chip.bDrums可視チップ && !chip.b空打ちチップである)\r
418                                                         {\r
419                                                                 this.n可視チップ数[c - Ech定義.HiHatClose]++;\r
420                                                         }\r
421                                                         if (chip.bGuitar可視チップ)\r
422                                                         {\r
423                                                                 this.n可視チップ数.Guitar++;\r
424                                                         }\r
425                                                         if (chip.bBass可視チップ)\r
426                                                         {\r
427                                                                 this.n可視チップ数.Bass++;\r
428                                                         }\r
429                                                 }\r
430                                                 #endregion\r
431                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
432                                                 //Trace.TraceInformation( "可視チップ数カウント      {0}", span.ToString() );\r
433                                                 //timeBeginLoad = DateTime.Now;\r
434                                                 #region [ チップの種類を分類し、対応するフラグを立てる ]\r
435                                                 foreach (CChip chip in this.listChip)\r
436                                                 {\r
437                                                         if ((\r
438                                                                 chip.bWAVを使うチャンネルである &&\r
439                                                                 this.listWAV.ContainsKey(chip.n整数値_内部番号)) &&\r
440                                                                 !this.listWAV[chip.n整数値_内部番号].listこのWAVを使用するチャンネル番号の集合.Contains(chip.eチャンネル番号))\r
441                                                         {\r
442                                                                 this.listWAV[chip.n整数値_内部番号].listこのWAVを使用するチャンネル番号の集合.Add(chip.eチャンネル番号);\r
443 \r
444                                                                 switch (chip.ESoundChipTypeを得る)\r
445                                                                 {\r
446                                                                         case ESoundChipType.Drums:\r
447                                                                                 if (!chip.b空打ちチップである)\r
448                                                                                 {\r
449                                                                                         this.listWAV[chip.n整数値_内部番号].bIsDrumsSound = true;\r
450                                                                                 }\r
451                                                                                 break;\r
452                                                                         case ESoundChipType.Guitar:\r
453                                                                                 this.listWAV[chip.n整数値_内部番号].bIsGuitarSound = true; break;\r
454                                                                         case ESoundChipType.Bass:\r
455                                                                                 this.listWAV[chip.n整数値_内部番号].bIsBassSound = true; break;\r
456                                                                         case ESoundChipType.SE:\r
457                                                                                 this.listWAV[chip.n整数値_内部番号].bIsSESound = true; break;\r
458                                                                         case ESoundChipType.BGM:\r
459                                                                                 this.listWAV[chip.n整数値_内部番号].bIsBGMSound = true; break;\r
460                                                                 }\r
461                                                         }\r
462                                                 }\r
463                                                 #endregion\r
464                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
465                                                 //Trace.TraceInformation( "ch番号集合確認:           {0}", span.ToString() );\r
466                                                 //timeBeginLoad = DateTime.Now;\r
467                                                 #region [ hash値計算 ]\r
468                                                 byte[] buffer = null;\r
469                                                 try\r
470                                                 {\r
471                                                         FileStream stream = new FileStream(this.strファイル名の絶対パス, FileMode.Open, FileAccess.Read);\r
472                                                         buffer = new byte[stream.Length];\r
473                                                         stream.Read(buffer, 0, (int)stream.Length);\r
474                                                         stream.Close();\r
475                                                 }\r
476                                                 catch (Exception exception)\r
477                                                 {\r
478                                                         Trace.TraceError(exception.Message);\r
479                                                         Trace.TraceError("DTXのハッシュの計算に失敗しました。({0})", this.strファイル名の絶対パス);\r
480                                                 }\r
481                                                 if (buffer != null)\r
482                                                 {\r
483                                                         byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(buffer);\r
484                                                         StringBuilder sb = new StringBuilder();\r
485                                                         foreach (byte b in buffer2)\r
486                                                         {\r
487                                                                 sb.Append(b.ToString("x2"));\r
488                                                         }\r
489                                                         this.strハッシュofDTXファイル = sb.ToString();\r
490                                                 }\r
491                                                 else\r
492                                                 {\r
493                                                         this.strハッシュofDTXファイル = "00000000000000000000000000000000";\r
494                                                 }\r
495                                                 #endregion\r
496                                                 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );\r
497                                                 //Trace.TraceInformation( "hash計算:                 {0}", span.ToString() );\r
498                                                 //timeBeginLoad = DateTime.Now;\r
499                                                 #region [ bLogDTX詳細ログ出力 ]\r
500                                                 if (CDTXMania.Instance.ConfigIni.bLogDTX詳細ログ出力)\r
501                                                 {\r
502                                                         foreach (CWAV cwav in this.listWAV.Values)\r
503                                                         {\r
504                                                                 Trace.TraceInformation(cwav.ToString());\r
505                                                         }\r
506                                                         foreach (CAVI cavi in this.listAVI.Values)\r
507                                                         {\r
508                                                                 Trace.TraceInformation(cavi.ToString());\r
509                                                         }\r
510                                                         foreach (CAVIPAN cavipan in this.listAVIPAN.Values)\r
511                                                         {\r
512                                                                 Trace.TraceInformation(cavipan.ToString());\r
513                                                         }\r
514                                                         foreach (CBGA cbga in this.listBGA.Values)\r
515                                                         {\r
516                                                                 Trace.TraceInformation(cbga.ToString());\r
517                                                         }\r
518                                                         foreach (CBGAPAN cbgapan in this.listBGAPAN.Values)\r
519                                                         {\r
520                                                                 Trace.TraceInformation(cbgapan.ToString());\r
521                                                         }\r
522                                                         foreach (CBMP cbmp in this.listBMP.Values)\r
523                                                         {\r
524                                                                 Trace.TraceInformation(cbmp.ToString());\r
525                                                         }\r
526                                                         foreach (CBMPTEX cbmptex in this.listBMPTEX.Values)\r
527                                                         {\r
528                                                                 Trace.TraceInformation(cbmptex.ToString());\r
529                                                         }\r
530                                                         foreach (CBPM cbpm3 in this.listBPM.Values)\r
531                                                         {\r
532                                                                 Trace.TraceInformation(cbpm3.ToString());\r
533                                                         }\r
534                                                         foreach (CChip chip in this.listChip)\r
535                                                         {\r
536                                                                 Trace.TraceInformation(chip.ToString());\r
537                                                         }\r
538                                                 }\r
539                                                 #endregion\r
540                                         }\r
541                                 }\r
542                         }\r
543                 }\r
544                 private bool t入力_コマンド文字列を抜き出す(ref CharEnumerator ce, ref StringBuilder sb文字列)\r
545                 {\r
546                         if (!this.t入力_空白をスキップする(ref ce))\r
547                                 return false;   // 文字が尽きた\r
548 \r
549                         #region [ コマンド終端文字(':')、半角空白、コメント開始文字(';')、改行のいずれかが出現するまでをコマンド文字列と見なし、sb文字列 にコピーする。]\r
550                         //-----------------\r
551                         while (ce.Current != ':' && ce.Current != ' ' && ce.Current != ';' && ce.Current != '\n')\r
552                         {\r
553                                 sb文字列.Append(ce.Current);\r
554 \r
555                                 if (!ce.MoveNext())\r
556                                         return false;   // 文字が尽きた\r
557                         }\r
558                         //-----------------\r
559                         #endregion\r
560 \r
561                         #region [ コマンド終端文字(':')で終端したなら、その次から空白をスキップしておく。]\r
562                         //-----------------\r
563                         if (ce.Current == ':')\r
564                         {\r
565                                 if (!ce.MoveNext())\r
566                                         return false;   // 文字が尽きた\r
567 \r
568                                 if (!this.t入力_空白をスキップする(ref ce))\r
569                                         return false;   // 文字が尽きた\r
570                         }\r
571                         //-----------------\r
572                         #endregion\r
573 \r
574                         return true;\r
575                 }\r
576                 private bool t入力_コメントをスキップする(ref CharEnumerator ce)\r
577                 {\r
578                         // 改行が現れるまでをコメントと見なしてスキップする。\r
579 \r
580                         while (ce.Current != '\n')\r
581                         {\r
582                                 if (!ce.MoveNext())\r
583                                         return false;   // 文字が尽きた\r
584                         }\r
585 \r
586                         // 改行の次の文字へ移動した結果を返す。\r
587 \r
588                         return ce.MoveNext();\r
589                 }\r
590                 private bool t入力_コメント文字列を抜き出す(ref CharEnumerator ce, ref StringBuilder sb文字列)\r
591                 {\r
592                         if (ce.Current != ';')          // コメント開始文字(';')じゃなければ正常帰還。\r
593                                 return true;\r
594 \r
595                         if (!ce.MoveNext())             // ';' の次で文字列が終わってたら終了帰還。\r
596                                 return false;\r
597 \r
598                         #region [ ';' の次の文字から '\n' の1つ前までをコメント文字列と見なし、sb文字列にコピーする。]\r
599                         //-----------------\r
600                         while (ce.Current != '\n')\r
601                         {\r
602                                 sb文字列.Append(ce.Current);\r
603 \r
604                                 if (!ce.MoveNext())\r
605                                         return false;\r
606                         }\r
607                         //-----------------\r
608                         #endregion\r
609 \r
610                         return true;\r
611                 }\r
612                 private void t入力_パラメータ食い込みチェック(string strコマンド名, ref string strコマンド, ref string strパラメータ)\r
613                 {\r
614                         if ((strコマンド.Length > strコマンド名.Length) && strコマンド.StartsWith(strコマンド名, StringComparison.OrdinalIgnoreCase))\r
615                         {\r
616                                 strパラメータ = strコマンド.Substring(strコマンド名.Length).Trim();\r
617                                 strコマンド = strコマンド.Substring(0, strコマンド名.Length);\r
618                         }\r
619                 }\r
620                 private bool t入力_パラメータ文字列を抜き出す(ref CharEnumerator ce, ref StringBuilder sb文字列)\r
621                 {\r
622                         if (!this.t入力_空白をスキップする(ref ce))\r
623                                 return false;   // 文字が尽きた\r
624 \r
625                         #region [ 改行またはコメント開始文字(';')が出現するまでをパラメータ文字列と見なし、sb文字列 にコピーする。]\r
626                         //-----------------\r
627                         while (ce.Current != '\n' && ce.Current != ';')\r
628                         {\r
629                                 sb文字列.Append(ce.Current);\r
630 \r
631                                 if (!ce.MoveNext())\r
632                                         return false;\r
633                         }\r
634                         //-----------------\r
635                         #endregion\r
636 \r
637                         return true;\r
638                 }\r
639                 private bool t入力_空白と改行をスキップする(ref CharEnumerator ce)\r
640                 {\r
641                         // 空白と改行が続く間はこれらをスキップする。\r
642 \r
643                         while (ce.Current == ' ' || ce.Current == '\n')\r
644                         {\r
645                                 if (ce.Current == '\n')\r
646                                         this.n現在の行数++;                // 改行文字では行番号が増える。\r
647 \r
648                                 if (!ce.MoveNext())\r
649                                         return false;   // 文字が尽きた\r
650                         }\r
651 \r
652                         return true;\r
653                 }\r
654                 private bool t入力_空白をスキップする(ref CharEnumerator ce)\r
655                 {\r
656                         // 空白が続く間はこれをスキップする。\r
657 \r
658                         while (ce.Current == ' ')\r
659                         {\r
660                                 if (!ce.MoveNext())\r
661                                         return false;   // 文字が尽きた\r
662                         }\r
663 \r
664                         return true;\r
665                 }\r
666                 private void t入力_行解析(ref StringBuilder sbコマンド, ref StringBuilder sbパラメータ, ref StringBuilder sbコメント)\r
667                 {\r
668                         string strコマンド = sbコマンド.ToString();\r
669                         string strパラメータ = sbパラメータ.ToString().Trim();\r
670                         string strコメント = sbコメント.ToString();\r
671 \r
672                         // 行頭コマンドの処理\r
673 \r
674                         #region [ IF ]\r
675                         //-----------------\r
676                         if (strコマンド.StartsWith("IF", StringComparison.OrdinalIgnoreCase))\r
677                         {\r
678                                 this.t入力_パラメータ食い込みチェック("IF", ref strコマンド, ref strパラメータ);\r
679 \r
680                                 if (this.bstackIFからENDIFをスキップする.Count == 255)\r
681                                 {\r
682                                         Trace.TraceWarning("#IF の入れ子の数が 255 を超えました。この #IF を無視します。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
683                                 }\r
684                                 else if (this.bstackIFからENDIFをスキップする.Peek())\r
685                                 {\r
686                                         this.bstackIFからENDIFをスキップする.Push(true);       // 親が true ならその入れ子も問答無用で true 。\r
687                                 }\r
688                                 else                                                                                                    // 親が false なら入れ子はパラメータと乱数を比較して結果を判断する。\r
689                                 {\r
690                                         int n数値 = 0;\r
691 \r
692                                         if (!int.TryParse(strパラメータ, out n数値))\r
693                                                 n数値 = 1;\r
694 \r
695                                         this.bstackIFからENDIFをスキップする.Push(n数値 != this.n現在の乱数);           // 乱数と数値が一致したら true 。\r
696                                 }\r
697                         }\r
698                         //-----------------\r
699                         #endregion\r
700                         #region [ ENDIF ]\r
701                         //-----------------\r
702                         else if (strコマンド.StartsWith("ENDIF", StringComparison.OrdinalIgnoreCase))\r
703                         {\r
704                                 this.t入力_パラメータ食い込みチェック("ENDIF", ref strコマンド, ref strパラメータ);\r
705 \r
706                                 if (this.bstackIFからENDIFをスキップする.Count > 1)\r
707                                 {\r
708                                         this.bstackIFからENDIFをスキップする.Pop();            // 入れ子を1つ脱出。\r
709                                 }\r
710                                 else\r
711                                 {\r
712                                         Trace.TraceWarning("#ENDIF に対応する #IF がありません。この #ENDIF を無視します。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
713                                 }\r
714                         }\r
715                         //-----------------\r
716                         #endregion\r
717 \r
718                         else if (!this.bstackIFからENDIFをスキップする.Peek())         // IF~ENDIF をスキップするなら以下はすべて無視。\r
719                         {\r
720                                 #region [ PATH_WAV ]\r
721                                 //-----------------\r
722                                 if (strコマンド.StartsWith("PATH_WAV", StringComparison.OrdinalIgnoreCase))\r
723                                 {\r
724                                         this.t入力_パラメータ食い込みチェック("PATH_WAV", ref strコマンド, ref strパラメータ);\r
725                                         this.PATH_WAV = strパラメータ;\r
726                                 }\r
727                                 //-----------------\r
728                                 #endregion\r
729                                 #region [ TITLE ]\r
730                                 //-----------------\r
731                                 else if (strコマンド.StartsWith("TITLE", StringComparison.OrdinalIgnoreCase))\r
732                                 {\r
733                                         this.t入力_パラメータ食い込みチェック("TITLE", ref strコマンド, ref strパラメータ);\r
734                                         this.TITLE = strパラメータ;\r
735                                 }\r
736                                 //-----------------\r
737                                 #endregion\r
738                                 #region [ ARTIST ]\r
739                                 //-----------------\r
740                                 else if (strコマンド.StartsWith("ARTIST", StringComparison.OrdinalIgnoreCase))\r
741                                 {\r
742                                         this.t入力_パラメータ食い込みチェック("ARTIST", ref strコマンド, ref strパラメータ);\r
743                                         this.ARTIST = strパラメータ;\r
744                                 }\r
745                                 //-----------------\r
746                                 #endregion\r
747                                 #region [ COMMENT ]\r
748                                 //-----------------\r
749                                 else if (strコマンド.StartsWith("COMMENT", StringComparison.OrdinalIgnoreCase))\r
750                                 {\r
751                                         this.t入力_パラメータ食い込みチェック("COMMENT", ref strコマンド, ref strパラメータ);\r
752                                         this.COMMENT = strパラメータ;\r
753                                 }\r
754                                 //-----------------\r
755                                 #endregion\r
756                                 #region [ DLEVEL, PLAYLEVEL ]\r
757                                 //-----------------\r
758                                 else if (\r
759                                         strコマンド.StartsWith("DLEVEL", StringComparison.OrdinalIgnoreCase) ||\r
760                                         strコマンド.StartsWith("PLAYLEVEL", StringComparison.OrdinalIgnoreCase))\r
761                                 {\r
762                                         this.t入力_パラメータ食い込みチェック("DLEVEL", ref strコマンド, ref strパラメータ);\r
763                                         this.t入力_パラメータ食い込みチェック("PLAYLEVEL", ref strコマンド, ref strパラメータ);\r
764 \r
765                                         int dlevel;\r
766                                         if (int.TryParse(strパラメータ, out dlevel))\r
767                                         {\r
768                                                 this.LEVEL.Drums = Math.Min(Math.Max(dlevel, 0), 100);  // 0~100 に丸める\r
769                                         }\r
770                                 }\r
771                                 //-----------------\r
772                                 #endregion\r
773                                 #region [ GLEVEL ]\r
774                                 //-----------------\r
775                                 else if (strコマンド.StartsWith("GLEVEL", StringComparison.OrdinalIgnoreCase))\r
776                                 {\r
777                                         this.t入力_パラメータ食い込みチェック("GLEVEL", ref strコマンド, ref strパラメータ);\r
778 \r
779                                         int glevel;\r
780                                         if (int.TryParse(strパラメータ, out glevel))\r
781                                         {\r
782                                                 this.LEVEL.Guitar = Math.Min(Math.Max(glevel, 0), 100);         // 0~100 に丸める\r
783                                         }\r
784                                 }\r
785                                 //-----------------\r
786                                 #endregion\r
787                                 #region [ BLEVEL ]\r
788                                 //-----------------\r
789                                 else if (strコマンド.StartsWith("BLEVEL", StringComparison.OrdinalIgnoreCase))\r
790                                 {\r
791                                         this.t入力_パラメータ食い込みチェック("BLEVEL", ref strコマンド, ref strパラメータ);\r
792 \r
793                                         int blevel;\r
794                                         if (int.TryParse(strパラメータ, out blevel))\r
795                                         {\r
796                                                 this.LEVEL.Bass = Math.Min(Math.Max(blevel, 0), 100);           // 0~100 に丸める\r
797                                         }\r
798                                 }\r
799                                 //-----------------\r
800                                 #endregion\r
801 #if TEST_NOTEOFFMODE\r
802                                 else if (str.StartsWith("SUPRESSNOTEOFF_HIHAT", StringComparison.OrdinalIgnoreCase)) {\r
803                                         this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_HIHAT", ref str, ref str2);\r
804                                         this.bHH演奏で直前のHHを消音する = !str2.ToLower().Equals("on");\r
805                                 } \r
806                                 else if (str.StartsWith("SUPRESSNOTEOFF_GUITAR", StringComparison.OrdinalIgnoreCase)) {\r
807                                         this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_GUITAR", ref str, ref str2);\r
808                                         this.bGUITAR演奏で直前のGUITARを消音する = !str2.ToLower().Equals("on");\r
809                                 }\r
810                                 else if (str.StartsWith("SUPRESSNOTEOFF_BASS", StringComparison.OrdinalIgnoreCase)) {\r
811                                         this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_BASS", ref str, ref str2);\r
812                                         this.bBASS演奏で直前のBASSを消音する = !str2.ToLower().Equals("on");\r
813                                 }\r
814 #endif\r
815                                 #region [ GENRE ]\r
816                                 //-----------------\r
817                                 else if (strコマンド.StartsWith("GENRE", StringComparison.OrdinalIgnoreCase))\r
818                                 {\r
819                                         this.t入力_パラメータ食い込みチェック("GENRE", ref strコマンド, ref strパラメータ);\r
820                                         this.GENRE = strパラメータ;\r
821                                 }\r
822                                 //-----------------\r
823                                 #endregion\r
824                                 #region [ HIDDENLEVEL ]\r
825                                 //-----------------\r
826                                 else if (strコマンド.StartsWith("HIDDENLEVEL", StringComparison.OrdinalIgnoreCase))\r
827                                 {\r
828                                         this.t入力_パラメータ食い込みチェック("HIDDENLEVEL", ref strコマンド, ref strパラメータ);\r
829                                         this.HIDDENLEVEL = strパラメータ.ToLower().Equals("on");\r
830                                 }\r
831                                 //-----------------\r
832                                 #endregion\r
833                                 #region [ STAGEFILE ]\r
834                                 //-----------------\r
835                                 else if (strコマンド.StartsWith("STAGEFILE", StringComparison.OrdinalIgnoreCase))\r
836                                 {\r
837                                         this.t入力_パラメータ食い込みチェック("STAGEFILE", ref strコマンド, ref strパラメータ);\r
838                                         this.STAGEFILE = strパラメータ;\r
839                                 }\r
840                                 //-----------------\r
841                                 #endregion\r
842                                 #region [ PREVIEW ]\r
843                                 //-----------------\r
844                                 else if (strコマンド.StartsWith("PREVIEW", StringComparison.OrdinalIgnoreCase))\r
845                                 {\r
846                                         this.t入力_パラメータ食い込みチェック("PREVIEW", ref strコマンド, ref strパラメータ);\r
847                                         this.PREVIEW = strパラメータ;\r
848                                 }\r
849                                 //-----------------\r
850                                 #endregion\r
851                                 #region [ PREIMAGE ]\r
852                                 //-----------------\r
853                                 else if (strコマンド.StartsWith("PREIMAGE", StringComparison.OrdinalIgnoreCase))\r
854                                 {\r
855                                         this.t入力_パラメータ食い込みチェック("PREIMAGE", ref strコマンド, ref strパラメータ);\r
856                                         this.PREIMAGE = strパラメータ;\r
857                                 }\r
858                                 //-----------------\r
859                                 #endregion\r
860                                 #region [ PREMOVIE ]\r
861                                 //-----------------\r
862                                 else if (strコマンド.StartsWith("PREMOVIE", StringComparison.OrdinalIgnoreCase))\r
863                                 {\r
864                                         this.t入力_パラメータ食い込みチェック("PREMOVIE", ref strコマンド, ref strパラメータ);\r
865                                         this.PREMOVIE = strパラメータ;\r
866                                 }\r
867                                 //-----------------\r
868                                 #endregion\r
869                                 #region [ USE 556 x 710 BGAAVI ]\r
870 \r
871                                 else if (strコマンド.StartsWith("USE556X710BGAAVI", StringComparison.OrdinalIgnoreCase))\r
872                                 {\r
873                                         this.t入力_パラメータ食い込みチェック("USE556X710BGAAVI", ref strコマンド, ref strパラメータ);\r
874                                         this.bUse556x710BGAAVI = strパラメータ == "1" ? true : false;\r
875                                 }\r
876                                 #endregion\r
877                                 #region [ BACKGROUND_GR ]\r
878                                 //-----------------\r
879                                 else if (strコマンド.StartsWith("BACKGROUND_GR", StringComparison.OrdinalIgnoreCase))\r
880                                 {\r
881                                         this.t入力_パラメータ食い込みチェック("BACKGROUND_GR", ref strコマンド, ref strパラメータ);\r
882                                         this.BACKGROUND_GR = strパラメータ;\r
883                                 }\r
884                                 //-----------------\r
885                                 #endregion\r
886                                 #region [ BACKGROU}ND, WALL ]\r
887                                 //-----------------\r
888                                 else if (\r
889                                         strコマンド.StartsWith("BACKGROUND", StringComparison.OrdinalIgnoreCase) ||\r
890                                         strコマンド.StartsWith("WALL", StringComparison.OrdinalIgnoreCase))\r
891                                 {\r
892                                         this.t入力_パラメータ食い込みチェック("BACKGROUND", ref strコマンド, ref strパラメータ);\r
893                                         this.t入力_パラメータ食い込みチェック("WALL", ref strコマンド, ref strパラメータ);\r
894                                         this.BACKGROUND = strパラメータ;\r
895                                 }\r
896                                 //-----------------\r
897                                 #endregion\r
898                                 #region [ RANDOM ]\r
899                                 //-----------------\r
900                                 else if (strコマンド.StartsWith("RANDOM", StringComparison.OrdinalIgnoreCase))\r
901                                 {\r
902                                         this.t入力_パラメータ食い込みチェック("RANDOM", ref strコマンド, ref strパラメータ);\r
903 \r
904                                         int n数値 = 1;\r
905                                         if (!int.TryParse(strパラメータ, out n数値))\r
906                                                 n数値 = 1;\r
907 \r
908                                         this.n現在の乱数 = CDTXMania.Instance.Random.Next(n数値) + 1;            // 1~数値 までの乱数を生成。\r
909                                 }\r
910                                 //-----------------\r
911                                 #endregion\r
912                                 #region [ SOUND_NOWLOADING ]\r
913                                 //-----------------\r
914                                 else if (strコマンド.StartsWith("SOUND_NOWLOADING", StringComparison.OrdinalIgnoreCase))\r
915                                 {\r
916                                         this.t入力_パラメータ食い込みチェック("SOUND_NOWLOADING", ref strコマンド, ref strパラメータ);\r
917                                         this.SOUND_NOWLOADING = strパラメータ;\r
918                                 }\r
919                                 //-----------------\r
920                                 #endregion\r
921                                 #region [ BPM ]\r
922                                 //-----------------\r
923                                 else if (strコマンド.StartsWith("BPM", StringComparison.OrdinalIgnoreCase))\r
924                                 {\r
925                                         this.t入力_行解析_BPM_BPMzz(strコマンド, strパラメータ, strコメント);\r
926                                 }\r
927                                 //-----------------\r
928                                 #endregion\r
929                                 #region [ DTXVPLAYSPEED ]\r
930                                 //-----------------\r
931                                 else if (strコマンド.StartsWith("DTXVPLAYSPEED", StringComparison.OrdinalIgnoreCase))\r
932                                 {\r
933                                         this.t入力_パラメータ食い込みチェック("DTXVPLAYSPEED", ref strコマンド, ref strパラメータ);\r
934 \r
935                                         double dtxvplayspeed = 0.0;\r
936                                         if (TryParse(strパラメータ, out dtxvplayspeed) && dtxvplayspeed > 0.0)\r
937                                         {\r
938                                                 this.dbDTXVPlaySpeed = dtxvplayspeed;\r
939                                         }\r
940                                 }\r
941                                 //-----------------\r
942                                 #endregion\r
943                                 else if (!this.bヘッダのみ)                // ヘッダのみの解析の場合、以下は無視。\r
944                                 {\r
945                                         #region [ PANEL ]\r
946                                         //-----------------\r
947                                         if (strコマンド.StartsWith("PANEL", StringComparison.OrdinalIgnoreCase))\r
948                                         {\r
949                                                 this.t入力_パラメータ食い込みチェック("PANEL", ref strコマンド, ref strパラメータ);\r
950 \r
951                                                 int dummyResult;                                                                // #23885 2010.12.12 yyagi: not to confuse "#PANEL strings (panel)" and "#PANEL int (panpot of EL)"\r
952                                                 if (!int.TryParse(strパラメータ, out dummyResult))\r
953                                                 {               // 数値じゃないならPANELとみなす\r
954                                                         this.PANEL = strパラメータ;                                                        //\r
955                                                         goto EOL;                                                                       //\r
956                                                 }                                                                                               // 数値ならPAN ELとみなす\r
957 \r
958                                         }\r
959                                         //-----------------\r
960                                         #endregion\r
961                                         #region [ MIDIFILE ]\r
962                                         //-----------------\r
963                                         else if (strコマンド.StartsWith("MIDIFILE", StringComparison.OrdinalIgnoreCase))\r
964                                         {\r
965                                                 this.t入力_パラメータ食い込みチェック("MIDIFILE", ref strコマンド, ref strパラメータ);\r
966                                                 this.MIDIFILE = strパラメータ;\r
967                                         }\r
968                                         //-----------------\r
969                                         #endregion\r
970                                         #region [ MIDINOTE ]\r
971                                         //-----------------\r
972                                         else if (strコマンド.StartsWith("MIDINOTE", StringComparison.OrdinalIgnoreCase))\r
973                                         {\r
974                                                 this.t入力_パラメータ食い込みチェック("MIDINOTE", ref strコマンド, ref strパラメータ);\r
975                                                 this.MIDINOTE = strパラメータ.ToLower().Equals("on");\r
976                                         }\r
977                                         //-----------------\r
978                                         #endregion\r
979                                         #region [ BLACKCOLORKEY ]\r
980                                         //-----------------\r
981                                         else if (strコマンド.StartsWith("BLACKCOLORKEY", StringComparison.OrdinalIgnoreCase))\r
982                                         {\r
983                                                 this.t入力_パラメータ食い込みチェック("BLACKCOLORKEY", ref strコマンド, ref strパラメータ);\r
984                                                 this.BLACKCOLORKEY = strパラメータ.ToLower().Equals("on");\r
985                                         }\r
986                                         //-----------------\r
987                                         #endregion\r
988                                         #region [ BASEBPM ]\r
989                                         //-----------------\r
990                                         else if (strコマンド.StartsWith("BASEBPM", StringComparison.OrdinalIgnoreCase))\r
991                                         {\r
992                                                 this.t入力_パラメータ食い込みチェック("BASEBPM", ref strコマンド, ref strパラメータ);\r
993 \r
994                                                 double basebpm = 0.0;\r
995                                                 //if( double.TryParse( str2, out num6 ) && ( num6 > 0.0 ) )\r
996                                                 if (TryParse(strパラメータ, out basebpm) && basebpm > 0.0) // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point\r
997                                                 {                                                                                                       // #24204 2011.01.21 yyagi: Fix the condition correctly\r
998                                                         this.BASEBPM = basebpm;\r
999                                                 }\r
1000                                         }\r
1001                                         //-----------------\r
1002                                         #endregion\r
1003                                         #region [ SOUND_STAGEFAILED ]\r
1004                                         //-----------------\r
1005                                         else if (strコマンド.StartsWith("SOUND_STAGEFAILED", StringComparison.OrdinalIgnoreCase))\r
1006                                         {\r
1007                                                 this.t入力_パラメータ食い込みチェック("SOUND_STAGEFAILED", ref strコマンド, ref strパラメータ);\r
1008                                                 this.SOUND_STAGEFAILED = strパラメータ;\r
1009                                         }\r
1010                                         //-----------------\r
1011                                         #endregion\r
1012                                         #region [ SOUND_FULLCOMBO ]\r
1013                                         //-----------------\r
1014                                         else if (strコマンド.StartsWith("SOUND_FULLCOMBO", StringComparison.OrdinalIgnoreCase))\r
1015                                         {\r
1016                                                 this.t入力_パラメータ食い込みチェック("SOUND_FULLCOMBO", ref strコマンド, ref strパラメータ);\r
1017                                                 this.SOUND_FULLCOMBO = strパラメータ;\r
1018                                         }\r
1019                                         //-----------------\r
1020                                         #endregion\r
1021                                         #region [ SOUND_AUDIENCE ]\r
1022                                         //-----------------\r
1023                                         else if (strコマンド.StartsWith("SOUND_AUDIENCE", StringComparison.OrdinalIgnoreCase))\r
1024                                         {\r
1025                                                 this.t入力_パラメータ食い込みチェック("SOUND_AUDIENCE", ref strコマンド, ref strパラメータ);\r
1026                                                 this.SOUND_AUDIENCE = strパラメータ;\r
1027                                         }\r
1028                                         //-----------------\r
1029                                         #endregion\r
1030 \r
1031                                         // オブジェクト記述コマンドの処理。\r
1032 \r
1033                                         else if (!this.t入力_行解析_WAVVOL_VOLUME(strコマンド, strパラメータ, strコメント) &&\r
1034                                                 !this.t入力_行解析_WAVPAN_PAN(strコマンド, strパラメータ, strコメント) &&\r
1035                                                 !this.t入力_行解析_WAV(strコマンド, strパラメータ, strコメント) &&\r
1036                                                 !this.t入力_行解析_BMPTEX(strコマンド, strパラメータ, strコメント) &&\r
1037                                                 !this.t入力_行解析_BMP(strコマンド, strパラメータ, strコメント) &&\r
1038                                                 !this.t入力_行解析_BGAPAN(strコマンド, strパラメータ, strコメント) &&\r
1039                                                 !this.t入力_行解析_BGA(strコマンド, strパラメータ, strコメント) &&\r
1040                                                 !this.t入力_行解析_AVIPAN(strコマンド, strパラメータ, strコメント) &&\r
1041                                                 !this.t入力_行解析_AVI_VIDEO(strコマンド, strパラメータ, strコメント) &&\r
1042                                                 //      !this.t入力_行解析_BPM_BPMzz( strコマンド, strパラメータ, strコメント ) &&    // bヘッダのみ==trueの場合でもチェックするよう変更\r
1043                                                 !this.t入力_行解析_RESULTIMAGE(strコマンド, strパラメータ, strコメント) &&\r
1044                                                 !this.t入力_行解析_RESULTMOVIE(strコマンド, strパラメータ, strコメント) &&\r
1045                                                 !this.t入力_行解析_RESULTSOUND(strコマンド, strパラメータ, strコメント) &&\r
1046                                                 !this.t入力_行解析_SIZE(strコマンド, strパラメータ, strコメント))\r
1047                                         {\r
1048                                                 this.t入力_行解析_チップ配置(strコマンド, strパラメータ, strコメント);\r
1049                                         }\r
1050                                 EOL:\r
1051                                         Debug.Assert(true);             // #23885 2010.12.12 yyagi: dummy line to exit parsing the line\r
1052                                         // 2011.8.17 from: "int xx=0;" から変更。毎回警告が出るので。\r
1053                                 }\r
1054                                 //else\r
1055                                 //{     // Duration測定のため、bヘッダのみ==trueでも、チップ配置は行う\r
1056                                 //      this.t入力・行解析・チップ配置( strコマンド, strパラメータ, strコメント );\r
1057                                 //}\r
1058                         }\r
1059                 }\r
1060                 private bool t入力_行解析_AVI_VIDEO(string strコマンド, string strパラメータ, string strコメント)\r
1061                 {\r
1062                         // (1) コマンドを処理。\r
1063 \r
1064                         #region [ "AVI" or "VIDEO" で始まらないコマンドは無効。]\r
1065                         //-----------------\r
1066                         if (strコマンド.StartsWith("AVI", StringComparison.OrdinalIgnoreCase))\r
1067                                 strコマンド = strコマンド.Substring(3);         // strコマンド から先頭の"AVI"文字を除去。\r
1068 \r
1069                         else if (strコマンド.StartsWith("VIDEO", StringComparison.OrdinalIgnoreCase))\r
1070                                 strコマンド = strコマンド.Substring(5);         // strコマンド から先頭の"VIDEO"文字を除去。\r
1071 \r
1072                         else\r
1073                                 return false;\r
1074                         //-----------------\r
1075                         #endregion\r
1076 \r
1077                         // (2) パラメータを処理。\r
1078 \r
1079                         if (strコマンド.Length < 2)\r
1080                                 return false;   // AVI番号 zz がないなら無効。\r
1081 \r
1082                         #region [ AVI番号 zz を取得する。]\r
1083                         //-----------------\r
1084                         int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
1085                         if (zz < 0 || zz >= 36 * 36)\r
1086                         {\r
1087                                 Trace.TraceError("AVI(VIDEO)番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1088                                 return false;\r
1089                         }\r
1090                         //-----------------\r
1091                         #endregion\r
1092 \r
1093                         #region [ AVIリストに {zz, avi} の組を登録する。 ]\r
1094                         //-----------------\r
1095                         var avi = new CAVI(zz, strパラメータ, strコメント, CDTXMania.Instance.ConfigIni.n演奏速度);\r
1096 \r
1097                         if (this.listAVI.ContainsKey(zz))       // 既にリスト中に存在しているなら削除。後のものが有効。\r
1098                                 this.listAVI.Remove(zz);\r
1099 \r
1100                         this.listAVI.Add(zz, avi);\r
1101                         //-----------------\r
1102                         #endregion\r
1103 \r
1104                         return true;\r
1105                 }\r
1106                 private bool t入力_行解析_AVIPAN(string strコマンド, string strパラメータ, string strコメント)\r
1107                 {\r
1108                         // (1) コマンドを処理。\r
1109 \r
1110                         #region [ "AVIPAN" で始まらないコマンドは無効。]\r
1111                         //-----------------\r
1112                         if (!strコマンド.StartsWith("AVIPAN", StringComparison.OrdinalIgnoreCase))\r
1113                                 return false;\r
1114 \r
1115                         strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"AVIPAN"文字を除去。\r
1116                         //-----------------\r
1117                         #endregion\r
1118 \r
1119                         // (2) パラメータを処理。\r
1120 \r
1121                         if (strコマンド.Length < 2)\r
1122                                 return false;   // AVIPAN番号 zz がないなら無効。\r
1123 \r
1124                         #region [ AVIPAN番号 zz を取得する。]\r
1125                         //-----------------\r
1126                         int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
1127                         if (zz < 0 || zz >= 36 * 36)\r
1128                         {\r
1129                                 Trace.TraceError("AVIPAN番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1130                                 return false;\r
1131                         }\r
1132                         //-----------------\r
1133                         #endregion\r
1134 \r
1135                         var avipan = new CAVIPAN()\r
1136                         {\r
1137                                 n番号 = zz,\r
1138                         };\r
1139 \r
1140                         // パラメータ引数(14個)を取得し、avipan に登録していく。\r
1141 \r
1142                         string[] strParams = strパラメータ.Split(new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries);\r
1143 \r
1144                         #region [ パラメータ引数は全14個ないと無効。]\r
1145                         //-----------------\r
1146                         if (strParams.Length < 14)\r
1147                         {\r
1148                                 Trace.TraceError("AVIPAN: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1149                                 return false;\r
1150                         }\r
1151                         //-----------------\r
1152                         #endregion\r
1153 \r
1154                         int i = 0;\r
1155                         int n値 = 0;\r
1156 \r
1157                         #region [ 1. AVI番号 ]\r
1158                         //-----------------\r
1159                         if (string.IsNullOrEmpty(strParams[i]) || strParams[i].Length > 2)\r
1160                         {\r
1161                                 Trace.TraceError("AVIPAN: {2}番目の数(AVI番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1162                                 return false;\r
1163                         }\r
1164                         avipan.nAVI番号 = C変換.n36進数2桁の文字列を数値に変換して返す(strParams[i]);\r
1165                         if (avipan.nAVI番号 < 1 || avipan.nAVI番号 >= 36 * 36)\r
1166                         {\r
1167                                 Trace.TraceError("AVIPAN: {2}番目の数(AVI番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1168                                 return false;\r
1169                         }\r
1170                         i++;\r
1171                         //-----------------\r
1172                         #endregion\r
1173                         #region [ 2. 開始転送サイズ・幅 ]\r
1174                         //-----------------\r
1175                         n値 = 0;\r
1176                         if (!int.TryParse(strParams[i], out n値))\r
1177                         {\r
1178                                 Trace.TraceError("AVIPAN: {2}番目の引数(開始転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1179                                 return false;\r
1180                         }\r
1181                         avipan.sz開始サイズ.Width = n値;\r
1182                         i++;\r
1183                         //-----------------\r
1184                         #endregion\r
1185                         #region [ 3. 転送サイズ・高さ ]\r
1186                         //-----------------\r
1187                         n値 = 0;\r
1188                         if (!int.TryParse(strParams[i], out n値))\r
1189                         {\r
1190                                 Trace.TraceError("AVIPAN: {2}番目の引数(開始転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1191                                 return false;\r
1192                         }\r
1193                         avipan.sz開始サイズ.Height = n値;\r
1194                         i++;\r
1195                         //-----------------\r
1196                         #endregion\r
1197                         #region [ 4. 終了転送サイズ・幅 ]\r
1198                         //-----------------\r
1199                         n値 = 0;\r
1200                         if (!int.TryParse(strParams[i], out n値))\r
1201                         {\r
1202                                 Trace.TraceError("AVIPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1203                                 return false;\r
1204                         }\r
1205                         avipan.sz終了サイズ.Width = n値;\r
1206                         i++;\r
1207                         //-----------------\r
1208                         #endregion\r
1209                         #region [ 5. 終了転送サイズ・高さ ]\r
1210                         //-----------------\r
1211                         n値 = 0;\r
1212                         if (!int.TryParse(strParams[i], out n値))\r
1213                         {\r
1214                                 Trace.TraceError("AVIPAN: {2}番目の引数(終了転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1215                                 return false;\r
1216                         }\r
1217                         avipan.sz終了サイズ.Height = n値;\r
1218                         i++;\r
1219                         //-----------------\r
1220                         #endregion\r
1221                         #region [ 6. 動画側開始位置・X ]\r
1222                         //-----------------\r
1223                         n値 = 0;\r
1224                         if (!int.TryParse(strParams[i], out n値))\r
1225                         {\r
1226                                 Trace.TraceError("AVIPAN: {2}番目の引数(動画側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1227                                 return false;\r
1228                         }\r
1229                         avipan.pt動画側開始位置.X = n値;\r
1230                         i++;\r
1231                         //-----------------\r
1232                         #endregion\r
1233                         #region [ 7. 動画側開始位置・Y ]\r
1234                         //-----------------\r
1235                         n値 = 0;\r
1236                         if (!int.TryParse(strParams[i], out n値))\r
1237                         {\r
1238                                 Trace.TraceError("AVIPAN: {2}番目の引数(動画側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1239                                 return false;\r
1240                         }\r
1241                         avipan.pt動画側開始位置.Y = n値;\r
1242                         i++;\r
1243                         //-----------------\r
1244                         #endregion\r
1245                         #region [ 8. 動画側終了位置・X ]\r
1246                         //-----------------\r
1247                         n値 = 0;\r
1248                         if (!int.TryParse(strParams[i], out n値))\r
1249                         {\r
1250                                 Trace.TraceError("AVIPAN: {2}番目の引数(動画側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1251                                 return false;\r
1252                         }\r
1253                         avipan.pt動画側終了位置.X = n値;\r
1254                         i++;\r
1255                         //-----------------\r
1256                         #endregion\r
1257                         #region [ 9. 動画側終了位置・Y ]\r
1258                         //-----------------\r
1259                         n値 = 0;\r
1260                         if (!int.TryParse(strParams[i], out n値))\r
1261                         {\r
1262                                 Trace.TraceError("AVIPAN: {2}番目の引数(動画側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1263                                 return false;\r
1264                         }\r
1265                         avipan.pt動画側終了位置.Y = n値;\r
1266                         i++;\r
1267                         //-----------------\r
1268                         #endregion\r
1269                         #region [ 10.表示側開始位置・X ]\r
1270                         //-----------------\r
1271                         n値 = 0;\r
1272                         if (!int.TryParse(strParams[i], out n値))\r
1273                         {\r
1274                                 Trace.TraceError("AVIPAN: {2}番目の引数(表示側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1275                                 return false;\r
1276                         }\r
1277                         avipan.pt表示側開始位置.X = n値;\r
1278                         i++;\r
1279                         //-----------------\r
1280                         #endregion\r
1281                         #region [ 11.表示側開始位置・Y ]\r
1282                         //-----------------\r
1283                         n値 = 0;\r
1284                         if (!int.TryParse(strParams[i], out n値))\r
1285                         {\r
1286                                 Trace.TraceError("AVIPAN: {2}番目の引数(表示側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1287                                 return false;\r
1288                         }\r
1289                         avipan.pt表示側開始位置.Y = n値;\r
1290                         i++;\r
1291                         //-----------------\r
1292                         #endregion\r
1293                         #region [ 12.表示側終了位置・X ]\r
1294                         //-----------------\r
1295                         n値 = 0;\r
1296                         if (!int.TryParse(strParams[i], out n値))\r
1297                         {\r
1298                                 Trace.TraceError("AVIPAN: {2}番目の引数(表示側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1299                                 return false;\r
1300                         }\r
1301                         avipan.pt表示側終了位置.X = n値;\r
1302                         i++;\r
1303                         //-----------------\r
1304                         #endregion\r
1305                         #region [ 13.表示側終了位置・Y ]\r
1306                         //-----------------\r
1307                         n値 = 0;\r
1308                         if (!int.TryParse(strParams[i], out n値))\r
1309                         {\r
1310                                 Trace.TraceError("AVIPAN: {2}番目の引数(表示側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1311                                 return false;\r
1312                         }\r
1313                         avipan.pt表示側終了位置.Y = n値;\r
1314                         i++;\r
1315                         //-----------------\r
1316                         #endregion\r
1317                         #region [ 14.移動時間 ]\r
1318                         //-----------------\r
1319                         n値 = 0;\r
1320                         if (!int.TryParse(strParams[i], out n値))\r
1321                         {\r
1322                                 Trace.TraceError("AVIPAN: {2}番目の引数(移動時間)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1323                                 return false;\r
1324                         }\r
1325 \r
1326                         if (n値 < 0)\r
1327                                 n値 = 0;\r
1328 \r
1329                         avipan.n移動時間ct = n値;\r
1330                         i++;\r
1331                         //-----------------\r
1332                         #endregion\r
1333 \r
1334                         #region [ AVIPANリストに {zz, avipan} の組を登録する。]\r
1335                         //-----------------\r
1336                         if (this.listAVIPAN.ContainsKey(zz))    // 既にリスト中に存在しているなら削除。後のものが有効。\r
1337                                 this.listAVIPAN.Remove(zz);\r
1338 \r
1339                         this.listAVIPAN.Add(zz, avipan);\r
1340                         //-----------------\r
1341                         #endregion\r
1342 \r
1343                         return true;\r
1344                 }\r
1345                 private bool t入力_行解析_BGA(string strコマンド, string strパラメータ, string strコメント)\r
1346                 {\r
1347                         // (1) コマンドを処理。\r
1348 \r
1349                         #region [ "BGA" で始まらないコマンドは無効。]\r
1350                         //-----------------\r
1351                         if (!strコマンド.StartsWith("BGA", StringComparison.OrdinalIgnoreCase))\r
1352                                 return false;\r
1353 \r
1354                         strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"BGA"文字を除去。\r
1355                         //-----------------\r
1356                         #endregion\r
1357 \r
1358                         // (2) パラメータを処理。\r
1359 \r
1360                         if (strコマンド.Length < 2)\r
1361                                 return false;   // BGA番号 zz がないなら無効。\r
1362 \r
1363                         #region [ BGA番号 zz を取得する。]\r
1364                         //-----------------\r
1365                         int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
1366                         if (zz < 0 || zz >= 36 * 36)\r
1367                         {\r
1368                                 Trace.TraceError("BGA番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1369                                 return false;\r
1370                         }\r
1371                         //-----------------\r
1372                         #endregion\r
1373 \r
1374                         var bga = new CBGA()\r
1375                         {\r
1376                                 n番号 = zz,\r
1377                         };\r
1378 \r
1379                         // パラメータ引数(7個)を取得し、bga に登録していく。\r
1380 \r
1381                         string[] strParams = strパラメータ.Split(new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries);\r
1382 \r
1383                         #region [ パラメータ引数は全7個ないと無効。]\r
1384                         //-----------------\r
1385                         if (strParams.Length < 7)\r
1386                         {\r
1387                                 Trace.TraceError("BGA: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1388                                 return false;\r
1389                         }\r
1390                         //-----------------\r
1391                         #endregion\r
1392 \r
1393                         int i = 0;\r
1394                         int n値 = 0;\r
1395 \r
1396                         #region [ 1.BMP番号 ]\r
1397                         //-----------------\r
1398                         if (string.IsNullOrEmpty(strParams[i]) || strParams[i].Length > 2)\r
1399                         {\r
1400                                 Trace.TraceError("BGA: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1401                                 return false;\r
1402                         }\r
1403                         bga.nBMP番号 = C変換.n36進数2桁の文字列を数値に変換して返す(strParams[i]);\r
1404                         if (bga.nBMP番号 < 1 || bga.nBMP番号 >= 36 * 36)\r
1405                         {\r
1406                                 Trace.TraceError("BGA: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1407                                 return false;\r
1408                         }\r
1409                         i++;\r
1410                         //-----------------\r
1411                         #endregion\r
1412                         #region [ 2.画像側位置1・X ]\r
1413                         //-----------------\r
1414                         n値 = 0;\r
1415                         if (!int.TryParse(strParams[i], out n値))\r
1416                         {\r
1417                                 Trace.TraceError("BGA: {2}番目の引数(画像側位置1・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1418                                 return false;\r
1419                         }\r
1420                         bga.pt画像側左上座標.X = n値;\r
1421                         i++;\r
1422                         //-----------------\r
1423                         #endregion\r
1424                         #region [ 3.画像側位置1・Y ]\r
1425                         //-----------------\r
1426                         n値 = 0;\r
1427                         if (!int.TryParse(strParams[i], out n値))\r
1428                         {\r
1429                                 Trace.TraceError("BGA: {2}番目の引数(画像側位置1・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1430                                 return false;\r
1431                         }\r
1432                         bga.pt画像側左上座標.Y = n値;\r
1433                         i++;\r
1434                         //-----------------\r
1435                         #endregion\r
1436                         #region [ 4.画像側位置2・X ]\r
1437                         //-----------------\r
1438                         n値 = 0;\r
1439                         if (!int.TryParse(strParams[i], out n値))\r
1440                         {\r
1441                                 Trace.TraceError("BGA: {2}番目の引数(画像側位置2・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1442                                 return false;\r
1443                         }\r
1444                         bga.pt画像側右下座標.X = n値;\r
1445                         i++;\r
1446                         //-----------------\r
1447                         #endregion\r
1448                         #region [ 5.画像側位置2・Y ]\r
1449                         //-----------------\r
1450                         n値 = 0;\r
1451                         if (!int.TryParse(strParams[i], out n値))\r
1452                         {\r
1453                                 Trace.TraceError("BGA: {2}番目の引数(画像側座標2・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1454                                 return false;\r
1455                         }\r
1456                         bga.pt画像側右下座標.Y = n値;\r
1457                         i++;\r
1458                         //-----------------\r
1459                         #endregion\r
1460                         #region [ 6.表示位置・X ]\r
1461                         //-----------------\r
1462                         n値 = 0;\r
1463                         if (!int.TryParse(strParams[i], out n値))\r
1464                         {\r
1465                                 Trace.TraceError("BGA: {2}番目の引数(表示位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1466                                 return false;\r
1467                         }\r
1468                         bga.pt表示座標.X = n値;\r
1469                         i++;\r
1470                         //-----------------\r
1471                         #endregion\r
1472                         #region [ 7.表示位置・Y ]\r
1473                         //-----------------\r
1474                         n値 = 0;\r
1475                         if (!int.TryParse(strParams[i], out n値))\r
1476                         {\r
1477                                 Trace.TraceError("BGA: {2}番目の引数(表示位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1478                                 return false;\r
1479                         }\r
1480                         bga.pt表示座標.Y = n値;\r
1481                         i++;\r
1482                         //-----------------\r
1483                         #endregion\r
1484 \r
1485                         #region [ 画像側座標の正規化とクリッピング。]\r
1486                         //-----------------\r
1487                         if (bga.pt画像側左上座標.X > bga.pt画像側右下座標.X)\r
1488                         {\r
1489                                 n値 = bga.pt画像側左上座標.X;\r
1490                                 bga.pt画像側左上座標.X = bga.pt画像側右下座標.X;\r
1491                                 bga.pt画像側右下座標.X = n値;\r
1492                         }\r
1493                         if (bga.pt画像側左上座標.Y > bga.pt画像側右下座標.Y)\r
1494                         {\r
1495                                 n値 = bga.pt画像側左上座標.Y;\r
1496                                 bga.pt画像側左上座標.Y = bga.pt画像側右下座標.Y;\r
1497                                 bga.pt画像側右下座標.Y = n値;\r
1498                         }\r
1499                         //-----------------\r
1500                         #endregion\r
1501                         #region [ BGAリストに {zz, bga} の組を登録する。]\r
1502                         //-----------------\r
1503                         if (this.listBGA.ContainsKey(zz))       // 既にリスト中に存在しているなら削除。後のものが有効。\r
1504                                 this.listBGA.Remove(zz);\r
1505 \r
1506                         this.listBGA.Add(zz, bga);\r
1507                         //-----------------\r
1508                         #endregion\r
1509 \r
1510                         return true;\r
1511                 }\r
1512                 private bool t入力_行解析_BGAPAN(string strコマンド, string strパラメータ, string strコメント)\r
1513                 {\r
1514                         // (1) コマンドを処理。\r
1515 \r
1516                         #region [ "BGAPAN" で始まらないコマンドは無効。]\r
1517                         //-----------------\r
1518                         if (!strコマンド.StartsWith("BGAPAN", StringComparison.OrdinalIgnoreCase))\r
1519                                 return false;\r
1520 \r
1521                         strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"BGAPAN"文字を除去。\r
1522                         //-----------------\r
1523                         #endregion\r
1524 \r
1525                         // (2) パラメータを処理。\r
1526 \r
1527                         if (strコマンド.Length < 2)\r
1528                                 return false;   // BGAPAN番号 zz がないなら無効。\r
1529 \r
1530                         #region [ BGAPAN番号 zz を取得する。]\r
1531                         //-----------------\r
1532                         int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
1533                         if (zz < 0 || zz >= 36 * 36)\r
1534                         {\r
1535                                 Trace.TraceError("BGAPAN番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1536                                 return false;\r
1537                         }\r
1538                         //-----------------\r
1539                         #endregion\r
1540 \r
1541                         var bgapan = new CBGAPAN()\r
1542                         {\r
1543                                 n番号 = zz,\r
1544                         };\r
1545 \r
1546                         // パラメータ引数(14個)を取得し、bgapan に登録していく。\r
1547 \r
1548                         string[] strParams = strパラメータ.Split(new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries);\r
1549 \r
1550                         #region [ パラメータ引数は全14個ないと無効。]\r
1551                         //-----------------\r
1552                         if (strParams.Length < 14)\r
1553                         {\r
1554                                 Trace.TraceError("BGAPAN: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1555                                 return false;\r
1556                         }\r
1557                         //-----------------\r
1558                         #endregion\r
1559 \r
1560                         int i = 0;\r
1561                         int n値 = 0;\r
1562 \r
1563                         #region [ 1. BMP番号 ]\r
1564                         //-----------------\r
1565                         if (string.IsNullOrEmpty(strParams[i]) || strParams[i].Length > 2)\r
1566                         {\r
1567                                 Trace.TraceError("BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1568                                 return false;\r
1569                         }\r
1570                         bgapan.nBMP番号 = C変換.n36進数2桁の文字列を数値に変換して返す(strParams[i]);\r
1571                         if (bgapan.nBMP番号 < 1 || bgapan.nBMP番号 >= 36 * 36)\r
1572                         {\r
1573                                 Trace.TraceError("BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1574                                 return false;\r
1575                         }\r
1576                         i++;\r
1577                         //-----------------\r
1578                         #endregion\r
1579                         #region [ 2. 開始転送サイズ・幅 ]\r
1580                         //-----------------\r
1581                         n値 = 0;\r
1582                         if (!int.TryParse(strParams[i], out n値))\r
1583                         {\r
1584                                 Trace.TraceError("BGAPAN: {2}番目の引数(開始転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1585                                 return false;\r
1586                         }\r
1587                         bgapan.sz開始サイズ.Width = n値;\r
1588                         i++;\r
1589                         //-----------------\r
1590                         #endregion\r
1591                         #region [ 3. 開始転送サイズ・高さ ]\r
1592                         //-----------------\r
1593                         n値 = 0;\r
1594                         if (!int.TryParse(strParams[i], out n値))\r
1595                         {\r
1596                                 Trace.TraceError("BGAPAN: {2}番目の引数(開始転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1597                                 return false;\r
1598                         }\r
1599                         bgapan.sz開始サイズ.Height = n値;\r
1600                         i++;\r
1601                         //-----------------\r
1602                         #endregion\r
1603                         #region [ 4. 終了転送サイズ・幅 ]\r
1604                         //-----------------\r
1605                         n値 = 0;\r
1606                         if (!int.TryParse(strParams[i], out n値))\r
1607                         {\r
1608                                 Trace.TraceError("BGAPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1609                                 return false;\r
1610                         }\r
1611                         bgapan.sz終了サイズ.Width = n値;\r
1612                         i++;\r
1613                         //-----------------\r
1614                         #endregion\r
1615                         #region [ 5. 終了転送サイズ・高さ ]\r
1616                         //-----------------\r
1617                         n値 = 0;\r
1618                         if (!int.TryParse(strParams[i], out n値))\r
1619                         {\r
1620                                 Trace.TraceError("BGAPAN: {2}番目の引数(終了転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1621                                 return false;\r
1622                         }\r
1623                         bgapan.sz終了サイズ.Height = n値;\r
1624                         i++;\r
1625                         //-----------------\r
1626                         #endregion\r
1627                         #region [ 6. 画像側開始位置・X ]\r
1628                         //-----------------\r
1629                         n値 = 0;\r
1630                         if (!int.TryParse(strParams[i], out n値))\r
1631                         {\r
1632                                 Trace.TraceError("BGAPAN: {2}番目の引数(画像側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1633                                 return false;\r
1634                         }\r
1635                         bgapan.pt画像側開始位置.X = n値;\r
1636                         i++;\r
1637                         //-----------------\r
1638                         #endregion\r
1639                         #region [ 7. 画像側開始位置・Y ]\r
1640                         //-----------------\r
1641                         n値 = 0;\r
1642                         if (!int.TryParse(strParams[i], out n値))\r
1643                         {\r
1644                                 Trace.TraceError("BGAPAN: {2}番目の引数(画像側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1645                                 return false;\r
1646                         }\r
1647                         bgapan.pt画像側開始位置.Y = n値;\r
1648                         i++;\r
1649                         //-----------------\r
1650                         #endregion\r
1651                         #region [ 8. 画像側終了位置・X ]\r
1652                         //-----------------\r
1653                         n値 = 0;\r
1654                         if (!int.TryParse(strParams[i], out n値))\r
1655                         {\r
1656                                 Trace.TraceError("BGAPAN: {2}番目の引数(画像側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1657                                 return false;\r
1658                         }\r
1659                         bgapan.pt画像側終了位置.X = n値;\r
1660                         i++;\r
1661                         //-----------------\r
1662                         #endregion\r
1663                         #region [ 9. 画像側終了位置・Y ]\r
1664                         //-----------------\r
1665                         n値 = 0;\r
1666                         if (!int.TryParse(strParams[i], out n値))\r
1667                         {\r
1668                                 Trace.TraceError("BGAPAN: {2}番目の引数(画像側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1669                                 return false;\r
1670                         }\r
1671                         bgapan.pt画像側終了位置.Y = n値;\r
1672                         i++;\r
1673                         //-----------------\r
1674                         #endregion\r
1675                         #region [ 10.表示側開始位置・X ]\r
1676                         //-----------------\r
1677                         n値 = 0;\r
1678                         if (!int.TryParse(strParams[i], out n値))\r
1679                         {\r
1680                                 Trace.TraceError("BGAPAN: {2}番目の引数(表示側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1681                                 return false;\r
1682                         }\r
1683                         bgapan.pt表示側開始位置.X = n値;\r
1684                         i++;\r
1685                         //-----------------\r
1686                         #endregion\r
1687                         #region [ 11.表示側開始位置・Y ]\r
1688                         //-----------------\r
1689                         n値 = 0;\r
1690                         if (!int.TryParse(strParams[i], out n値))\r
1691                         {\r
1692                                 Trace.TraceError("BGAPAN: {2}番目の引数(表示側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1693                                 return false;\r
1694                         }\r
1695                         bgapan.pt表示側開始位置.Y = n値;\r
1696                         i++;\r
1697                         //-----------------\r
1698                         #endregion\r
1699                         #region [ 12.表示側終了位置・X ]\r
1700                         //-----------------\r
1701                         n値 = 0;\r
1702                         if (!int.TryParse(strParams[i], out n値))\r
1703                         {\r
1704                                 Trace.TraceError("BGAPAN: {2}番目の引数(表示側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1705                                 return false;\r
1706                         }\r
1707                         bgapan.pt表示側終了位置.X = n値;\r
1708                         i++;\r
1709                         //-----------------\r
1710                         #endregion\r
1711                         #region [ 13.表示側終了位置・Y ]\r
1712                         //-----------------\r
1713                         n値 = 0;\r
1714                         if (!int.TryParse(strParams[i], out n値))\r
1715                         {\r
1716                                 Trace.TraceError("BGAPAN: {2}番目の引数(表示側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1717                                 return false;\r
1718                         }\r
1719                         bgapan.pt表示側終了位置.Y = n値;\r
1720                         i++;\r
1721                         //-----------------\r
1722                         #endregion\r
1723                         #region [ 14.移動時間 ]\r
1724                         //-----------------\r
1725                         n値 = 0;\r
1726                         if (!int.TryParse(strParams[i], out n値))\r
1727                         {\r
1728                                 Trace.TraceError("BGAPAN: {2}番目の引数(移動時間)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);\r
1729                                 return false;\r
1730                         }\r
1731 \r
1732                         if (n値 < 0)\r
1733                                 n値 = 0;\r
1734 \r
1735                         bgapan.n移動時間ct = n値;\r
1736                         i++;\r
1737                         //-----------------\r
1738                         #endregion\r
1739 \r
1740                         #region [ BGAPANリストに {zz, bgapan} の組を登録する。]\r
1741                         //-----------------\r
1742                         if (this.listBGAPAN.ContainsKey(zz))    // 既にリスト中に存在しているなら削除。後のものが有効。\r
1743                                 this.listBGAPAN.Remove(zz);\r
1744 \r
1745                         this.listBGAPAN.Add(zz, bgapan);\r
1746                         //-----------------\r
1747                         #endregion\r
1748 \r
1749                         return true;\r
1750                 }\r
1751                 private bool t入力_行解析_BMP(string strコマンド, string strパラメータ, string strコメント)\r
1752                 {\r
1753                         // (1) コマンドを処理。\r
1754 \r
1755                         #region [ "BMP" で始まらないコマンドは無効。]\r
1756                         //-----------------\r
1757                         if (!strコマンド.StartsWith("BMP", StringComparison.OrdinalIgnoreCase))\r
1758                                 return false;\r
1759 \r
1760                         strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"BMP"文字を除去。\r
1761                         //-----------------\r
1762                         #endregion\r
1763 \r
1764                         // (2) パラメータを処理。\r
1765 \r
1766                         int zz = 0;\r
1767 \r
1768                         #region [ BMP番号 zz を取得する。]\r
1769                         //-----------------\r
1770                         if (strコマンド.Length < 2)\r
1771                         {\r
1772                                 #region [ (A) "#BMP:" の場合 → zz = 00 ]\r
1773                                 //-----------------\r
1774                                 zz = 0;\r
1775                                 //-----------------\r
1776                                 #endregion\r
1777                         }\r
1778                         else\r
1779                         {\r
1780                                 #region [ (B) "#BMPzz:" の場合 → zz = 00 ~ ZZ ]\r
1781                                 //-----------------\r
1782                                 zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
1783                                 if (zz < 0 || zz >= 36 * 36)\r
1784                                 {\r
1785                                         Trace.TraceError("BMP番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1786                                         return false;\r
1787                                 }\r
1788                                 //-----------------\r
1789                                 #endregion\r
1790                         }\r
1791                         //-----------------\r
1792                         #endregion\r
1793 \r
1794 \r
1795                         var bmp = new CBMP()\r
1796                         {\r
1797                                 n番号 = zz,\r
1798                                 strファイル名 = strパラメータ,\r
1799                                 strコメント文 = strコメント,\r
1800                         };\r
1801 \r
1802                         #region [ BMPリストに {zz, bmp} の組を登録。]\r
1803                         //-----------------\r
1804                         if (this.listBMP.ContainsKey(zz))       // 既にリスト中に存在しているなら削除。後のものが有効。\r
1805                                 this.listBMP.Remove(zz);\r
1806 \r
1807                         this.listBMP.Add(zz, bmp);\r
1808                         //-----------------\r
1809                         #endregion\r
1810 \r
1811                         return true;\r
1812                 }\r
1813                 private bool t入力_行解析_BMPTEX(string strコマンド, string strパラメータ, string strコメント)\r
1814                 {\r
1815                         // (1) コマンドを処理。\r
1816 \r
1817                         #region [ "BMPTEX" で始まらないコマンドは無効。]\r
1818                         //-----------------\r
1819                         if (!strコマンド.StartsWith("BMPTEX", StringComparison.OrdinalIgnoreCase))\r
1820                                 return false;\r
1821 \r
1822                         strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"BMPTEX"文字を除去。\r
1823                         //-----------------\r
1824                         #endregion\r
1825 \r
1826                         // (2) パラメータを処理。\r
1827 \r
1828                         if (strコマンド.Length < 2)\r
1829                                 return false;   // BMPTEX番号 zz がないなら無効。\r
1830 \r
1831                         #region [ BMPTEX番号 zz を取得する。]\r
1832                         //-----------------\r
1833                         int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
1834                         if (zz < 0 || zz >= 36 * 36)\r
1835                         {\r
1836                                 Trace.TraceError("BMPTEX番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}]", this.strファイル名の絶対パス, this.n現在の行数);\r
1837                                 return false;\r
1838                         }\r
1839                         //-----------------\r
1840                         #endregion\r
1841 \r
1842                         var bmptex = new CBMPTEX()\r
1843                         {\r
1844                                 n番号 = zz,\r
1845                                 strファイル名 = strパラメータ,\r
1846                                 strコメント文 = strコメント,\r
1847                         };\r
1848 \r
1849                         #region [ BMPTEXリストに {zz, bmptex} の組を登録する。]\r
1850                         //-----------------\r
1851                         if (this.listBMPTEX.ContainsKey(zz))    // 既にリスト中に存在しているなら削除。後のものが有効。\r
1852                                 this.listBMPTEX.Remove(zz);\r
1853 \r
1854                         this.listBMPTEX.Add(zz, bmptex);\r
1855                         //-----------------\r
1856                         #endregion\r
1857 \r
1858                         return true;\r
1859                 }\r
1860                 private bool t入力_行解析_BPM_BPMzz(string strコマンド, string strパラメータ, string strコメント)\r
1861                 {\r
1862                         // (1) コマンドを処理。\r
1863 \r
1864                         #region [ "BPM" で始まらないコマンドは無効。]\r
1865                         //-----------------\r
1866                         if (!strコマンド.StartsWith("BPM", StringComparison.OrdinalIgnoreCase))\r
1867                                 return false;\r
1868 \r
1869                         strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"BPM"文字を除去。\r
1870                         //-----------------\r
1871                         #endregion\r
1872 \r
1873                         // (2) パラメータを処理。\r
1874 \r
1875                         int zz = 0;\r
1876 \r
1877                         #region [ BPM番号 zz を取得する。]\r
1878                         //-----------------\r
1879                         if (strコマンド.Length < 2)\r
1880                         {\r
1881                                 #region [ (A) "#BPM:" の場合 → zz = 00 ]\r
1882                                 //-----------------\r
1883                                 zz = 0;\r
1884                                 //-----------------\r
1885                                 #endregion\r
1886                         }\r
1887                         else\r
1888                         {\r
1889                                 #region [ (B) "#BPMzz:" の場合 → zz = 00 ~ ZZ ]\r
1890                                 //-----------------\r
1891                                 zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
1892                                 if (zz < 0 || zz >= 36 * 36)\r
1893                                 {\r
1894                                         Trace.TraceError("BPM番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
1895                                         return false;\r
1896                                 }\r
1897                                 //-----------------\r
1898                                 #endregion\r
1899                         }\r
1900                         //-----------------\r
1901                         #endregion\r
1902 \r
1903                         double dbBPM = 0.0;\r
1904 \r
1905                         #region [ BPM値を取得する。]\r
1906                         //-----------------\r
1907                         //if( !double.TryParse( strパラメータ, out result ) )\r
1908                         if (!TryParse(strパラメータ, out dbBPM))                   // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point\r
1909                                 return false;\r
1910 \r
1911                         if (dbBPM <= 0.0)\r
1912                                 return false;\r
1913                         //-----------------\r
1914                         #endregion\r
1915 \r
1916                         if (zz == 0)                    // "#BPM00:" と "#BPM:" は等価。\r
1917                                 this.BPM = dbBPM;       // この曲の代表 BPM に格納する。\r
1918 \r
1919                         #region [ BPMリストに {内部番号, zz, dbBPM} の組を登録。]\r
1920                         //-----------------\r
1921                         this.listBPM.Add(\r
1922                                 this.n内部番号BPM1to,\r
1923                                 new CBPM()\r
1924                                 {\r
1925                                         n内部番号 = this.n内部番号BPM1to,\r
1926                                         n表記上の番号 = zz,\r
1927                                         dbBPM値 = dbBPM,\r
1928                                 });\r
1929                         //-----------------\r
1930                         #endregion\r
1931 \r
1932                         #region [ BPM番号が zz であるBPM未設定のBPMチップがあれば、そのサイズを変更する。無限管理に対応。]\r
1933                         //-----------------\r
1934                         if (this.n無限管理BPM[zz] == -zz)   // 初期状態では n無限管理BPM[zz] = -zz である。この場合、#BPMzz がまだ出現していないことを意味する。\r
1935                         {\r
1936                                 foreach (CChip chip in listChip)        // これまでに出てきたチップのうち、該当する(BPM値が未設定の)BPMチップの値を変更する(仕組み上、必ず後方参照となる)。\r
1937                                 {\r
1938                                         chip.AdjustInfiniteManageIntInternalIndex(chip.bBPMチップである, zz, this.n内部番号BPM1to);\r
1939                                 }\r
1940                         }\r
1941                         this.n無限管理BPM[zz] = this.n内部番号BPM1to;                   // 次にこの BPM番号 zz を使うBPMチップが現れたら、このBPM値が格納されることになる。\r
1942                         this.n内部番号BPM1to++;             // 内部番号は単純増加連番。\r
1943                         //-----------------\r
1944                         #endregion\r
1945 \r
1946                         return true;\r
1947                 }\r
1948                 private bool t入力_行解析_RESULTIMAGE(string strコマンド, string strパラメータ, string strコメント)\r
1949                 {\r
1950                         // (1) コマンドを処理。\r
1951 \r
1952                         #region [ "RESULTIMAGE" で始まらないコマンドは無効。]\r
1953                         //-----------------\r
1954                         if (!strコマンド.StartsWith("RESULTIMAGE", StringComparison.OrdinalIgnoreCase))\r
1955                                 return false;\r
1956 \r
1957                         strコマンド = strコマンド.Substring(11);        // strコマンド から先頭の"RESULTIMAGE"文字を除去。\r
1958                         //-----------------\r
1959                         #endregion\r
1960 \r
1961                         // (2) パラメータを処理。\r
1962                         //     コマンドには "#RESULTIMAGE:" と "#RESULTIMAGE_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。\r
1963 \r
1964                         if (strコマンド.Length < 2)\r
1965                         {\r
1966                                 #region [ (A) ランク指定がない場合("#RESULTIMAGE:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]\r
1967                                 //-----------------\r
1968                                 for (int i = 0; i < 7; i++)\r
1969                                 {\r
1970                                         if (this.nRESULTIMAGE用優先順位[i] == 0)\r
1971                                                 this.RESULTIMAGE[i] = strパラメータ.Trim();\r
1972                                 }\r
1973                                 //-----------------\r
1974                                 #endregion\r
1975                         }\r
1976                         else\r
1977                         {\r
1978                                 #region [ (B) ランク指定がある場合("#RESULTIMAGE_SS~E:") → 優先順位に従ってパラメータを記録する。]\r
1979                                 //-----------------\r
1980                                 switch (strコマンド.ToUpper())\r
1981                                 {\r
1982                                         case "_SS":\r
1983                                                 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(0, strパラメータ);\r
1984                                                 break;\r
1985 \r
1986                                         case "_S":\r
1987                                                 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(1, strパラメータ);\r
1988                                                 break;\r
1989 \r
1990                                         case "_A":\r
1991                                                 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(2, strパラメータ);\r
1992                                                 break;\r
1993 \r
1994                                         case "_B":\r
1995                                                 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(3, strパラメータ);\r
1996                                                 break;\r
1997 \r
1998                                         case "_C":\r
1999                                                 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(4, strパラメータ);\r
2000                                                 break;\r
2001 \r
2002                                         case "_D":\r
2003                                                 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(5, strパラメータ);\r
2004                                                 break;\r
2005 \r
2006                                         case "_E":\r
2007                                                 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(6, strパラメータ);\r
2008                                                 break;\r
2009                                 }\r
2010                                 //-----------------\r
2011                                 #endregion\r
2012                         }\r
2013 \r
2014                         return true;\r
2015                 }\r
2016                 private void t入力_行解析_RESULTIMAGE_ファイルを設定する(int nランク0to6, string strファイル名)\r
2017                 {\r
2018                         if (nランク0to6 < 0 || nランク0to6 > 6)   // 値域チェック。\r
2019                                 return;\r
2020 \r
2021                         // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。\r
2022 \r
2023                         for (int i = nランク0to6; i >= 0; i--)\r
2024                         {\r
2025                                 int n優先順位 = 7 - nランク0to6;\r
2026 \r
2027                                 // 現状より優先順位の低い RESULTIMAGE[] に限り、ファイル名を更新できる。\r
2028                                 //(例:#RESULTMOVIE_D が #RESULTIMAGE_A より後に出現しても、#RESULTIMAGE_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)\r
2029 \r
2030                                 if (this.nRESULTIMAGE用優先順位[i] < n優先順位)\r
2031                                 {\r
2032                                         this.nRESULTIMAGE用優先順位[i] = n優先順位;\r
2033                                         this.RESULTIMAGE[i] = strファイル名;\r
2034                                 }\r
2035                         }\r
2036                 }\r
2037                 private bool t入力_行解析_RESULTMOVIE(string strコマンド, string strパラメータ, string strコメント)\r
2038                 {\r
2039                         // (1) コマンドを処理。\r
2040 \r
2041                         #region [ "RESULTMOVIE" で始まらないコマンドは無効。]\r
2042                         //-----------------\r
2043                         if (!strコマンド.StartsWith("RESULTMOVIE", StringComparison.OrdinalIgnoreCase))\r
2044                                 return false;\r
2045 \r
2046                         strコマンド = strコマンド.Substring(11);        // strコマンド から先頭の"RESULTMOVIE"文字を除去。\r
2047                         //-----------------\r
2048                         #endregion\r
2049 \r
2050                         // (2) パラメータを処理。\r
2051                         //     コマンドには "#RESULTMOVIE:" と "#RESULTMOVIE_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。\r
2052 \r
2053                         if (strコマンド.Length < 2)\r
2054                         {\r
2055                                 #region [ (A) ランク指定がない場合("#RESULTMOVIE:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]\r
2056                                 //-----------------\r
2057                                 for (int i = 0; i < 7; i++)\r
2058                                 {\r
2059                                         if (this.nRESULTMOVIE用優先順位[i] == 0)\r
2060                                                 this.RESULTMOVIE[i] = strパラメータ.Trim();\r
2061                                 }\r
2062                                 //-----------------\r
2063                                 #endregion\r
2064                         }\r
2065                         else\r
2066                         {\r
2067                                 #region [ (B) ランク指定がある場合("#RESULTMOVIE_SS~E:") → 優先順位に従ってパラメータを記録する。]\r
2068                                 //-----------------\r
2069                                 switch (strコマンド.ToUpper())\r
2070                                 {\r
2071                                         case "_SS":\r
2072                                                 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(0, strパラメータ);\r
2073                                                 break;\r
2074 \r
2075                                         case "_S":\r
2076                                                 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(1, strパラメータ);\r
2077                                                 break;\r
2078 \r
2079                                         case "_A":\r
2080                                                 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(2, strパラメータ);\r
2081                                                 break;\r
2082 \r
2083                                         case "_B":\r
2084                                                 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(3, strパラメータ);\r
2085                                                 break;\r
2086 \r
2087                                         case "_C":\r
2088                                                 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(4, strパラメータ);\r
2089                                                 break;\r
2090 \r
2091                                         case "_D":\r
2092                                                 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(5, strパラメータ);\r
2093                                                 break;\r
2094 \r
2095                                         case "_E":\r
2096                                                 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(6, strパラメータ);\r
2097                                                 break;\r
2098                                 }\r
2099                                 //-----------------\r
2100                                 #endregion\r
2101                         }\r
2102 \r
2103                         return true;\r
2104                 }\r
2105                 private void t入力_行解析_RESULTMOVIE_ファイルを設定する(int nランク0to6, string strファイル名)\r
2106                 {\r
2107                         if (nランク0to6 < 0 || nランク0to6 > 6)   // 値域チェック。\r
2108                                 return;\r
2109 \r
2110                         // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。\r
2111 \r
2112                         for (int i = nランク0to6; i >= 0; i--)\r
2113                         {\r
2114                                 int n優先順位 = 7 - nランク0to6;\r
2115 \r
2116                                 // 現状より優先順位の低い RESULTMOVIE[] に限り、ファイル名を更新できる。\r
2117                                 //(例:#RESULTMOVIE_D が #RESULTMOVIE_A より後に出現しても、#RESULTMOVIE_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)\r
2118 \r
2119                                 if (this.nRESULTMOVIE用優先順位[i] < n優先順位)\r
2120                                 {\r
2121                                         this.nRESULTMOVIE用優先順位[i] = n優先順位;\r
2122                                         this.RESULTMOVIE[i] = strファイル名;\r
2123                                 }\r
2124                         }\r
2125                 }\r
2126                 private bool t入力_行解析_RESULTSOUND(string strコマンド, string strパラメータ, string strコメント)\r
2127                 {\r
2128                         // (1) コマンドを処理。\r
2129 \r
2130                         #region [ "RESULTSOUND" で始まらないコマンドは無効。]\r
2131                         //-----------------\r
2132                         if (!strコマンド.StartsWith("RESULTSOUND", StringComparison.OrdinalIgnoreCase))\r
2133                                 return false;\r
2134 \r
2135                         strコマンド = strコマンド.Substring(11);        // strコマンド から先頭の"RESULTSOUND"文字を除去。\r
2136                         //-----------------\r
2137                         #endregion\r
2138 \r
2139                         // (2) パラメータを処理。\r
2140                         //     コマンドには "#RESULTSOUND:" と "#RESULTSOUND_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。\r
2141 \r
2142                         if (strコマンド.Length < 2)\r
2143                         {\r
2144                                 #region [ (A) ランク指定がない場合("#RESULTSOUND:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]\r
2145                                 //-----------------\r
2146                                 for (int i = 0; i < 7; i++)\r
2147                                 {\r
2148                                         if (this.nRESULTSOUND用優先順位[i] == 0)\r
2149                                                 this.RESULTSOUND[i] = strパラメータ.Trim();\r
2150                                 }\r
2151                                 //-----------------\r
2152                                 #endregion\r
2153                         }\r
2154                         else\r
2155                         {\r
2156                                 #region [ (B) ランク指定がある場合("#RESULTSOUND_SS~E:") → 優先順位に従ってパラメータを記録する。]\r
2157                                 //-----------------\r
2158                                 switch (strコマンド.ToUpper())\r
2159                                 {\r
2160                                         case "_SS":\r
2161                                                 this.t入力_行解析_RESULTSOUND_ファイルを設定する(0, strパラメータ);\r
2162                                                 break;\r
2163 \r
2164                                         case "_S":\r
2165                                                 this.t入力_行解析_RESULTSOUND_ファイルを設定する(1, strパラメータ);\r
2166                                                 break;\r
2167 \r
2168                                         case "_A":\r
2169                                                 this.t入力_行解析_RESULTSOUND_ファイルを設定する(2, strパラメータ);\r
2170                                                 break;\r
2171 \r
2172                                         case "_B":\r
2173                                                 this.t入力_行解析_RESULTSOUND_ファイルを設定する(3, strパラメータ);\r
2174                                                 break;\r
2175 \r
2176                                         case "_C":\r
2177                                                 this.t入力_行解析_RESULTSOUND_ファイルを設定する(4, strパラメータ);\r
2178                                                 break;\r
2179 \r
2180                                         case "_D":\r
2181                                                 this.t入力_行解析_RESULTSOUND_ファイルを設定する(5, strパラメータ);\r
2182                                                 break;\r
2183 \r
2184                                         case "_E":\r
2185                                                 this.t入力_行解析_RESULTSOUND_ファイルを設定する(6, strパラメータ);\r
2186                                                 break;\r
2187                                 }\r
2188                                 //-----------------\r
2189                                 #endregion\r
2190                         }\r
2191 \r
2192                         return true;\r
2193                 }\r
2194                 private void t入力_行解析_RESULTSOUND_ファイルを設定する(int nランク0to6, string strファイル名)\r
2195                 {\r
2196                         if (nランク0to6 < 0 || nランク0to6 > 6)   // 値域チェック。\r
2197                                 return;\r
2198 \r
2199                         // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。\r
2200 \r
2201                         for (int i = nランク0to6; i >= 0; i--)\r
2202                         {\r
2203                                 int n優先順位 = 7 - nランク0to6;\r
2204 \r
2205                                 // 現状より優先順位の低い RESULTSOUND[] に限り、ファイル名を更新できる。\r
2206                                 //(例:#RESULTSOUND_D が #RESULTSOUND_A より後に出現しても、#RESULTSOUND_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)\r
2207 \r
2208                                 if (this.nRESULTSOUND用優先順位[i] < n優先順位)\r
2209                                 {\r
2210                                         this.nRESULTSOUND用優先順位[i] = n優先順位;\r
2211                                         this.RESULTSOUND[i] = strファイル名;\r
2212                                 }\r
2213                         }\r
2214                 }\r
2215                 private bool t入力_行解析_SIZE(string strコマンド, string strパラメータ, string strコメント)\r
2216                 {\r
2217                         // (1) コマンドを処理。\r
2218 \r
2219                         #region [ "SIZE" で始まらないコマンドや、その後ろに2文字(番号)が付随してないコマンドは無効。]\r
2220                         //-----------------\r
2221                         if (!strコマンド.StartsWith("SIZE", StringComparison.OrdinalIgnoreCase))\r
2222                                 return false;\r
2223 \r
2224                         strコマンド = strコマンド.Substring(4); // strコマンド から先頭の"SIZE"文字を除去。\r
2225 \r
2226                         if (strコマンド.Length < 2) // サイズ番号の指定がない場合は無効。\r
2227                                 return false;\r
2228                         //-----------------\r
2229                         #endregion\r
2230 \r
2231                         #region [ nWAV番号(36進数2桁)を取得。]\r
2232                         //-----------------\r
2233                         int nWAV番号 = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
2234 \r
2235                         if (nWAV番号 < 0 || nWAV番号 >= 36 * 36)\r
2236                         {\r
2237                                 Trace.TraceError("SIZEのWAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
2238                                 return false;\r
2239                         }\r
2240                         //-----------------\r
2241                         #endregion\r
2242 \r
2243 \r
2244                         // (2) パラメータを処理。\r
2245 \r
2246                         #region [ nサイズ値 を取得する。値は 0~100 に収める。]\r
2247                         //-----------------\r
2248                         int nサイズ値;\r
2249 \r
2250                         if (!int.TryParse(strパラメータ, out nサイズ値))\r
2251                                 return true;    // int変換に失敗しても、この行自体の処理は終えたのでtrueを返す。\r
2252 \r
2253                         nサイズ値 = Math.Min(Math.Max(nサイズ値, 0), 100);      // 0未満は0、100超えは100に強制変換。\r
2254                         //-----------------\r
2255                         #endregion\r
2256 \r
2257                         #region [ nWAV番号で示されるサイズ未設定のWAVチップがあれば、そのサイズを変更する。無限管理に対応。]\r
2258                         //-----------------\r
2259                         if (this.n無限管理SIZE[nWAV番号] == -nWAV番号)  // 初期状態では n無限管理SIZE[xx] = -xx である。この場合、#SIZExx がまだ出現していないことを意味する。\r
2260                         {\r
2261                                 foreach (CWAV wav in this.listWAV.Values)               // これまでに出てきたWAVチップのうち、該当する(サイズが未設定の)チップのサイズを変更する(仕組み上、必ず後方参照となる)。\r
2262                                 {\r
2263                                         if (wav.nチップサイズ == -nWAV番号)             // #SIZExx 行より前の行に出現した #WAVxx では、チップサイズは -xx に初期化されている。\r
2264                                                 wav.nチップサイズ = nサイズ値;\r
2265                                 }\r
2266                         }\r
2267                         this.n無限管理SIZE[nWAV番号] = nサイズ値;                     // 次にこの nWAV番号を使うWAVチップが現れたら、負数の代わりに、このサイズ値が格納されることになる。\r
2268                         //-----------------\r
2269                         #endregion\r
2270 \r
2271                         return true;\r
2272                 }\r
2273                 private bool t入力_行解析_WAV(string strコマンド, string strパラメータ, string strコメント)\r
2274                 {\r
2275                         // (1) コマンドを処理。\r
2276 \r
2277                         #region [ "WAV" で始まらないコマンドは無効。]\r
2278                         //-----------------\r
2279                         if (!strコマンド.StartsWith("WAV", StringComparison.OrdinalIgnoreCase))\r
2280                                 return false;\r
2281 \r
2282                         strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"WAV"文字を除去。\r
2283                         //-----------------\r
2284                         #endregion\r
2285 \r
2286                         // (2) パラメータを処理。\r
2287 \r
2288                         if (strコマンド.Length < 2)\r
2289                                 return false;   // WAV番号 zz がないなら無効。\r
2290 \r
2291                         #region [ WAV番号 zz を取得する。]\r
2292                         //-----------------\r
2293                         int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
2294                         if (zz < 0 || zz >= 36 * 36)\r
2295                         {\r
2296                                 Trace.TraceError("WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
2297                                 return false;\r
2298                         }\r
2299                         //-----------------\r
2300                         #endregion\r
2301 \r
2302                         var wav = new CWAV()\r
2303                         {\r
2304                                 n内部番号 = this.n内部番号WAV1to,\r
2305                                 n表記上の番号 = zz,\r
2306                                 nチップサイズ = this.n無限管理SIZE[zz],\r
2307                                 n位置 = this.n無限管理PAN[zz],\r
2308                                 n音量 = this.n無限管理VOL[zz],\r
2309                                 strファイル名 = strパラメータ,\r
2310                                 strコメント文 = strコメント,\r
2311                         };\r
2312 \r
2313                         #region [ WAVリストに {内部番号, wav} の組を登録。]\r
2314                         //-----------------\r
2315                         this.listWAV.Add(this.n内部番号WAV1to, wav);\r
2316                         //-----------------\r
2317                         #endregion\r
2318 \r
2319                         #region [ WAV番号が zz である内部番号未設定のWAVチップがあれば、その内部番号を変更する。無限管理対応。]\r
2320                         //-----------------\r
2321                         if (this.n無限管理WAV[zz] == -zz)   // 初期状態では n無限管理WAV[zz] = -zz である。この場合、#WAVzz がまだ出現していないことを意味する。\r
2322                         {\r
2323                                 foreach (CChip chip in listChip)        // これまでに出てきたチップのうち、該当する(内部番号が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。\r
2324                                 {\r
2325                                         chip.AdjustInfiniteManageIntInternalIndex(chip.bWAVを使うチャンネルである, zz, n内部番号WAV1to);\r
2326                                 }\r
2327                         }\r
2328                         this.n無限管理WAV[zz] = this.n内部番号WAV1to;                   // 次にこの WAV番号 zz を使うWAVチップが現れたら、この内部番号が格納されることになる。\r
2329                         this.n内部番号WAV1to++;             // 内部番号は単純増加連番。\r
2330                         //-----------------\r
2331                         #endregion\r
2332 \r
2333                         return true;\r
2334                 }\r
2335                 private bool t入力_行解析_WAVPAN_PAN(string strコマンド, string strパラメータ, string strコメント)\r
2336                 {\r
2337                         // (1) コマンドを処理。\r
2338 \r
2339                         #region [ "WAVPAN" or "PAN" で始まらないコマンドは無効。]\r
2340                         //-----------------\r
2341                         if (strコマンド.StartsWith("WAVPAN", StringComparison.OrdinalIgnoreCase))\r
2342                                 strコマンド = strコマンド.Substring(6);         // strコマンド から先頭の"WAVPAN"文字を除去。\r
2343 \r
2344                         else if (strコマンド.StartsWith("PAN", StringComparison.OrdinalIgnoreCase))\r
2345                                 strコマンド = strコマンド.Substring(3);         // strコマンド から先頭の"PAN"文字を除去。\r
2346 \r
2347                         else\r
2348                                 return false;\r
2349                         //-----------------\r
2350                         #endregion\r
2351 \r
2352                         // (2) パラメータを処理。\r
2353 \r
2354                         if (strコマンド.Length < 2)\r
2355                                 return false;   // WAV番号 zz がないなら無効。\r
2356 \r
2357                         #region [ WAV番号 zz を取得する。]\r
2358                         //-----------------\r
2359                         int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
2360                         if (zz < 0 || zz >= 36 * 36)\r
2361                         {\r
2362                                 Trace.TraceError("WAVPAN(PAN)のWAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
2363                                 return false;\r
2364                         }\r
2365                         //-----------------\r
2366                         #endregion\r
2367 \r
2368                         #region [ WAV番号 zz を持つWAVチップの位置を変更する。無限定義対応。]\r
2369                         //-----------------\r
2370                         int n位置;\r
2371                         if (int.TryParse(strパラメータ, out n位置))\r
2372                         {\r
2373                                 n位置 = Math.Min(Math.Max(n位置, -100), 100);       // -100~+100 に丸める\r
2374 \r
2375                                 if (this.n無限管理PAN[zz] == (-10000 - zz)) // 初期状態では n無限管理PAN[zz] = -10000 - zz である。この場合、#WAVPANzz, #PANzz がまだ出現していないことを意味する。\r
2376                                 {\r
2377                                         foreach (CWAV wav in this.listWAV.Values)       // これまでに出てきたチップのうち、該当する(位置が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。\r
2378                                         {\r
2379                                                 if (wav.n位置 == (-10000 - zz))       // #WAVPANzz, #PANzz 行より前の行に出現した #WAVzz では、位置は -10000-zz に初期化されている。\r
2380                                                         wav.n位置 = n位置;\r
2381                                         }\r
2382                                 }\r
2383                                 this.n無限管理PAN[zz] = n位置;                    // 次にこの WAV番号 zz を使うWAVチップが現れたら、この位置が格納されることになる。\r
2384                         }\r
2385                         //-----------------\r
2386                         #endregion\r
2387 \r
2388                         return true;\r
2389                 }\r
2390                 private bool t入力_行解析_WAVVOL_VOLUME(string strコマンド, string strパラメータ, string strコメント)\r
2391                 {\r
2392                         // (1) コマンドを処理。\r
2393 \r
2394                         #region [ "WAVCOL" or "VOLUME" で始まらないコマンドは無効。]\r
2395                         //-----------------\r
2396                         if (strコマンド.StartsWith("WAVVOL", StringComparison.OrdinalIgnoreCase))\r
2397                                 strコマンド = strコマンド.Substring(6);         // strコマンド から先頭の"WAVVOL"文字を除去。\r
2398 \r
2399                         else if (strコマンド.StartsWith("VOLUME", StringComparison.OrdinalIgnoreCase))\r
2400                                 strコマンド = strコマンド.Substring(6);         // strコマンド から先頭の"VOLUME"文字を除去。\r
2401 \r
2402                         else\r
2403                                 return false;\r
2404                         //-----------------\r
2405                         #endregion\r
2406 \r
2407                         // (2) パラメータを処理。\r
2408 \r
2409                         if (strコマンド.Length < 2)\r
2410                                 return false;   // WAV番号 zz がないなら無効。\r
2411 \r
2412                         #region [ WAV番号 zz を取得する。]\r
2413                         //-----------------\r
2414                         int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));\r
2415                         if (zz < 0 || zz >= 36 * 36)\r
2416                         {\r
2417                                 Trace.TraceError("WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
2418                                 return false;\r
2419                         }\r
2420                         //-----------------\r
2421                         #endregion\r
2422 \r
2423                         #region [ WAV番号 zz を持つWAVチップの音量を変更する。無限定義対応。]\r
2424                         //-----------------\r
2425                         int n音量;\r
2426                         if (int.TryParse(strパラメータ, out n音量))\r
2427                         {\r
2428                                 n音量 = Math.Min(Math.Max(n音量, 0), 100);  // 0~100に丸める。\r
2429 \r
2430                                 if (this.n無限管理VOL[zz] == -zz)   // 初期状態では n無限管理VOL[zz] = - zz である。この場合、#WAVVOLzz, #VOLUMEzz がまだ出現していないことを意味する。\r
2431                                 {\r
2432                                         foreach (CWAV wav in this.listWAV.Values)       // これまでに出てきたチップのうち、該当する(音量が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。\r
2433                                         {\r
2434                                                 if (wav.n音量 == -zz) // #WAVVOLzz, #VOLUMEzz 行より前の行に出現した #WAVzz では、音量は -zz に初期化されている。\r
2435                                                         wav.n音量 = n音量;\r
2436                                         }\r
2437                                 }\r
2438                                 this.n無限管理VOL[zz] = n音量;                    // 次にこの WAV番号 zz を使うWAVチップが現れたら、この音量が格納されることになる。\r
2439                         }\r
2440                         //-----------------\r
2441                         #endregion\r
2442 \r
2443                         return true;\r
2444                 }\r
2445                 private bool t入力_行解析_チップ配置(string strコマンド, string strパラメータ, string strコメント)\r
2446                 {\r
2447                         // (1) コマンドを処理。\r
2448 \r
2449                         if (strコマンド.Length != 5)        // コマンドは必ず5文字であること。\r
2450                                 return false;\r
2451 \r
2452                         #region [ n小節番号 を取得する。]\r
2453                         //-----------------\r
2454                         int n小節番号 = C変換.n小節番号の文字列3桁を数値に変換して返す(strコマンド.Substring(0, 3));\r
2455                         if (n小節番号 < 0)\r
2456                                 return false;\r
2457 \r
2458                         n小節番号++;        // 先頭に空の1小節を設ける。\r
2459                         //-----------------\r
2460                         #endregion\r
2461 \r
2462                         #region [ nチャンネル番号 を取得する。]\r
2463                         //-----------------\r
2464                         Ech定義 tmpチャンネル番号 = Ech定義.Invalid;\r
2465 \r
2466                         // ファイルフォーマットによって処理が異なる。\r
2467 \r
2468                         if (this.e種別 == EDTX種別.GDA || this.e種別 == EDTX種別.G2D)\r
2469                         {\r
2470                                 #region [ (A) GDA, G2D の場合:チャンネル文字列をDTXのチャンネル番号へ置き換える。]\r
2471                                 //-----------------\r
2472                                 string strチャンネル文字列 = strコマンド.Substring(3, 2);\r
2473 \r
2474                                 foreach (STGDAPARAM param in this.stGDAParam)\r
2475                                 {\r
2476                                         if (strチャンネル文字列.Equals(param.strGDAのチャンネル文字列, StringComparison.OrdinalIgnoreCase))\r
2477                                         {\r
2478                                                 tmpチャンネル番号 = param.eDTXのチャンネル番号;\r
2479                                                 break;  // 置き換え成功\r
2480                                         }\r
2481                                 }\r
2482                                 if (tmpチャンネル番号 == Ech定義.Invalid)\r
2483                                         return false;   // 置き換え失敗\r
2484                                 //-----------------\r
2485                                 #endregion\r
2486                         }\r
2487                         else\r
2488                         {\r
2489                                 #region [ (B) その他の場合:チャンネル番号は16進数2桁。]\r
2490                                 //-----------------\r
2491                                 tmpチャンネル番号 = (Ech定義)C変換.n16進数2桁の文字列を数値に変換して返す(strコマンド.Substring(3, 2));\r
2492 \r
2493                                 if (tmpチャンネル番号 < 0)\r
2494                                         return false;\r
2495                                 //-----------------\r
2496                                 #endregion\r
2497                         }\r
2498                         //-----------------\r
2499                         #endregion\r
2500 \r
2501 \r
2502                         // (2) Ch.02を処理。\r
2503                         #region [ 小節長変更(Ch.02)は他のチャンネルとはパラメータが特殊なので、先にとっとと終わらせる。 ]\r
2504                         //-----------------\r
2505                         if (tmpチャンネル番号 == Ech定義.BarLength)\r
2506                         {\r
2507                                 // 小節長倍率を取得する。\r
2508                                 double db小節長倍率 = 1.0;\r
2509                                 //if( !double.TryParse( strパラメータ, out result ) )\r
2510                                 if (!this.TryParse(strパラメータ, out db小節長倍率))                  // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point\r
2511                                 {\r
2512                                         Trace.TraceError("小節長倍率に不正な値を指定しました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
2513                                         return false;\r
2514                                 }\r
2515 \r
2516                                 // 小節長倍率チップを一番先頭に配置する。\r
2517                                 this.listChip.Insert(0, new CChip(n小節番号 * 384, db小節長倍率, tmpチャンネル番号));\r
2518 \r
2519                                 return true;    // 配置終了。\r
2520                         }\r
2521                         //-----------------\r
2522                         #endregion\r
2523 \r
2524                         // (3) パラメータを処理。\r
2525                         if (string.IsNullOrEmpty(strパラメータ))           // パラメータはnullまたは空文字列ではないこと。\r
2526                                 return false;\r
2527 \r
2528                         #region [ strパラメータ にオブジェクト記述を格納し、その n文字数 をカウントする。]\r
2529                         //-----------------\r
2530                         int n文字数 = 0;\r
2531 \r
2532                         var sb = new StringBuilder(strパラメータ.Length);\r
2533 \r
2534                         // strパラメータを先頭から1文字ずつ見ながら正規化(無効文字('_')を飛ばしたり不正な文字でエラーを出したり)し、sb へ格納する。\r
2535 \r
2536                         CharEnumerator ce = strパラメータ.GetEnumerator();\r
2537                         while (ce.MoveNext())\r
2538                         {\r
2539                                 if (ce.Current == '_')          // '_' は無視。\r
2540                                         continue;\r
2541 \r
2542                                 if (C変換.str36進数文字.IndexOf(ce.Current) < 0)  // オブジェクト記述は36進数文字であること。\r
2543                                 {\r
2544                                         Trace.TraceError("不正なオブジェクト指定があります。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);\r
2545                                         return false;\r
2546                                 }\r
2547 \r
2548                                 sb.Append(ce.Current);\r
2549                                 n文字数++;\r
2550                         }\r
2551 \r
2552                         strパラメータ = sb.ToString();     // 正規化された文字列になりました。\r
2553 \r
2554                         if ((n文字数 % 2) != 0)              // パラメータの文字数が奇数の場合、最後の1文字を無視する。\r
2555                                 n文字数--;\r
2556                         //-----------------\r
2557                         #endregion\r
2558 \r
2559 \r
2560                         // (4) パラメータをオブジェクト数値に分解して配置する。\r
2561 \r
2562                         for (int i = 0; i < (n文字数 / 2); i++)      // 2文字で1オブジェクト数値\r
2563                         {\r
2564                                 #region [ nオブジェクト数値 を1つ取得する。'00' なら無視。]\r
2565                                 //-----------------\r
2566                                 int nオブジェクト数値 = 0;\r
2567 \r
2568                                 if (tmpチャンネル番号 == Ech定義.BPM)\r
2569                                 {\r
2570                                         // Ch.03 のみ 16進数2桁。\r
2571                                         nオブジェクト数値 = C変換.n16進数2桁の文字列を数値に変換して返す(strパラメータ.Substring(i * 2, 2));\r
2572                                 }\r
2573                                 else\r
2574                                 {\r
2575                                         // その他のチャンネルは36進数2桁。\r
2576                                         nオブジェクト数値 = C変換.n36進数2桁の文字列を数値に変換して返す(strパラメータ.Substring(i * 2, 2));\r
2577                                 }\r
2578 \r
2579                                 if (nオブジェクト数値 == 0x00)\r
2580                                         continue;\r
2581                                 //-----------------\r
2582                                 #endregion\r
2583 \r
2584                                 // オブジェクト数値に対応するチップを生成。\r
2585                                 var chip = new CChip((n小節番号 * 384) + ((384 * i) / (n文字数 / 2)), nオブジェクト数値, nオブジェクト数値, tmpチャンネル番号);\r
2586 \r
2587                                 // 楽器パートの決定\r
2588                                 chip.DecideInstrumentPart();\r
2589 \r
2590                                 // チップがある更新\r
2591                                 this.bチップがある.Drums |= chip.bDrums可視チップ;\r
2592                                 this.bチップがある.HHOpen |= chip[Ech定義.HiHatOpen];\r
2593                                 this.bチップがある.Ride |= chip[Ech定義.RideCymbal];\r
2594                                 this.bチップがある.LeftCymbal |= chip[Ech定義.LeftCymbal];\r
2595                                 this.bチップがある.LeftPedal |= chip[Ech定義.LeftPedal];\r
2596                                 this.bチップがある.LeftBassDrum |= chip[Ech定義.LeftBassDrum];\r
2597                                 this.bチップがある.Guitar |= chip.bGuitar可視チップ;\r
2598                                 this.bチップがある.OpenGuitar |= chip[Ech定義.Guitar_Open];\r
2599                                 this.bチップがある.Bass |= chip.bBass可視チップ;\r
2600                                 this.bチップがある.OpenBass |= chip[Ech定義.Bass_Open];\r
2601                                 this.bチップがある.BGA |= chip.bBGALayer;\r
2602                                 this.bチップがある.Movie |= chip[Ech定義.Movie] | chip[Ech定義.MovieFull];\r
2603                                 if (CDTXMania.Instance.ConfigIni.bForceAVIFullscreen || chip[Ech定義.MovieFull])\r
2604                                 {\r
2605                                         this.bMovieをFullscreen再生する = true;\r
2606                                 }\r
2607 \r
2608                                 // 空打ちチップを変換する。\r
2609                                 chip.ConvertNoChip();\r
2610 \r
2611                                 // 無限管理オブジェクトインデックスの割当。(もしそのチップが対象であれば)\r
2612                                 chip.AssignInfiniteManageWAV(this.n無限管理WAV[nオブジェクト数値]);\r
2613                                 chip.AssignInfiniteManageBPM(this.n無限管理BPM[nオブジェクト数値]);\r
2614                                 chip.AdjustPlayPositionForFillin(nオブジェクト数値);\r
2615 \r
2616                                 // チップを配置。\r
2617                                 this.listChip.Add(chip);\r
2618                         }\r
2619                         return true;\r
2620                 }\r
2621         }\r
2622 }\r