/* * Test Firmware for Drummer * by jörg piringer */ /* TODO: */ #define ON_TIME 50 #define OFF_TIME 150 #define NOTE_ON B1001 #define NOTE_OFF B1000 #define AFTERTOUCH B1010 #define CTRL_CHANGE B1011 #define PROGRAM_CHANGE B1100 #define AFTERTOUCH2 B1101 #define PITCHBEND B1110 #define MIDI_CLOCK_START 0xFA #define MIDI_CLOCK_STOP 0xFC #define MSG_START B10000000 #define FIRST_NOTE 60 #define SOLENOID_START_PIN 8 // solenoidstart pin #define SOLENOID_PINS 6 // number of solenoid pins #define SOLENOID_MAX_COUNT 12000 #define ALL_OFF_PIN 2 int solenoidStatus[SOLENOID_PINS]; boolean testMidi(byte b, byte msg) { return (b >> 4) == msg; } byte waitForByte() { while(Serial.available() <= 0) delay(1); return Serial.read(); } void solenoidOn(int nr) { if(solenoidStatus[nr] <= 0) { solenoidStatus[nr] = 1; digitalWrite(SOLENOID_START_PIN+nr, HIGH); } } void solenoidOff(int nr) { solenoidStatus[nr] = 0; digitalWrite(SOLENOID_START_PIN+nr, LOW); } void solenoidCheckAll() { for(int i = 0; i < SOLENOID_PINS; i++) { if(solenoidStatus[i] > 0) { solenoidStatus[i]++; if(solenoidStatus[i] > SOLENOID_MAX_COUNT) { solenoidOff(i); } } } } void allOff() { for(int i = 0; i < SOLENOID_PINS; i++) { solenoidOff(i); } } void selfTest() { for(int x = 0; x < 6; x++) { for(int i = 0; i < SOLENOID_PINS; i++) { solenoidOn(i); delay(400/(x+1)); solenoidOff(i); } } } void setup() // run once, when the sketch starts { pinMode(ALL_OFF_PIN, INPUT); for(int i = 0; i < SOLENOID_PINS; i++) { pinMode(SOLENOID_START_PIN+i, OUTPUT); // sets the digital pin as output solenoidOff(i); } //Serial.begin(38400); Serial.begin(31250); // MIDI Serial.println("init!"); if(digitalRead(ALL_OFF_PIN) == HIGH) { Serial.println("self test!"); selfTest(); } } void loop() // run over and over again { byte incomingByte; if(digitalRead(ALL_OFF_PIN) == HIGH) { allOff(); } // perform auto off test solenoidCheckAll(); // send data only when you receive data: if(Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); if(incomingByte & MSG_START) // start of midi message { if(testMidi(incomingByte,NOTE_ON)) { int noteNr = waitForByte(); int velocity = waitForByte(); int nr = 0; if((noteNr >= FIRST_NOTE) && (noteNr < FIRST_NOTE+SOLENOID_PINS)) { nr = noteNr-FIRST_NOTE; } solenoidOn(nr); } else if(testMidi(incomingByte,NOTE_OFF)) { int noteNr = waitForByte(); int velocity = waitForByte(); int nr = 0; if((noteNr >= FIRST_NOTE) && (noteNr < FIRST_NOTE+SOLENOID_PINS)) { nr = noteNr-FIRST_NOTE; } solenoidOff(nr); } else if(incomingByte == MIDI_CLOCK_START) { Serial.println("start!"); } else if(incomingByte == MIDI_CLOCK_STOP) { allOff(); Serial.println("stop!"); } else { Serial.print(incomingByte,HEX); Serial.print(" "); } } else { Serial.print(incomingByte,HEX); Serial.print(" "); } } }