Convertendo um valor de pitch bend (MIDI) para um valor de pitch "normal"

11

Estou tentando uma análise e síntese offline do LPC usando a implementação rt_lpc (LPC em tempo real), conforme fornecido aqui . Existem algumas funções no programa que podem ser usadas para um programa offline de análise e síntese de LPC. O código rt_lpc destina-se principalmente a compositores etc., o que significa que ele usa uma entrada de pulso MIDI ou glotal. Há algum código no programa que converte um valor de afinação (obtido da correlação automática) no bendvalor. A relação é dada da seguinte maneira:

    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;

Alguns pontos:
a. ananyaé um objeto do tipo MidiMsgque parece ser preenchido em tempo real.
b. getambém é um objeto do tipo MidiMsgque também parece ser preenchido em tempo real.
c. Esses dois objetos são criados quando o programa é executado em tempo real (o meu é uma versão offline que executa partes seletivas dele em um main.cpp próprio.

Minha (s) pergunta (s):
1. O que é pitch bend?
2. Como converter um valor de inclinação em um valor de dobra? Quais são as relações de mapeamento?

Pesquisei no Google soluções, mas não encontrei uma resposta clara.

Sriram
fonte

Respostas:

12

No centro do MIDI está uma representação da música como eventos discretos, cada um com um tom estático. É perfeito para representar a música tocada em instrumentos de teclado. Você pode converter qualquer frequência correspondente a uma nota na escala temperada em um número de nota MIDI, usando:

69+12×log2frequency440

Supondo que o receptor MIDI esteja calibrado para A4 = 440 Hz.

Essa representação é boa para a música de piano, mas o problema é como representar tons que não são mapeados na escala temperada (música não ocidental, sons não musicais) e como representar variações de tom durante a duração de uma nota (glissando, vibrato).

Isso é feito no MIDI usando "mensagens de afinação" que instruem o sintetizador a mudar o tom da nota atualmente tocada por um pequeno intervalo. A maioria dos sintetizadores é calibrada por padrão para +/- 2 semitons no curso do intervalo de mensagens de pitch bend (0 .. 16383). 8192 corresponde a nenhuma dobra de afinação - a afinação emitida é exatamente a do valor da nota. O mapeamento entre o valor da inclinação da afinação e a taxa de mudança de frequência é dado por:

femitted_notefnote_message=2pitchbend81924096×12

Assim, você pode obter a frequência de uma nota tocada por um sintetizador a partir da seguinte fórmula:

440×2note6912.0+pitchbend81924096×12

Onde note é o número da nota MIDI de 7 bits da última mensagem Note On recebida ; e pitchbend é o valor de 14 bits da última mensagem de inclinação de inclinação recebida . Um sintetizador inicia com seu registro de afinação ajustado em 8192, e esse valor também é redefinido durante a recepção da mensagem "Redefinir todos os controladores".

Vamos dar o seguinte exemplo. Você deseja expressar um trinado de flauta com a seguinte trajetória de frequência: 500 Hz, 510 Hz, 500 Hz, como mensagens MIDI.

O número da nota base é:

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

Então você envia uma mensagem "note on" com a nota # igual a 71. Isso é equivalente a um tom de:

440×2(7169)/12=493.88

Qual é o tom mais próximo da escala temperada. Você precisa enviar uma mensagem de inclinação para aumentar o tom por um fator de:

500493.88=1.0124

E obtenha seus 500 Hz. O valor da inclinação do passo correspondente é:

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

Para obter 510 Hz, o valor da inclinação do pitch seria:

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

Portanto, sua sequência de mensagens MIDI para 500, 510, 500 Hz seria:

  • NOTA 71
  • PITCH BEND 9065
  • ...
  • PITCH BEND 10469
  • ...
  • PITCH BEND 9065

Você pode pensar no número da nota MIDI como a parte "integral" da afinação; e o tom dobra como uma parte "fracionária" redundante do tom.

pichenettes
fonte
Além disso, pelo meu entendimento do código, ge é a mensagem de pitch bend; ge.data [2] seu MSB e ge.data [1] seu LSB. ananya é a nota na mensagem, ananya.data [1] é o número da nota e ananya.data [2] a velocidade. Além da nomenclatura de variáveis ​​que parece implicar um romance oculto entre os autores do código, vejo um WTF em potencial aqui: há algo suspeito nas constantes 1.0653f e 11.0f. Uma opção legível seria: 1.05946f e 12.0f. Ou 1.06504f e 11.0f. Os autores parecem assumir um intervalo de pitch bend de +/- 1 oitava, que é outro potencial WTF.
Pichenettes #
ROTFL na parte "romance oculto"! Eu não acho que entendi isso direito, então tenha paciência comigo. O valor do pitch é obtido a partir da função autocorrelate, que me parece ser a nota MIDI que é emitida. Observe a midi2pitchmatriz na fórmula? Se eu estiver certo, isso significa que ainda não tenho o bendvalor ou o valor real da afinação para estimar o valor de dobra e também não há como obtê-los, a menos que eu tenha um arquivo MIDI. Um caso simples de muitas variáveis ​​e poucas equações. Como faço para estimar a dobra, o valor do tom real e o velocitynesse caso?
Sriram
O que você está tentando fazer? Converter um par de afinação / potência em mensagens MIDI? Ou converter dados MIDI para um tom real? O código fornecido acima converte um par de mensagens MIDI recebidas de nota + afinação (ananya msg, ge msg) em um período (variável de afinação) e uma potência (variável de potência). Eu acho que isso é usado para substituir a excitação do LPC por uma sintética controlada por um teclado MIDI - uma espécie de efeito bruto de vocoder ou autotune.
Pichenettes
uma rápida olhada em rt_lpc.cpp confirma que as mensagens MIDI recebidas do tipo 0xe0 (PITCH BEND) estão atualizando o valor da afinação; e que as mensagens MIDI recebidas do tipo 0x90 (NOTE ON) são copiadas para a mensagem "ananya". A partir daí, a ressíntese usando um tom modificado é feita usando esses valores. Não sei o que você quer fazer a partir daí.
Pichenettes #
1
Sim, a entrada MIDI é aqui uma coisa totalmente diferente para a transformação criativa do sinal. Não faz parte da cadeia normal de análise / síntese de LPC; mas permite que alguns parâmetros (altura e potência) sejam lidos a partir de um teclado, e não produzidos pelo módulo de análise. Talvez você possa postar uma nova pergunta com alguns exemplos de arquivos de áudio e extrair a trajetória de afinação em Hz, para que possamos orientá-lo a técnicas de estimativa de afinação mais robustas. A biblioteca de Aubio tem algumas variantes de rastreadores de pitch.
pichenettes
6

MIDI é um protocolo que permite (principalmente) sintetizadores controlar ou serem controlados por outros sintetizadores ou computadores.

É um protocolo serial que permite trocar mensagens como "tecla C1 para cima" "tecla D4 para baixo" "velocidade da tecla", alteração do som "etc. Muitos controladores possuem um" pitch pitch "que é um joystick ou um botão de modulação. o jogador altere interativamente o tom da nota atual que está sendo tocada para criar manualmente vibrato ou "deslizar" continuamente de uma nota para a próxima.Como isso é feito com frequência pelos guitarristas dobrando a corda com a mão esquerda, costuma ser chamada inclinação do tom e, portanto, o nome.

A mensagem MIDI pitch bend é uma maneira de comunicar quanta mudança de tom deve ocorrer em um determinado momento. Um sintetizador (software ou hardware) que recebe uma mensagem de pitch bend deve alterar a afinação de todas as notas atuais sendo tocadas pela quantidade especificada.

A mensagem do controlador possui um argumento que varia de -8192 a 8191 e, nos arquivos MIDI padrão, deve cobrir o intervalo de -200 a 200 centavos, em que 1 cent é 1/100 do semitom, ou seja, uma proporção de 2 ^ ( 1/1200) = 1.000577789506555. Exemplo: para criar um deslocamento de tom para baixo para chegar a 93% da frequência nominal, o valor do controlador seria

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

ou -5146 neste caso. 0,93 é a proporção que você deseja, 12 o número de semitons por oitava, 2 o intervalo de inclinação máxima (200 cêntimos ou 2 semitons neste caso) e log2 () o logaritmo com base 2.

No entanto, na maioria dos sintetizadores, o intervalo é configurável e provavelmente não é uma boa ideia supor que todos os sintetizadores se comportam da mesma forma.

Aqui está um gráfico de conversão que pode ajudar. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

Hilmar
fonte