// Number of Drives #define DRIVES 3 // Constants for control pin parameters char pinDir[DRIVES] = { 3, 6, A0 }; // Direction Pins char pinStep[DRIVES] = { 4, 7, A1 }; // Step pins char pinEnable[DRIVES] = { 8, 9, 10 }; // Audio Enable pins // Drive Interface pins #define P_INDEX 2 // Index Pulse Input Pin #define P_WGATE 5 // Write Gate Enable Pin // Flags used #define EN_DELAY 8 // Delay between end of seek and enable #define EN_OFF 100 // Note channel off // Control pins #define P_1 13 // Button 1 (Read All) #define P_2 12 // Button 2 (Write All) #define P_3 A2 // Button 3 (Write Track) #define HOMERATE 6 // Step rate to home in milliseconds #define STEPRATE 3 // Step rate in milliseconds // MIDI Control signals #define NOTEOFF 0x80 #define NOTEON 0x90 // Global registers volatile char track[DRIVES]; // current track volatile char seekTo[DRIVES]; // Seek to track volatile char en[DRIVES]; // sound is enabled flag volatile char readButton; volatile char writeButton; volatile char trackButton; ISR(TIMER1_COMPA_vect) { char i; // Button Handler. // When a button is pressed, its register is set to // a 1, but only if the button is down. If the button // is then released, the flag is set to 2, which tells // the main program loop to perform the function. // If button is flaged, return with 2 in its register if(readButton == 1) readButton = 2; if(writeButton == 1) writeButton = 2; if(trackButton == 1) trackButton = 2; // If button is physically pushed, flag button. if(digitalRead(P_1) == LOW) readButton = 1; if(digitalRead(P_2) == LOW) writeButton = 1; if(digitalRead(P_3) == LOW) trackButton = 1; // Determine seek and sound enable for drives for(i=0;i<(DRIVES);i++) { if(track[i] > seekTo[i]) { digitalWrite(pinEnable[i],LOW); digitalWrite(pinDir[i],HIGH); // Set Direction digitalWrite(pinStep[i],LOW); // Pulse step digitalWrite(pinStep[i],HIGH); track[i]--; } else if(track[i] < seekTo[i]) { digitalWrite(pinEnable[i],LOW); digitalWrite(pinDir[i],LOW); // Set Direction digitalWrite(pinStep[i],LOW); // Pulse step digitalWrite(pinStep[i],HIGH); track[i]++; } else if(en[i] != EN_OFF) { // if stopped and enabled if(en[i] == 0) digitalWrite(pinEnable[i],HIGH); else en[i]--; } else { digitalWrite(pinEnable[i],LOW); } } } void stepIn () { digitalWrite(pinDir[0],LOW); // Set Direction digitalWrite(pinStep[0],LOW); // Pulse step digitalWrite(pinStep[0],HIGH); delay(STEPRATE); } void stepOut () { digitalWrite(pinDir[0],HIGH); digitalWrite(pinStep[0],LOW); digitalWrite(pinStep[0],HIGH); delay(STEPRATE); } void waitIndex () { while (digitalRead(P_INDEX) == LOW); while (digitalRead(P_INDEX) == HIGH); } void homeDrive () { char i; digitalWrite(pinDir[0],HIGH); for(i=0;i<80;i++) { digitalWrite(pinStep[0],LOW); digitalWrite(pinStep[0],HIGH); delay(HOMERATE); } track[0] = 0; seekTo[0] = 0; } void writeTrack () { waitIndex(); digitalWrite(P_WGATE,LOW); waitIndex(); digitalWrite(P_WGATE,HIGH); } void readAll() { char i; TIMSK1 &= ~(1<36)) { seekTo[drive] = n-36; en[drive] = EN_DELAY; curr[drive] = n; } else if ((curr[drive] == n)&&(v==0)) { en[drive] = EN_OFF; } break; case NOTEOFF: v = Serial.read(); if (curr[drive] == n) en[drive] = EN_OFF; break; } } case 0x80: state = n; break; } } }