Suonare note in Pascal
Venerdì, Giugno 5th, 2009In (Free) Pascal abbiamo una funzione che ci permette di emettere un suono dall’altoparlantino di sistema. In questo articolo ci baseremo su questa funzione. I computer moderni, sprovvisti di altoparlantino interno, a mio parere sono difettosi e devono essere sostituiti e rimborsati. Non è possibile giocare a un gioco stile Pacman senza sentire BIP ogni volta che mangiamo un puntino bianco.
Le funzioni
La funzione che attiva l’altoparlantino è sound(int). Il parametro che accetta è la frequenza del suono che intendiamo emettere.
Non esiste un parametro che indichi la durata del suono. Per questo motivo a un certo punto dovremo chiamare la funzione che disattiva l’altoparlante: nosound().
Tra la chiamata a sound() e la chiamata nosound() dovrà ovviamente trascorrere un lasso di tempo, durante il quale il suono verrà emesso. La funzione che fa trascorrere il tempo è delay(int), che accetta come parametro la durata dell’inattività in microsecondi.
La frequenza
E’ chiaro che, per suonare una nota con sound(), dobbiamo conoscerne la frequenza. Più questa è alta, più il suono emesso sarà alto. Ma ogni nota ha la sua frequenza particolare.
Il sistema all’interno del quale si trovano le note, con le loro particolari frequenze, è detto scala. Non esiste una sola scala: nel corso della storia se ne sono usate diverse. Quella che utilizziamo oggi è la scala temperata.
Una breve spiegazione su come conoscere la frequenza di ogni nota è a questo indirizzo:
http://ulisse.sissa.it/chiediAUlisse/domanda/2004/Ucau040418d001
Una spiegazione più approfondita si trova qui:
http://www.soloclassica.it/scalatemperata.htm
Codice
Ecco una funzione scritta in Pascal per suonare una nota:
procedure note(tone:integer; duration:integer);
begin
sound(round(440 * (pow(sqrt(2, 12), tone))));
delay(duration * unit_duration);
end;
Il primo parametro è il numero corrispondente alla nota. La nota numero 0 è il LA centrale, la 1 sarà il LA#, etc. Il secondo parametro è la durata in “unità”. Il programma non sa se l’unità sia un quarto, un sedicesimo e qualcos’altro, nè ci tiene a saperlo. E’ importante però che sia definita, a livello di programma, la costante unit_duration, che indica la durata dell’unità in microsecondi.
Un banalissimo esempio di utilizzo:
note(1, 1);
note(3, 1);
note(4, 2);
nosound;
LA SI DOOO