OSDN Git Service

演奏ステージに、演奏開始小節から描画開始チップと演奏開始時刻を取得するメソッドを追加。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Mon, 31 Oct 2016 02:41:20 +0000 (11:41 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Mon, 31 Oct 2016 02:51:58 +0000 (11:51 +0900)
StrokeStyleT/StrokeStyleT.cs
StrokeStyleT/ステージ/演奏/演奏ステージ.cs

index 5d3c051..6638931 100644 (file)
@@ -24,6 +24,11 @@ namespace SST
                public static SSTFormat.スコア 演奏スコア { get; set; } = null;
                public static SST.設定.Config Config => ( StrokeStyleT.bs_Config );
                public static bool ビュアーモードである { get; set; } = false;
+               public static bool ビュアーモードではない
+               {
+                       get { return !StrokeStyleT.ビュアーモードである; }
+                       set { StrokeStyleT.ビュアーモードである = !value; }
+               }
                public static ConcurrentQueue<SST.ステージ.演奏.ビュアーメッセージ> ビュアーメッセージキュー => ( StrokeStyleT.bs_ビュアーメッセージキュー );
 
                public static void すべての入力デバイスをポーリングする()
index fc68477..6335cb7 100644 (file)
@@ -221,6 +221,7 @@ namespace SST.ステージ.演奏
                                        Math.Max( StrokeStyleT.ユーザ管理.現在選択されているユーザ.譜面スクロール速度の倍率 - 0.5, 0.5 );    // 最小 0.5
                        }
                }
+
                public void BGMを解放する()
                {
                        if( null != this.BGM )  // 背景動画がなければ BGM も null である
@@ -229,6 +230,75 @@ namespace SST.ステージ.演奏
                                FDK.Utilities.解放する( ref this.BGM );
                        }
                }
+               public void 演奏開始小節から描画開始チップと演奏開始時刻を取得する( int 演奏開始小節番号, out int 描画開始チップ番号, out double 演奏開始時刻sec )
+               {
+                       const double 小節の先頭時刻から実際に演奏開始する時刻までの差sec = -0.5;        // ← 早めるので負数
+                       var score = StrokeStyleT.演奏スコア;
+
+                       描画開始チップ番号 = -1;
+                       演奏開始時刻sec = 0.0;
+
+                       #region " 条件チェック。"
+                       //----------------
+                       Trace.Assert( 0 <= 演奏開始小節番号, $"不正な演奏開始小節番号が指定されました。[{演奏開始小節番号}]" );
+
+                       if( this.活性化していない )
+                       {
+                               FDK.Log.ERROR( "活性化されていません。" );
+                               return;
+                       }
+                       if( StrokeStyleT.ビュアーモードではない )
+                       {
+                               if( null == score )
+                               {
+                                       FDK.Log.ERROR( "演奏スコアが null です。" );
+                                       return;
+                               }
+                               if( null == score.チップリスト )
+                               {
+                                       FDK.Log.ERROR( "演奏スコアのチップリストが null です。" );
+                                       return;
+                               }
+                       }
+                       //----------------
+                       #endregion
+
+                       #region " 描画開始チップ(仮決め)を検索する。"
+                       //----------------
+                       for( int i = 0; i < score.チップリスト.Count; i++ )
+                       {
+                               // チップ種別「小節の先頭」が必ずひっかかるはず。
+                               if( 演奏開始小節番号 <= score.チップリスト[ i ].小節番号 )
+                               {
+                                       描画開始チップ番号 = i;
+                                       break;  // 発見。
+                               }
+                       }
+
+                       if( 0 > 描画開始チップ番号 )
+                       {
+                               // 見つからなかった場合、演奏開始位置は曲の終了後を示しているものとみなす。
+                               描画開始チップ番号 = Math.Max( 0, score.チップリスト.Count - 1 );        // 一番最後(空なら先頭)のチップを選択する。
+                       }
+                       //----------------
+                       #endregion
+                       #region " 描画開始チップの発声時刻よりちょっと早めの時刻を演奏開始時刻とし、描画開始チップを再検索する必要があれば行う(本決め)。"
+                       //----------------
+                       演奏開始時刻sec = 
+                               score.チップリスト[ 描画開始チップ番号 ].発声時刻sec + 
+                               小節の先頭時刻から実際に演奏開始する時刻までの差sec;
+
+                       // 現在の描画開始チップから、前に戻る方向へ検索する。
+                       for( int i = ( 描画開始チップ番号 - 1 ); i >= 0; i-- )
+                       {
+                               if( score.チップリスト[ i ].発声時刻sec < 演奏開始時刻sec )
+                                       break;  // 再検索終了。
+
+                               描画開始チップ番号 = i;
+                       }
+                       //----------------
+                       #endregion
+               }
 
                protected bool 活性化した直後である = false;
                protected FDK.同期.RWLock<bool> 背景動画開始済み = new FDK.同期.RWLock<bool>( false );