// WalkSX // Gijs Gieskes 2009 #define DATAOUT 11 //MOSI #define DATAIN 12 //MISO - not used, but part of builtin SPI #define SPICLOCK 13 //sck #define SLAVESELECT 10 //ss byte pot=0; byte resistance=0; byte pot0 = B00000000; byte pot1 = B00010000; byte work = B00000000; //seq arr pitch byte arrP[4][8] = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; //seq arr effect byte arrF[4][8] = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; int analogIn0 = 0; int analogIn3 = 0; unsigned long previousMillis = 0; boolean checkHL = LOW; boolean anav = LOW; byte counter = 0; void setup() { //digi pot vals byte clr; pinMode(DATAOUT, OUTPUT); pinMode(DATAIN, INPUT); pinMode(SPICLOCK,OUTPUT); pinMode(SLAVESELECT,OUTPUT); digitalWrite(SLAVESELECT,HIGH); //disable device SPCR = (1< 20){ //set threshold previousMillis = millis(); //reset millis anav = HIGH; //set led high if(!checkHL){ //only send "1"? message for every beat. checkHL = HIGH; //reset checkHL counter++; counter %= map(analogRead(2), 0, 1023, 1, 8); } } if(millis() - previousMillis > 30){ checkHL = LOW; anav = LOW; } //sequencer starts here seq(); digitalWrite(9 , anav); //led digitalWrite(19 , anav); //trigger } void seq(){ static byte prevCount = 0; static byte selBankT = 0; static byte selBank = 0; //select bank 1, 2, 3 or 4 for(byte i=2; i<6; i++){ if(digitalRead(i) == LOW){ selBankT = i-2; } } //switch bank at step 0 if(counter == 0){ selBank = selBankT; } //record to array if(digitalRead(18) == LOW){ arrP[selBank][counter] = map(analogRead(1), 0, 1023, 67, 197); arrF[selBank][counter] = map(analogRead(3), 0, 1023, 0, 255); write_pot(pot0, arrP[selBank][counter]); write_pot(pot1, arrF[selBank][counter]); } //playback array if(prevCount != counter){ prevCount = counter; Serial.println(arrP[selBank][counter], DEC); if(arrF[selBank][counter] > 0){ write_pot(pot0, 0); write_pot(pot1, 0); delayMicroseconds(200); write_pot(pot0, arrP[selBank][counter]); write_pot(pot1, arrF[selBank][counter]); } digitalWrite(6, B0000001 & counter); digitalWrite(7, B0000001 & (counter >> 1)); digitalWrite(8, B0000001 & (counter >> 2)); } } byte write_pot(int address, int value){ digitalWrite(SLAVESELECT,LOW); //2 byte opcode spi_transfer(address); address = work; spi_transfer(value); value = work; digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer } char spi_transfer(byte data){ SPDR = data; // Start the transmission while (!(SPSR & (1<