OSDN Ticket Archive


Ticket #45971

macOS版 一時停止時と停止時にノートオフを送信、再開時にノートオンを送信

登録: 2022-10-25 23:23 最終更新: 2022-10-27 00:17

報告者:
yknk
担当者:
yknk
チケットの種類:
機能リクエスト
状況:
完了
コンポーネント:
MIDITrail Ver.2.x.x for macOS
マイルストーン:
Version 2.0.1 for macOS (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

演奏の一時停止または停止が指示されたとき、音を止めるため、次のメッセージをすべてのチャンネルに送信している。

  • オールノートオフ (CC# 123)
  • オールサウンドオフ (CC# 120)

しかし、これらのメッセージに対応していないMIDI音源がありうるため、一時停止または停止が指示されたとき、 ノートオンを送信した後でノートオフをまだ送信していな状態のノートは、個別にノートオフを送信する。

また演奏を再開するとき、ノートオフを送信したノートについて、再びノートオンを送信することで、 一時停止したときの状態をより正確に再現する。

補足

  • GMシステム・レベル1:オールノートオフは必要条件とされているが、オールサウンドオフは必要条件に含まれていない。
  • GMシステム・レベル2:オールノートオフとオールサウンドオフはどちらも必須とされている。

チケットの履歴

2022-10-25 23:23 更新者: yknk
  • 新しいチケット "macOS版 一時停止時と停止時にノートオフを送信、再開時にノートオンを送信" が作成されました
2022-10-25 23:26 更新者: yknk
コメント

対策方針

シーケンサクラスにて、ポート(0-5)とチャンネル(0-15)ごとに、すべてのノート(0-127)について、 オン/オフの状態(ベロシティ)を保持する。 演奏の一時停止または停止が指示されたときは、オン状態のすべてのノートについて、ノートオフを送信する。 演奏の再開が指示されたときは、ノートオフを送信したすべてのノートについて、ノートオンを送信する。 このとき、元々ノートオンしたときのベロシティを指定する。

スキップ処理においても、スキップ開始時にノートオフを送信、スキップ完了時にノートオンを送信する。

2022-10-25 23:26 更新者: yknk
コメント

対策

SMSequencer

  • メンバにノートベロシティ配列m_NoteVelocityを追加。

SMSequencer::SMSequencer

  • ノートベロシティ配列の初期化処理を追加。

SMSequencer::Play

  • 演奏再開時にノートONを送信する処理を追加。

SMSequencer::_SendMIDIEvent

  • MIDIイベント送信時に、ノートのON/OFFをノートベロシティ配列に反映する処理を追加。

SMSequencer::ProcUserRequest

  • 一時停止、停止、スキップを指示されたときに、ノートOFFを送信する処理を追加。

SMSequencer::_SendNoteOffForActiveNotes

  • アクティブノートにノートOFFを送信するメソッドを追加。

SMSequencer::_SendNoteOnForActiveNotes

  • アクティブノートにノートONを送信するメソッドを追加。

MSequencer::_InitializeParamsOnPlayStart

  • ノートベロシティ配列の初期化処理を追加。

SMSequencer::_ProcSkip

  • スキップ完了時にノートONを送信する処理を追加。
2022-10-27 00:17 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

添付ファイルはありません