Direwolf
Registrierter Benutzer
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:
Nach einigen Hardware- und Softwareseitigen Irrungen und Wirrungen habe ich dann eine kleine Versuchsschaltung aufgebaut:
Der Code ist relativ einfach:
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
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:
Nach einigen Hardware- und Softwareseitigen Irrungen und Wirrungen habe ich dann eine kleine Versuchsschaltung aufgebaut:
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