Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 4

#include <USB-MIDI.

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 KEY_PRESSED LOW


#define KEY_NORMAL HIGH

void note_on(int ch, int note, int v) {


MIDI.sendNoteOn(note, v, ch);

sprintf(buffer, "ON ch %d, %d", ch, note);


Serial.println(buffer);
}

void note_off(int ch, int note, int v) {


MIDI.sendNoteOff(note, v, ch);

sprintf(buffer, "OFF ch %d, %d", ch, note);


Serial.println(buffer);
}
// Manuales

#define NMANUALS 2
#define SIGNALSXMANUAL 6
#define KEYS 12

int channelxmanual[NMANUALS] = {1, 2};


int keysxsignal[SIGNALSXMANUAL] = {12, 12, 12, 12, 12, 1};
int signal_pins[NMANUALS][SIGNALSXMANUAL] = {{22, 24, 26, 28, 30, 32},
{34, 36, 38, 40, 42, 44}};
int key_pins[KEYS] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45};
int first_note_at_octave[SIGNALSXMANUAL] = {96, 84, 72, 60, 48, 36}; //{36, 48, 60,
72, 84, 96};

#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};

int manuals_state[NMANUALS][SIGNALSXMANUAL][KEYS]; // AQUI


int pedal_state[PEDALSIGNALS][KEYS];
void shutdown_signals(int manual){
for (int i=0; i<SIGNALSXMANUAL; i++){
digitalWrite(signal_pins[manual][i], HIGH);
}
}

void shutdown_pedal_signals(){
for (int i=0; i<PEDALSIGNALS; i++){
digitalWrite(pedal_signal_pins[i], HIGH);
}
}

void select_signal(int manual, int sig){


shutdown_signals(manual);
digitalWrite(signal_pins[manual][sig], LOW);
}

void select_pedal_signal(int sig){


shutdown_pedal_signals();
digitalWrite(pedal_signal_pins[sig], LOW);
}

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++){

for (int j=0; j<SIGNALSXMANUAL; j++){


select_signal(i, j);

for (int k=0; k < keysxsignal[j]; k++){


int cur_state = manuals_state[i][j][k];
int cur_note = digitalRead(key_pins[k]);

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);

for (int j=0; j < pedal_keysxsignal[i]; j++){


int cur_state = pedal_state[i][j];
int cur_note = digitalRead(pedal_key_pins[j]);

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); }

for (int i=0; i<SIGNALSXMANUAL; i++){


int pin = signal_pins[m][i];
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
}
}
}

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();

pinMode(53, OUTPUT); // test pin to send low output


digitalWrite(53, KEY_PRESSED);
}

void loop() {
process_pedal();
process_manuals();
MIDI.read();
}

You might also like