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
15 internal class CDTX : CActivity
\r
19 public enum E種別 { DTX, GDA, G2D, BMS, BME, SMF }
\r
20 public enum Eレーンビットパターン
\r
35 public class CAVI : IDisposable
\r
38 private bool bDispose済み;
\r
40 public string strコメント文 = "";
\r
41 public string strファイル名 = "";
\r
43 public void OnDeviceCreated()
\r
45 #region [ strAVIファイル名の作成。]
\r
48 if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )
\r
49 strAVIファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;
\r
51 strAVIファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;
\r
55 if( !File.Exists( strAVIファイル名 ) )
\r
57 Trace.TraceWarning( "ファイルが存在しません。({0})({1})", this.strコメント文, strAVIファイル名 );
\r
66 this.avi = new CAvi( strAVIファイル名 );
\r
67 Trace.TraceInformation( "動画を生成しました。({0})({1})({2}frames)", this.strコメント文, strAVIファイル名, this.avi.GetMaxFrameCount() );
\r
69 catch( Exception e )
\r
71 Trace.TraceError( e.Message );
\r
72 Trace.TraceError( "動画の生成に失敗しました。({0})({1})", this.strコメント文, strAVIファイル名 );
\r
76 public override string ToString()
\r
78 return string.Format( "CAVI{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );
\r
81 #region [ IDisposable 実装 ]
\r
83 public void Dispose()
\r
85 if( this.bDispose済み )
\r
88 if( this.avi != null )
\r
90 #region [ strAVIファイル名 の作成。 ]
\r
93 if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )
\r
94 strAVIファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;
\r
96 strAVIファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;
\r
100 this.avi.Dispose();
\r
103 Trace.TraceInformation( "動画を解放しました。({0})({1})", this.strコメント文, strAVIファイル名 );
\r
106 this.bDispose済み = true;
\r
108 //-----------------
\r
111 public class CAVIPAN
\r
114 public int n移動時間ct;
\r
116 public Point pt動画側開始位置 = new Point( 0, 0 );
\r
117 public Point pt動画側終了位置 = new Point( 0, 0 );
\r
118 public Point pt表示側開始位置 = new Point( 0, 0 );
\r
119 public Point pt表示側終了位置 = new Point( 0, 0 );
\r
120 public Size sz開始サイズ = new Size( 0, 0 );
\r
121 public Size sz終了サイズ = new Size( 0, 0 );
\r
123 public override string ToString()
\r
125 return string.Format( "CAVIPAN{0}: AVI:{14}, 開始サイズ:{1}x{2}, 終了サイズ:{3}x{4}, 動画側開始位置:{5}x{6}, 動画側終了位置:{7}x{8}, 表示側開始位置:{9}x{10}, 表示側終了位置:{11}x{12}, 移動時間:{13}ct",
\r
126 CDTX.tZZ( this.n番号 ),
\r
127 this.sz開始サイズ.Width, this.sz開始サイズ.Height,
\r
128 this.sz終了サイズ.Width, this.sz終了サイズ.Height,
\r
129 this.pt動画側開始位置.X, this.pt動画側開始位置.Y,
\r
130 this.pt動画側終了位置.X, this.pt動画側終了位置.Y,
\r
131 this.pt表示側開始位置.X, this.pt表示側開始位置.Y,
\r
132 this.pt表示側終了位置.X, this.pt表示側終了位置.Y,
\r
134 CDTX.tZZ( this.nAVI番号 ) );
\r
141 public Point pt画像側右下座標 = new Point( 0, 0 );
\r
142 public Point pt画像側左上座標 = new Point( 0, 0 );
\r
143 public Point pt表示座標 = new Point( 0, 0 );
\r
145 public override string ToString()
\r
147 return string.Format( "CBGA{0}, BMP:{1}, 画像側左上座標:{2}x{3}, 画像側右下座標:{4}x{5}, 表示座標:{6}x{7}",
\r
148 CDTX.tZZ( this.n番号 ),
\r
149 CDTX.tZZ( this.nBMP番号 ),
\r
150 this.pt画像側左上座標.X, this.pt画像側左上座標.Y,
\r
151 this.pt画像側右下座標.X, this.pt画像側右下座標.Y,
\r
152 this.pt表示座標.X, this.pt表示座標.Y );
\r
155 public class CBGAPAN
\r
158 public int n移動時間ct;
\r
160 public Point pt画像側開始位置 = new Point( 0, 0 );
\r
161 public Point pt画像側終了位置 = new Point( 0, 0 );
\r
162 public Point pt表示側開始位置 = new Point( 0, 0 );
\r
163 public Point pt表示側終了位置 = new Point( 0, 0 );
\r
164 public Size sz開始サイズ = new Size( 0, 0 );
\r
165 public Size sz終了サイズ = new Size( 0, 0 );
\r
167 public override string ToString()
\r
169 return string.Format( "CBGAPAN{0}: BMP:{14}, 開始サイズ:{1}x{2}, 終了サイズ:{3}x{4}, 画像側開始位置:{5}x{6}, 画像側終了位置:{7}x{8}, 表示側開始位置:{9}x{10}, 表示側終了位置:{11}x{12}, 移動時間:{13}ct",
\r
170 CDTX.tZZ( this.nBMP番号 ),
\r
171 this.sz開始サイズ.Width, this.sz開始サイズ.Height,
\r
172 this.sz終了サイズ.Width, this.sz終了サイズ.Height,
\r
173 this.pt画像側開始位置.X, this.pt画像側開始位置.Y,
\r
174 this.pt画像側終了位置.X, this.pt画像側終了位置.Y,
\r
175 this.pt表示側開始位置.X, this.pt表示側開始位置.Y,
\r
176 this.pt表示側終了位置.X, this.pt表示側終了位置.Y,
\r
178 CDTX.tZZ( this.nBMP番号 ) );
\r
181 public class CBMP : IDisposable
\r
185 public string strコメント文 = "";
\r
186 public string strファイル名 = "";
\r
187 public CTexture tx画像;
\r
192 return this.tx画像.sz画像サイズ.Height;
\r
199 return this.tx画像.sz画像サイズ.Width;
\r
203 public void OnDeviceCreated()
\r
205 #region [ strテクスチャファイル名 を作成。]
\r
206 //-----------------
\r
207 string strテクスチャファイル名;
\r
208 if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )
\r
209 strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;
\r
211 strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;
\r
212 //-----------------
\r
215 if( !File.Exists( strテクスチャファイル名 ) )
\r
217 Trace.TraceWarning( "ファイルが存在しません。({0})({1})", this.strコメント文, strテクスチャファイル名 );
\r
224 this.tx画像 = CDTXMania.tテクスチャの生成( strテクスチャファイル名, true );
\r
226 if( this.tx画像 != null )
\r
230 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )
\r
231 Trace.TraceInformation( "テクスチャを生成しました。({0})({1})({2}x{3})", this.strコメント文, strテクスチャファイル名, this.n幅, this.n高さ );
\r
239 Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );
\r
243 public override string ToString()
\r
245 return string.Format( "CBMP{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );
\r
248 #region [ IDisposable 実装 ]
\r
249 //-----------------
\r
250 public void Dispose()
\r
252 if( this.bDisposed済み )
\r
255 if( this.tx画像 != null )
\r
257 #region [ strテクスチャファイル名 を作成。]
\r
258 //-----------------
\r
259 string strテクスチャファイル名;
\r
260 if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )
\r
261 strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;
\r
263 strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;
\r
264 //-----------------
\r
267 CDTXMania.tテクスチャの解放( ref this.tx画像 );
\r
269 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )
\r
270 Trace.TraceInformation( "テクスチャを解放しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );
\r
274 this.bDisposed済み = true;
\r
276 //-----------------
\r
279 #region [ private ]
\r
280 //-----------------
\r
281 private bool bDisposed済み;
\r
282 //-----------------
\r
285 public class CBMPTEX : IDisposable
\r
289 public string strコメント文 = "";
\r
290 public string strファイル名 = "";
\r
291 public CTexture tx画像;
\r
296 return this.tx画像.sz画像サイズ.Height;
\r
303 return this.tx画像.sz画像サイズ.Width;
\r
307 public void OnDeviceCreated()
\r
309 #region [ strテクスチャファイル名 を作成。]
\r
310 //-----------------
\r
311 string strテクスチャファイル名;
\r
312 if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )
\r
313 strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;
\r
315 strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;
\r
316 //-----------------
\r
319 if( !File.Exists( strテクスチャファイル名 ) )
\r
321 Trace.TraceWarning( "ファイルが存在しません。({0})({1})", this.strコメント文, strテクスチャファイル名 );
\r
328 this.tx画像 = CDTXMania.tテクスチャの生成( strテクスチャファイル名 );
\r
330 if( this.tx画像 != null )
\r
334 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )
\r
335 Trace.TraceInformation( "テクスチャを生成しました。({0})({1})(Gr:{2}x{3})(Tx:{4}x{5})", this.strコメント文, strテクスチャファイル名, this.tx画像.sz画像サイズ.Width, this.tx画像.sz画像サイズ.Height, this.tx画像.szテクスチャサイズ.Width, this.tx画像.szテクスチャサイズ.Height );
\r
342 Trace.TraceError( "テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );
\r
345 public override string ToString()
\r
347 return string.Format( "CBMPTEX{0}: File:{1}, Comment:{2}", CDTX.tZZ( this.n番号 ), this.strファイル名, this.strコメント文 );
\r
350 #region [ IDisposable 実装 ]
\r
351 //-----------------
\r
352 public void Dispose()
\r
354 if( this.bDisposed済み )
\r
357 if( this.tx画像 != null )
\r
359 #region [ strテクスチャファイル名 を作成。]
\r
360 //-----------------
\r
361 string strテクスチャファイル名;
\r
362 if( !string.IsNullOrEmpty( CDTXMania.DTX.PATH_WAV ) )
\r
363 strテクスチャファイル名 = CDTXMania.DTX.PATH_WAV + this.strファイル名;
\r
365 strテクスチャファイル名 = CDTXMania.DTX.strフォルダ名 + this.strファイル名;
\r
366 //-----------------
\r
369 CDTXMania.tテクスチャの解放( ref this.tx画像 );
\r
371 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )
\r
372 Trace.TraceInformation( "テクスチャを解放しました。({0})({1})", this.strコメント文, strテクスチャファイル名 );
\r
376 this.bDisposed済み = true;
\r
378 //-----------------
\r
381 #region [ private ]
\r
382 //-----------------
\r
383 private bool bDisposed済み;
\r
384 //-----------------
\r
389 public double dbBPM値;
\r
391 public int n表記上の番号;
\r
393 public override string ToString()
\r
395 StringBuilder builder = new StringBuilder( 0x80 );
\r
396 if( this.n内部番号 != this.n表記上の番号 )
\r
398 builder.Append( string.Format( "CBPM{0}(内部{1})", CDTX.tZZ( this.n表記上の番号 ), this.n内部番号 ) );
\r
402 builder.Append( string.Format( "CBPM{0}", CDTX.tZZ( this.n表記上の番号 ) ) );
\r
404 builder.Append( string.Format( ", BPM:{0}", this.dbBPM値 ) );
\r
405 return builder.ToString();
\r
408 public class CChip : IComparable<CDTX.CChip>
\r
411 public bool b可視 = true;
\r
412 public double dbチップサイズ倍率 = 1.0;
\r
413 public double db実数値;
\r
414 public EAVI種別 eAVI種別;
\r
415 public EBGA種別 eBGA種別;
\r
416 public E楽器パート e楽器パート = E楽器パート.UNKNOWN;
\r
417 public int nチャンネル番号;
\r
418 public STDGBVALUE<int> nバーからの距離dot;
\r
420 public int n整数値・内部番号;
\r
422 public int n透明度 = 0xff;
\r
424 public int n発声時刻ms;
\r
425 public int nLag; // 2011.2.1 yyagi
\r
426 public CDTX.CAVI rAVI;
\r
427 public CDTX.CAVIPAN rAVIPan;
\r
428 public CDTX.CBGA rBGA;
\r
429 public CDTX.CBGAPAN rBGAPan;
\r
430 public CDTX.CBMP rBMP;
\r
431 public CDTX.CBMPTEX rBMPTEX;
\r
432 public bool bBPMチップである
\r
436 if (this.nチャンネル番号 == 3 || this.nチャンネル番号 == 8) {
\r
443 public bool bWAVを使うチャンネルである
\r
447 switch( this.nチャンネル番号 )
\r
538 public bool b自動再生音チャンネルである
\r
542 int num = this.nチャンネル番号;
\r
543 if( ( ( ( num != 1 ) && ( ( 0x61 > num ) || ( num > 0x69 ) ) ) && ( ( 0x70 > num ) || ( num > 0x79 ) ) ) && ( ( 0x80 > num ) || ( num > 0x89 ) ) )
\r
545 return ( ( 0x90 <= num ) && ( num <= 0x92 ) );
\r
550 public bool bIsAutoPlayed; // 2011.6.10 yyagi
\r
554 this.nバーからの距離dot = new STDGBVALUE<int>() {
\r
564 this.n整数値・内部番号 = 0;
\r
569 this.bIsAutoPlayed = false;
\r
570 this.dbチップサイズ倍率 = 1.0;
\r
573 this.e楽器パート = E楽器パート.UNKNOWN;
\r
575 this.nバーからの距離dot.Drums = 0;
\r
576 this.nバーからの距離dot.Guitar = 0;
\r
577 this.nバーからの距離dot.Bass = 0;
\r
580 public override string ToString()
\r
583 switch( this.nチャンネル番号 )
\r
642 str = "RideCymbal";
\r
646 str = "LeftCymbal";
\r
686 str = "ギターWailing";
\r
690 str = "ギターWailing音切替";
\r
694 str = "HHClose(不可視)";
\r
698 str = "Snare(不可視)";
\r
706 str = "HiTom(不可視)";
\r
710 str = "LowTom(不可視)";
\r
714 str = "Cymbal(不可視)";
\r
718 str = "FloorTom(不可視)";
\r
722 str = "HHOpen(不可視)";
\r
726 str = "RideCymbal(不可視)";
\r
730 str = "LeftCymbal(不可視)";
\r
938 str = "ベースWailing";
\r
942 str = "ベースWailing音切替";
\r
946 str = "HHClose(空うち)";
\r
950 str = "Snare(空うち)";
\r
958 str = "HiTom(空うち)";
\r
962 str = "LowTom(空うち)";
\r
966 str = "Cymbal(空うち)";
\r
970 str = "FloorTom(空うち)";
\r
974 str = "HHOpen(空うち)";
\r
978 str = "RideCymbal(空うち)";
\r
990 str = "LeftCymbal(空うち)";
\r
994 str = "BGAスコープ画像切替1";
\r
998 str = "BGAスコープ画像切替2";
\r
1002 str = "BGAスコープ画像切替3";
\r
1006 str = "BGAスコープ画像切替4";
\r
1010 str = "BGAスコープ画像切替5";
\r
1014 str = "BGAスコープ画像切替6";
\r
1018 str = "BGAスコープ画像切替7";
\r
1022 str = "BGAスコープ画像切替8";
\r
1029 return string.Format( "CChip: 位置:{0:D4}.{1:D3}, 時刻{2:D6}, Ch:{3:X2}({4}), Pn:{5}({11})(内部{6}), Pd:{7}, Sz:{8}, UseWav:{9}, Auto:{10}",
\r
1030 this.n発声位置 / 384, this.n発声位置 % 384,
\r
1032 this.nチャンネル番号, str,
\r
1033 this.n整数値, this.n整数値・内部番号,
\r
1036 this.bWAVを使うチャンネルである,
\r
1037 this.b自動再生音チャンネルである,
\r
1038 CDTX.tZZ( this.n整数値 ) );
\r
1041 #region [ IComparable 実装 ]
\r
1042 //-----------------
\r
1043 public int CompareTo( CDTX.CChip other )
\r
1045 byte[] n優先度 = new byte[] {
\r
1046 5, 5, 3, 3, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5,
\r
1047 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5,
\r
1048 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1049 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1050 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1051 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1052 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1053 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1054 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1055 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1056 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1057 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1058 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1059 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1060 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1061 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
\r
1067 if( this.n発声位置 < other.n発声位置 )
\r
1070 if( this.n発声位置 > other.n発声位置 )
\r
1076 if( n優先度[ this.nチャンネル番号 ] < n優先度[ other.nチャンネル番号 ] )
\r
1079 if( n優先度[ this.nチャンネル番号 ] > n優先度[ other.nチャンネル番号 ] )
\r
1083 // 位置も優先度も同じなら同じと返す。
\r
1087 //-----------------
\r
1090 public class CWAV : IDisposable
\r
1092 public bool bBGMとして使う;
\r
1093 public List<int> listこのWAVを使用するチャンネル番号の集合 = new List<int>( 16 );
\r
1094 public int nチップサイズ = 100;
\r
1096 public long[] n一時停止時刻 = new long[ 4 ];
\r
1097 public int n音量 = 100;
\r
1098 public int n現在再生中のサウンド番号;
\r
1099 public long[] n再生開始時刻 = new long[ 4 ];
\r
1101 public int n表記上の番号;
\r
1102 public CSound[] rSound = new CSound[ 4 ];
\r
1103 public string strコメント文 = "";
\r
1104 public string strファイル名 = "";
\r
1105 public bool bBGMとして使わない
\r
1109 return !this.bBGMとして使う;
\r
1113 this.bBGMとして使う = !value;
\r
1117 public override string ToString()
\r
1119 var sb = new StringBuilder( 128 );
\r
1121 if( this.n表記上の番号 == this.n内部番号 )
\r
1123 sb.Append( string.Format( "CWAV{0}: ", CDTX.tZZ( this.n表記上の番号 ) ) );
\r
1127 sb.Append( string.Format( "CWAV{0}(内部{1}): ", CDTX.tZZ( this.n表記上の番号 ), this.n内部番号 ) );
\r
1129 sb.Append( string.Format( "音量:{0}, 位置:{1}, サイズ:{2}, BGM:{3}, File:{4}, Comment:{5}", this.n音量, this.n位置, this.nチップサイズ, this.bBGMとして使う ? 'Y' : 'N', this.strファイル名, this.strコメント文 ) );
\r
1131 return sb.ToString();
\r
1134 #region [ Dispose-Finalize パターン実装 ]
\r
1135 //-----------------
\r
1136 public void Dispose()
\r
1138 this.Dispose( true );
\r
1139 GC.SuppressFinalize( this );
\r
1141 public void Dispose( bool bManagedリソースの解放も行う )
\r
1143 if( this.bDisposed済み )
\r
1146 if( bManagedリソースの解放も行う )
\r
1148 for( int i = 0; i < 4; i++ )
\r
1150 if( this.rSound[ i ] != null )
\r
1151 CDTXMania.Sound管理.tサウンドを破棄する( this.rSound[ i ] );
\r
1152 this.rSound[ i ] = null;
\r
1154 if( ( i == 0 ) && CDTXMania.ConfigIni.bLog作成解放ログ出力 )
\r
1155 Trace.TraceInformation( "サウンドを解放しました。({0})({1})", this.strコメント文, this.strファイル名 );
\r
1159 this.bDisposed済み = true;
\r
1163 this.Dispose( false );
\r
1165 //-----------------
\r
1168 #region [ private ]
\r
1169 //-----------------
\r
1170 private bool bDisposed済み;
\r
1171 //-----------------
\r
1178 public struct STLANEINT
\r
1195 return this.HH + this.SD + this.BD + this.HT + this.LT + this.CY + this.FT + this.HHO + this.RD + this.LC;
\r
1198 public int Guitar;
\r
1201 public int this[ int index ]
\r
1238 return this.Guitar;
\r
1243 throw new IndexOutOfRangeException();
\r
1249 throw new ArgumentOutOfRangeException();
\r
1294 this.Guitar = value;
\r
1298 this.Bass = value;
\r
1301 throw new IndexOutOfRangeException();
\r
1305 public struct STRESULT
\r
1315 public string this[ int index ]
\r
1342 throw new IndexOutOfRangeException();
\r
1376 throw new IndexOutOfRangeException();
\r
1380 public struct STチップがある
\r
1382 public bool Drums;
\r
1383 public bool Guitar;
\r
1386 public bool HHOpen;
\r
1388 public bool LeftCymbal;
\r
1389 public bool OpenGuitar;
\r
1390 public bool OpenBass;
\r
1392 public bool this[ int index ]
\r
1399 return this.Drums;
\r
1402 return this.Guitar;
\r
1408 return this.HHOpen;
\r
1414 return this.LeftCymbal;
\r
1417 return this.OpenGuitar;
\r
1420 return this.OpenBass;
\r
1422 throw new IndexOutOfRangeException();
\r
1429 this.Drums = value;
\r
1433 this.Guitar = value;
\r
1437 this.Bass = value;
\r
1441 this.HHOpen = value;
\r
1445 this.Ride = value;
\r
1449 this.LeftCymbal = value;
\r
1453 this.OpenGuitar = value;
\r
1457 this.OpenBass = value;
\r
1460 throw new IndexOutOfRangeException();
\r
1468 public int nBGMAdjust
\r
1473 public string ARTIST;
\r
1474 public string BACKGROUND;
\r
1475 public string BACKGROUND_GR;
\r
1476 public double BASEBPM;
\r
1477 public bool BLACKCOLORKEY;
\r
1478 public double BPM;
\r
1479 public STチップがある bチップがある;
\r
1480 public string COMMENT;
\r
1481 public double db再生速度;
\r
1483 public string GENRE;
\r
1484 public bool HIDDENLEVEL;
\r
1485 public STDGBVALUE<int> LEVEL;
\r
1486 public Dictionary<int, CAVI> listAVI;
\r
1487 public Dictionary<int, CAVIPAN> listAVIPAN;
\r
1488 public Dictionary<int, CBGA> listBGA;
\r
1489 public Dictionary<int, CBGAPAN> listBGAPAN;
\r
1490 public Dictionary<int, CBMP> listBMP;
\r
1491 public Dictionary<int, CBMPTEX> listBMPTEX;
\r
1492 public Dictionary<int, CBPM> listBPM;
\r
1493 public List<CChip> listChip;
\r
1494 public Dictionary<int, CWAV> listWAV;
\r
1495 public string MIDIFILE;
\r
1496 public bool MIDINOTE;
\r
1497 public int MIDIレベル;
\r
1498 public STLANEINT n可視チップ数;
\r
1499 public const int n最大音数 = 4;
\r
1500 public const int n小節の解像度 = 384;
\r
1501 public string PANEL;
\r
1502 public string PATH_WAV;
\r
1503 public string PREIMAGE;
\r
1504 public string PREMOVIE;
\r
1505 public string PREVIEW;
\r
1506 public STRESULT RESULTIMAGE;
\r
1507 public STRESULT RESULTMOVIE;
\r
1508 public STRESULT RESULTSOUND;
\r
1509 public string SOUND_AUDIENCE;
\r
1510 public string SOUND_FULLCOMBO;
\r
1511 public string SOUND_NOWLOADING;
\r
1512 public string SOUND_STAGEFAILED;
\r
1513 public string STAGEFILE;
\r
1514 public string strハッシュofDTXファイル;
\r
1515 public string strファイル名;
\r
1516 public string strファイル名の絶対パス;
\r
1517 public string strフォルダ名;
\r
1518 public string TITLE;
\r
1519 #if TEST_NOTEOFFMODE
\r
1520 public STLANEVALUE<bool> b演奏で直前の音を消音する;
\r
1521 // public bool bHH演奏で直前のHHを消音する;
\r
1522 // public bool bGUITAR演奏で直前のGUITARを消音する;
\r
1523 // public bool bBASS演奏で直前のBASSを消音する;
\r
1531 this.COMMENT = "";
\r
1534 this.PREVIEW = "";
\r
1535 this.PREIMAGE = "";
\r
1536 this.PREMOVIE = "";
\r
1537 this.STAGEFILE = "";
\r
1538 this.BACKGROUND = "";
\r
1539 this.BACKGROUND_GR = "";
\r
1540 this.PATH_WAV = "";
\r
1541 this.MIDIFILE = "";
\r
1542 this.SOUND_STAGEFAILED = "";
\r
1543 this.SOUND_FULLCOMBO = "";
\r
1544 this.SOUND_NOWLOADING = "";
\r
1545 this.SOUND_AUDIENCE = "";
\r
1547 this.BLACKCOLORKEY = true;
\r
1548 STDGBVALUE<int> stdgbvalue = new STDGBVALUE<int>();
\r
1549 stdgbvalue.Drums = 0;
\r
1550 stdgbvalue.Guitar = 0;
\r
1551 stdgbvalue.Bass = 0;
\r
1552 this.LEVEL = stdgbvalue;
\r
1554 #if true // 2010.12.31 yyagi #RESULTxxxのリファクタ後。ここはnew()して参照渡ししなくてもいいよね?
\r
1555 for (int i = 0; i < 7; i++) {
\r
1556 this.RESULTIMAGE[i] = "";
\r
1557 this.RESULTMOVIE[i] = "";
\r
1558 this.RESULTSOUND[i] = "";
\r
1560 #else // #RESULTxxxのリファクタ前
\r
1561 STRESULT stresult4 = new STRESULT();
\r
1562 STRESULT stresult = stresult4;
\r
1570 this.RESULTIMAGE = stresult;
\r
1571 stresult4 = new STRESULT();
\r
1572 STRESULT stresult2 = stresult4;
\r
1573 stresult2.SS = "";
\r
1580 this.RESULTMOVIE = stresult2;
\r
1581 STRESULT stresult3 = new STRESULT();
\r
1582 stresult3.SS = "";
\r
1589 this.RESULTSOUND = stresult3;
\r
1591 this.db再生速度 = 1.0;
\r
1592 this.strハッシュofDTXファイル = "";
\r
1593 this.bチップがある = new STチップがある();
\r
1594 this.bチップがある.Drums = false;
\r
1595 this.bチップがある.Guitar = false;
\r
1596 this.bチップがある.Bass = false;
\r
1597 this.bチップがある.HHOpen = false;
\r
1598 this.bチップがある.Ride = false;
\r
1599 this.bチップがある.LeftCymbal = false;
\r
1600 this.bチップがある.OpenGuitar = false;
\r
1601 this.bチップがある.OpenBass = false;
\r
1602 this.strファイル名 = "";
\r
1603 this.strフォルダ名 = "";
\r
1604 this.strファイル名の絶対パス = "";
\r
1605 this.n無限管理WAV = new int[ 36 * 36 ];
\r
1606 this.n無限管理BPM = new int[ 36 * 36 ];
\r
1607 this.n無限管理VOL = new int[ 36 * 36 ];
\r
1608 this.n無限管理PAN = new int[ 36 * 36 ];
\r
1609 this.n無限管理SIZE = new int[ 36 * 36 ];
\r
1610 this.nRESULTIMAGE用優先順位 = new int[ 7 ];
\r
1611 this.nRESULTMOVIE用優先順位 = new int[ 7 ];
\r
1612 this.nRESULTSOUND用優先順位 = new int[ 7 ];
\r
1614 #if true // 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ後
\r
1615 STGDAPARAM[] stgdaparamArray = new STGDAPARAM[] { // GDA->DTX conversion table
\r
1616 new STGDAPARAM("TC", 0x03), new STGDAPARAM("BL", 0x02), new STGDAPARAM("GS", 0x29),
\r
1617 new STGDAPARAM("DS", 0x30), new STGDAPARAM("FI", 0x53), new STGDAPARAM("HH", 0x11),
\r
1618 new STGDAPARAM("SD", 0x12), new STGDAPARAM("BD", 0x13), new STGDAPARAM("HT", 0x14),
\r
1619 new STGDAPARAM("LT", 0x15), new STGDAPARAM("CY", 0x16), new STGDAPARAM("G1", 0x21),
\r
1620 new STGDAPARAM("G2", 0x22), new STGDAPARAM("G3", 0x23), new STGDAPARAM("G4", 0x24),
\r
1621 new STGDAPARAM("G5", 0x25), new STGDAPARAM("G6", 0x26), new STGDAPARAM("G7", 0x27),
\r
1622 new STGDAPARAM("GW", 0x28), new STGDAPARAM("01", 0x61), new STGDAPARAM("02", 0x62),
\r
1623 new STGDAPARAM("03", 0x63), new STGDAPARAM("04", 0x64), new STGDAPARAM("05", 0x65),
\r
1624 new STGDAPARAM("06", 0x66), new STGDAPARAM("07", 0x67), new STGDAPARAM("08", 0x68),
\r
1625 new STGDAPARAM("09", 0x69), new STGDAPARAM("0A", 0x70), new STGDAPARAM("0B", 0x71),
\r
1626 new STGDAPARAM("0C", 0x72), new STGDAPARAM("0D", 0x73), new STGDAPARAM("0E", 0x74),
\r
1627 new STGDAPARAM("0F", 0x75), new STGDAPARAM("10", 0x76), new STGDAPARAM("11", 0x77),
\r
1628 new STGDAPARAM("12", 0x78), new STGDAPARAM("13", 0x79), new STGDAPARAM("14", 0x80),
\r
1629 new STGDAPARAM("15", 0x81), new STGDAPARAM("16", 0x82), new STGDAPARAM("17", 0x83),
\r
1630 new STGDAPARAM("18", 0x84), new STGDAPARAM("19", 0x85), new STGDAPARAM("1A", 0x86),
\r
1631 new STGDAPARAM("1B", 0x87), new STGDAPARAM("1C", 0x88), new STGDAPARAM("1D", 0x89),
\r
1632 new STGDAPARAM("1E", 0x90), new STGDAPARAM("1F", 0x91), new STGDAPARAM("20", 0x92),
\r
1633 new STGDAPARAM("B1", 0xA1), new STGDAPARAM("B2", 0xA2), new STGDAPARAM("B3", 0xA3),
\r
1634 new STGDAPARAM("B4", 0xA4), new STGDAPARAM("B5", 0xA5), new STGDAPARAM("B6", 0xA6),
\r
1635 new STGDAPARAM("B7", 0xA7), new STGDAPARAM("BW", 0xA8), new STGDAPARAM("G0", 0x20),
\r
1636 new STGDAPARAM("B0", 0xA0)
\r
1638 #else // 2011.1.1 yyagi GDA->DTX変換テーブル リファクタ前
\r
1639 STGDAPARAM[] stgdaparamArray = new STGDAPARAM[62];
\r
1640 STGDAPARAM stgdaparam62 = new STGDAPARAM();
\r
1641 STGDAPARAM stgdaparam = stgdaparam62;
\r
1642 stgdaparam.s = "TC";
\r
1644 stgdaparamArray[ 0 ] = stgdaparam;
\r
1645 stgdaparam62 = new STGDAPARAM();
\r
1646 STGDAPARAM stgdaparam2 = stgdaparam62;
\r
1647 stgdaparam2.s = "BL";
\r
1648 stgdaparam2.c = 2;
\r
1649 stgdaparamArray[ 1 ] = stgdaparam2;
\r
1650 stgdaparam62 = new STGDAPARAM();
\r
1651 STGDAPARAM stgdaparam3 = stgdaparam62;
\r
1652 stgdaparam3.s = "GS";
\r
1653 stgdaparam3.c = 0x29;
\r
1654 stgdaparamArray[ 2 ] = stgdaparam3;
\r
1655 stgdaparam62 = new STGDAPARAM();
\r
1656 STGDAPARAM stgdaparam4 = stgdaparam62;
\r
1657 stgdaparam4.s = "DS";
\r
1658 stgdaparam4.c = 0x30;
\r
1659 stgdaparamArray[ 3 ] = stgdaparam4;
\r
1660 stgdaparam62 = new STGDAPARAM();
\r
1661 STGDAPARAM stgdaparam5 = stgdaparam62;
\r
1662 stgdaparam5.s = "FI";
\r
1663 stgdaparam5.c = 0x53;
\r
1664 stgdaparamArray[ 4 ] = stgdaparam5;
\r
1665 stgdaparam62 = new STGDAPARAM();
\r
1666 STGDAPARAM stgdaparam6 = stgdaparam62;
\r
1667 stgdaparam6.s = "HH";
\r
1668 stgdaparam6.c = 0x11;
\r
1669 stgdaparamArray[ 5 ] = stgdaparam6;
\r
1670 stgdaparam62 = new STGDAPARAM();
\r
1671 STGDAPARAM stgdaparam7 = stgdaparam62;
\r
1672 stgdaparam7.s = "SD";
\r
1673 stgdaparam7.c = 0x12;
\r
1674 stgdaparamArray[ 6 ] = stgdaparam7;
\r
1675 stgdaparam62 = new STGDAPARAM();
\r
1676 STGDAPARAM stgdaparam8 = stgdaparam62;
\r
1677 stgdaparam8.s = "BD";
\r
1678 stgdaparam8.c = 0x13;
\r
1679 stgdaparamArray[ 7 ] = stgdaparam8;
\r
1680 stgdaparam62 = new STGDAPARAM();
\r
1681 STGDAPARAM stgdaparam9 = stgdaparam62;
\r
1682 stgdaparam9.s = "HT";
\r
1683 stgdaparam9.c = 20;
\r
1684 stgdaparamArray[ 8 ] = stgdaparam9;
\r
1685 stgdaparam62 = new STGDAPARAM();
\r
1686 STGDAPARAM stgdaparam10 = stgdaparam62;
\r
1687 stgdaparam10.s = "LT";
\r
1688 stgdaparam10.c = 0x15;
\r
1689 stgdaparamArray[ 9 ] = stgdaparam10;
\r
1690 stgdaparam62 = new STGDAPARAM();
\r
1691 STGDAPARAM stgdaparam11 = stgdaparam62;
\r
1692 stgdaparam11.s = "CY";
\r
1693 stgdaparam11.c = 0x16;
\r
1694 stgdaparamArray[ 10 ] = stgdaparam11;
\r
1695 stgdaparam62 = new STGDAPARAM();
\r
1696 STGDAPARAM stgdaparam12 = stgdaparam62;
\r
1697 stgdaparam12.s = "G1";
\r
1698 stgdaparam12.c = 0x21;
\r
1699 stgdaparamArray[ 11 ] = stgdaparam12;
\r
1700 stgdaparam62 = new STGDAPARAM();
\r
1701 STGDAPARAM stgdaparam13 = stgdaparam62;
\r
1702 stgdaparam13.s = "G2";
\r
1703 stgdaparam13.c = 0x22;
\r
1704 stgdaparamArray[ 12 ] = stgdaparam13;
\r
1705 stgdaparam62 = new STGDAPARAM();
\r
1706 STGDAPARAM stgdaparam14 = stgdaparam62;
\r
1707 stgdaparam14.s = "G3";
\r
1708 stgdaparam14.c = 0x23;
\r
1709 stgdaparamArray[ 13 ] = stgdaparam14;
\r
1710 stgdaparam62 = new STGDAPARAM();
\r
1711 STGDAPARAM stgdaparam15 = stgdaparam62;
\r
1712 stgdaparam15.s = "G4";
\r
1713 stgdaparam15.c = 0x24;
\r
1714 stgdaparamArray[ 14 ] = stgdaparam15;
\r
1715 stgdaparam62 = new STGDAPARAM();
\r
1716 STGDAPARAM stgdaparam16 = stgdaparam62;
\r
1717 stgdaparam16.s = "G5";
\r
1718 stgdaparam16.c = 0x25;
\r
1719 stgdaparamArray[ 15 ] = stgdaparam16;
\r
1720 stgdaparam62 = new STGDAPARAM();
\r
1721 STGDAPARAM stgdaparam17 = stgdaparam62;
\r
1722 stgdaparam17.s = "G6";
\r
1723 stgdaparam17.c = 0x26;
\r
1724 stgdaparamArray[ 0x10 ] = stgdaparam17;
\r
1725 stgdaparam62 = new STGDAPARAM();
\r
1726 STGDAPARAM stgdaparam18 = stgdaparam62;
\r
1727 stgdaparam18.s = "G7";
\r
1728 stgdaparam18.c = 0x27;
\r
1729 stgdaparamArray[ 0x11 ] = stgdaparam18;
\r
1730 stgdaparam62 = new STGDAPARAM();
\r
1731 STGDAPARAM stgdaparam19 = stgdaparam62;
\r
1732 stgdaparam19.s = "GW";
\r
1733 stgdaparam19.c = 40;
\r
1734 stgdaparamArray[ 0x12 ] = stgdaparam19;
\r
1735 stgdaparam62 = new STGDAPARAM();
\r
1736 STGDAPARAM stgdaparam20 = stgdaparam62;
\r
1737 stgdaparam20.s = "01";
\r
1738 stgdaparam20.c = 0x61;
\r
1739 stgdaparamArray[ 0x13 ] = stgdaparam20;
\r
1740 stgdaparam62 = new STGDAPARAM();
\r
1741 STGDAPARAM stgdaparam21 = stgdaparam62;
\r
1742 stgdaparam21.s = "02";
\r
1743 stgdaparam21.c = 0x62;
\r
1744 stgdaparamArray[ 20 ] = stgdaparam21;
\r
1745 stgdaparam62 = new STGDAPARAM();
\r
1746 STGDAPARAM stgdaparam22 = stgdaparam62;
\r
1747 stgdaparam22.s = "03";
\r
1748 stgdaparam22.c = 0x63;
\r
1749 stgdaparamArray[ 0x15 ] = stgdaparam22;
\r
1750 stgdaparam62 = new STGDAPARAM();
\r
1751 STGDAPARAM stgdaparam23 = stgdaparam62;
\r
1752 stgdaparam23.s = "04";
\r
1753 stgdaparam23.c = 100;
\r
1754 stgdaparamArray[ 0x16 ] = stgdaparam23;
\r
1755 stgdaparam62 = new STGDAPARAM();
\r
1756 STGDAPARAM stgdaparam24 = stgdaparam62;
\r
1757 stgdaparam24.s = "05";
\r
1758 stgdaparam24.c = 0x65;
\r
1759 stgdaparamArray[ 0x17 ] = stgdaparam24;
\r
1760 stgdaparam62 = new STGDAPARAM();
\r
1761 STGDAPARAM stgdaparam25 = stgdaparam62;
\r
1762 stgdaparam25.s = "06";
\r
1763 stgdaparam25.c = 0x66;
\r
1764 stgdaparamArray[ 0x18 ] = stgdaparam25;
\r
1765 stgdaparam62 = new STGDAPARAM();
\r
1766 STGDAPARAM stgdaparam26 = stgdaparam62;
\r
1767 stgdaparam26.s = "07";
\r
1768 stgdaparam26.c = 0x67;
\r
1769 stgdaparamArray[ 0x19 ] = stgdaparam26;
\r
1770 stgdaparam62 = new STGDAPARAM();
\r
1771 STGDAPARAM stgdaparam27 = stgdaparam62;
\r
1772 stgdaparam27.s = "08";
\r
1773 stgdaparam27.c = 0x68;
\r
1774 stgdaparamArray[ 0x1a ] = stgdaparam27;
\r
1775 stgdaparam62 = new STGDAPARAM();
\r
1776 STGDAPARAM stgdaparam28 = stgdaparam62;
\r
1777 stgdaparam28.s = "09";
\r
1778 stgdaparam28.c = 0x69;
\r
1779 stgdaparamArray[ 0x1b ] = stgdaparam28;
\r
1780 stgdaparam62 = new STGDAPARAM();
\r
1781 STGDAPARAM stgdaparam29 = stgdaparam62;
\r
1782 stgdaparam29.s = "0A";
\r
1783 stgdaparam29.c = 0x70;
\r
1784 stgdaparamArray[ 0x1c ] = stgdaparam29;
\r
1785 stgdaparam62 = new STGDAPARAM();
\r
1786 STGDAPARAM stgdaparam30 = stgdaparam62;
\r
1787 stgdaparam30.s = "0B";
\r
1788 stgdaparam30.c = 0x71;
\r
1789 stgdaparamArray[ 0x1d ] = stgdaparam30;
\r
1790 stgdaparam62 = new STGDAPARAM();
\r
1791 STGDAPARAM stgdaparam31 = stgdaparam62;
\r
1792 stgdaparam31.s = "0C";
\r
1793 stgdaparam31.c = 0x72;
\r
1794 stgdaparamArray[ 30 ] = stgdaparam31;
\r
1795 stgdaparam62 = new STGDAPARAM();
\r
1796 STGDAPARAM stgdaparam32 = stgdaparam62;
\r
1797 stgdaparam32.s = "0D";
\r
1798 stgdaparam32.c = 0x73;
\r
1799 stgdaparamArray[ 0x1f ] = stgdaparam32;
\r
1800 stgdaparam62 = new STGDAPARAM();
\r
1801 STGDAPARAM stgdaparam33 = stgdaparam62;
\r
1802 stgdaparam33.s = "0E";
\r
1803 stgdaparam33.c = 0x74;
\r
1804 stgdaparamArray[ 0x20 ] = stgdaparam33;
\r
1805 stgdaparam62 = new STGDAPARAM();
\r
1806 STGDAPARAM stgdaparam34 = stgdaparam62;
\r
1807 stgdaparam34.s = "0F";
\r
1808 stgdaparam34.c = 0x75;
\r
1809 stgdaparamArray[ 0x21 ] = stgdaparam34;
\r
1810 stgdaparam62 = new STGDAPARAM();
\r
1811 STGDAPARAM stgdaparam35 = stgdaparam62;
\r
1812 stgdaparam35.s = "10";
\r
1813 stgdaparam35.c = 0x76;
\r
1814 stgdaparamArray[ 0x22 ] = stgdaparam35;
\r
1815 stgdaparam62 = new STGDAPARAM();
\r
1816 STGDAPARAM stgdaparam36 = stgdaparam62;
\r
1817 stgdaparam36.s = "11";
\r
1818 stgdaparam36.c = 0x77;
\r
1819 stgdaparamArray[ 0x23 ] = stgdaparam36;
\r
1820 stgdaparam62 = new STGDAPARAM();
\r
1821 STGDAPARAM stgdaparam37 = stgdaparam62;
\r
1822 stgdaparam37.s = "12";
\r
1823 stgdaparam37.c = 120;
\r
1824 stgdaparamArray[ 0x24 ] = stgdaparam37;
\r
1825 stgdaparam62 = new STGDAPARAM();
\r
1826 STGDAPARAM stgdaparam38 = stgdaparam62;
\r
1827 stgdaparam38.s = "13";
\r
1828 stgdaparam38.c = 0x79;
\r
1829 stgdaparamArray[ 0x25 ] = stgdaparam38;
\r
1830 stgdaparam62 = new STGDAPARAM();
\r
1831 STGDAPARAM stgdaparam39 = stgdaparam62;
\r
1832 stgdaparam39.s = "14";
\r
1833 stgdaparam39.c = 0x80;
\r
1834 stgdaparamArray[ 0x26 ] = stgdaparam39;
\r
1835 stgdaparam62 = new STGDAPARAM();
\r
1836 STGDAPARAM stgdaparam40 = stgdaparam62;
\r
1837 stgdaparam40.s = "15";
\r
1838 stgdaparam40.c = 0x81;
\r
1839 stgdaparamArray[ 0x27 ] = stgdaparam40;
\r
1840 stgdaparam62 = new STGDAPARAM();
\r
1841 STGDAPARAM stgdaparam41 = stgdaparam62;
\r
1842 stgdaparam41.s = "16";
\r
1843 stgdaparam41.c = 130;
\r
1844 stgdaparamArray[ 40 ] = stgdaparam41;
\r
1845 stgdaparam62 = new STGDAPARAM();
\r
1846 STGDAPARAM stgdaparam42 = stgdaparam62;
\r
1847 stgdaparam42.s = "17";
\r
1848 stgdaparam42.c = 0x83;
\r
1849 stgdaparamArray[ 0x29 ] = stgdaparam42;
\r
1850 stgdaparam62 = new STGDAPARAM();
\r
1851 STGDAPARAM stgdaparam43 = stgdaparam62;
\r
1852 stgdaparam43.s = "18";
\r
1853 stgdaparam43.c = 0x84;
\r
1854 stgdaparamArray[ 0x2a ] = stgdaparam43;
\r
1855 stgdaparam62 = new STGDAPARAM();
\r
1856 STGDAPARAM stgdaparam44 = stgdaparam62;
\r
1857 stgdaparam44.s = "19";
\r
1858 stgdaparam44.c = 0x85;
\r
1859 stgdaparamArray[ 0x2b ] = stgdaparam44;
\r
1860 stgdaparam62 = new STGDAPARAM();
\r
1861 STGDAPARAM stgdaparam45 = stgdaparam62;
\r
1862 stgdaparam45.s = "1A";
\r
1863 stgdaparam45.c = 0x86;
\r
1864 stgdaparamArray[ 0x2c ] = stgdaparam45;
\r
1865 stgdaparam62 = new STGDAPARAM();
\r
1866 STGDAPARAM stgdaparam46 = stgdaparam62;
\r
1867 stgdaparam46.s = "1B";
\r
1868 stgdaparam46.c = 0x87;
\r
1869 stgdaparamArray[ 0x2d ] = stgdaparam46;
\r
1870 stgdaparam62 = new STGDAPARAM();
\r
1871 STGDAPARAM stgdaparam47 = stgdaparam62;
\r
1872 stgdaparam47.s = "1C";
\r
1873 stgdaparam47.c = 0x88;
\r
1874 stgdaparamArray[ 0x2e ] = stgdaparam47;
\r
1875 stgdaparam62 = new STGDAPARAM();
\r
1876 STGDAPARAM stgdaparam48 = stgdaparam62;
\r
1877 stgdaparam48.s = "1D";
\r
1878 stgdaparam48.c = 0x89;
\r
1879 stgdaparamArray[ 0x2f ] = stgdaparam48;
\r
1880 stgdaparam62 = new STGDAPARAM();
\r
1881 STGDAPARAM stgdaparam49 = stgdaparam62;
\r
1882 stgdaparam49.s = "1E";
\r
1883 stgdaparam49.c = 0x90;
\r
1884 stgdaparamArray[ 0x30 ] = stgdaparam49;
\r
1885 stgdaparam62 = new STGDAPARAM();
\r
1886 STGDAPARAM stgdaparam50 = stgdaparam62;
\r
1887 stgdaparam50.s = "1F";
\r
1888 stgdaparam50.c = 0x91;
\r
1889 stgdaparamArray[ 0x31 ] = stgdaparam50;
\r
1890 stgdaparam62 = new STGDAPARAM();
\r
1891 STGDAPARAM stgdaparam51 = stgdaparam62;
\r
1892 stgdaparam51.s = "20";
\r
1893 stgdaparam51.c = 0x92;
\r
1894 stgdaparamArray[ 50 ] = stgdaparam51;
\r
1895 stgdaparam62 = new STGDAPARAM();
\r
1896 STGDAPARAM stgdaparam52 = stgdaparam62;
\r
1897 stgdaparam52.s = "B1";
\r
1898 stgdaparam52.c = 0xa1;
\r
1899 stgdaparamArray[ 0x33 ] = stgdaparam52;
\r
1900 stgdaparam62 = new STGDAPARAM();
\r
1901 STGDAPARAM stgdaparam53 = stgdaparam62;
\r
1902 stgdaparam53.s = "B2";
\r
1903 stgdaparam53.c = 0xa2;
\r
1904 stgdaparamArray[ 0x34 ] = stgdaparam53;
\r
1905 stgdaparam62 = new STGDAPARAM();
\r
1906 STGDAPARAM stgdaparam54 = stgdaparam62;
\r
1907 stgdaparam54.s = "B3";
\r
1908 stgdaparam54.c = 0xa3;
\r
1909 stgdaparamArray[ 0x35 ] = stgdaparam54;
\r
1910 stgdaparam62 = new STGDAPARAM();
\r
1911 STGDAPARAM stgdaparam55 = stgdaparam62;
\r
1912 stgdaparam55.s = "B4";
\r
1913 stgdaparam55.c = 0xa4;
\r
1914 stgdaparamArray[ 0x36 ] = stgdaparam55;
\r
1915 stgdaparam62 = new STGDAPARAM();
\r
1916 STGDAPARAM stgdaparam56 = stgdaparam62;
\r
1917 stgdaparam56.s = "B5";
\r
1918 stgdaparam56.c = 0xa5;
\r
1919 stgdaparamArray[ 0x37 ] = stgdaparam56;
\r
1920 stgdaparam62 = new STGDAPARAM();
\r
1921 STGDAPARAM stgdaparam57 = stgdaparam62;
\r
1922 stgdaparam57.s = "B6";
\r
1923 stgdaparam57.c = 0xa6;
\r
1924 stgdaparamArray[ 0x38 ] = stgdaparam57;
\r
1925 stgdaparam62 = new STGDAPARAM();
\r
1926 STGDAPARAM stgdaparam58 = stgdaparam62;
\r
1927 stgdaparam58.s = "B7";
\r
1928 stgdaparam58.c = 0xa7;
\r
1929 stgdaparamArray[ 0x39 ] = stgdaparam58;
\r
1930 stgdaparam62 = new STGDAPARAM();
\r
1931 STGDAPARAM stgdaparam59 = stgdaparam62;
\r
1932 stgdaparam59.s = "BW";
\r
1933 stgdaparam59.c = 0xa8;
\r
1934 stgdaparamArray[ 0x3a ] = stgdaparam59;
\r
1935 stgdaparam62 = new STGDAPARAM();
\r
1936 STGDAPARAM stgdaparam60 = stgdaparam62;
\r
1937 stgdaparam60.s = "G0";
\r
1938 stgdaparam60.c = 0x20;
\r
1939 stgdaparamArray[ 0x3b ] = stgdaparam60;
\r
1940 STGDAPARAM stgdaparam61 = new STGDAPARAM();
\r
1941 stgdaparam61.s = "B0";
\r
1942 stgdaparam61.c = 160;
\r
1943 stgdaparamArray[ 60 ] = stgdaparam61;
\r
1945 this.stGDAParam = stgdaparamArray;
\r
1946 this.nBGMAdjust = 0;
\r
1948 #if TEST_NOTEOFFMODE
\r
1949 this.bHH演奏で直前のHHを消音する = true;
\r
1950 this.bGUITAR演奏で直前のGUITARを消音する = true;
\r
1951 this.bBASS演奏で直前のBASSを消音する = true;
\r
1955 public CDTX( string str全入力文字列 )
\r
1959 this.t入力・全入力文字列から( str全入力文字列 );
\r
1961 public CDTX( string strファイル名, bool bヘッダのみ )
\r
1965 this.t入力( strファイル名, bヘッダのみ );
\r
1967 public CDTX( string str全入力文字列, double db再生速度, int nBGMAdjust )
\r
1971 this.t入力・全入力文字列から( str全入力文字列, db再生速度, nBGMAdjust );
\r
1973 public CDTX( string strファイル名, bool bヘッダのみ, double db再生速度, int nBGMAdjust )
\r
1977 this.t入力( strファイル名, bヘッダのみ, db再生速度, nBGMAdjust );
\r
1983 public int nモニタを考慮した音量( E楽器パート part )
\r
1985 CConfigIni configIni = CDTXMania.ConfigIni;
\r
1988 case E楽器パート.DRUMS:
\r
1989 if( configIni.b演奏音を強調する.Drums )
\r
1991 return configIni.n自動再生音量;
\r
1993 return configIni.n手動再生音量;
\r
1995 case E楽器パート.GUITAR:
\r
1996 if( configIni.b演奏音を強調する.Guitar )
\r
1998 return configIni.n自動再生音量;
\r
2000 return configIni.n手動再生音量;
\r
2003 if( configIni.b演奏音を強調する.Bass )
\r
2005 return configIni.n自動再生音量;
\r
2007 return configIni.n手動再生音量;
\r
2009 if( ( !configIni.b演奏音を強調する.Drums && !configIni.b演奏音を強調する.Guitar ) && !configIni.b演奏音を強調する.Bass )
\r
2011 return configIni.n手動再生音量;
\r
2013 return configIni.n自動再生音量;
\r
2015 public void tAVIの読み込み()
\r
2017 if( this.listAVI != null )
\r
2019 foreach( CAVI cavi in this.listAVI.Values )
\r
2021 cavi.OnDeviceCreated();
\r
2024 if( !this.bヘッダのみ )
\r
2026 foreach( CChip chip in this.listChip )
\r
2028 if( chip.nチャンネル番号 == 0x54 )
\r
2030 chip.eAVI種別 = EAVI種別.Unknown;
\r
2032 chip.rAVIPan = null;
\r
2033 if( this.listAVIPAN.ContainsKey( chip.n整数値 ) )
\r
2035 CAVIPAN cavipan = this.listAVIPAN[ chip.n整数値 ];
\r
2036 if( this.listAVI.ContainsKey( cavipan.nAVI番号 ) && ( this.listAVI[ cavipan.nAVI番号 ].avi != null ) )
\r
2038 chip.eAVI種別 = EAVI種別.AVIPAN;
\r
2039 chip.rAVI = this.listAVI[ cavipan.nAVI番号 ];
\r
2040 chip.rAVIPan = cavipan;
\r
2044 if( this.listAVI.ContainsKey( chip.n整数値 ) && ( this.listAVI[ chip.n整数値 ].avi != null ) )
\r
2046 chip.eAVI種別 = EAVI種別.AVI;
\r
2047 chip.rAVI = this.listAVI[ chip.n整数値 ];
\r
2053 public void tBMP_BMPTEXの読み込み()
\r
2055 if( this.listBMP != null )
\r
2057 foreach( CBMP cbmp in this.listBMP.Values )
\r
2059 cbmp.OnDeviceCreated();
\r
2062 if( this.listBMPTEX != null )
\r
2064 foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )
\r
2066 cbmptex.OnDeviceCreated();
\r
2069 if( !this.bヘッダのみ )
\r
2071 foreach( CChip chip in this.listChip )
\r
2073 if( ( ( ( chip.nチャンネル番号 == 4 ) || ( chip.nチャンネル番号 == 7 ) ) || ( ( chip.nチャンネル番号 >= 0x55 ) && ( chip.nチャンネル番号 <= 0x59 ) ) ) || ( chip.nチャンネル番号 == 0x60 ) )
\r
2075 chip.eBGA種別 = EBGA種別.Unknown;
\r
2077 chip.rBMPTEX = null;
\r
2079 chip.rBGAPan = null;
\r
2080 if( this.listBGAPAN.ContainsKey( chip.n整数値 ) )
\r
2082 CBGAPAN cbgapan = this.listBGAPAN[ chip.n整数値 ];
\r
2083 if( this.listBMPTEX.ContainsKey( cbgapan.nBMP番号 ) && this.listBMPTEX[ cbgapan.nBMP番号 ].bUse )
\r
2085 chip.eBGA種別 = EBGA種別.BGAPAN;
\r
2086 chip.rBMPTEX = this.listBMPTEX[ cbgapan.nBMP番号 ];
\r
2087 chip.rBGAPan = cbgapan;
\r
2090 if( this.listBMP.ContainsKey( cbgapan.nBMP番号 ) && this.listBMP[ cbgapan.nBMP番号 ].bUse )
\r
2092 chip.eBGA種別 = EBGA種別.BGAPAN;
\r
2093 chip.rBMP = this.listBMP[ cbgapan.nBMP番号 ];
\r
2094 chip.rBGAPan = cbgapan;
\r
2098 if( this.listBGA.ContainsKey( chip.n整数値 ) )
\r
2100 CBGA cbga = this.listBGA[ chip.n整数値 ];
\r
2101 if( this.listBMPTEX.ContainsKey( cbga.nBMP番号 ) && this.listBMPTEX[ cbga.nBMP番号 ].bUse )
\r
2103 chip.eBGA種別 = EBGA種別.BGA;
\r
2104 chip.rBMPTEX = this.listBMPTEX[ cbga.nBMP番号 ];
\r
2108 if( this.listBMP.ContainsKey( cbga.nBMP番号 ) && this.listBMP[ cbga.nBMP番号 ].bUse )
\r
2110 chip.eBGA種別 = EBGA種別.BGA;
\r
2111 chip.rBMP = this.listBMP[ cbga.nBMP番号 ];
\r
2116 if( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )
\r
2118 chip.eBGA種別 = EBGA種別.BMPTEX;
\r
2119 chip.rBMPTEX = this.listBMPTEX[ chip.n整数値 ];
\r
2122 if( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )
\r
2124 chip.eBGA種別 = EBGA種別.BMP;
\r
2125 chip.rBMP = this.listBMP[ chip.n整数値 ];
\r
2129 if( ( ( ( chip.nチャンネル番号 == 0xc4 ) || ( chip.nチャンネル番号 == 0xc7 ) ) || ( ( chip.nチャンネル番号 >= 0xd5 ) && ( chip.nチャンネル番号 <= 0xd9 ) ) ) || ( chip.nチャンネル番号 == 0xe0 ) )
\r
2131 chip.eBGA種別 = EBGA種別.Unknown;
\r
2133 chip.rBMPTEX = null;
\r
2135 chip.rBGAPan = null;
\r
2136 if( this.listBMPTEX.ContainsKey( chip.n整数値 ) && this.listBMPTEX[ chip.n整数値 ].bUse )
\r
2138 chip.eBGA種別 = EBGA種別.BMPTEX;
\r
2139 chip.rBMPTEX = this.listBMPTEX[ chip.n整数値 ];
\r
2141 else if( this.listBMP.ContainsKey( chip.n整数値 ) && this.listBMP[ chip.n整数値 ].bUse )
\r
2143 chip.eBGA種別 = EBGA種別.BMP;
\r
2144 chip.rBMP = this.listBMP[ chip.n整数値 ];
\r
2150 public void tWave再生位置自動補正()
\r
2152 foreach( CWAV cwav in this.listWAV.Values )
\r
2154 this.tWave再生位置自動補正( cwav );
\r
2157 public void tWave再生位置自動補正( CWAV wc )
\r
2159 for( int i = 0; i < 4; i++ )
\r
2161 if( ( ( wc.rSound[ i ] != null ) && wc.rSound[ i ].b再生中 ) && ( wc.rSound[ i ].n総演奏時間ms >= 5000 ) )
\r
2163 long nCurrentTime = CDTXMania.Timer.nシステム時刻;
\r
2164 if( nCurrentTime > wc.n再生開始時刻[ i ] )
\r
2166 long nAbsTimeFromStartPlaying = nCurrentTime - wc.n再生開始時刻[ i ];
\r
2167 wc.rSound[ i ].t再生位置を変更する( wc.rSound[ i ].t時刻から位置を返す( nAbsTimeFromStartPlaying ) );
\r
2172 public void tWavの再生停止( int nWaveの内部番号 )
\r
2174 if( this.listWAV.ContainsKey( nWaveの内部番号 ) )
\r
2176 CWAV cwav = this.listWAV[ nWaveの内部番号 ];
\r
2177 for( int i = 0; i < 4; i++ )
\r
2179 if( cwav.rSound[ i ] != null )
\r
2181 cwav.rSound[ i ].t再生を停止する();
\r
2186 public void tWAVの読み込み()
\r
2188 // Trace.TraceInformation("WAV files={0}", this.listWAV.Count);
\r
2190 foreach (CWAV cwav in this.listWAV.Values)
\r
2192 // string strCount = count.ToString() + " / " + this.listWAV.Count.ToString();
\r
2193 // Debug.WriteLine(strCount);
\r
2194 // CDTXMania.act文字コンソール.tPrint(0, 0, C文字コンソール.Eフォント種別.白, strCount);
\r
2197 string str = string.IsNullOrEmpty(this.PATH_WAV) ? this.strフォルダ名 : this.PATH_WAV;
\r
2198 str = str + cwav.strファイル名;
\r
2203 cwav.rSound[ 0 ] = CDTXMania.Sound管理.tサウンドを生成する(str);
\r
2204 cwav.rSound[ 0 ].n音量 = 100;
\r
2205 if( CDTXMania.ConfigIni.bLog作成解放ログ出力 )
\r
2207 Trace.TraceInformation( "サウンドを作成しました。({3})({0})({1})({2}bytes)", cwav.strコメント文, str, cwav.rSound[ 0 ].nサウンドバッファサイズ, cwav.rSound[ 0 ].bストリーム再生する ? "Stream" : "OnMemory" );
\r
2212 cwav.rSound[ 0 ] = null;
\r
2213 Trace.TraceError( "サウンドの作成に失敗しました。({0})({1})", cwav.strコメント文, str );
\r
2215 if ( cwav.rSound[ 0 ] == null || cwav.rSound[ 0 ].bストリーム再生する )
\r
2217 for ( int j = 1; j < cwav.rSound.GetLength(0); j++ )
\r
2219 cwav.rSound[ j ] = null;
\r
2224 for ( int j = 1; j < cwav.rSound.GetLength(0); j++ )
\r
2226 cwav.rSound[ j ] = (CSound) cwav.rSound[ 0 ].Clone(); // #24007 2011.9.5 yyagi add: to accelerate loading chip sounds
\r
2227 CDTXMania.Sound管理.tサウンドを登録する( cwav.rSound[ j ] );
\r
2231 catch( Exception exception )
\r
2233 Trace.TraceError( "サウンドの生成に失敗しました。({0})({1})({2})", exception.Message, cwav.strコメント文, str );
\r
2234 for( int j = 0; j < cwav.rSound.GetLength(0); j++ )
\r
2236 cwav.rSound[ j ] = null;
\r
2242 public static string tZZ( int n )
\r
2244 if( n < 0 || n >= 36 * 36 )
\r
2245 return "!!"; // オーバー/アンダーフロー。
\r
2247 // n を36進数2桁の文字列にして返す。
\r
2249 string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
\r
2250 return new string( new char[] { str[ n / 36 ], str[ n % 36 ] } );
\r
2252 public void tギターとベースのランダム化(E楽器パート part, Eランダムモード eRandom)
\r
2254 if( ( ( part == E楽器パート.GUITAR ) || ( part == E楽器パート.BASS ) ) && ( eRandom != Eランダムモード.OFF ) )
\r
2256 int[,] nランダムレーン候補 = new int[ , ] { { 0, 1, 2, 3, 4, 5, 6, 7 }, { 0, 2, 1, 3, 4, 6, 5, 7 }, { 0, 1, 4, 5, 2, 3, 6, 7 }, { 0, 2, 4, 6, 1, 3, 5, 7 }, { 0, 4, 1, 5, 2, 6, 3, 7 }, { 0, 4, 2, 6, 1, 5, 3, 7 } };
\r
2257 int n小節番号 = -10000;
\r
2258 int n小節内乱数6通り = 0;
\r
2259 // int GOTO_END = 0; // gotoの飛び先のダミーコードで使うダミー変数
\r
2260 foreach( CChip chip in this.listChip )
\r
2262 int nRGBレーンビットパターン;
\r
2263 int n新RGBレーンビットパターン = 0; // 「未割り当てのローカル変数」ビルドエラー回避のために0を初期値に設定
\r
2265 if( ( chip.n発声位置 / 384 ) != n小節番号 ) // 小節が変化したら
\r
2267 n小節番号 = chip.n発声位置 / 384;
\r
2268 n小節内乱数6通り = CDTXMania.Random.Next( 6 );
\r
2270 int nランダム化前チャンネル番号 = chip.nチャンネル番号;
\r
2271 if( ( ( ( part != E楽器パート.GUITAR ) || ( 0x20 > nランダム化前チャンネル番号 ) ) || ( nランダム化前チャンネル番号 > 0x27 ) )
\r
2272 && ( ( ( part != E楽器パート.BASS ) || ( 0xA0 > nランダム化前チャンネル番号 ) ) || ( nランダム化前チャンネル番号 > 0xa7 ) )
\r
2279 case Eランダムモード.RANDOM: // 1小節単位でレーンのR/G/Bがランダムに入れ替わる
\r
2280 chip.nチャンネル番号 = ( nランダム化前チャンネル番号 & 0xF0 ) | nランダムレーン候補[ n小節内乱数6通り, nランダム化前チャンネル番号 & 0x07 ];
\r
2281 continue; // goto Label_02C4;
\r
2283 case Eランダムモード.SUPERRANDOM: // チップごとにR/G/Bがランダムで入れ替わる(レーンの本数までは変わらない)。
\r
2284 chip.nチャンネル番号 = ( nランダム化前チャンネル番号 & 0xF0 ) | nランダムレーン候補[ CDTXMania.Random.Next( 6 ), nランダム化前チャンネル番号 & 0x07 ];
\r
2285 continue; // goto Label_02C4;
\r
2287 case Eランダムモード.HYPERRANDOM: // レーンの本数も変わる
\r
2288 nRGBレーンビットパターン = nランダム化前チャンネル番号 & 7;
\r
2289 // n新RGBレーンビットパターン = (int)Eレーンビットパターン.OPEN; // この値は結局未使用なので削除
\r
2290 flag = ((part == E楽器パート.GUITAR) && this.bチップがある.OpenGuitar) || ((part == E楽器パート.BASS) && this.bチップがある.OpenBass); // #23546 2010.10.28 yyagi fixed (bチップがある.Bass→bチップがある.OpenBass)
\r
2291 if (((nRGBレーンビットパターン != (int)Eレーンビットパターン.xxB) && (nRGBレーンビットパターン != (int)Eレーンビットパターン.xGx)) && (nRGBレーンビットパターン != (int)Eレーンビットパターン.Rxx)) // xxB, xGx, Rxx レーン1本相当
\r
2293 break; // レーン1本相当でなければ、とりあえず先に進む
\r
2295 n新RGBレーンビットパターン = CDTXMania.Random.Next( 6 ) + 1; // レーン1本相当なら、レーン1本か2本(1~6)に変化して終了
\r
2299 continue; // goto Label_02C4;
\r
2301 switch( nRGBレーンビットパターン )
\r
2303 case (int)Eレーンビットパターン.xGB: // xGB レーン2本相当
\r
2304 case (int)Eレーンビットパターン.RxB: // RxB
\r
2305 case (int)Eレーンビットパターン.RGx: // RGx
\r
2306 n新RGBレーンビットパターン = flag ? CDTXMania.Random.Next( 8 ) : ( CDTXMania.Random.Next( 7 ) + 1 ); // OPENあり譜面ならOPENを含むランダム, OPENなし譜面ならOPENを含まないランダム
\r
2307 break; // goto Label_02B2;
\r
2310 if( nRGBレーンビットパターン == (int)Eレーンビットパターン.RGB ) // RGB レーン3本相当
\r
2312 if( flag ) // OPENあり譜面の場合
\r
2314 int n乱数パーセント = CDTXMania.Random.Next( 100 );
\r
2315 if( n乱数パーセント < 30 )
\r
2317 n新RGBレーンビットパターン = (int)Eレーンビットパターン.OPEN;
\r
2319 else if( n乱数パーセント < 60 )
\r
2321 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RGB;
\r
2323 else if( n乱数パーセント < 85 )
\r
2325 switch( CDTXMania.Random.Next( 3 ) )
\r
2328 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xGB;
\r
2329 break; // goto Label_02B2;
\r
2332 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RxB;
\r
2333 break; // goto Label_02B2;
\r
2335 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RGx;
\r
2339 switch( CDTXMania.Random.Next( 3 ) )
\r
2342 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xxB;
\r
2343 break; // goto Label_02B2;
\r
2346 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xGx;
\r
2347 break; // goto Label_02B2;
\r
2349 n新RGBレーンビットパターン = (int)Eレーンビットパターン.Rxx;
\r
2352 else // OPENなし譜面の場合
\r
2354 int n乱数パーセント = CDTXMania.Random.Next( 100 );
\r
2355 if( n乱数パーセント < 60 )
\r
2357 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RGB;
\r
2359 else if( n乱数パーセント < 85 )
\r
2361 switch( CDTXMania.Random.Next( 3 ) )
\r
2364 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xGB;
\r
2365 break; // goto Label_02B2;
\r
2368 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RxB;
\r
2369 break; // goto Label_02B2;
\r
2371 n新RGBレーンビットパターン = (int)Eレーンビットパターン.RGx;
\r
2375 switch( CDTXMania.Random.Next( 3 ) )
\r
2378 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xxB;
\r
2379 break; // goto Label_02B2;
\r
2382 n新RGBレーンビットパターン = (int)Eレーンビットパターン.xGx;
\r
2383 break; // goto Label_02B2;
\r
2385 n新RGBレーンビットパターン = (int)Eレーンビットパターン.Rxx;
\r
2389 break; // goto Label_02B2;
\r
2392 chip.nチャンネル番号 = ( nランダム化前チャンネル番号 & 0xF0 ) | n新RGBレーンビットパターン;
\r
2394 // GOTO_END++; // goto用のダミーコード
\r
2398 public void tチップの再生( CChip rChip, long n再生開始システム時刻ms, int nLane )
\r
2400 this.tチップの再生( rChip, n再生開始システム時刻ms, nLane, CDTXMania.ConfigIni.n自動再生音量, false, false );
\r
2402 public void tチップの再生( CChip rChip, long n再生開始システム時刻ms, int nLane, int nVol )
\r
2404 this.tチップの再生( rChip, n再生開始システム時刻ms, nLane, nVol, false, false );
\r
2406 public void tチップの再生( CChip rChip, long n再生開始システム時刻ms, int nLane, int nVol, bool bMIDIMonitor )
\r
2408 this.tチップの再生( rChip, n再生開始システム時刻ms, nLane, nVol, bMIDIMonitor, false );
\r
2410 public void tチップの再生( CChip pChip, long n再生開始システム時刻ms, int nLane, int nVol, bool bMIDIMonitor, bool bBad )
\r
2412 if( pChip.n整数値・内部番号 >= 0 )
\r
2414 if( ( nLane < (int) Eレーン.LC ) || ( (int) Eレーン.BGM < nLane ) )
\r
2416 throw new ArgumentOutOfRangeException();
\r
2418 if( this.listWAV.ContainsKey( pChip.n整数値・内部番号 ) )
\r
2420 CWAV wc = this.listWAV[ pChip.n整数値・内部番号 ];
\r
2421 int index = wc.n現在再生中のサウンド番号 = ( wc.n現在再生中のサウンド番号 + 1 ) % 4;
\r
2422 if( ( wc.rSound[ 0 ] != null ) && wc.rSound[ 0 ].bストリーム再生する )
\r
2424 index = wc.n現在再生中のサウンド番号 = 0;
\r
2426 CSound sound = wc.rSound[ index ];
\r
2427 if( sound != null )
\r
2429 sound.n音量 = (int) ( ( (double) ( nVol * wc.n音量 ) ) / 100.0 );
\r
2430 sound.n位置 = wc.n位置;
\r
2433 sound.db周波数倍率 = ( (float) ( 100 + ( ( ( CDTXMania.Random.Next( 3 ) + 1 ) * 7 ) * ( 1 - ( CDTXMania.Random.Next( 2 ) * 2 ) ) ) ) ) / 100f;
\r
2437 sound.db周波数倍率 = 1.0;
\r
2439 sound.db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;
\r
2442 wc.n再生開始時刻[ wc.n現在再生中のサウンド番号 ] = n再生開始システム時刻ms;
\r
2443 this.tWave再生位置自動補正( wc );
\r
2447 public void t各自動再生音チップの再生時刻を変更する( int nBGMAdjustの増減値 )
\r
2449 this.nBGMAdjust += nBGMAdjustの増減値;
\r
2450 for( int i = 0; i < this.listChip.Count; i++ )
\r
2452 int nChannelNumber = this.listChip[ i ].nチャンネル番号;
\r
2454 ( nChannelNumber == 1 ) ||
\r
2455 ( ( 0x61 <= nChannelNumber ) && ( nChannelNumber <= 0x69 ) )
\r
2457 ( ( 0x70 <= nChannelNumber ) && ( nChannelNumber <= 0x79 ) )
\r
2459 ( ( ( 0x80 <= nChannelNumber ) && ( nChannelNumber <= 0x89 ) ) || ( ( 0x90 <= nChannelNumber ) && ( nChannelNumber <= 0x92 ) ) )
\r
2462 this.listChip[ i ].n発声時刻ms += nBGMAdjustの増減値;
\r
2465 foreach( CWAV cwav in this.listWAV.Values )
\r
2467 for( int j = 0; j < 4; j++ )
\r
2469 if( ( cwav.rSound[ j ] != null ) && cwav.rSound[ j ].b再生中 )
\r
2471 cwav.n再生開始時刻[ j ] += nBGMAdjustの増減値;
\r
2476 public void t全チップの再生一時停止()
\r
2478 foreach( CWAV cwav in this.listWAV.Values )
\r
2480 for( int i = 0; i < 4; i++ )
\r
2482 if( ( cwav.rSound[ i ] != null ) && cwav.rSound[ i ].b再生中 )
\r
2484 cwav.rSound[ i ].t再生を一時停止する();
\r
2485 cwav.n一時停止時刻[ i ] = CDTXMania.Timer.nシステム時刻;
\r
2490 public void t全チップの再生再開()
\r
2492 foreach( CWAV cwav in this.listWAV.Values )
\r
2494 for( int i = 0; i < 4; i++ )
\r
2496 if( ( cwav.rSound[ i ] != null ) && cwav.rSound[ i ].b一時停止中 )
\r
2498 long num1 = cwav.n一時停止時刻[ i ];
\r
2499 long num2 = cwav.n再生開始時刻[ i ];
\r
2500 cwav.rSound[ i ].t再生を再開する( cwav.n一時停止時刻[ i ] - cwav.n再生開始時刻[ i ] );
\r
2501 cwav.n再生開始時刻[ i ] += CDTXMania.Timer.nシステム時刻 - cwav.n一時停止時刻[ i ];
\r
2506 public void t全チップの再生停止()
\r
2508 foreach( CWAV cwav in this.listWAV.Values )
\r
2510 this.tWavの再生停止( cwav.n内部番号 );
\r
2513 public void t入力( string strファイル名, bool bヘッダのみ )
\r
2515 this.t入力( strファイル名, bヘッダのみ, 1.0, 0 );
\r
2517 public void t入力( string strファイル名, bool bヘッダのみ, double db再生速度, int nBGMAdjust )
\r
2519 this.bヘッダのみ = bヘッダのみ;
\r
2520 this.strファイル名の絶対パス = Path.GetFullPath( strファイル名 );
\r
2521 this.strファイル名 = Path.GetFileName( this.strファイル名の絶対パス );
\r
2522 this.strフォルダ名 = Path.GetDirectoryName( this.strファイル名の絶対パス ) + @"\";
\r
2523 string ext = Path.GetExtension( this.strファイル名 ).ToLower();
\r
2526 if( !( ext == ".dtx" ) )
\r
2528 if( ext == ".gda" )
\r
2530 this.e種別 = E種別.GDA;
\r
2532 else if( ext == ".g2d" )
\r
2534 this.e種別 = E種別.G2D;
\r
2536 else if( ext == ".bms" )
\r
2538 this.e種別 = E種別.BMS;
\r
2540 else if( ext == ".bme" )
\r
2542 this.e種別 = E種別.BME;
\r
2544 else if( ext == ".mid" )
\r
2546 this.e種別 = E種別.SMF;
\r
2551 this.e種別 = E種別.DTX;
\r
2554 if( this.e種別 != E種別.SMF )
\r
2556 StreamReader reader = new StreamReader( strファイル名, Encoding.GetEncoding( "shift-jis" ) );
\r
2557 string str2 = reader.ReadToEnd();
\r
2559 this.t入力・全入力文字列から( str2, db再生速度, nBGMAdjust );
\r
2563 Trace.TraceWarning( "SMF の演奏は未対応です。(検討中)" );
\r
2566 public void t入力・全入力文字列から( string str全入力文字列 )
\r
2568 this.t入力・全入力文字列から( str全入力文字列, 1.0, 0 );
\r
2570 public unsafe void t入力・全入力文字列から( string str全入力文字列, double db再生速度, int nBGMAdjust )
\r
2572 if( !string.IsNullOrEmpty( str全入力文字列 ) )
\r
2574 this.db再生速度 = db再生速度;
\r
2575 str全入力文字列 = str全入力文字列.Replace( Environment.NewLine, "\n" );
\r
2576 str全入力文字列 = str全入力文字列.Replace( '\t', ' ' );
\r
2577 str全入力文字列 = str全入力文字列 + "\n";
\r
2578 for( int j = 0; j < 36 * 36; j++ )
\r
2580 this.n無限管理WAV[ j ] = -j;
\r
2581 this.n無限管理BPM[ j ] = -j;
\r
2582 this.n無限管理VOL[ j ] = -j;
\r
2583 this.n無限管理PAN[ j ] = -10000 - j;
\r
2584 this.n無限管理SIZE[ j ] = -j;
\r
2586 this.n内部番号WAV1to = 1;
\r
2587 this.n内部番号BPM1to = 1;
\r
2588 this.bstackIFからENDIFをスキップする = new Stack<bool>();
\r
2589 this.bstackIFからENDIFをスキップする.Push( false );
\r
2591 for( int k = 0; k < 7; k++ )
\r
2593 this.nRESULTIMAGE用優先順位[ k ] = 0;
\r
2594 this.nRESULTMOVIE用優先順位[ k ] = 0;
\r
2595 this.nRESULTSOUND用優先順位[ k ] = 0;
\r
2597 CharEnumerator ce = str全入力文字列.GetEnumerator();
\r
2598 if( ce.MoveNext() )
\r
2603 if( !this.t入力・空白と改行をスキップする( ref ce ) )
\r
2607 if( ce.Current == '#' )
\r
2609 if( ce.MoveNext() )
\r
2611 StringBuilder builder = new StringBuilder( 0x20 );
\r
2612 if( this.t入力・コマンド文字列を抜き出す( ref ce, ref builder ) )
\r
2614 StringBuilder builder2 = new StringBuilder( 0x400 );
\r
2615 if( this.t入力・パラメータ文字列を抜き出す( ref ce, ref builder2 ) )
\r
2617 StringBuilder builder3 = new StringBuilder( 0x400 );
\r
2618 if( this.t入力・コメント文字列を抜き出す( ref ce, ref builder3 ) )
\r
2620 this.t入力・行解析( ref builder, ref builder2, ref builder3 );
\r
2630 while( this.t入力・コメントをスキップする( ref ce ) );
\r
2631 this.n無限管理WAV = null;
\r
2632 this.n無限管理BPM = null;
\r
2633 this.n無限管理VOL = null;
\r
2634 this.n無限管理PAN = null;
\r
2635 this.n無限管理SIZE = null;
\r
2636 if( !this.bヘッダのみ )
\r
2640 foreach( CBPM cbpm2 in this.listBPM.Values )
\r
2642 if( cbpm2.n表記上の番号 == 0 )
\r
2648 if( cbpm == null )
\r
2650 cbpm = new CBPM();
\r
2651 cbpm.n内部番号 = this.n内部番号BPM1to++;
\r
2653 cbpm.dbBPM値 = 120.0;
\r
2654 this.listBPM.Add( cbpm.n内部番号, cbpm );
\r
2655 CChip item = new CChip();
\r
2657 item.nチャンネル番号 = 8;
\r
2659 item.n整数値・内部番号 = cbpm.n内部番号;
\r
2660 this.listChip.Add( item );
\r
2664 CChip chip2 = new CChip();
\r
2666 chip2.nチャンネル番号 = 8;
\r
2668 chip2.n整数値・内部番号 = cbpm.n内部番号;
\r
2669 this.listChip.Add( chip2 );
\r
2671 if( this.listBMP.ContainsKey( 0 ) )
\r
2673 CChip chip4 = new CChip();
\r
2675 chip4.nチャンネル番号 = 4;
\r
2677 chip4.n整数値・内部番号 = 0;
\r
2678 CChip chip3 = chip4;
\r
2679 this.listChip.Add( chip3 );
\r
2681 foreach( CWAV cwav in this.listWAV.Values )
\r
2683 if( cwav.nチップサイズ < 0 )
\r
2685 cwav.nチップサイズ = 100;
\r
2687 if( cwav.n位置 <= -10000 )
\r
2691 if( cwav.n音量 < 0 )
\r
2696 foreach( CWAV cwav2 in this.listWAV.Values )
\r
2698 foreach( CChip chip5 in this.listChip )
\r
2700 if( chip5.n整数値・内部番号 == cwav2.n内部番号 )
\r
2702 chip5.dbチップサイズ倍率 = ( (double) cwav2.nチップサイズ ) / 100.0;
\r
2706 for( int m = 0xb1; m <= 0xbb; m++ )
\r
2708 foreach( CChip chip6 in this.listChip )
\r
2710 if( chip6.nチャンネル番号 == m )
\r
2712 CChip chip7 = new CChip();
\r
2714 chip7.nチャンネル番号 = chip6.nチャンネル番号;
\r
2715 chip7.n整数値 = chip6.n整数値;
\r
2716 chip7.n整数値・内部番号 = chip6.n整数値・内部番号;
\r
2717 this.listChip.Add( chip7 );
\r
2722 if( this.listChip.Count > 0 )
\r
2724 this.listChip.Sort();
\r
2725 double num4 = 1.0;
\r
2726 int num5 = ( this.listChip[ this.listChip.Count - 1 ].n発声位置 + 384 ) - ( this.listChip[ this.listChip.Count - 1 ].n発声位置 % 384 );
\r
2727 for( int num6 = 0; num6 <= num5; num6 += 384 )
\r
2729 CChip chip8 = new CChip();
\r
2730 chip8.n発声位置 = num6;
\r
2731 chip8.nチャンネル番号 = 0x50;
\r
2732 chip8.n整数値 = 36 * 36 - 1;
\r
2733 this.listChip.Add( chip8 );
\r
2735 this.listChip.Sort();
\r
2738 for( int num9 = 0; num9 < num5; num9 += 384 )
\r
2741 while( ( num8 < this.listChip.Count ) && ( this.listChip[ num8 ].n発声位置 < ( num9 + 384 ) ) )
\r
2743 if( this.listChip[ num8 ].nチャンネル番号 == 0xc1 )
\r
2745 num10 = this.listChip[ num8 ].n発声位置 - num9;
\r
2749 if( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) )
\r
2753 while( ( num7 < this.listChip.Count ) && ( this.listChip[ num7 ].n発声位置 <= num9 ) )
\r
2755 if( this.listChip[ num7 ].nチャンネル番号 == 2 )
\r
2757 num4 = this.listChip[ num7 ].db実数値;
\r
2761 for( int num11 = 0; num11 < 100; num11++ )
\r
2763 int num12 = (int) ( ( (double) ( 384 * num11 ) ) / ( 4.0 * num4 ) );
\r
2764 if( ( num12 + num10 ) >= 384 )
\r
2768 if( ( ( num12 + num10 ) % 384 ) != 0 )
\r
2770 CChip chip9 = new CChip();
\r
2771 chip9.n発声位置 = ( num9 + num12 ) + num10;
\r
2772 chip9.nチャンネル番号 = 0x51;
\r
2773 chip9.n整数値 = 36 * 36 - 1;
\r
2774 this.listChip.Add( chip9 );
\r
2778 this.listChip.Sort();
\r
2781 Predicate<CChip> match = null;
\r
2782 for( int i = 0; i < this.listChip.Count; i++ )
\r
2784 int startIndex = i;
\r
2787 if( match == null )
\r
2789 match = delegate( CChip c )
\r
2791 return ( c.nチャンネル番号 == 0xc2 ) && ( c.n発声位置 == this.listChip[ i ].n発声位置 );
\r
2794 startIndex = this.listChip.FindIndex( startIndex, match );
\r
2795 if( startIndex == -1 )
\r
2799 if( this.listChip[ startIndex ].n整数値 == 1 )
\r
2803 if( this.listChip[ startIndex ].n整数値 == 2 )
\r
2809 if( ( ( this.listChip[ i ].nチャンネル番号 == 80 ) || ( this.listChip[ i ].nチャンネル番号 == 0x51 ) ) && ( this.listChip[ i ].n整数値 == 0x50f ) )
\r
2811 this.listChip[ i ].b可視 = flag;
\r
2814 double bpm = 120.0;
\r
2815 double num15 = 1.0;
\r
2819 foreach( CChip chip10 in this.listChip )
\r
2821 chip10.n発声時刻ms = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );
\r
2822 if( ( ( this.e種別 == E種別.BMS ) || ( this.e種別 == E種別.BME ) ) && ( ( num15 != 1.0 ) && ( ( chip10.n発声位置 / 384) != nBar ) ) )
\r
2824 num16 = chip10.n発声位置;
\r
2825 num17 = chip10.n発声時刻ms;
\r
2828 nBar = chip10.n発声位置 / 384;
\r
2829 num26 = chip10.nチャンネル番号;
\r
2834 num16 = chip10.n発声位置;
\r
2835 num17 = chip10.n発声時刻ms;
\r
2836 num15 = chip10.db実数値;
\r
2841 num16 = chip10.n発声位置;
\r
2842 num17 = chip10.n発声時刻ms;
\r
2843 bpm = this.BASEBPM + chip10.n整数値;
\r
2869 num16 = chip10.n発声位置;
\r
2870 num17 = chip10.n発声時刻ms;
\r
2871 if( this.listBPM.ContainsKey( chip10.n整数値・内部番号 ) )
\r
2873 bpm = ( ( this.listBPM[ chip10.n整数値・内部番号 ].n表記上の番号 == 0 ) ? 0.0 : this.BASEBPM ) + this.listBPM[ chip10.n整数値・内部番号 ].dbBPM値;
\r
2879 if( this.listAVIPAN.ContainsKey( chip10.n整数値 ) )
\r
2881 int num21 = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );
\r
2882 int num22 = num17 + ( (int) ( ( ( 0x271 * ( ( chip10.n発声位置 + this.listAVIPAN[ chip10.n整数値 ].n移動時間ct ) - num16 ) ) * num15 ) / bpm ) );
\r
2883 chip10.n総移動時間 = num22 - num21;
\r
2892 if( this.listBGAPAN.ContainsKey( chip10.n整数値 ) )
\r
2894 int num19 = num17 + ( (int) ( ( ( 0x271 * ( chip10.n発声位置 - num16 ) ) * num15 ) / bpm ) );
\r
2895 int num20 = num17 + ( (int) ( ( ( 0x271 * ( ( chip10.n発声位置 + this.listBGAPAN[ chip10.n整数値 ].n移動時間ct ) - num16 ) ) * num15 ) / bpm ) );
\r
2896 chip10.n総移動時間 = num20 - num19;
\r
2899 if( this.db再生速度 > 0.0 )
\r
2901 foreach( CChip chip11 in this.listChip )
\r
2903 chip11.n発声時刻ms = (int) ( ( (double) chip11.n発声時刻ms ) / this.db再生速度 );
\r
2906 this.nBGMAdjust = 0;
\r
2907 this.t各自動再生音チップの再生時刻を変更する( nBGMAdjust );
\r
2908 for( int n = 0; n < 12; n++ )
\r
2910 this.n可視チップ数[ n ] = 0;
\r
2912 foreach( CChip chip12 in this.listChip )
\r
2914 int num24 = chip12.nチャンネル番号;
\r
2915 if( ( 0x11 <= num24 ) && ( num24 <= 0x1a ) )
\r
2917 this.n可視チップ数[ num24 - 0x11 ]++;
\r
2919 if( ( 0x20 <= num24 ) && ( num24 <= 0x27 ) )
\r
2921 this.n可視チップ数.Guitar++;
\r
2923 if( ( 0xA0 <= num24 ) && ( num24 <= 0xa7 ) )
\r
2925 this.n可視チップ数.Bass++;
\r
2928 foreach( CChip chip13 in this.listChip )
\r
2930 if( ( chip13.bWAVを使うチャンネルである && this.listWAV.ContainsKey( chip13.n整数値・内部番号 ) ) && !this.listWAV[ chip13.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Contains( chip13.nチャンネル番号 ) )
\r
2932 this.listWAV[ chip13.n整数値・内部番号 ].listこのWAVを使用するチャンネル番号の集合.Add( chip13.nチャンネル番号 );
\r
2935 byte[] buffer = null;
\r
2938 FileStream stream = new FileStream( this.strファイル名の絶対パス, FileMode.Open, FileAccess.Read );
\r
2939 buffer = new byte[ stream.Length ];
\r
2940 stream.Read( buffer, 0, (int) stream.Length );
\r
2943 catch( Exception exception )
\r
2945 Trace.TraceError( exception.Message );
\r
2946 Trace.TraceError( "DTXのハッシュの計算に失敗しました。({0})", this.strファイル名の絶対パス );
\r
2948 if( buffer != null )
\r
2950 byte[] buffer2 = new MD5CryptoServiceProvider().ComputeHash( buffer );
\r
2951 StringBuilder builder4 = new StringBuilder();
\r
2952 foreach( byte num25 in buffer2 )
\r
2954 builder4.Append( num25.ToString( "x2" ) );
\r
2956 this.strハッシュofDTXファイル = builder4.ToString();
\r
2960 this.strハッシュofDTXファイル = "00000000000000000000000000000000";
\r
2962 #region [ bLogDTX詳細ログ出力 ]
\r
2963 if ( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )
\r
2965 foreach( CWAV cwav3 in this.listWAV.Values )
\r
2967 Trace.TraceInformation( cwav3.ToString() );
\r
2969 foreach( CAVI cavi in this.listAVI.Values )
\r
2971 Trace.TraceInformation( cavi.ToString() );
\r
2973 foreach( CAVIPAN cavipan in this.listAVIPAN.Values )
\r
2975 Trace.TraceInformation( cavipan.ToString() );
\r
2977 foreach( CBGA cbga in this.listBGA.Values )
\r
2979 Trace.TraceInformation( cbga.ToString() );
\r
2981 foreach( CBGAPAN cbgapan in this.listBGAPAN.Values )
\r
2983 Trace.TraceInformation( cbgapan.ToString() );
\r
2985 foreach( CBMP cbmp in this.listBMP.Values )
\r
2987 Trace.TraceInformation( cbmp.ToString() );
\r
2989 foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )
\r
2991 Trace.TraceInformation( cbmptex.ToString() );
\r
2993 foreach( CBPM cbpm3 in this.listBPM.Values )
\r
2995 Trace.TraceInformation( cbpm3.ToString() );
\r
2997 foreach( CChip chip14 in this.listChip )
\r
2999 Trace.TraceInformation( chip14.ToString() );
\r
3009 /// Swap infos between Guitar and Bass (notes, level, n可視チップ数, bチップがある)
\r
3011 public void SwapGuitarBassInfos() // #24063 2011.1.24 yyagi ギターとベースの譜面情報入替
\r
3013 for (int i = this.listChip.Count - 1; i >= 0; i--) {
\r
3014 if (listChip[i].e楽器パート == E楽器パート.BASS) {
\r
3015 listChip[i].e楽器パート = E楽器パート.GUITAR;
\r
3016 listChip[i].nチャンネル番号 -= ( 0xA0 - 0x20 );
\r
3018 else if ( listChip[i].e楽器パート == E楽器パート.GUITAR )
\r
3020 listChip[i].e楽器パート = E楽器パート.BASS;
\r
3021 listChip[i].nチャンネル番号 += ( 0xA0 - 0x20 );
\r
3023 else if ( listChip[ i ].nチャンネル番号 == 0x28 ) // #25215 2011.5.21 yyagi wailingはE楽器パート.UNKNOWNが割り当てられているので個別に対応
\r
3025 listChip[ i ].nチャンネル番号 += ( 0xA0 - 0x20 );
\r
3027 else if ( listChip[ i ].nチャンネル番号 == 0xA8 ) // #25215 2011.5.21 yyagi wailingはE楽器パート.UNKNOWNが割り当てられているので個別に対応
\r
3029 listChip[ i ].nチャンネル番号 -= ( 0xA0 - 0x20 );
\r
3032 int t = this.LEVEL.Bass;
\r
3033 this.LEVEL.Bass = this.LEVEL.Guitar;
\r
3034 this.LEVEL.Guitar = t;
\r
3036 t = this.n可視チップ数.Bass;
\r
3037 this.n可視チップ数.Bass = this.n可視チップ数.Guitar;
\r
3038 this.n可視チップ数.Guitar = t;
\r
3040 bool ts = this.bチップがある.Bass;
\r
3041 this.bチップがある.Bass = this.bチップがある.Guitar;
\r
3042 this.bチップがある.Guitar = ts;
\r
3044 // SwapGuitarBassInfos_AutoFlags();
\r
3046 public void SwapGuitarBassInfos_AutoFlags()
\r
3048 bool ts = CDTXMania.ConfigIni.bAutoPlay.Bass; // #24415 2011.2.21 yyagi: FLIP時のリザルトにAUTOの記録が混ざらないよう、AUTOのフラグもswapする
\r
3049 CDTXMania.ConfigIni.bAutoPlay.Bass = CDTXMania.ConfigIni.bAutoPlay.Guitar;
\r
3050 CDTXMania.ConfigIni.bAutoPlay.Guitar = ts;
\r
3052 CDTXMania.ConfigIni.bIsSwappedGuitarBass_AutoFlagsAreSwapped = !CDTXMania.ConfigIni.bIsSwappedGuitarBass_AutoFlagsAreSwapped;
\r
3057 public override void On活性化()
\r
3059 this.listWAV = new Dictionary<int, CWAV>();
\r
3060 this.listBMP = new Dictionary<int, CBMP>();
\r
3061 this.listBMPTEX = new Dictionary<int, CBMPTEX>();
\r
3062 this.listBPM = new Dictionary<int, CBPM>();
\r
3063 this.listBGAPAN = new Dictionary<int, CBGAPAN>();
\r
3064 this.listBGA = new Dictionary<int, CBGA>();
\r
3065 this.listAVIPAN = new Dictionary<int, CAVIPAN>();
\r
3066 this.listAVI = new Dictionary<int, CAVI>();
\r
3067 this.listChip = new List<CChip>();
\r
3070 public override void On非活性化()
\r
3072 if( this.listWAV != null )
\r
3074 foreach( CWAV cwav in this.listWAV.Values )
\r
3078 this.listWAV = null;
\r
3080 if( this.listBMP != null )
\r
3082 foreach( CBMP cbmp in this.listBMP.Values )
\r
3086 this.listBMP = null;
\r
3088 if( this.listBMPTEX != null )
\r
3090 foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )
\r
3092 cbmptex.Dispose();
\r
3094 this.listBMPTEX = null;
\r
3096 if( this.listAVI != null )
\r
3098 foreach( CAVI cavi in this.listAVI.Values )
\r
3102 this.listAVI = null;
\r
3104 if( this.listBPM != null )
\r
3106 this.listBPM.Clear();
\r
3107 this.listBPM = null;
\r
3109 if( this.listBGAPAN != null )
\r
3111 this.listBGAPAN.Clear();
\r
3112 this.listBGAPAN = null;
\r
3114 if( this.listBGA != null )
\r
3116 this.listBGA.Clear();
\r
3117 this.listBGA = null;
\r
3119 if( this.listAVIPAN != null )
\r
3121 this.listAVIPAN.Clear();
\r
3122 this.listAVIPAN = null;
\r
3124 if( this.listChip != null )
\r
3126 this.listChip.Clear();
\r
3130 public override void OnManagedリソースの作成()
\r
3132 if( !base.b活性化してない )
\r
3134 this.tBMP_BMPTEXの読み込み();
\r
3136 base.OnManagedリソースの作成();
\r
3139 public override void OnManagedリソースの解放()
\r
3141 if( !base.b活性化してない )
\r
3143 if( this.listBMP != null )
\r
3145 foreach( CBMP cbmp in this.listBMP.Values )
\r
3150 if( this.listBMPTEX != null )
\r
3152 foreach( CBMPTEX cbmptex in this.listBMPTEX.Values )
\r
3154 cbmptex.Dispose();
\r
3157 if( this.listAVI != null )
\r
3159 foreach( CAVI cavi in this.listAVI.Values )
\r
3164 base.OnManagedリソースの解放();
\r
3171 #region [ private ]
\r
3172 //-----------------
\r
3174 /// <para>GDAチャンネル番号に対応するDTXチャンネル番号。</para>
\r
3176 [StructLayout( LayoutKind.Sequential )]
\r
3177 private struct STGDAPARAM
\r
3179 public string strGDAのチャンネル文字列;
\r
3180 public int nDTXのチャンネル番号;
\r
3182 public STGDAPARAM( string strGDAのチャンネル文字列, int nDTXのチャンネル番号 ) // 2011.1.1 yyagi 構造体のコンストラクタ追加(初期化簡易化のため)
\r
3184 this.strGDAのチャンネル文字列 = strGDAのチャンネル文字列;
\r
3185 this.nDTXのチャンネル番号 = nDTXのチャンネル番号;
\r
3189 private readonly STGDAPARAM[] stGDAParam;
\r
3190 private bool bヘッダのみ;
\r
3191 private Stack<bool> bstackIFからENDIFをスキップする;
\r
3193 private int n現在の行数;
\r
3194 private int n現在の乱数;
\r
3196 private int n内部番号BPM1to;
\r
3197 private int n内部番号WAV1to;
\r
3198 private int[] n無限管理BPM;
\r
3199 private int[] n無限管理PAN;
\r
3200 private int[] n無限管理SIZE;
\r
3201 private int[] n無限管理VOL;
\r
3202 private int[] n無限管理WAV;
\r
3203 private int[] nRESULTIMAGE用優先順位;
\r
3204 private int[] nRESULTMOVIE用優先順位;
\r
3205 private int[] nRESULTSOUND用優先順位;
\r
3207 private bool t入力・コマンド文字列を抜き出す( ref CharEnumerator ce, ref StringBuilder sb文字列 )
\r
3209 if( !this.t入力・空白をスキップする( ref ce ) )
\r
3210 return false; // 文字が尽きた
\r
3212 #region [ コマンド終端文字(':')、半角空白、コメント開始文字(';')、改行のいずれかが出現するまでをコマンド文字列と見なし、sb文字列 にコピーする。]
\r
3213 //-----------------
\r
3214 while( ce.Current != ':' && ce.Current != ' ' && ce.Current != ';' && ce.Current != '\n' )
\r
3216 sb文字列.Append( ce.Current );
\r
3218 if( !ce.MoveNext() )
\r
3219 return false; // 文字が尽きた
\r
3221 //-----------------
\r
3224 #region [ コマンド終端文字(':')で終端したなら、その次から空白をスキップしておく。]
\r
3225 //-----------------
\r
3226 if( ce.Current == ':' )
\r
3228 if( !ce.MoveNext() )
\r
3229 return false; // 文字が尽きた
\r
3231 if( !this.t入力・空白をスキップする( ref ce ) )
\r
3232 return false; // 文字が尽きた
\r
3234 //-----------------
\r
3239 private bool t入力・コメントをスキップする( ref CharEnumerator ce )
\r
3241 // 改行が現れるまでをコメントと見なしてスキップする。
\r
3243 while( ce.Current != '\n' )
\r
3245 if( !ce.MoveNext() )
\r
3246 return false; // 文字が尽きた
\r
3249 // 改行の次の文字へ移動した結果を返す。
\r
3251 return ce.MoveNext();
\r
3253 private bool t入力・コメント文字列を抜き出す( ref CharEnumerator ce, ref StringBuilder sb文字列 )
\r
3255 if( ce.Current != ';' ) // コメント開始文字(';')じゃなければ正常帰還。
\r
3258 if( !ce.MoveNext() ) // ';' の次で文字列が終わってたら終了帰還。
\r
3261 #region [ ';' の次の文字から '\n' の1つ前までをコメント文字列と見なし、sb文字列にコピーする。]
\r
3262 //-----------------
\r
3263 while( ce.Current != '\n' )
\r
3265 sb文字列.Append( ce.Current );
\r
3267 if( !ce.MoveNext() )
\r
3270 //-----------------
\r
3275 private void t入力・パラメータ食い込みチェック( string strコマンド名, ref string strコマンド, ref string strパラメータ )
\r
3277 if( ( strコマンド.Length > strコマンド名.Length ) && strコマンド.StartsWith( strコマンド名, StringComparison.OrdinalIgnoreCase ) )
\r
3279 strパラメータ = strコマンド.Substring( strコマンド名.Length ).Trim();
\r
3280 strコマンド = strコマンド.Substring( 0, strコマンド名.Length );
\r
3283 private bool t入力・パラメータ文字列を抜き出す( ref CharEnumerator ce, ref StringBuilder sb文字列 )
\r
3285 if( !this.t入力・空白をスキップする( ref ce ) )
\r
3286 return false; // 文字が尽きた
\r
3288 #region [ 改行またはコメント開始文字(';')が出現するまでをパラメータ文字列と見なし、sb文字列 にコピーする。]
\r
3289 //-----------------
\r
3290 while( ce.Current != '\n' && ce.Current != ';' )
\r
3292 sb文字列.Append( ce.Current );
\r
3294 if( !ce.MoveNext() )
\r
3297 //-----------------
\r
3302 private bool t入力・空白と改行をスキップする( ref CharEnumerator ce )
\r
3304 // 空白と改行が続く間はこれらをスキップする。
\r
3306 while( ce.Current == ' ' || ce.Current == '\n' )
\r
3308 if( ce.Current == '\n' )
\r
3309 this.n現在の行数++; // 改行文字では行番号が増える。
\r
3311 if( !ce.MoveNext() )
\r
3312 return false; // 文字が尽きた
\r
3317 private bool t入力・空白をスキップする( ref CharEnumerator ce )
\r
3319 // 空白が続く間はこれをスキップする。
\r
3321 while( ce.Current == ' ' )
\r
3323 if( !ce.MoveNext() )
\r
3324 return false; // 文字が尽きた
\r
3329 private void t入力・行解析( ref StringBuilder sbコマンド, ref StringBuilder sbパラメータ, ref StringBuilder sbコメント )
\r
3331 string strコマンド = sbコマンド.ToString();
\r
3332 string strパラメータ = sbパラメータ.ToString().Trim();
\r
3333 string strコメント = sbコメント.ToString();
\r
3338 //-----------------
\r
3339 if( strコマンド.StartsWith( "IF", StringComparison.OrdinalIgnoreCase ) )
\r
3341 this.t入力・パラメータ食い込みチェック( "IF", ref strコマンド, ref strパラメータ );
\r
3343 if( this.bstackIFからENDIFをスキップする.Count == 255 )
\r
3345 Trace.TraceWarning( "#IF の入れ子の数が 255 を超えました。この #IF を無視します。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
3347 else if( this.bstackIFからENDIFをスキップする.Peek() )
\r
3349 this.bstackIFからENDIFをスキップする.Push( true ); // 親が true ならその入れ子も問答無用で true 。
\r
3351 else // 親が false なら入れ子はパラメータと乱数を比較して結果を判断する。
\r
3355 if( !int.TryParse( strパラメータ, out n数値 ) )
\r
3358 this.bstackIFからENDIFをスキップする.Push( n数値 != this.n現在の乱数 ); // 乱数と数値が一致したら true 。
\r
3361 //-----------------
\r
3364 //-----------------
\r
3365 else if( strコマンド.StartsWith( "ENDIF", StringComparison.OrdinalIgnoreCase ) )
\r
3367 this.t入力・パラメータ食い込みチェック( "ENDIF", ref strコマンド, ref strパラメータ );
\r
3369 if( this.bstackIFからENDIFをスキップする.Count > 1 )
\r
3371 this.bstackIFからENDIFをスキップする.Pop(); // 入れ子を1つ脱出。
\r
3375 Trace.TraceWarning( "#ENDIF に対応する #IF がありません。この #ENDIF を無視します。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
3378 //-----------------
\r
3381 else if( !this.bstackIFからENDIFをスキップする.Peek() ) // IF~ENDIF をスキップするなら以下はすべて無視。
\r
3383 #region [ PATH_WAV ]
\r
3384 //-----------------
\r
3385 if( strコマンド.StartsWith( "PATH_WAV", StringComparison.OrdinalIgnoreCase ) )
\r
3387 this.t入力・パラメータ食い込みチェック( "PATH_WAV", ref strコマンド, ref strパラメータ );
\r
3388 this.PATH_WAV = strパラメータ;
\r
3390 //-----------------
\r
3393 //-----------------
\r
3394 else if( strコマンド.StartsWith( "TITLE", StringComparison.OrdinalIgnoreCase ) )
\r
3396 this.t入力・パラメータ食い込みチェック( "TITLE", ref strコマンド, ref strパラメータ );
\r
3397 this.TITLE = strパラメータ;
\r
3399 //-----------------
\r
3401 #region [ ARTIST ]
\r
3402 //-----------------
\r
3403 else if( strコマンド.StartsWith( "ARTIST", StringComparison.OrdinalIgnoreCase ) )
\r
3405 this.t入力・パラメータ食い込みチェック( "ARTIST", ref strコマンド, ref strパラメータ );
\r
3406 this.ARTIST = strパラメータ;
\r
3408 //-----------------
\r
3410 #region [ COMMENT ]
\r
3411 //-----------------
\r
3412 else if( strコマンド.StartsWith( "COMMENT", StringComparison.OrdinalIgnoreCase ) )
\r
3414 this.t入力・パラメータ食い込みチェック( "COMMENT", ref strコマンド, ref strパラメータ );
\r
3415 this.COMMENT = strパラメータ;
\r
3417 //-----------------
\r
3419 #region [ DLEVEL, PLAYLEVEL ]
\r
3420 //-----------------
\r
3422 strコマンド.StartsWith( "DLEVEL", StringComparison.OrdinalIgnoreCase ) ||
\r
3423 strコマンド.StartsWith( "PLAYLEVEL", StringComparison.OrdinalIgnoreCase ) )
\r
3425 this.t入力・パラメータ食い込みチェック( "DLEVEL", ref strコマンド, ref strパラメータ );
\r
3426 this.t入力・パラメータ食い込みチェック( "PLAYLEVEL", ref strコマンド, ref strパラメータ );
\r
3429 if( int.TryParse( strパラメータ, out dlevel ) )
\r
3431 this.LEVEL.Drums = Math.Min( Math.Max( dlevel, 0 ), 100 ); // 0~100 に丸める
\r
3434 //-----------------
\r
3436 #region [ GLEVEL ]
\r
3437 //-----------------
\r
3438 else if( strコマンド.StartsWith( "GLEVEL", StringComparison.OrdinalIgnoreCase ) )
\r
3440 this.t入力・パラメータ食い込みチェック( "GLEVEL", ref strコマンド, ref strパラメータ );
\r
3443 if( int.TryParse( strパラメータ, out glevel ) )
\r
3445 this.LEVEL.Guitar = Math.Min( Math.Max( glevel, 0 ), 100 ); // 0~100 に丸める
\r
3448 //-----------------
\r
3450 #region [ BLEVEL ]
\r
3451 //-----------------
\r
3452 else if( strコマンド.StartsWith( "BLEVEL", StringComparison.OrdinalIgnoreCase ) )
\r
3454 this.t入力・パラメータ食い込みチェック( "BLEVEL", ref strコマンド, ref strパラメータ );
\r
3457 if( int.TryParse( strパラメータ, out blevel ) )
\r
3459 this.LEVEL.Bass = Math.Min( Math.Max( blevel, 0 ), 100 ); // 0~100 に丸める
\r
3462 //-----------------
\r
3464 #if TEST_NOTEOFFMODE
\r
3465 else if (str.StartsWith("SUPRESSNOTEOFF_HIHAT", StringComparison.OrdinalIgnoreCase)) {
\r
3466 this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_HIHAT", ref str, ref str2);
\r
3467 this.bHH演奏で直前のHHを消音する = !str2.ToLower().Equals("on");
\r
3469 else if (str.StartsWith("SUPRESSNOTEOFF_GUITAR", StringComparison.OrdinalIgnoreCase)) {
\r
3470 this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_GUITAR", ref str, ref str2);
\r
3471 this.bGUITAR演奏で直前のGUITARを消音する = !str2.ToLower().Equals("on");
\r
3473 else if (str.StartsWith("SUPRESSNOTEOFF_BASS", StringComparison.OrdinalIgnoreCase)) {
\r
3474 this.t入力・パラメータ食い込みチェック("SUPRESSNOTEOFF_BASS", ref str, ref str2);
\r
3475 this.bBASS演奏で直前のBASSを消音する = !str2.ToLower().Equals("on");
\r
3479 //-----------------
\r
3480 else if( strコマンド.StartsWith( "GENRE", StringComparison.OrdinalIgnoreCase ) )
\r
3482 this.t入力・パラメータ食い込みチェック( "GENRE", ref strコマンド, ref strパラメータ );
\r
3483 this.GENRE = strパラメータ;
\r
3485 //-----------------
\r
3487 #region [ HIDDENLEVEL ]
\r
3488 //-----------------
\r
3489 else if( strコマンド.StartsWith( "HIDDENLEVEL", StringComparison.OrdinalIgnoreCase ) )
\r
3491 this.t入力・パラメータ食い込みチェック( "HIDDENLEVEL", ref strコマンド, ref strパラメータ );
\r
3492 this.HIDDENLEVEL = strパラメータ.ToLower().Equals( "on" );
\r
3494 //-----------------
\r
3496 #region [ STAGEFILE ]
\r
3497 //-----------------
\r
3498 else if( strコマンド.StartsWith( "STAGEFILE", StringComparison.OrdinalIgnoreCase ) )
\r
3500 this.t入力・パラメータ食い込みチェック( "STAGEFILE", ref strコマンド, ref strパラメータ );
\r
3501 this.STAGEFILE = strパラメータ;
\r
3503 //-----------------
\r
3505 #region [ PREVIEW ]
\r
3506 //-----------------
\r
3507 else if( strコマンド.StartsWith( "PREVIEW", StringComparison.OrdinalIgnoreCase ) )
\r
3509 this.t入力・パラメータ食い込みチェック( "PREVIEW", ref strコマンド, ref strパラメータ );
\r
3510 this.PREVIEW = strパラメータ;
\r
3512 //-----------------
\r
3514 #region [ PREIMAGE ]
\r
3515 //-----------------
\r
3516 else if( strコマンド.StartsWith( "PREIMAGE", StringComparison.OrdinalIgnoreCase ) )
\r
3518 this.t入力・パラメータ食い込みチェック( "PREIMAGE", ref strコマンド, ref strパラメータ );
\r
3519 this.PREIMAGE = strパラメータ;
\r
3521 //-----------------
\r
3523 #region [ PREMOVIE ]
\r
3524 //-----------------
\r
3525 else if( strコマンド.StartsWith( "PREMOVIE", StringComparison.OrdinalIgnoreCase ) )
\r
3527 this.t入力・パラメータ食い込みチェック( "PREMOVIE", ref strコマンド, ref strパラメータ );
\r
3528 this.PREMOVIE = strパラメータ;
\r
3530 //-----------------
\r
3532 #region [ BACKGROUND_GR ]
\r
3533 //-----------------
\r
3534 else if( strコマンド.StartsWith( "BACKGROUND_GR", StringComparison.OrdinalIgnoreCase ) )
\r
3536 this.t入力・パラメータ食い込みチェック( "BACKGROUND_GR", ref strコマンド, ref strパラメータ );
\r
3537 this.BACKGROUND_GR = strパラメータ;
\r
3539 //-----------------
\r
3541 #region [ BACKGROU}ND, WALL ]
\r
3542 //-----------------
\r
3544 strコマンド.StartsWith( "BACKGROUND", StringComparison.OrdinalIgnoreCase ) ||
\r
3545 strコマンド.StartsWith( "WALL", StringComparison.OrdinalIgnoreCase ) )
\r
3547 this.t入力・パラメータ食い込みチェック( "BACKGROUND", ref strコマンド, ref strパラメータ );
\r
3548 this.t入力・パラメータ食い込みチェック( "WALL", ref strコマンド, ref strパラメータ );
\r
3549 this.BACKGROUND = strパラメータ;
\r
3551 //-----------------
\r
3553 #region [ RANDOM ]
\r
3554 //-----------------
\r
3555 else if( strコマンド.StartsWith( "RANDOM", StringComparison.OrdinalIgnoreCase ) )
\r
3557 this.t入力・パラメータ食い込みチェック( "RANDOM", ref strコマンド, ref strパラメータ );
\r
3560 if( !int.TryParse( strパラメータ, out n数値 ) )
\r
3563 this.n現在の乱数 = CDTXMania.Random.Next( n数値 ) + 1; // 1~数値 までの乱数を生成。
\r
3565 //-----------------
\r
3567 #region [ SOUND_NOWLOADING ]
\r
3568 //-----------------
\r
3569 else if( strコマンド.StartsWith( "SOUND_NOWLOADING", StringComparison.OrdinalIgnoreCase ) )
\r
3571 this.t入力・パラメータ食い込みチェック( "SOUND_NOWLOADING", ref strコマンド, ref strパラメータ );
\r
3572 this.SOUND_NOWLOADING = strパラメータ;
\r
3574 //-----------------
\r
3577 else if( !this.bヘッダのみ ) // ヘッダのみの解析の場合、以下は無視。
\r
3580 //-----------------
\r
3581 if( strコマンド.StartsWith( "PANEL", StringComparison.OrdinalIgnoreCase ) )
\r
3583 this.t入力・パラメータ食い込みチェック( "PANEL", ref strコマンド, ref strパラメータ );
\r
3585 int dummyResult; // #23885 2010.12.12 yyagi: not to confuse "#PANEL strings (panel)" and "#PANEL int (panpot of EL)"
\r
3586 if( !int.TryParse( strパラメータ, out dummyResult ) )
\r
3587 { // 数値じゃないならPANELとみなす
\r
3588 this.PANEL = strパラメータ; //
\r
3590 } // 数値ならPAN ELとみなす
\r
3593 //-----------------
\r
3595 #region [ MIDIFILE ]
\r
3596 //-----------------
\r
3597 else if( strコマンド.StartsWith( "MIDIFILE", StringComparison.OrdinalIgnoreCase ) )
\r
3599 this.t入力・パラメータ食い込みチェック( "MIDIFILE", ref strコマンド, ref strパラメータ );
\r
3600 this.MIDIFILE = strパラメータ;
\r
3602 //-----------------
\r
3604 #region [ MIDINOTE ]
\r
3605 //-----------------
\r
3606 else if( strコマンド.StartsWith( "MIDINOTE", StringComparison.OrdinalIgnoreCase ) )
\r
3608 this.t入力・パラメータ食い込みチェック( "MIDINOTE", ref strコマンド, ref strパラメータ );
\r
3609 this.MIDINOTE = strパラメータ.ToLower().Equals( "on" );
\r
3611 //-----------------
\r
3613 #region [ BLACKCOLORKEY ]
\r
3614 //-----------------
\r
3615 else if( strコマンド.StartsWith( "BLACKCOLORKEY", StringComparison.OrdinalIgnoreCase ) )
\r
3617 this.t入力・パラメータ食い込みチェック( "BLACKCOLORKEY", ref strコマンド, ref strパラメータ );
\r
3618 this.BLACKCOLORKEY = strパラメータ.ToLower().Equals( "on" );
\r
3620 //-----------------
\r
3622 #region [ BASEBPM ]
\r
3623 //-----------------
\r
3624 else if( strコマンド.StartsWith( "BASEBPM", StringComparison.OrdinalIgnoreCase ) )
\r
3626 this.t入力・パラメータ食い込みチェック( "BASEBPM", ref strコマンド, ref strパラメータ );
\r
3628 double basebpm = 0.0;
\r
3629 //if( double.TryParse( str2, out num6 ) && ( num6 > 0.0 ) )
\r
3630 if( TryParse( strパラメータ, out basebpm ) && basebpm > 0.0 ) // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point
\r
3631 { // #24204 2011.01.21 yyagi: Fix the condition correctly
\r
3632 this.BASEBPM = basebpm;
\r
3635 //-----------------
\r
3637 #region [ SOUND_STAGEFAILED ]
\r
3638 //-----------------
\r
3639 else if( strコマンド.StartsWith( "SOUND_STAGEFAILED", StringComparison.OrdinalIgnoreCase ) )
\r
3641 this.t入力・パラメータ食い込みチェック( "SOUND_STAGEFAILED", ref strコマンド, ref strパラメータ );
\r
3642 this.SOUND_STAGEFAILED = strパラメータ;
\r
3644 //-----------------
\r
3646 #region [ SOUND_FULLCOMBO ]
\r
3647 //-----------------
\r
3648 else if( strコマンド.StartsWith( "SOUND_FULLCOMBO", StringComparison.OrdinalIgnoreCase ) )
\r
3650 this.t入力・パラメータ食い込みチェック( "SOUND_FULLCOMBO", ref strコマンド, ref strパラメータ );
\r
3651 this.SOUND_FULLCOMBO = strパラメータ;
\r
3653 //-----------------
\r
3655 #region [ SOUND_AUDIENCE ]
\r
3656 //-----------------
\r
3657 else if( strコマンド.StartsWith( "SOUND_AUDIENCE", StringComparison.OrdinalIgnoreCase ) )
\r
3659 this.t入力・パラメータ食い込みチェック( "SOUND_AUDIENCE", ref strコマンド, ref strパラメータ );
\r
3660 this.SOUND_AUDIENCE = strパラメータ;
\r
3662 //-----------------
\r
3665 // オブジェクト記述コマンドの処理。
\r
3667 else if( !this.t入力・行解析・WAVVOL_VOLUME( strコマンド, strパラメータ, strコメント ) &&
\r
3668 !this.t入力・行解析・WAVPAN_PAN( strコマンド, strパラメータ, strコメント ) &&
\r
3669 !this.t入力・行解析・WAV( strコマンド, strパラメータ, strコメント ) &&
\r
3670 !this.t入力・行解析・BMPTEX( strコマンド, strパラメータ, strコメント ) &&
\r
3671 !this.t入力・行解析・BMP( strコマンド, strパラメータ, strコメント ) &&
\r
3672 !this.t入力・行解析・BGAPAN( strコマンド, strパラメータ, strコメント ) &&
\r
3673 !this.t入力・行解析・BGA( strコマンド, strパラメータ, strコメント ) &&
\r
3674 !this.t入力・行解析・AVIPAN( strコマンド, strパラメータ, strコメント ) &&
\r
3675 !this.t入力・行解析・AVI_VIDEO( strコマンド, strパラメータ, strコメント ) &&
\r
3676 !this.t入力・行解析・BPM_BPMzz( strコマンド, strパラメータ, strコメント ) &&
\r
3677 !this.t入力・行解析・RESULTIMAGE( strコマンド, strパラメータ, strコメント ) &&
\r
3678 !this.t入力・行解析・RESULTMOVIE( strコマンド, strパラメータ, strコメント ) &&
\r
3679 !this.t入力・行解析・RESULTSOUND( strコマンド, strパラメータ, strコメント ) &&
\r
3680 !this.t入力・行解析・SIZE( strコマンド, strパラメータ, strコメント ) )
\r
3682 this.t入力・行解析・チップ配置( strコマンド, strパラメータ, strコメント );
\r
3685 Debug.Assert( true ); // #23885 2010.12.12 yyagi: dummy line to exit parsing the line
\r
3686 // 2011.8.17 from: "int xx=0;" から変更。毎回警告が出るので。
\r
3690 private bool t入力・行解析・AVI_VIDEO( string strコマンド, string strパラメータ, string strコメント )
\r
3694 #region [ "AVI" or "VIDEO" で始まらないコマンドは無効。]
\r
3695 //-----------------
\r
3696 if( strコマンド.StartsWith( "AVI", StringComparison.OrdinalIgnoreCase ) )
\r
3697 strコマンド = strコマンド.Substring( 3 ); // strコマンド から先頭の"AVI"文字を除去。
\r
3699 else if( strコマンド.StartsWith( "VIDEO", StringComparison.OrdinalIgnoreCase ) )
\r
3700 strコマンド = strコマンド.Substring( 5 ); // strコマンド から先頭の"VIDEO"文字を除去。
\r
3704 //-----------------
\r
3709 if( strコマンド.Length < 2 )
\r
3710 return false; // AVI番号 zz がないなら無効。
\r
3712 #region [ AVI番号 zz を取得する。]
\r
3713 //-----------------
\r
3714 int zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
3715 if( zz < 0 || zz >= 36 * 36 )
\r
3717 Trace.TraceError( "AVI(VIDEO)番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
3720 //-----------------
\r
3723 #region [ AVIリストに {zz, avi} の組を登録する。 ]
\r
3724 //-----------------
\r
3725 var avi = new CAVI() {
\r
3727 strファイル名 = strパラメータ,
\r
3728 strコメント文 = strコメント,
\r
3731 if( this.listAVI.ContainsKey( zz ) ) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
3732 this.listAVI.Remove( zz );
\r
3734 this.listAVI.Add( zz, avi );
\r
3735 //-----------------
\r
3740 private bool t入力・行解析・AVIPAN( string strコマンド, string strパラメータ, string strコメント )
\r
3744 #region [ "AVIPAN" で始まらないコマンドは無効。]
\r
3745 //-----------------
\r
3746 if( !strコマンド.StartsWith( "AVIPAN", StringComparison.OrdinalIgnoreCase ) )
\r
3749 strコマンド = strコマンド.Substring( 6 ); // strコマンド から先頭の"AVIPAN"文字を除去。
\r
3750 //-----------------
\r
3755 if( strコマンド.Length < 2 )
\r
3756 return false; // AVIPAN番号 zz がないなら無効。
\r
3758 #region [ AVIPAN番号 zz を取得する。]
\r
3759 //-----------------
\r
3760 int zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
3761 if( zz < 0 || zz >= 36 * 36 )
\r
3763 Trace.TraceError( "AVIPAN番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
3766 //-----------------
\r
3769 var avipan = new CAVIPAN() {
\r
3773 // パラメータ引数(14個)を取得し、avipan に登録していく。
\r
3775 string[] strParams = strパラメータ.Split( new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries );
\r
3777 #region [ パラメータ引数は全14個ないと無効。]
\r
3778 //-----------------
\r
3779 if( strParams.Length < 14 )
\r
3781 Trace.TraceError( "AVIPAN: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
3784 //-----------------
\r
3790 #region [ 1. AVI番号 ]
\r
3791 //-----------------
\r
3792 if( string.IsNullOrEmpty( strParams[ i ] ) || strParams[ i ].Length > 2 )
\r
3794 Trace.TraceError( "AVIPAN: {2}番目の数(AVI番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3797 avipan.nAVI番号 = C変換.n36進数2桁の文字列を数値に変換して返す( strParams[ i ] );
\r
3798 if( avipan.nAVI番号 < 1 || avipan.nAVI番号 >= 36 * 36 )
\r
3800 Trace.TraceError( "AVIPAN: {2}番目の数(AVI番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3804 //-----------------
\r
3806 #region [ 2. 開始転送サイズ・幅 ]
\r
3807 //-----------------
\r
3809 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3811 Trace.TraceError( "AVIPAN: {2}番目の引数(開始転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3814 avipan.sz開始サイズ.Width = n値;
\r
3816 //-----------------
\r
3818 #region [ 3. 転送サイズ・高さ ]
\r
3819 //-----------------
\r
3821 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3823 Trace.TraceError( "AVIPAN: {2}番目の引数(開始転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3826 avipan.sz開始サイズ.Height = n値;
\r
3828 //-----------------
\r
3830 #region [ 4. 終了転送サイズ・幅 ]
\r
3831 //-----------------
\r
3833 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3835 Trace.TraceError( "AVIPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3838 avipan.sz終了サイズ.Width = n値;
\r
3840 //-----------------
\r
3842 #region [ 5. 終了転送サイズ・高さ ]
\r
3843 //-----------------
\r
3845 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3847 Trace.TraceError( "AVIPAN: {2}番目の引数(終了転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3850 avipan.sz終了サイズ.Height = n値;
\r
3852 //-----------------
\r
3854 #region [ 6. 動画側開始位置・X ]
\r
3855 //-----------------
\r
3857 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3859 Trace.TraceError( "AVIPAN: {2}番目の引数(動画側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3862 avipan.pt動画側開始位置.X = n値;
\r
3864 //-----------------
\r
3866 #region [ 7. 動画側開始位置・Y ]
\r
3867 //-----------------
\r
3869 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3871 Trace.TraceError( "AVIPAN: {2}番目の引数(動画側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3874 avipan.pt動画側開始位置.Y = n値;
\r
3876 //-----------------
\r
3878 #region [ 8. 動画側終了位置・X ]
\r
3879 //-----------------
\r
3881 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3883 Trace.TraceError( "AVIPAN: {2}番目の引数(動画側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3886 avipan.pt動画側終了位置.X = n値;
\r
3888 //-----------------
\r
3890 #region [ 9. 動画側終了位置・Y ]
\r
3891 //-----------------
\r
3893 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3895 Trace.TraceError( "AVIPAN: {2}番目の引数(動画側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3898 avipan.pt動画側終了位置.Y = n値;
\r
3900 //-----------------
\r
3902 #region [ 10.表示側開始位置・X ]
\r
3903 //-----------------
\r
3905 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3907 Trace.TraceError( "AVIPAN: {2}番目の引数(表示側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3910 avipan.pt表示側開始位置.X = n値;
\r
3912 //-----------------
\r
3914 #region [ 11.表示側開始位置・Y ]
\r
3915 //-----------------
\r
3917 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3919 Trace.TraceError( "AVIPAN: {2}番目の引数(表示側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3922 avipan.pt表示側開始位置.Y = n値;
\r
3924 //-----------------
\r
3926 #region [ 12.表示側終了位置・X ]
\r
3927 //-----------------
\r
3929 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3931 Trace.TraceError( "AVIPAN: {2}番目の引数(表示側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3934 avipan.pt表示側終了位置.X = n値;
\r
3936 //-----------------
\r
3938 #region [ 13.表示側終了位置・Y ]
\r
3939 //-----------------
\r
3941 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3943 Trace.TraceError( "AVIPAN: {2}番目の引数(表示側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3946 avipan.pt表示側終了位置.Y = n値;
\r
3948 //-----------------
\r
3950 #region [ 14.移動時間 ]
\r
3951 //-----------------
\r
3953 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
3955 Trace.TraceError( "AVIPAN: {2}番目の引数(移動時間)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
3962 avipan.n移動時間ct = n値;
\r
3964 //-----------------
\r
3967 #region [ AVIPANリストに {zz, avipan} の組を登録する。]
\r
3968 //-----------------
\r
3969 if( this.listAVIPAN.ContainsKey( zz ) ) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
3970 this.listAVIPAN.Remove( zz );
\r
3972 this.listAVIPAN.Add( zz, avipan );
\r
3973 //-----------------
\r
3978 private bool t入力・行解析・BGA( string strコマンド, string strパラメータ, string strコメント )
\r
3982 #region [ "BGA" で始まらないコマンドは無効。]
\r
3983 //-----------------
\r
3984 if( !strコマンド.StartsWith( "BGA", StringComparison.OrdinalIgnoreCase ) )
\r
3987 strコマンド = strコマンド.Substring( 3 ); // strコマンド から先頭の"BGA"文字を除去。
\r
3988 //-----------------
\r
3993 if( strコマンド.Length < 2 )
\r
3994 return false; // BGA番号 zz がないなら無効。
\r
3996 #region [ BGA番号 zz を取得する。]
\r
3997 //-----------------
\r
3998 int zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
3999 if( zz < 0 || zz >= 36 * 36 )
\r
4001 Trace.TraceError( "BGA番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4004 //-----------------
\r
4007 var bga = new CBGA() {
\r
4011 // パラメータ引数(7個)を取得し、bga に登録していく。
\r
4013 string[] strParams = strパラメータ.Split( new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries );
\r
4015 #region [ パラメータ引数は全7個ないと無効。]
\r
4016 //-----------------
\r
4017 if( strParams.Length < 7 )
\r
4019 Trace.TraceError( "BGA: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4022 //-----------------
\r
4028 #region [ 1.BMP番号 ]
\r
4029 //-----------------
\r
4030 if( string.IsNullOrEmpty( strParams[ i ] ) || strParams[ i ].Length > 2 )
\r
4032 Trace.TraceError( "BGA: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4035 bga.nBMP番号 = C変換.n36進数2桁の文字列を数値に変換して返す( strParams[ i ] );
\r
4036 if( bga.nBMP番号 < 1 || bga.nBMP番号 >= 36 * 36 )
\r
4038 Trace.TraceError( "BGA: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4042 //-----------------
\r
4044 #region [ 2.画像側位置1・X ]
\r
4045 //-----------------
\r
4047 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4049 Trace.TraceError( "BGA: {2}番目の引数(画像側位置1・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4052 bga.pt画像側左上座標.X = n値;
\r
4054 //-----------------
\r
4056 #region [ 3.画像側位置1・Y ]
\r
4057 //-----------------
\r
4059 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4061 Trace.TraceError( "BGA: {2}番目の引数(画像側位置1・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4064 bga.pt画像側左上座標.Y = n値;
\r
4066 //-----------------
\r
4068 #region [ 4.画像側位置2・X ]
\r
4069 //-----------------
\r
4071 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4073 Trace.TraceError( "BGA: {2}番目の引数(画像側位置2・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4076 bga.pt画像側右下座標.X = n値;
\r
4078 //-----------------
\r
4080 #region [ 5.画像側位置2・Y ]
\r
4081 //-----------------
\r
4083 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4085 Trace.TraceError( "BGA: {2}番目の引数(画像側座標2・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4088 bga.pt画像側右下座標.Y = n値;
\r
4090 //-----------------
\r
4092 #region [ 6.表示位置・X ]
\r
4093 //-----------------
\r
4095 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4097 Trace.TraceError( "BGA: {2}番目の引数(表示位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4100 bga.pt表示座標.X = n値;
\r
4102 //-----------------
\r
4104 #region [ 7.表示位置・Y ]
\r
4105 //-----------------
\r
4107 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4109 Trace.TraceError( "BGA: {2}番目の引数(表示位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4112 bga.pt表示座標.Y = n値;
\r
4114 //-----------------
\r
4117 #region [ 画像側座標の正規化とクリッピング。]
\r
4118 //-----------------
\r
4119 if( bga.pt画像側左上座標.X > bga.pt画像側右下座標.X )
\r
4121 n値 = bga.pt画像側左上座標.X;
\r
4122 bga.pt画像側左上座標.X = bga.pt画像側右下座標.X;
\r
4123 bga.pt画像側右下座標.X = n値;
\r
4125 if( bga.pt画像側左上座標.Y > bga.pt画像側右下座標.Y )
\r
4127 n値 = bga.pt画像側左上座標.Y;
\r
4128 bga.pt画像側左上座標.Y = bga.pt画像側右下座標.Y;
\r
4129 bga.pt画像側右下座標.Y = n値;
\r
4131 //-----------------
\r
4133 #region [ BGAリストに {zz, bga} の組を登録する。]
\r
4134 //-----------------
\r
4135 if( this.listBGA.ContainsKey( zz ) ) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
4136 this.listBGA.Remove( zz );
\r
4138 this.listBGA.Add( zz, bga );
\r
4139 //-----------------
\r
4144 private bool t入力・行解析・BGAPAN( string strコマンド, string strパラメータ, string strコメント )
\r
4148 #region [ "BGAPAN" で始まらないコマンドは無効。]
\r
4149 //-----------------
\r
4150 if( !strコマンド.StartsWith( "BGAPAN", StringComparison.OrdinalIgnoreCase ) )
\r
4153 strコマンド = strコマンド.Substring( 6 ); // strコマンド から先頭の"BGAPAN"文字を除去。
\r
4154 //-----------------
\r
4159 if( strコマンド.Length < 2 )
\r
4160 return false; // BGAPAN番号 zz がないなら無効。
\r
4162 #region [ BGAPAN番号 zz を取得する。]
\r
4163 //-----------------
\r
4164 int zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
4165 if( zz < 0 || zz >= 36 * 36 )
\r
4167 Trace.TraceError( "BGAPAN番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4170 //-----------------
\r
4173 var bgapan = new CBGAPAN() {
\r
4177 // パラメータ引数(14個)を取得し、bgapan に登録していく。
\r
4179 string[] strParams = strパラメータ.Split( new char[] { ' ', ',', '(', ')', '[', ']', 'x', '|' }, StringSplitOptions.RemoveEmptyEntries );
\r
4181 #region [ パラメータ引数は全14個ないと無効。]
\r
4182 //-----------------
\r
4183 if( strParams.Length < 14 )
\r
4185 Trace.TraceError( "BGAPAN: 引数が足りません。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4188 //-----------------
\r
4194 #region [ 1. BMP番号 ]
\r
4195 //-----------------
\r
4196 if( string.IsNullOrEmpty( strParams[ i ] ) || strParams[ i ].Length > 2 )
\r
4198 Trace.TraceError( "BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4201 bgapan.nBMP番号 = C変換.n36進数2桁の文字列を数値に変換して返す( strParams[ i ] );
\r
4202 if( bgapan.nBMP番号 < 1 || bgapan.nBMP番号 >= 36 * 36 )
\r
4204 Trace.TraceError( "BGAPAN: {2}番目の数(BMP番号)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4208 //-----------------
\r
4210 #region [ 2. 開始転送サイズ・幅 ]
\r
4211 //-----------------
\r
4213 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4215 Trace.TraceError( "BGAPAN: {2}番目の引数(開始転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4218 bgapan.sz開始サイズ.Width = n値;
\r
4220 //-----------------
\r
4222 #region [ 3. 開始転送サイズ・高さ ]
\r
4223 //-----------------
\r
4225 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4227 Trace.TraceError( "BGAPAN: {2}番目の引数(開始転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4230 bgapan.sz開始サイズ.Height = n値;
\r
4232 //-----------------
\r
4234 #region [ 4. 終了転送サイズ・幅 ]
\r
4235 //-----------------
\r
4237 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4239 Trace.TraceError( "BGAPAN: {2}番目の引数(終了転送サイズ・幅)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4242 bgapan.sz終了サイズ.Width = n値;
\r
4244 //-----------------
\r
4246 #region [ 5. 終了転送サイズ・高さ ]
\r
4247 //-----------------
\r
4249 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4251 Trace.TraceError( "BGAPAN: {2}番目の引数(終了転送サイズ・高さ)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4254 bgapan.sz終了サイズ.Height = n値;
\r
4256 //-----------------
\r
4258 #region [ 6. 画像側開始位置・X ]
\r
4259 //-----------------
\r
4261 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4263 Trace.TraceError( "BGAPAN: {2}番目の引数(画像側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4266 bgapan.pt画像側開始位置.X = n値;
\r
4268 //-----------------
\r
4270 #region [ 7. 画像側開始位置・Y ]
\r
4271 //-----------------
\r
4273 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4275 Trace.TraceError( "BGAPAN: {2}番目の引数(画像側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4278 bgapan.pt画像側開始位置.Y = n値;
\r
4280 //-----------------
\r
4282 #region [ 8. 画像側終了位置・X ]
\r
4283 //-----------------
\r
4285 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4287 Trace.TraceError( "BGAPAN: {2}番目の引数(画像側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4290 bgapan.pt画像側終了位置.X = n値;
\r
4292 //-----------------
\r
4294 #region [ 9. 画像側終了位置・Y ]
\r
4295 //-----------------
\r
4297 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4299 Trace.TraceError( "BGAPAN: {2}番目の引数(画像側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4302 bgapan.pt画像側終了位置.Y = n値;
\r
4304 //-----------------
\r
4306 #region [ 10.表示側開始位置・X ]
\r
4307 //-----------------
\r
4309 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4311 Trace.TraceError( "BGAPAN: {2}番目の引数(表示側開始位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4314 bgapan.pt表示側開始位置.X = n値;
\r
4316 //-----------------
\r
4318 #region [ 11.表示側開始位置・Y ]
\r
4319 //-----------------
\r
4321 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4323 Trace.TraceError( "BGAPAN: {2}番目の引数(表示側開始位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4326 bgapan.pt表示側開始位置.Y = n値;
\r
4328 //-----------------
\r
4330 #region [ 12.表示側終了位置・X ]
\r
4331 //-----------------
\r
4333 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4335 Trace.TraceError( "BGAPAN: {2}番目の引数(表示側終了位置・X)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4338 bgapan.pt表示側終了位置.X = n値;
\r
4340 //-----------------
\r
4342 #region [ 13.表示側終了位置・Y ]
\r
4343 //-----------------
\r
4345 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4347 Trace.TraceError( "BGAPAN: {2}番目の引数(表示側終了位置・Y)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4350 bgapan.pt表示側終了位置.Y = n値;
\r
4352 //-----------------
\r
4354 #region [ 14.移動時間 ]
\r
4355 //-----------------
\r
4357 if( !int.TryParse( strParams[ i ], out n値 ) )
\r
4359 Trace.TraceError( "BGAPAN: {2}番目の引数(移動時間)が異常です。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数, i + 1 );
\r
4366 bgapan.n移動時間ct = n値;
\r
4368 //-----------------
\r
4371 #region [ BGAPANリストに {zz, bgapan} の組を登録する。]
\r
4372 //-----------------
\r
4373 if( this.listBGAPAN.ContainsKey( zz ) ) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
4374 this.listBGAPAN.Remove( zz );
\r
4376 this.listBGAPAN.Add( zz, bgapan );
\r
4377 //-----------------
\r
4382 private bool t入力・行解析・BMP( string strコマンド, string strパラメータ, string strコメント )
\r
4386 #region [ "BMP" で始まらないコマンドは無効。]
\r
4387 //-----------------
\r
4388 if( !strコマンド.StartsWith( "BMP", StringComparison.OrdinalIgnoreCase ) )
\r
4391 strコマンド = strコマンド.Substring( 3 ); // strコマンド から先頭の"BMP"文字を除去。
\r
4392 //-----------------
\r
4399 #region [ BMP番号 zz を取得する。]
\r
4400 //-----------------
\r
4401 if( strコマンド.Length < 2 )
\r
4403 #region [ (A) "#BMP:" の場合 → zz = 00 ]
\r
4404 //-----------------
\r
4406 //-----------------
\r
4411 #region [ (B) "#BMPzz:" の場合 → zz = 00 ~ ZZ ]
\r
4412 //-----------------
\r
4413 zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
4414 if( zz < 0 || zz >= 36 * 36 )
\r
4416 Trace.TraceError( "BMP番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4419 //-----------------
\r
4422 //-----------------
\r
4426 var bmp = new CBMP() {
\r
4428 strファイル名 = strパラメータ,
\r
4429 strコメント文 = strコメント,
\r
4432 #region [ BMPリストに {zz, bmp} の組を登録。]
\r
4433 //-----------------
\r
4434 if( this.listBMP.ContainsKey( zz ) ) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
4435 this.listBMP.Remove( zz );
\r
4437 this.listBMP.Add( zz, bmp );
\r
4438 //-----------------
\r
4443 private bool t入力・行解析・BMPTEX( string strコマンド, string strパラメータ, string strコメント )
\r
4447 #region [ "BMPTEX" で始まらないコマンドは無効。]
\r
4448 //-----------------
\r
4449 if( !strコマンド.StartsWith( "BMPTEX", StringComparison.OrdinalIgnoreCase ) )
\r
4452 strコマンド = strコマンド.Substring( 6 ); // strコマンド から先頭の"BMPTEX"文字を除去。
\r
4453 //-----------------
\r
4458 if( strコマンド.Length < 2 )
\r
4459 return false; // BMPTEX番号 zz がないなら無効。
\r
4461 #region [ BMPTEX番号 zz を取得する。]
\r
4462 //-----------------
\r
4463 int zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
4464 if( zz < 0 || zz >= 36 * 36 )
\r
4466 Trace.TraceError( "BMPTEX番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4469 //-----------------
\r
4472 var bmptex = new CBMPTEX() {
\r
4474 strファイル名 = strパラメータ,
\r
4475 strコメント文 = strコメント,
\r
4478 #region [ BMPTEXリストに {zz, bmptex} の組を登録する。]
\r
4479 //-----------------
\r
4480 if( this.listBMPTEX.ContainsKey( zz ) ) // 既にリスト中に存在しているなら削除。後のものが有効。
\r
4481 this.listBMPTEX.Remove( zz );
\r
4483 this.listBMPTEX.Add( zz, bmptex );
\r
4484 //-----------------
\r
4489 private bool t入力・行解析・BPM_BPMzz( string strコマンド, string strパラメータ, string strコメント )
\r
4493 #region [ "BPM" で始まらないコマンドは無効。]
\r
4494 //-----------------
\r
4495 if( !strコマンド.StartsWith( "BPM", StringComparison.OrdinalIgnoreCase ) )
\r
4498 strコマンド = strコマンド.Substring( 3 ); // strコマンド から先頭の"BPM"文字を除去。
\r
4499 //-----------------
\r
4506 #region [ BPM番号 zz を取得する。]
\r
4507 //-----------------
\r
4508 if( strコマンド.Length < 2 )
\r
4510 #region [ (A) "#BPM:" の場合 → zz = 00 ]
\r
4511 //-----------------
\r
4513 //-----------------
\r
4518 #region [ (B) "#BPMzz:" の場合 → zz = 00 ~ ZZ ]
\r
4519 //-----------------
\r
4520 zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
4521 if( zz < 0 || zz >= 36 * 36 )
\r
4523 Trace.TraceError( "BPM番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4526 //-----------------
\r
4529 //-----------------
\r
4532 double dbBPM = 0.0;
\r
4534 #region [ BPM値を取得する。]
\r
4535 //-----------------
\r
4536 //if( !double.TryParse( strパラメータ, out result ) )
\r
4537 if( !TryParse( strパラメータ, out dbBPM ) ) // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point
\r
4540 if( dbBPM <= 0.0 )
\r
4542 //-----------------
\r
4545 if( zz == 0 ) // "#BPM00:" と "#BPM:" は等価。
\r
4546 this.BPM = dbBPM; // この曲の代表 BPM に格納する。
\r
4548 #region [ BPMリストに {内部番号, zz, dbBPM} の組を登録。]
\r
4549 //-----------------
\r
4553 n内部番号 = this.n内部番号BPM1to,
\r
4557 //-----------------
\r
4560 #region [ BPM番号が zz であるBPM未設定のBPMチップがあれば、そのサイズを変更する。無限管理に対応。]
\r
4561 //-----------------
\r
4562 if( this.n無限管理BPM[ zz ] == -zz ) // 初期状態では n無限管理BPM[zz] = -zz である。この場合、#BPMzz がまだ出現していないことを意味する。
\r
4564 for( int i = 0; i < this.listChip.Count; i++ ) // これまでに出てきたチップのうち、該当する(BPM値が未設定の)BPMチップの値を変更する(仕組み上、必ず後方参照となる)。
\r
4566 var chip = this.listChip[ i ];
\r
4568 if( chip.bBPMチップである && chip.n整数値・内部番号 == -zz ) // #BPMzz 行より前の行に出現した #BPMzz では、整数値・内部番号は -zz に初期化されている。
\r
4569 chip.n整数値・内部番号 = this.n内部番号BPM1to;
\r
4572 this.n無限管理BPM[ zz ] = this.n内部番号BPM1to; // 次にこの BPM番号 zz を使うBPMチップが現れたら、このBPM値が格納されることになる。
\r
4573 this.n内部番号BPM1to++; // 内部番号は単純増加連番。
\r
4574 //-----------------
\r
4579 private bool t入力・行解析・RESULTIMAGE( string strコマンド, string strパラメータ, string strコメント )
\r
4583 #region [ "RESULTIMAGE" で始まらないコマンドは無効。]
\r
4584 //-----------------
\r
4585 if( !strコマンド.StartsWith( "RESULTIMAGE", StringComparison.OrdinalIgnoreCase ) )
\r
4588 strコマンド = strコマンド.Substring( 11 ); // strコマンド から先頭の"RESULTIMAGE"文字を除去。
\r
4589 //-----------------
\r
4593 // コマンドには "#RESULTIMAGE:" と "#RESULTIMAGE_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。
\r
4595 if( strコマンド.Length < 2 )
\r
4597 #region [ (A) ランク指定がない場合("#RESULTIMAGE:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]
\r
4598 //-----------------
\r
4599 for( int i = 0; i < 7; i++ )
\r
4601 if( this.nRESULTIMAGE用優先順位[ i ] == 0 )
\r
4602 this.RESULTIMAGE[ i ] = strパラメータ.Trim();
\r
4604 //-----------------
\r
4609 #region [ (B) ランク指定がある場合("#RESULTIMAGE_SS~E:") → 優先順位に従ってパラメータを記録する。]
\r
4610 //-----------------
\r
4611 switch( strコマンド.ToUpper() )
\r
4614 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 0, strパラメータ );
\r
4618 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 1, strパラメータ );
\r
4622 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 2, strパラメータ );
\r
4626 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 3, strパラメータ );
\r
4630 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 4, strパラメータ );
\r
4634 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 5, strパラメータ );
\r
4638 this.t入力・行解析・RESULTIMAGE・ファイルを設定する( 6, strパラメータ );
\r
4641 //-----------------
\r
4647 private void t入力・行解析・RESULTIMAGE・ファイルを設定する( int nランク0to6, string strファイル名 )
\r
4649 if( nランク0to6 < 0 || nランク0to6 > 6 ) // 値域チェック。
\r
4652 // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。
\r
4654 for( int i = nランク0to6; i >= 0; i-- )
\r
4656 int n優先順位 = 7 - nランク0to6;
\r
4658 // 現状より優先順位の低い RESULTIMAGE[] に限り、ファイル名を更新できる。
\r
4659 //(例:#RESULTMOVIE_D が #RESULTIMAGE_A より後に出現しても、#RESULTIMAGE_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)
\r
4661 if( this.nRESULTIMAGE用優先順位[ i ] < n優先順位 )
\r
4663 this.nRESULTIMAGE用優先順位[ i ] = n優先順位;
\r
4664 this.RESULTIMAGE[ i ] = strファイル名;
\r
4668 private bool t入力・行解析・RESULTMOVIE( string strコマンド, string strパラメータ, string strコメント )
\r
4672 #region [ "RESULTMOVIE" で始まらないコマンドは無効。]
\r
4673 //-----------------
\r
4674 if( !strコマンド.StartsWith( "RESULTMOVIE", StringComparison.OrdinalIgnoreCase ) )
\r
4677 strコマンド = strコマンド.Substring( 11 ); // strコマンド から先頭の"RESULTMOVIE"文字を除去。
\r
4678 //-----------------
\r
4682 // コマンドには "#RESULTMOVIE:" と "#RESULTMOVIE_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。
\r
4684 if( strコマンド.Length < 2 )
\r
4686 #region [ (A) ランク指定がない場合("#RESULTMOVIE:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]
\r
4687 //-----------------
\r
4688 for( int i = 0; i < 7; i++ )
\r
4690 if( this.nRESULTMOVIE用優先順位[ i ] == 0 )
\r
4691 this.RESULTMOVIE[ i ] = strパラメータ.Trim();
\r
4693 //-----------------
\r
4698 #region [ (B) ランク指定がある場合("#RESULTMOVIE_SS~E:") → 優先順位に従ってパラメータを記録する。]
\r
4699 //-----------------
\r
4700 switch( strコマンド.ToUpper() )
\r
4703 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 0, strパラメータ );
\r
4707 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 1, strパラメータ );
\r
4711 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 2, strパラメータ );
\r
4715 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 3, strパラメータ );
\r
4719 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 4, strパラメータ );
\r
4723 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 5, strパラメータ );
\r
4727 this.t入力・行解析・RESULTMOVIE・ファイルを設定する( 6, strパラメータ );
\r
4730 //-----------------
\r
4736 private void t入力・行解析・RESULTMOVIE・ファイルを設定する( int nランク0to6, string strファイル名 )
\r
4738 if( nランク0to6 < 0 || nランク0to6 > 6 ) // 値域チェック。
\r
4741 // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。
\r
4743 for( int i = nランク0to6; i >= 0; i-- )
\r
4745 int n優先順位 = 7 - nランク0to6;
\r
4747 // 現状より優先順位の低い RESULTMOVIE[] に限り、ファイル名を更新できる。
\r
4748 //(例:#RESULTMOVIE_D が #RESULTMOVIE_A より後に出現しても、#RESULTMOVIE_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)
\r
4750 if( this.nRESULTMOVIE用優先順位[ i ] < n優先順位 )
\r
4752 this.nRESULTMOVIE用優先順位[ i ] = n優先順位;
\r
4753 this.RESULTMOVIE[ i ] = strファイル名;
\r
4757 private bool t入力・行解析・RESULTSOUND( string strコマンド, string strパラメータ, string strコメント )
\r
4761 #region [ "RESULTSOUND" で始まらないコマンドは無効。]
\r
4762 //-----------------
\r
4763 if( !strコマンド.StartsWith( "RESULTSOUND", StringComparison.OrdinalIgnoreCase ) )
\r
4766 strコマンド = strコマンド.Substring( 11 ); // strコマンド から先頭の"RESULTSOUND"文字を除去。
\r
4767 //-----------------
\r
4771 // コマンドには "#RESULTSOUND:" と "#RESULTSOUND_SS~E" の2種類があり、パラメータの処理はそれぞれ異なる。
\r
4773 if( strコマンド.Length < 2 )
\r
4775 #region [ (A) ランク指定がない場合("#RESULTSOUND:") → 優先順位が設定されていないすべてのランクで同じパラメータを使用する。]
\r
4776 //-----------------
\r
4777 for( int i = 0; i < 7; i++ )
\r
4779 if( this.nRESULTSOUND用優先順位[ i ] == 0 )
\r
4780 this.RESULTSOUND[ i ] = strパラメータ.Trim();
\r
4782 //-----------------
\r
4787 #region [ (B) ランク指定がある場合("#RESULTSOUND_SS~E:") → 優先順位に従ってパラメータを記録する。]
\r
4788 //-----------------
\r
4789 switch( strコマンド.ToUpper() )
\r
4792 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 0, strパラメータ );
\r
4796 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 1, strパラメータ );
\r
4800 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 2, strパラメータ );
\r
4804 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 3, strパラメータ );
\r
4808 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 4, strパラメータ );
\r
4812 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 5, strパラメータ );
\r
4816 this.t入力・行解析・RESULTSOUND・ファイルを設定する( 6, strパラメータ );
\r
4819 //-----------------
\r
4825 private void t入力・行解析・RESULTSOUND・ファイルを設定する( int nランク0to6, string strファイル名 )
\r
4827 if( nランク0to6 < 0 || nランク0to6 > 6 ) // 値域チェック。
\r
4830 // 指定されたランクから上位のすべてのランクについて、ファイル名を更新する。
\r
4832 for( int i = nランク0to6; i >= 0; i-- )
\r
4834 int n優先順位 = 7 - nランク0to6;
\r
4836 // 現状より優先順位の低い RESULTSOUND[] に限り、ファイル名を更新できる。
\r
4837 //(例:#RESULTSOUND_D が #RESULTSOUND_A より後に出現しても、#RESULTSOUND_A で指定されたファイル名を上書きすることはできない。しかしその逆は可能。)
\r
4839 if( this.nRESULTSOUND用優先順位[ i ] < n優先順位 )
\r
4841 this.nRESULTSOUND用優先順位[ i ] = n優先順位;
\r
4842 this.RESULTSOUND[ i ] = strファイル名;
\r
4846 private bool t入力・行解析・SIZE( string strコマンド, string strパラメータ, string strコメント )
\r
4850 #region [ "SIZE" で始まらないコマンドや、その後ろに2文字(番号)が付随してないコマンドは無効。]
\r
4851 //-----------------
\r
4852 if( !strコマンド.StartsWith( "SIZE", StringComparison.OrdinalIgnoreCase ) )
\r
4855 strコマンド = strコマンド.Substring( 4 ); // strコマンド から先頭の"SIZE"文字を除去。
\r
4857 if( strコマンド.Length < 2 ) // サイズ番号の指定がない場合は無効。
\r
4859 //-----------------
\r
4862 #region [ nWAV番号(36進数2桁)を取得。]
\r
4863 //-----------------
\r
4864 int nWAV番号 = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
4866 if( nWAV番号 < 0 || nWAV番号 >= 36 * 36 )
\r
4868 Trace.TraceError( "SIZEのWAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4871 //-----------------
\r
4877 #region [ nサイズ値 を取得する。値は 0~100 に収める。]
\r
4878 //-----------------
\r
4881 if( !int.TryParse( strパラメータ, out nサイズ値 ) )
\r
4882 return true; // int変換に失敗しても、この行自体の処理は終えたのでtrueを返す。
\r
4884 nサイズ値 = Math.Min( Math.Max( nサイズ値, 0 ), 100 ); // 0未満は0、100超えは100に強制変換。
\r
4885 //-----------------
\r
4888 #region [ nWAV番号で示されるサイズ未設定のWAVチップがあれば、そのサイズを変更する。無限管理に対応。]
\r
4889 //-----------------
\r
4890 if( this.n無限管理SIZE[ nWAV番号 ] == -nWAV番号 ) // 初期状態では n無限管理SIZE[xx] = -xx である。この場合、#SIZExx がまだ出現していないことを意味する。
\r
4892 foreach( CWAV wav in this.listWAV.Values ) // これまでに出てきたWAVチップのうち、該当する(サイズが未設定の)チップのサイズを変更する(仕組み上、必ず後方参照となる)。
\r
4894 if( wav.nチップサイズ == -nWAV番号 ) // #SIZExx 行より前の行に出現した #WAVxx では、チップサイズは -xx に初期化されている。
\r
4895 wav.nチップサイズ = nサイズ値;
\r
4898 this.n無限管理SIZE[ nWAV番号 ] = nサイズ値; // 次にこの nWAV番号を使うWAVチップが現れたら、負数の代わりに、このサイズ値が格納されることになる。
\r
4899 //-----------------
\r
4904 private bool t入力・行解析・WAV( string strコマンド, string strパラメータ, string strコメント )
\r
4908 #region [ "WAV" で始まらないコマンドは無効。]
\r
4909 //-----------------
\r
4910 if( !strコマンド.StartsWith( "WAV", StringComparison.OrdinalIgnoreCase ) )
\r
4913 strコマンド = strコマンド.Substring( 3 ); // strコマンド から先頭の"WAV"文字を除去。
\r
4914 //-----------------
\r
4919 if( strコマンド.Length < 2 )
\r
4920 return false; // WAV番号 zz がないなら無効。
\r
4922 #region [ WAV番号 zz を取得する。]
\r
4923 //-----------------
\r
4924 int zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
4925 if( zz < 0 || zz >= 36 * 36 )
\r
4927 Trace.TraceError( "WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4930 //-----------------
\r
4933 var wav = new CWAV() {
\r
4934 n内部番号 = this.n内部番号WAV1to,
\r
4936 nチップサイズ = this.n無限管理SIZE[ zz ],
\r
4937 n位置 = this.n無限管理PAN[ zz ],
\r
4938 n音量 = this.n無限管理VOL[ zz ],
\r
4939 strファイル名 = strパラメータ,
\r
4940 strコメント文 = strコメント,
\r
4943 #region [ WAVリストに {内部番号, wav} の組を登録。]
\r
4944 //-----------------
\r
4945 this.listWAV.Add( this.n内部番号WAV1to, wav );
\r
4946 //-----------------
\r
4949 #region [ WAV番号が zz である内部番号未設定のWAVチップがあれば、その内部番号を変更する。無限管理対応。]
\r
4950 //-----------------
\r
4951 if( this.n無限管理WAV[ zz ] == -zz ) // 初期状態では n無限管理WAV[zz] = -zz である。この場合、#WAVzz がまだ出現していないことを意味する。
\r
4953 for( int i = 0; i < this.listChip.Count; i++ ) // これまでに出てきたチップのうち、該当する(内部番号が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。
\r
4955 var chip = this.listChip[ i ];
\r
4957 if( chip.bWAVを使うチャンネルである && ( chip.n整数値・内部番号 == -zz ) ) // この #WAVzz 行より前の行に出現した #WAVzz では、整数値・内部番号は -zz に初期化されている。
\r
4958 chip.n整数値・内部番号 = this.n内部番号WAV1to;
\r
4961 this.n無限管理WAV[ zz ] = this.n内部番号WAV1to; // 次にこの WAV番号 zz を使うWAVチップが現れたら、この内部番号が格納されることになる。
\r
4962 this.n内部番号WAV1to++; // 内部番号は単純増加連番。
\r
4963 //-----------------
\r
4968 private bool t入力・行解析・WAVPAN_PAN( string strコマンド, string strパラメータ, string strコメント )
\r
4972 #region [ "WAVPAN" or "PAN" で始まらないコマンドは無効。]
\r
4973 //-----------------
\r
4974 if( strコマンド.StartsWith( "WAVPAN", StringComparison.OrdinalIgnoreCase ) )
\r
4975 strコマンド = strコマンド.Substring( 6 ); // strコマンド から先頭の"WAVPAN"文字を除去。
\r
4977 else if( strコマンド.StartsWith( "PAN", StringComparison.OrdinalIgnoreCase ) )
\r
4978 strコマンド = strコマンド.Substring( 3 ); // strコマンド から先頭の"PAN"文字を除去。
\r
4982 //-----------------
\r
4987 if( strコマンド.Length < 2 )
\r
4988 return false; // WAV番号 zz がないなら無効。
\r
4990 #region [ WAV番号 zz を取得する。]
\r
4991 //-----------------
\r
4992 int zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
4993 if( zz < 0 || zz >= 36 * 36 )
\r
4995 Trace.TraceError( "WAVPAN(PAN)のWAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
4998 //-----------------
\r
5001 #region [ WAV番号 zz を持つWAVチップの位置を変更する。無限定義対応。]
\r
5002 //-----------------
\r
5004 if( int.TryParse( strパラメータ, out n位置 ) )
\r
5006 n位置 = Math.Min( Math.Max( n位置, -100 ), 100 ); // -100~+100 に丸める
\r
5008 if( this.n無限管理PAN[ zz ] == ( -10000 - zz ) ) // 初期状態では n無限管理PAN[zz] = -10000 - zz である。この場合、#WAVPANzz, #PANzz がまだ出現していないことを意味する。
\r
5010 foreach( CWAV wav in this.listWAV.Values ) // これまでに出てきたチップのうち、該当する(位置が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。
\r
5012 if( wav.n位置 == ( -10000 - zz ) ) // #WAVPANzz, #PANzz 行より前の行に出現した #WAVzz では、位置は -10000-zz に初期化されている。
\r
5016 this.n無限管理PAN[ zz ] = n位置; // 次にこの WAV番号 zz を使うWAVチップが現れたら、この位置が格納されることになる。
\r
5018 //-----------------
\r
5023 private bool t入力・行解析・WAVVOL_VOLUME( string strコマンド, string strパラメータ, string strコメント )
\r
5027 #region [ "WAVCOL" or "VOLUME" で始まらないコマンドは無効。]
\r
5028 //-----------------
\r
5029 if( strコマンド.StartsWith( "WAVVOL", StringComparison.OrdinalIgnoreCase ) )
\r
5030 strコマンド = strコマンド.Substring( 6 ); // strコマンド から先頭の"WAVVOL"文字を除去。
\r
5032 else if( strコマンド.StartsWith( "VOLUME", StringComparison.OrdinalIgnoreCase ) )
\r
5033 strコマンド = strコマンド.Substring( 6 ); // strコマンド から先頭の"VOLUME"文字を除去。
\r
5037 //-----------------
\r
5042 if( strコマンド.Length < 2 )
\r
5043 return false; // WAV番号 zz がないなら無効。
\r
5045 #region [ WAV番号 zz を取得する。]
\r
5046 //-----------------
\r
5047 int zz = C変換.n36進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 0, 2 ) );
\r
5048 if( zz < 0 || zz >= 36 * 36 )
\r
5050 Trace.TraceError( "WAV番号に 00~ZZ 以外の値または不正な文字列が指定されました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
5053 //-----------------
\r
5056 #region [ WAV番号 zz を持つWAVチップの音量を変更する。無限定義対応。]
\r
5057 //-----------------
\r
5059 if( int.TryParse( strパラメータ, out n音量 ) )
\r
5061 n音量 = Math.Min( Math.Max( n音量, 0 ), 100 ); // 0~100に丸める。
\r
5063 if( this.n無限管理VOL[ zz ] == -zz ) // 初期状態では n無限管理VOL[zz] = - zz である。この場合、#WAVVOLzz, #VOLUMEzz がまだ出現していないことを意味する。
\r
5065 foreach( CWAV wav in this.listWAV.Values ) // これまでに出てきたチップのうち、該当する(音量が未設定の)WAVチップの値を変更する(仕組み上、必ず後方参照となる)。
\r
5067 if( wav.n音量 == -zz ) // #WAVVOLzz, #VOLUMEzz 行より前の行に出現した #WAVzz では、音量は -zz に初期化されている。
\r
5071 this.n無限管理VOL[ zz ] = n音量; // 次にこの WAV番号 zz を使うWAVチップが現れたら、この音量が格納されることになる。
\r
5073 //-----------------
\r
5078 private bool t入力・行解析・チップ配置( string strコマンド, string strパラメータ, string strコメント )
\r
5082 if( strコマンド.Length != 5 ) // コマンドは必ず5文字であること。
\r
5085 #region [ n小節番号 を取得する。]
\r
5086 //-----------------
\r
5087 int n小節番号 = C変換.n小節番号の文字列3桁を数値に変換して返す( strコマンド.Substring( 0, 3 ) );
\r
5091 n小節番号++; // 先頭に空の1小節を設ける。
\r
5092 //-----------------
\r
5095 #region [ nチャンネル番号 を取得する。]
\r
5096 //-----------------
\r
5097 int nチャンネル番号 = -1;
\r
5099 // ファイルフォーマットによって処理が異なる。
\r
5101 if( this.e種別 == E種別.GDA || this.e種別 == E種別.G2D )
\r
5103 #region [ (A) GDA, G2D の場合:チャンネル文字列をDTXのチャンネル番号へ置き換える。]
\r
5104 //-----------------
\r
5105 string strチャンネル文字列 = strコマンド.Substring( 3, 2 );
\r
5107 foreach( STGDAPARAM param in this.stGDAParam )
\r
5109 if( strチャンネル文字列.Equals( param.strGDAのチャンネル文字列, StringComparison.OrdinalIgnoreCase ) )
\r
5111 nチャンネル番号 = param.nDTXのチャンネル番号;
\r
5115 if( nチャンネル番号 < 0 )
\r
5116 return false; // 置き換え失敗
\r
5117 //-----------------
\r
5122 #region [ (B) その他の場合:チャンネル番号は16進数2桁。]
\r
5123 //-----------------
\r
5124 nチャンネル番号 = C変換.n16進数2桁の文字列を数値に変換して返す( strコマンド.Substring( 3, 2 ) );
\r
5126 if( nチャンネル番号 < 0 )
\r
5128 //-----------------
\r
5131 //-----------------
\r
5133 #region [ 取得したチャンネル番号で、this.bチップがある に該当があれば設定する。]
\r
5134 //-----------------
\r
5135 if( ( nチャンネル番号 >= 0x11 ) && ( nチャンネル番号 <= 0x1a ) )
\r
5137 this.bチップがある.Drums = true;
\r
5139 else if( ( nチャンネル番号 >= 0x20 ) && ( nチャンネル番号 <= 0x27 ) )
\r
5141 this.bチップがある.Guitar = true;
\r
5143 else if( ( nチャンネル番号 >= 0xA0 ) && ( nチャンネル番号 <= 0xa7 ) )
\r
5145 this.bチップがある.Bass = true;
\r
5147 switch( nチャンネル番号 )
\r
5150 this.bチップがある.HHOpen = true;
\r
5154 this.bチップがある.Ride = true;
\r
5158 this.bチップがある.LeftCymbal = true;
\r
5162 this.bチップがある.OpenGuitar = true;
\r
5166 this.bチップがある.OpenBass = true;
\r
5169 //-----------------
\r
5175 #region [ 小節長変更(Ch.02)は他のチャンネルとはパラメータが特殊なので、先にとっとと終わらせる。 ]
\r
5176 //-----------------
\r
5177 if( nチャンネル番号 == 0x02 )
\r
5181 double db小節長倍率 = 1.0;
\r
5182 //if( !double.TryParse( strパラメータ, out result ) )
\r
5183 if( !this.TryParse( strパラメータ, out db小節長倍率 ) ) // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point
\r
5185 Trace.TraceError( "小節長倍率に不正な値を指定しました。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
5191 this.listChip.Add(
\r
5193 nチャンネル番号 = nチャンネル番号,
\r
5195 n発声位置 = n小節番号 * 384,
\r
5198 return true; // 配置終了。
\r
5200 //-----------------
\r
5206 if( string.IsNullOrEmpty( strパラメータ ) ) // パラメータはnullまたは空文字列ではないこと。
\r
5209 #region [ strパラメータ にオブジェクト記述を格納し、その n文字数 をカウントする。]
\r
5210 //-----------------
\r
5213 var sb = new StringBuilder( strパラメータ.Length );
\r
5215 // strパラメータを先頭から1文字ずつ見ながら正規化(無効文字('_')を飛ばしたり不正な文字でエラーを出したり)し、sb へ格納する。
\r
5217 CharEnumerator ce = strパラメータ.GetEnumerator();
\r
5218 while( ce.MoveNext() )
\r
5220 if( ce.Current == '_' ) // '_' は無視。
\r
5223 if( C変換.str36進数文字.IndexOf( ce.Current ) < 0 ) // オブジェクト記述は36進数文字であること。
\r
5225 Trace.TraceError( "不正なオブジェクト指定があります。[{0}: {1}行]", this.strファイル名の絶対パス, this.n現在の行数 );
\r
5229 sb.Append( ce.Current );
\r
5233 strパラメータ = sb.ToString(); // 正規化された文字列になりました。
\r
5235 if( ( n文字数 % 2 ) != 0 ) // パラメータの文字数が奇数の場合、最後の1文字を無視する。
\r
5237 //-----------------
\r
5241 // (4) パラメータをオブジェクト数値に分解して配置する。
\r
5243 for( int i = 0; i < ( n文字数 / 2 ); i++ ) // 2文字で1オブジェクト数値
\r
5245 #region [ nオブジェクト数値 を1つ取得する。'00' なら無視。]
\r
5246 //-----------------
\r
5247 int nオブジェクト数値 = 0;
\r
5249 if( nチャンネル番号 == 0x03 )
\r
5251 // Ch.03 のみ 16進数2桁。
\r
5252 nオブジェクト数値 = C変換.n16進数2桁の文字列を数値に変換して返す( strパラメータ.Substring( i * 2, 2 ) );
\r
5256 // その他のチャンネルは36進数2桁。
\r
5257 nオブジェクト数値 = C変換.n36進数2桁の文字列を数値に変換して返す( strパラメータ.Substring( i * 2, 2 ) );
\r
5260 if( nオブジェクト数値 == 0x00 )
\r
5262 //-----------------
\r
5265 // オブジェクト数値に対応するチップを生成。
\r
5267 var chip = new CChip();
\r
5269 chip.nチャンネル番号 = nチャンネル番号;
\r
5270 chip.n発声位置 = ( n小節番号 * 384 ) + ( ( 384 * i ) / ( n文字数 / 2 ) );
\r
5271 chip.n整数値 = nオブジェクト数値;
\r
5272 chip.n整数値・内部番号 = nオブジェクト数値;
\r
5274 #region [ chip.e楽器パート = ... ]
\r
5275 //-----------------
\r
5276 if( ( nチャンネル番号 >= 0x11 ) && ( nチャンネル番号 <= 0x1A ) )
\r
5278 chip.e楽器パート = E楽器パート.DRUMS;
\r
5280 if( ( nチャンネル番号 >= 0x20 ) && ( nチャンネル番号 <= 0x27 ) )
\r
5282 chip.e楽器パート = E楽器パート.GUITAR;
\r
5284 if( ( nチャンネル番号 >= 160 ) && ( nチャンネル番号 <= 0xA7 ) )
\r
5286 chip.e楽器パート = E楽器パート.BASS;
\r
5288 //-----------------
\r
5291 #region [ 無限定義への対応 → 内部番号の取得。]
\r
5292 //-----------------
\r
5293 if( chip.bWAVを使うチャンネルである )
\r
5295 chip.n整数値・内部番号 = this.n無限管理WAV[ nオブジェクト数値 ]; // これが本当に一意なWAV番号となる。(無限定義の場合、chip.n整数値 は一意である保証がない。)
\r
5297 else if( chip.bBPMチップである )
\r
5299 chip.n整数値・内部番号 = this.n無限管理BPM[ nオブジェクト数値 ]; // これが本当に一意なBPM番号となる。(同上。)
\r
5301 //-----------------
\r
5304 #region [ フィルインON/OFFチャンネル(Ch.53)の場合、発声位置を少し前後にずらす。]
\r
5305 //-----------------
\r
5306 if( nチャンネル番号 == 0x53 )
\r
5308 // ずらすのは、フィルインONチップと同じ位置にいるチップでも確実にフィルインが発動し、
\r
5309 // 同様に、フィルインOFFチップと同じ位置にいるチップでも確実にフィルインが終了するようにするため。
\r
5311 if( ( nオブジェクト数値 > 0 ) && ( nオブジェクト数値 != 2 ) )
\r
5313 chip.n発声位置 -= 32; // 384÷32=12 ということで、フィルインONチップは12分音符ほど前へ移動。
\r
5315 else if( nオブジェクト数値 == 2 )
\r
5317 chip.n発声位置 += 32; // 同じく、フィルインOFFチップは12分音符ほど後ろへ移動。
\r
5320 //-----------------
\r
5325 this.listChip.Add( chip );
\r
5329 #region [#23880 2010.12.30 yyagi: コンマとスペースの両方を小数点として扱うTryParse]
\r
5331 /// 小数点としてコンマとピリオドの両方を受け付けるTryParse()
\r
5333 /// <param name="s">strings convert to double</param>
\r
5334 /// <param name="result">parsed double value</param>
\r
5335 /// <returns>s が正常に変換された場合は true。それ以外の場合は false。</returns>
\r
5336 /// <exception cref="ArgumentException">style が NumberStyles 値でないか、style に NumberStyles.AllowHexSpecifier 値が含まれている</exception>
\r
5337 private bool TryParse(string s, out double result) { // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point
\r
5338 // EU諸国での #BPM 123,45 のような記述に対応するため、
\r
5339 // 小数点の最終位置を検出して、それをlocaleにあった
\r
5340 // 文字に置き換えてからTryParse()する
\r
5343 const string DecimalSeparators = ".,"; // 小数点文字
\r
5344 const string GroupSeparators = ".,' "; // 桁区切り文字
\r
5345 const string NumberSymbols = "0123456789"; // 数値文字
\r
5347 int len = s.Length; // 文字列長
\r
5348 int decimalPosition = len; // 真の小数点の位置 最初は文字列終端位置に仮置きする
\r
5350 for (int i = 0; i < len; i++) { // まず、真の小数点(一番最後に現れる小数点)の位置を求める
\r
5352 if (NumberSymbols.IndexOf(c) >= 0) { // 数値だったらスキップ
\r
5354 } else if (DecimalSeparators.IndexOf(c) >= 0) { // 小数点文字だったら、その都度位置を上書き記憶
\r
5355 decimalPosition = i;
\r
5356 } else if (GroupSeparators.IndexOf(c) >= 0) { // 桁区切り文字の場合もスキップ
\r
5358 } else { // 数値・小数点・区切り文字以外がきたらループ終了
\r
5363 StringBuilder decimalStr = new StringBuilder(16);
\r
5364 for (int i = 0; i < len; i++) { // 次に、localeにあった数値文字列を生成する
\r
5366 if (NumberSymbols.IndexOf(c) >= 0) { // 数値だったら
\r
5367 decimalStr.Append(c); // そのままコピー
\r
5368 } else if (DecimalSeparators.IndexOf(c) >= 0) { // 小数点文字だったら
\r
5369 if (i == decimalPosition) { // 最後に出現した小数点文字なら、localeに合った小数点を出力する
\r
5370 decimalStr.Append(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
\r
5372 } else if (GroupSeparators.IndexOf(c) >= 0) { // 桁区切り文字だったら
\r
5373 continue; // 何もしない(スキップ)
\r
5378 return double.TryParse(decimalStr.ToString(), out result); // 最後に、自分のlocale向けの文字列に対してTryParse実行
\r
5381 //-----------------
\r