Ticket #45971

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

Open Date: 2022-10-25 23:23 Last Update: 2022-10-27 00:17

Reporter:
Owner:
Status:
Closed
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None

Details

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

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

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

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

補足

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

Ticket History (3/4 Histories)

2022-10-25 23:23 Updated by: yknk
  • New Ticket "macOS版 一時停止時と停止時にノートオフを送信、再開時にノートオンを送信" created
2022-10-25 23:26 Updated by: yknk
Comment

対策方針

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

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

2022-10-25 23:26 Updated by: yknk
Comment

対策

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 Updated by: yknk
  • Status Update from Open to Closed
  • Resolution Update from None to Fixed

Attachment File List

No attachments

Edit

Please login to add comment to this ticket » Login