// Author: Nien Lam // Date: 09-28-2009 // Title: Photo Sensor Tone Generator // Descr: Using a photocell, play tones within 2 octaves of the C major scale. // Periods in microseconds for 2 octaves starting with Middle C int scale[] = {3830, 3400, 3038, 2864, 2550, 2272, 2028, 1912, 1704, 1517, 1433, 1276, 1136, 1012, 955}; char scaleNote[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B', 'S'}; int noteNum = sizeof(scale) / sizeof(int); // Note duration long duration = 200000; // Sensor ranges int sValMin, sValMax; // Temp variables int note = 0; int lastNote = 0; int ii; void setup() { Serial.begin(9600); pinMode(9, OUTPUT); sValMin = analogRead(0); sValMax = analogRead(0); } void loop() { Serial.println(analogRead(0)); // Set ranges sValMin = min(sValMin, analogRead(0)); sValMax = max(sValMax, analogRead(0)); lastNote = note; ii = map(analogRead(0), sValMin, sValMax, 0, noteNum - 1); note = scale[ii]; if (lastNote != note) { Serial.print("Note: "); Serial.println(scaleNote[ii]); playTone(scale[ii]); } } void playTone(int n) { long elapsed_time = 0; while(elapsed_time < duration) { digitalWrite(9, HIGH); delayMicroseconds(n / 2); digitalWrite(9, LOW); delayMicroseconds(n / 2 ); elapsed_time += (n); } }