PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino (Poti + Button) Midi


alkorithmus
2013-01-03, 01:11:23
Hallo zusammen,

Als erstes kurz was zum Setup: Teensy auf Breadboard, 3 Potis an Analog (2 davon sind Folienpotentiometer) und ein Pushbutton. Der Pushbutton wird die ganze Zeit über Seriell abgefragt ob er gedrückt ist oder nicht (siehe Codebeispiel). Das ganze wird als Midi direkt Ableton geschickt und dort als Instrument ausgegeben.
Mein Plan ist der:

Wenn ich den Button drücke und sich der Wert an einen der Potentiometer ändert, gebe nur diesen Wert als Midi weiter. Gemappt wird der Wert sowieso. Mein Problem ist: Wie muss die Bedingung dafür ausschauen? Sollte das in einer Schleife stehen? Wenn ja, wie müsste die aufgebaut sein?

Hoffe es kann mir geholfen werden. Abschließend noch der Code.

int softPotUno=A0;
int softPotDos=A1;
int softPotTres=A2;
int buttonPin=6;

int valueUno=0;
int valueDos=0;
int valueTres=0;

void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
digitalWrite(softPotUno, HIGH);
digitalWrite(softPotDos, HIGH);
digitalWrite(softPotTres, HIGH);
}

void loop()
{
int value;
int buttonVal = digitalRead(buttonPin);

// SOFTPOT UNO

for (int buttonPin; buttonPin==LOW; buttonPin=LOW)
{
Serial.println(valueUno);
map(value,0,1023,10,90);
usbMIDI.sendNoteOn(value, 127, 1);
}

if (digitalRead(buttonPin)==HIGH)
{
usbMIDI.sendNoteOff(value, 0, 1);
//delay(250);
}
delay(250);
}

Gohan
2013-01-03, 09:59:21
for (int buttonPin; buttonPin==LOW; buttonPin=LOW)
{
Serial.println(valueUno);
map(value,0,1023,10,90);
usbMIDI.sendNoteOn(value, 127, 1);
}


Hier kommst du nie wieder raus. Auch sieht das Konstrukt echt komisch aus, meintest du vielleicht eher while(digitalRead(buttonPin)==LOW)??? Über den Rest muss ich kurz nachdenken ;)

Also eigentlich müsste das (Pseudecode) ungefähr so hinhauen, geht schöner, ist aber auch nur schnell runtergetippt.


int value1old = 0;
int value2old = 0;
int value3old = 0;

int value1new = 0;
int value2new = 0;
int value3new = 0;


while(digitalRead(buttonPin)==HIGH) {
value1old = value1new;
value2old = value2new;
value3old = value3new;

value1new = analogRead(pin1);
value2new = analogRead(pin2);
value3new = analogRead(pin3);

if (value1old != value1new || value2old != value2new || value3old != value3new) {
//An Midi-Port senden
}
}

DraconiX
2013-01-03, 10:14:03
Ist das AVR-GCC?

alkorithmus
2013-01-03, 10:25:54
snip
Geil! Probiere ich nachher gleich mal aus. Danke | Edit: Bei der seriellen Push Abfrage des Buttons ist "LOW" der gedrückte Zustand. Musste ich mich auch erst einmal daran gewöhnen.
Ist das AVR-GCC?
Arduino bringt seine eigene Sprache mit. Wobei ich auf dem Teensy entwickle. Sehe aber gerade dass sich AVR-GCC und Arduino sehr ähnlich sind.

Gohan
2013-01-03, 10:34:59
Eigene Sprache würde ich nicht sagen, ist eher stinknormales C mit ein paar Bibliotheken für Arduino ;)

alkorithmus
2013-01-03, 14:55:34
So gerade mal ausprobiert: Funktioniert soweit gut. Jetzt habe ich aber das Problem, dass Ableton den letzten Ton immer stehen lässt, obwohl ich mit: if (digitalRead(buttonPin)==HIGH)
{
usbMIDI.sendNoteOff(value1new, 0, 1);

}

sage, dass, wenn Button losgelassen, er nichts mehr senden soll. Die Töne bleiben aber am Ende immer stehen und erzeugen eine hässlich klingende Überlagerung.

Gohan
2013-01-03, 16:20:32
Kannst du nochmal den ganzen Code zeigen? Die Bedingung sieht ansich erstmal nicht falsch aus.

alkorithmus
2013-01-03, 16:44:28
Auch war ich mir leider nicht sicher wie es sich mit dem Value nun verhält. Es hilft sicher wenn ich kurz beschreibe was ich eigentlich vor habe: Ein Grundton wird gespielt, wenn der Button gedrückt wird. Dieser Ton wird dann beeinflusst durch die drei Potis. Bisher war es so, dass der Grundton nicht etwa sich geändert hatte sondern ein zweiter Ton drauf kam. Im Prinzip müsste der Grundton von dem Poti jedes Mal abgelöst werden wenn er einen Wert sendet. (Also ich ihn benutze) ;(

int value1old = A0;
int value2old = A1;
int value3old = A2;

int buttonPin=6;

int value=0;

int value1new;
int value2new;
int value3new;

void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
digitalWrite(value1old, HIGH);
digitalWrite(value2old, HIGH);
digitalWrite(value3old, HIGH);
}


void loop()
{
int buttonVal = digitalRead(buttonPin);

while(digitalRead(buttonPin)==LOW)
{
int value=0;
Serial.println(value);

value1old = value1new;
value2old = value2new;
value3old = value3new;

value1new = analogRead(A0);
value2new = analogRead(A1);
value3new = analogRead(A2);

if (value1old != value1new || value2old != value2new || value3old != value3new) {
value=(??);
usbMIDI.sendNoteOn(??, 127, 1);
}
delay(250);
}
if (digitalRead(buttonPin)==HIGH)
{
value=(value1old,value2old,value3old);
usbMIDI.sendNoteOff(value, 0, 1);
}
}

Gohan
2013-01-03, 17:04:21
Ah okay, verstehe. Hab mir mal grad die usbmidi-Library angeschaut, du musst jede Note einzeln abschalten.

D.h. folgendes (aus dem Kopf):


void loop()
{
int buttonVal = digitalRead(buttonPin);

while(digitalRead(buttonPin)==LOW)
{
int value=0;
Serial.println(value);

value1old = value1new;
value2old = value2new;
value3old = value3new;

value1new = analogRead(A0);
value2new = analogRead(A1);
value3new = analogRead(A2);

if (value1old != value1new) {
turnOfAllNotes();
usbMIDI.sendNoteOn(value1new, 127, 1);
}
if (value2old != value2new) {
turnOfAllNotes();
usbMIDI.sendNoteOn(value2new, 127, 1);
}
if (value3old != value3new) {
turnOfAllNotes();
usbMIDI.sendNoteOn(value3new, 127, 1);
}

delay(250);
}
if (digitalRead(buttonPin)==HIGH)
{
turnOfAllNotes();
}
}

void turnOfAllNotes()
{
usbMIDI.sendNoteOff(value1old, 0, 1);
usbMIDI.sendNoteOff(value2old, 0, 1);
usbMIDI.sendNoteOff(value3old, 0, 1);
}

alkorithmus
2013-01-04, 11:02:35
:love4: Probiere das heute Abend mal aus. Danke

alkorithmus
2013-01-26, 19:22:43
Für Besucher, welche eventuell über einer Suchmaschine hier landen, habe ich noch den Code dabei. Er musste hier und da noch ein wenig umgeschrieben werden aber jetzt funktioniert es gut.

int value1old = A0;
int value2old = A1;
int value3old = A2;

int buttonPin=6;

int value=0;

int value1new = 0;
int value2new = 0;
int value3new = 0;

void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
digitalWrite(value1old, HIGH);
digitalWrite(value2old, HIGH);
digitalWrite(value3old, HIGH);
}

//void turnOffAllNotes()
//{
// if (digitalRead(buttonPin)==HIGH)
// {
// usbMIDI.sendNoteOff(0, 0, 1);
// usbMIDI.sendNoteOff(0, 0, 1);
// usbMIDI.sendNoteOff(0, 0, 1);
// }
//}

//void setPitch()
//{
// if (digitalRead(buttonPin)==HIGH)
// {
// usbMIDI.setHandlePitchChange(value3new);
// }
// }

void loop()
{
int buttonVal = digitalRead(buttonPin);
//int pitch = value3new;


while(digitalRead(buttonPin)==LOW)
{

value1new = analogRead(A0);
value2new = analogRead(A1);
value3new = analogRead(A2);

value1new = map(value1new,10,1000,75,30);
value2new = map(value2new,25,800,25,100);
value3new = map(value3new,10,1000,0,127);

if (value1old != value1new) {
Serial.println(value1new);
usbMIDI.sendNoteOff(value1old, 100, 1);
usbMIDI.sendNoteOn(value1new, 100, 1);
delay(50);
usbMIDI.sendNoteOff(value1new, 100, 1);
usbMIDI.sendNoteOff(value2new, 0, 1);
usbMIDI.sendNoteOff(value3new, 0, 1);
}

// if (value2old != value2new) {
// //turnOffAllNotes();
// usbMIDI.sendNoteOff(value2old, 100, 1);
// usbMIDI.sendNoteOff(value1new, 0, 1);
// usbMIDI.sendNoteOn(value2new, 100, 1);
// usbMIDI.sendNoteOff(value3new, 0, 1);
// delay(50);
// }

if (value3old != value3new) {
// usbMIDI.sendNoteOff(0, 0, 1);
// usbMIDI.sendNoteOff(0, 0, 1);
//usbMIDI.sendNoteOn(0, 100, 3);
//Serial.write(setPitch);
//delay(50);

}
delay(value3new);
}

}