Преобразование MIDI-тиков в реальные секунды воспроизведения

Я хочу знать, как конвертировать MIDI-тики в реальные секунды воспроизведения.

Например, если MIDI PPQ (количество импульсов на четвертную ноту) - 1120, как мне преобразовать его в реальные секунды воспроизведения?

Ответ 1

Формула 60000 / (BPM * PPQ) (миллисекунды).

Где BPM - это темп трека (Beats Per Minute).

(т.е. трек 120 BPM будет иметь время MIDI (60000 / (120 * 192)) или 2.604 мс за 1 тик.

Если вы не знаете BPM, вам придется сначала определить это. Время MIDI полностью зависит от темпа трека.

Ответ 2

Вам нужно две части информации:

  • PPQ (количество импульсов на четвертную ноту), который определяется в заголовке файла midi, один раз.
  • Темп (в микросекундах на четвертную ноту), который определяется мета-событиями "Установить темп" и может изменяться во время музыкального произведения.

Тики могут быть преобразованы в секунды воспроизведения следующим образом:

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

Обратите внимание, что в документе, указанном выше, PPQ также называется "делением" или "тиками на квартальную ноту".

Обратите внимание, что темп обычно представлен в BPM (частота), но необработанный MIDI представляет его в мкс на квартал (период).

Ответ 3

60 уд/мин - 1 минута 1000 миллисекунд - 1 с 60 секунд - 1 минута или 60 000 миллисекунд

поэтому для преобразования миллисекунд в bpm для события tick: bpm (в миллисекундах) равно 60000, деленное на (BpmValue)

установить событие tick для */8 мер (как в 7/8): bpm (в миллисекундах) равна 60000, деленная на (BpmValue), деленная на 2

Сейчас я работаю над С# Metronome. Если вы программируете, наведите его на целое число, чтобы округлить его. долей миллисекунды не должно быть проблемой. хотя, если точность заключается в вашей сделке, убедитесь, что вы задали результат для чтения в плавающей точке.

вопрос: позволяет ли объект таймера С# использовать значение с плавающей запятой, назначенное миллисекундам?

любые комментарии или предложения, связанные с реализацией С#, очень ценятся. если моя математика неисправна, пожалуйста, дайте мне знать. спасибо!