Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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). Diese müsst ihr herunterladen und in euer Processing-Library-Verzeichniss kopieren (z.B. “Users/itz/Documents/Processing/libraries/). Dann stehen euch die Funktionen der Library zur Verfügung.

Es gibt im wesentlichen zwei Arten von Midi Signalen, welche ihr mit Hilfe der MidiBus-Library erstellen könnt. Diese orientieren sich an den Signalen, die ihr auch mit den Midi-Keyboards auslösen könnt.

1. sendMidiNote(channel, pitch, velocity)
channel = Kanal auf dem gesendet wird
pitch = Tonhöhe
velocity = Anschlag

Die Funktion sendMidiNote() könnt ihr verwenden, wenn ihr ON/OFF Events an MuLab übergeben möchtet. Sie entspricht den Tastenanschlägen auf der Midi-Tastatur. 

2. sendControllerChange(channel, number, value)
channel = Kanal auf dem gesendet wird
number = Nummer des Controllers
value = Wert der gesendet werden soll

Die Funktion sendControllerChange() wird verwendet, falls eine kontinuierliche Veränderung hervorgerufen werden soll. Sie entspricht dem drehen eines Reglers aus der Midi-Tastatur.

Im folgenden ein kleines Beispiel, das demonstriert, wie sowohl eine MidiNote, wie auch ein ControllerChange gesendet werden kann.

...

languagejava
titleBeispiel MIDI Senden
collapsetrue

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:

Code Block
import themidibus.*; //Import MidiBus library MIDI Library importieren

MidiBus myBus; //Name forKontrollobjekt theerstellen
Instance
ofint MidiBus
//Values for sending a note
int channel = 1;
int pitch = 64;
int velocity = 127;
//Values for sending a controllerChange
int number = 20;
int value = 0;
int oldValue = 0;

void setup()
{
  size(400, 400);
  background(0);
  MidiBus.list(); // List all available Midi devices
  myBus = new MidiBus(this, "", "P5toMIDI"); //Mac
  //myBus = new MidiBus(this, "", ""); //Win
}

void draw()
{
  valuenote, 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));
  ifvelocity (value!=oldValue)
  {
  int(map(mouseY, 0, height, 0, 127));
  myBus.sendControllerChangesendNoteOn(channel0, numbernote, valuevelocity); // Note ausschalten senden
}

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

void keyPressed() {
  switch(key)
  {
  case ‘a’:
    myBus.sendNoteOn(channel, pitch, velocity); // Send a Midi noteOn
    break;
  }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 keyReleased(noteOff(int channel, int pitch, int velocity) {
  // Eingehen Nachricht ausgeben
  switch(key)
  {
  case ‘a’:
    myBus.sendNoteOff(channel, pitch, velocity); // Send a Midi nodeOff
    break;
  }
}

println("Note Off: " + channel + " - " + pitch + " - " + velocity);
}

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