Conversione di un valore di pitch bend (MIDI) in un valore di pitch "normale"


11

Sto provando un'analisi e una sintesi LPC offline usando l'implementazione rt_lpc (LPC in tempo reale) come indicato qui . Esistono alcune funzioni all'interno del programma che possono essere utilizzate per un programma di analisi e sintesi LPC offline. Il codice rt_lpc è principalmente pensato per compositori ecc., Il che significa che utilizza un input di impulsi MIDI o glottale. Esiste un codice nel programma che converte un valore di tonalità (ottenuto dall'auto-correlazione) nel bendvalore. La relazione è data come segue:

    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;

Alcuni punti:
a. ananyaè un oggetto di tipo MidiMsgche sembra essere popolato al volo.
b. geè anche un oggetto di tipo MidiMsgche sembra essere popolato al volo.
c. Questi due oggetti vengono creati quando il programma viene eseguito in tempo reale (il mio è una versione offline che esegue parti selettive di esso in un main.cpp del mio.

Le mie domande:
1. Che cos'è il pitch bend?
2. Come posso convertire un valore di tonalità in un valore di piega? Quali sono le relazioni di mappatura?

Ho cercato su Google soluzioni ma non ho trovato una risposta chiara.

Risposte:


12

Al centro del MIDI c'è una rappresentazione della musica come eventi di nota discreti, ciascuno con un tono statico. Questo è perfetto per rappresentare la musica suonata su strumenti a tastiera. Puoi convertire qualsiasi frequenza corrispondente a una nota sulla scala temperata in un numero di nota MIDI, usando:

69+12×log2frequency440

Partendo dal presupposto che il ricevitore MIDI è calibrato per A4 = 440 Hz.

Questa rappresentazione va bene per la musica per pianoforte, ma il problema è come rappresentare le tonalità che non sono mappate sulla scala temperata (musica non occidentale, suoni non musicali) e come rappresentare le variazioni di tonalità durante la durata di una nota (glissando, vibrato).

Questo viene fatto in MIDI usando "messaggi pitch bend" che istruiscono il sintetizzatore di spostare il pitch della nota attualmente suonata di un piccolo intervallo. La maggior parte dei sintetizzatori sono calibrati per impostazione predefinita per +/- 2 semitoni nel corso dell'intervallo del messaggio di pitch bend (0 .. 16383). 8192 corrisponde a nessuna flessione del tono - il tono emesso è esattamente quello del valore della nota. La mappatura tra il valore di pitch bend e il rapporto di spostamento di frequenza è data da:

femitted_notefnote_message=2pitchbend81924096×12

È quindi possibile ottenere la frequenza di una nota suonata da un sintetizzatore dalla seguente formula:

440×2note6912.0+pitchbend81924096×12

Dove note è il numero di nota MIDI a 7 bit dell'ultimo messaggio Note On ricevuto ; e pitchbend è il valore di 14 bit dell'ultimo messaggio Pitch bend ricevuto . Un sintetizzatore inizia con il suo registro di pitch bend impostato su 8192 e questo valore viene anche ripristinato durante la ricezione di un messaggio "Ripristina tutti i controller".

Facciamo l'esempio seguente. Volete esprimere un trillo di flauto con la seguente traiettoria di frequenza: 500 Hz, 510 Hz, 500 Hz, come messaggi MIDI.

Il numero della nota di base è:

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

Quindi invii un messaggio "note on" con nota # uguale a 71. Ciò equivale a un tono di:

440×2(7169)/12=493.88

Qual è il tono più vicino sulla scala temperata. È necessario inviare un messaggio di pitch bend per aumentare il pitch di un fattore di:

500493.88=1.0124

E ottieni i tuoi 500 Hz. Il valore di pitch bend corrispondente è:

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

Per ottenere 510 Hz, il valore di pitch bend sarebbe:

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

Quindi la sequenza di messaggi MIDI per 500, 510, 500 Hz sarebbe:

  • NOTA 71
  • PITCH BEND 9065
  • ...
  • CURVA DI PASSO 10469
  • ...
  • PITCH BEND 9065

Puoi pensare al numero di nota MIDI come alla parte "integrale" del tono; e il pitch bend come una parte "frazionaria" ridondante del pitch.


Inoltre, dalla mia comprensione del codice, ge è il messaggio di pitch bend; ge.data [2] suo MSB e ge.data [1] suo LSB. ananya è la nota sul messaggio, ananya.data [1] è il numero della nota e ananya.data [2] la velocità. Oltre alla denominazione variabile funky che sembra implicare una relazione nascosta tra gli autori del codice, qui vedo un potenziale WTF: c'è qualcosa di sospetto nelle costanti 1.0653f e 11.0f. Una scelta leggibile sarebbe: 1.05946f e 12.0f. O 1.06504f e 11.0f. Gli autori sembrano ipotizzare un intervallo di pitch bend di +/- 1 ottava, che è un altro potenziale WTF.
Pichenettes,

ROTFL sulla parte "romanticismo nascosto"! Non credo di averlo capito bene quindi abbiate pazienza. Il valore del pitch viene ottenuto dalla funzione autocorrelate, che mi sembra sia la nota MIDI che viene emessa. Notare l' midi2pitcharray nella formula? Se ho ragione, ciò significa che non ho ancora il bendvalore o il valore effettivo del pitch per stimare il valore di bendaggio e nessun modo per ottenerli a meno che non abbia un file MIDI. Un semplice caso di troppe variabili e troppe equazioni. Come posso stimare la curva, il valore del pitch effettivo e velocityin questo caso?
Sriram,

Cosa stai cercando di fare? Convertire una coppia pitch / power in messaggi MIDI? O convertire i dati MIDI in un pitch reale? Il codice sopra riportato converte una coppia di messaggi MIDI in arrivo + pitch bend (ananya msg, ge msg) in un punto (variabile pitch) e una potenza (variabile power). Penso che questo sia usato per sostituire l'eccitazione LPC con una sintetica controllata da una tastiera MIDI - una sorta di vocoder grezzo o effetto di autotune.
Pichenettes,

una rapida occhiata a rt_lpc.cpp conferma che i messaggi MIDI in entrata di tipo 0xe0 (PITCH BEND) stanno aggiornando il valore di pitch bend; e che i messaggi MIDI in arrivo di tipo 0x90 (NOTE ON) vengono copiati nel messaggio "ananya". Da lì, la risintesi usando un passo modificato viene fatta usando questi valori. Non sono sicuro di cosa tu voglia fare da lì.
Pichenettes,

1
Sì, l'ingresso MIDI è qui una cosa totalmente diversa per la trasformazione creativa del segnale. Non fa parte della normale catena di analisi / sintesi LPC; ma consente invece di leggere alcuni parametri (intonazione e potenza) da una tastiera piuttosto che produrli dal modulo di analisi. Forse potresti pubblicare una nuova domanda con alcuni esempi di file audio e una traiettoria di tonalità estratta in Hz, in modo da poterti orientare verso tecniche di stima del pitch più robuste. La libreria Aubio ha alcune varianti di pitch tracker.
Pichenettes,

6

Il MIDI è un protocollo che consente (principalmente) ai sintetizzatori di controllare o essere controllati da altri sintetizzatori o computer.

È un protocollo seriale che consente di scambiare messaggi come "tasto C1 in alto" "tasto D4 in basso" "velocità del tasto," cambio di suono ", ecc. Molti controller hanno una" rotella del pitch "che è un joystick o una ruota di modulazione. il giocatore cambia in modo interattivo il tono della nota corrente suonata per creare manualmente il vibrato o "scorrere" continuamente da una nota alla successiva. Come spesso fatto dai chitarristi piegando la corda con la mano sinistra, viene spesso chiamata pitch bending e da qui il nome.

Il messaggio MIDI pitch bend è un modo per comunicare la quantità di pitch shifting che dovrebbe avvenire in un dato momento. Un sintetizzatore (software o hardware) che riceve un messaggio di pitch bend dovrebbe cambiare il tono di tutte le note correnti suonate per la quantità data.

Il messaggio del controller ha un argomento che va da -8192 a 8191 e nei file MIDI standard questo dovrebbe coprire l'intervallo da -200 cent a 200 cent, dove 1 cent è 1/100 di semitono, cioè un rapporto di 2 ^ ( 1/1200) = 1.000577789506555. Esempio: per creare un pitch shift verso il basso per arrivare al 93% della frequenza nominale, il valore del controller sarebbe

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

o -5146 in questo caso. 0,93 è il rapporto desiderato, 12 il numero di semitoni per ottava, 2 l'intervallo massimo di pitch bend (200 cent o 2 semitoni in questo caso) e log2 () il logaritmo con base 2.

Tuttavia, nella maggior parte dei sintetizzatori la gamma è configurabile e probabilmente non è una buona idea presumere che tutti i sintetizzatori si comportino allo stesso modo.

Ecco un diagramma di conversione che può aiutare. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.