2 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Drawing;
\r
6 using System.Diagnostics;
\r
8 using System.Security.Cryptography;
\r
9 using System.Reflection;
\r
10 using System.Globalization;
\r
11 using System.Threading;
\r
16 public partial class CDTX
\r
18 public void t入力(string strファイル名, bool bヘッダのみ)
\r
20 this.t入力(strファイル名, bヘッダのみ, 1.0, 0);
\r
22 public void t入力(string strファイル名, bool bヘッダのみ, double db再生速度, int nBGMAdjust)
\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
31 if (!(ext == ".dtx"))
\r
35 this.e種別 = EDTX種別.GDA;
\r
37 else if (ext == ".g2d")
\r
39 this.e種別 = EDTX種別.G2D;
\r
41 else if (ext == ".bms")
\r
43 this.e種別 = EDTX種別.BMS;
\r
45 else if (ext == ".bme")
\r
47 this.e種別 = EDTX種別.BME;
\r
49 else if (ext == ".mid")
\r
51 this.e種別 = EDTX種別.SMF;
\r
56 this.e種別 = EDTX種別.DTX;
\r
59 if (this.e種別 != EDTX種別.SMF)
\r
63 //DateTime timeBeginLoad = DateTime.Now;
\r
66 StreamReader reader = new StreamReader(strファイル名, Encoding.GetEncoding("Shift_JIS"));
\r
67 string str2 = reader.ReadToEnd();
\r
69 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );
\r
70 //Trace.TraceInformation( "DTXfileload時間: {0}", span.ToString() );
\r
72 this.t入力_全入力文字列から(str2, db再生速度, nBGMAdjust);
\r
80 Trace.TraceWarning("SMF の演奏は未対応です。(検討中)");
\r
83 public void t入力_全入力文字列から(string str全入力文字列)
\r
85 this.t入力_全入力文字列から(str全入力文字列, 1.0, 0);
\r
87 public unsafe void t入力_全入力文字列から(string str全入力文字列, double db再生速度, int nBGMAdjust)
\r
89 //DateTime timeBeginLoad = DateTime.Now;
\r
92 if (!string.IsNullOrEmpty(str全入力文字列))
\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
100 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );
\r
101 //Trace.TraceInformation( "改行カット時間: {0}", span.ToString() );
\r
102 //timeBeginLoad = DateTime.Now;
\r
104 for (int j = 0; j < 36 * 36; j++)
\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
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
117 for (int k = 0; k < 7; k++)
\r
119 this.nRESULTIMAGE用優先順位[k] = 0;
\r
120 this.nRESULTMOVIE用優先順位[k] = 0;
\r
121 this.nRESULTSOUND用優先順位[k] = 0;
\r
125 CharEnumerator ce = str全入力文字列.GetEnumerator();
\r
131 if (!this.t入力_空白と改行をスキップする(ref ce))
\r
135 if (ce.Current == '#')
\r
139 StringBuilder builder = new StringBuilder(0x20);
\r
140 if (this.t入力_コマンド文字列を抜き出す(ref ce, ref builder))
\r
142 StringBuilder builder2 = new StringBuilder(0x400);
\r
143 if (this.t入力_パラメータ文字列を抜き出す(ref ce, ref builder2))
\r
145 StringBuilder builder3 = new StringBuilder(0x400);
\r
146 if (this.t入力_コメント文字列を抜き出す(ref ce, ref builder3))
\r
148 this.t入力_行解析(ref builder, ref builder2, ref builder3);
\r
158 while (this.t入力_コメントをスキップする(ref ce));
\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
170 #region [ BPM/BMP初期化 ]
\r
172 foreach (CBPM cbpm2 in this.listBPM.Values)
\r
174 if (cbpm2.n表記上の番号 == 0)
\r
183 cbpm.n内部番号 = this.n内部番号BPM1to++;
\r
185 cbpm.dbBPM値 = 120.0;
\r
186 this.listBPM.Add(cbpm.n内部番号, cbpm);
\r
187 CChip chip = new CChip(0, 0, cbpm.n内部番号, Ech定義.BPMEx);
\r
188 this.listChip.Insert(0, chip);
\r
192 CChip chip = new CChip(0, 0, cbpm.n内部番号, Ech定義.BPMEx);
\r
193 this.listChip.Insert(0, chip);
\r
195 if (this.listBMP.ContainsKey(0))
\r
197 CChip chip = new CChip(0, 0, 0, Ech定義.BGALayer1);
\r
198 this.listChip.Insert(0, chip);
\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
207 if (cwav.nチップサイズ < 0)
\r
209 cwav.nチップサイズ = 100;
\r
211 if (cwav.n位置 <= -10000)
\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
227 // foreach( CChip chip in this.listChip )
\r
229 // if( chip.n整数値・内部番号 == cwav.n内部番号 )
\r
231 // chip.dbチップサイズ倍率 = ( (double) cwav.nチップサイズ ) / 100.0;
\r
232 // if (chip.nチャンネル番号 == 0x01 ) // BGMだったら
\r
234 // cwav.bIsOnBGMLane = true;
\r
239 foreach (CChip chip in this.listChip)
\r
241 if (this.listWAV.ContainsKey(chip.n整数値_内部番号))
\r
242 //foreach ( CWAV cwav in this.listWAV.Values )
\r
244 CWAV cwav = this.listWAV[chip.n整数値_内部番号];
\r
245 // if ( chip.n整数値・内部番号 == cwav.n内部番号 )
\r
247 chip.SetDBChipSizeFactor(((double)cwav.nチップサイズ) / 100.0);
\r
248 //if ( chip.nチャンネル番号 == 0x01 ) // BGMだったら
\r
250 // cwav.bIsOnBGMLane = true;
\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
262 // foreach ( CChip chip in this.listChip )
\r
264 // if ( chip.nチャンネル番号 == m )
\r
266 // CChip c = new CChip();
\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
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
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
292 CChip chip = new CChip(tick384, 36 * 36 - 1, Ech定義.BarLine);
\r
293 this.listChip.Add(chip);
\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
300 int n発声位置_C1_同一小節内 = 0;
\r
301 while ((nChipNo_C1 < this.listChip.Count) && (this.listChip[nChipNo_C1].n発声位置 < (tick384 + 384)))
\r
303 if (this.listChip[nChipNo_C1].eチャンネル番号 == Ech定義.BeatLineShift) // 拍線シフトの検出
\r
305 n発声位置_C1_同一小節内 = this.listChip[nChipNo_C1].n発声位置 - tick384;
\r
309 if ((this.e種別 == EDTX種別.BMS) || (this.e種別 == EDTX種別.BME))
\r
313 while ((nChipNo_BarLength < this.listChip.Count) && (this.listChip[nChipNo_BarLength].n発声位置 <= tick384))
\r
315 if (this.listChip[nChipNo_BarLength].eチャンネル番号 == Ech定義.BarLength) // bar lengthの検出
\r
317 barlength = this.listChip[nChipNo_BarLength].db実数値;
\r
319 nChipNo_BarLength++;
\r
321 for (int i = 0; i < 100; i++) // 拍線の挿入
\r
323 int tickBeat = (int)(((double)(384 * i)) / (4.0 * barlength));
\r
324 if ((tickBeat + n発声位置_C1_同一小節内) >= 384)
\r
328 if (((tickBeat + n発声位置_C1_同一小節内) % 384) != 0)
\r
330 CChip chip = new CChip(tick384 + (tickBeat + n発声位置_C1_同一小節内), 36 * 36 - 1, Ech定義.BeatLine);
\r
331 this.listChip.Add(chip);
\r
335 this.listChip.Sort();
\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
345 bool bChangedBeatBarStatus = false;
\r
346 if ((this.listChip[i].eチャンネル番号 == Ech定義.BeatLineDisplay))
\r
348 if (this.listChip[i].n整数値 == 1) // BAR/BEAT LINE = ON
\r
350 bShowBeatBarLine = true;
\r
351 bChangedBeatBarStatus = true;
\r
353 else if (this.listChip[i].n整数値 == 2) // BAR/BEAT LINE = OFF
\r
355 bShowBeatBarLine = false;
\r
356 bChangedBeatBarStatus = true;
\r
359 int startIndex = i;
\r
360 if (bChangedBeatBarStatus) // C2チップの前に50/51チップが来ている可能性に配慮
\r
362 while (startIndex > 0 && this.listChip[startIndex].n発声位置 == this.listChip[i].n発声位置)
\r
366 startIndex++; // 1つ小さく過ぎているので、戻す
\r
368 for (int j = startIndex; j <= i; j++)
\r
370 if (((this.listChip[j].eチャンネル番号 == Ech定義.BarLine) || (this.listChip[j].eチャンネル番号 == Ech定義.BeatLine)) &&
\r
371 (this.listChip[j].n整数値 == (36 * 36 - 1)))
\r
373 this.listChip[j].b可視 = bShowBeatBarLine;
\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
387 foreach (CChip chip in this.listChip)
\r
389 chip.CalculatePlayPositionMs(e種別, BASEBPM, listBPM, listAVIPAN, listBGAPAN,
\r
390 ref bpm, ref dbBarLength, ref nPlayPosition, ref ms, ref nBar);
\r
392 if (this.db再生速度 > 0.0)
\r
394 double _db再生速度 = (CDTXMania.Instance.DTXVmode.Enabled) ? this.dbDTXVPlaySpeed : this.db再生速度;
\r
395 foreach (CChip chip in this.listChip)
\r
397 chip.ApplyPlaySpeed(_db再生速度);
\r
401 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );
\r
402 //Trace.TraceInformation( "発声時刻計算: {0}", span.ToString() );
\r
403 //timeBeginLoad = DateTime.Now;
\r
404 this.nBGMAdjust = 0;
\r
405 this.t各自動再生音チップの再生時刻を変更する(nBGMAdjust);
\r
406 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );
\r
407 //Trace.TraceInformation( "再生時刻変更: {0}", span.ToString() );
\r
408 //timeBeginLoad = DateTime.Now;
\r
409 #region [ 可視チップ数カウント ]
\r
410 for (E楽器パート inst = E楽器パート.DRUMS; inst <= E楽器パート.BASS; ++inst)
\r
412 this.n可視チップ数[inst] = 0;
\r
414 foreach (CChip chip in this.listChip)
\r
416 if (chip.bDrums可視チップ && !chip.b空打ちチップである)
\r
418 this.n可視チップ数.Drums++;
\r
420 if (chip.bGuitar可視チップ)
\r
422 this.n可視チップ数.Guitar++;
\r
424 if (chip.bBass可視チップ)
\r
426 this.n可視チップ数.Bass++;
\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
437 chip.bWAVを使うチャンネルである &&
\r
438 this.listWAV.ContainsKey(chip.n整数値_内部番号)) &&
\r
439 !this.listWAV[chip.n整数値_内部番号].listこのWAVを使用するチャンネル番号の集合.Contains(chip.eチャンネル番号))
\r
441 this.listWAV[chip.n整数値_内部番号].listこのWAVを使用するチャンネル番号の集合.Add(chip.eチャンネル番号);
\r
443 switch (chip.ESoundChipTypeを得る)
\r
445 case ESoundChipType.Drums:
\r
446 if (!chip.b空打ちチップである)
\r
448 this.listWAV[chip.n整数値_内部番号].bIsDrumsSound = true;
\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
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
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
475 catch (Exception exception)
\r
477 Trace.TraceError(exception.Message);
\r
478 Trace.TraceError("DTXのハッシュの計算に失敗しました。({0})", this.strファイル名の絶対パス);
\r
480 if (buffer != null)
\r
482 byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash(buffer);
\r
483 StringBuilder sb = new StringBuilder();
\r
484 foreach (byte b in buffer2)
\r
486 sb.Append(b.ToString("x2"));
\r
488 this.strハッシュofDTXファイル = sb.ToString();
\r
492 this.strハッシュofDTXファイル = "00000000000000000000000000000000";
\r
495 //span = (TimeSpan) ( DateTime.Now - timeBeginLoad );
\r
496 //Trace.TraceInformation( "hash計算: {0}", span.ToString() );
\r
497 //timeBeginLoad = DateTime.Now;
\r
498 #region [ bLogDTX詳細ログ出力 ]
\r
499 if (CDTXMania.Instance.ConfigIni.bLogDTX詳細ログ出力)
\r
501 foreach (CWAV cwav in this.listWAV.Values)
\r
503 Trace.TraceInformation(cwav.ToString());
\r
505 foreach (CAVI cavi in this.listAVI.Values)
\r
507 Trace.TraceInformation(cavi.ToString());
\r
509 foreach (CAVIPAN cavipan in this.listAVIPAN.Values)
\r
511 Trace.TraceInformation(cavipan.ToString());
\r
513 foreach (CBGA cbga in this.listBGA.Values)
\r
515 Trace.TraceInformation(cbga.ToString());
\r
517 foreach (CBGAPAN cbgapan in this.listBGAPAN.Values)
\r
519 Trace.TraceInformation(cbgapan.ToString());
\r
521 foreach (CBMP cbmp in this.listBMP.Values)
\r
523 Trace.TraceInformation(cbmp.ToString());
\r
525 foreach (CBMPTEX cbmptex in this.listBMPTEX.Values)
\r
527 Trace.TraceInformation(cbmptex.ToString());
\r
529 foreach (CBPM cbpm3 in this.listBPM.Values)
\r
531 Trace.TraceInformation(cbpm3.ToString());
\r
533 foreach (CChip chip in this.listChip)
\r
535 Trace.TraceInformation(chip.ToString());
\r
540 // #36177 使用レーン数の表示 add ikanick 16.03.20
\r
541 #region [ 使用レーン数カウント ]
\r
543 for (E楽器パート inst = E楽器パート.DRUMS; inst <= E楽器パート.BASS; ++inst)
\r
545 this.n使用レーン数[inst] = 0;
\r
547 this.n使用レーン数.Drums = 0;
\r
548 foreach (CChip chip in this.listChip)
\r
550 int ch = (int)chip.eチャンネル番号;
\r
551 if (chip.bDrums可視チップ) {
\r
552 if ( this.n使用レーン数.Drums == 0 ) this.n使用レーン数.Drums = 6;
\r
553 if ( this.n使用レーン数.Drums < 10 ) {
\r
554 if ( ( chip.eチャンネル番号 == Ech定義.FloorTom )
\r
555 || ( chip.eチャンネル番号 == Ech定義.HiHatOpen )
\r
556 || ( chip.eチャンネル番号 == Ech定義.RideCymbal )
\r
557 || ( chip.eチャンネル番号 == Ech定義.LeftCymbal ) )
\r
559 this.n使用レーン数.Drums = 10;
\r
562 if ( this.n使用レーン数.Drums < 12 ) {
\r
563 if ( ( chip.eチャンネル番号 == Ech定義.LeftPedal )
\r
564 || ( chip.eチャンネル番号 == Ech定義.LeftBassDrum ) )
\r
566 this.n使用レーン数.Drums = 12;
\r
570 if (chip.bGuitar可視チップ) {
\r
572 //if ( this.n使用レーン数.Guitar == 0 ) this.n使用レーン数.Guitar = 3;
\r
574 if (chip.bBass可視チップ) {
\r
576 //if ( this.n使用レーン数.Bass == 0 ) this.n使用レーン数.Bass = 3;
\r
586 private bool t入力_コマンド文字列を抜き出す(ref CharEnumerator ce, ref StringBuilder sb文字列)
\r
588 if (!this.t入力_空白をスキップする(ref ce))
\r
589 return false; // 文字が尽きた
\r
591 #region [ コマンド終端文字(':')、半角空白、コメント開始文字(';')、改行のいずれかが出現するまでをコマンド文字列と見なし、sb文字列 にコピーする。]
\r
592 //-----------------
\r
593 while (ce.Current != ':' && ce.Current != ' ' && ce.Current != ';' && ce.Current != '\n')
\r
595 sb文字列.Append(ce.Current);
\r
597 if (!ce.MoveNext())
\r
598 return false; // 文字が尽きた
\r
600 //-----------------
\r
603 #region [ コマンド終端文字(':')で終端したなら、その次から空白をスキップしておく。]
\r
604 //-----------------
\r
605 if (ce.Current == ':')
\r
607 if (!ce.MoveNext())
\r
608 return false; // 文字が尽きた
\r
610 if (!this.t入力_空白をスキップする(ref ce))
\r
611 return false; // 文字が尽きた
\r
613 //-----------------
\r
618 private bool t入力_コメントをスキップする(ref CharEnumerator ce)
\r
620 // 改行が現れるまでをコメントと見なしてスキップする。
\r
622 while (ce.Current != '\n')
\r
624 if (!ce.MoveNext())
\r
625 return false; // 文字が尽きた
\r
628 // 改行の次の文字へ移動した結果を返す。
\r
630 return ce.MoveNext();
\r
632 private bool t入力_コメント文字列を抜き出す(ref CharEnumerator ce, ref StringBuilder sb文字列)
\r
634 if (ce.Current != ';') // コメント開始文字(';')じゃなければ正常帰還。
\r
637 if (!ce.MoveNext()) // ';' の次で文字列が終わってたら終了帰還。
\r
640 #region [ ';' の次の文字から '\n' の1つ前までをコメント文字列と見なし、sb文字列にコピーする。]
\r
641 //-----------------
\r
642 while (ce.Current != '\n')
\r
644 sb文字列.Append(ce.Current);
\r
646 if (!ce.MoveNext())
\r
649 //-----------------
\r
654 private void t入力_パラメータ食い込みチェック(string strコマンド名, ref string strコマンド, ref string strパラメータ)
\r
656 if ((strコマンド.Length > strコマンド名.Length) && strコマンド.StartsWith(strコマンド名, StringComparison.OrdinalIgnoreCase))
\r
658 strパラメータ = strコマンド.Substring(strコマンド名.Length).Trim();
\r
659 strコマンド = strコマンド.Substring(0, strコマンド名.Length);
\r
662 private bool t入力_パラメータ文字列を抜き出す(ref CharEnumerator ce, ref StringBuilder sb文字列)
\r
664 if (!this.t入力_空白をスキップする(ref ce))
\r
665 return false; // 文字が尽きた
\r
667 #region [ 改行またはコメント開始文字(';')が出現するまでをパラメータ文字列と見なし、sb文字列 にコピーする。]
\r
668 //-----------------
\r
669 while (ce.Current != '\n' && ce.Current != ';')
\r
671 sb文字列.Append(ce.Current);
\r
673 if (!ce.MoveNext())
\r
676 //-----------------
\r
681 private bool t入力_空白と改行をスキップする(ref CharEnumerator ce)
\r
683 // 空白と改行が続く間はこれらをスキップする。
\r
685 while (ce.Current == ' ' || ce.Current == '\n')
\r
687 if (ce.Current == '\n')
\r
688 this.n現在の行数++; // 改行文字では行番号が増える。
\r
690 if (!ce.MoveNext())
\r
691 return false; // 文字が尽きた
\r
696 private bool t入力_空白をスキップする(ref CharEnumerator ce)
\r
698 // 空白が続く間はこれをスキップする。
\r
700 while (ce.Current == ' ')
\r
702 if (!ce.MoveNext())
\r
703 return false; // 文字が尽きた
\r
708 private void t入力_行解析(ref StringBuilder sbコマンド, ref StringBuilder sbパラメータ, ref StringBuilder sbコメント)
\r
710 string strコマンド = sbコマンド.ToString();
\r
711 string strパラメータ = sbパラメータ.ToString().Trim();
\r
712 string strコメント = sbコメント.ToString();
\r
717 //-----------------
\r
718 if (strコマンド.StartsWith("IF", StringComparison.OrdinalIgnoreCase))
\r
720 this.t入力_パラメータ食い込みチェック("IF", ref strコマンド, ref strパラメータ);
\r
722 if (this.bstackIFからENDIFをスキップする.Count == 255)
\r
724 Trace.TraceWarning("#IF の入れ子の数が 255 を超えました。この #IF を無視します。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
726 else if (this.bstackIFからENDIFをスキップする.Peek())
\r
728 this.bstackIFからENDIFをスキップする.Push(true); // 親が true ならその入れ子も問答無用で true 。
\r
730 else // 親が false なら入れ子はパラメータと乱数を比較して結果を判断する。
\r
734 if (!int.TryParse(strパラメータ, out n数値))
\r
737 this.bstackIFからENDIFをスキップする.Push(n数値 != this.n現在の乱数); // 乱数と数値が一致したら true 。
\r
740 //-----------------
\r
743 //-----------------
\r
744 else if (strコマンド.StartsWith("ENDIF", StringComparison.OrdinalIgnoreCase))
\r
746 this.t入力_パラメータ食い込みチェック("ENDIF", ref strコマンド, ref strパラメータ);
\r
748 if (this.bstackIFからENDIFをスキップする.Count > 1)
\r
750 this.bstackIFからENDIFをスキップする.Pop(); // 入れ子を1つ脱出。
\r
754 Trace.TraceWarning("#ENDIF に対応する #IF がありません。この #ENDIF を無視します。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
757 //-----------------
\r
760 else if (!this.bstackIFからENDIFをスキップする.Peek()) // IF~ENDIF をスキップするなら以下はすべて無視。
\r
762 #region [ PATH_WAV ]
\r
763 //-----------------
\r
764 if (strコマンド.StartsWith("PATH_WAV", StringComparison.OrdinalIgnoreCase))
\r
766 this.t入力_パラメータ食い込みチェック("PATH_WAV", ref strコマンド, ref strパラメータ);
\r
767 this.PATH_WAV = strパラメータ;
\r
769 //-----------------
\r
772 //-----------------
\r
773 else if (strコマンド.StartsWith("TITLE", StringComparison.OrdinalIgnoreCase))
\r
775 this.t入力_パラメータ食い込みチェック("TITLE", ref strコマンド, ref strパラメータ);
\r
776 this.TITLE = strパラメータ;
\r
778 //-----------------
\r
781 //-----------------
\r
782 else if (strコマンド.StartsWith("ARTIST", StringComparison.OrdinalIgnoreCase))
\r
784 this.t入力_パラメータ食い込みチェック("ARTIST", ref strコマンド, ref strパラメータ);
\r
785 this.ARTIST = strパラメータ;
\r
787 //-----------------
\r
789 #region [ COMMENT ]
\r
790 //-----------------
\r
791 else if (strコマンド.StartsWith("COMMENT", StringComparison.OrdinalIgnoreCase))
\r
793 this.t入力_パラメータ食い込みチェック("COMMENT", ref strコマンド, ref strパラメータ);
\r
794 this.COMMENT = strパラメータ;
\r
796 //-----------------
\r
798 #region [ DLEVEL, PLAYLEVEL ]
\r
799 //-----------------
\r
801 strコマンド.StartsWith("DLEVEL", StringComparison.OrdinalIgnoreCase) ||
\r
802 strコマンド.StartsWith("PLAYLEVEL", StringComparison.OrdinalIgnoreCase))
\r
804 this.t入力_パラメータ食い込みチェック("DLEVEL", ref strコマンド, ref strパラメータ);
\r
805 this.t入力_パラメータ食い込みチェック("PLAYLEVEL", ref strコマンド, ref strパラメータ);
\r
808 if (int.TryParse(strパラメータ, out dlevel))
\r
810 this.LEVEL.Drums = Math.Min(Math.Max(dlevel, 0), 100); // 0~100 に丸める
\r
813 //-----------------
\r
816 //-----------------
\r
817 else if (strコマンド.StartsWith("GLEVEL", StringComparison.OrdinalIgnoreCase))
\r
819 this.t入力_パラメータ食い込みチェック("GLEVEL", ref strコマンド, ref strパラメータ);
\r
822 if (int.TryParse(strパラメータ, out glevel))
\r
824 this.LEVEL.Guitar = Math.Min(Math.Max(glevel, 0), 100); // 0~100 に丸める
\r
827 //-----------------
\r
830 //-----------------
\r
831 else if (strコマンド.StartsWith("BLEVEL", StringComparison.OrdinalIgnoreCase))
\r
833 this.t入力_パラメータ食い込みチェック("BLEVEL", ref strコマンド, ref strパラメータ);
\r
836 if (int.TryParse(strパラメータ, out blevel))
\r
838 this.LEVEL.Bass = Math.Min(Math.Max(blevel, 0), 100); // 0~100 に丸める
\r
841 //-----------------
\r
843 #if TEST_NOTEOFFMODE
\r
844 else if (str.StartsWith("SUPRESSNOTEOFF_HIHAT", StringComparison.OrdinalIgnoreCase)) {
\r
845 this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_HIHAT", ref str, ref str2);
\r
846 this.bHH演奏で直前のHHを消音する = !str2.ToLower().Equals("on");
\r
848 else if (str.StartsWith("SUPRESSNOTEOFF_GUITAR", StringComparison.OrdinalIgnoreCase)) {
\r
849 this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_GUITAR", ref str, ref str2);
\r
850 this.bGUITAR演奏で直前のGUITARを消音する = !str2.ToLower().Equals("on");
\r
852 else if (str.StartsWith("SUPRESSNOTEOFF_BASS", StringComparison.OrdinalIgnoreCase)) {
\r
853 this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_BASS", ref str, ref str2);
\r
854 this.bBASS演奏で直前のBASSを消音する = !str2.ToLower().Equals("on");
\r
858 //-----------------
\r
859 else if (strコマンド.StartsWith("GENRE", StringComparison.OrdinalIgnoreCase))
\r
861 this.t入力_パラメータ食い込みチェック("GENRE", ref strコマンド, ref strパラメータ);
\r
862 this.GENRE = strパラメータ;
\r
864 //-----------------
\r
866 #region [ HIDDENLEVEL ]
\r
867 //-----------------
\r
868 else if (strコマンド.StartsWith("HIDDENLEVEL", StringComparison.OrdinalIgnoreCase))
\r
870 this.t入力_パラメータ食い込みチェック("HIDDENLEVEL", ref strコマンド, ref strパラメータ);
\r
871 this.HIDDENLEVEL = strパラメータ.ToLower().Equals("on");
\r
873 //-----------------
\r
875 #region [ STAGEFILE ]
\r
876 //-----------------
\r
877 else if (strコマンド.StartsWith("STAGEFILE", StringComparison.OrdinalIgnoreCase))
\r
879 this.t入力_パラメータ食い込みチェック("STAGEFILE", ref strコマンド, ref strパラメータ);
\r
880 this.STAGEFILE = strパラメータ;
\r
882 //-----------------
\r
884 #region [ PREVIEW ]
\r
885 //-----------------
\r
886 else if (strコマンド.StartsWith("PREVIEW", StringComparison.OrdinalIgnoreCase))
\r
888 this.t入力_パラメータ食い込みチェック("PREVIEW", ref strコマンド, ref strパラメータ);
\r
889 this.PREVIEW = strパラメータ;
\r
891 //-----------------
\r
893 #region [ PREIMAGE ]
\r
894 //-----------------
\r
895 else if (strコマンド.StartsWith("PREIMAGE", StringComparison.OrdinalIgnoreCase))
\r
897 this.t入力_パラメータ食い込みチェック("PREIMAGE", ref strコマンド, ref strパラメータ);
\r
898 this.PREIMAGE = strパラメータ;
\r
900 //-----------------
\r
902 #region [ PREMOVIE ]
\r
903 //-----------------
\r
904 else if (strコマンド.StartsWith("PREMOVIE", StringComparison.OrdinalIgnoreCase))
\r
906 this.t入力_パラメータ食い込みチェック("PREMOVIE", ref strコマンド, ref strパラメータ);
\r
907 this.PREMOVIE = strパラメータ;
\r
909 //-----------------
\r
911 #region [ USE 556 x 710 BGAAVI ]
\r
913 else if (strコマンド.StartsWith("USE556X710BGAAVI", StringComparison.OrdinalIgnoreCase))
\r
915 this.t入力_パラメータ食い込みチェック("USE556X710BGAAVI", ref strコマンド, ref strパラメータ);
\r
916 this.bUse556x710BGAAVI = strパラメータ == "1" ? true : false;
\r
919 #region [ BACKGROUND_GR ]
\r
920 //-----------------
\r
921 else if (strコマンド.StartsWith("BACKGROUND_GR", StringComparison.OrdinalIgnoreCase))
\r
923 this.t入力_パラメータ食い込みチェック("BACKGROUND_GR", ref strコマンド, ref strパラメータ);
\r
924 this.BACKGROUND_GR = strパラメータ;
\r
926 //-----------------
\r
928 #region [ BACKGROU}ND, WALL ]
\r
929 //-----------------
\r
931 strコマンド.StartsWith("BACKGROUND", StringComparison.OrdinalIgnoreCase) ||
\r
932 strコマンド.StartsWith("WALL", StringComparison.OrdinalIgnoreCase))
\r
934 this.t入力_パラメータ食い込みチェック("BACKGROUND", ref strコマンド, ref strパラメータ);
\r
935 this.t入力_パラメータ食い込みチェック("WALL", ref strコマンド, ref strパラメータ);
\r
936 this.BACKGROUND = strパラメータ;
\r
938 //-----------------
\r
941 //-----------------
\r
942 else if (strコマンド.StartsWith("RANDOM", StringComparison.OrdinalIgnoreCase))
\r
944 this.t入力_パラメータ食い込みチェック("RANDOM", ref strコマンド, ref strパラメータ);
\r
947 if (!int.TryParse(strパラメータ, out n数値))
\r
950 this.n現在の乱数 = CDTXMania.Instance.Random.Next(n数値) + 1; // 1~数値 までの乱数を生成。
\r
952 //-----------------
\r
954 #region [ SOUND_NOWLOADING ]
\r
955 //-----------------
\r
956 else if (strコマンド.StartsWith("SOUND_NOWLOADING", StringComparison.OrdinalIgnoreCase))
\r
958 this.t入力_パラメータ食い込みチェック("SOUND_NOWLOADING", ref strコマンド, ref strパラメータ);
\r
959 this.SOUND_NOWLOADING = strパラメータ;
\r
961 //-----------------
\r
964 //-----------------
\r
965 else if (strコマンド.StartsWith("BPM", StringComparison.OrdinalIgnoreCase))
\r
967 this.t入力_行解析_BPM_BPMzz(strコマンド, strパラメータ, strコメント);
\r
969 //-----------------
\r
971 #region [ DTXVPLAYSPEED ]
\r
972 //-----------------
\r
973 else if (strコマンド.StartsWith("DTXVPLAYSPEED", StringComparison.OrdinalIgnoreCase))
\r
975 this.t入力_パラメータ食い込みチェック("DTXVPLAYSPEED", ref strコマンド, ref strパラメータ);
\r
977 double dtxvplayspeed = 0.0;
\r
978 if (TryParse(strパラメータ, out dtxvplayspeed) && dtxvplayspeed > 0.0)
\r
980 this.dbDTXVPlaySpeed = dtxvplayspeed;
\r
983 //-----------------
\r
985 else if (!this.bヘッダのみ) // ヘッダのみの解析の場合、以下は無視。
\r
988 //-----------------
\r
989 if (strコマンド.StartsWith("PANEL", StringComparison.OrdinalIgnoreCase))
\r
991 this.t入力_パラメータ食い込みチェック("PANEL", ref strコマンド, ref strパラメータ);
\r
993 int dummyResult; // #23885 2010.12.12 yyagi: not to confuse "#PANEL strings (panel)" and "#PANEL int (panpot of EL)"
\r
994 if (!int.TryParse(strパラメータ, out dummyResult))
\r
995 { // 数値じゃないならPANELとみなす
\r
996 this.PANEL = strパラメータ; //
\r
998 } // 数値ならPAN ELとみなす
\r
1001 //-----------------
\r
1003 #region [ MIDIFILE ]
\r
1004 //-----------------
\r
1005 else if (strコマンド.StartsWith("MIDIFILE", StringComparison.OrdinalIgnoreCase))
\r
1007 this.t入力_パラメータ食い込みチェック("MIDIFILE", ref strコマンド, ref strパラメータ);
\r
1008 this.MIDIFILE = strパラメータ;
\r
1010 //-----------------
\r
1012 #region [ MIDINOTE ]
\r
1013 //-----------------
\r
1014 else if (strコマンド.StartsWith("MIDINOTE", StringComparison.OrdinalIgnoreCase))
\r
1016 this.t入力_パラメータ食い込みチェック("MIDINOTE", ref strコマンド, ref strパラメータ);
\r
1017 this.MIDINOTE = strパラメータ.ToLower().Equals("on");
\r
1019 //-----------------
\r
1021 #region [ BLACKCOLORKEY ]
\r
1022 //-----------------
\r
1023 else if (strコマンド.StartsWith("BLACKCOLORKEY", StringComparison.OrdinalIgnoreCase))
\r
1025 this.t入力_パラメータ食い込みチェック("BLACKCOLORKEY", ref strコマンド, ref strパラメータ);
\r
1026 this.BLACKCOLORKEY = strパラメータ.ToLower().Equals("on");
\r
1028 //-----------------
\r
1030 #region [ BASEBPM ]
\r
1031 //-----------------
\r
1032 else if (strコマンド.StartsWith("BASEBPM", StringComparison.OrdinalIgnoreCase))
\r
1034 this.t入力_パラメータ食い込みチェック("BASEBPM", ref strコマンド, ref strパラメータ);
\r
1036 double basebpm = 0.0;
\r
1037 //if( double.TryParse( str2, out num6 ) && ( num6 > 0.0 ) )
\r
1038 if (TryParse(strパラメータ, out basebpm) && basebpm > 0.0) // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point
\r
1039 { // #24204 2011.01.21 yyagi: Fix the condition correctly
\r
1040 this.BASEBPM = basebpm;
\r
1043 //-----------------
\r
1045 #region [ SOUND_STAGEFAILED ]
\r
1046 //-----------------
\r
1047 else if (strコマンド.StartsWith("SOUND_STAGEFAILED", StringComparison.OrdinalIgnoreCase))
\r
1049 this.t入力_パラメータ食い込みチェック("SOUND_STAGEFAILED", ref strコマンド, ref strパラメータ);
\r
1050 this.SOUND_STAGEFAILED = strパラメータ;
\r
1052 //-----------------
\r
1054 #region [ SOUND_FULLCOMBO ]
\r
1055 //-----------------
\r
1056 else if (strコマンド.StartsWith("SOUND_FULLCOMBO", StringComparison.OrdinalIgnoreCase))
\r
1058 this.t入力_パラメータ食い込みチェック("SOUND_FULLCOMBO", ref strコマンド, ref strパラメータ);
\r
1059 this.SOUND_FULLCOMBO = strパラメータ;
\r
1061 //-----------------
\r
1063 #region [ SOUND_AUDIENCE ]
\r
1064 //-----------------
\r
1065 else if (strコマンド.StartsWith("SOUND_AUDIENCE", StringComparison.OrdinalIgnoreCase))
\r
1067 this.t入力_パラメータ食い込みチェック("SOUND_AUDIENCE", ref strコマンド, ref strパラメータ);
\r
1068 this.SOUND_AUDIENCE = strパラメータ;
\r
1070 //-----------------
\r
1073 // オブジェクト記述コマンドの処理。
\r
1075 else if (!this.t入力_行解析_WAVVOL_VOLUME(strコマンド, strパラメータ, strコメント) &&
\r
1076 !this.t入力_行解析_WAVPAN_PAN(strコマンド, strパラメータ, strコメント) &&
\r
1077 !this.t入力_行解析_WAV(strコマンド, strパラメータ, strコメント) &&
\r
1078 !this.t入力_行解析_BMPTEX(strコマンド, strパラメータ, strコメント) &&
\r
1079 !this.t入力_行解析_BMP(strコマンド, strパラメータ, strコメント) &&
\r
1080 !this.t入力_行解析_BGAPAN(strコマンド, strパラメータ, strコメント) &&
\r
1081 !this.t入力_行解析_BGA(strコマンド, strパラメータ, strコメント) &&
\r
1082 !this.t入力_行解析_AVIPAN(strコマンド, strパラメータ, strコメント) &&
\r
1083 !this.t入力_行解析_AVI_VIDEO(strコマンド, strパラメータ, strコメント) &&
\r
1084 // !this.t入力_行解析_BPM_BPMzz( strコマンド, strパラメータ, strコメント ) && // bヘッダのみ==trueの場合でもチェックするよう変更
\r
1085 !this.t入力_行解析_RESULTIMAGE(strコマンド, strパラメータ, strコメント) &&
\r
1086 !this.t入力_行解析_RESULTMOVIE(strコマンド, strパラメータ, strコメント) &&
\r
1087 !this.t入力_行解析_RESULTSOUND(strコマンド, strパラメータ, strコメント) &&
\r
1088 !this.t入力_行解析_SIZE(strコマンド, strパラメータ, strコメント))
\r
1090 this.t入力_行解析_チップ配置(strコマンド, strパラメータ, strコメント);
\r
1093 Debug.Assert(true); // #23885 2010.12.12 yyagi: dummy line to exit parsing the line
\r
1094 // 2011.8.17 from: "int xx=0;" から変更。毎回警告が出るので。
\r
1097 //{ // Duration測定のため、bヘッダのみ==trueでも、チップ配置は行う
\r
1098 // this.t入力・行解析・チップ配置( strコマンド, strパラメータ, strコメント );
\r
1102 private bool t入力_行解析_AVI_VIDEO(string strコマンド, string strパラメータ, string strコメント)
\r
1106 #region [ "AVI" or "VIDEO" で始まらないコマンドは無効。]
\r
1107 //-----------------
\r
1108 if (strコマンド.StartsWith("AVI", StringComparison.OrdinalIgnoreCase))
\r
1109 strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"AVI"文字を除去。
\r
1111 else if (strコマンド.StartsWith("VIDEO", StringComparison.OrdinalIgnoreCase))
\r
1112 strコマンド = strコマンド.Substring(5); // strコマンド から先頭の"VIDEO"文字を除去。
\r
1116 //-----------------
\r
1121 if (strコマンド.Length < 2)
\r
1122 return false; // AVI番号 zz がないなら無効。
\r
1124 #region [ AVI番号 zz を取得する。]
\r
1125 //-----------------
\r
1126 int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
1127 if (zz < 0 || zz >= 36 * 36)
\r
1129 Trace.TraceError("AVI(VIDEO)番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1132 //-----------------
\r
1135 #region [ AVIリストに {zz, avi} の組を登録する。 ]
\r
1136 //-----------------
\r
1137 var avi = new CAVI(zz, strパラメータ, strコメント, CDTXMania.Instance.ConfigIni.n演奏速度);
\r
1139 if (this.listAVI.ContainsKey(zz)) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
1140 this.listAVI.Remove(zz);
\r
1142 this.listAVI.Add(zz, avi);
\r
1143 //-----------------
\r
1148 private bool t入力_行解析_AVIPAN(string strコマンド, string strパラメータ, string strコメント)
\r
1152 #region [ "AVIPAN" で始まらないコマンドは無効。]
\r
1153 //-----------------
\r
1154 if (!strコマンド.StartsWith("AVIPAN", StringComparison.OrdinalIgnoreCase))
\r
1157 strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"AVIPAN"文字を除去。
\r
1158 //-----------------
\r
1163 if (strコマンド.Length < 2)
\r
1164 return false; // AVIPAN番号 zz がないなら無効。
\r
1166 #region [ AVIPAN番号 zz を取得する。]
\r
1167 //-----------------
\r
1168 int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
1169 if (zz < 0 || zz >= 36 * 36)
\r
1171 Trace.TraceError("AVIPAN番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1174 //-----------------
\r
1177 var avipan = new CAVIPAN()
\r
1182 // パラメータ引数(14個)を取得し、avipan に登録していく。
\r
1184 string[] strParams = strパラメータ.Split(new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries);
\r
1186 #region [ パラメータ引数は全14個ないと無効。]
\r
1187 //-----------------
\r
1188 if (strParams.Length < 14)
\r
1190 Trace.TraceError("AVIPAN: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1193 //-----------------
\r
1199 #region [ 1. AVI番号 ]
\r
1200 //-----------------
\r
1201 if (string.IsNullOrEmpty(strParams[i]) || strParams[i].Length > 2)
\r
1203 Trace.TraceError("AVIPAN: {2}番目の数(AVI番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1206 avipan.nAVI番号 = C変換.n36進数2桁の文字列を数値に変換して返す(strParams[i]);
\r
1207 if (avipan.nAVI番号 < 1 || avipan.nAVI番号 >= 36 * 36)
\r
1209 Trace.TraceError("AVIPAN: {2}番目の数(AVI番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1213 //-----------------
\r
1215 #region [ 2. 開始転送サイズ・幅 ]
\r
1216 //-----------------
\r
1218 if (!int.TryParse(strParams[i], out n値))
\r
1220 Trace.TraceError("AVIPAN: {2}番目の引数(開始転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1223 avipan.sz開始サイズ.Width = n値;
\r
1225 //-----------------
\r
1227 #region [ 3. 転送サイズ・高さ ]
\r
1228 //-----------------
\r
1230 if (!int.TryParse(strParams[i], out n値))
\r
1232 Trace.TraceError("AVIPAN: {2}番目の引数(開始転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1235 avipan.sz開始サイズ.Height = n値;
\r
1237 //-----------------
\r
1239 #region [ 4. 終了転送サイズ・幅 ]
\r
1240 //-----------------
\r
1242 if (!int.TryParse(strParams[i], out n値))
\r
1244 Trace.TraceError("AVIPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1247 avipan.sz終了サイズ.Width = n値;
\r
1249 //-----------------
\r
1251 #region [ 5. 終了転送サイズ・高さ ]
\r
1252 //-----------------
\r
1254 if (!int.TryParse(strParams[i], out n値))
\r
1256 Trace.TraceError("AVIPAN: {2}番目の引数(終了転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1259 avipan.sz終了サイズ.Height = n値;
\r
1261 //-----------------
\r
1263 #region [ 6. 動画側開始位置・X ]
\r
1264 //-----------------
\r
1266 if (!int.TryParse(strParams[i], out n値))
\r
1268 Trace.TraceError("AVIPAN: {2}番目の引数(動画側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1271 avipan.pt動画側開始位置.X = n値;
\r
1273 //-----------------
\r
1275 #region [ 7. 動画側開始位置・Y ]
\r
1276 //-----------------
\r
1278 if (!int.TryParse(strParams[i], out n値))
\r
1280 Trace.TraceError("AVIPAN: {2}番目の引数(動画側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1283 avipan.pt動画側開始位置.Y = n値;
\r
1285 //-----------------
\r
1287 #region [ 8. 動画側終了位置・X ]
\r
1288 //-----------------
\r
1290 if (!int.TryParse(strParams[i], out n値))
\r
1292 Trace.TraceError("AVIPAN: {2}番目の引数(動画側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1295 avipan.pt動画側終了位置.X = n値;
\r
1297 //-----------------
\r
1299 #region [ 9. 動画側終了位置・Y ]
\r
1300 //-----------------
\r
1302 if (!int.TryParse(strParams[i], out n値))
\r
1304 Trace.TraceError("AVIPAN: {2}番目の引数(動画側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1307 avipan.pt動画側終了位置.Y = n値;
\r
1309 //-----------------
\r
1311 #region [ 10.表示側開始位置・X ]
\r
1312 //-----------------
\r
1314 if (!int.TryParse(strParams[i], out n値))
\r
1316 Trace.TraceError("AVIPAN: {2}番目の引数(表示側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1319 avipan.pt表示側開始位置.X = n値;
\r
1321 //-----------------
\r
1323 #region [ 11.表示側開始位置・Y ]
\r
1324 //-----------------
\r
1326 if (!int.TryParse(strParams[i], out n値))
\r
1328 Trace.TraceError("AVIPAN: {2}番目の引数(表示側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1331 avipan.pt表示側開始位置.Y = n値;
\r
1333 //-----------------
\r
1335 #region [ 12.表示側終了位置・X ]
\r
1336 //-----------------
\r
1338 if (!int.TryParse(strParams[i], out n値))
\r
1340 Trace.TraceError("AVIPAN: {2}番目の引数(表示側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1343 avipan.pt表示側終了位置.X = n値;
\r
1345 //-----------------
\r
1347 #region [ 13.表示側終了位置・Y ]
\r
1348 //-----------------
\r
1350 if (!int.TryParse(strParams[i], out n値))
\r
1352 Trace.TraceError("AVIPAN: {2}番目の引数(表示側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1355 avipan.pt表示側終了位置.Y = n値;
\r
1357 //-----------------
\r
1359 #region [ 14.移動時間 ]
\r
1360 //-----------------
\r
1362 if (!int.TryParse(strParams[i], out n値))
\r
1364 Trace.TraceError("AVIPAN: {2}番目の引数(移動時間)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1371 avipan.n移動時間ct = n値;
\r
1373 //-----------------
\r
1376 #region [ AVIPANリストに {zz, avipan} の組を登録する。]
\r
1377 //-----------------
\r
1378 if (this.listAVIPAN.ContainsKey(zz)) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
1379 this.listAVIPAN.Remove(zz);
\r
1381 this.listAVIPAN.Add(zz, avipan);
\r
1382 //-----------------
\r
1387 private bool t入力_行解析_BGA(string strコマンド, string strパラメータ, string strコメント)
\r
1391 #region [ "BGA" で始まらないコマンドは無効。]
\r
1392 //-----------------
\r
1393 if (!strコマンド.StartsWith("BGA", StringComparison.OrdinalIgnoreCase))
\r
1396 strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"BGA"文字を除去。
\r
1397 //-----------------
\r
1402 if (strコマンド.Length < 2)
\r
1403 return false; // BGA番号 zz がないなら無効。
\r
1405 #region [ BGA番号 zz を取得する。]
\r
1406 //-----------------
\r
1407 int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
1408 if (zz < 0 || zz >= 36 * 36)
\r
1410 Trace.TraceError("BGA番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1413 //-----------------
\r
1416 var bga = new CBGA()
\r
1421 // パラメータ引数(7個)を取得し、bga に登録していく。
\r
1423 string[] strParams = strパラメータ.Split(new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries);
\r
1425 #region [ パラメータ引数は全7個ないと無効。]
\r
1426 //-----------------
\r
1427 if (strParams.Length < 7)
\r
1429 Trace.TraceError("BGA: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1432 //-----------------
\r
1438 #region [ 1.BMP番号 ]
\r
1439 //-----------------
\r
1440 if (string.IsNullOrEmpty(strParams[i]) || strParams[i].Length > 2)
\r
1442 Trace.TraceError("BGA: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1445 bga.nBMP番号 = C変換.n36進数2桁の文字列を数値に変換して返す(strParams[i]);
\r
1446 if (bga.nBMP番号 < 1 || bga.nBMP番号 >= 36 * 36)
\r
1448 Trace.TraceError("BGA: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1452 //-----------------
\r
1454 #region [ 2.画像側位置1・X ]
\r
1455 //-----------------
\r
1457 if (!int.TryParse(strParams[i], out n値))
\r
1459 Trace.TraceError("BGA: {2}番目の引数(画像側位置1・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1462 bga.pt画像側左上座標.X = n値;
\r
1464 //-----------------
\r
1466 #region [ 3.画像側位置1・Y ]
\r
1467 //-----------------
\r
1469 if (!int.TryParse(strParams[i], out n値))
\r
1471 Trace.TraceError("BGA: {2}番目の引数(画像側位置1・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1474 bga.pt画像側左上座標.Y = n値;
\r
1476 //-----------------
\r
1478 #region [ 4.画像側位置2・X ]
\r
1479 //-----------------
\r
1481 if (!int.TryParse(strParams[i], out n値))
\r
1483 Trace.TraceError("BGA: {2}番目の引数(画像側位置2・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1486 bga.pt画像側右下座標.X = n値;
\r
1488 //-----------------
\r
1490 #region [ 5.画像側位置2・Y ]
\r
1491 //-----------------
\r
1493 if (!int.TryParse(strParams[i], out n値))
\r
1495 Trace.TraceError("BGA: {2}番目の引数(画像側座標2・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1498 bga.pt画像側右下座標.Y = n値;
\r
1500 //-----------------
\r
1502 #region [ 6.表示位置・X ]
\r
1503 //-----------------
\r
1505 if (!int.TryParse(strParams[i], out n値))
\r
1507 Trace.TraceError("BGA: {2}番目の引数(表示位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1510 bga.pt表示座標.X = n値;
\r
1512 //-----------------
\r
1514 #region [ 7.表示位置・Y ]
\r
1515 //-----------------
\r
1517 if (!int.TryParse(strParams[i], out n値))
\r
1519 Trace.TraceError("BGA: {2}番目の引数(表示位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1522 bga.pt表示座標.Y = n値;
\r
1524 //-----------------
\r
1527 #region [ 画像側座標の正規化とクリッピング。]
\r
1528 //-----------------
\r
1529 if (bga.pt画像側左上座標.X > bga.pt画像側右下座標.X)
\r
1531 n値 = bga.pt画像側左上座標.X;
\r
1532 bga.pt画像側左上座標.X = bga.pt画像側右下座標.X;
\r
1533 bga.pt画像側右下座標.X = n値;
\r
1535 if (bga.pt画像側左上座標.Y > bga.pt画像側右下座標.Y)
\r
1537 n値 = bga.pt画像側左上座標.Y;
\r
1538 bga.pt画像側左上座標.Y = bga.pt画像側右下座標.Y;
\r
1539 bga.pt画像側右下座標.Y = n値;
\r
1541 //-----------------
\r
1543 #region [ BGAリストに {zz, bga} の組を登録する。]
\r
1544 //-----------------
\r
1545 if (this.listBGA.ContainsKey(zz)) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
1546 this.listBGA.Remove(zz);
\r
1548 this.listBGA.Add(zz, bga);
\r
1549 //-----------------
\r
1554 private bool t入力_行解析_BGAPAN(string strコマンド, string strパラメータ, string strコメント)
\r
1558 #region [ "BGAPAN" で始まらないコマンドは無効。]
\r
1559 //-----------------
\r
1560 if (!strコマンド.StartsWith("BGAPAN", StringComparison.OrdinalIgnoreCase))
\r
1563 strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"BGAPAN"文字を除去。
\r
1564 //-----------------
\r
1569 if (strコマンド.Length < 2)
\r
1570 return false; // BGAPAN番号 zz がないなら無効。
\r
1572 #region [ BGAPAN番号 zz を取得する。]
\r
1573 //-----------------
\r
1574 int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
1575 if (zz < 0 || zz >= 36 * 36)
\r
1577 Trace.TraceError("BGAPAN番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1580 //-----------------
\r
1583 var bgapan = new CBGAPAN()
\r
1588 // パラメータ引数(14個)を取得し、bgapan に登録していく。
\r
1590 string[] strParams = strパラメータ.Split(new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries);
\r
1592 #region [ パラメータ引数は全14個ないと無効。]
\r
1593 //-----------------
\r
1594 if (strParams.Length < 14)
\r
1596 Trace.TraceError("BGAPAN: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1599 //-----------------
\r
1605 #region [ 1. BMP番号 ]
\r
1606 //-----------------
\r
1607 if (string.IsNullOrEmpty(strParams[i]) || strParams[i].Length > 2)
\r
1609 Trace.TraceError("BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1612 bgapan.nBMP番号 = C変換.n36進数2桁の文字列を数値に変換して返す(strParams[i]);
\r
1613 if (bgapan.nBMP番号 < 1 || bgapan.nBMP番号 >= 36 * 36)
\r
1615 Trace.TraceError("BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1619 //-----------------
\r
1621 #region [ 2. 開始転送サイズ・幅 ]
\r
1622 //-----------------
\r
1624 if (!int.TryParse(strParams[i], out n値))
\r
1626 Trace.TraceError("BGAPAN: {2}番目の引数(開始転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1629 bgapan.sz開始サイズ.Width = n値;
\r
1631 //-----------------
\r
1633 #region [ 3. 開始転送サイズ・高さ ]
\r
1634 //-----------------
\r
1636 if (!int.TryParse(strParams[i], out n値))
\r
1638 Trace.TraceError("BGAPAN: {2}番目の引数(開始転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1641 bgapan.sz開始サイズ.Height = n値;
\r
1643 //-----------------
\r
1645 #region [ 4. 終了転送サイズ・幅 ]
\r
1646 //-----------------
\r
1648 if (!int.TryParse(strParams[i], out n値))
\r
1650 Trace.TraceError("BGAPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1653 bgapan.sz終了サイズ.Width = n値;
\r
1655 //-----------------
\r
1657 #region [ 5. 終了転送サイズ・高さ ]
\r
1658 //-----------------
\r
1660 if (!int.TryParse(strParams[i], out n値))
\r
1662 Trace.TraceError("BGAPAN: {2}番目の引数(終了転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1665 bgapan.sz終了サイズ.Height = n値;
\r
1667 //-----------------
\r
1669 #region [ 6. 画像側開始位置・X ]
\r
1670 //-----------------
\r
1672 if (!int.TryParse(strParams[i], out n値))
\r
1674 Trace.TraceError("BGAPAN: {2}番目の引数(画像側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1677 bgapan.pt画像側開始位置.X = n値;
\r
1679 //-----------------
\r
1681 #region [ 7. 画像側開始位置・Y ]
\r
1682 //-----------------
\r
1684 if (!int.TryParse(strParams[i], out n値))
\r
1686 Trace.TraceError("BGAPAN: {2}番目の引数(画像側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1689 bgapan.pt画像側開始位置.Y = n値;
\r
1691 //-----------------
\r
1693 #region [ 8. 画像側終了位置・X ]
\r
1694 //-----------------
\r
1696 if (!int.TryParse(strParams[i], out n値))
\r
1698 Trace.TraceError("BGAPAN: {2}番目の引数(画像側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1701 bgapan.pt画像側終了位置.X = n値;
\r
1703 //-----------------
\r
1705 #region [ 9. 画像側終了位置・Y ]
\r
1706 //-----------------
\r
1708 if (!int.TryParse(strParams[i], out n値))
\r
1710 Trace.TraceError("BGAPAN: {2}番目の引数(画像側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1713 bgapan.pt画像側終了位置.Y = n値;
\r
1715 //-----------------
\r
1717 #region [ 10.表示側開始位置・X ]
\r
1718 //-----------------
\r
1720 if (!int.TryParse(strParams[i], out n値))
\r
1722 Trace.TraceError("BGAPAN: {2}番目の引数(表示側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1725 bgapan.pt表示側開始位置.X = n値;
\r
1727 //-----------------
\r
1729 #region [ 11.表示側開始位置・Y ]
\r
1730 //-----------------
\r
1732 if (!int.TryParse(strParams[i], out n値))
\r
1734 Trace.TraceError("BGAPAN: {2}番目の引数(表示側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1737 bgapan.pt表示側開始位置.Y = n値;
\r
1739 //-----------------
\r
1741 #region [ 12.表示側終了位置・X ]
\r
1742 //-----------------
\r
1744 if (!int.TryParse(strParams[i], out n値))
\r
1746 Trace.TraceError("BGAPAN: {2}番目の引数(表示側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1749 bgapan.pt表示側終了位置.X = n値;
\r
1751 //-----------------
\r
1753 #region [ 13.表示側終了位置・Y ]
\r
1754 //-----------------
\r
1756 if (!int.TryParse(strParams[i], out n値))
\r
1758 Trace.TraceError("BGAPAN: {2}番目の引数(表示側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1761 bgapan.pt表示側終了位置.Y = n値;
\r
1763 //-----------------
\r
1765 #region [ 14.移動時間 ]
\r
1766 //-----------------
\r
1768 if (!int.TryParse(strParams[i], out n値))
\r
1770 Trace.TraceError("BGAPAN: {2}番目の引数(移動時間)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1);
\r
1777 bgapan.n移動時間ct = n値;
\r
1779 //-----------------
\r
1782 #region [ BGAPANリストに {zz, bgapan} の組を登録する。]
\r
1783 //-----------------
\r
1784 if (this.listBGAPAN.ContainsKey(zz)) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
1785 this.listBGAPAN.Remove(zz);
\r
1787 this.listBGAPAN.Add(zz, bgapan);
\r
1788 //-----------------
\r
1793 private bool t入力_行解析_BMP(string strコマンド, string strパラメータ, string strコメント)
\r
1797 #region [ "BMP" で始まらないコマンドは無効。]
\r
1798 //-----------------
\r
1799 if (!strコマンド.StartsWith("BMP", StringComparison.OrdinalIgnoreCase))
\r
1802 strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"BMP"文字を除去。
\r
1803 //-----------------
\r
1810 #region [ BMP番号 zz を取得する。]
\r
1811 //-----------------
\r
1812 if (strコマンド.Length < 2)
\r
1814 #region [ (A) "#BMP:" の場合 → zz = 00 ]
\r
1815 //-----------------
\r
1817 //-----------------
\r
1822 #region [ (B) "#BMPzz:" の場合 → zz = 00 ~ ZZ ]
\r
1823 //-----------------
\r
1824 zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
1825 if (zz < 0 || zz >= 36 * 36)
\r
1827 Trace.TraceError("BMP番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1830 //-----------------
\r
1833 //-----------------
\r
1837 var bmp = new CBMP()
\r
1840 strファイル名 = strパラメータ,
\r
1841 strコメント文 = strコメント,
\r
1844 #region [ BMPリストに {zz, bmp} の組を登録。]
\r
1845 //-----------------
\r
1846 if (this.listBMP.ContainsKey(zz)) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
1847 this.listBMP.Remove(zz);
\r
1849 this.listBMP.Add(zz, bmp);
\r
1850 //-----------------
\r
1855 private bool t入力_行解析_BMPTEX(string strコマンド, string strパラメータ, string strコメント)
\r
1859 #region [ "BMPTEX" で始まらないコマンドは無効。]
\r
1860 //-----------------
\r
1861 if (!strコマンド.StartsWith("BMPTEX", StringComparison.OrdinalIgnoreCase))
\r
1864 strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"BMPTEX"文字を除去。
\r
1865 //-----------------
\r
1870 if (strコマンド.Length < 2)
\r
1871 return false; // BMPTEX番号 zz がないなら無効。
\r
1873 #region [ BMPTEX番号 zz を取得する。]
\r
1874 //-----------------
\r
1875 int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
1876 if (zz < 0 || zz >= 36 * 36)
\r
1878 Trace.TraceError("BMPTEX番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1881 //-----------------
\r
1884 var bmptex = new CBMPTEX()
\r
1887 strファイル名 = strパラメータ,
\r
1888 strコメント文 = strコメント,
\r
1891 #region [ BMPTEXリストに {zz, bmptex} の組を登録する。]
\r
1892 //-----------------
\r
1893 if (this.listBMPTEX.ContainsKey(zz)) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
1894 this.listBMPTEX.Remove(zz);
\r
1896 this.listBMPTEX.Add(zz, bmptex);
\r
1897 //-----------------
\r
1902 private bool t入力_行解析_BPM_BPMzz(string strコマンド, string strパラメータ, string strコメント)
\r
1906 #region [ "BPM" で始まらないコマンドは無効。]
\r
1907 //-----------------
\r
1908 if (!strコマンド.StartsWith("BPM", StringComparison.OrdinalIgnoreCase))
\r
1911 strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"BPM"文字を除去。
\r
1912 //-----------------
\r
1919 #region [ BPM番号 zz を取得する。]
\r
1920 //-----------------
\r
1921 if (strコマンド.Length < 2)
\r
1923 #region [ (A) "#BPM:" の場合 → zz = 00 ]
\r
1924 //-----------------
\r
1926 //-----------------
\r
1931 #region [ (B) "#BPMzz:" の場合 → zz = 00 ~ ZZ ]
\r
1932 //-----------------
\r
1933 zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
1934 if (zz < 0 || zz >= 36 * 36)
\r
1936 Trace.TraceError("BPM番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
1939 //-----------------
\r
1942 //-----------------
\r
1945 double dbBPM = 0.0;
\r
1947 #region [ BPM値を取得する。]
\r
1948 //-----------------
\r
1949 //if( !double.TryParse( strパラメータ, out result ) )
\r
1950 if (!TryParse(strパラメータ, out dbBPM)) // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point
\r
1955 //-----------------
\r
1958 if (zz == 0) // "#BPM00:" と "#BPM:" は等価。
\r
1959 this.BPM = dbBPM; // この曲の代表 BPM に格納する。
\r
1961 #region [ BPMリストに {内部番号, zz, dbBPM} の組を登録。]
\r
1962 //-----------------
\r
1967 n内部番号 = this.n内部番号BPM1to,
\r
1971 //-----------------
\r
1974 #region [ BPM番号が zz であるBPM未設定のBPMチップがあれば、そのサイズを変更する。無限管理に対応。]
\r
1975 //-----------------
\r
1976 if (this.n無限管理BPM[zz] == -zz) // 初期状態では n無限管理BPM[zz] = -zz である。この場合、#BPMzz がまだ出現していないことを意味する。
\r
1978 foreach (CChip chip in listChip) // これまでに出てきたチップのうち、該当する(BPM値が未設定の)BPMチップの値を変更する(仕組み上、必ず後方参照となる)。
\r
1980 chip.AdjustInfiniteManageIntInternalIndex(chip.bBPMチップである, zz, this.n内部番号BPM1to);
\r
1983 this.n無限管理BPM[zz] = this.n内部番号BPM1to; // 次にこの BPM番号 zz を使うBPMチップが現れたら、このBPM値が格納されることになる。
\r
1984 this.n内部番号BPM1to++; // 内部番号は単純増加連番。
\r
1985 //-----------------
\r
1990 private bool t入力_行解析_RESULTIMAGE(string strコマンド, string strパラメータ, string strコメント)
\r
1994 #region [ "RESULTIMAGE" で始まらないコマンドは無効。]
\r
1995 //-----------------
\r
1996 if (!strコマンド.StartsWith("RESULTIMAGE", StringComparison.OrdinalIgnoreCase))
\r
1999 strコマンド = strコマンド.Substring(11); // strコマンド から先頭の"RESULTIMAGE"文字を除去。
\r
2000 //-----------------
\r
2004 // コマンドには "#RESULTIMAGE:" と "#RESULTIMAGE_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。
\r
2006 if (strコマンド.Length < 2)
\r
2008 #region [ (A) ランク指定がない場合("#RESULTIMAGE:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]
\r
2009 //-----------------
\r
2010 for (int i = 0; i < 7; i++)
\r
2012 if (this.nRESULTIMAGE用優先順位[i] == 0)
\r
2013 this.RESULTIMAGE[i] = strパラメータ.Trim();
\r
2015 //-----------------
\r
2020 #region [ (B) ランク指定がある場合("#RESULTIMAGE_SS~E:") → 優先順位に従ってパラメータを記録する。]
\r
2021 //-----------------
\r
2022 switch (strコマンド.ToUpper())
\r
2025 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(0, strパラメータ);
\r
2029 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(1, strパラメータ);
\r
2033 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(2, strパラメータ);
\r
2037 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(3, strパラメータ);
\r
2041 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(4, strパラメータ);
\r
2045 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(5, strパラメータ);
\r
2049 this.t入力_行解析_RESULTIMAGE_ファイルを設定する(6, strパラメータ);
\r
2052 //-----------------
\r
2058 private void t入力_行解析_RESULTIMAGE_ファイルを設定する(int nランク0to6, string strファイル名)
\r
2060 if (nランク0to6 < 0 || nランク0to6 > 6) // 値域チェック。
\r
2063 // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。
\r
2065 for (int i = nランク0to6; i >= 0; i--)
\r
2067 int n優先順位 = 7 - nランク0to6;
\r
2069 // 現状より優先順位の低い RESULTIMAGE[] に限り、ファイル名を更新できる。
\r
2070 //(例:#RESULTMOVIE_D が #RESULTIMAGE_A より後に出現しても、#RESULTIMAGE_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)
\r
2072 if (this.nRESULTIMAGE用優先順位[i] < n優先順位)
\r
2074 this.nRESULTIMAGE用優先順位[i] = n優先順位;
\r
2075 this.RESULTIMAGE[i] = strファイル名;
\r
2079 private bool t入力_行解析_RESULTMOVIE(string strコマンド, string strパラメータ, string strコメント)
\r
2083 #region [ "RESULTMOVIE" で始まらないコマンドは無効。]
\r
2084 //-----------------
\r
2085 if (!strコマンド.StartsWith("RESULTMOVIE", StringComparison.OrdinalIgnoreCase))
\r
2088 strコマンド = strコマンド.Substring(11); // strコマンド から先頭の"RESULTMOVIE"文字を除去。
\r
2089 //-----------------
\r
2093 // コマンドには "#RESULTMOVIE:" と "#RESULTMOVIE_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。
\r
2095 if (strコマンド.Length < 2)
\r
2097 #region [ (A) ランク指定がない場合("#RESULTMOVIE:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]
\r
2098 //-----------------
\r
2099 for (int i = 0; i < 7; i++)
\r
2101 if (this.nRESULTMOVIE用優先順位[i] == 0)
\r
2102 this.RESULTMOVIE[i] = strパラメータ.Trim();
\r
2104 //-----------------
\r
2109 #region [ (B) ランク指定がある場合("#RESULTMOVIE_SS~E:") → 優先順位に従ってパラメータを記録する。]
\r
2110 //-----------------
\r
2111 switch (strコマンド.ToUpper())
\r
2114 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(0, strパラメータ);
\r
2118 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(1, strパラメータ);
\r
2122 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(2, strパラメータ);
\r
2126 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(3, strパラメータ);
\r
2130 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(4, strパラメータ);
\r
2134 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(5, strパラメータ);
\r
2138 this.t入力_行解析_RESULTMOVIE_ファイルを設定する(6, strパラメータ);
\r
2141 //-----------------
\r
2147 private void t入力_行解析_RESULTMOVIE_ファイルを設定する(int nランク0to6, string strファイル名)
\r
2149 if (nランク0to6 < 0 || nランク0to6 > 6) // 値域チェック。
\r
2152 // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。
\r
2154 for (int i = nランク0to6; i >= 0; i--)
\r
2156 int n優先順位 = 7 - nランク0to6;
\r
2158 // 現状より優先順位の低い RESULTMOVIE[] に限り、ファイル名を更新できる。
\r
2159 //(例:#RESULTMOVIE_D が #RESULTMOVIE_A より後に出現しても、#RESULTMOVIE_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)
\r
2161 if (this.nRESULTMOVIE用優先順位[i] < n優先順位)
\r
2163 this.nRESULTMOVIE用優先順位[i] = n優先順位;
\r
2164 this.RESULTMOVIE[i] = strファイル名;
\r
2168 private bool t入力_行解析_RESULTSOUND(string strコマンド, string strパラメータ, string strコメント)
\r
2172 #region [ "RESULTSOUND" で始まらないコマンドは無効。]
\r
2173 //-----------------
\r
2174 if (!strコマンド.StartsWith("RESULTSOUND", StringComparison.OrdinalIgnoreCase))
\r
2177 strコマンド = strコマンド.Substring(11); // strコマンド から先頭の"RESULTSOUND"文字を除去。
\r
2178 //-----------------
\r
2182 // コマンドには "#RESULTSOUND:" と "#RESULTSOUND_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。
\r
2184 if (strコマンド.Length < 2)
\r
2186 #region [ (A) ランク指定がない場合("#RESULTSOUND:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]
\r
2187 //-----------------
\r
2188 for (int i = 0; i < 7; i++)
\r
2190 if (this.nRESULTSOUND用優先順位[i] == 0)
\r
2191 this.RESULTSOUND[i] = strパラメータ.Trim();
\r
2193 //-----------------
\r
2198 #region [ (B) ランク指定がある場合("#RESULTSOUND_SS~E:") → 優先順位に従ってパラメータを記録する。]
\r
2199 //-----------------
\r
2200 switch (strコマンド.ToUpper())
\r
2203 this.t入力_行解析_RESULTSOUND_ファイルを設定する(0, strパラメータ);
\r
2207 this.t入力_行解析_RESULTSOUND_ファイルを設定する(1, strパラメータ);
\r
2211 this.t入力_行解析_RESULTSOUND_ファイルを設定する(2, strパラメータ);
\r
2215 this.t入力_行解析_RESULTSOUND_ファイルを設定する(3, strパラメータ);
\r
2219 this.t入力_行解析_RESULTSOUND_ファイルを設定する(4, strパラメータ);
\r
2223 this.t入力_行解析_RESULTSOUND_ファイルを設定する(5, strパラメータ);
\r
2227 this.t入力_行解析_RESULTSOUND_ファイルを設定する(6, strパラメータ);
\r
2230 //-----------------
\r
2236 private void t入力_行解析_RESULTSOUND_ファイルを設定する(int nランク0to6, string strファイル名)
\r
2238 if (nランク0to6 < 0 || nランク0to6 > 6) // 値域チェック。
\r
2241 // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。
\r
2243 for (int i = nランク0to6; i >= 0; i--)
\r
2245 int n優先順位 = 7 - nランク0to6;
\r
2247 // 現状より優先順位の低い RESULTSOUND[] に限り、ファイル名を更新できる。
\r
2248 //(例:#RESULTSOUND_D が #RESULTSOUND_A より後に出現しても、#RESULTSOUND_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)
\r
2250 if (this.nRESULTSOUND用優先順位[i] < n優先順位)
\r
2252 this.nRESULTSOUND用優先順位[i] = n優先順位;
\r
2253 this.RESULTSOUND[i] = strファイル名;
\r
2257 private bool t入力_行解析_SIZE(string strコマンド, string strパラメータ, string strコメント)
\r
2261 #region [ "SIZE" で始まらないコマンドや、その後ろに2文字(番号)が付随してないコマンドは無効。]
\r
2262 //-----------------
\r
2263 if (!strコマンド.StartsWith("SIZE", StringComparison.OrdinalIgnoreCase))
\r
2266 strコマンド = strコマンド.Substring(4); // strコマンド から先頭の"SIZE"文字を除去。
\r
2268 if (strコマンド.Length < 2) // サイズ番号の指定がない場合は無効。
\r
2270 //-----------------
\r
2273 #region [ nWAV番号(36進数2桁)を取得。]
\r
2274 //-----------------
\r
2275 int nWAV番号 = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
2277 if (nWAV番号 < 0 || nWAV番号 >= 36 * 36)
\r
2279 Trace.TraceError("SIZEのWAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
2282 //-----------------
\r
2288 #region [ nサイズ値 を取得する。値は 0~100 に収める。]
\r
2289 //-----------------
\r
2292 if (!int.TryParse(strパラメータ, out nサイズ値))
\r
2293 return true; // int変換に失敗しても、この行自体の処理は終えたのでtrueを返す。
\r
2295 nサイズ値 = Math.Min(Math.Max(nサイズ値, 0), 100); // 0未満は0、100超えは100に強制変換。
\r
2296 //-----------------
\r
2299 #region [ nWAV番号で示されるサイズ未設定のWAVチップがあれば、そのサイズを変更する。無限管理に対応。]
\r
2300 //-----------------
\r
2301 if (this.n無限管理SIZE[nWAV番号] == -nWAV番号) // 初期状態では n無限管理SIZE[xx] = -xx である。この場合、#SIZExx がまだ出現していないことを意味する。
\r
2303 foreach (CWAV wav in this.listWAV.Values) // これまでに出てきたWAVチップのうち、該当する(サイズが未設定の)チップのサイズを変更する(仕組み上、必ず後方参照となる)。
\r
2305 if (wav.nチップサイズ == -nWAV番号) // #SIZExx 行より前の行に出現した #WAVxx では、チップサイズは -xx に初期化されている。
\r
2306 wav.nチップサイズ = nサイズ値;
\r
2309 this.n無限管理SIZE[nWAV番号] = nサイズ値; // 次にこの nWAV番号を使うWAVチップが現れたら、負数の代わりに、このサイズ値が格納されることになる。
\r
2310 //-----------------
\r
2315 private bool t入力_行解析_WAV(string strコマンド, string strパラメータ, string strコメント)
\r
2319 #region [ "WAV" で始まらないコマンドは無効。]
\r
2320 //-----------------
\r
2321 if (!strコマンド.StartsWith("WAV", StringComparison.OrdinalIgnoreCase))
\r
2324 strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"WAV"文字を除去。
\r
2325 //-----------------
\r
2330 if (strコマンド.Length < 2)
\r
2331 return false; // WAV番号 zz がないなら無効。
\r
2333 #region [ WAV番号 zz を取得する。]
\r
2334 //-----------------
\r
2335 int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
2336 if (zz < 0 || zz >= 36 * 36)
\r
2338 Trace.TraceError("WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
2341 //-----------------
\r
2344 var wav = new CWAV()
\r
2346 n内部番号 = this.n内部番号WAV1to,
\r
2348 nチップサイズ = this.n無限管理SIZE[zz],
\r
2349 n位置 = this.n無限管理PAN[zz],
\r
2350 n音量 = this.n無限管理VOL[zz],
\r
2351 strファイル名 = strパラメータ,
\r
2352 strコメント文 = strコメント,
\r
2355 #region [ WAVリストに {内部番号, wav} の組を登録。]
\r
2356 //-----------------
\r
2357 this.listWAV.Add(this.n内部番号WAV1to, wav);
\r
2358 //-----------------
\r
2361 #region [ WAV番号が zz である内部番号未設定のWAVチップがあれば、その内部番号を変更する。無限管理対応。]
\r
2362 //-----------------
\r
2363 if (this.n無限管理WAV[zz] == -zz) // 初期状態では n無限管理WAV[zz] = -zz である。この場合、#WAVzz がまだ出現していないことを意味する。
\r
2365 foreach (CChip chip in listChip) // これまでに出てきたチップのうち、該当する(内部番号が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。
\r
2367 chip.AdjustInfiniteManageIntInternalIndex(chip.bWAVを使うチャンネルである, zz, n内部番号WAV1to);
\r
2370 this.n無限管理WAV[zz] = this.n内部番号WAV1to; // 次にこの WAV番号 zz を使うWAVチップが現れたら、この内部番号が格納されることになる。
\r
2371 this.n内部番号WAV1to++; // 内部番号は単純増加連番。
\r
2372 //-----------------
\r
2377 private bool t入力_行解析_WAVPAN_PAN(string strコマンド, string strパラメータ, string strコメント)
\r
2381 #region [ "WAVPAN" or "PAN" で始まらないコマンドは無効。]
\r
2382 //-----------------
\r
2383 if (strコマンド.StartsWith("WAVPAN", StringComparison.OrdinalIgnoreCase))
\r
2384 strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"WAVPAN"文字を除去。
\r
2386 else if (strコマンド.StartsWith("PAN", StringComparison.OrdinalIgnoreCase))
\r
2387 strコマンド = strコマンド.Substring(3); // strコマンド から先頭の"PAN"文字を除去。
\r
2391 //-----------------
\r
2396 if (strコマンド.Length < 2)
\r
2397 return false; // WAV番号 zz がないなら無効。
\r
2399 #region [ WAV番号 zz を取得する。]
\r
2400 //-----------------
\r
2401 int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
2402 if (zz < 0 || zz >= 36 * 36)
\r
2404 Trace.TraceError("WAVPAN(PAN)のWAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
2407 //-----------------
\r
2410 #region [ WAV番号 zz を持つWAVチップの位置を変更する。無限定義対応。]
\r
2411 //-----------------
\r
2413 if (int.TryParse(strパラメータ, out n位置))
\r
2415 n位置 = Math.Min(Math.Max(n位置, -100), 100); // -100~+100 に丸める
\r
2417 if (this.n無限管理PAN[zz] == (-10000 - zz)) // 初期状態では n無限管理PAN[zz] = -10000 - zz である。この場合、#WAVPANzz, #PANzz がまだ出現していないことを意味する。
\r
2419 foreach (CWAV wav in this.listWAV.Values) // これまでに出てきたチップのうち、該当する(位置が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。
\r
2421 if (wav.n位置 == (-10000 - zz)) // #WAVPANzz, #PANzz 行より前の行に出現した #WAVzz では、位置は -10000-zz に初期化されている。
\r
2425 this.n無限管理PAN[zz] = n位置; // 次にこの WAV番号 zz を使うWAVチップが現れたら、この位置が格納されることになる。
\r
2427 //-----------------
\r
2432 private bool t入力_行解析_WAVVOL_VOLUME(string strコマンド, string strパラメータ, string strコメント)
\r
2436 #region [ "WAVCOL" or "VOLUME" で始まらないコマンドは無効。]
\r
2437 //-----------------
\r
2438 if (strコマンド.StartsWith("WAVVOL", StringComparison.OrdinalIgnoreCase))
\r
2439 strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"WAVVOL"文字を除去。
\r
2441 else if (strコマンド.StartsWith("VOLUME", StringComparison.OrdinalIgnoreCase))
\r
2442 strコマンド = strコマンド.Substring(6); // strコマンド から先頭の"VOLUME"文字を除去。
\r
2446 //-----------------
\r
2451 if (strコマンド.Length < 2)
\r
2452 return false; // WAV番号 zz がないなら無効。
\r
2454 #region [ WAV番号 zz を取得する。]
\r
2455 //-----------------
\r
2456 int zz = C変換.n36進数2桁の文字列を数値に変換して返す(strコマンド.Substring(0, 2));
\r
2457 if (zz < 0 || zz >= 36 * 36)
\r
2459 Trace.TraceError("WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
2462 //-----------------
\r
2465 #region [ WAV番号 zz を持つWAVチップの音量を変更する。無限定義対応。]
\r
2466 //-----------------
\r
2468 if (int.TryParse(strパラメータ, out n音量))
\r
2470 n音量 = Math.Min(Math.Max(n音量, 0), 100); // 0~100に丸める。
\r
2472 if (this.n無限管理VOL[zz] == -zz) // 初期状態では n無限管理VOL[zz] = - zz である。この場合、#WAVVOLzz, #VOLUMEzz がまだ出現していないことを意味する。
\r
2474 foreach (CWAV wav in this.listWAV.Values) // これまでに出てきたチップのうち、該当する(音量が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。
\r
2476 if (wav.n音量 == -zz) // #WAVVOLzz, #VOLUMEzz 行より前の行に出現した #WAVzz では、音量は -zz に初期化されている。
\r
2480 this.n無限管理VOL[zz] = n音量; // 次にこの WAV番号 zz を使うWAVチップが現れたら、この音量が格納されることになる。
\r
2482 //-----------------
\r
2487 private bool t入力_行解析_チップ配置(string strコマンド, string strパラメータ, string strコメント)
\r
2491 if (strコマンド.Length != 5) // コマンドは必ず5文字であること。
\r
2494 #region [ n小節番号 を取得する。]
\r
2495 //-----------------
\r
2496 int n小節番号 = C変換.n小節番号の文字列3桁を数値に変換して返す(strコマンド.Substring(0, 3));
\r
2500 n小節番号++; // 先頭に空の1小節を設ける。
\r
2501 //-----------------
\r
2504 #region [ nチャンネル番号 を取得する。]
\r
2505 //-----------------
\r
2506 Ech定義 tmpチャンネル番号 = Ech定義.Invalid;
\r
2508 // ファイルフォーマットによって処理が異なる。
\r
2510 if (this.e種別 == EDTX種別.GDA || this.e種別 == EDTX種別.G2D)
\r
2512 #region [ (A) GDA, G2D の場合:チャンネル文字列をDTXのチャンネル番号へ置き換える。]
\r
2513 //-----------------
\r
2514 string strチャンネル文字列 = strコマンド.Substring(3, 2);
\r
2516 foreach (STGDAPARAM param in this.stGDAParam)
\r
2518 if (strチャンネル文字列.Equals(param.strGDAのチャンネル文字列, StringComparison.OrdinalIgnoreCase))
\r
2520 tmpチャンネル番号 = param.eDTXのチャンネル番号;
\r
2524 if (tmpチャンネル番号 == Ech定義.Invalid)
\r
2525 return false; // 置き換え失敗
\r
2526 //-----------------
\r
2531 #region [ (B) その他の場合:チャンネル番号は16進数2桁。]
\r
2532 //-----------------
\r
2533 tmpチャンネル番号 = (Ech定義)C変換.n16進数2桁の文字列を数値に変換して返す(strコマンド.Substring(3, 2));
\r
2535 if (tmpチャンネル番号 < 0)
\r
2537 //-----------------
\r
2540 //-----------------
\r
2545 #region [ 小節長変更(Ch.02)は他のチャンネルとはパラメータが特殊なので、先にとっとと終わらせる。 ]
\r
2546 //-----------------
\r
2547 if (tmpチャンネル番号 == Ech定義.BarLength)
\r
2550 double db小節長倍率 = 1.0;
\r
2551 //if( !double.TryParse( strパラメータ, out result ) )
\r
2552 if (!this.TryParse(strパラメータ, out db小節長倍率)) // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point
\r
2554 Trace.TraceError("小節長倍率に不正な値を指定しました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
2558 // 小節長倍率チップを一番先頭に配置する。
\r
2559 this.listChip.Insert(0, new CChip(n小節番号 * 384, db小節長倍率, tmpチャンネル番号));
\r
2561 return true; // 配置終了。
\r
2563 //-----------------
\r
2567 if (string.IsNullOrEmpty(strパラメータ)) // パラメータはnullまたは空文字列ではないこと。
\r
2570 #region [ strパラメータ にオブジェクト記述を格納し、その n文字数 をカウントする。]
\r
2571 //-----------------
\r
2574 var sb = new StringBuilder(strパラメータ.Length);
\r
2576 // strパラメータを先頭から1文字ずつ見ながら正規化(無効文字('_')を飛ばしたり不正な文字でエラーを出したり)し、sb へ格納する。
\r
2578 CharEnumerator ce = strパラメータ.GetEnumerator();
\r
2579 while (ce.MoveNext())
\r
2581 if (ce.Current == '_') // '_' は無視。
\r
2584 if (C変換.str36進数文字.IndexOf(ce.Current) < 0) // オブジェクト記述は36進数文字であること。
\r
2586 Trace.TraceError("不正なオブジェクト指定があります。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数);
\r
2590 sb.Append(ce.Current);
\r
2594 strパラメータ = sb.ToString(); // 正規化された文字列になりました。
\r
2596 if ((n文字数 % 2) != 0) // パラメータの文字数が奇数の場合、最後の1文字を無視する。
\r
2598 //-----------------
\r
2602 // (4) パラメータをオブジェクト数値に分解して配置する。
\r
2604 for (int i = 0; i < (n文字数 / 2); i++) // 2文字で1オブジェクト数値
\r
2606 #region [ nオブジェクト数値 を1つ取得する。'00' なら無視。]
\r
2607 //-----------------
\r
2608 int nオブジェクト数値 = 0;
\r
2610 if (tmpチャンネル番号 == Ech定義.BPM)
\r
2612 // Ch.03 のみ 16進数2桁。
\r
2613 nオブジェクト数値 = C変換.n16進数2桁の文字列を数値に変換して返す(strパラメータ.Substring(i * 2, 2));
\r
2617 // その他のチャンネルは36進数2桁。
\r
2618 nオブジェクト数値 = C変換.n36進数2桁の文字列を数値に変換して返す(strパラメータ.Substring(i * 2, 2));
\r
2621 if (nオブジェクト数値 == 0x00)
\r
2623 //-----------------
\r
2626 // オブジェクト数値に対応するチップを生成。
\r
2627 var chip = new CChip((n小節番号 * 384) + ((384 * i) / (n文字数 / 2)), nオブジェクト数値, nオブジェクト数値, tmpチャンネル番号);
\r
2630 chip.DecideInstrumentPart();
\r
2633 this.bチップがある.Drums |= chip.bDrums可視チップ;
\r
2634 this.bチップがある.HHOpen |= chip[Ech定義.HiHatOpen];
\r
2635 this.bチップがある.Ride |= chip[Ech定義.RideCymbal];
\r
2636 this.bチップがある.LeftCymbal |= chip[Ech定義.LeftCymbal];
\r
2637 this.bチップがある.LeftPedal |= chip[Ech定義.LeftPedal];
\r
2638 this.bチップがある.LeftBassDrum |= chip[Ech定義.LeftBassDrum];
\r
2639 this.bチップがある.Guitar |= chip.bGuitar可視チップ;
\r
2640 this.bチップがある.OpenGuitar |= chip[Ech定義.Guitar_Open];
\r
2641 this.bチップがある.Bass |= chip.bBass可視チップ;
\r
2642 this.bチップがある.OpenBass |= chip[Ech定義.Bass_Open];
\r
2643 this.bチップがある.BGA |= chip.bBGALayer;
\r
2644 this.bチップがある.Movie |= chip.bMovie;
\r
2647 if (chip[Ech定義.MovieFull] || CDTXMania.Instance.ConfigIni.bForceAVIFullscreen)
\r
2649 this.bMovieをFullscreen再生する = true;
\r
2654 chip.ConvertNoChip();
\r
2656 // 無限管理オブジェクトインデックスの割当。(もしそのチップが対象であれば)
\r
2657 chip.AssignInfiniteManageWAV(this.n無限管理WAV[nオブジェクト数値]);
\r
2658 chip.AssignInfiniteManageBPM(this.n無限管理BPM[nオブジェクト数値]);
\r
2659 chip.AdjustPlayPositionForFillin(nオブジェクト数値);
\r
2662 this.listChip.Add(chip);
\r