Conversion d'une valeur de pitch bend (MIDI) en une valeur de pitch «normale»


11

J'essaie une analyse et une synthèse LPC hors ligne en utilisant l'implémentation rt_lpc (LPC en temps réel) comme indiqué ici . Certaines fonctions du programme peuvent être utilisées pour un programme d'analyse et de synthèse LPC hors ligne. Le code rt_lpc est principalement destiné aux compositeurs, etc., ce qui signifie qu'il utilise une entrée d'impulsion MIDI ou glottale. Il y a du code dans le programme qui convertit une valeur de hauteur (obtenue par auto-corrélation) en bendvaleur. La relation est donnée comme suit:

    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;

Quelques points:
a. ananyaest un objet de type MidiMsgqui semble être peuplé à la volée.
b. geest également un objet de type MidiMsgqui semble également être peuplé à la volée.
c. Ces deux objets sont créés lorsque le programme est exécuté en temps réel (le mien est une version hors ligne qui exécute des parties sélectives de celui-ci dans un fichier main.cpp à moi.

Ma ou mes questions:
1. Qu'est-ce que le pitch bend?
2. Comment puis-je convertir une valeur de pitch en une valeur de bend? Quelles sont les relations cartographiques?

J'ai recherché des solutions sur Google, mais je n'ai trouvé aucune réponse claire.

Réponses:


12

Au cœur du MIDI se trouve une représentation de la musique comme des événements de notes discrètes, chacune ayant une hauteur statique. C'est parfait pour représenter la musique jouée sur des instruments à clavier. Vous pouvez convertir n'importe quelle fréquence correspondant à une note sur l'échelle tempérée en un numéro de note MIDI, en utilisant:

69+12×Journal2Frequency440

Dans l'hypothèse où le récepteur MIDI est calibré pour A4 = 440 Hz.

Cette représentation est correcte pour la musique de piano, mais le problème est de savoir comment représenter des hauteurs qui ne sont pas mappées à l'échelle tempérée (musique non occidentale, sons non musicaux), et comment représenter les variations de hauteur sur la durée d'une note (glissando, vibrato).

Cela se fait en MIDI en utilisant des "messages de pitch bend" qui demandent au synthétiseur de décaler la hauteur de la note actuellement jouée d'un petit intervalle. La plupart des synthétiseurs sont calibrés par défaut pour +/- 2 demi-tons au cours de la plage de messages de pitch bend (0 .. 16383). 8192 correspond à aucun pitch bending - la hauteur émise est exactement celle de la valeur de note. La correspondance entre la valeur de pitch bend et le rapport de décalage de fréquence est donnée par:

Femjette_noteFnote_messunege=2pjetchben-81924096×12

Vous pouvez ainsi obtenir la fréquence d'une note jouée par un synthétiseur à partir de la formule suivante:

440×2note-6912,0+pjetchben-81924096×12

note est le numéro de note MIDI 7 bits du dernier message Note On reçu ; et pitchbend est la valeur de 14 bits du dernier message Pitch bend reçu . Un synthétiseur démarre avec son registre de pitch bend réglé sur 8192, et cette valeur est également réinitialisée lors de la réception d'un message "Réinitialiser tous les contrôleurs".

Prenons l'exemple suivant. Vous voulez exprimer un trille de flûte avec la trajectoire de fréquence suivante: 500 Hz, 510 Hz, 500 Hz, sous forme de messages MIDI.

Le numéro de note de base est:

roun(69+12×Journal2(500/440))=71

Vous envoyez donc un message "note sur" avec une note # égale à 71. Cela équivaut à une hauteur de:

440×2(71-69)/12=493,88

Quelle est la hauteur la plus proche sur l'échelle tempérée. Vous devez envoyer un message de pitch bend pour augmenter la hauteur d'un facteur de:

500493,88=1.0124

Et obtenez votre 500 Hz. La valeur de pitch bend correspondante est:

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

Pour obtenir votre 510 Hz, la valeur du pitch bend serait:

roun(8192+4096×12×log2510493,88)=10469

Votre séquence de messages MIDI pour 500, 510, 500 Hz serait donc:

  • NOTE 71
  • PITCH BEND 9065
  • ...
  • PITCH BEND 10469
  • ...
  • PITCH BEND 9065

Vous pouvez considérer le numéro de note MIDI comme la partie «intégrale» de la hauteur; et le pitch bend en tant que partie "fractionnelle" redondante du pitch.


De plus, d'après ma compréhension du code, ge est le message de pitch bend; ge.data [2] son ​​MSB et ge.data [1] son ​​LSB. ananya est la note du message, ananya.data [1] est le numéro de la note et ananya.data [2] la vitesse. Outre la dénomination funky des variables qui semble impliquer une romance cachée entre les auteurs du code, je vois un potentiel WTF ici: il y a quelque chose de louche dans les constantes 1.0653f et 11.0f. Un choix lisible serait: 1.05946f et 12.0f. Ou 1.06504f et 11.0f. Les auteurs semblent supposer une plage de pitch bend de +/- 1 octave, ce qui est un autre WTF potentiel.
pichenettes

ROTFL sur la partie "romance cachée"! Je ne pense pas avoir bien compris cela, alors soyez indulgents. La valeur de hauteur est obtenue à partir de la fonction autocorrelate, ce qui me semble être la note MIDI qui est sortie. Remarquez le midi2pitchtableau dans la formule? Si j'ai raison, cela signifie que je n'ai toujours pas la bendvaleur ou la valeur réelle de la hauteur pour estimer la valeur de bend, et aucun moyen de les obtenir non plus, sauf si j'ai un fichier MIDI. Un cas simple de trop de variables et trop peu d'équations. Comment puis-je estimer le virage, la valeur de pas réelle et velocitydans ce cas?
Sriram

Qu'essayez-vous de faire? Convertir une paire hauteur / puissance en messages MIDI? Ou convertir des données MIDI en une hauteur réelle? Le code donné ci-dessus convertit une paire de messages MIDI entrants note + pitch bend (ananya msg, ge msg) en une période (variable de hauteur) et une puissance (variable de puissance). Je pense que cela est utilisé pour remplacer l'excitation LPC par une excitation synthétique contrôlée par un clavier MIDI - une sorte de vocodeur brut ou d'effet d'autotune.
pichenettes

un rapide coup d'œil à rt_lpc.cpp confirme que les messages MIDI entrants de type 0xe0 (PITCH BEND) mettent à jour la valeur de pitch bend; et que les messages MIDI entrants de type 0x90 (NOTE ON) sont copiés dans le message "ananya". À partir de là, la resynthèse utilisant un pas modifié se fait en utilisant ces valeurs. Je ne sais pas ce que vous voulez faire à partir de là.
pichenettes

1
Oui, l'entrée MIDI est ici une chose totalement différente pour la transformation créative du signal. Il ne fait pas partie de la chaîne normale d'analyse / synthèse du LPC; mais permet plutôt de lire certains paramètres (hauteur et puissance) à partir d'un clavier plutôt que de les produire par le module d'analyse. Vous pourriez peut-être poster une nouvelle question avec quelques exemples de fichiers audio et extraire la trajectoire de hauteur en Hz, afin que nous puissions vous orienter vers des techniques d'estimation de hauteur plus robustes. La bibliothèque Aubio propose quelques variantes de trackers de pitch.
pichenettes

6

Le MIDI est un protocole qui permet (principalement) aux synthétiseurs de contrôler ou d'être contrôlés par d'autres synthétiseurs ou ordinateurs.

C'est un protocole série qui permet d'échanger des messages tels que "touche C1 vers le haut" "touche D4 vers le bas" "vitesse des touches," changement de son ", etc. De nombreux contrôleurs ont une" molette de pitch "qui est un joystick ou une molette de modulation am. le joueur pour changer interactivement la hauteur de la note en cours de lecture pour créer manuellement un vibrato ou pour "glisser" en continu d'une note à la suivante. Comme cela est souvent fait par les guitaristes en pliant la corde frettée avec leur main gauche, on l'appelle souvent le pitch bending et donc le nom.

Le message MIDI de pitch bend est un moyen de communiquer la quantité de pitch shift qui est censée se produire à un moment donné. Un synthétiseur (logiciel ou matériel) recevant un message de pitch bend est censé changer la hauteur de toutes les notes actuelles jouées de la quantité donnée.

Le message du contrôleur a un argument qui va de -8192 à 8191 et dans les fichiers MIDI standard, il est censé couvrir la plage de -200 cent à 200 cent, où 1 cent est 1/100 de demi-ton, soit un rapport de 2 ^ ( 1/1200) = 1.000577789506555. Exemple: pour créer un décalage vers le bas pour atteindre 93% de la fréquence nominale, la valeur du contrôleur serait

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

ou -5146 dans ce cas. 0,93 est le rapport que vous voulez, 12 le nombre de demi-tons par octave, 2 la plage de pitch bend max (200 cent ou 2 demi-tons dans ce cas), et log2 () le logarithme avec la base 2.

Cependant, dans la plupart des synthétiseurs, la plage est configurable et ce n'est probablement pas une bonne idée de supposer que tous les synthétiseurs se comportent de la même manière.

Voici un tableau de conversion qui peut vous aider. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.