using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using SSTFormat.v2; using FDK; using FDK.メディア; using SST.曲; namespace SST.ステージ.曲読込 { class 曲読込ステージ : ステージ { public enum フェーズ { 開始, 完了, } public フェーズ 現在のフェーズ { get; protected set; } public 曲読込ステージ() { } protected override void On活性化( グラフィックデバイス gd ) { using( Log.Block( FDKUtilities.現在のメソッド名 ) ) { if( App.ビュアーモードではない ) Trace.Assert( App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード is MusicNode ); this.現在のフェーズ = フェーズ.開始; } } protected override void On非活性化( グラフィックデバイス gd ) { using( Log.Block( FDKUtilities.現在のメソッド名 ) ) { } } public override void 進行描画する( グラフィックデバイス gd ) { Debug.Assert( this.活性化している ); switch( this.現在のフェーズ ) { case フェーズ.開始: #region " *** " //---------------- { var node = ( App.ビュアーモードではない ) ? (MusicNode) App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード : // (A) 通常モード App.ビュアー用ノード; // (B) ビュアーモード時 string 選択曲ファイルパス = node.曲ファイルパス; Trace.Assert( 選択曲ファイルパス.Nullでも空でもない() ); // スコアを読み込む。 using( Log.Block( "曲の読み込み" ) ) { App.演奏スコア = new スコア( SST.IO.Folder.絶対パスに含まれるフォルダ変数を展開して返す( 選択曲ファイルパス ) ); // サウンドデバイス遅延を取得し、全チップの発声時刻へ反映する。 float 作成時遅延ms = App.演奏スコア.Header.サウンドデバイス遅延ms; if( 0 < 作成時遅延ms ) { float 再生時遅延ms = (float) ( App.サウンドデバイス.遅延sec * 1000.0 ); long 加算分ms = (long) ( 作成時遅延ms - 再生時遅延ms ); // 例: 作成時遅延 7ms, 再生時遅延 10ms の場合、発声時刻に 7-10 = -3ms 加算する(3ms 早く発声させる)。 Log.Info( $"作成時遅延={作成時遅延ms}ms, 再生時遅延={再生時遅延ms}ms => 加算分 = {加算分ms}ms" ); foreach( var chip in App.演奏スコア.チップリスト ) chip.発声時刻ms += 加算分ms; } this.現在のフェーズ = フェーズ.完了; } } //---------------- #endregion break; case フェーズ.完了: break; } } } }