Teensy 3.2. USB Midi In

Hallo zusammen,

ich versuche mich gerade am Empfang von Mididaten per USB mit Teensy 3.2 .
Zur Kontrolle empfangener NoteOn / Off Daten wird diie LED an PIN 13 ein- und ausgeschaltet.

int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
  usbMIDI.setHandleNoteOff(OnNoteOff);
  usbMIDI.setHandleNoteOn(OnNoteOn) ;
}

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

void OnNoteOn(byte kanal, byte note, byte velocity) {
  digitalWrite(ledPin, HIGH);
}

void OnNoteOff(byte kanal, byte note, byte velocity) {
  digitalWrite(ledPin, LOW);
}

Das funktioniert auch alles.

Die LED wird dabei aber bei jeder NoteOn / Off Meldung geschaltet.

Was muss im Sketch geändert werden um die LED nur bei bestimmten (zB Note 50) oder mehreren
Noten zu schalten ?

Eine änderung auf zB

void OnNoteOn(byte 1, byte 50, byte 127)
void OnNoteOff(byte 1, byte 50, byte 0)

funktioniert nicht, - Fehlermeldung beim kompilieren:
'OnNoteOff' was not declared in this scope...

Grüsse

Nun, Du hast da 2 Funktionen dennen Du jeweils 3 Parameter übergibst.

OnNoteOn(byte kanal, byte note, byte velocity)

OnNoteOff(byte kanal, byte note, byte velocity)

Aber Du wertest die Parameter in der funktion nicht aus, sondern sagst nur :

digitalWrite (ledPin, HIGH);
oder
digitalWrite (ledPin,LOW);

Da Du in Deinen Funktionen keinerlei bedinungen stellst, nach welchem Wert die Led an oder aus sein soll, tut sie das eben bei jedem Aufruf der Funktion.

Hi Deltaflyer,

vielen Dank für die Info !

Hab das jetzt mal so versucht:

int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
  usbMIDI.setHandleNoteOff(OnNoteOff);
  usbMIDI.setHandleNoteOn(OnNoteOn) ;
}

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

void OnNoteOn(byte kanal, byte note, byte velocity) {
  if (OnNoteOn  = 1,60,127)
  digitalWrite(ledPin, HIGH);
}

void OnNoteOff(byte kanal, byte note, byte velocity) {
  if (OnNoteOff  = 1,60,0)
  digitalWrite(ledPin, LOW);
}

Lässt sich aber nicht kompilieren:

MIDI_empfangen_mit_LED:19: error: cannot convert 'int' to 'void(byte, byte, byte) {aka void(unsigned char, unsigned char, unsigned char)}' in assignment
assignment of function 'void OnNoteOn(byte, byte, byte)'

Grüsse

Versuche es mal so (ungetestet):

void OnNoteOn(byte kanal, byte note, byte velocity) {
  if ((kanal == 1) && (note == 60) && (velocity == 127))
  digitalWrite(ledPin, HIGH);
}

PS: Gibt es ein freies Programm, das ich mir zum Testen von MIDI installieren könnte?

Du musst , wenn ich jetzt Deine Werte nehme, so abfragen:

void OnNoteOn(byte kanal, byte note, byte velocity) {
  if (kanal == 1 && note == 60 && velocity == 127)
  digitalWrite(ledPin, HIGH);
} 


void OnNoteOff(byte kanal, byte note, byte velocity) {
  if(kanal == 1 && note == 60 && velocity == 0)
  digitalWrite(ledPin, LOW);
}

Wenn es egal ist, welchen wert 'kanal' und 'note' haben und nur 'velocity' bestimmt ob ein oder ausgeschaltet wird , dann geht auch:

void OnNoteOn(byte kanal, byte note, byte velocity) {
  if (velocity == 127)
  digitalWrite(ledPin, HIGH);
}
 
void OnNoteOff(byte kanal, byte note, byte velocity) {
  if(velocity == 0)
  digitalWrite(ledPin, LOW);
}

LG Stefan
p.s Agmue war mal wieder schneller im schreiben. *LOL

Deltaflyer:
p.s Agmue war mal wieder schneller im schreiben. *LOL

Weniger ist schneller, aber nicht unbedingt besser :slight_smile:

Schnelligkeit im schreiben oder programmeieren war noch nie meine Stärke.
Das einzig wirklich schnelle aus meiner Hand sind RC-Strassenfahrzeuge, elektrisch , etwas mehr als 184km/h. :o

Stefan

Hi agmue,

vielen Dank - kompilieren und hochladen geht ! Teste das gerade...

Ich war fälschlicherweise davon ausgegangen das man usbMIDI.read(); direkt mitteilen kann welche NoteOn/ Off gelesen werden sollen...

PS: Gibt es ein freies Programm, das ich mir zum Testen von MIDI installieren könnte?

Ich nehme zum testen MidiOX

Hi Deltaflyer + argmue,

hab das gerade mal mit schalten per Notenwert probiert, klappt:

int ledPin = 13;

void setup() {
 pinMode(ledPin, OUTPUT);
 usbMIDI.setHandleNoteOff(OnNoteOff);
 usbMIDI.setHandleNoteOn(OnNoteOn) ;
}

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

void OnNoteOn(byte kanal, byte note, byte velocity) {
 if (note == 60 ) 
 digitalWrite(ledPin, HIGH);
}

void OnNoteOff(byte kanal, byte note, byte velocity) {
 if (note == 60 ) 
 digitalWrite(ledPin, LOW);
}

wie muss das aussehen wenn ich zB zusätzlich noch mit NoteOn/Off 40 + 80 schalten will ?

Grüsse

Ich würde das mit switch(note){} machen.

habs gerade gefunden, funktioniert zB mit:

  if (note == 80 ||note == 60 ||note == 40)

BTW:
mit MidiOX kann ich von der PC Tastatur aus nur 100 bzw 64 als Velocity Wert senden.
Ist dort scheinbar fest vorgegeben...
Weiß jemand wie man das dort umstellt (auf 127 bzw 0) ?

stingray05:
mit MidiOX kann ich von der PC Tastatur aus nur 100 bzw 64 als Velocity Wert senden.
Ist dort scheinbar fest vorgegeben...
Weiß jemand wie man das dort umstellt (auf 127 bzw 0) ?

Die Frage wäre im MidiOX-Forum evtl. besser aufgehoben.

Gruß Tommy

Test mit Control Change; Channel 1, CC 20, Value 100:

int ledPin = 13;

void setup() {
 pinMode(ledPin, OUTPUT);
 usbMIDI.setHandleControlChange(myControlChange);
}

void loop() {
 usbMIDI.read();
}
void myControlChange(byte channel, byte control, byte value) {
  if(channel == 1 && control == 20 && value == 100)
 digitalWrite(ledPin, HIGH);
 else
 digitalWrite(ledPin, LOW);
}

Funktioniert grundsätzlich, aber die LED bleibt nach dem senden der Daten solange an bis ein anderer CC Wert gesendet wird.

Was müsste geändert werden damit die LED nach senden von CC 20 value 100 aus geht, und erst bei erneuten senden des gleichen Wertes wieder eingeschaltet wird ?

void myControlChange(byte channel, byte control, byte value) {
 static bool ledStatus = 0;    // speichert den led status                       
 if(channel == 1 && control == 20 && value == 100)
 digitalWrite(ledPin, !ledStatus);     // war die led vorher an, wird ausgeschaltet und umgekehrt
 ledStatus = !ledStatus   // neuen led status speichern
}

das static bei 'bool ledStatus' sorgt dafür, dass der wert von ledStstus beim verlassen von 'myControlChange' erhalten bleibt. Da ledStatus hir in der funktion definiert wurde, würde sie ohne static jedesmal neu mit 0 angelegt werden.

Stefan

Hi deltaflyer,

Die LED geht jetzt beim erstmaligen empfangen an und erst wieder aus wenn die selben Daten nochmal empfangen werden.

Gedacht war das etwas anders:
Die LED soll nur kurz und nur für die Dauer des Daten Empfangs eingeschaltet sein, ansonsten aus.

Eigentlich ne Art MidiMonitor zur Sketch Kontrolle...

Wenn die LED nach dem empfangen der Daten anbleibt sähe es eher so aus als würden die CC Daten laufend empfangen werden...

Ah sorry , dann hab ich Deine Anforderung falsch Verstanden.