Rotary Encoder am Midi controller - brauche Hilfe

Hi Leute,
ich versuche mich nun seit einigen Wochen an einem eigenen MIDI-Controller, habe auch bisher alles zum laufen bekommen (Taster, die in Cubase verschiedene Aktionen durchführen, LED´s die leuchten wenn z.B. gerade aufgenommen wird und auch Testhalber einen Poti mit dem ich den EQ in Cubase verändern konnte), jedoch genau bei diesem EQ liegt nun das Problem:

Und zwar ist dieser EQ auf allen Spuren vorhanden, jedoch wird er unterschiedlich eingestellt, also würden mir Poti´s beim einstellen nur im Wege stehen, da ich entweder ca. 240 Potis bräuchte um in jeder Spur den EQ so einzustellen wie ich das möchte, oder, wie ich auch vorhabe, mit einem Drehimpulsgeber oder Rotary Encoder.

So nun aber zu meinem Problem XD: Zu erst einmal habe ich von dem Programmieren über Arduino nicht wirklich viel Ahnung, und habe meistens eher Programme umgeschrieben und erweitert, die ich durch Tutorials entdeckt habe und deren Schaltung meist noch erweitert (entprellung von Tastern), somit habe ich nicht wirklich Ahnung wie ich dieses Programm nun ansetzten soll, zu dem finde ich über google nichts über einen Midi Controller mit Encodern, bei denen entweder nicht irgendwo ein Programmfehler ist, oder das Script schon so alt ist, dass meine IDE es nicht mehr verarbeiten kann.

Die Idee meiner seits ist nun:

  • Über den RX - Pin z.B. an Kanal 1, "Note" 13, die Value = X auslesen,
  • dann überprüfen ob der Encoder nach links ( - Bereich) oder nach rechts (+ Bereich) gedreht wird
  • jenachdem wie oft nach links oder rechts gedreht wird diesen Wert + die ausgelesene Value X wieder
    per TX versenden

Aber das ist nur eine Idee, vllt. liege ich da ja komplett falsch!

Gibt es hier jemanden, der so etwas schon mal programmiert hat und mir vllt. ein Script mit einem Encoder bereitstellen würde, damit ich es testen und erweitern kann?

Vielen Dank schon mal im vorraus!

Hallo,

ist das ausreichend? LMGTFY - Let Me Google That For You

:slight_smile:

Doc_Arduino:
Hallo,

ist das ausreichend? http://lmgtfy.com/?q=arduino+encoder

:slight_smile:

Danke für diese ausführliche Hilfe -.- xD

ähhhm nö das ist nicht ausreichend, da ich weiß wie ich zum Beispiel mit einem Encoder etwas ausgeben kann, nur nicht wie ich dieses etwas in midi umwandele und dabei auch nicht x-beliebig, aber das hatte ich glaube ich in meinem ersten Post geschrieben.

P.s. wie google funktioniert weiß ich ebenfalls

zu dem finde ich über google nichts über einen Midi Controller mit Encodern,

Hallo,

war ja nicht böse gemeint. Ich dachte du weist nicht wie man einen Encoder programmiert. Wie das in deinem Midi-Controller aussieht oder wie die Signal reingehen weis ich nicht. Vom Gefühl her kommt mir das zu einfach vor. Vom Encoder über einen µC an die Midi Schnittstelle. So richtig kann ich dir da nicht weiterhelfen, aber kennst du die Steuerungsdaten von dem Midi-Controller? Damit du überhaupt eine Chance hast.

Hi, kein Problem hab es nicht als solches Empfunden^^

also die Signale kommen über einen Optokopler der so geschaltet wird, und mit einem USB to Midi-Kabel eingespeist wird http://2.bp.blogspot.com/-sQ8Uw7x-Vs0/VOatHJCRTGI/AAAAAAAAA9E/yD_TdRw_QKo/s1600/MIDI_Input_Schematic.png

Steuerungsdaten kann ich eigentlich "Frei-Wählen" zumindest in der DAW, ich brauche halt:
1x Kanal
1x Note
1x Anschlagsdynamic

wäre dann bei einem Taster z.B.:

if (taste == HIGH && tasteAlt == LOW) {
Serial.write(144); // 1001 0000 = Note On Kanal 1 (176 = Kontrollchange auf Kanal 1)
Serial.write(36); //Note C1
Serial.write(127); //Voller Ausschlag
tasteAlt = taste;
}

Im Prinzip bräuchte ich sowas hier, jedoch funktioniert der Code nicht! Simple MIDI Encoder with Teensy - YouTube

Hallo!

Was du brauchst, ist vor allem die Midi-Schnittstelle für den Arduino, der in deiner youtube-Adresse
gezeigte teensy hat die eingebaut (Midi-USB), sowas musst du dem Arduino noch selber beibringen,
es gibt aber reichlich Hilfen dazu im Netz, google mal nach Midi und Arduino, wenn du das geschafft hast,
ist die Ansteuerung über Drehregler, Potis etc zu Midi-Geräten relativ einfach.
Es gibt auch softwaremäßig Lösungen - quasi Treiber - die diese Ausgabe übernehmen, ist aber nicht so doll, denn dann musst du das Treiberprogramm erst starten, dann deinen Arduino-Controller anwerfen,
also auch etwas störanfällig.

Auf dem Mac wäre das der "Hairless MIDI<->Serial" - Treiber, schau mal danach, bei Windows bin ich
nicht zuhause...

Funktioniert eigentlich ganz gut, aber besser ist eine direkte Lösung.
Warum nimmst du nicht den Teensy dafür, der hat diese Schnittstelle schon...

Viel Erfolg beim Basteln!

HG

Hallo Hgpa,

die Midi Schnittstelle habe ich schon "gebaut" war nicht das Problem, habe es nach diesem Prinzip gebaut: http://2.bp.blogspot.com/-sQ8Uw7x-Vs0/VOatHJCRTGI/AAAAAAAAA9E/yD_TdRw_QKo/s1600/MIDI_Input_Schematic.png + https://www.arduino.cc/en/uploads/Tutorial/MIDI_schem.png

Auch Poti´s sind kein Problem, jedoch machen die genau das was ich nicht brauche, nämlich einen Wert mehr oder minder dauerhaft "stellen" sprich ich drehe am Poti, der Widerstand steht nun am Analogen eingang auf 500 Ohm, nun wähle ich meinen zweiten EQ aus (an dem ich vllt. vorher 1 kOhm eingestellt hatte, weil ich diesen noch ein wenig verändern möchte, aber nicht direkt den kompletten Band neu einstellen muss, drehe leicht am Poti und schon ist in der DAW der Band verstellt..... daher ja die Drehimpulsgeber/Rotary Encoder oder auch Endlos Encoder genannt.

Hallo,
ich weiß ja nicht…

Wenn das mit Taster funktioniert, dann funktioniert es auch mit einem Encoder.
Du brauchst einen Encoder mit Taste. Die Drehrichtung und die Schaltposition
kannst Du ja einfach auswerten.
Also:
if (taste == HIGH && tasteAlt == LOW) {
Serial.write(144); // 1001 0000 = Note On Kanal 1 (176 = Kontrollchange auf Kanal 1)
Serial.write(36); //Note C1
Serial.write(127); //Voller Ausschlag
tasteAlt = taste;
}

könnte mit Encoder

if (EncoderPos == 87 && EncoderTaste == HIGH) {
Serial.write(144); // 1001 0000 = Note On Kanal 1 (176 = Kontrollchange auf Kanal 1)
Serial.write(36); //Note C1
Serial.write(127); //Voller Ausschlag
}

if (EncoderPos == 88 && EncoderTaste == HIGH) {
Serial.write(164); // 1001 0011 = Note On Kanal 2 (186 = Kontrollchange auf Kanal 2)
Serial.write(39); //Note C1
Serial.write(102); //Voller Ausschlag
}

Ist es das, was Du meinst? Das funktioniert mit einem Encoder.
Du kannst auch für Kanal, Note und Value je einen Encoder nehmen, wenn dann
getastet wird, sendet der den Wert.

Wie Du allerdings "Serial.write(39); //Note C1" in MIDI wandelst, kann ich Dir
nicht sagen.
Gruß und Spaß
Andreas

Hallo SkobyMobil,

leider ist es nicht ganz die funktion die ich benötige^^

Ich bräuchte im Prinzip einen Code für einen Encoder, der ähnlich wie ein Poti funktioniert, somit muss ich wohl irgendwie den Midi Wert vorher von der DAW abfragen/speichern um z.B. 1 erhöhen und dann senden, nachmöglichkeit ohne das ich einen Taster drücken muss^^

Rein theoretisch würde dieser Code funktionieren, wenn da nicht das Problem wäre, das meine IDE rum meckert, es wären Fehler enthalten, liegt vllt. daran dass er für einen Teensy und nicht für einen Mega 2560 geschrieben ist?!

#include <Encoder.h>

Encoder enc_one(2, 3);
int value;

long enc_one_previous = -999;
byte button_previous;

void setup() {
pinMode(23, INPUT_PULLUP);
}

void loop() {
value = enc_one.read();
if(value > 127) { enc_one.write(127); }
else if(value < 0) { enc_one.write(0); }

value = constrain(value, 0, 127);
if (value != enc_one_previous) { enc_one_previous = value; usbMIDI.sendControlChange(1, value, 1); }

value = digitalRead(23);
if(value != button_previous) { button_previous = value; usbMIDI.sendControlChange(2, (1 - value) * 127, 1); delay(3); }
}

Hallo,

rede mal Klartext. Du schreibst weiter oben du kannst alles und du weist alles wie es funktioniert. Nur mit dem Midi haberts. Jetzt haberts aber schon am Encoder. Was denn nun? Ich weis auch nicht warum du Bsp. vom Teensy nimmst, wenn du der Suche mächtig bist im Internet. Haste mir oben ja gesagt. Da ist alles beschrieben.

Wenn das Wissen zur Nutzung und Auswertung eines Encoders doch vorhanden sind, dann schreibe dir 2 Modi/Funktionen zwischen denen du per entprellten Tastendruck hin- und her springst. Du brauchst nur eine Funktion mit der du mittels Encoder drehen einen Wert sauber jeweils um 1 hoch oder runter zählst. Das ist die halbe Miete. Das ist wie gesagt alles im Link beschrieben. Da brauchste nicht bei Teenys gucken.

Meinetwegen willst du 8 Werte einstellen, dann legst du dir ein array an mit 8 Werten, und wechselst mit dem Taster zwischen Änderung eines Wertes und der Indexpos. im array hin und her. So kannst du alle 8 Werte einzeln einstellen.

Edit:
vielleicht hilft dir das ja vom Peter D. weiter wenn der Rest bekannt ist, damit habe ich meine Encoderfunktion aufgebaut, ich habe aber keinen Drehencoder.
http://www.mikrocontroller.net/articles/Drehgeber
http://www.mikrocontroller.net/topic/drehgeber-auslesen

Hallo Doc,
"wechselst mit dem Taster"

Er will NICHT- Taster :smiling_imp:

Gruß und Spaß
Andreas

Hallo,

womit will er dann seinem Programm sagen das er was auslesen bzw. ändern möchte?
Ehrlich gesagt blicke ich nicht durch was er wirklich wie machen möchte.
Ich dachte er möchte hintereinander alle Werte einzeln ändern.

Hallo,
ich hatte auch erst gedacht, noch einmal darauf einzugehen- lasse es aber.
Ich nutze für Musik meinen CD-Player- ganz ohne Arduino. :wink:
Gruß und Spaß
Andreas

Ok da es zu missverständnisen kommt versuche ich es mal anders zu formulieren und zu erklären!
In meinem Studio-Programm (Cubase) habe ich einen Equalizer der ungefär so aussieht/solche schaltflächen hat:

Diese Schaltflächen also 4x Taster und 12x Encoder möchte ich steuern. Die Taster und sogar die LED´s habe ich zum laufen bekommen, die Drehregler für GAIN, FREQUENZ und Q habe ich NUR mit normalen 10kOhm Poti´s zum laufen bekommen.

Jedoch ist das Problem: Diese Schaltfläche ist in allen normalen Audio-Spuren vorhanden (Bei mir ca. 40 bei einer 5 köpfigen Band), sprich verändere ich jetzt in Spur1 EQ-Kanal 1 den GAIN auf "1,0dB" bleibt der Poti auf seinem Wert, jetzt möchte ich in Spur 2 EQ-Kanal 1 den GAIN etwas verändern z.B. von 0,75dB auf 0,8dB springt der Wert direkt bei der kleinsten berührung auf 1,0dB, da ich hier mit einem "Widerstand" und analog arbeite!

Also brauche ich einen Code für den Encoder, der schaut was liegt an Kanal 1 für ein Wert vor (als beispiel: Valocity = 122) jetzt drehe ich einen klick nach oben und das Programm macht aus der 122 eine 123.

Was dieses auslesen angeht, arbeite ich mit einer MIDI-Libary, die kann mit dem Befehl MIDI.read() midi befehle/zustände empfangen ohne das ich einen Knopf drücken müsste. Zu dem Sendet die DAW, automatisch das was ich möchte raus (dort kann ich einstellen was ich senden oder empfangen möchte).

Was das Thema encoder angeht, ja ich habe eine einfache Schaltung damit Programmiert, jedoch nur den Zähler für links und rechts den man überall auf google findet! Jedoch nicht inverbindung mit MIDI oder ähnliches!

Ich hoffe das ist nun etwas verständlicher. :slight_smile:

Als kleines Beispiel was ich machen möchte mit den Encodern (habe diese hier: STEC12E07: Drehimpulsegeber, 24 Impulse - 24 Rastungen, vertikal bei reichelt elektronik

Hier ein video leider mit Poti´s: MIDI Daten-Format Tutorial (E03) - MIDI-Controller selber bauen - YouTube

P.S. Diesen Götz Müller Dürholt habe ich schon vor 3 Wochen angeschrieben und warte immer noch vergeblich auch eine Antwort!

Hallo,

ist schon verständlicher, daraus schlussfolgere ich jedoch, dass der Encoder dein Problem nicht löst. Weil die Kanaldoppelbelegung bleibt ja so erhalten. Demzufolge ist es egal ob du ein Poti abfragst oder einen Encoder. Beim kleinsten "Klick" am Encoder würde auch der falsche Kanal mit geändert. Laut meinem aktuellen Verständnis.

Dein Arduino Programm muß dafür sorgen das zuerst ein Wert ausgelesen wird, dieser wird mittels Poti oder Encoder verändert und dann erst wieder zurückgeschrieben. Wie sonst? Ein Encoder schaut ja auch nicht nach irgendwelchen Werten. Das ist in deinem Fall nur ein dummes Stellglied. Der einzigste Unterschied wird sein, mittels Poti arbeitest du mit Absolutwerten (0...1023) und mit Encoder immer mit relativen Werten +/- 1

Hallo Doc_Arduino,

das ist schon richtig, ich arbeite dann mit relativen Werten, jedoch ändere ich erst beim Drehen einen Wert, um es noch besser zu verstehen wie ich das meine:

Wenn ich in Cubase meine Spur 1 an klicke und mit dem Encoder drehe, würde sich nur in Spur 1 ein Wert verändern. Klicke ich Spur 2 an, verändert sich nur dort der Wert, jedoch nicht an Spur 1 (hat aber nichts mit dem Arduino Programm zu tun, das macht Cubase selbst, das verschickt immer nur die Werte der ausgewählten Spur und empfängt dort dann auch nur die Daten) hoffe es ist einigermaßen verständlich geschrieben :slight_smile:

Hallo,

okay, was ich nun scheinbar verstanden habe ist, du drückst weiterhin in der Software deine Tasten (das war bisher völlig unklar) und willst direkt extern live den Wert ändern? Auslesen, "am Rad drehen", zurückschreiben. Also zurück auf Anfang. Woran hängt es jetzt?

Hi, es hängt denke ich mal am zwischen speichern des ausgelesenen Wertes, habe hier mal meinen entwurf wie er bisher steht, kann natürlich sein das er komplett falsch ist xD:

#include <MIDI.h>
#include <Encoder.h>

#define LEDPWM1 3
#define LEDPWM4 9
#define LEDPWM5 10
#define LEDPWM6 11
MIDI_CREATE_DEFAULT_INSTANCE();


Encoder myEnc(5, 6);

void setup() {
 Serial.begin(31250);
 Serial.println("Basic Encoder Test:");
  MIDI.begin(MIDI_CHANNEL_OMNI); // Initializiert die Midi Library.
 // OMNI setzt die die Read funktion auf alle Kanäle.. MIDI.begin(2) würde nur Noten/Value  
 // auf Kanal 2 lesen.
 MIDI.setHandleControlChange(MyCCFunction); //setzt den Befehl Controllchange zu lesen!
 MIDI.setHandleControlChange(MyCCFunction2);

}

long oldPosition  = -999;
 long MIDIvalue1old = 0;
 long MIDIvalue1 = 0;
 long encoderDifferenz = 0;


void loop() {
 MIDI.read();

 long newPosition = myEnc.read();
 
 if (newPosition < oldPosition) { // soll beim links drehen passieren
   MIDIvalue1 = (MIDIvalue1old - (oldPosition - newPosition)); //soll ausrechnen wie viel verringert wird
   sendeMIDI (176,13,MIDIvalue1); // soll dann auf Kanal 1, Note 13, den ausgerechneten Wert versenden
   oldPosition = newPosition;       
 }
 if (newPosition > oldPosition) { // soll beim rechts drehen passieren
   MIDIvalue1 = (MIDIvalue1old + (newPosition - oldPosition)); // werte sollen addiert werden
   sendeMIDI (176,13,MIDIvalue1);
   oldPosition = newPosition;   
 }
}


void sendeMIDI(int statusByte, int dataByte1, int dataByte2) {
Serial.write(statusByte);
Serial.write(dataByte1);
Serial.write(dataByte2);
}

void MyCCFunction2(byte channel, byte number, byte value){ //funktion zum Empfangen von midi daten
 switch (number) {
   case 13:
   MIDIvalue1old == value; //soll den Empfangenen Wert in MIDIvalue1old zwischenspeichern
   break;
 }
 
}
//funktion für die LED´s (hier
// für eigentlich uninteressant:
void MyCCFunction(byte channel, byte number, byte value) { 
 switch (number) { 
   case 22:
     analogWrite(LEDPWM1, value * 2);
     break;
   case 26:
     analogWrite(LEDPWM5, value * 2);
     break;
   case 27:
     analogWrite(LEDPWM6, value * 2);
     break;
 }
}

P.s. das Serial.write(31250) ist die reale MIDI geschwindigkeit, da ich die Daten ja über die RX und TX schnittstelle über ein MIDI to USB kabel empfange/sende!

Zu dem ist mir gerade aufgefallen, das ich dem Programm noch gar keinen Bereich von bis mit geteilt habe (Midi geht von 0 -127, wärend es momentan so wäre wenn ich eine stunde nach rechts drehe müsste ich auch wieder eine stunde nach links drehen, bis überhaupt mal was passiert xD wobei sich warscheinlich dann cubase vorher aufhängen würde^^)

ansonsten haut mir die IDE keine Fehler raus^^