// motor keys V014. // by: gijs gieskes. // script for use with arduino V12. #include int multiPinIn = 3; //digi pot vars #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 pots0 = B00000000; byte pots1 = B00010000; byte resistance=0; int analogVal0; int analogVal1; float sinA[] = {1, 0.989, 0.961, 0.917, 0.858, 0.787, 0.707, 0.62, 0.531, 0.442, 0.358, 0.281, 0.215, 0.163, 0.125, 0.104, 0.101, 0.115, 0.147, 0.195, 0.256, 0.329, 0.411, 0.499, 0.55, 0.639, 0.724, 0.803, 0.872, 0.927, 0.968, 0.993}; float sinB[] = {0.5, 0.599, 0.694, 0.781, 0.857, 0.919, 0.965, 0.992, 1, 0.988, 0.957, 0.907, 0.842, 0.763, 0.674, 0.578, 0.479, 0.38, 0.287, 0.202, 0.128, 0.069, 0.028, 0.005, 0.001, 0.017, 0.052, 0.105, 0.174, 0.255, 0.346, 0.443}; byte indexSinAM = 0; byte indexSinVib = 0; // timer / "interupt" variables long previousMillis = 0; long interval = 64; // AM long previousMillisAM = 0; byte intervalAM = 12; byte volumeAM = 128; // Vibrato long previousMillisVib = 0; byte intervalVib = 20; byte depthVib = 50; float depthVibFloat = 0.2; // multiplex variables boolean multiArray[16] = {HIGH,HIGH,HIGH,HIGH, HIGH,HIGH,HIGH,HIGH, HIGH,HIGH,HIGH,HIGH, HIGH,HIGH,HIGH,HIGH }; byte recKeysPin = 12; int volume = 255; int volumeOut = 255; byte ADSR = 0; //output naar motor byte outputStorage = 0; byte keyboardVal = 0; byte motorPin = 9; //eeprom pin boolean loadState = 0; boolean storeState = 0; byte LEDpin = 8; //keyboardSelector byte keySelect = 0; //keyboard values byte keysArr[2][12] = { {79,95,111,135,143,160,173,187,197,208,226,239}, {79,95,111,135,143,160,173,187,197,208,226,239} }; void setup(){ //digi pot vars byte clr; pinMode(DATAOUT, OUTPUT); pinMode(DATAIN, INPUT); pinMode(SPICLOCK,OUTPUT); pinMode(SLAVESELECT,OUTPUT); digitalWrite(SLAVESELECT,HIGH); //disable device SPCR = (1< intervalAM) { previousMillisAM = millis(); if(multiArray[13] == LOW || indexSinAM != 0){ if(indexSinAM<31){ indexSinAM++; }else{ indexSinAM = 0; } byte volumeTemp = 255 - volumeAM; volumeOut = (volume*sinA[indexSinAM])+volumeTemp; volumeOut = min(volumeOut, volume); }else{ indexSinAM = 0; volumeOut = volume; } } } void delayFunction(){ if (millis() - previousMillis > interval) { previousMillis = millis(); if(ADSR == 1){ if(volume < 255){ volume += analogVal0*0.1; } volume = min(volume, 255); }else{ if(volume > 1){ volume -= analogVal1*0.1; } volume = max(volume, 0); } } } // digi pots write byte write_pot(int address, int value){ digitalWrite(SLAVESELECT,LOW); //2 byte opcode spi_transfer(address); spi_transfer(value); digitalWrite(SLAVESELECT,HIGH); } //digipot transfer char spi_transfer(volatile char data){ SPDR = data; while (!(SPSR & (1< intervalVib) { previousMillisVib = millis(); if(indexSinVib<31){ indexSinVib++; }else{ indexSinVib = 0; } } }