任务单 #22566

演奏時間が数%短い

开放日期: 2010-07-22 00:27 最后更新: 2010-07-25 12:23

报告人:
属主:
类型:
状态:
关闭
优先:
7
严重性:
7
处理结果:
Fixed
文件:

Details

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

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

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

任务单历史 (3/6 Histories)

2010-07-22 00:27 Updated by: yknk
  • New Ticket "演奏時間が数%短い" created
2010-07-22 00:28 Updated by: yknk
  • 优先 Update from 5 - Medium to 7
2010-07-22 23:21 Updated by: yknk
评论

原因

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

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

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

2010-07-22 23:33 Updated by: 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 Updated by: yknk
  • 处理结果 Update from to Fixed
2010-07-25 12:23 Updated by: yknk
  • 状态 Update from 开启 to 关闭
  • Ticket Close date is changed to 2010-07-25 12:23

Attachment File List

No attachments

编辑

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