Go Down

Topic: Zheremino (Read 854 times) previous topic - next topic

Engeeknyer

Hello Everyone,

That is my first post here, however I've been working with Arduino for a couple of years.
This project isn't a new one. I did it some time ago. I hope it could be interesting for you.

Zheremino it's a Optical Midi Theremin. In this project I wanted to control synthesizers from a sensor with a Theremin-like method. That is, playing the instrument without touching it. Despite the Theremin, this project don't play continous notes, without space between B3 and C4, for instance. I rather play with the natural keyboard transitions between notes. Due that, playing a scale sounds easy and you don't have to worry too much about the pitch, if the synth is rigth tunned, of course.

Here you will find a couple of videos about how it works:

http://www.youtube.com/watch?v=5sxPYtxMt5U
http://www.youtube.com/watch?v=dkrhHKk_PPU

And here comes the code,as I wrote then:

Code: [Select]

#define Nmedidas 38 //Define how many measures will count for averaging.
#define notaBaja 59 //Lowest note
#define notaAlta 72 //Highest note

int value;
int avg;
int Navg;
int sum;
int i;
int nota;

void setup(){
Serial.begin(31250); // MIDI baud rate
}

void loop(){
// measure and averaging the sensor
sum=0;
for (i=1; i<=Nmedidas; i++){
  value=analogRead(0);
  sum = sum + value;
  }
avg =map( sum / Nmedidas,40,400,notaBaja,notaAlta);

//Case 1: If there are no note changing
if((avg==Navg)||((avg<notaBaja)&&(Navg<notaBaja)))
  {
  goto fin;
  }

//Case 2: There were note playing and now must be off  "note off"
if((avg<=notaBaja)&&(Navg>=notaBaja)){
  Navg=avg;
  noteOn(0×80,nota,0);
  delay(30);
  goto fin;
  }

//Case 3: A new note must be played
//Send "note Off" and play the new onel
if((avg>=notaBaja)&&(avg<=notaAlta)){
  Navg=avg;
  noteOn(0×80,nota,00);
  nota=avg;
  noteOn(0×90,nota,90);
  delay(100);
  }

//Just an end label
fin:
;
}

// plays a MIDI note.
void noteOn(char cmd, char data1, char data2) {
Serial.print(cmd,BYTE);
Serial.print(data1,BYTE);
Serial.print(data2,BYTE);
}


Be happy!

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy