Das digitale Theremin sitzt auf einem Shield für den Arduino Uno, das einfach aufgesteckt wird. Es enthält ein analoges Low-Pass-Filter zur Verbesserung des Klangs und einen Regler für die Lautstärke. Über einen optischen Sensor wird die Tonhöhe gesteuert. Der Ton wird über einen Line-Ausgang im Miniklinkenformat wiedergegeben. Weiterhin gibt es einen Schalter für einen Reset der Software, eine Status-LED sowie eine per Schalter aktivierbare Notbeleuchtung für sehr dunkle Umgebungen.

Die Software bindet die Bibliothek Mozzi ein, die einen sehr schönen Sinuston für den analogen Ausgang des Arduino berechnet, der ansonsten nur Pulswellen erzeugen kann.

Die Daten des Sensors und des Lautstärkepotis werden über die serielle Schnittstelle auch an den Computer gesendet, die dann z.B. über den seriellen Monitor in der Arduino IDE ausgelesen werden können.

Code:

// Digital Theremin
// Version 1.0 by Christian Streng
// www.christianstreng.de/digital-theremin

include <MozziGuts.h>
include <Oscil.h> // oscillator template
include <tables/sin2048_int8.h> // sine table for oscillator

const char KNOB_PIN = 0; // set the input for the knob to analog pin 0
const char LDR_PIN = 1; // set the input for the LDR to analog pin 1

// use: Oscil <table_size, update_rate> oscilName (wavetable), look in .h file of table #included above
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA);

byte volume;

int inPin = 2; // the number of the input pin
int outPin = 7; // the number of the output pin

int state = LOW; // the current state of the output pin
int reading; // the current reading from the input pin
int previous = LOW; // the previous reading from the input pin

// the follow variables are long because of the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0; // the last time the output pin was toggled
long debounce = 200; // the debounce time, increase if the output flickers

void setup(){
//Serial.begin(9600); // for Teensy 3.1, beware printout can cause glitches
Serial.begin(115200); // set up the Serial output so we can look at the piezo values // set up the Serial output so we can look at the analog levels

startMozzi(); // :))

//configure pin 2 as an input and enable the internal pull-up resistor
pinMode(inPin, INPUT_PULLUP);
pinMode(7, OUTPUT);
}

void updateControl(){
// read the potentiometer
int knob_value = mozziAnalogRead(KNOB_PIN); // value is 0-1023

// map it to an 8 bit volume range for efficient calculations in updateAudio
volume = knob_value >> 2; // 10 bits (0->1023) shifted right by 2 bits to give 8 bits (0->255)

// print the value to the Serial monitor for debugging
Serial.print(„volume = „);
Serial.print((int)volume);
Serial.print(„\t“); // prints a tab

// read the light dependent resistor
int light_level = mozziAnalogRead(LDR_PIN); // value is 0-1023

// print the value to the Serial monitor for debugging
Serial.print(„light level = „);
Serial.print(light_level);
Serial.print(„\t“); // prints a tab
Serial.println(); // next line

// map the analog input range (in this case, 310 – 1000 from the photoresistor)
// to the output pitch range (120 – 1023Hz)
// change the minimum and maximum input numbers below depending on the range
// your sensor’s giving:
int thisPitch = map(light_level, 310, 1000, 120, 1023);

// set the frequency
aSin.setFreq(thisPitch);
}

int updateAudio(){
// cast char output from aSin.next() to int to make room for multiplication
return ((int)aSin.next() * volume) >> 8; // shift back into range after multiplying by 8 bit value
}

void loop(){
audioHook(); // required here

reading = digitalRead(inPin);
// if the input just went from LOW and HIGH and we’ve waited long enough
// to ignore any noise on the circuit, toggle the output pin and remember
// the time
if (reading == HIGH && previous == LOW && millis() – time > debounce) {
if (state == HIGH)
state = LOW;
else
state = HIGH;
time = millis();
}
digitalWrite(outPin, state);
previous = reading;
}

RSS
Follow by Email
Facebook
Facebook
Google+
Google+
https://www.christianstreng.de/digital-theremin/
LinkedIn
YouTube
YouTube
Instagram