Я хочу знать, как конвертировать MIDI-тики в реальные секунды воспроизведения.
Например, если MIDI PPQ (количество импульсов на четвертную ноту) - 1120, как мне преобразовать его в реальные секунды воспроизведения?
Я хочу знать, как конвертировать MIDI-тики в реальные секунды воспроизведения.
Например, если MIDI PPQ (количество импульсов на четвертную ноту) - 1120, как мне преобразовать его в реальные секунды воспроизведения?
Формула 60000 / (BPM * PPQ)
(миллисекунды).
Где BPM - это темп трека (Beats Per Minute).
(т.е. трек 120 BPM будет иметь время MIDI (60000 / (120 * 192))
или 2.604 мс за 1 тик.
Если вы не знаете BPM, вам придется сначала определить это. Время 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 представляет его в мкс на квартал (период).
60 уд/мин - 1 минута 1000 миллисекунд - 1 с 60 секунд - 1 минута или 60 000 миллисекунд
поэтому для преобразования миллисекунд в bpm для события tick: bpm (в миллисекундах) равно 60000, деленное на (BpmValue)
установить событие tick для */8 мер (как в 7/8): bpm (в миллисекундах) равна 60000, деленная на (BpmValue), деленная на 2
Сейчас я работаю над С# Metronome. Если вы программируете, наведите его на целое число, чтобы округлить его. долей миллисекунды не должно быть проблемой. хотя, если точность заключается в вашей сделке, убедитесь, что вы задали результат для чтения в плавающей точке.
вопрос: позволяет ли объект таймера С# использовать значение с плавающей запятой, назначенное миллисекундам?
любые комментарии или предложения, связанные с реализацией С#, очень ценятся. если моя математика неисправна, пожалуйста, дайте мне знать. спасибо!