Here's my synth code.
Sorry there's not more comments.
It has a bunch of pots hooked up to A/D
and an encoder (to change programs - on pins 2 & ??
I have an R2R (4 bit) ladder on board, but haven't tried it out yet - it needs some serious pin rearranging to get the R2R on better pins for bitmath manipulation.
// Synth code by Paul Badger 2007
#include <math.h>
#define outpin 9 // high order output
//analog inputs
#define pitchPot 5
#define modPot 4
#define speedPot 1
#define phasePot 2
#define jukePot 3
#define stopPin 5
#define LEDbit0 10
#define LEDbit1 11
#define LEDbit2 12
#define LEDbit3 13
int randomWalkLowRange;
int randomWalkHighRange;
int val, runlevel;
volatile int encoder0PinA = 2;
volatile int encoder0PinB = 4;
volatile unsigned int encoder0Pos = 0;
int n = LOW;
int ptime, range, strt, inc;
int k, x, dur, freq, t,;
int i, j;
int sens, adder;
float ps, fpitch; // variable for pow pitchShift routine
float noteval;
//note values
float A = 14080;
float AS = 14917.2;
float B = 15804.3;
float C = 16744;
float CS = 17739.7;
float D = 18794.5;
float DS = 19912.1;
float E = 21096.2;
float F = 22350.6;
float FS = 23679.6;
float G = 25087.7;
float GS = 26579.5;
float A2 = 28160;
float A2S = 29834.5;
float B2 = 31608.5;
float C2 = 33488.1;
float C2S = 35479.4;
float D2 = 37589.1;
float D2S = 39824.3;
float E2 = 42192.3;
float F2 = 44701.2;
float F2S = 47359.3;
float G2 = 50175.4;
float G2S = 53159;
float A3 = 56320;
//rhythm values
int wh = 1024;
int h = 512;
int dq = 448;
int q = 256;
int qt = 170;
int de = 192;
int e = 128;
int et = 85;
int dsx = 96;
int sx = 64;
int thx = 32;
float majScale[] = {
A, B, CS, D, E, FS, GS, A2, B2, C2S, D2, E2, F2S, G2S, A3};
float minScale[] = {
A, B, C, D, E, F, GS, A2, B2, C2, D2, E2, F2, G2S, A3};
float creme[] = {
A, CS, D, CS, D, E, CS, D, CS, B, A};
float cremeDur[] = {
q, q, qt, qt, qt, q, q, qt, qt, qt, q};
void setup() {
pinMode(outpin, OUTPUT);
Serial.begin(9600);
pinMode(LEDbit0, OUTPUT);
pinMode(LEDbit1, OUTPUT);
pinMode(LEDbit2, OUTPUT);
pinMode(LEDbit3, OUTPUT);
pinMode(stopPin, INPUT);
digitalWrite(stopPin, HIGH); // turn on pullups
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullups
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // turn on pullups
attachInterrupt(0, doEncoder, CHANGE); // encoder pin on interrupt 0 - pin 2
Serial.println("start");
pinMode(outpin, INPUT); // turn off audio out
}
void loop(){
runlevel = encoder0Pos;
switch (runlevel){
case 0:
case 1:
doJoker1();
break;
case 2:
doScale2();
break;
case 3:
doArp3();
break;
case 4:
doCreme4();
break;
case 5:
doCreme5();
break;
case 6:
doScale6();
break;
}
}
//*******************************************************
void doJoker1(){
sens = analogRead(pitchPot);
//sens =500; // hardwire for testing
adder = max((sens/5),1);
for (x=sens; x<=(sens + (analogRead(speedPot) * 5)) ; x+=analogRead(jukePot)){
if ( digitalRead(stopPin) == 0){
break;
}
noteval = x; // transpose scale up 12 tones - pow function generates transpostion
dur = 100;
freqout((int)noteval, sens/47);
// delay(10);
}
delay(analogRead(modPot));
}
// endJoker1 ****************************************************
/*void arp2(){
sens = analogRead(pitchPot);
range = abs(512 - sens) * 4.0;
strt = sens * 1;
inc=abs(512 - sens);
if (inc == 0){
inc = 1;
}
for (x=strt; ( x > (strt / 4)) && (x < (inc * 30)); x* = (1 + ((sens - 512) / 1023.00))){
noteval = x; // transpose scale up 12 tones - pow function generates transpostion
dur = 100;
freqout((int)noteval, inc);
// if ((abs(sens - analogRead(0))) > 2){ break;}
}
delay(analogRead(modPot);
} */
// end ***************************************************
void doScale2(){
ps = ((float)analogRead(jukePot)) * 24.0 / 1023.0; // choose new transpose interval every loop
for(x= 0; x<=15; x++){
if ( digitalRead(stopPin) == 0){
break;
}
noteval = (majScale[x] / (float)(analogRead(pitchPot))) * pow(2,ps); // transpose scale up 12 tones - pow function generates transpostion
dur = analogRead(speedPot);
freqout((int)noteval, dur);
delay(analogRead(modPot));
}
}
/****************************************************/
void doArp3(){
Serial.println("arp");
fpitch = (float)analogRead(pitchPot) / 64;
Serial.print("fpitch = ");
Serial.println(fpitch, DEC);
if (fpitch == 0){
fpitch = 1;
}
strt = pow(2, fpitch);
Serial.print("strt = ");
Serial.println(strt, DEC);
for(x=strt; x<= strt * 4; strt = (strt * ( 1 + ((float)analogRead(jukePot)/1023)))){
if ( digitalRead(stopPin) == 0){
break;
}
dur = analogRead(speedPot);
freqout(strt, dur);
delay(analogRead(modPot));
}
}
/****************************************************/
void doCreme4(){
randomWalkLowRange = 0;
randomWalkHighRange = 10;
i = randomWalk(analogRead(speedPot) / 32);
noteval = creme[i] / ((float)analogRead(pitchPot));
dur = ((cremeDur[i] * (float)analogRead(jukePot)) / 64.0);
freqout(noteval, dur);
delay(analogRead(modPot));