OSDN Git Service

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