任务单 #26988

スキップ制御対応

开放日期: 2011-12-21 23:31 最后更新: 2011-12-25 14:21

报告人:
属主:
状态:
关闭
优先:
5 - Medium
严重性:
5 - Medium
处理结果:
Fixed
文件:

Details

ユーザの操作によって、再生中にユーザの後方/前方へのスキップができるようにする。

任务单历史 (3/4 Histories)

2011-12-21 23:31 Updated by: yknk
  • New Ticket "スキップ制御対応" created
2011-12-22 00:11 Updated by: yknk
评论

対策方針

  1. playbackメニューに"Skip Back","Skip Forward"を追加。
  2. キーボードからの操作は"1"(back),"2"(forward)で実現する。
  3. スキップは再生中のみ実行する。
  4. スキップする時間間隔はBack,Fowardともに10秒とする。
  5. スキップする際に、ピアノロールが前後に流れるアニメーションを実現する。
  6. スキップ中はノートの再生は行わない。また、大量に送信される可能性がある一部のMIDIイベントについては、最後の値のみを送信するようにフィルタする。
  7. スキップする時間間隔とピアノロールの移動アニメーションの時間間隔は、設定ファイルで変更可能とする。(Player.ini)
2011-12-24 23:08 Updated by: yknk
评论

修正内容

MainMenu.xib

Playbackメニューに項目を追加。-> Skip Back, Skip Forward

MTMenuCtrl

  • メニュー選択時のイベントハンドラを追加。
  • MIDITrailAppのスキップ制御メソッド(OnMenuSkipBack, OnMenuSkipForward)を呼び出す。

MIDITrailApp

  • 起動時の初期化処理に、プレーヤー設定ファイル Player.ini の読み込み処理 _LoadPlayerConf を追加。スキップ時間と移動時間を取得する。
  • メンバ変数に後方/前方のスキップ時間間隔を(m_SkipBackTimeSpanInMsec, m_SkipForwardTimeSpanInMsec)を追加。
  • スキップ実施イベント発生時に、シーケンサのスキップ実行メソッド(Skip)を呼び出す。このときスキップ時間を指定する。

MTMainView

  • キー押下イベント発生時に、1,2キー(またはテンキーの1,2)が押されたときの処理を追加。
  • メニュー制御のメニュー実行メソッド(performActionSkipBack, performActionSkipForward)を呼び出す。

MSSequencer

  • スキップメソッド Skip では、リクエストの登録のみを行う。シーケンサスレッド側でリクエストを参照し、スキップ処理 _ProcSkip を実行する。
  • スキップ開始時にメッセージキューへスキップ開始通知、スキップ完了時にスキップ終了通知を送る。
  • 前方スキップの場合、再生時刻から目標時刻まで、ノートON/OFF以外のMIDIイベントをMIDI出力デバイスに一括送信する。
  • 後方スキップの場合、曲先頭に戻ってから目標時刻まで、ノートON/OFF以外のMIDIイベントをMIDI出力でバイスに一括送信する。
  • 一括送信するとき、特定のMIDIイベントに限り、フィルタリングを行い、最終的な値だけを送信するように制御する。(*1)
  • 一括送信中は、メッセージキューへのメッセージ登録を抑止する。
  • 一括送信終了後、ピアノロールの移動アニメーションを実現するため、スキップ開始時刻からスキップ先時刻までの時刻通知を、段階的にメッセージキューに登録する。
  • スキップ終了時に、再生時刻・テンポ・小節番号などのカウンタ情報をまとめてメッセージキューに登録する。

MTScenePianoRoll3D, MTScenePianoRollRain

  • スキップ開始通知を受けたとき、シーンオブジェクトをリセットして、アクティブノート・波紋・キーボードの状態をクリアする。
  • スキップ開始通知をうけたとき、シーンオブジェクトにスキップ状態ONを登録する。(*2)
  • スキップ終了通知を受けたとき、シーンオブジェクトにスキップ状態OFFを登録する。

(*1)スキップ中のMIDIイベントフィルタ処理について

ピッチベンドやCC#11エクスプレッションなどは、再生中に連続変化させることが多く、大量に送信されるMIDIイベントである。 前方スキップの場合、曲先頭から目標時刻までMIDIデータを一括送信すると、ピッチベンドやエクスプレッションのMIDIイベントを 大量に送信することになり、スキップ中の処理待ち時間が長くなってしまう。

そこで一括送信処理中は、次のMIDIイベントについてチャンネルごとにフィルタリングを行い、 一括送信処理終了後に最後のMIDIイベントのみを送信するように制御する。 例えば、チャンネル1でエクスプレッションが10,11,12,...,99,100と連続送信される場合は、最後の100だけ送信する。

  1. ピッチベンド
  2. CC#1 モジュレーション
  3. CC#7 ボリューム
  4. CC#10 パンポット
  5. CC#11 エクスプレッション

(*2)スキップ状態ON/OFFの登録について

ピアノロール移動アニメーション実現のため、スキップ終了時刻まで時刻通知を連続受信することになる。 この間にノートON/OFFの判定と描画を行わないようにするため、シーンオブジェクトにスキップ状態ON/OFFを登録する。

2011-12-25 14:21 Updated by: yknk
  • 处理结果 Update from to Fixed
  • 状态 Update from 开启 to 关闭
  • Ticket Close date is changed to 2011-12-25 14:21

Attachment File List

No attachments

编辑

Please login to add comment to this ticket » 登录名