web-dev-qa-db-ja.com

MIDIティックを実際の再生秒数に変換する

MIDIティックを実際の再生秒数に変換する方法を知りたいです。

たとえば、MIDI PPQ(クォーターノートあたりのパルス数)が1120の場合、実際の再生秒数に変換するにはどうすればよいですか?

17
Taha

式は60000 / (BPM * PPQ)(ミリ秒)です。

ここで、BPMはトラックのテンポ(Beats Per Minute)です。

(つまり、120BPMトラックのMIDI時間は(60000 / (120 * 192))または1ティックで2.604ミリ秒。

BPMがわからない場合は、最初にそれを決定する必要があります。 MIDI時間は、トラックのテンポに完全に依存します。

23
Aaronaught

2つの情報が必要です。

  • [〜#〜] ppq [〜#〜](1/4ノートあたりのパルス数)。これは、MIDIファイルのヘッダーで1回定義されます。
  • Tempo(四分音符あたりのマイクロ秒単位)、これは "Set Tempo"メタイベント によって定義され、ミュージカル中に変更される可能性がありますピース。

ティックは、次のように再生秒に変換できます。

ticks_per_quarter = <PPQ from the header>
µs_per_quarter = <Tempo in latest Set Tempo event>
µs_per_tick = µs_per_quarter / ticks_per_quarter
seconds_per_tick = µs_per_tick / 1.000.000
seconds = ticks * seconds_per_tick

上記のリンク先の document では、PPQは「除算」または「四分音符あたりのティック」とも呼ばれることに注意してください。

テンポは通常BPM(周波数)で表されますが、raw MIDIは四半期(期間)あたりのマイクロ秒で表されます。

9
Vituel

60bpmは1分1000ミリ秒は1秒60秒は1分または60,000ミリ秒

したがって、ティックイベントのミリ秒をbpmに変換するには、bpm(ミリ秒単位)は60000を(BpmValue)で割った値に等しくなります。

*/8メジャーのティックイベントを設定するには(7/8のように):bpm(ミリ秒単位)は、60000を(BpmValue)で割った値を2で割った値に等しくなります

現在、C#メトロノームに取り組んでいます。プログラミングしている場合は、整数にキャストして切り捨てます。ミリ秒の何分の1かは問題ではないはずです。ただし、精度が重要な場合は、結果を浮動小数点で読み取るように設定してください。

質問:c#タイマーオブジェクトはミリ秒に割り当てられた浮動小数点値を許可しますか?

c#の実装に関するコメントや提案は大歓迎です。私の数学に誤りがある場合は、私にも知らせてください。ありがとう!

0
Adam