Archive for the ‘Free Pascal’ Category

Suonare note in Pascal

Venerdì, Giugno 5th, 2009

In (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

Implementare la potenza e la radice quadrata

Giovedì, Giugno 4th, 2009

Vediamo come implementare gli algoritmi dell’elevazione a potenza (pow) e della radice quadrata (sqrt) implementandoli in Pascal. Testati ovviamente con Free Pascal.

function pow(a:real; n:integer):real;
var
  i:integer;
  x:real;
begin
  x:=1;
  if n<>0 then
    for i:=1 to abs(n) do
      x:=x*a;
   if n<0 then
    x:=1/x;
  pow:=x;
end;

function sqrt(a:real;n:integer):real;
const
  precision_max=5;
var
   i,precision:integer;
   x:real;
begin
  x:=0;
  for precision:=0 downto - precision_max do
  begin
    for i:=0 to 9 do
      if pow(x + pow(10, precision)*i,n) > a then break;
    dec(i);
    x := x + pow(10, precision)*i;
  end;
  sqrt:=x;
end;