Konwersja wartości pitch bend (MIDI) na „normalną” wartość pitch

11

Próbuję analizy i syntezy offline LPC przy użyciu implementacji rt_lpc (LPC w czasie rzeczywistym) podanej tutaj . W programie znajduje się kilka funkcji, których można użyć do offline programu do analizy i syntezy LPC. Kod rt_lpc jest przeznaczony głównie dla kompozytorów itp., Co oznacza, że ​​używa wejścia MIDI lub głośnego impulsu. W programie jest pewien kod, który konwertuje wartość skoku (uzyskaną z autokorelacji) na bendwartość. Relacja jest podana w następujący sposób:

    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;

Niektóre punkty:
a. ananyato obiekt typu, MidiMsgktóry wydaje się zapełniany w locie.
b. gejest także obiektem typu, MidiMsgktóry wydaje się być wypełniany w locie.
do. Te dwa obiekty są tworzone, gdy program jest uruchamiany w czasie rzeczywistym (mój jest wersją offline, która uruchamia jego wybrane części w main.cpp mojej własnej.

Moje pytanie:
1. Co to jest pitch bend?
2. Jak przekonwertować wartość skoku na wartość zgięcia? Jakie są relacje mapowania?

Poszukałem rozwiązań, ale nie znalazłem jasnej odpowiedzi.

Sriram
źródło

Odpowiedzi:

12

Podstawą MIDI jest reprezentacja muzyki jako dyskretnych zdarzeń nutowych, z których każda ma statyczny ton. Jest to idealne rozwiązanie do przedstawiania muzyki odtwarzanej na instrumentach klawiszowych. Możesz przekonwertować dowolną częstotliwość odpowiadającą nucie w temperowanej skali na numer nuty MIDI, używając:

69+12×log2frequency440

Przy założeniu, że odbiornik MIDI jest skalibrowany dla A4 = 440 Hz.

Ta reprezentacja jest odpowiednia w przypadku muzyki fortepianowej, ale problem polega na tym, jak reprezentować wysokości, które nie są odwzorowane na temperowaną skalę (muzyka niezachodnia, dźwięki niemuzyczne) oraz jak reprezentować zmiany wysokości w trakcie trwania nuty (glissando, vibrato).

Odbywa się to w MIDI za pomocą „komunikatów pitch bend”, które instruują syntezator, aby przesunąć wysokość aktualnie odtwarzanej nuty o mały odstęp. Większość syntezatorów jest domyślnie skalibrowana dla +/- 2 półtonów w całym zakresie komunikatów wysokości tonu (0 .. 16383). 8192 odpowiada brakowi gięcia wysokości - emitowana wysokość jest dokładnie równa wartości nuty. Odwzorowanie między wartością zgięcia wysokości a współczynnikiem przesunięcia częstotliwości jest określone przez:

femitted_notefnote_message=2pitchbend81924096×12

W ten sposób można uzyskać częstotliwość nuty granej przez syntezator z następującego wzoru:

440×2note6912.0+pitchbend81924096×12

Gdzie nuta jest 7-bitowym numerem nuty MIDI ostatnio odebranej wiadomości Note On ; a pitchbend to 14-bitowa wartość ostatnio odebranej wiadomości Pitch Bend . Syntezator uruchamia się z rejestrem pitch bend ustawionym na 8192, a ta wartość jest również resetowana podczas odbierania komunikatu „Resetuj wszystkie sterowniki”.

Weźmy następujący przykład. Chcesz wyrazić tryl fletu z następującą trajektorią częstotliwości: 500 Hz, 510 Hz, 500 Hz, jako komunikaty MIDI.

Numer nuty bazowej to:

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

Tak więc wysyłasz wiadomość „uwaga na” z uwagą # równą 71. Odpowiada to wysokości:

440×2(7169)/12=493.88

Który jest najbliższym skokiem na temperowanej skali. Musisz wysłać komunikat pochylenia wysokości, aby podnieść wysokość dźwięku o współczynnik:

500493.88=1.0124

I weź 500 Hz. Odpowiednia wartość pochyłości skoku wynosi:

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

Aby uzyskać 510 Hz, wartość pitch bend wynosiłaby:

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

Zatem twoja sekwencja komunikatów MIDI dla 500, 510, 500 Hz wyglądałaby następująco:

  • UWAGA 71
  • PITCH BEND 9065
  • ...
  • PITCH BEND 10469
  • ...
  • PITCH BEND 9065

Możesz myśleć o numerze nuty MIDI jako „integralnej” części wysokości; a pitch bend jako redundantna „ułamkowa” część pitch.

fenenety
źródło
Ponadto, z mojego zrozumienia kodu, ge jest komunikatem pitch bend; ge.data [2] jego MSB i ge.data [1] jego LSB. ananya to notatka w wiadomości, ananya.data [1] to numer nuty, a ananya.data [2] prędkość. Oprócz funky nazewnictwa zmiennych, które wydają się sugerować ukryty romans między autorami kodu, widzę tutaj potencjalną WTF: w stałych 1.0653f i 11.0f jest coś podejrzanego. Czytelny wybór to: 1.05946f i 12.0f. Lub 1.06504f i 11.0f. Wydaje się, że autorzy zakładają zakres załamania skoku wynoszący +/- 1 oktawę, co jest kolejnym potencjalnym WTF.
fenenety
ROTFL w części „ukrytego romansu”! Nie sądzę, że dobrze to zrozumiałem, więc nie przejmuj się. Wartość tonu jest uzyskiwana z funkcji autocorrelate, która wydaje mi się, że jest to wyjściowa nuta MIDI. Czy zauważysz midi2pitchtablicę we wzorze? Jeśli mam rację, oznacza to, że nadal nie mam bendwartości ani rzeczywistej wartości wysokości dźwięku do oszacowania wartości zgięcia i nie mam możliwości ich uzyskania, chyba że mam plik MIDI. Prosty przypadek zbyt wielu zmiennych i zbyt małej liczby równań. Jak oszacować zgięcie, rzeczywistą wartość skoku i velocityw tym przypadku?
Sriram,
Co próbujesz zrobić? Czy konwertować parę dźwięk / moc na komunikaty MIDI? Lub przekonwertować dane MIDI na rzeczywistą wysokość? Podany powyżej kod konwertuje parę przychodzących komunikatów MIDI + pitch bend (ananya msg, ge msg) na kropkę (zmienna wysokość) i moc (zmienna moc). Myślę, że jest to używane do zastąpienia wzbudzenia LPC syntetycznym sterowanym przez klawiaturę MIDI - rodzaj prymitywnego wokodera lub efektu autostrojenia.
pikenety
szybkie spojrzenie na rt_lpc.cpp potwierdza, że ​​przychodzące komunikaty MIDI typu 0xe0 (PITCH BEND) aktualizują wartość pitch bend; i że przychodzące komunikaty MIDI typu 0x90 (UWAGA WŁ.) są kopiowane do komunikatu „ananya”. Stąd resynteza przy użyciu zmodyfikowanego skoku jest wykonywana przy użyciu tych wartości. Nie wiesz, co chcesz z tego zrobić.
pikenety
1
Tak, wejście MIDI jest tutaj zupełnie inną rzeczą do kreatywnej transformacji sygnału. Nie jest częścią normalnego łańcucha analizy / syntezy LPC; ale zamiast tego pozwala na odczyt niektórych parametrów (wysokość i moc) z klawiatury zamiast generowania ich przez moduł analizy. Być może mógłbyś zamieścić nowe pytanie z kilkoma przykładami plików audio i wyodrębnić trajektorię wysokości dźwięku w Hz, abyśmy mogli zorientować cię do bardziej niezawodnych technik szacowania wysokości dźwięku. Biblioteka Aubio ma kilka wariantów trackerów pitch.
pikenety
6

MIDI to protokół, który pozwala (głównie) syntezatorom kontrolować lub być kontrolowany przez inne syntezatory lub komputery.

Jest to protokół szeregowy, który umożliwia wymianę komunikatów, takich jak „klawisz C1 w górę”, „klawisz D4 w dół”, „prędkość klawisza”, „zmiana dźwięku” itp. Wiele kontrolerów ma „koło podziałowe”, które jest joystickiem lub kółkiem modulacji. odtwarzacz do interaktywnej zmiany wysokości aktualnie odtwarzanej nuty w celu ręcznego tworzenia vibrato lub ciągłego „przesuwania się” od jednej nuty do drugiej. Ponieważ jest to często wykonywane przez gitarzystów poprzez zginanie struny lewą ręką, jest to często nazywane pitch bending i stąd nazwa.

Komunikat MIDI pitch bend to sposób na przekazanie informacji o tym, ile przesunięć tonów powinno nastąpić w danym momencie. Syntezator (oprogramowanie lub sprzęt) odbierający komunikat zmiany wysokości ma zmienić wysokość wszystkich bieżących nut odtwarzanych o podaną wartość.

Komunikat kontrolera zawiera argument z przedziału od -8192 do 8191, aw standardowych plikach MIDI ma on obejmować zakres od -200 centów do 200 centów, gdzie 1 cent to 1/100 półtonu, tj. Stosunek 2 ^ ( 1/1200) = 1.000577789506555. Przykład: aby utworzyć przesunięcie wysokości w dół, aby uzyskać 93% częstotliwości nominalnej, wartość kontrolera wynosiłaby

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

lub -5146 w tym przypadku. 0,93 to pożądany stosunek, 12 liczba półtonów na oktawę, 2 maksymalny zakres zgięcia skoku (w tym przypadku 200 centów lub 2 półtony), a log2 () logarytm z podstawą 2.

Jednak w większości syntezatorów zakres jest konfigurowalny i prawdopodobnie nie należy zakładać, że wszystkie syntezatory zachowują się tak samo.

Oto wykres konwersji, który może pomóc. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

Hilmar
źródło