Arduino: verschluckt MIDI-Noten

Orgel

Orgel

....
Hallo,

ich habe ein Programm auf einem Arduino UNO, welches prüft ob ein bestimmtes Note-On/Off-Event von einem bestimmten MIDI-Kanal eintritt. Ist dies der Fall wird das Event an einen anderen Kanal weitergeleitet.

Das Programm läuft zwischen zwei Geräten, wobei der Sender nur auf Kanal Acht kann, der Empfänger nur auf Kanal Zehn. Leider kann man es bei beiden nicht verstellen.

So weit, so gut. Dennoch werden verschieden Noten verschluckt und kommen beim Gerät nicht an. Bedeutet, wenn der Sender 16tel Noten spielt, wird immer mal eine nicht ausgegeben. Das ist mir zu unzuverlässig. Ich hatte das Programm zunächst mit dem Auslesen der Seriellen-Schnittstelle gemacht, schneller und stabiler erscheint mir aber Midi.h (Midi Library).

Wie kann man das optimieren das es keine Aussetzer gibt?

Ich habe den recht einfachen Code einmal angeheftet.

Code:
#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  MIDI.setHandleNoteOn(handleNoteOn);
  MIDI.setHandleNoteOff(handleNoteOff);
  MIDI.begin(8);
}

void loop() {
  MIDI.read();
}

boolean validPitch(byte pitch) {
  return pitch == 36 || pitch == 38 || pitch == 40 || pitch == 41 || pitch == 43 || pitch == 45 || pitch == 47 || pitch == 48;
}

void handleNoteOn(byte channel, byte pitch, byte velocity) {
  if (validPitch(pitch)) {
    MIDI.sendNoteOn(pitch, velocity, 10);
  }
}

void handleNoteOff(byte channel, byte pitch, byte velocity) {
  if (validPitch(pitch)) {
    MIDI.sendNoteOff(pitch, velocity, 10);
  }
}
 
Ich habe keine Ahnung. Aber was macht denn die Methode read() - einfach nur Eingang abfragen oder hat die Library intern einen FIFO? Falls nicht könnte hier das Problem liegen.
 
Ich tippe mal das read() läuft über Polling. Und wenn dann die Send-Methoden noch auf das TXC Flag warten, dann kann das schonmal passieren denke ich.
 
Ich kenne diese Library nicht, aber über den seriellen Port ("HardwareSerial") ist MIDI auf dem Arduino / Atmega mit 100 % Zuverlässigkeit möglich. Bei Verwendung von "SoftwareSerial" und anderen Pins kann es durchaus zu Aussetzern kommen.

Ich würde mal testen, ob es mit deinem ersten Ansatz (Serial-Port direkt lesen) auch zu den Aussetzern kommen. Wenn nicht, ist wohl die Library schuld.
 
Ich würde schon behaupten das die Library meinen hausbackenen Auslesekünsten etwas überlegen ist. Es zeigt sich nun doch, das der Fehler doch an einer anderen Stelle liegt.

Die Noten werden tatsächlich gesendet, doch beim Gerät werden diese nicht immer korrekt interpretiert und so kommt es zu Aussetzern. Bei anderen Empfängern funktioniert es auch prächtig, da wird nichts ausgelassen.

Aber ich habe auch eine Lösung: Empfang über Hardware Serial, Senden über Software Serial. Etwas albern, aber funktioniert nun ohne Aussetzer :D

Meine Befürchtung, das Arduino UNO kommt nicht hinterher die paar Noten weiterzuleiten, kann ich abhaken. Ein Test mit 96 Noten pro Takt auf allen Kanälen zeigt: Das kommt alles an. Lag wohl also wieder mal am «Endgerät» :P
 


News

Zurück
Oben