JavaScript Sequencer MIDI-файл разрешения по времени (PPQN) - PullRequest
7 голосов
/ 10 февраля 2020

Я много читал о разрешении MIDI и изучал некоторые коды, такие как Tone. js и сердцебиение. Но я не понимаю, почему существуют разные значения Pulses Per Quarter Note (PPQN) и как это влияет на воспроизведение нот. Когда у меня 960 PPQN, это означает, что 1 квартальная нота имеет 960 тиков, 1 восемь ноты 480 тиков, и т. Д. И если я правильно понимаю, дельта-время - это просто относительное значение.

Что я не правильно понял, так это то, что должен делать PPQN, когда я играю ноты в JavScript, и когда я устанавливаю PPQN, почему это должно иметь это значение? Например, я использую API WebAudio для воспроизведения нот:

function nextNote() {
  var quarterBeat = 60.0/tempo;
  nextNoteDuration = nextNoteDuration + (quarterBeat/32);
  currentNote++;
}

Таким образом, я могу воспроизводить ноты различной длительности. Теперь, когда я читаю MIDI-файл, я должен просто сравнить дельта-время и преобразовать его в текущее воспроизведение моих секвенсоров? Например, когда я читаю MIDI-файл со следующими значениями:

Tempo = 120
PQN = 960
4 Quarter Notes

Я читаю MIDI-файл, сохраняю ноты в массиве (предположим, что время дельты для каждой ноты равно 1/4)

duration = [quarterNote, quarterNote, quarterNote, quarterNote]

И сыграйте ноты:

while (nextNoteDuration < audioContext.currentTime) {
  if (duration[i] %32 == 0) playNote(currentNote, nextNoteDuration);
  nextNote();
  i++;
}

Следует ли использовать PPQN только при экспорте файла MIDI? Если да, то в отношении чего я должен установить PPQN? Я надеюсь, что кто-то может объяснить мне это более подробно.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

PPQ о разрешении. Более конкретно о разрешении по времени.

Каким должен быть (быть?) PPQN, когда я играю ноты в JavScript, и когда я устанавливаю PPQN, почему он должен иметь это значение?

Когда ваша программа воспроизводит ноты, она может использовать любые временные единицы, которые вы хотите или нуждаетесь, например, миллисекунды, наносекунды, кадры mov ie, тики. Абсолютные настенные часы или относительное время. Это зависит от ваших возможностей секвенсора и возможностей вашего программного обеспечения. Только требуется для выбора значения PPQ при сохранении MIDI-последовательностей в виде MIDI-файлов. Конечно, вы должны иметь возможность преобразовывать единицы времени при чтении / хранении файлов MIDI.

Теперь, когда я читаю файл MIDI, я должен просто сравнить время дельты и преобразовать его в текущие воспроизведения моих секвенсоров ?

Конечно, если внутренне ваши события musi c используют другое представление времени, то вам необходимо иметь возможность преобразовать времена дельты из файла MIDI во внутреннее представление.

Вы спрашиваете только о PPQ, но это значение встречается только один раз в заголовке MIDI-файла. Напротив, события tempo могут происходить несколько раз по файлу, и это влияет на преобразование следующих времен дельты в настенные часы до следующего события темпа. Если ваш секвенсор / проигрыватель позволяет пользователю изменять / добавлять события темпа, было бы неплохо использовать относительные единицы вместо единиц настенных часов для внутреннего представления времени (или обоих).

Следует ли использовать PPQN только при экспорте файла MIDI? Если да, то относительно чего мне устанавливать PPQN?

Да, вам необходимо выбрать подходящее значение для PPQ при экспорте файла MIDI. Если ваши внутренние единицы времени являются относительными (как большинство секвенсоров), то используйте разрешение внутренних единиц для PPQ. Если вы конвертируете единицы из настенных часов в дельта-время, вам нужно выбрать разрешение, при котором ваш перевод теряет меньше деталей (путем квантования). Более высокие значения лучше в этом смысле. Rosegarden всегда сохраняет MIDI-файлы с 960 PPQ. Напротив, Cubase Штейнберга использовал 480. Я помню, как долгое время использовал Cakewalk go, имеющий только 120 PPQ, но в более поздних версиях это значение можно было изменить в качестве параметра конфигурации. В общем, вам нужно разместить не только все цифры музыки c короче четверти, включая такие подразделения, как триплеты и т. Д. c. но вам также необходимо учитывать такие эффекты, как swing , основанные на точной настройке времени.

0 голосов
/ 20 февраля 2020

В стандартном MIDI-файле в заголовке файла содержится информация о «тиках на квартальную ноту», или «частях на квартал» (или «PPQ»). Для целей этого обсуждения мы будем считать «удар» и «четвертная нота» синонимичными, поэтому вы можете думать о «такте» как о доле удара. PPQ указывается в последнем информационном слове (последние два байта) фрагмента заголовка, который появляется в начале файла. PPQ может быть низким числом, например 24 или 96, что часто является достаточным разрешением для простого musi c, или может быть большим числом, например 480 для более высокого разрешения, или даже чем-то вроде 500 или 1000, если кто-то предпочитает см. время в миллисекундах.

Что означает значение PPQ в терминах абсолютного времени, зависит от назначенного темпа. По умолчанию время подписи составляет 4/4, а темп составляет 120 ударов в минуту. Однако это можно изменить с помощью «мета-события», которое определяет другой темп. (Вы можете прочитать о сообщении мета-события Set Tempo в документе описания формата файла.) Темп выражается в виде 24-битного числа, которое обозначает микросекунды на четверть. Это немного похоже на то, как мы обычно express делаем темп, но у него есть некоторые преимущества. Так, например, темп 100 ударов в минуту будет 600000 микросекунд на четвертную ноту, поэтому мета-событие MIDI для выражения будет FF 51 03 09 27 C0 (последние три байта - это Hex для 600000). Мета-событию предшествует дельта-время, как и любое другое MIDI-сообщение в файле, поэтому изменение темпа может происходить в любом месте музыки c.

Дельта-время всегда выражается как переменная длина длины, формат которой поясняется в документе. Например, если PPQ равен 480 (стандарт в большинстве программ MIDI-секвенирования), время дельты четвертой ноты с точками (720 тиков) будет выражаться двумя байтами 85 50 (шестнадцатеричное).

Итак, Имея это в виду, существует соответствие между дельта-временем, выраженным в терминах тиков и значений нот, как мы думаем о них в человеческих терминах. Отношение зависит от PPQ, указанного в блоке заголовка. Например, если PPQ равен 96 (шестнадцатеричный 60), то середина ноты C на канале 10 MIDI со скоростью 127, продолжающейся четвертная нота с точками (1,5 удара), будет выражаться как 00 99 3 C 7F / / дельта время 0 тиков, 153 60 127 90 99 3 C 00 // время дельты 144 тиков, 153 60 0

...