Professional Documents
Culture Documents
Organ Controller Usb - Ino
Organ Controller Usb - Ino
h>
#include <MIDI.h>
USBMIDI_CREATE_DEFAULT_INSTANCE();
CREATE_MIDI_INSTANCE();
char buffer[250];
// - - - - - - - - - - - - - - - - - - - - - - -
/**
* Hay problemas cuando envio muchas notas. Hay que flushear el buffer o algo antes
de enviar
*/
#define note_off_v 0
#define note_on_v 127
#define pedal_ch 3
#define great_ch 1
#define swell_ch 2
#define NMANUALS 2
#define SIGNALSXMANUAL 6
#define KEYS 12
#define PEDALSIGNALS 3
int pedal_signal_pins[PEDALSIGNALS] = {48, 50, 52};
int pedal_keysxsignal[PEDALSIGNALS] = {12, 12, 3};
int pedal_key_pins[KEYS] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int first_note_at_pedal_octave[PEDALSIGNALS] = {36, 48, 60};
void shutdown_pedal_signals(){
for (int i=0; i<PEDALSIGNALS; i++){
digitalWrite(pedal_signal_pins[i], HIGH);
}
}
void initialize_manuals_state(){
for (int i=0; i<NMANUALS; i++){
for (int j=0; j<SIGNALSXMANUAL; j++){
for (int k=0; k< keysxsignal[j]; k++){
manuals_state[i][j][k] = KEY_NORMAL;
}
}
}
}
void initialize_pedal_state(){
for (int i=0; i<PEDALSIGNALS; i++){
for (int j=0; j< pedal_keysxsignal[i]; j++){
pedal_state[i][j] = KEY_NORMAL;
}
}
}
void process_manuals(){
for (int i=0; i<NMANUALS; i++){
if (KEY_PRESSED == cur_note){
if (KEY_NORMAL == cur_state){
note_on(channelxmanual[i], first_note_at_octave[j] - k, note_on_v);
manuals_state[i][j][k] = KEY_PRESSED;
}
}else{ // KEY_NORMAL
if (KEY_PRESSED == cur_state){
note_off(channelxmanual[i], first_note_at_octave[j] - k, note_off_v);
manuals_state[i][j][k] = KEY_NORMAL;
}
}
}
}
shutdown_signals(i);
}
}
void process_pedal(){
for (int i=0; i<PEDALSIGNALS; i++){
select_pedal_signal(i);
if (KEY_PRESSED == cur_note){
if (KEY_NORMAL == cur_state){
note_on(pedal_ch, first_note_at_pedal_octave[i] + j, note_on_v);
pedal_state[i][j] = KEY_PRESSED;
}
}else{ // KEY_NORMAL
if (KEY_PRESSED == cur_state){
note_off(pedal_ch, first_note_at_pedal_octave[i] + j, note_off_v);
pedal_state[i][j] = KEY_NORMAL;
}
}
}
shutdown_pedal_signals();
}
}
void setup_manual_pins(){
for (int m=0; m<NMANUALS; m++){
for (int i=0; i<KEYS; i++){ pinMode(key_pins[i], INPUT_PULLUP); }
void setup_pedal_pins(){
for (int i=0; i<KEYS; i++){ pinMode(pedal_key_pins[i], INPUT_PULLUP); }
for (int i=0; i<PEDALSIGNALS; i++){
int pin = pedal_signal_pins[i];
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
}
}
void setup() {
// put your setup code here, to run once:
MIDI.begin(MIDI_CHANNEL_OMNI);
Serial.begin(115200);
// manuals setup
initialize_manuals_state();
setup_manual_pins();
// pedal setup
initialize_pedal_state();
setup_pedal_pins();
void loop() {
process_pedal();
process_manuals();
MIDI.read();
}