Midi an Leonardo schicken über USB (mit Midi Controller)

Hallo,

Ich benötige bitte Hilfe für mein Projekt!

Ich habe ein Playtronica/Playtron (midi board) welches an meinem Laptop angesteckt ist. Ich habe ebenfalls eine Arduino Leonardo Board, welches an meinem Laptop angesteckt ist, beide über USB Anschlüsse. Ich nutze als Programmieroberfläche Platform IO in Visual Stuido Code. Ich habe die Software Hairless Midi auf meinem Laptop. Ich möchte nun, wenn ein Midi Input vom Playtronica kommt, das mein Plattform IO das erkennt und es wie einen Input behandelt und ich dann einen Output auf meinen Arduinoboard triggern kann. Also die schnittstelle zwischen Playtron und Arduino board ist mein Laptop.

Mein Hairless Midi sieht so aus:

Mein Serial Port is COM4, das ist der selbe Port an dem mein Arduino angesteckt ist.
Midi In ist das playtron.
Midi out ist leer. (soll hier etwas ausgewählt sein?)

Den FTDI Driver hab ich auch schon runtergeladen und meine Laptop neu gestartet. Aber leider geht die Anzeige nicht weg.

Hier ist mir aufgefallen, wenn ich dan Haken bei Serial <-> M weg und wieder hin mache, leuchte die RX Lampe am Arduino auf. Also es tut sich schon was. Nur beim Code tut sich nichts.

Das ist mein platform.ini:

image

Hier mein Code: (einer von vielen, bis jetzt hat noch keiner Funktioniert)

#include <Arduino.h>
#include <MIDI.h>

// Definiere den Pin für die LED
const int ledPin = 13;

void setup() {
  // Initialisiere die serielle Kommunikation mit einer Baudrate von 115200
  Serial.begin(115200);
  
  // Setze den Pin für die LED als Ausgang
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // Überprüfe, ob Daten von der seriellen Schnittstelle empfangen wurden
  if (Serial.available() > 0) {
    // Lies das empfangene Byte
    byte midiByte = Serial.read();
    
    // Überprüfe, ob das empfangene Byte ein MIDI-Note-On-Befehl ist
    if (midiByte == 144) { // 144 ist der Statusbyte für Note-On auf Kanal 1
      // Schalte die LED ein
      digitalWrite(ledPin, HIGH);
    } else if (midiByte == 128) { // 128 ist der Statusbyte für Note-Off auf Kanal 1
      // Schalte die LED aus
      digitalWrite(ledPin, LOW);
    }
  }
}

Hab auch schon andere Codes probiert, leider leuchtet nie die Led auf wenn ich eine Note am Playtron spiele.
Ich denke die Noten kommen am Laptop an, aber sie werden nur nicht richtig an den Arudino weitergeleitet, bzw kann er sie nicht erfassen/lesen.

Ich hoffe jemand von euch kann mir weiterhelfen dass ich an meinem Projekt weiterarbeiten kann.

Mal 'ne grundsätzliche Frage: Der Leonardo kann sich doch direkt als MIDI Device am PC anmelden (Lib MIDIUSB.h). Dann ist der auf dem PC direkt als Midi-Gerät ansprechbar, und Du brauchst das alte HairlessMIDI gar nicht mehr. Warum machst Du das also nicht direkt, sondern über den Umweg?
P.S. zusätzlich bleibt dir die Serielle Schnittstelle dann noch für's debugging frei.

Ich glaub' er will das Midi-Eingabegerät mit dem Eonardo verbinden - über den M$-PC. Ob das gut geht weiß ich nicht (M$ ist nicht meine Welt).

Ich hätte gern die Schnittstelle von meinem Laptop, weil das dann noch anderswertig fürs Projekt relevant ist. Darum gehe ich diesen Weg. Und darum hoffe ich auf diesem Weg eine Lösung zu finden.

Welche Schnittstelle meinst Du da? Normalerweise kann ein Laptop doch Midi am USB.
Ich hab' Keyboard und Synthesizer über einen Arduino am Laptop-USB hängen. Der Laptop erkennt den Arduino einfach als Midi Device. Da geht senden und empfangen. Und das schöne ist, dass der Arduino über das gleiche Kabel auch die serielle Schnittstelle nutzen kann. Da kannst Du parallel zum Midi-Signal auch den seriellen Monitor zum Debuggen nutzen.
Kennst Du MIDI-OX? da kannst Du alle deine MIDI Geräte auf dem Laptop über virtuelle Kabel frei verbinden. Und kannst auch anschauen, was da an MIDI Kommandos über diese virtuellen Kabel übertragen wird.

Ich möchte eben mein Arduino am Laptop hängen haben und mein MidiBoard am Laptop hängen haben, und nicht das Das Midi Gerät direkt am Arduiona hängt. Das mein ich als "Laptop Schnittstelle". Das im Laptop die Midi Daten ankommen und der Arduino das erkennt und drauf reagiert. Das gewisse Lichter angehen, wenn bestimmte Töne gespielt werden. Und das funktiniert eben noch nicht, aus welchen Gründen auch immer.

Musst Du ja auch nicht machen. Dann hast Du am Laptop eben 2 USB MIDI Geräte und überträgst vom einen zum anderen. Nur der Weg über ein serielles Gerät am Laptop mit Umsetzung über HairlessMidi ist unnötig. HairlessMidi ist auch outdated, und wird seit über 10 Jahren nicht mehr gepflegt. Das braucht man höchstens noch für Prozessoren, die nicht direkt MIDIUSB können. Der Leonardo kann das aber. Wenn ein entsprechender MIDI Befehl ankommt, schaltest Du einfach deine Leds.

[EDIT] Das mit dem FTDI Treiber ist auch sehr seltsam. Der Leonardo hat einen nativen USB Anschluß und braucht daher keinen getrennten seriell-USB Umsetzer. Was sagt denn der Gerätemanager über die Com4-Schnittstelle? Und funktioniert das Übertragen zum seriellen Monitor?

Okay, danke für die Info! Jetzt würde ich folgenden Code probieren.

#include <Arduino.h>

#include <MIDI.h>


MIDI_CREATE_DEFAULT_INSTANCE();


const int ledPin = 13; // Die LED ist am Pin 13 angeschlossen

void setup() {
  pinMode(ledPin, OUTPUT);
  MIDI.begin(MIDI_CHANNEL_OMNI); // MIDI-Kanal festlegen
}

void loop() {
  // MIDI-Signal empfangen
  if (MIDI.read()) {
    // Wenn ein MIDI-Signal empfangen wird, schalte die LED ein
    digitalWrite(ledPin, HIGH);
    // Warte eine kurze Zeit, um die LED eingeschaltet zu lassen
    delay(1000);
    // Schalte die LED wieder aus
    digitalWrite(ledPin, LOW);
  }
}

leider reagiert meine lampe aber nicht auf den midi input, auf meinen midiboard sehe ich aber (auch durch kleine LEDs) das die inputs funkionieren.
Brauch ich eine andere Libary, oder vllt einen Treiber für mein MIDI Board? Woran kann es liegen das sich beim Arduino nichts tut?

Wenn Du den Leonardo als MIDI-Gerät am Laptop anmelden willst, brauchst Du auch die MIDIUSB-Lib Das geht dann am PC auch nicht mehr über die Com-Schnittstelle, sondern als Verbindung von MIDI Geräten ( der Leonardo taucht dann im Gerätemanager als MIDI-Device auf).

ok, mein arduino is jetzt als Midi Gerät eingestufft. Das ist der Code direkt von der Libary:

#include <Arduino.h>
/*
 * MIDIUSB_test.ino
 *
 * Created: 4/6/2015 10:47:08 AM
 * Author: gurbrinder grewal
 * Modified by Arduino LLC (2015)
 */ 

#include "MIDIUSB.h"

// First parameter is the event type (0x09 = note on, 0x08 = note off).
// Second parameter is note-on/note-off, combined with the channel.
// Channel can be anything between 0-15. Typically reported to the user as 1-16.
// Third parameter is the note number (48 = middle C).
// Fourth parameter is the velocity (64 = normal, 127 = fastest).

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
}

void setup() {
  Serial.begin(115200);
}

// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

void loop() {
  midiEventPacket_t rx;
  do {
    rx = MidiUSB.read();
    if (rx.header != 0) {
      Serial.print("Received: ");
      Serial.print(rx.header, HEX);
      Serial.print("-");
      Serial.print(rx.byte1, HEX);
      Serial.print("-");
      Serial.print(rx.byte2, HEX);
      Serial.print("-");
      Serial.println(rx.byte3, HEX);
    }
  } while (rx.header != 0);
}

Leider wird nichts ausgegeben.

Schickt denn dein PC auch was an dieses Gerät? Wie schon erwähnt, benutze ich den MIDI-OX für das Routing der MIDI-Signale auf dem PC/Laptop. Da kann man sehr flexibel konfigurieren und testen wer welche MIDI-Signale wohin schickt. Irgend sowas brauchst Du ja auch. Zum Testen kann man da auch MIDI-Signale über die Tastatur erzeugen.
[EDIT]Ein Schnelltest mit einem Leonardo und dem Beispiel aus der Lib und MIDI-OX hat auf Anhieb funktioniert. Da wo im Beispiel die MIDI Kommandos auf dem ser. Monitor ausgegeben werden, kannst Du einfach deine LEDs ein/ausschalten.

Probier' mal SendMidi:

Wir probieren gerade MIDI-OX. Der Input ist hier Playtron, soll dann der Output Leonardo sein?

Wenn MIDI da ankommen soll schon :wink: - wobei Du mit MIDIOX die Signale auch parallel an mehrere Ausgänge schicken kannst.

Wir empfangen Signale am Arduino!!!!!!! :star_struck: Ich danke dir sehr! MidiOX war hier die Lösung! Jetzt können wir entdlich weiter arbeiten! Danke!

Super :+1: :+1:

1 Like

Anschlussfrage: Weißt du ob MIDI-OX auch Routen kann, wir brauchen nähmlich den Midi Input vom Playtron zwei mal, einmal fürs Arduino und einmal für Resolum. Ich habe mit LoopMidi schon einen Virtuellen Port erstellt, aber weiß nicht ob ich in OX jetzt routen kann. Ich hätte das jetzt so gemacht in Midi-OX:
image
Funktioniert aber leider nicht das wir einen Midi SIgnale bekommen in Resolume.

Resolume sagt mir jetzt gar nichts. Stellt das ein MIDI Device zur Verfügung? Wenn ja, sollte man das in MIDI-OX direkt ansprechen können. Auf jeden Fall kann MIDI-OX einen INPUT auf 2 unterschiedliche OUTPUT ausgeben. Das habe ich schon gemacht.

EDIT:
Es funktioniert, wir haben mal alle Programme geschlossen und wieder geöffnet. :slight_smile:

Resolume ist eine Software, wie benötigen sie um verschiedene Clips abzuspielen. Und man kann die Auswahl der Clips mitteln einem Midi Controller steuern. Nur ist unser Midi Controller ja "belegt" und kann für diese Software nicht verwendet werden. Jetzt habe ich mit MIDI Loop einen Port erstellt, und den Input von unserem Playtronica auf 2 Outputs aufgeteilt in MIDI-OX. Einmal wirds ans ArduinoBoard gesendet und einmal an den Virtuellen Port. Den Virtuellen Port nehme ich dann in Resolume als Midi Input und Output her. Aber leider empängt sie Software Resolume keine Noten :confused:

Du kannst ja die empfangenen MIDI-Daten vom Arduino an de PC zurückschicken.