Interaction Design WikiSystems Engineering

MIDI

Das "Musical Instrument Digital Interface" ist ein Protokoll das für den Umgang mit digitalen Instrumenten und Controllern entwickelt wurde.

Per MIDI können Noten (Notes) eingeschaltet (On) und ausgeschaltet (Off) werden, wobei eine Nachricht für den Notenwert (Pitch) und eine weitere für die Velocity (Anschlagsgeschwindigkeit, entspricht Lautstärke) gesendet wird. Dies Aktionen entsprechen der Tastatur auf einem MIDI-Keyboard. Weiter können auch Veränderungen von anderen Werten (Control Change) übertragen werden. Dies entspricht meistens den verschiedenen Reglern auf dem MIDI-Keyboard.

Der Umfang der mit MIDI addressierbaren Werte liegt zwischen 1-127 (entspricht 7 bits). Dies entspricht zB. den Notenwerten C-1 bis G9, oder einer Position z.B. eines Filter Cutoffs zwischen 1 und 127. Für einige Control Paramter wie "Pitch Bend" werden zwei Bytes kombiniert und dadurch kann ein Zahlenraum von 16384 Werten, von -8192 bis 8192, addressiert werden. (ergänzt am 7.12.16., DH)

Tools

Processing Beispiel

Für die Übergabe der Werte von Processing zu anderen Programmen über MIDI verwenden wir die Library “TheMidiBus” (http://www.smallbutdigital.com/themidibus.php). Die Library kann über den Library-Manager bequem installiert werden.

Folgend Ein Programm das eingehende Nachrichten ausgibt und ein Synthesizer per Maus und Tastatur steuert:

import themidibus.*; // MIDI Library importieren

MidiBus myBus; // Kontrollobjekt erstellen

int note, velocity;

void setup() {
  size(800, 800);
  background(0);
  
  MidiBus.list(); // Liste aller Geräte ausgeben
  myBus = new MidiBus(this, "PORT A", "SimpleSynth virtual input"); // "PORT A" als Input auswählen
}

void draw() {}

void mousePressed() {
  note = int(map(mouseX, 0, width, 0, 127));
  velocity = int(map(mouseY, 0, height, 0, 127));
  myBus.sendNoteOn(0, note, velocity); // Note einschalten senden
}

void mouseDragged() {
  myBus.sendNoteOff(0, note, velocity);
  
  note = int(map(mouseX, 0, width, 0, 127));
  velocity = int(map(mouseY, 0, height, 0, 127));
  myBus.sendNoteOn(0, note, velocity); // Note ausschalten senden
}

void mouseReleased() {
  myBus.sendNoteOff(0, note, velocity); // Note ausschalten senden
}

void keyPressed() {
  myBus.sendControllerChange(0, 50, 64); // Controller change senden
}

void noteOn(int channel, int pitch, int velocity) {
  // Eingehen Nachricht ausgeben
  println("Note On: " + channel + " - " + pitch + " - " + velocity);
}

void noteOff(int channel, int pitch, int velocity) {
  // Eingehen Nachricht ausgeben
  println("Note Off: " + channel + " - " + pitch + " - " + velocity);
}

void controllerChange(int channel, int number, int value) {
  // Eingehen Nachricht ausgeben
  println("Controller Change: " + channel + " - " + number + " - " + value);
}