// Gijs Gieskes juli 2009 // Sequencer for Synth Car V3 // // credits: // http://mrbook.org/blog/2008/11/22/controlling-a-gakken-sx-150-synth-with-arduino/ #define DATAOUT 11//MOSI #define DATAIN 12//MISO - not used, but part of builtin SPI #define SPICLOCK 13//sck #define SLAVESELECT 10//ss volatile boolean goInt = false; int incomingByte = 0; //seq unsigned long mtel = 0; byte pentlader[] = {0, 4, 7, 11, 14, 17}; byte drPin[] = {5, 6, 7, 8}; byte effectPin = 9; byte pent[] = {50, 20, 50, 15, 50, 29, 50, 30}; byte slide[] = { 1, 1, 1, 0, 0, 1, 1, 1}; byte effect[] = {0, 0, 0, 0, 0, 0, 0, 0}; byte drums[] = {0, 0, 0, 0, 0, 0, 0, 0}; byte length = 0; byte out = 0; byte reproCount = 0; byte repeat = 8; byte repeatB = 8; byte octv = 24; void setup() { byte clr; pinMode(DATAOUT, OUTPUT); pinMode(DATAIN, INPUT); pinMode(SPICLOCK,OUTPUT); pinMode(SLAVESELECT,OUTPUT); digitalWrite(SLAVESELECT,HIGH); //disable device SPCR = (1<> 8) & 0x00FF; dacSPI0 |= 0x10; dacSPI1 = sample & 0x00FF; digitalWrite(SLAVESELECT,LOW); SPDR = dacSPI0; // Start the transmission while (!(SPSR & (1<prevNote; i--){ int diff = 48 - i; diff *= 12; write_value (1125 - diff); } }else{ int diff = 48 - incomingByte; diff *= 12; write_value (1125 - diff); } // 1270 C4 60 // 1125 C3 48 // 980 C2 36 // 835 C1 24 // 690 C0 12 } void noteOff() { write_value(0); } void loop() { /* if(millis() - mtel > 100){ mtel = millis(); interCount(); } */ if(goInt){ randomSeed(analogRead(0)); mtel = millis(); length++; length %= repeat; if(reproCount == 0){ repro(); } reproCount++; reproCount %= repeatB*2; playDrums(length); effectF(); out = pent[length]; if(slide[length] != 2){ playNote(out, slide[length]); } prevNote = out; goInt = false; } } void effectF(){ if(effect[length]){ digitalWrite(effectPin, HIGH); }else{ digitalWrite(effectPin, LOW); } } void playDrums(byte dsel){ if(drums[dsel] < 4){ for(byte i=0; i<8; i++){ if(dsel == i){ digitalWrite(drPin[i], HIGH); }else{ digitalWrite(drPin[i], LOW); } } } } void interCount(){ goInt = true; } void repro(){ repeat = 8 >> random(3); repeatB = repeat*random(1,4); for(byte i=0; i<8; i++){ if(!random(5)){ pent[i] = pentat(); slide[i] = random(3); effect[i] = random(3); } if(!random(4)){ drums[i] = random(6); } octv = (12*random(1, 5))-1; Serial.println(map(analogRead(1), 0, 1023, 1, 9), DEC); } } int pentat(){ int pt = pentlader[random(6)]; pt += octv; return pt; }