Convertir un valor de pitch bend (MIDI) en un valor de tono "normal"

11

Estoy intentando un análisis y síntesis de LPC fuera de línea usando la implementación rt_lpc (LPC en tiempo real) como se indica aquí . Hay algunas funciones dentro del programa que pueden usarse para un programa de análisis y síntesis LPC fuera de línea. El código rt_lpc está destinado principalmente a compositores, etc., lo que significa que utiliza una entrada de pulso glotal o MIDI. Hay algún código en el programa que convierte un valor de tono (obtenido de la autocorrelación) en el bendvalor. La relación se da de la siguiente manera:

    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;

Algunos puntos:
a. ananyaes un objeto de tipo MidiMsgque parece estar poblado sobre la marcha.
si. getambién es un objeto de tipo MidiMsgque también parece estar poblado sobre la marcha.
C. Estos dos objetos se crean cuando el programa se ejecuta en tiempo real (el mío es una versión sin conexión que ejecuta partes selectivas en un main.cpp propio).

Mi (s) pregunta (s):
1. ¿Qué es pitch bend?
2. ¿Cómo convierto un valor de tono en un valor de curva? ¿Cuáles son las relaciones de mapeo?

Busqué en Google soluciones pero no encontré una respuesta clara.

Sriram
fuente

Respuestas:

12

En el núcleo de MIDI hay una representación de la música como eventos de notas discretas, cada una de ellas con un tono estático. Esto es perfecto para representar la música que se toca en los instrumentos de teclado. Puede convertir cualquier frecuencia correspondiente a una nota en la escala templada en un número de nota MIDI, utilizando:

69+12×log2frequency440

Bajo el supuesto de que el receptor MIDI está calibrado para A4 = 440 Hz.

Esta representación está bien para la música de piano, pero el problema es cómo representar los tonos que no están asignados a la escala templada (música no occidental, sonidos no musicales), y cómo representar las variaciones de tono durante la duración de una nota (glissando, vibrato).

Esto se realiza en MIDI mediante el uso de "mensajes de inflexión de tono" que le indican al sintetizador que cambie el tono de la nota actualmente reproducida en un pequeño intervalo. La mayoría de los sintetizadores están calibrados por defecto para +/- 2 semitonos en el transcurso del rango de mensajes de pitch bend (0 .. 16383). 8192 corresponde a no doblar el tono: el tono emitido es exactamente el del valor de la nota. El mapeo entre el valor de pitch bend y la relación de desplazamiento de frecuencia viene dado por:

femitted_notefnote_message=2pitchbend81924096×12

De este modo, puede obtener la frecuencia de una nota tocada por un sintetizador a partir de la siguiente fórmula:

440×2note6912.0+pitchbend81924096×12

Donde note es el número de nota MIDI de 7 bits del último mensaje Note On recibido ; y pitchbend es el valor de 14 bits del último mensaje Pitch bend recibido . Un sintetizador comienza con su registro de pitch bend establecido en 8192, y este valor también se restablece durante la recepción de un mensaje "Restablecer todos los controladores".

Tomemos el siguiente ejemplo. Desea expresar un trino de flauta con la siguiente trayectoria de frecuencia: 500 Hz, 510 Hz, 500 Hz, como mensajes MIDI.

El número de la nota base es:

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

Entonces envía un mensaje de "nota sobre" con nota # igual a 71. Esto es equivalente a un tono de:

440×2(7169)/12=493.88

Cuál es el tono más cercano en la escala templada. Debe enviar un mensaje de inflexión de tono para aumentar el tono por un factor de:

500493.88=1.0124

Y obtén tus 500 Hz. El valor de pitch bend correspondiente es:

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

Para obtener sus 510 Hz, el valor de pitch bend sería:

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

Entonces su secuencia de mensajes MIDI para 500, 510, 500 Hz sería:

  • NOTA 71
  • PENDCH BEND 9065
  • ...
  • CURVA DE ALCANCE 10469
  • ...
  • PENDCH BEND 9065

Puede pensar en el número de nota MIDI como la parte "integral" del tono; y el pitch bend como una parte "fraccional" redundante del pitch.

pichenettes
fuente
Además, según tengo entendido el código, ge es el mensaje de pitch bend; ge.data [2] su MSB y ge.data [1] su LSB. ananya es la nota en el mensaje, ananya.data [1] es el número de nota y ananya.data [2] la velocidad. Además del nombre de variable funky que parece implicar un romance oculto entre los autores del código, veo un WTF potencial aquí: hay algo sospechoso en las constantes 1.0653f y 11.0f. Una elección legible sería: 1.05946f y 12.0f. O 1.06504f y 11.0f. Los autores parecen asumir un rango de pitch bend de +/- 1 octava, que es otro WTF potencial.
pichenettes
¡ROTFL en la parte del "romance oculto"! No creo haber entendido esto correctamente, así que tengan paciencia conmigo. El valor de tono se obtiene de la función autocorrelate, que me parece que es la nota MIDI que se emite. Observe la midi2pitchmatriz en la fórmula? Si tengo razón, eso significa que todavía no tengo el bendvalor o el valor real del tono para estimar el valor de plegado, y tampoco hay forma de obtenerlos a menos que tenga un archivo MIDI. Un caso simple de demasiadas variables y muy pocas ecuaciones. ¿Cómo calculo la curva, el valor de tono real y el velocityen este caso?
Sriram
¿Que estás tratando de hacer? ¿Convertir un par tono / potencia a mensajes MIDI? ¿O convertir datos MIDI a un tono real? El código anterior convierte un par de notas MIDI entrantes + mensajes de inflexión de tono (ananya msg, ge msg) en un período (variable de tono) y una potencia (variable de potencia). Creo que esto se usa para reemplazar la excitación LPC por una sintética controlada por un teclado MIDI, una especie de vocoder crudo o efecto de autoajuste.
pichenettes
un vistazo rápido a rt_lpc.cpp confirma que los mensajes MIDI entrantes de tipo 0xe0 (PITCH BEND) están actualizando el valor de pitch bend; y que los mensajes MIDI entrantes de tipo 0x90 (NOTA ACTIVADA) se copian en el mensaje "ananya". A partir de ahí, la resíntesis utilizando un tono modificado se realiza utilizando estos valores. No estoy seguro de lo que quieres hacer desde allí.
pichenettes
1
Sí, la entrada MIDI es aquí una cosa totalmente diferente para la transformación creativa de la señal. No es parte de la cadena normal de análisis / síntesis de LPC; pero en su lugar permite que algunos parámetros (tono y potencia) se lean desde un teclado en lugar de ser producidos por el módulo de análisis. Tal vez podría publicar una nueva pregunta con algunos ejemplos de archivos de audio y una trayectoria de tono extraída en Hz, para que podamos orientarlo a técnicas de estimación de tono más robustas. La biblioteca de Aubio tiene algunas variantes de rastreadores de tono.
pichenettes
6

MIDI es un protocolo que permite (principalmente) sintetizadores controlar o ser controlados por otros sintetizadores o computadoras.

Es un protocolo en serie que permite intercambiar mensajes como "tecla C1 arriba", "tecla D4 abajo", "velocidad de la tecla," cambio de sonido ", etc. Muchos controladores tienen una" rueda de tono "que es un joystick o una rueda de modulación. el jugador debe cambiar interactivamente el tono de la nota actual que se está tocando para crear manualmente el vibrato o para "deslizarse" continuamente de una nota a la siguiente. Como esto suele hacer los guitarristas doblando la cuerda con su mano izquierda, a menudo se llama inclinación de tono y de ahí el nombre.

El mensaje MIDI bend bend es una forma de comunicar cuánto cambio de tono se supone que sucederá en un momento dado. Se supone que un sintetizador (software o hardware) que recibe un mensaje de inflexión de tono cambia el tono de todas las notas actuales que se reproducen en la cantidad dada.

El mensaje del controlador tiene un argumento que va de -8192 a 8191 y en los archivos MIDI estándar se supone que cubre el rango de -200 ciento a 200 centavos, donde 1 centavo es 1/100 de semitono, es decir, una relación de 2 ^ ( 1/1200) = 1.000577789506555. Ejemplo: para crear un cambio de tono hacia abajo para llegar al 93% de la frecuencia nominal, el valor del controlador sería

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

o -5146 en este caso. 0,93 es la relación que deseas, 12 el número de semitonos por octava, 2 el rango máximo de inflexión de tono (200 centavos o 2 semitonos en este caso) y log2 () el logaritmo con base 2.

Sin embargo, en la mayoría de los sintetizadores, el rango es configurable y probablemente no sea una buena idea suponer que todos los sintetizadores se comportan igual.

Aquí hay una tabla de conversión que puede ayudar. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

Hilmar
fuente