Arduino Uno als Midi-Controller

Liebe Arduino Gemeinschaft,

ich versuche grade mit einem Arduino Uno und einem Ultraschallsensor mein Musik-Programm(Ableton) zu steuern. Realisiert habe ich das per Auslesen des seriellen Ports mit dem Programm “Hairless Serial to MIDI”. Das klappt auch, wenn auch leider sehr ungenau. Kann mir jemand helfen den Fehler zu finden?
Und ich verstehe einfach nicht welche Daten ich aussenden muss, um speziell das zu machen, was ich will.

Im Moment kann ich zum Besipiel den Sensor auf einen Filter Knopf mappen, dann springt es aber und hat eigentlich nur zwei Schritte. Außerdem würde ich gerne Noten über die per Entfernung zum Sensor senden.

Es wäre sehr nett, wenn sich jemand meiner erbarmt :slight_smile: Grüße

Code:

int triggerPin = 2; 
int echoPin = 3; 
long messung = 0;
int ergebnis = 0; 

int controlChange = 176; // MIDI Kanal 1
int controllerNummer = 21;
int controllerWert = 0;
int controllerWertAlt = 0;
int potiWert = 0;

void setup() {
Serial.begin(9600);
pinMode(triggerPin, OUTPUT); 
pinMode(echoPin, INPUT); 
}

void loop() {
 
   digitalWrite(triggerPin, LOW); 
   delayMicroseconds(2); 
   digitalWrite(triggerPin, HIGH); 
   delayMicroseconds(10); 
   digitalWrite(triggerPin, LOW);
   messung = pulseIn(echoPin, HIGH);
   ergebnis = (messung/2)/29; //cm
   ergebnis = (ergebnis/2);
   
if (controllerWert <= 2500) {
   controllerWert = map(ergebnis,2500,0,0,127);

if (controllerWert != controllerWertAlt) {
 Serial.write(controlChange);
 Serial.write(controllerNummer);
 Serial.write(controllerWert);
 
}
}

controllerWertAlt = controllerWert;
 //Serial.println(controllerWert);
delay(60);
}

Setze Deinen Sketch bitte in Codetags (</> oben links im Forumseditor).
Ultraschall zur Datenübertragung kommt mir schon etwas seltsam vor.
Prüfe mal, ob Du wirklich Ultraschall nutzt.

Gruß Tommy

buggypanser: ... Es wäre sehr nett, wenn sich jemand meiner erbarmt :) Grüße

Ich war jung, ich brauchte das Geld ... ups, Pardon, das war die falshce Taste ... ich meine ... Es ist kurz vor Weihnachten. Da ist man nunmal ein bisschen mildtätig und erinnert sich daran, dass früher nicht nur „mehr Lametta war“, sondern man selbst auch weniger wusste. Was für mich nicht gilt, weil ich schon immer alles wusste, das war mir nur nicht schon immer klar.

Zum Thema: Mit einem Arduino MIDI-Nachrichten zu erzeugen und zu verschicken ist ein Klacks. Auf die Schnauze fällt einer wie ich erst, wenn er versucht gleichzeitig zu senden und zu empfangen (aber das ist ein anderes Thema).

Eine MIDI-Nachricht wird immer nach dem selben Strickmuster zusammengebaut. Eine Funktion, die MIDI-Daten sendet, ist ziemlich einfach. Für ein Ding, das ich mal gebastelt habe, sieht das so aus:

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

„cmd“ selbst setzt sich AFAIR aus MIDI-Befehl und -Kanal zusammen.

Welche Daten Du auf welche Weise an das Gerät schicken musst, steht in der Anleitung zum betreffenden Gerät.

Zum Experimentieren kannst Du auch (verschachtelte) Schleifen programmieren, die einfach alle Kombinationen ausprobieren. Nimm Dir ein paar hundert Jahre Zeit, dann hast Du alle Kombinationen durch.

Wenn Du das mit dem MIDI kannst, knöpfst Du Dir den nächsten Teil Deines Vorhabens vor. Was irgendwas mit Ultraschall zu tun hat, nehme ich an.

Ach ja: Ein Posting inhaltlich zu ändern, nachdem jemand geantwortet hat, ist eine ganz schlechte Idee. Den Sketch in Code-Tags setzen ist auch nachträglich okay.

Gruß

Gregor

Du willst einen Controlerwert rausschieben (was ja in Ordnung ist), aber Du veränderst ihn nie.

Ich tippe mal: Dein Ergebnis der Entfernungsmessung soll dann irgendwann der Controlerwert sein.

PulseIn ist blockierend-heisst, an der Stelle wartet das Programm relativ lange-nämlich eine volle Sekunde! Sowas muss man bei Midi unbedingt vermeiden, da das Protokoll sowieso schon sehr lahmarschig ist. Daher dort unbedingt ein Timeout einsetzen! Und das, so kurz wie möglich- du wirst kaum die volle Reichweite des Sensors nutzen wollen, von daher reicht die Laufzeit (des Schalls) auf die nötige Entfernung*2 plus eine gewisse Reserve, um Echos abklingen zu lassen.

Von daher ist es nicht verwunderlich, wenn der Sensor keine vernünftige Auflösung liefern kann, der hat einfach nur einmal jede Sekunde die Möglichkeit, die Werte zu messen.

Tipp: https://www.youtube.com/watch?v=JONIZdLZAVM zieh dir die Videos mal rein, der Kerl macht zwar auch eine ganze Menge Sachen, die eigentlich no-go's sind, aber da sein Controller relativ simpel aufgebaut ist, funktioniert es. Da war, glaube ich, auch ein US-Sensor im Spiel.

Wenn dir die Hairless "unverständliches" ausgibt, geh dem immer nach! Midi hat so seine Tücken, das Protokoll ist enorm robust, will aber peinlichst eingehalten werden. Also: wann immer Hairless irgendwas ungewolltes ausgibt: auseinandernehmen, und schauen, woher das kommt, sonst können sehr wundersame Dinge passieren.