Konvertieren eines MIDI-Werts (Pitch Bend) in einen „normalen“ Pitch-Wert


11

Ich versuche eine Offline-LPC-Analyse und -Synthese mit der hier angegebenen Implementierung von rt_lpc (Echtzeit-LPC) . Es gibt einige Funktionen innerhalb des Programms, die für ein Offline-LPC-Analyse- und Syntheseprogramm verwendet werden können. Der Code rt_lpc ist hauptsächlich für Komponisten usw. gedacht, was bedeutet, dass er einen MIDI- oder Glottal-Impulseingang verwendet. Das Programm enthält einen Code, der einen Tonhöhenwert (der aus der Autokorrelation erhalten wird) in den bendWert konvertiert . Die Beziehung ist wie folgt gegeben:

    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;

Einige Punkte:
a. ananyaist ein Objekt vom Typ MidiMsg, das im laufenden Betrieb bevölkert zu sein scheint.
b. geist auch ein Objekt vom Typ MidiMsg, das auch im laufenden Betrieb besiedelt zu sein scheint.
c. Diese beiden Objekte werden erstellt, wenn das Programm in Echtzeit ausgeführt wird (meins ist eine Offline-Version, die ausgewählte Teile davon in einer eigenen main.cpp ausführt.

Meine Frage (n):
1. Was ist Pitch Bend?
2. Wie konvertiere ich einen Pitch-Wert in einen Bend-Wert? Was sind die Mapping-Beziehungen?

Ich habe nach Lösungen gegoogelt, aber keine klare Antwort gefunden.

Antworten:


12

Das Herzstück von MIDI ist die Darstellung von Musik als diskrete Notenereignisse, von denen jedes eine statische Tonhöhe hat. Dies ist perfekt für die Darstellung von Musik, wie sie auf Tasteninstrumenten gespielt wird. Sie können jede Frequenz, die einer Note auf der temperierten Skala entspricht, in eine MIDI-Notennummer umwandeln, indem Sie:

69+12×Log2frequency440

Unter der Annahme, dass der MIDI-Receiver für A4 = 440 Hz kalibriert ist.

Diese Darstellung ist für Klaviermusik in Ordnung, aber das Problem besteht darin, wie Tonhöhen dargestellt werden, die nicht der temperierten Skala zugeordnet sind (nicht-westliche Musik, nicht-musikalische Klänge), und wie Tonhöhenvariationen über die Dauer einer Note dargestellt werden (glissando, Vibrato).

Dies erfolgt in MIDI mithilfe von "Pitch Bend Messages", die den Synthesizer anweisen, die Tonhöhe der aktuell gespielten Note um ein kleines Intervall zu verschieben. Die meisten Synthesizer sind standardmäßig für +/- 2 Halbtöne im Verlauf des Pitch-Bend-Nachrichtenbereichs (0 .. 16383) kalibriert. 8192 entspricht keiner Tonhöhenbiegung - die emittierte Tonhöhe entspricht genau der des Notenwerts. Die Abbildung zwischen dem Pitch Bend-Wert und dem Frequenzverschiebungsverhältnis ist gegeben durch:

femichtted_nÖtefnÖte_messeinGe=2pichtchbend- -81924096×12

Sie können also die Frequenz einer von einem Synthesizer gespielten Note aus der folgenden Formel ermitteln:

440×2nÖte- -6912.0+pichtchbend- -81924096×12

Wobei Note die 7-Bit-MIDI-Notennummer der zuletzt empfangenen Note On- Nachricht ist; und Pitchbend ist der 14-Bit-Wert der zuletzt empfangenen Pitch-Bend- Nachricht. Ein Synthesizer beginnt mit einem auf 8192 eingestellten Pitch-Bend-Register, und dieser Wert wird auch während des Empfangs einer Meldung "Alle Controller zurücksetzen" zurückgesetzt.

Nehmen wir das folgende Beispiel. Sie möchten einen Flötentriller mit der folgenden Frequenzbahn ausdrücken: 500 Hz, 510 Hz, 500 Hz als MIDI-Meldungen.

Die Basisnotennummer lautet:

rÖund(69+12×Log2(500/.440))=71

Sie senden also eine "Note on" -Nachricht mit der Note # 71. Dies entspricht einer Tonhöhe von:

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

Welches ist die nächste Tonhöhe auf der temperierten Skala. Sie müssen eine Pitch Bend-Nachricht senden, um die Tonhöhe um den Faktor zu erhöhen:

500493,88=1,0124

Und holen Sie sich Ihre 500 Hz. Der entsprechende Pitch Bend-Wert ist:

rÖund(8192+4096×12×lÖG21,0124)=9065

Um Ihre 510 Hz zu erhalten, wäre der Pitch Bend-Wert:

rÖund(8192+4096×12×lÖG2510493,88)=10469

Ihre Folge von MIDI-Nachrichten für 500, 510, 500 Hz wäre also:

  • ANMERKUNG 71
  • PITCH BEND 9065
  • ...
  • PITCH BEND 10469
  • ...
  • PITCH BEND 9065

Sie können sich die MIDI-Notennummer als "integralen" Teil der Tonhöhe vorstellen. und die Tonhöhenbiegung als redundanter "Bruchteil" der Tonhöhe.


Nach meinem Verständnis des Codes ist ge auch die Pitch-Bend-Nachricht. ge.data [2] sein MSB und ge.data [1] sein LSB. ananya ist die Note in der Nachricht, ananya.data [1] ist die Notennummer und ananya.data [2] die Geschwindigkeit. Neben der funkigen Variablennamen, die eine versteckte Romanze zwischen den Autoren des Codes zu implizieren scheinen, sehe ich hier eine potenzielle WTF: In den Konstanten 1.0653f und 11.0f ist etwas faul. Eine lesbare Wahl wäre: 1.05946f und 12.0f. Oder 1.06504f und 11.0f. Die Autoren scheinen einen Pitch Bend-Bereich von +/- 1 Oktave anzunehmen, was ein weiteres potenzielles WTF ist.
Pichenettes

ROTFL über den Teil "versteckte Romantik"! Ich glaube nicht, dass ich das richtig verstanden habe, also nimm es mit. Der Tonhöhenwert wird von der Funktion erhalten autocorrelate, die mir als die ausgegebene MIDI-Note erscheint. Beachten Sie das midi2pitchArray in der Formel? Wenn ich Recht habe, bedeutet dies, dass ich immer noch nicht über den bendWert oder den tatsächlichen Wert der Tonhöhe verfüge , anhand derer ich den Biegewert abschätzen kann, und dass ich sie auch nicht erhalten kann, es sei denn, ich habe eine MIDI-Datei. Ein einfacher Fall von zu vielen Variablen und zu wenigen Gleichungen. Wie schätze ich die Biegung, den tatsächlichen Teilungswert und velocityin diesem Fall die?
Sriram

Was versuchst du zu machen? Ein Pitch / Power-Paar in MIDI-Meldungen umwandeln? Oder MIDI-Daten in eine tatsächliche Tonhöhe umwandeln? Der oben angegebene Code konvertiert ein Paar eingehender MIDI-Note + Pitch-Bend-Nachrichten (ananya msg, ge msg) in eine Periode (Pitch-Variable) und eine Potenz (Power-Variable). Ich denke, dies wird verwendet, um die LPC-Anregung durch eine synthetische zu ersetzen, die von einem MIDI-Keyboard gesteuert wird - eine Art roher Vocoder- oder Autotune-Effekt.
Pichenettes

Ein kurzer Blick auf rt_lpc.cpp bestätigt, dass eingehende MIDI-Nachrichten vom Typ 0xe0 (PITCH BEND) den Pitch Bend-Wert aktualisieren. und dass eingehende MIDI-Nachrichten vom Typ 0x90 (HINWEIS EIN) in die "ananya" -Nachricht kopiert werden. Von dort aus erfolgt die Resynthese unter Verwendung einer modifizierten Tonhöhe unter Verwendung dieser Werte. Ich bin mir nicht sicher, was Sie von dort aus tun möchten.
Pichenettes

1
Ja, der MIDI-Eingang ist hier eine ganz andere Sache für die kreative Signaltransformation. Es ist nicht Teil der normalen LPC-Analyse- / Synthesekette; Stattdessen können einige Parameter (Tonhöhe und Leistung) von einer Tastatur gelesen werden, anstatt vom Analysemodul erzeugt zu werden. Vielleicht könnten Sie eine neue Frage mit einigen Beispielen für Audiodateien stellen und die Tonhöhenbahn in Hz extrahieren, damit wir Sie an robusteren Tonhöhenschätzungstechniken orientieren können. Die Aubio-Bibliothek verfügt über einige Varianten von Pitch-Trackern.
Pichenettes

6

MIDI ist ein Protokoll, mit dem (hauptsächlich) Synthesizer andere Synthesizer oder Computer steuern oder von diesen gesteuert werden können.

Es handelt sich um ein serielles Protokoll, mit dem Nachrichten wie "Taste C1 hoch", "Taste D4 runter", "Schlüsselgeschwindigkeit", "Klangänderung" usw. ausgetauscht werden können. Viele Controller verfügen über ein "Pitch Wheel", das ein Joystick oder ein Modulationsrad ist Der Spieler kann interaktiv die Tonhöhe der aktuell gespielten Note ändern, um manuell ein Vibrato zu erzeugen oder kontinuierlich von einer Note zur nächsten zu "gleiten". Dies geschieht häufig bei Gitarristen, indem er die Bundsaite mit der linken Hand biegt Pitch Bending und damit der Name.

Mit der MIDI-Pitch-Bend-Meldung können Sie kommunizieren, wie viel Pitch-Shifting zu einem bestimmten Zeitpunkt stattfinden soll. Ein Synthesizer (Software oder Hardware), der eine Pitch Bend-Nachricht empfängt, soll die Tonhöhe aller aktuell gespielten Noten um den angegebenen Betrag ändern.

Die Controller-Nachricht hat ein Argument, das von -8192 bis 8191 reicht, und in Standard-MIDI-Dateien soll dies den Bereich von -200 Cent bis 200 Cent abdecken, wobei 1 Cent 1/100 Halbton ist, dh ein Verhältnis von 2 ^ ( 1/1200) = 1.000577789506555. Beispiel: Um eine Tonhöhenverschiebung nach unten zu erzeugen, um 93% der Nennfrequenz zu erreichen, wäre der Reglerwert

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

oder -5146 in diesem Fall. 0,93 ist das gewünschte Verhältnis, 12 die Anzahl der Halbtöne pro Oktave, 2 der maximale Tonhöhenbiegebereich (in diesem Fall 200 Cent oder 2 Halbtöne) und log2 () der Logarithmus mit Basis 2.

Bei den meisten Synthesizern ist der Bereich jedoch konfigurierbar, und es ist wahrscheinlich keine gute Idee anzunehmen, dass sich alle Synthesizer gleich verhalten.

Hier ist eine Umrechnungstabelle, die helfen kann. http://www.elvenminstrel.com/music/tuning/reference/pitchbends.shtml

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.