using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
+using SSTFormat.v2;
using FDK;
using FDK.メディア;
-using SSTFormat.v1;
+using SST.曲;
namespace SST.ステージ.曲読込
{
- /// <remarks>
- /// 入力:
- /// Func<string> 読込曲のファイルパスを取得する(null 可)
- /// StrokeStyleT.ユーザ管理.現在選択されているユーザ(コンフィグ情報)
- ///
- /// 出力:
- /// StrokeStyleT.演奏スコア(ファイルパスが null だったならこちらも null になる)
- /// </remarks>
class 曲読込ステージ : ステージ
{
- public Func<string> 読込曲のファイルパスを取得する = null;
+ public enum フェーズ
+ {
+ 開始,
+ 完了,
+ }
- public enum フェーズ { 初期状態, 読込中, 終了 }
+ public フェーズ 現在のフェーズ
+ {
+ get;
+ protected set;
+ }
- public フェーズ 現在のフェーズ { get; protected set; } = フェーズ.初期状態;
- protected override void On活性化( デバイスリソース dr )
+ public 曲読込ステージ()
{
- Log.Info( "曲読込ステージを開始します。" + ( StrokeStyleT.ビュアーモードである ? "(ViewerMode)" : "" ) );
- Trace.Assert( null != this.読込曲のファイルパスを取得する, "[バグあり] 活性化の前に外部依存アクションを接続してください。" );
+ }
- // 未解放なら解放する。念のため。
- StrokeStyleT.演奏スコア?.Dispose();
+ protected override void On活性化( グラフィックデバイス gd )
+ {
+ using( Log.Block( FDKUtilities.現在のメソッド名 ) )
+ {
+ if( App.ビュアーモードではない )
+ Trace.Assert( App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード is MusicNode );
- this.現在のフェーズ = フェーズ.読込中;
+ this.現在のフェーズ = フェーズ.開始;
+ }
}
- protected override void Oné\9d\9eæ´»æ\80§å\8c\96( ã\83\87ã\83\90ã\82¤ã\82¹ã\83ªã\82½ã\83¼ã\82¹ dr )
+ protected override void Oné\9d\9eæ´»æ\80§å\8c\96( ã\82°ã\83©ã\83\95ã\82£ã\83\83ã\82¯ã\83\87ã\83\90ã\82¤ã\82¹ gd )
{
- Log.Info( "曲読込ステージを終了します。" );
+ using( Log.Block( FDKUtilities.現在のメソッド名 ) )
+ {
+ }
}
- public override void é\80²è¡\8cæ\8f\8fç\94»ã\81\99ã\82\8b( ã\83\87ã\83\90ã\82¤ã\82¹ã\83ªã\82½ã\83¼ã\82¹ dr )
+ public override void é\80²è¡\8cæ\8f\8fç\94»ã\81\99ã\82\8b( ã\82°ã\83©ã\83\95ã\82£ã\83\83ã\82¯ã\83\87ã\83\90ã\82¤ã\82¹ gd )
{
+ Debug.Assert( this.活性化している );
+
switch( this.現在のフェーズ )
{
- case フェーズ.読込中:
+ case フェーズ.開始:
+ #region " *** "
+ //----------------
{
- // SSTFファイルを読み込んでスコアを構築。
- string 選択曲ファイルパス = this.読込曲のファイルパスを取得する();
+ var node = ( App.ビュアーモードではない ) ?
+ (MusicNode) App.ユーザ管理.選択されているユーザ.曲ツリー.フォーカスノード : // (A) 通常モード
+ App.ビュアー用ノード; // (B) ビュアーモード時
- if( 選択曲ファイルパス.Nullでも空でもない() )
- {
- var user = StrokeStyleT.ユーザ管理.現在選択されているユーザ;
+ string 選択曲ファイルパス = node.曲ファイルパス;
+ Trace.Assert( 選択曲ファイルパス.Nullでも空でもない() );
- StrokeStyleT.演奏スコア = new スコア(
- SST.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( 選択曲ファイルパス ),
- user.Rideは左,
- user.Chinaは左,
- user.Splashは左 );
+ // スコアを読み込む。
+ using( Log.Block( "曲の読み込み" ) )
+ {
+ App.演奏スコア = new スコア( SST.IO.Folder.絶対パスに含まれるフォルダ変数を展開して返す( 選択曲ファイルパス ) );
- // サウンドデバイス遅延を全チップの発声時刻へ反映する。
- float 作成時遅延ms = StrokeStyleT.演奏スコア.Header.サウンドデバイス遅延ms;
- if( 0f < 作成時遅延ms )
+ // ã\82µã\82¦ã\83³ã\83\89ã\83\87ã\83\90ã\82¤ã\82¹é\81\85延ã\82\92å\8f\96å¾\97ã\81\97ã\80\81å\85¨ã\83\81ã\83\83ã\83\97ã\81®ç\99ºå£°æ\99\82å\88»ã\81¸å\8f\8dæ\98 ã\81\99ã\82\8bã\80\82
+ float 作成時遅延ms = App.演奏スコア.Header.サウンドデバイス遅延ms;
+ if( 0 < 作成時遅延ms )
{
- float 再生時遅延ms = (float) ( StrokeStyleT.サウンドデバイス.遅延sec * 1000.0 );
+ 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 StrokeStyleT.演奏スコア.チップリスト )
+ foreach( var chip in App.演奏スコア.チップリスト )
chip.発声時刻ms += 加算分ms;
}
- else
- {
- Log.WARNING( $"この曲ファイルには 作成時遅延(SoundDevice.Delay) の指定がありません。演奏時に音ズレを起こす可能性があります。" );
- }
- }
- else
- {
- // ビュアーモードの起動直後ならこちら。
- StrokeStyleT.演奏スコア = null;
- }
- // フェーズ終了。
- this.現在のフェーズ = フェーズ.終了;
+ this.現在のフェーズ = フェーズ.完了;
+ }
}
+ //----------------
+ #endregion
+ break;
+
+ case フェーズ.完了:
break;
}
}