E-piano MIDI SerialPrint

Hallo zusammen,

ich bin ein kompletter Arduino-Neuling und möchte in meinem derzeitigen Projekt, Piano-Töne über MIDI in Licht umwandeln.

Ich bin mit einem Arduino Uno und einem Midi Shield ausgestattet und habe das Midi Kabel über Midi-IN angesteckt. Und jetzt wollte ich erst einmal die Channel und Velocity etc. anschauen, um damit weiter zu arbeiten. Jedoch kommt im Seriellen Monitor nur die Zahl 1, die gesamte Zeit über, egal ob ich Tasten drücke oder nicht.

Frage ist also, wie ich an die genannte Werte drankomme.

LINK zum MIDI-Shield:
https://ebay.to/2ZvI8ol

So sieht es gerade bei mir aus:

int MidiWert = 0;


void setup() {

Serial.begin(9600);

}

void loop() {

MidiWert = digitalRead(0);
Serial.println(MidiWert);

}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Welchen anderen Wert als 0 oder 1 erwartest Du von digitalRead?

Gruß Tommy

Edit: Ein Link zum Midishield wäre auch sinnvoll.

svenjasProjekte:
ich bin ein kompletter Arduino-Neuling und möchte in meinem derzeitigen Projekt, Piano-Töne über MIDI in Licht umwandeln.

Von Deinem Ziel bist Du noch ein ganzes Stück entfernt, lasse Dich nicht entmutigen :slight_smile:

svenjasProjekte:
... einem Midi Shield ...

Da könnte es mehrere geben, welches hast Du?

Sollte es das SparkFun MIDI Shield sein, hast Du Dir das MIDI Shield Hookup Guide durchgelesen? Bei "Arduino Compatible I/O" siehst Du, daß die Tasten an D2 bis D4 angeschlossen sind.

Ein Vorschlag (ungetestet):

const byte tasterPin = 2
bool MidiWert = 0;

void setup() {
  Serial.begin(9600);
  pinMode(tasterPin, INPUT_PULLUP);
}

void loop() {
  MidiWert = digitalRead(tasterPin);
  Serial.println(MidiWert);
  delay(100);
}

Sicher dass die digitalRead() willst um MIDI auszulesen?

An Pin 0 und 1 solltest du auch keine Taster anschließen. Da hängt schon die USB Schnittstelle

svenjasProjekte:
Frage ist also, wie ich an die genannte Werte drankomme.

Experimentiere am besten erst einmal nur mit dem Uno und benutze die Pins 0 und 1 für das MIDI-Signal. Als ich mit Uno und MIDI gespielt habe, habe ich zunächst lediglich eine Tonfolge per MIDI ausgegeben. Blöderweise ist dadurch die einzige serielle Schnittstelle blockiert - Abhilfe könnte zumindest testweise „Softwareserial“ sein, wobei das für den Empfang nicht absolut zuverlässig funktioniert.

Mein erstes MIDI-Testprogramm:

// MIDI

// Anschluss (DIN-Buchse von der Lötseite/hinten gesehen):
// - Der mittlere Anschluss ist mit der Abschirmung verbunden
//   und geht an GND
// - Der rechte Anschluss geht über einen 220-Ohm-Widerstand
//   an +5V
// - Der linke Anschluss geht an TX

byte blinkpin=13;
byte anaus=1;

void setup()
{
  Serial.begin(31250);
  pinMode(blinkpin, OUTPUT);
}

void loop()
{
  for(int note=0x1E; note < 0x5A; note++)
  {
    noteOn(0x90, note, 0x7f);
    delay(100);
    blink();
    noteOn(0x90, note, 0x00);
    delay(100);
  }
}

void noteOn(int cmd, int pitch, int velocity)
{
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

void blink()
{
  if(anaus==1)
  {
    digitalWrite(blinkpin, HIGH);
    anaus=0;
  }
  else
  {
    digitalWrite(blinkpin, LOW);
    anaus=1;
  }
}

Gruß

Gregor

Tommy56:
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Welchen anderen Wert als 0 oder 1 erwartest Du von digitalRead?

Gruß Tommy

Edit: Ein Link zum Midishield wäre auch sinnvoll.

Hab den Code markiert und den Link hinzuzgefügt:)

Naja ich erwarte Tonhöhe und Stärke, bzw. das ist es, was ich brauche, aber ich weiß halt nicht genau wie ich an die Werte rankommen kann.

agmue:
Von Deinem Ziel bist Du noch ein ganzes Stück entfernt, lasse Dich nicht entmutigen :slight_smile:
Da könnte es mehrere geben, welches hast Du?

Sollte es das SparkFun MIDI Shield sein, hast Du Dir das MIDI Shield Hookup Guide durchgelesen? Bei “Arduino Compatible I/O” siehst Du, daß die Tasten an D2 bis D4 angeschlossen sind.

Ein Vorschlag (ungetestet):

const byte tasterPin = 2

bool MidiWert = 0;

void setup() {
  Serial.begin(9600);
  pinMode(tasterPin, INPUT_PULLUP);
}

void loop() {
  MidiWert = digitalRead(tasterPin);
  Serial.println(MidiWert);
  delay(100);
}

Haha danke für die aufbauenden Worte:D
leider ist es nicht das von Sparkfun…

Serenifly:
Sicher dass die digitalRead() willst um MIDI auszulesen?

An Pin 0 und 1 solltest du auch keine Taster anschließen. Da hängt schon die USB Schnittstelle

ich bin mir absolut unsicher, ob es das richtige ist. Ich dachte, dass das Midi Shield schon funktionieren würde…hab jetzt auch viel gelesen, dass die USB Schnittstelle schon da angeschlossen ist, allerdings weiß ich nicht, ob ich dann ein anderes Arduino Board brauche, wo mehrere Seriellen Ports sind oder ich es auch so mit dem gegebenen schaffen könnte.

gregorss:
Experimentiere am besten erst einmal nur mit dem Uno und benutze die Pins 0 und 1 für das MIDI-Signal. Als ich mit Uno und MIDI gespielt habe, habe ich zunächst lediglich eine Tonfolge per MIDI ausgegeben. Blöderweise ist dadurch die einzige serielle Schnittstelle blockiert - Abhilfe könnte zumindest testweise „Softwareserial“ sein, wobei das für den Empfang nicht absolut zuverlässig funktioniert.

Mein erstes MIDI-Testprogramm:

// MIDI

// Anschluss (DIN-Buchse von der Lötseite/hinten gesehen):
// - Der mittlere Anschluss ist mit der Abschirmung verbunden
//  und geht an GND
// - Der rechte Anschluss geht über einen 220-Ohm-Widerstand
//  an +5V
// - Der linke Anschluss geht an TX

byte blinkpin=13;
byte anaus=1;

void setup()
{
  Serial.begin(31250);
  pinMode(blinkpin, OUTPUT);
}

void loop()
{
  for(int note=0x1E; note < 0x5A; note++)
  {
    noteOn(0x90, note, 0x7f);
    delay(100);
    blink();
    noteOn(0x90, note, 0x00);
    delay(100);
  }
}

void noteOn(int cmd, int pitch, int velocity)
{
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

void blink()
{
  if(anaus==1)
  {
    digitalWrite(blinkpin, HIGH);
    anaus=0;
  }
  else
  {
    digitalWrite(blinkpin, LOW);
    anaus=1;
  }
}




Gruß

Gregor

Genau, und das mit dem software Serial hatte ich auch gelesen und ausprobiert, aber es zeigt als Fehler an, dass #include <SoftwareSerial.h> nicht funktioniert. Das ist doch eigentlich eine Bibliothek oder? Muss ich da irgendetwas installieren?

Und könntest du mir erklären, warum man bei Serial.begin(31250) diese Baudrate nimmt? Die gibt es ja beim seriellen Monitor nicht. Dann kann man die Daten doch nicht empfangen oder?

svenjasProjekte:
Genau, und das mit dem software Serial hatte ich auch gelesen und ausprobiert, aber es zeigt als Fehler an, dass #include <SoftwareSerial.h> nicht funktioniert. Das ist doch eigentlich eine Bibliothek oder? Muss ich da irgendetwas installieren?

IIRC ist außer dem #include nichts weiter nötig.

svenjasProjekte:
Und könntest du mir erklären, warum man bei Serial.begin(31250) diese Baudrate nimmt? Die gibt es ja beim seriellen Monitor nicht. Dann kann man die Daten doch nicht empfangen oder?

Die Baudrate kommt durch die MIDI-Spezifikation zustande. Wenn Du gleichzeitig MIDI empfangen und Texte im seriellen Monitor ausgeben möchtest, wirst Du nicht um eine zweite serielle Schnittstelle oder eben das MIDI-Shield herumkommen. Aber statt des seriellen Monitors kann man je nach Anforderung ja auch die Onboard-LED benutzen.

HTH

Gregor

gregorss:
IIRC ist außer dem #include nichts weiter nötig.

Da möchte ich dir aber energisch widersprechen.
Die Library (div. Dateien) muss auch installiert werden.
Hier vermute ich, dass dies nicht erfolgt ist.

HotSystems:
Da möchte ich dir aber energisch widersprechen.
Die Library (div. Dateien) muss auch installiert werden.

Puh. Gut dass ich das IIRC dazugeschrieben habe. Ist schon ewig her.

Gruß

Gregor

gregorss:
Puh. Gut dass ich das IIRC dazugeschrieben habe. Ist schon ewig her.

Da ich mich noch zur "alten Schule" rechne, überlese ich derartige "faulheits-Floskeln" immer.

svenjasProjekte:
leider ist es nicht das von Sparkfun..

Dann fehllt leider ein Schaltplan vom Shield oder Beispielprogramme. Auch ist unklar, was der Umschalter bewirkt.

Der Rest ist Spekulation.


@HotSystems und gregorss: Ich bekomme vom Compiler die Meldung "Bibliothek SoftwareSerial in Version 1.0 im Ordner: C:\Program Files (x86)\arduino-1.8.6\hardware\arduino\avr\libraries\SoftwareSerial wird verwendet"

Bei IDE Version 1.8.6 scheint daher die Bibliothek SoftwareSerial Teil der Installation zu sein.

Aber ohne Möglichkeit, die MIDI-Pins auf andere UNO-Pins umzulegen, nützt es ja eh nichts.

agmue:
@HotSystems und gregorss: Ich bekomme vom Compiler die Meldung "Bibliothek SoftwareSerial in Version 1.0 im Ordner: C:\Program Files (x86)\arduino-1.8.6\hardware\arduino\avr\libraries\SoftwareSerial wird verwendet"

Bei IDE Version 1.8.6 scheint daher die Bibliothek SoftwareSerial Teil der Installation zu sein.

Wissen wir denn, mit welcher Version der/die TO arbeitet ?

HotSystems:
Wissen wir denn, mit welcher Version der/die TO arbeitet ?

1.8.9 ist meine Version...

agmue:
Aber ohne Möglichkeit, die MIDI-Pins auf andere UNO-Pins umzulegen, nützt es ja eh nichts.

Ja, soweit ich es verstanden habe, geht es darum, MIDI zu empfangen. Und dafür ist SoftwareSerial nur zum Testen gut.

Das beste wäre eigentlich, zunächst den Empfang von MIDI-Daten auf einer anderen als der normalen seriellen Schnittstelle hinzubekommen. Dann noch ein bisschen „while(Serialdingens.available())“ - dann kann sie wenigstens schon einmal mitlesen, was da ankommt.

Nur für erste Spielereien tun es aber Uno und SoftwareSerial.

Gruß

Gregor

PS @ Svenja: Poste mal einen Link zu Deinem MIDI-Shield. Gibt es evtl. eine spezielle Bibliothek dafür? Mit etwas Trickserei könntest Du das, was Du vorhast, auch ganz ohne Shield machen - solange Du entwickelst, ist das Shield halt echt praktisch, weil Du gleichzeitig im seriellen Monitor mitlesen kannst.

Blöderweise habe ich vor, die unterschiedlichen Töne in verschiedene Farben umzuwandeln und brauche dafür halt die Infos...Wie kann ich denn eine zweite serielle Schnittstelle dran bekommen? Scheinbar ist die ja nicht vorhanden...

Ist das mit den Teilen, die ich habe, möglich?

svenjasProjekte:
1.8.9 ist meine Version...

Ok....und ist die Library "SoftwareSerial" auch installiert ?

gregorss:
PS @ Svenja: Poste mal einen Link zu Deinem MIDI-Shield. Gibt es evtl. eine spezielle Bibliothek dafür? Mit etwas Trickserei könntest Du das, was Du vorhast, auch ganz ohne Shield machen - solange Du entwickelst, ist das Shield halt echt praktisch, weil Du gleichzeitig im seriellen Monitor mitlesen kannst.

Kein Link, aber eine URL findest du im Eingangspost.

HotSystems:
Kein Link, aber eine URL findest du im Eingangspost.

Naja, schön ... das ist das Verkaufsangebot auf Ebay - da sehe ich aber keine für uns brauchbaren Infos. Wenigstens ein Schaltplan wäre praktisch. Oder allerwenigstens brauchbare Fotos/Scans von Ober- und Unterseite.

Gruß

Gregor

gregorss:
Naja, schön ... das ist das Verkaufsangebot auf Ebay - da sehe ich aber keine für uns brauchbaren Infos. Wenigstens ein Schaltplan wäre praktisch. Oder allerwenigstens brauchbare Fotos/Scans von Ober- und Unterseite.

Gruß

Gregor

Du bist aber auch nie zufrieden. :wink:

Allerdings fehlen hier tatsächlich Informationen zum Teil, ist halt ebay.

Deshalb sollte man dort oder anderswo erst kaufen, wenn man das Datenblatt gefunden hat.
(fertig konfektionierte Standardkabel mal außen vor)

Gruß Tommy