Преобразование значения Pitch Bend (MIDI) в «нормальное» значение высоты тона

11

Я пытаюсь выполнить анализ и синтез LPC в автономном режиме с использованием реализации rt_lpc (LPC в реальном времени), как указано здесь . В программе есть некоторые функции, которые можно использовать для автономной программы анализа и синтеза LPC. Код rt_lpc в основном предназначен для композиторов и т. Д., Что означает, что он использует MIDI или глоттальный импульсный вход. В программе есть некоторый код, который преобразует значение основного тона (полученное из автокорреляции) в bendзначение. Отношение дается следующим образом:

    pitch = (int)( Stk::sampleRate() / midi2pitch[ananya.data[1]] ) /
                            pow( 1.0653f, bend/64.0f*11.0f );
                    power *= ananya.data[2] / 64.0f;
bend = ge.data[1] / 128.0f + ge.data[2] - 64;

Некоторые моменты:
а. ananyaэто объект типа, MidiMsgкоторый, кажется, заполняется на лету.
б. geтакже является объектом типа, MidiMsgкоторый также, кажется, заполняется на лету.
с. Эти два объекта создаются, когда программа запускается в режиме реального времени (моя автономная версия, которая запускает отдельные ее части в моем собственном main.cpp).

Мой вопрос (ы):
1. Что такое Pitch Bend?
2. Как мне преобразовать значение шага в значение изгиба? Каковы картографические отношения?

Я гуглил решения, но не нашел четкого ответа.

Sriram
источник

Ответы:

12

В основе MIDI лежит представление музыки в виде отдельных нотных событий, каждое из которых имеет статическую высоту звука. Это идеально подходит для представления музыки, исполняемой на клавишных инструментах. Вы можете преобразовать любую частоту, соответствующую ноте на темперированной шкале, в номер ноты MIDI, используя:

69+12×log2frequency440

Предполагается, что MIDI-приемник откалиброван на А4 = 440 Гц.

Это представление хорошо для фортепианной музыки, но проблема заключается в том, как представлять высоты звука, которые не отображаются в темперированном масштабе (не западная музыка, не музыкальные звуки), и как представлять изменения высоты звука в течение длительности ноты (глиссандо, вибрато).

Это делается в MIDI с помощью «сообщений изменения высоты звука», которые инструктируют синтезатор смещать высоту звучания текущей воспроизводимой ноты на небольшой интервал. Большинство синтезаторов калибруются по умолчанию для +/- 2 полутонов по всему диапазону сообщений об изменении высоты звука (0 .. 16383). 8192 соответствует отсутствию изгиба основного тона - излучаемый шаг в точности соответствует значению ноты. Отображение между значением основного тона и коэффициентом сдвига частоты определяется как:

femitted_notefnote_message=2pitchbend81924096×12

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

440×2note6912.0+pitchbend81924096×12

Где note - это 7-битный номер ноты MIDI последнего полученного сообщения Note On ; и pitchbend является 14- битным значением последнего принятого сообщения Pitch Bend . Синтезатор запускается с регистром изменения высоты тона, установленным на 8192, и это значение также сбрасывается во время приема сообщения «Сброс всех контроллеров».

Давайте возьмем следующий пример. Вы хотите выразить трель флейты со следующей траекторией частоты: 500 Гц, 510 Гц, 500 Гц, как сообщения MIDI.

Номер основной ноты:

round(69+12×log2(500/440))=71

Таким образом, вы отправляете сообщение «note on» с примечанием #, равным 71. Это эквивалентно шагу:

440×2(7169)/12=493.88

Который является ближайшим шагом по умеренной шкале. Вам необходимо отправить сообщение об изменении высоты тона, чтобы увеличить высоту тона в:

500493.88=1.0124

И получи свои 500 Гц. Соответствующее значение высоты тона:

round(8192+4096×12×log21.0124)=9065

Чтобы получить 510 Гц, значение высоты тона будет:

round(8192+4096×12×log2510493.88)=10469

Таким образом, ваша последовательность MIDI-сообщений для 500, 510, 500 Гц будет:

  • ПРИМЕЧАНИЕ 71
  • PITCH BEND 9065
  • ...
  • PITCH BEND 10469
  • ...
  • PITCH BEND 9065

Вы можете думать о номере ноты MIDI как о «неотъемлемой» части высоты тона; и изгиб основного тона в качестве избыточной «дробной» части основного тона.

pichenettes
источник
Кроме того, насколько я понимаю код, ge - это сообщение об изменении высоты тона; ge.data [2] его MSB и ge.data [1] его LSB. ананья - это примечание к сообщению, ананья.дата [1] - это номер заметки, а ананья.дата [2] - скорость. Помимо необычного именования переменных, которое, кажется, подразумевает скрытый роман между авторами кода, я вижу здесь потенциальный WTF: в константах 1.0653f и 11.0f есть что-то подозрительное. Доступный для чтения выбор: 1.05946f и 12.0f. Или 1.06504f и 11.0f. Авторы, похоже, предполагают диапазон изменения высоты тона +/- 1 октаву, что является еще одним потенциальным WTF.
pichenettes
ROTFL в части «скрытого романа»! Я не думаю, что я правильно понял это, так что терпите меня. Значение высоты тона получается из функции autocorrelate, которая мне кажется, что это MIDI Note, который выводится. Заметьте midi2pitchмассив в формуле? Если я прав, это означает, что у меня все еще нет bendзначения или фактического значения высоты тона, чтобы оценить значение изгиба, и нет никакого способа получить их, если у меня нет файла MIDI. Простой случай, когда слишком много переменных и слишком мало уравнений. Как мне оценить изгиб, фактическое значение шага и velocityв этом случае?
Шрирам
Что ты пытаешься сделать? Преобразовать пару высоты / мощности в MIDI-сообщения? Или конвертировать MIDI-данные в реальную высоту звука? Приведенный выше код преобразует пару входящих сообщений MIDI note + pitch bend (ananya msg, ge msg) в период (переменная высоты тона) и мощность (переменная мощности). Я думаю, что это используется для замены возбуждения LPC синтетическим, управляемым MIDI-клавиатурой - своего рода грубый вокодер или эффект автонастройки.
pichenettes
быстрый взгляд на rt_lpc.cpp подтверждает, что входящие MIDI-сообщения типа 0xe0 (PITCH BEND) обновляют значение Pitch Bend; и что входящие MIDI-сообщения типа 0x90 (NOTE ON) копируются в сообщение «ananya». Оттуда ресинтез с использованием модифицированного шага выполняется с использованием этих значений. Не уверен, что ты хочешь делать оттуда.
pichenettes
1
Да, MIDI-вход - это совершенно другая вещь для творческого преобразования сигнала. Он не является частью нормальной цепочки анализа / синтеза LPC; но вместо этого позволяет некоторым параметрам (высота и мощность) считываться с клавиатуры, а не генерироваться модулем анализа. Возможно, вы могли бы опубликовать новый вопрос с некоторыми примерами аудиофайлов и извлеченной траекторией основного тона в Гц, чтобы мы могли ориентировать вас на более надежные методы оценки основного тона. В библиотеке Aubio есть несколько вариантов трекеров высоты тона.
pichenettes
6

MIDI - это протокол, который позволяет (в первую очередь) синтезаторам управлять или управляться другими синтезаторами или компьютерами.

Это последовательный протокол, который позволяет обмениваться сообщениями, такими как «клавиша C1 вверх», клавиша D4 вниз »,« клавиша скорости »,« изменение звука »и т. Д. Многие контроллеры имеют« колесо тангажа », которое является джойстиком или колесом модуляции am. игрок может в интерактивном режиме изменять высоту текущей воспроизводимой ноты, чтобы вручную создавать вибрато или непрерывно «скользить» от одной ноты к другой. Как это часто делают гитаристы, сгибая струнную струну левой рукой, ее часто называют изменение высоты тона и, следовательно, название.

MIDI-сообщение об изменении высоты звука - это способ сообщить, какое смещение высоты звука должно произойти в любой данный момент времени. Предполагается, что синтезатор (программный или аппаратный), получающий сообщение об изменении высоты звука, изменяет высоту всех текущих нот, проигрываемых на заданную величину.

У сообщения контроллера есть аргумент, который идет от -8192 до 8191, и в стандартных файлах MIDI это должно охватывать диапазон от -200 центов до 200 центов, где 1 цент равен 1/100 полутона, то есть отношение 2 ^ ( 1/1200) = 1.000577789506555. Пример: чтобы создать сдвиг высоты тона вниз, чтобы получить 93% от номинальной частоты, значение контроллера будет

c = round(log2(.93)*12*8192/2);

или -5146 в этом случае. 0,93 - требуемое соотношение, 12 - число полутонов на октаву, 2 - максимальный диапазон изменения высоты звука (в данном случае 200 центов или 2 полутона), а log2 () - логарифм с базисом 2.

Однако в большинстве синтезаторов диапазон настраивается, и, вероятно, не стоит полагать, что все синтезаторы ведут себя одинаково.

Вот диаграмма конверсии, которая может помочь. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

Hilmar
источник