Eddig sokszor próbáltunk hangokat lejátszani az A-star panellel, de valljuk be, ezek a csipogások azért nagyon messze vannak egy igazi hangszer hangjától.
Ugyanazon a hangmagasságon más-más hangszer másként szól: a fülünk meg tudja különböztetni egy zongora és egy trombita hangját akkor is, ha ugyanazt játsszák. Ez azért van, mert a hangszerek hangja több összetevőből áll, és ezen összetevők aránya (amiket szép szóval felharmonikusoknak neveznek) különbözik minden hangszer esetén.
Sajnos, az A-starral ilyeneket nagyon nehéz szimulálni. Másoknak is nagyon nehéz ezeket szimulálni, így a régi szintetizátorok hangja leginkább semmilyen hangszer hangjára nem hasonlított.
Szerencsére ma már van erre megoldás: ahelyett, hogy megpróbálnánk előállítani mondjuk egy olyan hangot, ami olyan mint egy igazi zongora hangja, inkább egyszerűen felvesszük egy igazi zongora hangját.
Kattints a http://html5piano.ilinov.eu/ oldalra, és máris ott egy egyszerű zongora. A Toggle keyboard key names feliratra kattintva megmutatja, hogy melyik gombra melyik hangot játssza le a zongorán. A Toggle piano key names pedig megmutatja a zongorán a hangok ABC-s hangmagassága szerinti helyét.
Feladat: Próbáld ki, hogy le tudod-e játszani a Boci-boci tarkát!
Feladat: Okés, most jön az, hogy a programunk fogja ugyanezt zenélni.
A dolog egyszerű:
void setup() {
pinMode(0,INPUT_PULLUP);
Keyboard.begin(); // indítsuk el az USB kezelését
}
void loop() {
if (digitalRead(0)==0) {
Keyboard.press('c');
delay(200);
Keyboard.release('c');
Keyboard.press('b');
delay(200);
Keyboard.release('b');
Keyboard.press('c');
delay(200);
Keyboard.release('c');
Keyboard.press('b');
delay(200);
Keyboard.release('b');
Keyboard.press('m');
delay(400);
Keyboard.release('m');
Keyboard.press('m');
delay(400);
Keyboard.release('m');
}
}
Szóval: gombot megnyomják, és a programunk zongorázik!
Vajon lehet ezt egyszerűbben? Igen lehet!
Ezeket már sokszor csináltuk, és ha már itt tartasz, akkor tutira kívülről vágod, hogy hogyan lehet kulturáltabban programozni. Nekem ilyen lett:
const int TONE_C='c'; // a c gombot kell megnyomni a C hanghoz
const int TONE_E='b'; // a b gombot kell megnyomni az E hanghoz
const int TONE_G='m'; // az m gombot kell megnyomni a G hanghoz
const int TI=200;
const int TA=400;
void setup() {
pinMode(0,INPUT_PULLUP);
Keyboard.begin(); // indítsuk el az USB kezelését
}
void sound(int frequency,int duration) {
Keyboard.press(frequency); // gomb lenyom
delay(duration); // var
Keyboard.release(frequency); // gomb elenged
}
void loop() {
if (digitalRead(0)==0) {
// boci-boci tarka
sound(TONE_C,TI);
sound(TONE_E,TI);
sound(TONE_C,TI);
sound(TONE_E,TI);
sound(TONE_G,TA);
sound(TONE_G,TA);
}
}