So, nun habe ich mir gestern die grauenhaftesten Möglichkeiten ausgemalt, wie man eine wilde Mischung von kombinierten Akkordknöpfen aus irgendwie eintröpfelnden Einzeltönen zusammenraten kann. Vor allem müssen auch zu allen NoteOn-Befehlen wieder passende NoteOff-Befehle kommen, sonst hat man die berühmten "MIDI-Hänger".
Wenn (wie ich befürchtet hatte) die MIDI-Ausgabe den realistischen Stradella-Tönen entspräche, würde ja bei Überschneidungen eine Note nur einmal ausgegeben - das würde unser Akkord-Ratespiel enorm verkomplizieren.
Aber zum Glück kam ich rechtzeitig auf die Idee, mir Klangbutter MIDI-Beispieldatei mal wirklich genau anzusehen und komplett auszuwerten.
Alle Bassknöpfe nacheinander (Bässe und Akkorde)
Vielen Dank - das war sehr aufschlußreich und hat mir einiges klar gemacht.
Nix quantisiert, sogar alle Controllerdaten drin.
Das ist ja auch gut denn zum Live-Spielen über MIDI ist ja Echtzeit und auch Balgdynamik (die Expression-Meldungsflut) gefragt.
Daß jede Expression-Controllerbefehl dreimal kommt, lilegt wohl daran, daß über Cubase (?) alle drei MIDI-Kanäle (für Diskant, Bässe und Akkorde) in einen Kanal zusammengemischt werden.
Wenn man aber von einer Kanaltrennung ausgeht, reicht es für unsere Betrachtungen, sich auf den CHORD-Kanal zu beschränken.
Die 3 bzw. 4 (bei septime und vermindert) fast gleichzeitig gespielten Töne (liegen ca. 10ms auseinander) werden übers Timing zusammengefasst und ausgewertet und durch das passende Miditelegramm ersetzt.
Mit den (für mich überraschenden) Erkenntnissen aus der MIDI-Datei muß man nicht einmal übers Timing zusammenfassen, sondern weiß genau, auf welche Ereignisse im Datenstrom noch warten muß, bis man mit minimal möglicher Latenz seine "Ergebnis-Note" ausgeben kann...
Anforderungen an eine "D-Mode-Simulation"
Ziel ist es, aus den Einzelnotendaten des "Normal Mode" die zugrundeliegenden Akkordknöpfe eindeutig und sicher zu bestimmen (auch bei Kombination von mehreren Akkordknöpfen) und pro Akkordknopf eine einzige MIDI-Note (den
Grundton) auszugeben. Die Unterscheidung zwischen den Akkordarten Dur, Moll, Septim, vermindert soll über die Oktavlage geschehen:
- Dur-Akkorde: kleine Oktave (MIDI-Noten von C3 bis B3 bzw. 48-59)
- Moll-Akkorde: eingestrichene Oktave (MIDI-Noten von C4 bis B4 bzw. 60-71)
- Septakkorde: zweigestrichene Oktave (MIDI-Noten von C5 bis B5 bwz. 72-83)
- Verminderte Septakkorde: dreigestrichene Oktave (MIDI-Noten von C6 bis B6 bzw. 84-95)
Diese Einzeltöne dienen dazu, komplette Akkord-Samples anzusteuern, so daß Gitarren-Akkorde tatsächlich wie "echte" Gitarrenakkorde (also mit echten typischen Gitarren-Voicings) klingen und nicht aus drei "Stradella-Noten" mit Gitarrensound zusammengebastelt werden müssen.
Heureka!
Aus Klangbutters Datei ließen sich Gesetzmäßigkeiten des "Normal Mode" erkennen, die es sogar recht einfach machen, eindeutig, sicher und schnell die korrekte D-Mode-Ausgabe zu erzeugen.
Ein Akkordknopf löst im MIDI-Datenstrom 3 oder 4 direkt aufeinanderfolgende NoteOn- bzw. NoteOff-Befehle aus. Diese werden durch nichts unterbrochen, nicht einmal Controller-Meldungen!
- Alle Akkorde werden (auch bei mehreren gleichzeitig gedrückten Knöpfen) stets vollständig mit allen Tönen ausgegeben (also notfalls z. B. mehrmals mal E3)
- Zur Sicherheit: Bei mehreren gleichzeitig gedrücken Knöpfen werden die Töne nicht vermischt, sondern kommen immer schön nacheinander - Akkordknopf für Akkordknopf
- Die Töne eines Akkords kommen immer in einer bestimmten Reihenfolge: Nicht nach Tonhöhe o. ä. sortiert, sondern immer nach ihrer Rolle im Akkord sortiert:
1. Ton immer Grundton, 2. Ton immer Terz, 3. Ton bei Dur/Moll Quinte, sonst Septime. Bei 7 und dim7 kommt noch als 4. Ton die Quinte hinzu.
- Die erste Akkord-Note (der Grundton) liegt zwischen C2 und B3 (36-59)
- Alle weiteren Akkord-Noten liegen zwischen C3 und B3 (48-59)
Algorithmus
Weil MIDI eine serielle Schnittstelle ist, gibt es keine Gleichzeitigkeit, sondern die Noten werden einzeln nacheinander übertragen. Dies geschieht jedoch so schnell, daß man die Töne eines Akkords als gleichzeitig angeschlagen empfindet.
- Wir hängen uns in den Datenstrom und warten auf den ersten NoteOn- oder NoteOff-Befehl.
Jetzt kann unsere Akkord-Erkennung starten:
Die erste Note (nennen wir sie NOTE) ist auf jeden Fall der Grundton. Wir können den Grunton TONIC jetzt schon setzen, müssen aber darauf achten, daß er in der eingestrichenen Oktave landen soll. Einen "OFFSET" (die Oktaverschiebung der Ausgabe zur Kennzeichnung von Dur, Moll, Septim...) initialisiern wir erst einmal:
OFFSET = 0
IF NOTE < 48
XXTONIC = NOTE + 12
ELSE
XXTONIC = NOTE
Warten auf die 2. Note...
- Die zweite Note (neuer Wert von NOTE) ist immer die Terz. Wenn groß ist, haben wir einen Dur- oder Septakkord, wenn sie klein ist, haben wir einen Moll- oder verminderten Akkord.
Da innerhalb der Oktave die Terz-Note über oder unter dem Grundton liegen kann, entspricht eine Notennummer-Differenz von 3 oder -9 einer kleinen Terz und wir setzen in diesem Fall den Oktav-OFFSET um 12 (12 Halbtöne nach oben entspricht einer Oktave nach oben) hoch:
INTERVAL = NOTE - TONIC
IF INTERVAL = 3 OR INTERVAL = -9
XXOFFSET = OFFSET + 12
Warten auf die 3. Note...
- Wenn die 3. Note die reine Quinte zum Grundton ist, haben wir einen Dur- bzw Moll-Akkord und sind fertig. OFFSET wurde ja schon bei der Terz gesetzt.
Glücklicherweise wird bei 7 und dim7 als 3. Note immer die Septime übertragen, so daß man eindeutig erkennen kann, ob noch ein vierter Ton folgt oder nicht.
INTERVAL = NOTE - TONIC
IF NOT (INTERVAL = 7 OR INTERVAL = -5)
XXOFFSET = OFFSET + 24
XXund Nächste Note (4. Note) "verschlucken"
NOTE + OFFSET ausgeben und fertig!
Am Ende enthält TONIC den Grundton, und wenn man OFFSET dazuaddiert, hat man die Einezlnote, die im D-Mode ausgegeben werden muß.
Dadurch, daß man gezielt auf die Akkordnoten wartet, kann man sofort die "Lösungsnote" ausgeben, sobald der Akkord klar ist und man muß nicht einmal einen "kurzen Zeitrahmen" abwarten, ob noch etwas kommt.
Also vollkommen "Event-gesteuert" und es gibt auch keine zeitlichen Unschärfen bei sehr schnell oder gleichzeitig gedrückten Knöpfen.
Viele Grüße
Torsten