// MIDI Real Time Bytes byte midi_start = 0xfa; byte midi_stop = 0xfc; byte midi_clock = 0xf8; byte midi_continue = 0xfb; // Working Variables and Pins int nano_tick_1 = 0; int nano_tick_2 = 0; int play_flag = 0; byte data; // general working byte for serially-received data byte channel; byte ccnumber; byte ccvalue; int flag_previous = 0; // keeps track of the previus MIDI byte type received int nano_pin_1 = 7; int nano_pin_2 = 8; int nano_value_1 = 1; int nano_value_2 = 1; // Setup void setup() { Serial.begin(31250); pinMode(nano_pin_1, OUTPUT); pinMode(nano_pin_2, OUTPUT); } // Program void loop() { if(Serial.available() > 0) { data = Serial.read(); if(data == midi_start) { play_flag = 1; } else if(data == midi_continue) { play_flag = 1; } else if(data == midi_stop) { play_flag = 0; nano_tick_1 = 0; nano_tick_2 = 0; } else if((data == midi_clock) && (play_flag == 1)) { Sync(); } else if((data >= 0xb0) && (data < 0xc0) && (flag_previous == 0)) { channel = data & B00001111; flag_previous = 3; } else if((data < 0x80) && (flag_previous == 3)) { ccnumber = data; flag_previous = 4; } else if((data < 0x80) && (flag_previous == 4)) { ccvalue = data; doCC(channel, ccnumber, ccvalue); flag_previous = 0; } } } // Functions void Sync() { if(nano_tick_1 < nano_value_1) { digitalWrite(nano_pin_1, LOW); nano_tick_1 = nano_tick_1 + 1; } else if(nano_tick_1 >= nano_value_1) { digitalWrite(nano_pin_1, HIGH); nano_tick_1 = 0; } if(nano_tick_2 < nano_value_2) { digitalWrite(nano_pin_2, LOW); nano_tick_2 = nano_tick_2 + 1; } else if(nano_tick_2 >= nano_value_2) { digitalWrite(nano_pin_2, HIGH); nano_tick_2 = 0; } } void doCC(byte channel, byte ccnumber, byte ccvalue) { if(channel == 0 && ccnumber == 1) { nano_value_1 = (ccvalue >> 5) + 1; } else if(channel == 1 && ccnumber == 1) { nano_value_2 = (ccvalue >> 5) + 1; } }