OSDN Ticket Archive


Ticket #45931

Win版 MIDIファイルからテンポが正しく読み取れていない

登録: 2022-10-19 23:34 最終更新: 2022-10-20 22:08

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

詳細

DominoやSekaijuのMIDI編集ソフトとMIDITrailで、同じMIDIデータ(DAISEI92.MID)を再生して録音し、 サウンド編集ソフトで波形を並べて比較したところ、MIDITrailの演奏時間が0.05秒ほど短いことが分かった。

チケットの履歴

2022-10-19 23:34 更新者: yknk
  • 新しいチケット "Win版 MIDIファイルからテンポが正しく読み取れていない" が作成されました
2022-10-19 23:35 更新者: yknk
コメント

原因

メタイベントクラスのテンポ取得メソッド(SMEventMeta::GetTempo)の不具合。 初回リリース時からの潜在不具合である。

標準MIDIファイルから読み取ったテンポのデータは3byteで、四分音符の長さ(マイクロ秒)を示す。 当該メソッドでは、3byteのデータを数値に変換する際に、下位1byteを3byte目からではなく4byte目から読み取っていた。 4byte目はゼロクリアされているバッファ領域のため、テンポの下位1byteを常にゼロとして数値変換していた。

2022-10-19 23:37 更新者: yknk
コメント

影響

例えばBPM 94の場合、四分音符の長さは638297マイクロ秒であり、16進数に変換すると0x09BD59。 標準MIDIファイルに記録されているテンポのデータは 09 BD 59 の3byteとなる。 しかし当該不具合により、読み取ったテンポは0x09BD00となり、638208マイクロ秒と解釈することになった(偏差は-89マイクロ秒)。 この場合、四分音符の長さに0.014%の誤差が生じてしまう。

BPMの値が大きいほど(演奏速度が早いほど)、四分音符の長さの値は小さくなるため、 テンポの下位1byteがゼロになる影響はより大きくなる。 例えばBPM 204では下位1byte0xE5が0x00となり、誤差は0.078%になる。

macOS版、iOS版にも同じの不具合がある。

2022-10-19 23:37 更新者: yknk
コメント

対策

SMEventMeta::GetTempo

テンポの下位1byteを3byte目から取得するように修正する。

修正前
tempo = (pData[0] << 16) | (pData[1] << 8) | (pData[3]);
修正後
tempo = (pData[0] << 16) | (pData[1] << 8) | (pData[2]);

2022-10-20 22:08 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

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