Arduino Nano DIY Midi Controller

Hallo Welt!
Ich hab da so ein kleines Projekt am laufen und könnte Hilfe gebrauchen, weil ich mich ein wenig verzettelt habe, was die Übertragung von Seriell über Midi zum USB angeht.
Das Setup liegt bereits auf Midi_Controller DIY

Der Code:

//*****************************************************************************
//Sketch from Peter Kussike 2016 for
//3 Poti 100k, 3 Momentary Switches, 1 Ultrasonic Sensor HC SR04 and an Arduino Nano.
//I took a Nano because it's so small and has the same funktions as his big brother UNO.
//In the Box it is Connected via MiditoUSB connector while midi.h did not work out well.
//This is Sketch Nr.1 vom 12.11.2016
//Published under Midi_Controller DIY
//its open source and free for all and everyone off course!
//******************************************************************************

// Install MidiChannel for all
int controlChange = 176; // MIDIKanal 1

// Install Ultrasonic
int ctrlNummer = 20;
int Trigger = 0;
int Echo = 0;

// Install Potis 1 to 3
int potiWert1 = 0;
int potiWert2 = 0;
int potiWert3 = 0;

int smoothWert1 = 0;
int smoothWert2 = 0;
int smoothWert3 = 0;

int potiWertAlt1 = 0;
int potiWertAlt2 = 0;
int potiWertAlt3 = 0;

int quickSmooth1 = 0;
int quickSmooth2 = 0;
int quickSmooth3 = 0;

int differenz1 = 0;
int differenz2 = 0;
int differenz3 = 0;

boolean quickAktiv1 = false;
boolean quickAktiv2 = false;
boolean quickAktiv3 = false;

int x = 0;
int y = 0;
int z = 0;

// Install Pushbuttons 1 to 3
const int buttonPin1 = 2;
const int buttonPin2 = 3;
const int buttonPin3 = 4;

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;

void setup() {
Serial.begin(9600);

//Initialize the Ultrasonic
pinMode(10, OUTPUT); //Trigger
pinMode(9,INPUT); //ECHO

// initialize the pushbutton pin as an input:
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);

}

void loop() {

// Inititialize Potis 1 to 3
potiWert1 = analogRead(A0);
potiWert2 = analogRead(A1);
potiWert3 = analogRead(A2);

smoothWert1 = 0.6 * smoothWert1 + 0.4 * analogRead(A0);
smoothWert2 = 0.6 * smoothWert2 + 0.4 * analogRead(A1);
smoothWert3 = 0.6 * smoothWert3 + 0.4 * analogRead(A2);

differenz1 = abs(potiWert1 - potiWertAlt1);
differenz2 = abs(potiWert2 - potiWertAlt2);
differenz3 = abs(potiWert3 - potiWertAlt3);

if (differenz1 <= 5 && quickAktiv1 == false) {
quickSmooth1 = 0.6 * smoothWert1 + 0.4 * analogRead(A0);
}
else if (differenz1 <= 5 && quickAktiv1 == true){
quickSmooth1 = analogRead(A0);
x++;
}
else {
quickSmooth1 = analogRead(A0);
quickAktiv1 = true;
}

if (differenz2 <= 5 && quickAktiv2 == false) {
quickSmooth2 = 0.6 * smoothWert2 + 0.4 * analogRead(A1);
}
else if (differenz2 <= 5 && quickAktiv2 == true){
quickSmooth2 = analogRead(A1);
y++;
}
else {
quickSmooth2 = analogRead(A1);
quickAktiv1 = true;
}

if (differenz3 <= 5 && quickAktiv3 == false) {
quickSmooth3 = 0.6 * smoothWert3 + 0.4 * analogRead(A2);
}
else if (differenz3 <= 5 && quickAktiv3 == true){
quickSmooth3 = analogRead(A2);
z++;
}
else {
quickSmooth3 = analogRead(A2);
quickAktiv3 = true;
}

if (x >= 10) {
x = 0;
quickAktiv1 = false;
}

if (y >= 10) {
y = 0;
quickAktiv2 = false;
}

if (z >= 10) {
z = 0;
quickAktiv3 = false;
}

potiWertAlt1 = potiWert1;
potiWertAlt2 = potiWert2;
potiWertAlt3 = potiWert3;

delay (10);

// read the state of the pushbutton value:
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
buttonState3 = digitalRead(buttonPin3);

delay (10);

sensorenAbfragen(10, 9, ctrlNummer);
}

void sensorenAbfragen(int Trigger, int Echo, int ctrlNummer) {
//Trigger Measurement
digitalWrite(Trigger, LOW);
delayMicroseconds(2);
digitalWrite(Trigger, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger, LOW);

long sensorWert = pulseIn(Echo, HIGH);

if (sensorWert <=2500) {
int sensorMIDI = map(sensorWert,2500,0,0,127);
sendeMIDI(controlChange, ctrlNummer, sensorMIDI);
}
Serial.print(sensorWert);
Serial.println("cm ");
}
//Send Data to Midi
void sendeMIDI(int statusByte, int dataByte1, int dataByte2) {
Serial.write(statusByte);
Serial.write(dataByte1);
Serial.write(dataByte2);
}

Einen Fehler habe ich bereits selbst herausgefunden.
Die Serielle Schnittstelle muss mit 31250Baud an den Adapter gehen.

Serial.begin(31250);

Oh und ja, das ist aus dem GMD Hack abgeleitet!
Wer mag ihn nicht, den Götz.

Peace :slight_smile:

Auch 9 Tage später noch keine Reaktion zu erhalten, lässt mich etwas daran zweifeln,
dass ich hier mit meinem Anliegen richtig sein könnte. :o
Dann schaue ich mal, wo mir vielleicht eher geholfen wird.
Aber für ein Forum ist es hier doch verdächtig still, findet ihr nicht auch??? :sleeping:

Wie wär's denn mal, wenn Du Dein Problem beschreibst?

"Ich könnte Hilfe brauchen" animiert nicht wirklich, und Dein Code ist zumindest mir einfach zu lang um ihn visuell zu debuggen - so ohne Problembeschreibung.

Also, nicht schmollen sondern raus mit der Sprache.

Du verwendest die Serielle Schnittstelle zur Ausgabe eines MIDI-Signals UND gleichzeitig zur Ausgabe der Entfernung, sodass zum Beispiel so etwas ausgegeben wird:

0xB0
0x14
0x7F
30cm
<Space>
<CR>
<NL>

Die ersten 3 Bytes sind zwar ein gültiges MIDI-Kommando, gemischt mit der nachfolgenden Entfernungsangabe (30cm) macht das aber überhaupt keinen Sinn und es wird wohl jedes MIDI-Gerät streiken.

Das MIDI-Kommando 0xB0 ist auch eher "speziell".
Das dient zum Ansprechen verschiedener MIDI-Controller.
Allerdings gelten die Controller 0x14 bis 0x1F als "undefined". Da wird also kaum ein vorhandenes MIDI-Gerät darauf reagieren...
Aber leider gibst du ja keine Infos bezüglich deines "Zielgerätes".

Wenn ich mit MIDI und Arduino bisher etwas gemacht habe, dann habe ich meist "Notenwerte" übertragen.
Das wäre dann Kommando 0x90
gefolgt von einem "Pitch" Wert (Note)
und einem "Velocity" Wert (Anschlagstärke)

Wenn du MIDI-Kommandos mit die Serielle Schnittstelle über USB zum Computer schicken willst, dann muss am Computer ein Programm laufen, das die seriellen Daten in MIDI-Daten "umwandelt", zum Beispiel Hairless.

Die Hairless Bridge ist immer ein guter Tipp.
Auch wenn man (wie ich auch) einen Midi2USB-Adapter benutzt.
Dann sieht man nämlich, was an Daten wirklich ankommt.
Es passiert bei komplexeren Datenströmen nämlich schnell mal, dass man sich irgendwo vertut (Pitch-Bend-Controller wars bei mir damals), das findet man ohne eine gescheite Visualisierung nie raus, da irgendwelche Anwendungen bei fehlerhaftem Datenstrom einfach irgendwas undefinierbares tun.

Wo wir gerade über fehlerhafte Daten plauschen: zumindest auf dem Windows-Rechner sollte MidiOx nicht fehlen. Da sieht man in echt und direkt lesbar was reinkommt - und was midiinterpretierbar ist.

Rabenauge:
Die Hairless Bridge ist immer ein guter Tipp.
Auch wenn man (wie ich auch) einen Midi2USB-Adapter benutzt.
Dann sieht man nämlich, was an Daten wirklich ankommt.
Es passiert bei komplexeren Datenströmen nämlich schnell mal, dass man sich irgendwo vertut (Pitch-Bend-Controller wars bei mir damals), das findet man ohne eine gescheite Visualisierung nie raus, da irgendwelche Anwendungen bei fehlerhaftem Datenstrom einfach irgendwas undefinierbares tun.

Ja, genau, stimme da voll zu!
Eine Hardware, die zuverlässig funktioniert ist besser als eine reine Softwarelösung :slight_smile:

Hab Hairless ja nur erwähnt weil der TO meinte

...was die Übertragung von Seriell über Midi zum USB angeht.

Aber wenn ich mehr darüber nachdenke und mir auch noch das (Fritzing-) Layout im Link oben genauer ansehe (ich darf das mal hier sichtbar machen):

dann geht es hier wohl doch eher um den Anschluss an einen "Adapter" USB<-->MIDI.

Wenn dem so ist, dann würde ich aber noch ein bis zwei Widerstände (ca. 220 Ohm) in die Datenleitungen geben.

Ja, MIDIOX ist auch sehr brauchbar! :slight_smile:

peter_kussike:
Auch 9 Tage später noch keine Reaktion zu erhalten, lässt mich etwas daran zweifeln,
dass ich hier mit meinem Anliegen richtig sein könnte. :o
Dann schaue ich mal, wo mir vielleicht eher geholfen wird.
Aber für ein Forum ist es hier doch verdächtig still, findet ihr nicht auch??? :sleeping:

Auch 5 Stunden später mit 5 Antworten noch keine Antwort von Dir auf unsere brennenden Fragen läßt mich daran zweifeln, dass wir unsere Freizeit hier vernünftig verbringen. :sunglasses:

Und wenn Du dir die Mühe machen würdest hier im Forum wenigstens ein wenig mitzulesen würdest Du merken, dass hier deutlich mehr Leben ist als in anderen.