OSDN Ticket Archive


Ticket #22566

演奏時間が数%短い

登録: 2010-07-22 00:27 最終更新: 2010-07-25 12:23

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

詳細

曲の総演奏時間が他のMIDIプレーヤーより数%短い。 5分程度の曲で、総演奏時間が数秒~10秒短くなる。 カウンターに表示する総演奏時間も短くなっている。

例:「Secondary Mars」(MARS2.MID) をロードしたときのカウンター表示

  • TMIDI 6分34秒
  • MIDITrail 6分28秒

チケットの履歴

2010-07-22 00:27 更新者: yknk
  • 新しいチケット "演奏時間が数%短い" が作成されました
2010-07-22 00:28 更新者: yknk
  • 優先度5 - 中 から 7 に更新されました
2010-07-22 23:21 更新者: yknk
コメント

原因

シンプルMIDIライブラリの不具合。

デルタタイム(チックタイム)から実時間(ミリ秒)への変換処理において、 計算結果をunsigned longに格納しており、1ミリ秒未満の値が切り捨てられていた。 演奏経過時間はデルタタイムの累積値で管理しているため、 切り捨てられた誤差が重なり演奏時間が短くなった。

デルタタイム値が大きいイベントのみで構成された単純なMIDIデータであれば影響は小さいが、 デルタタイム値が小さいイベントが多数含まれる複雑なMIDIデータになると、 誤差の積み重ねにより影響が大きくなる。

2010-07-22 23:33 更新者: yknk
コメント

対策

SMSeqData::_GetDeltaTimeMsec

SMSequencer::_ConvTick2TimeMsec

デルタタイム(チックタイム)から実時間(ミリ秒)に変換する処理において、 変換後の値の型をunsigned longからdoubleに変更する。

SMSequencer::_OnTimer

次回イベント処理時刻(ミリ秒)を格納するメンバ m_NextEventTime の型を unsigned longからdoubleに変更する。 デルタタイムの実時間をこのメンバに加算していく。 なお、m_NextEventTimeはあくまで「指標とする経過時間」であって、実際の経過時間ではない。

APIから得られる時刻はミリ秒単位であるため、m_NextEventTime以外の値は これまで通りunsigned longで管理する。

2010-07-23 00:40 更新者: yknk
  • 解決法なし から 修正済み に更新されました
2010-07-25 12:23 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • チケット完了時刻2010-07-25 12:23 に更新されました

添付ファイルリスト

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