Kis feladat: kulturáltan zenélni!

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.

Régi analóg szinti hangja

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.

Zongora a számítógépen

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);
    }   
}

Mit tanultunk ebből?

Amit nem tud az A-star, azt tudja a PC. Ha gombozatként használjuk az A-start, akkor a számítógépen futó programokat tetszőlegesen vezérelhetjük gombnyomások beküldésével.