Fare 4 note

Prova a suonare qualche motivetto con il Pascal…

  1. l’utente può scegliere il tempo per il brano
  2. il valore di tempo viene utilizzato per inizializzare il vettore RITARDI con
    tempo, 2*tempo, 4*tempo, 8*tempo, …
  3. per ottenere lo staccato le note vengono accorciate e seguite da una brevissima pausa
    FUSA= 1/128
Uses
   Crt;
Const
   PAUSA=0;
   DO4=131; MI4=247; SOL4=196;
   DO5=262; DOd5=277; REb5=277; RE5=294; REd5=311; MIb5=311; MI5=330; FA5=349; FAd5=370;
        SOLb5=370; SOL5=392; SOLd5=415; LAb5=415; LA5=440; LAd5=466; SIb5=466; SI5=494;
   DO6=523; DOd6=554; RE6=587; REd6=622; MI6=659; FA6=698;
   DO7=1046; MI7=1319; SOL7=1568; SI7=1976;
   FUSA=1;
        SEMIBISCROMA=2; BISCROMA=3; SEMICROMA=4; CROMA=5;
        SEMIMINIMA=6; MINIMA=7; SEMIBREVE=8; BREVE=9;
        LUNGA=10; MASSIMA=11;
Var
   RITARDI: Array[1..11] of LongInt;
   scelta ,
   tempo  : integer;

procedure cambiaTempo;
Var
   i: integer;
begin
   RITARDI[1]:=tempo;
   For i:=2 to 11 do
      RITARDI[i]:=2*RITARDI[i-1];
end;

procedure nota(frequenza, durata: integer);
begin
   if(frequenza <> PAUSA) then
      Sound(frequenza);
   Delay(RITARDI[durata]-RITARDI[1]);
   NoSound;

   Delay(RITARDI[1]);    { per lo staccato }
end;

procedure fraMartino;
begin
   nota(DO5, SEMIMINIMA); nota(RE5, SEMIMINIMA); nota(MI5, SEMIMINIMA); nota(DO5, SEMIMINIMA);
   nota(DO5, SEMIMINIMA); nota(RE5, SEMIMINIMA); nota(MI5, SEMIMINIMA); nota(DO5, SEMIMINIMA);

   nota(MI5, SEMIMINIMA); nota(FA5, SEMIMINIMA); nota(SOL5, MINIMA);
   nota(MI5, SEMIMINIMA); nota(FA5, SEMIMINIMA); nota(SOL5, MINIMA);

   nota(SOL5, CROMA); nota(LA5, CROMA); nota(SOL5, CROMA); nota(FA5, CROMA);
        nota(MI5, SEMIMINIMA); nota(DO5, SEMIMINIMA);
   nota(SOL5, CROMA); nota(LA5, CROMA); nota(SOL5, CROMA); nota(FA5, CROMA);
        nota(MI5, SEMIMINIMA); nota(DO5, SEMIMINIMA);

   nota(DO5, SEMIMINIMA); nota(SOL4, SEMIMINIMA); nota(DO5, MINIMA);
   nota(DO5, SEMIMINIMA); nota(SOL4, SEMIMINIMA); nota(DO5, MINIMA);
end;

procedure jingleBells;
begin
   nota(si5, semiminima); nota(si5, semiminima); nota(si5, minima);
   nota(si5, semiminima); nota(si5, semiminima); nota(si5, minima);

   nota(si5, semiminima); nota(re6, semiminima); nota(sol5, semiminima); nota(la5, semiminima);
   nota(si5, semibreve);

   nota(do6, semiminima); nota(do6, semiminima); nota(do6, minima);
   nota(do6, semiminima); nota(si5, semiminima); nota(si5, minima);

   nota(si5, semiminima); nota(la5, semiminima); nota(la5, semiminima); nota(si5, semiminima);
   nota(la5, minima);     nota(re6, minima);


   nota(si5, semiminima); nota(si5, semiminima); nota(si5, minima);
   nota(si5, semiminima); nota(si5, semiminima); nota(si5, minima);

   nota(si5, semiminima); nota(re6, semiminima); nota(sol5, semiminima); nota(la5, semiminima);
   nota(si5, semibreve);

   nota(do6, semiminima); nota(do6, semiminima); nota(do6, minima);
   nota(do6, semiminima); nota(si5, semiminima); nota(si5, minima);

   nota(re6,  semiminima); nota(re6, semiminima); nota(do6, semiminima); nota(la5, semiminima);
   nota(sol5, minima);
end;

begin
   tempo:=10;
   cambiaTempo;
   repeat
      clrscr;
      writeln(' --- 4 note con il TurboPascal 6.0 ---');
      writeln;
      writeln(' 0. Uscita');
      writeln(' 1. Cambia tempo (', tempo,')');
      writeln(' 2. Fra Martino');
      writeln(' 3. Jingle Bells');
      writeln;
      write('--> ');
      readln(scelta);
      case(scelta) of
         0: ;
         1: begin
               Write('Tempo (',tempo,') = ');
               ReadLn(tempo);
               cambiaTempo;
            end;
         2: fraMartino;
         3: jingleBells;
      end;
   until(scelta=0);
end.