Перетворення значення згину висоти (MIDI) у "нормальне" значення висоти


11

Я намагаюсь аналізувати та синтезувати офлайновий LPC, використовуючи реалізацію rt_lpc (LPC в реальному часі), як вказано тут . У межах програми є деякі функції, які можна використовувати для програми аналізу та синтезу офлайн LPC. Код rt_lpc здебільшого призначений для композиторів тощо. Це означає, що він використовує MIDI або імпульсний вхід Glottal. У програмі є якийсь код, який перетворює значення тону (отриманого від автоматичної кореляції) у 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який також здається заселеним на льоту.
c. Ці два об'єкти створюються, коли програма запускається в режимі реального часу (моя - це офлайн-версія, яка запускає вибіркові її частини в main.cpp мого власного.

Мої запитання:
1. Що таке вигин?
2. Як перетворити значення тону у значення вигину? Які співвідношення відображення?

Я шукав рішення, але не знайшов чіткої відповіді.

Відповіді:


12

В основі MIDI лежить подання музики як дискретних подій нот, кожна з яких має статичний крок. Це ідеально підходить для представлення музики, що грається на клавіатурних інструментах. Ви можете перетворити будь-яку частоту, відповідну примітці за загартованою шкалою, в номер нотатки MIDI, використовуючи:

69+12×log2frequency440

За припущенням, що приймач MIDI відкалібрований для A4 = 440 Гц.

Це уявлення добре для фортепіанної музики, але проблема полягає в тому, як представити смоли, які не відображені в загартованому масштабі (не-західна музика, немузичні звуки), і як представити зміни тону протягом тривалості ноти (glissando, вібрато).

Це робиться в MIDI за допомогою "повідомлень про вигин висоти", які вказують синтезатору зміщувати крок поточно відтвореної ноти на невеликий інтервал. Більшість синтезаторів калібровані за замовчуванням для +/- 2 півтонів протягом діапазону повідомлень про вигин висоти (0 .. 16383). 8192 не відповідає згину кроку - випромінюваний крок відповідає рівню нотного значення. Відображення між значенням вигину висоти та коефіцієнтом зміщення частоти задається:

femitted_notefnote_message=2pitchbend81924096×12

Таким чином, ви можете отримати частоту ноти, яку відтворює синтезатор, з наступної формули:

440×2note6912.0+pitchbend81924096×12

Де note - 7-бітний номер ноти MIDI останнього отриманого повідомлення Note On ; і pitchbend - це 14- бітове значення останнього отриманого повідомлення про вигин Pitch . Синтезатор починається зі свого регістра вигину висоти, встановленого на 8192, і це значення також скидається під час прийому повідомлення "Скинути всі контролери".

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

Основний номер ноти:

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

Таким чином, ви надсилаєте повідомлення "на замітку" з приміткою №, що дорівнює 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
  • ПІТЧ БЕНД 9090
  • ...
  • ПІТЧ БЕНД 10454
  • ...
  • ПІТЧ БЕНД 9090

Ви можете вважати номер примітки MIDI як "невід'ємну" частину кроку; а крок вигинається як надмірна "дробова" частина поля.


Також, з мого розуміння коду, ge - повідомлення про вигин висоти; ge.data [2] його MSB і ge.data [1] його LSB. ananya - примітка до повідомлення, ananya.data [1] - номер ноти, а ananya.data [2] - швидкість. Окрім фанк-іменної змінної, яка, мабуть, передбачає прихований роман між авторами коду, я бачу тут потенційний WTF: у константах 1.0653f та 11.0f є щось рибне. Читальним вибором буде: 1.05946f та 12.0f. Або 1.06504f та 11.0f. Здається, автори припускають, що діапазон вигину висоти становить +/- 1 октава, що є ще одним потенційним WTF.
пікенети

ROTFL на частині "прихованої романтики"! Я не думаю, що я це правильно зрозумів, тому поводься зі мною. Значення тону виходить із функції autocorrelate, яка мені здається, що це MIDI Note, що виводиться. Помічаєте midi2pitchмасив у формулі? Якщо я маю рацію, це означає, що я все одно не маю bendзначення чи фактичного значення кроку, щоб оцінити значення згину, і жодного способу їх отримання, якщо я не маю файл MIDI. Простий випадок занадто багато змінних і занадто мало рівнянь. Як я можу оцінити вигин, фактичне значення висоти та значення velocityв цьому випадку?
Шрірам

Що ти намагаєшся зробити? Перетворити пару тону / потужності в повідомлення MIDI? Або конвертувати дані MIDI у фактичний крок? Код, наведений вище, перетворює пару вхідних MIDI note + повідомлень про вигин крок (ananya msg, ge msg) у період (змінна тональність) та потужність (змінна потужність). Я думаю, що це використовується для заміни збудження LPC на синтетичне, кероване клавіатурою MIDI - свого роду сирий вокодер або ефект автонастройки.
пікенети

швидкий погляд на rt_lpc.cpp підтверджує, що вхідні MIDI-повідомлення типу 0xe0 (PITCH BEND) оновлюють значення вигину; і що вхідні MIDI-повідомлення типу 0x90 (ПРИМІТКА ВКЛ.) копіюються у повідомлення "ananya". Звідти проводиться ресинтез з використанням модифікованого кроку, використовуючи ці значення. Не впевнений, що ти хочеш зробити звідти.
пікенети

1
Так, вхід MIDI - це зовсім інша річ для творчої трансформації сигналу. Це не є частиною звичайного ланцюга аналізу / синтезу LPC; але натомість дозволяє зчитувати деякі параметри (висоту та потужність) з клавіатури, а не створювати модуль аналізу. Можливо, ви можете поставити нове запитання з деякими прикладами аудіофайлів та вилученою траєкторією висоти в Гц, щоб ми могли орієнтувати вас на більш надійні методи оцінки тону. Бібліотека Aubio має кілька варіантів тональних трекерів.
пікенети

6

MIDI - це протокол, який дозволяє (головним чином) синтезаторам керувати або управляти іншими синтезаторами або комп'ютерами.

Це послідовний протокол, який дозволяє обмінюватися повідомленнями, такими як "клавіша C1 вгору", "клавіша D4 вниз", "швидкість клавіші," зміна звуку "і т. Д. Багато контролерів мають" крок колеса ", це джойстик або колесо модуляції. Вони дозволяють гравець для інтерактивної зміни тону поточної ноти, що відтворюється, вручну створювати вібрато або безперервно "ковзати" від однієї ноти до іншої. Оскільки це часто роблять гітаристи, згинаючи ліву руку розірваною струною, її часто називають вигин піку і звідси назва.

Повідомлення згину висоти 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.