Arduino Grattis Tone Generator (3 / 4 steg)
Steg 3: kod
Koden kan hittas nedan du kan kopiera och klistra in den i Arduino IDE.
#include
kräver en Atmega168 chip
#define outpin 9 / / ljud ut till högtalare eller förstärkare
int ptime;
int k x, dur, freq, t;
int i, j.
flyta ps; variabel för pow pitchShift rutin
float noteval;
notvärden för två octave skala
dividera dem med befogenheter av två att generera andra oktaver
flyta A = 14080;
flötet som = 14917.2;
float B = 15804.3;
float C = 16744;
flyta CS = 17739.7;
flyta D = 18794.5;
flyta DS = 19912.1;
flöte E = 21096.2;
flyta F = 22350.6;
flyta FS = 23679.6;
float G = 25087.7;
flyta GS = 26579.5;
flyta A2 = 28160;
flyta A2S = 29834.5;
flyta B2 = 31608.5;
flyta C2 = 33488.1;
flyta C2S = 35479.4;
flyta D2 = 37589.1;
flyta D2S = 39824.3;
flyta E2 = 42192.3;
flyta F2 = 44701.2;
flyta F2S = 47359.3;
flyta G2 = 50175.4;
flyta G2S = 53159;
flyta A3 = 56320;
oktaver - motsvarar piano oktaver
flyta oct8 = 4;
flyta oct7 = 8;
flyta oct6 = 16.
flyta oct5 = 32.
flyta oct4 = 64;
flyta oct3 = 128;
flyta oct2 = 256;
flyta oct1 = 512;
flyta oct0 = 1024;
rytm värden
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.
stor skala bara för demo, hacka detta
flyta happyBirthday [] = {
G, 0, G, A2, 0, 0,
G, 0, 0, C2, 0, 0,
B2, 0, 0, 0, 0, 0,
G, 0, G, A2, 0, 0,
G, 0, 0, D2, 0, 0,
C2, 0, 0, 0, 0, 0,
G, 0, G, G2, 0, 0,
E2, 0, 0, C2, 0, 0,
B2, 0, 0, A2, 0, 0,
F2, 0, F2, E2, 0, 0,
C2, 0, 0, D2, 0, 0,
C2, 0, 0, 0, 0, 0,
};
void setup() {
pinMode (10, OUTPUT); Anger den digitala pin som utdata
pinMode (11, OUTPUT); Anger den digitala pin som utdata
pinMode (12, OUTPUT); Anger den digitala pin som utdata
pinMode (8, ingående); Anger den digitala pin som utdata
}
void loop() {
för (jag = 0; jag < = 11; i ++) {
int värde = hög;
medan (digitalRead(8) == låg) {
digitalWrite (10, värde);
Delay(100);
värde =! värde;
};
PS = (float) jag / 12; Välj nytt transponera intervall varje slinga
för (x = 0; x < = 12 * 6; x ++) {
noteval = (happyBirthday [x] / oct4) * pow(2,ps); införliva skala upp 12 toner
Pow funktionen genererar införlivande
eliminera "* pow(2,ps)" att skära ut transponera rutin
dur = 100;
digitalWrite (10 + (x & 3), hög);
digitalWrite(10+((x+1) & 3), låg);
digitalWrite(10+((x+2) & 3), låg);
om ((int) noteval > 0) {
freqout ((int) noteval, dur);
} annat {
Delay(100);
}
}
}
}
void freqout (int freq, int t) / / freq i hz, t i ms
{
int hperiod; beräkna 1/2 period i oss
långa cykler, i.
pinMode (outpin, utgång); slå på utgångsstiftet
hperiod = (500000 / freq) - 7; subtrahera 7 US att kompensera för digitalWrite overhead
cykler = ((långa) freq * (långa) t) / 1000; beräkna cykler
för (jag = 0; jag < = cykler; i ++) {/ / spela anmärkning för t ms
digitalWrite (outpin, högt);
delayMicroseconds(hperiod);
digitalWrite (outpin, låg);
delayMicroseconds (hperiod - 1); -1 till att kompensera för digitaWrite overhead
}
pinMode (outpin, mata); stänga av pin att undvika buller från andra verksamheter
}