[DOKU] DIY: FavSwitch – Arduinobasierter Midi Fußschalter

  • Ersteller Direwolf
  • Erstellt am
Direwolf
Direwolf
Registrierter Benutzer
Zuletzt hier
12.05.23
Registriert
19.08.03
Beiträge
979
Kekse
1.371
Ort
Thüngfeld
Seit einiger Zeit schwirrt mir die Idee im Kopf rum: Ich hätte gerne einen Favoritenkanalumschalter kurz FavSwitch. Der soll ganz einfach per Tasterdruck auf einen bestimmtes Midi Programm springen und beim zweiten Druck wieder zurück zu dem Programm, das vorher ausgewählt war. So kann man dann von jedem beliebigen Progamm auf den Solo Sound und wieder zurück wechseln.
Leider gibt es so etwas noch nicht zu kaufen. Da hilft nur: Selbst bauen.

Glücklicherweise bin ich bei meinen Recherchen auf ein tolles Teil gestoßen: Den Arduino (http://arduino.cc). Hierbei handelt es sich um eine Mikrokontrollerplattform, die einfach erweiterbar und programmierbar ist.
Da in dem Gehäuse, das ich verwenden will wenig Platz ist habe ich mich für die kleine Variante, den Arduino Nano, entschieden.
Ich habe gleich ein komplettes Einsteigerkit mit allem nötigen Zubehör bestellt:

FavSwitch01.jpg

FavSwitch02.jpg


Nach einigen Hardware- und Softwareseitigen Irrungen und Wirrungen habe ich dann eine kleine Versuchsschaltung aufgebaut:

FavSwitch03.jpg

FavSwitch04.jpg

FavSwitch05.jpg


Der Code ist relativ einfach:

Code:
#include <MIDI.h>

//input pin
static const int PIN_BUTTON = 8;
//output pins
static const int PIN_LED_RED = 9;
static const int PIN_LED_GREEN = 10;
static const int PIN_LED_BLUE = 11;
static const int PIN_LED_ACTIVITY = 13;

static const long DEBOUNCE_DELAY = 50;
static const int MIDI_CHANNEL = 1;

//this is the favourite program
const int PROGRAM_FAV = 3;

//current and previous midi program
int programCurrent = 1;
int programPrevious = -1;


//needed to detect button presses
int buttonStatus;
int lastButtonStatus = LOW;
long lastDebounceTime = 0;


void HandleProgramChange(byte channel, byte number) {
  blink();
  int program = int(number);
  if (programCurrent != program) {
    blink();
    if (programCurrent != PROGRAM_FAV) {
      programPrevious = programCurrent;
    }

    lightLed(program);
    programCurrent = program;
  }
}

void setup() {
  //init midi
  MIDI.begin(MIDI_CHANNEL);
  MIDI.setHandleProgramChange(HandleProgramChange);

  //set all pin modes
  pinMode(PIN_BUTTON, INPUT);

  pinMode(PIN_LED_RED, OUTPUT);
  pinMode(PIN_LED_GREEN, OUTPUT);
  pinMode(PIN_LED_BLUE, OUTPUT);
  pinMode(PIN_LED_ACTIVITY, OUTPUT);


  //led init to test if all leds work and to show the user that the system is operational
  loopColors();
  //no previous channel set led is set to blue
  setColor(0, 0, 255);
}

void loop() {
  //detect midi input handled by HandleProgamChange callback
  MIDI.read();

  //detect button
  int reading = digitalRead(PIN_BUTTON);
  if (reading != lastButtonStatus) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
  //wait for the debounce time
  if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) {
    if (reading != buttonStatus) {
      buttonStatus = reading;

      //button status changed from low to high->button pressed
      if (buttonStatus == HIGH) {
        switchChannel();
      }
    }
  }
  //here or above setColor(chStatus);
  lastButtonStatus = reading;
}

void switchChannel() {
  int program = programCurrent;

  if (program == PROGRAM_FAV) {
    program = programPrevious;
  }
  else {
    program = PROGRAM_FAV;
    programPrevious = programCurrent;
  }
  //only if the new program is different to the old one set led status and channel
  if (program != programCurrent) {
    blink();
    MIDI.sendProgramChange(program, MIDI_CHANNEL);

    lightLed(program);
    programCurrent = program;
  }
}

void lightLed(int program) {
  if (program == PROGRAM_FAV) {
    setColor( 255, 0, 0);
  }
  else {
    setColor( 0, 255, 0);
  }
}

void loopColors()
{
  int delayTime = 250;
  setColor(255, 0, 0); // red
  delay(delayTime);
  setColor(0, 255, 0); // green
  delay(delayTime);
  setColor(0, 0, 255); // blue

  int i = 0;
  while (i < 3) {
    digitalWrite(PIN_LED_ACTIVITY, LOW);
    delay(delayTime);
    setColor(255, 255, 255); // white
    digitalWrite(PIN_LED_ACTIVITY, HIGH);
    i++;
  }
  delay(delayTime);
}

void setColor(int red, int green, int blue)
{
  red = 255 - red;
  green = 255 - green;
  blue = 255 - blue;

  analogWrite(PIN_LED_RED, red);
  analogWrite(PIN_LED_GREEN, green);
  analogWrite(PIN_LED_BLUE, blue);
}

void blink() {[SPOILER="Sourcecode"][/SPOILER]
  digitalWrite(PIN_LED_ACTIVITY, HIGH);
  delay(100);
  digitalWrite(PIN_LED_ACTIVITY, LOW);
}


Initial schaltet das Programm die RGB-Led druch und blinkt kurz, um zu zeigen, dass die LED noch funktioniert und alles ok ist. Dann schaltet die LED auf blau um zu zeigen, dass noch kein Kanal gewählt wurde. Wird jetzt ein Kanal gewählt schaltet die LED auf grün um anzuzeigen, dass hier ein Programm aktiv ist, zu dem wieder zurück geschaltet werden kann. Drückt man den Taster am Board wird des Favorite-Programm gewählt und die LED wird rot. Drückt man den Taster noch einmal kommt man zum vorher ausgewählten Programm zurück.
Das kann man hier in Aktion sehen:



Soweit, so gut. Jetzt muss das Ganze auf eine Platine und in ein Gehäuse. Idealerweise wäre da ein kleines Fußschaltergehäuse wie z.B. von einem Kanalumschalter eines Verstärkers. Mal schauen, wie ich das am besten löse. Ich werde euch auf dem Laufenden halten.

Ich freue mich zwischenzeitlich natürlich über Kritik, Anregungen und Ideen.


Viele Grüße Bastian
 
Eigenschaft
 

Anhänge

  • FavSwitch.txt
    3,2 KB · Aufrufe: 289
  • Gefällt mir
  • Interessant
Reaktionen: 5 Benutzer
Colle Sache!

Mein nächster Amp soll auch ein Arduino verpasst bekommen, der dann Kanal-Schalterei, Tuner etc. übernehmen soll. Deshalb find ich so Projekte sowieso klasse!
 
Vor allem wenn man bedenkt, dass es nur ein paar Zeilen Code brauch und ein paar Centbauteile und man hat einen fertigen Midicontroller. Das ging noch vor einigen Jahren nicht so einfach.

Viele Grüße Bastian
 
Arduino ist wirklich cool, hab schon ein paar Projekte völlig abseits von Musik damit gemacht (Nerdkram halt :) ).
Irgendwann will ich mal mein FCB1010 mit einem Arduino pimpen damit ich mehr MIDI Befehle kann...
Aber die FavSwitch Idee finde ich generell ultra gut! Also den Anwendungszweck alleine schon..
 
Hmm, vielleicht sollte ich meinen Arduino auch mal aus der Schublade holen und wieder was damit machen :)
 
Die Idee den Arduino als "Gehirn" für einen Midi Controller einzusetzen hatte ich auch schon. Das ist aber noch etwas komplizierter. Aber sicher eine Herausforderung.--- Beiträge wurden zusammengefasst ---
Es gibt ein kleines update:
Ich habe ein passendes Gehäuse gefunden:
https://www.thomann.de/de/lead_foot_fs_1.htm

Ich bin gerade dabei es zu modifizieren, dass es passt:

20141022_184142.jpg 20141023_152438.jpg

Die Midi Anschlüsse kommen auf die Rückseite, genau wie der USB-Anschluss. Der dient vorerst auch zur Spannungsversorgung. Der Fußtaster bleibt, darüber kommt die LED.

Des weiteren bin ich gerade dabei meine Versuchsschaltung aufzuräumen und auf eine Rasterplatine zu übertragen. Alle Bauteile sind bestellt, dann kann auch der praktische Teil bald anfangen.

Ich habe mir auch schon Gedanken um ein paar kleine Erweiterungen gemacht:
- 9Volt in und through, um das mit der Spannungsversorgung zu erleichtern
- Es sollte möglich sein, das Favorite Programm einzustellen, ohne jedesmal das Programm ändern zu müssen (DIP-Switch, Potentiometer, o.ä)
- Evl baue ich auch spaßeshalber mal ein Display ein.

Bisher bin ich vom Arduino wirklich begeistert, vielleicht kommen auch noch weitere Projekte, wenn das hier fertig ist. Mir schwirren gerade ein paar Ideen im Kopf rum. Z. B. die Steuerung eines Wah Pedals der Annäherungssensor oder eine dynamische Beleuchtung meines POD je nach ausgewähltem Programm und noch vieles mehr.

Viele Grüße
Bastian
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: 1 Benutzer
Die ersten Schritte in Richtung Platine sind gemacht. Ich habe meinen Versuchsaufbau noch einmal etwas aufgeräumt und softwaretechnisch erfasst:
2014-10-23 19_05_37-FavSwitch.fzz - Fritzing - [Steckplatinen-Ansicht].png 20141023_190422.jpg

Auf der Platine wird das in etwa dann so:

2014-10-23 19_05_59-FavSwitch.fzz - Fritzing - [Leiterplattenansicht].png

Ein paar Verrenkungen musste ich machen, damit es passt. Gerade den Bereich um den Optokoppler werde ich beim zusammenbau etwas eleganter machen.

Ich bin leider nicht so wirklich das Elektronikgenie, deswegen bin ich für Anregungen und Ideen und natürlich auch Lob und Kritik offen.

Viele Grüße
Bastian
 
Eventuell eine blöde Frage, wozu brauchst du einen Optokoppler?


Bzgl Midi Controller erweitern mit Arduino:
Ich denke gerade, man könnte sogar einen Raspberry PI nehmen, kleines Linux drauf laufen lassen etc.
 
Ach so, stimmt du willst ja auch nen Eingang haben :)
Für Midi Out alleine hätte UART denke ich gereicht.

Jo mit nem PI könnte man schon witzige Sachen machen. Zum Beispiel läuft die Editiersoftware direkt auf dem selben Gerät, wenn man sich eine bastelt. Einfach Monitor,
Tastatur, Maus dran...Speicher gleich dabei. Hm! Jetzt hab ich Bock drauf, verdammt ...
 
Ach so, stimmt du willst ja auch nen Eingang haben :)
Für Midi Out alleine hätte UART denke ich gereicht.

Jo mit nem PI könnte man schon witzige Sachen machen. Zum Beispiel läuft die Editiersoftware direkt auf dem selben Gerät, wenn man sich eine bastelt. Einfach Monitor,
Tastatur, Maus dran...Speicher gleich dabei. Hm! Jetzt hab ich Bock drauf, verdammt ...

Das Problem mit dem Pi ist meiner Meinung nach, dass damit nichts einfach geht. Also nicht einfach plug & play. Von der Plattfporm her bietet der Pi natürlich sehr viel mehr Möglichkeiten. Die Idee mit dem Editor im selben Gerät gefällt mir. Gibts nicht jetzt auch nen Touchscreen extra für den Pi? Dann hätten sich Monitor und Tastatur auch erledigt. :)
 
Ich finde eigentlich eher, dass mit nem PI alles einfacher geht, weil schon ein Betriebssystem da ist :)
Dann kann ich zB alles in Java schreiben, von wo aus sich die Hardware Pins auch kontrollieren ließen. Ach, Zeit müsste man haben für so viele schöne Projekte...
 
Verdammt, ich sollte hier nicht weiterlesen.
Seit Ewigkeiten halte ich der Versuchung PI stand und jetzt habe ich total Bock so ein Ding zu bestellen und irgendwas damit zu bauen :ugly:
Ihr seid schuld ;)

Gibts nicht jetzt auch nen Touchscreen extra für den Pi?

Ja, den Adafruit PiTFT. Den gibt es zum Beispiel bei Amazon für lediglich 37 EUR.
Da könnte man schon tolle Dinge mit machen glaube ich.
 
37€ o_O
Jetzt wirds immer interessanter für mich
 
Ich habe sowohl Pi als auch Arduino im Einsatz, wenn auch in völlig anderer Verwendung und für solche Zwecke würde ich eher Arduino einsetzen.
"Headless" ist mit dem Pi nicht 100% praktikabel und ich hatte immer mal Probleme, dass sich das Linux abgeschossen hat. Ausserdem hat man schon etwas Boot Zeit, je fetter das OS wird.
Denke Arduino ist hier schon die richtige Wahl.
 
Ich wollte den FAV-Switch auch ausprobieren. Das kompilieren hat aber nicht auf Anhieb funktioniert.
Das wurde immer mit folgender Meldung abgebrochen ....

exit status 1
'MIDI' was not declared in this scope


Damit es läuft, muss direkt nach der ersten Zeile mit .... #include <MIDI.h> ...

MIDI_CREATE_DEFAULT_INSTANCE(); // erzeugen des midi objektes

eingefügt werden.

Ansonsten 100 Plus-Punkte an @Direwolf :claphands:
 
Hi,

Für so etwas bin ich ja auch immer recht schnell zu haben, da ich vermutlich besser bastele als spiele.

Nachdem ich vor ein paar Monaten einen Fußschalter auf Pi-Zeo Basis für meinen Positive Grid Spark Übungsamp gebaut habe, der über Bluetooth mit dem Amp kommuniziert und dessen Feineinstellungen sich über jeden Browser steuern lassen, bin ich Vorgestern zufällig auf dieses Projekt gestoßen:

https://www.tomshardware.com/news/raspberry-pi-4-guitar-pedalboard

Den Code und die Bauanleitung des Entwicklers gibt es auf Github:
https://github.com/Quinny/GuitarEffects

...nicht, dass ich so etwas nun wirklich dringend brauchen würde, aber ich habe eigentlich alle benötigten Teile bereits in meinen Kramkisten.

Gruß
Mark
 

Ähnliche Themen


Unser weiteres Online-Angebot:
Bassic.de · Deejayforum.de · Sequencer.de · Clavio.de · Guitarworld.de · Recording.de

Musiker-Board Logo
Zurück
Oben