Возникла необходимость обозначать эмоции наших роботов, и сразу вспомнили про замечательного персонажа из "Звездных войн". Варианты с применением спец.микросхем и карт памяти отпали, т.к. наши роботы собираются по бюджетной схеме на Атмега8, плюс драйвер моторов к1128кт4.
Решили программировать. Скачали архив со звуковыми файлами, проанализировали спектр, нарисовали частотные графики, написали программу по синтезу. Сильно не ругайтесь, писалось на скорую руку, комментариев нету, а те что есть - не важны. Библиотеку брал тут
http://arduino.cc/playground/Code/Summer Правки и дополнения приветствуются.
Свистит похоже, на мой слух. Некоторых звуков не хватает, но мы над этим работаем
![Wink ;)](http://roboforum.ru/images/smilies/wink.gif)
Код:
#include <Summer.h>
int sPIN = 3;
Summer summer = Summer(sPIN);
void setup() {
summer.setTempo(1); //30
}
void loop() {
sim_R();
delay(70);
sim_O();
delay(70);
sim_B();
delay(70);
sim_O();
delay(70);
sim_Question();
delay(1500);
sim_N();
delay(70);
sim_O();
delay(70);
delay(1500);
sim_Z();
delay(70);
sim_O();
delay(70);
sim_R();
delay(70);
sim_R();
delay(70);
sim_O();
delay(70);
delay(1500);
}
void sim_Z() {
playFreqGlissando(2300, 1900, 1, 1100); //1100
delay(28); //700
playFreqGlissando(1800, 1700, 1, 1000); //1000
delay(36); //900
playFreqGlissando(2000, 2200, 1, 1100); //1100
}
void sim_Y() {
playFreqGlissando(1800, 1700, 1, 1000); //1000
delay(36); //900
playFreqGlissando(1900, 2200, 1, 800); //800
delay(28); //700
playFreqGlissando(2300, 1900, 1, 1100); //1100
}
void sim_X() {
playFreqGlissando(5000, 2000, 1, 500); //500
playFreqGlissando(2000, 1200, 1, 500); //500
playFreqGlissando(1200, 800, 1, 500); //500
delay(56); //1400
playFreqGlissando(600, 1000, 1, 700); //700
playFreqGlissando(1000, 2000, 1, 700); //700
playFreqGlissando(2000, 2200, 1, 500); //500
}
void sim_W() {
playFreqGlissando(550, 750, 1, 500); //500
playFreqGlissando(750, 1200, 1, 500); //500
playFreqGlissando(1200, 2000, 1, 500); //500
playFreqGlissando(2000, 2100, 1, 300); //300
delay(32); //800
summer.playTone(2350,36); //900
playFreqGlissando(2350, 1600, 1, 500); //500
}
void sim_V() {
summer.playTone(2350,36); //900
playFreqGlissando(2350, 1200, 1, 700); //700
delay(32); //800
playFreqGlissando(700, 600, 1, 300); //300
playFreqGlissando(600, 750, 1, 900); //900
}
void sim_U() {
playFreqGlissando(1800, 2400, 1, 700); //700
summer.playTone(2400,36); //900
delay(32); //800
playFreqGlissando(2200, 1800, 1, 700); //700
playFreqGlissando(1800, 1750, 1, 900); //900
}
void sim_T() {
playFreqGlissando(2000, 2700, 1, 900); //900
summer.playTone(2700,20); //500
delay(16); //400
summer.playTone(3100,24); //600
playFreqGlissando(3100, 2000, 1, 500); //500
playFreqGlissando(2000, 1000, 1, 1200); //1200
}
void sim_S() {
playFreqGlissando(1900, 2700, 1, 900); //900
summer.playTone(2700,20); //500
delay(16); //400
summer.playTone(3100,24); //600
playFreqGlissando(3100, 2200, 1, 500); //500
playFreqGlissando(2200, 1000, 1, 1200); //1200
}
void sim_R() {
playFreqGlissando(2100, 2300, 1, 1100); //1100
//summer.playTone(1100,32); //800
delay(32); //800
delay(16); //400
summer.playTone(2400,48); //1200
//summer.playTone(1100,24); //600
}
void sim_Question() {
summer.playTone(2400,40); //1000
summer.playTone(1000,32); //800
delay(28); //700
playFreqGlissando(1700, 2400, 1, 1000); //1000
summer.playTone(2400,32); //800
delay(28); //700
playFreqGlissando(2200, 1700, 1, 800); //800
summer.playTone(1700,24); //600
delay(28); //700
playFreqGlissando(1900, 2700, 1, 800); //800
summer.playTone(2700,21); //300
}
void sim_O() {
playFreqGlissando(700, 600, 1, 250); //250
playFreqGlissando(600, 800, 1, 200); //200
playFreqGlissando(800, 600, 1, 200); //200
playFreqGlissando(600, 800, 1, 200); //200
playFreqGlissando(800, 600, 1, 200); //200
playFreqGlissando(600, 800, 1, 200); //200
playFreqGlissando(800, 700, 1, 250); //250
}
void sim_N() {
summer.playTone(2400,40); //1000
summer.playTone(1000,32); //800
playFreqGlissando(2300, 1900, 1, 1200); //1200
playFreqGlissando(1100, 1000, 1, 600); //600
}
void sim_Left() {
summer.playTone(1450,60); //1500
delay(80); //2000
summer.playTone(2650,100); //2500
}
void sim_I() {
playFreqGlissando(1600, 4200, 1, 30);
playFreqGlissando(4200, 600, 1, 30);
playFreqGlissando(600, 800, 1, 30);
playFreqGlissando(800, 3600, 1, 30);
playFreqGlissando(3600, 700, 1, 30);
summer.playTone(700,5); //150
playFreqGlissando(700, 3200, 1, 30);
playFreqGlissando(3200, 600, 1, 30);
summer.playTone(600,5); //150
playFreqGlissando(600, 2900, 1, 30);
playFreqGlissando(2900, 400, 1, 300);
}
void sim_H() {
summer.playTone(700,5); //150
playFreqGlissando(700, 3700, 1, 30);
playFreqGlissando(3700, 700, 1, 30);
summer.playTone(700,5); //150
playFreqGlissando(700, 3400, 1, 30);
playFreqGlissando(3400, 700, 1, 30);
summer.playTone(700,5); //150
playFreqGlissando(700, 3400, 1, 30);
playFreqGlissando(3400, 700, 1, 30);
summer.playTone(700,5); //150
playFreqGlissando(700, 3400, 1, 30);
playFreqGlissando(3400, 700, 1, 30);
summer.playTone(700,5); //150
playFreqGlissando(700, 3400, 1, 30);
playFreqGlissando(3400, 700, 1, 30);
summer.playTone(700,5); //150
}
void sim_G() {
summer.playTone(3000,28); //700
playFreqGlissando(3000, 2100, 1, 600); //600
playFreqGlissando(2100, 1400, 1, 700); //700
playFreqGlissando(1400, 1100, 1, 500); //500
}
void sim_F() {
playFreqGlissando(5000, 1700, 1, 500); //500
playFreqGlissando(1700, 1100, 1, 500); //500
playFreqGlissando(1700, 800, 1, 500); //500
}
void sim_E() {
playFreqGlissando(1400, 1300, 1, 1000);
playFreqGlissando(1600, 1650, 1, 700);
}
void sim_D() {
playFreqGlissando(2100, 2300, 1, 1000);
playFreqGlissando(1000, 1100, 1, 700);
}
void sim_C() {
playFreqGlissando(400, 550, 1, 14000);
playFreqGlissando(550, 400, 1, 1200);
}
void sim_B() {
playFreqGlissando(1900, 3600, 1, 2900); //4000
playFreqGlissando(3600, 4200, 1, 1900); //1000
playFreqGlissando(4200, 3600, 1, 1900); //1000
playFreqGlissando(3600, 2500, 1, 1900); //3000
delay(4); //100
summer.playTone(1900,92); //2300
summer.playTone(2600,24); //600
summer.playTone(1600,100); //3000
}
void sim_A() {
summer.playTone(1600,100); //3000
summer.playTone(2600,24); //600
summer.playTone(1900,92); //2300
delay(4); //100
playFreqGlissando(2500, 3600, 1, 1900); //3000
playFreqGlissando(3600, 4200, 1, 1900); //1000
playFreqGlissando(4200, 3600, 1, 1900); //1000
playFreqGlissando(3600, 1900, 1, 1900); //4000
}
void playFreqGlissando( float freqFrom, float freqTo, float duty, float duration ) {
duration=duration/8*3;
int stepLength = 20; //30
int i, numberOfSteps;
float freqStep, freq;
numberOfSteps = duration/stepLength;
freqStep = (freqTo - freqFrom)/numberOfSteps;
freq = freqFrom;
for ( i=0; i < numberOfSteps; i++ ) {
//summer.playTone(freq, stepLength);
summer.playTone(freq, duty);
freq = freq + freqStep ;
}
summer.playTone(freqTo, stepLength);
}