演奏時間が数%短い
シンプルMIDIライブラリの不具合。
デルタタイム(チックタイム)から実時間(ミリ秒)への変換処理において、 計算結果をunsigned longに格納しており、1ミリ秒未満の値が切り捨てられていた。 演奏経過時間はデルタタイムの累積値で管理しているため、 切り捨てられた誤差が重なり演奏時間が短くなった。
デルタタイム値が大きいイベントのみで構成された単純なMIDIデータであれば影響は小さいが、 デルタタイム値が小さいイベントが多数含まれる複雑なMIDIデータになると、 誤差の積み重ねにより影響が大きくなる。
デルタタイム(チックタイム)から実時間(ミリ秒)に変換する処理において、 変換後の値の型をunsigned longからdoubleに変更する。
次回イベント処理時刻(ミリ秒)を格納するメンバ m_NextEventTime の型を unsigned longからdoubleに変更する。 デルタタイムの実時間をこのメンバに加算していく。 なお、m_NextEventTimeはあくまで「指標とする経過時間」であって、実際の経過時間ではない。
APIから得られる時刻はミリ秒単位であるため、m_NextEventTime以外の値は これまで通りunsigned longで管理する。
曲の総演奏時間が他のMIDIプレーヤーより数%短い。 5分程度の曲で、総演奏時間が数秒~10秒短くなる。 カウンターに表示する総演奏時間も短くなっている。
例:「Secondary Mars」(MARS2.MID) をロードしたときのカウンター表示