OSDN Git Service

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