Midi Daten mit Arduino live bearbeiten?

Ich habe ein Keyboard mit dem ich die Midi Daten per USB an meinen PC sende. Dort kann ich den Klang mit dem Programm pianoteq bearbeiten.

Leider sendet mein Keyboard recht schwache Lautstärkedaten (Velocity) was zu einem sehr dumpfen Klang führt.

Meine Überlegung:

Ein Arduino empfängt die USB-Midi-Daten, rechnet auf Velocity immer 30 drauf und sendet die neuen Midi-Daten sofort per USB weiter an den PC.

Gibt es einen Arduino mit zwei nutzbaren USB Schnittstellen?

Ist die Datenbearbeitung schnell genug um nicht die Latenzzeit(Verzögerung) merkbar zu erhöhen?

Hat jemand einen guten Link dazu? Kenne mich mit Arduino-Midi nicht aus.

Aus meiner Sicht völlig falscher Ansatz.

  • bei (halbwegs) vernünftigen Keyboards läßt sich die Anschlagstärke zumindest in groben Stufen einstellen
  • bei (halbwegs) vernünftigen Programmen läßt sich die ankommende Anschlagstärke anpassen

Erst wenn beides tatsächlich nicht gegeben ist würde ich mir weitere Gedanken machen (z.B. was vernünftiges kaufen :smiley: )

Haste beides ausgelotet?

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:

...
Serial.begin(31250);
...
  for(note=0x1e; note < 0x5a; note++)
  {
      cmd=0x90;
      velocity=127;

      midi_send(cmd, note, velocity);
      flash();
      delay(100);

      midi_send(cmd, note, 0);
  }
...
void midi_send(int cmd, int pitch, int velocity)
{
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}
...

Gruß

Gregor

Und kennt ihr ein Arduino mit 2 nutzbaren USB?

Mega mit SerialToUSB-Adapter auf Serial 1...2 oder UNO/NANO mit Softserial+Adapter

Gruß Tommy

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.

Gruß

Gregor

Nachtrag: Siehe hier und hier.

Hab mir mal die Library MidiUSB geladen.

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.

Hat jemand Erfahrung damit?

Hallo,

stoni99:
und einem Arduino mit "nativer USB capabilities" funktionieren. Also warscheinlich nur mit Genuino 101 and friends...

Erfahrung mit Midi habe ich selber nicht.

Aber wenn ich die defines in der oben verlinkten Library richtig deute, sind die unterstützten Boards:

AVR : Leonardo bzw. Micro (haben gleichen Prozessor Atmega 32U4)
SAM : Due
SAMD : wahrscheinlich der Zero

Außerdem gibt es die Lib in einer Variante für den Teensy, da wird sie bei der Installation in die Arduino IDE mitgeliefert.

Hmm, bekomm es nicht auf die Reihe:

Einen Uno mit USB2Serial an 1 (TX).

Testprogramm geladen:

/*
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.

Was mache ich falsch?

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.

Gruß Tommy

Ja, raushusten ist gut ausgedrückt! :grin:

Will ja erst mal testen.

Wie gesagt: Hab keine Ahnung von MIDI.

Bridge? Keine Ahnung - wo kann ich nachsehen?

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.

Meinst du sowas: Hairless Midi serial Bridge?

Hmm, wird bei Midi-In auch nix erkannt,

Wenn ich mir bei Hairless Midi den Datenfluß anzeigen lasse kommen merkwürdige Befehle:

......
Note off velocity 56
Programm change 0
Note %2 off velocity %3
......

Warum ignorierst Du das Posting #10?

Gruß Tommy

Tommy56:
Warum ignorierst Du das Posting #10?

Gruß Tommy

Niemals!

Geht auch mit dem internen USB Wandler nicht.

Wenn ich bei Hairless Midi serial Bridge 115200 baud und im Testprogramm auch 115200 einstelle bekomme ich im Monitor sinnvolle Daten angezeigt.

Aber die Midi Geschwindigkeit soll wohl bei 31250 liegen?!

Mit MIDI kenne ich mich nicht aus. Ich wollte nur vermeiden, dass Du Deine Serial2USB-Wandler zerlegst.

Gruß Tommy

Ich probier das demnächst mal hier aus. Kann aber ein paar Tage dauern.

Eins verstehe ich nicht:

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.