Midi-Daten in Flash empfangen, Midi-Daten in Flash auswerten, Midi-Daten aus Flash senden

Wir haben für ein Projekt nach einer einfachen Art gesucht, Midi-Signale in Flash zu empfangen und von Flash aus Midi-Signale zu senden. Die Lösungen, die wir im Netzgefunden haben waren teilweise zu kompliziert im Setup oder haben gar nicht funktioniert.

Das Ergebnis ist ein kleines Paket, bestehend aus einer Java-Applikation (wir haben sie „Midimicrobe“ genannt) und einer Klasse für Flash (Midi.as).

Für Eilige:

  1. Midi-Microbe (für Mac OSX) runterladen.
  2. Das Midimicrobe-Programm starten und im Hintergrund laufen lassen.
  3. Den Flash-Testfilm test.swf starten.
  4. Ein Midi-Signal erzeugen (z.B. über ein Keyboard, Trigger Finger oder mit dem kleinen, sehr hilfreichen virtuellen Keyboard MidiKeys und schauen, was passiert!

Mögliche Anwendungsbeispiele für die Flash-Midi-Anbindung:

  • m-audio Trigger Finger oder ein Keyboard verwenden, um Videos, Sounds oder Animationen in Flash zu steuern (eines unserer Motivationen bei der Entwicklung)
  • Sound-Visualiserungen in Flash
  • Auswertung von Sensor-Daten, z.B. von Boden-Sensoren, Touchscreens oder Panels. Eben alles, was Midi-Daten bereitstellen kann – perfekt für Rauminstallationen oder interaktive Ausstellungskonzepte. Schön ist, dass auch die Druckstärke ausgewertet wird – die Messung von Druck, Gewicht etc. wäre möglich.
  • Generieren von Zufalls-Melodien, Intervallen oder Klang-Teppichen in Verbindung mit Musik-Software. In einem einfach Test haben wir z.B. in rhytmischen Abständen per Flash Midi-Daten an Logic gesendet und so interessante Klang-Collagen erzeugen können.

Wir haben versucht, die Klassen und Funktionen so einfach wie möglich zu halten. Im Grunde genügen ein paar wenige Zeilen ActionScript zum Verbinden und Auswerten der Midi-Daten in Flash:

Beispiel 1: Midi-Note in Flash empfangen und ausgeben:

MidiClass = new Midi();
MidiClass.onNoteOn = function (note, velo, channel) {
   trace( note );
}

Beispiel 2: Verbindungsoptionen zu Midi-Geräten: Beim Befehl „new Midi()“ kann optional der gewünschte Midi-Eingang (hier: ein m-audio Trigger Finger) und Midi-Ausgang (Bus 1) angegeben werden.

MidiClass = new Midi("Trigger Finger", "Bus 1");
MidiClass.onNoteOn = function (note) {
   trace( note );
}

Beispiel 3: Angeschlossene Midi-Geräte in Flash zeigen: Alle Geräte anzeigen, die am Rechner angeschlossen sind und als Input bzw. Output genutzt werden können.

MidiClass = new Midi();
MidiClass.get_devices( get_devices_response );
function get_devices_response ( inputs, outputs ) {
   trace("INPUTS:   " + inputs);
   trace("OUTPUTS:  " + outputs);
   MidiClass.input = inputs[2];	    // Midi-Eingang setzen
   MidiClass.output = outputs[1];   // Midi-Ausgang setzen
}

Beispiel 4: Midi-Signal senden: Midi-Signale lassen sich auch von Flash aus senden. Dazu gibt es drei Befehle: sendNoteOn, sendNoteOff und playNote. Für sendNoteOn und sendNoteOff gibt es zwei Schreibweisen:

sendNoteOn( channel, note, velo );

oder alternativ einfach:

sendNoteOn( note, velo );

Bei der letzten Variante wird die Note über Kanal 0 gesendet

MidiClass = new Midi("Bus 1", "Bus 1");
note_on_off_btn.onPress = function () {
   MidiClass.sendNoteOn( 0, 50, 127 );
}
note_on_off_btn.onRelease = function () {
   MidiClass.sendNoteOff( 0, 50, 127 );
}

Beispiel 5: Ton spielen: Der Befehl sendNote schickt einen noteOn-Befehl, wartet dann die angegebene Zeit in Millisekunden und schickt danach ein noteOff. Das folgende Beispiel spielt bei Klick auf einen Button zufällige Töne mit einer Velocity von 127 für 2 Sekunden:

MidiClass = new Midi("Bus 1", "Bus 1");
play_btn.onPress = function () {
   MidiClass.playNote( 40 + random(60), 127, 2000 );
}

Midi-Events in Flash: Hier noch mal eine Übersicht der Events in der Midi-Klasse:

MidiClass = new Midi();
// Wenn Fehler beim Verbinden mit der midimicrobe passiert:
MidiClass.onError = messageFunc;
// Wenn die Verbindung zur midimicrobe geklappt hat:
MidiClass.onConnected = messageFunc;
// Wenn eine Midi-Note empfangen wurde:
MidiClass.onNoteOn = noteOnFunc;
// Wenn ein Midi Note-Off empfangen wurden:
MidiClass.onNoteOff = noteOffFunc
// Wenn ein Midi Note-Change empfangen wurde:
MidiClass.onNoteChange = noteChangeFunc;	

Für Entwickler: Flash-Midi-Schnittstelle einfach machen.

Damit es möglichst wenig Stolpersteine bei der Verwendung der Flash-Midi-Schnittstelle gibt habe ich nach einer Lösung gesucht, das Java-mmj-Paket als festen Bestandteil in die Flash-Midi-Applikation zu integrieren.

Der Vorteil liegt klar auf der Hand: Der Benutzer muss nicht erst die mmj-Bibliothek runterladen und manuell ins Verzeichnis „MacintoshHD -> Library -> Java -> Extensions“ kopieren. Ein Doppelklick auf die Programm-Datei genügt, um die Midi-Flash-Schnittstelle zu starten.

Hier meine Lösung:

  1. Die Processing-Skizze öffnen, über „File -> Export Application“ ein Mac-Programm erstellen.
  2. Im Finder: Rechter Mausklick auf die erstellte Programm-Datei und „Paketinhalt zeigen“. Ein Ordner „Contents“ erscheint.
  3. Die Datei „Contents -> Info.plist“ in einem Texteditor öffnen, nach dem Eintrag für „ClassPath“ suchen. In dem Tag <string> darunter sind die Pfade für die Klassen angegeben, die eingebunden werden sollen.
  4. Direkt nach dem <string> und vor dem ersten „$JAVAROOT…“ folgendes eingeben: „$JAVAROOT/mmj.jar:“. Der Doppelpunkt am Ende ist das Trennzeichen zwischen den Einträgen – wichtig!
  5. Die beiden Dateien „mmj.jar“ und „libmmj.jnilib“ (download hier) in den Ordner „Contents -> Recources -> Java“ kopieren.
  6. Testen…