stoni99:
Hat jemand einen guten Link dazu? Kenne mich mit Arduino-Midi nicht aus.
Einen Link habe ich zwar nicht dazu, dafür etwas aus dem Nähkästchen:
Ich kenne MIDI noch aus Zeiten, als es USB nicht gab und MIDI-Geräte eine fünfpolige „DIN-Buchse“ hatten, aus der die Daten seriell kamen. Die Verbindung zwischen solchen Geräten lief über ein entsprechendes Kabel mit fünfpoligen Steckern an den Enden. Bei einem Keyboard, bei dem der MIDI-Kanal fest auf 0 eingestellt und entsprechend übertragen wurde, habe ich mit einem Uno einen „Kanal-Wechsler“ gebaut. Der hat einfach ein empfangenes MIDI-Datenpäckchen mit einer anderen Kanal-Info bestückt und weitergeschickt
Das funktionierte vollkommen unproblematisch. AFAIR hatte ich damals eine Seite hier bei arduino.cc gefunden.
Hier passende Schnipsel aus einem Sketch von damals:
stoni99:
Und kennt ihr ein Arduino mit 2 nutzbaren USB?
Das kenne ich zwar nicht, aber das war in meinem Fall auch gar nicht nötig: Die Daten vom Keyboard kamen über eine 5 pol. DIN-Buchse auf Pin 0/1 an und wurden via USB an den Computer weitergereicht. Dort konnte ich das MIDI-Signal sofwaremäßig an einen Software-Synthesizer weiterleiten.
Vielleicht erfordert es bei Dir ja nur einen kleinen Aufwand, um das auf ähnliche Weise zu bewerkstelligen.
Die soll wohl nur bei der IDE 1.6.6 und einem Arduino mit "nativer USB capabilities" funktionieren. Also warscheinlich nur mit Genuino 101 and friends...
Bei meinem Genuino 101 meckert die IDE 1.6.10 aber auch. MidiUsb not supportet.
/*
MIDI note player
The circuit:
* digital in 1 connected to MIDI jack pin 5
* MIDI jack pin 2 connected to ground
* MIDI jack pin 4 connected to +5V through 220-ohm resistor
Attach a MIDI cable to the jack, then to a MIDI synth, and play music.
This example code is in the public domain.
*/
void setup() {
// Set MIDI baud rate:
Serial.begin(31250);
}
void loop() {
// play notes from F#-0 (0x1E) to F#-5 (0x5A):
for (int note = 0x1E; note < 0x5A; note ++) {
//Note on channel 1 (0x90), some note value (note), middle velocity (0x45):
noteOn(0x90, note, 0x45);
delay(100);
//Note on channel 1 (0x90), some note value (note), silent velocity (0x00):
noteOn(0x90, note, 0x00);
delay(100);
}
}
// plays a MIDI note. Doesn't check to see that
// cmd is greater than 127, or that data values are less than 127:
void noteOn(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}
Und was passiert: NIX !
Die Programme: Midi Ox / Anvil Studio und piantotec registrieren kein reinkommendes Midi Signal.
Du hustest einfach Midi-Befehle an USB raus - so weit so gut.
Hast Du auf dem PC auch eine entsprechende Bridge am laufen, die die Kommandos an die Midi-Treiber weiterreicht? Also irgendwas, das einen virtuellen Midi-Port bereitstellt auf den Du die Daten losläßt?
An 0 und 1 liegt doch schon die normale USB-Verbindung vom UNO. Was willst Du da mit noch einem Wandler dran? Die dürften im Zweifel gegeneinander arbeiten.
Wenn ich mein Keyboard anschliesse wir es sofort erkannt - auch ohne daß ich eine Taste drücke.
In den Options von pianoteq ist auch "listen to all Midi Inputs" aktiviert.
Vom Keyboard werden die Midi Daten per Usb an den PC gesendet. Ohne extra Treiber o.ä..
Das Programm pianotec erkennt völlig problemlos die ankommenden Daten vom Keyboard.
Mit dem Arduino sende ich auch Midi Daten und bereite sie für Usb auf. Sie werden nicht erkannt und brauchen wohl eine Bridge und extra Wurscht.
Dann müssten doch die Midi Daten vom Arduino "anders" sein. Kann man sie nicht so aufbereiten das der Pc denkt es käme vom Keyboard?
Nö, nicht die Daten. Das Gerät wird unterschiedlich erkannt. Der arduino ist erst mal ein serielles Gerät. Und Dein Keyboard ist ein Midi-Gerät. Das sind für den Rechner ganz unterschiedliche Dinger.