home


The Walkman has a audio recording of some sort, on one side.. (L) And a audio signal that is used to trigger the arduino sequencer on the other side (R), that sequences the Gakken SX-150.
// 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<delay(10);
  write_pot(pot0, 0);
  write_pot(pot1, 0);
  
  //2 to 6 input
  for(byte i=2;i<6;i++){
    pinMode(i, INPUT);
    digitalWrite(i, HIGH);
  }
    
  pinMode(18, INPUT);
  digitalWrite(18, HIGH);
    
  pinMode(9, OUTPUT);   //beat indicator led
  pinMode(6, OUTPUT);   //bin led
  pinMode(7, OUTPUT);   //bin led
  pinMode(8, OUTPUT);   //bin led 
  pinMode(19, OUTPUT);  //trigger out
  
  //Serial.begin(9600);
}

void loop() {
  
  //read walkman starts here
  analogReference(INTERNAL);
  
  analogIn0 = (analogRead(0)/2) - 255;         //set to -255 +255
  analogIn0 = constrain(analogIn0, 0, 255);    //erase bottom half, only 0 to 255 is left over
  
  if(analogIn0 > 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;
    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<// Wait the end of the transmission
  {
  };
  return SPDR;                    // return the received byte
}

Copy "ilovegijs" here: (it stops spam bots)
Put your here:
1977 B.C. till 2010 © Gijs Gieskes - about