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

Freitag, 10. April 2009

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:

1
2
3
4
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.

1
2
3
4
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.

1
2
3
4
5
6
7
8
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

1
2
3
4
5
6
7
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:

1
2
3
4
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:

1
2
3
4
5
6
7
8
9
10
11
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;