Costruire un brano musicale con il computer

Report
Progetto realizzato dalla prof.ssa Oriana Pagliarone
Scheda di lavoro n.1
Calcolo della frequenza del semitono
In una scala musicale temperata 2 ottave successive stanno tra loro
come 1 sta a 2
Ossia se x è la frequenza del do di un'ottava ,
2x è la frequenza del do dell'ottava successiva
Inoltre le frequenze delle note formano una progressione geometrica di ragione
q = semitono
Ricordando che in un'ottava ci sono 12 semitoni (tra tasti bianchi e neri)
calcoliamo la frequenza di un semitono
a1 = x
a13 = 2 x
a13 = a1 q12
2 x = x q12
q = (2)1/12
Scheda di lavoro n.2
Calcolo della frequenza della nota più bassa in un
pianoforte
Sapendo che, in un pianoforte, 440 è la frequenza del la dell'ottava centrale
(dopo 48 note da quella avente frequenza più bassa ),
calcoliamo la frequenza della nota più bassa :
440= Nota_ più_ bassa (2)48/12
Nota_più_ bassa = 440/24 = 27.5
Scheda di lavoro n.3
Calcolo della frequenza di una nota
Ora sapendo il valore del semitono e della
frequenza della nota più bassa
possiamo calcolare la frequenza di una qualunque
nota
( dopo x note da quella più bassa ):
frequenza = Nota_più_bassa (2)x/12
Scheda di lavoro n.4
Implementazione in Turbo Pascal
Per implementare in Turbo Pascal una procedura che calcoli le frequenze delle note è
opportuno trasformare la formula precedente in:
frequenza = Nota_più_bassa e x(log2)/12
Ora è possibile scrivere la procedura per calcolare le
frequenze delle note dell'ottava centrale
Procedure lenote;
function nota(x:integer):integer;
begin
rapp:=ln(2)/12;
nota : = round(notapiùbassa* exp(rapp*x));
end;
begin
notado:=nota(52);
re:=nota(54);
mi:=nota(56);
fa:=nota(57);
sol:=nota(59);
la:=nota(61);
si:=nota(63);
end;
Scheda di lavoro n.5
Ora possiamo inserire questa procedura in un
piccolo programma che ci permetterà di suonare
le note e anche l’inno alla gioia di Beethoven,
adoperando uno spartito semplificato, utilizzando
l'istruzione sound per il suono di una nota ,
nosound per sottolineare la fine di una battuta e
delay per la durata delle note.
(la durata delle note dipende molto dal
microprocessore del proprio computer)
 Passiamo alla procedura che permetterà agli
alunni di suonare con il calcolatore l'inno alla
gioia:

Prima le 8 note
( dal do al do dell’ottava successiva)
e poi l’inno alla gioia
Suona.zip
Inno alla gioia

Certo questo è decisamente più bello e
completo ma è stato registrato da un
disco, l’altro è stato implementato nota
per nota in Turbo Pascal
Scheda di lavoro n. 6
Ora utilizziamo questi programmi di musica per giocare al
gioco del 7 :
dopo un’introduzione grafica e sonora (musica tratta
dalla colonna sonora del film “La pantera rosa”), si passa
al gioco : il computer scrive un numero casuale, se esso
è multiplo di 7 o inizia o termina per 7 il giocatore deve
scrivere “s” altrimenti deve scrivere “n”. In ogni caso vi
sarà un commento scritto e sonoro ( in caso di risposta
corretta l’inno alla gioia , in caso di risposta errata un
commento sonoro ironico). Il computer calcola anche il
numero di risposte esatte e dà la possibilità di terminare
o continuare a giocare quante volte si vuole.
Clicca qui per lanciare il programma gioco7s
program gioco7s;
{$i graph.p}
const notapiubassa=27.5;
semitono=1.05946;
var n,domande,esatte:integer;
risposta:char;
rispo:char;
var notado,re,mi,fa,sol,la,si,do2,re2,si2,re3,fa2,sib,la2,sol2,re1,mi1,fa1,si1:integer;
rapp:real;
procedure lenote;
function nota(x:integer):integer;
begin
rapp:=ln(2)/12;
nota:=round(notapiubassa*exp(rapp*x));
end;
begin
notado:=nota(52);
re:=nota(54);
re3:=nota(55);
mi:=nota(56);
fa:=nota(57);
fa2:=nota(58);
sol:=nota(59);
la:=nota(61);
si:=nota(63);
do2:=nota(64);
re2:=nota(66);
si2:=nota(51);
sib:=nota(50);
la2:=nota(49);
sol2:=nota(47);
re1:=nota(42);
mi1:=nota(44);
fa1:=nota(46);
si1:=nota(39);
end;
procedure ritornello;
begin
sound(si);
delay(8000);
nosound;
sound(si);
delay(8000);
nosound;
sound(notado);
delay(8000);
nosound;
sound(re);
delay(8000);
nosound;
sound(re);
delay(8000);
nosound;
sound(notado);
delay(8000);
nosound;
sound(si);
delay(8000);
nosound;
sound(la);
delay(8000);
nosound;
sound(sol);
delay(8000);
nosound;
sound(sol);
delay(8000);
nosound;
sound(la);
delay(8000);
nosound;
sound(si);
delay(8000);
nosound;
sound(si);
delay(12000);
nosound;
sound(la);
delay(8000);
nosound;
sound(la);
delay(12000);
nosound;
end;
procedure ritornello2;
begin
sound(re3);
delay(1600);
nosound;
sound(mi);
delay(6400);
nosound;
delay(4800);
nosound;
sound(fa2);
delay(1600);
nosound;
sound(sol);
delay(6400);
nosound;
delay(4800);
nosound;
sound(re3);
delay(1600);
nosound;
sound(mi);
delay(4800);
nosound;
sound(fa2);
delay(1600);
nosound;
sound(sol);
delay(4800);
nosound;
sound(do2);
delay(1600);
nosound;
sound(si);
delay(4800);
nosound;
sound(mi);
delay(1600);
nosound;
sound(sol);
delay(4800);
nosound;
sound(si);
delay(1600);
nosound;
sound(sib);
delay(16000);
nosound;
sound(la);
delay(3200);
nosound;
sound(sol);
delay(3200);
nosound;
sound(mi);
delay(3200);
nosound;
sound(re);
delay(3200);
nosound;
sound(mi);
delay(3200);
nosound;
sound(mi);
delay(12800);
nosound;
delay(6400);
nosound;
delay(4800);
nosound;
end;
procedure ritornello3;
begin
sound(re);
delay(4000);
nosound;
sound(mi);
delay(4000);
nosound;
sound(fa);
delay(6400);
nosound;
delay(2400);
nosound;
sound(mi);
delay(6400);
nosound;
sound(re);
delay(8000);
nosound;
sound(re);
delay(4000);
nosound;
sound(mi);
delay(2400);
nosound;
sound(fa);
delay(3200);
nosound;
sound(sol);
delay(4000);
nosound;
sound(fa);
delay(4000);
nosound;
sound(mi);
delay(4000);
nosound;
sound(re);
delay(12800);
nosound;
end;
procedure cornice2;
var k:integer;
begin
graphcolormode;
writeln;
writeln;
writeln;
writeln;
writeln('
IL NUOVO');
writeln;
writeln('
GIOCO DEL 7 ');
writeln;
writeln;
writeln;
writeln;
writeln;
writeln('
PREMERE INVIO PER GIOCARE');
writeln;
writeln;
writeln;
writeln('
Programma realizzato ');
writeln;
writeln( ' dalla prof.ssa Oriana Pagliarone ');
writeln;
writeln;
for k:= 0 to 20 do
begin
circle(8+k*16,0,8,1);
circle(0,8+k*16,8,1);
circle(8+k*16,200,8,1);
circle(320,8+k*16,8,1);
end;
end;
procedure cornice;
var k:integer;
begin
for k:= 0 to 20 do
begin
circle(8+k*16,0,8,1);
circle(0,8+k*16,8,1);
circle(8+k*16,200,8,1);
circle(320,8+k*16,8,1);
circle(280,169,14,1);
circle(280,169,10,3);
circle(280,169,8,2);
circle(280,169,6,1);
circle(280,169,4,3);
circle(280,169,2,2);
circle(280,169,0,1);
circle(240,145,12,1);
circle(240,145,8,3);
circle(240,145,6,2);
circle(240,145,4,1);
circle(240,145,2,3);
circle(240,145,0,2);
circle(185,155,13,2);
circle(185,155,9,1);
circle(185,155,7,3);
circle(185,155,5,2);
circle(185,155,3,1);
circle(185,155,2,3);
circle(185,155,0,2);
circle(60,150,15,1);
circle(60,150,11,3);
circle(60,150,9,2);
circle(60,150,7,1);
circle(60,150,5,3);
circle(60,150,3,2);
circle(60,150,1,1);
circle(120,165,11,3);
circle(120,165,7,2);
circle(120,165,5,1);
circle(120,165,3,3);
circle(120,165,1,2);
end;
end;
begin
clrscr;
lenote;
graphcolormode;
cornice2;
ritornello2;
readln;
domande:=0;
esatte:=0;
repeat
clrscr;
graphcolormode;
cornice;
domande:=domande+1;
n:=trunc(random*100);
writeln;
writeln;
writeln(' Il computer sceglie un numero a caso');
writeln;
writeln('
',n);
cornice;
writeln;
writeln('
Se il numero è multiplo di 7');
writeln('
o inizia o termina per 7 ');
writeln('
scrivi s, ALTRIMENTI n');
cornice;
writeln;
write('
');
cornice;
readln( risposta);
cornice;
if((((n mod 7 =0)or(n mod 10 =7))or(n div 10 = 7))and(risposta ='s'))or
(not((((n mod 7 =0)or(n mod 10 =7))or(n div 10=7)))and(risposta ='n'))
then
begin
esatte:=esatte+1;
writeln;
writeln('
BRAVO !');
ritornello;
end
else
begin
writeln;
writeln('
IMPARA LA MATEMATICA !');
ritornello3;
end;
writeln;
write(' Vuoi continuare a giocare ?(s/n)');
cornice;
cornice;
readln(rispo);
until(rispo='n');
cornice;
writeln(' Il numero di risposte ESATTE E''',esatte);
writeln(' su un totale di ', domande ,' domande');
cornice;
readln;
end.

similar documents