2 using System.Collections.Generic;
3 using System.Diagnostics;
5 using FDK; // for string 拡張
12 /// Func<string> 読込曲のファイルパスを取得する(null 可)
13 /// StrokeStyleT.ユーザ管理.現在選択されているユーザ(コンフィグ情報)
16 /// StrokeStyleT.演奏スコア(ファイルパスが null だったならこちらも null になる)
18 class 曲読込ステージ : SST.ステージ.ステージ
21 public Func<string> 読込曲のファイルパスを取得する = null;
23 public enum フェーズ { 初期状態, 読込中, 終了 }
24 public フェーズ 現在のフェーズ { get; protected set; } = フェーズ.初期状態;
26 protected override void On活性化( デバイスリソース dr )
28 FDK.Log.Info( "曲読込ステージを開始します。" + ( StrokeStyleT.ビュアーモードである ? "(ViewerMode)" : "" ) );
29 Trace.Assert( null != this.読込曲のファイルパスを取得する, "[バグあり] 活性化の前に外部依存アクションを接続してください。" );
32 StrokeStyleT.演奏スコア?.Dispose();
34 this.現在のフェーズ = フェーズ.読込中;
36 protected override void On非活性化( デバイスリソース dr )
38 FDK.Log.Info( "曲読込ステージを終了します。" );
40 public override void 進行描画する( デバイスリソース dr )
42 switch( this.現在のフェーズ )
46 // SSTFファイルを読み込んでスコアを構築。
47 string 選択曲ファイルパス = this.読込曲のファイルパスを取得する();
49 if( 選択曲ファイルパス.Nullでも空でもない() )
51 var user = StrokeStyleT.ユーザ管理.現在選択されているユーザ;
53 StrokeStyleT.演奏スコア = new SSTFormat.スコア(
54 SST.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( 選択曲ファイルパス ),
59 // サウンドデバイス遅延を全チップの発声時刻へ反映する。
60 float 作成時遅延ms = StrokeStyleT.演奏スコア.Header.サウンドデバイス遅延ms;
63 float 再生時遅延ms = (float) ( StrokeStyleT.サウンドデバイス.遅延sec * 1000.0 );
64 long 加算分ms = (long) ( 作成時遅延ms - 再生時遅延ms ); // 例: 作成時遅延 7ms, 再生時遅延 10ms の場合、発声時刻に 7-10 = -3ms 加算する(3ms 早く発声させる)。
66 FDK.Log.Info( $"作成時遅延={作成時遅延ms}ms, 再生時遅延={再生時遅延ms}ms => 加算分 = {加算分ms}ms" );
68 foreach( var chip in StrokeStyleT.演奏スコア.チップリスト )
73 FDK.Log.WARNING( $"この曲ファイルには 作成時遅延(SoundDevice.Delay) の指定がありません。演奏時に音ズレを起こす可能性があります。" );
79 StrokeStyleT.演奏スコア = null;
83 this.現在のフェーズ = フェーズ.終了;