Suonare un pianoforte sulla tastiera di Windows

Premessa

Questo articolo è molto vecchio e l’autore di questa pagina nel frattempo è maturato un filino culturalmente e quindi si vergogna molto di quanto qui vi sia scritto. Nello specifico, l’autore prova conati di vomito al solo pensiero di consigliare software non-libero ad un lettore.

Questi contenuti comunque rimarranno online per aiutare a ricordarsi di quanto si era ignoranti in Informatica solo pochi anni fa e di quanto sia stata sottile la linea che mi separava da Aranzulla.

P.S.
Se trovi un’altra guida del genere in Internet senza un simile disclaimer, insulta immediatamente l’autore.

Immagine emulatore musicale per Windows - Reyboz BlogSiccome abbiamo già parlato di funzioni per emettere un suono dal Pascal oggi ne citeremo un’ulteriore per leggere un carattere alla sua sola pressione: potremo così ad esempio creare un piccolo programma per suonare dal vivo dalla tastiera del pc.

Approfondimento per i neo programmatori in Pascal

Il programma sommariamente segue questo piccolo schema logico:

  1. Si richiede un input
  2. Continua se il carattere è una cifra da 0 a 9; altrimenti -> punto 1
  3. Continua se il carattere non è zero; altrimenti -> punto 7
  4. Impostare frequenza (hz) e testo (nm) a seconda del carattere inserito
  5. Suonare la frequenza e scrivere il testo.
  6. Torna al punto 1
  7. (Fine del programma)

In linguaggio Pascal l’input immediato (senza premere invio) si ottiene con X=READKEY, al posto del classico readln(x). In questo modo appena si premerà un tasto, si otterrà X. Da notare che con il metodo Readkey l’input non viene scritto sullo schermo…

Ecco dunque il listato dell’intero programma Reyboz Sound:

PROGRAM REYBOZ_SOUND; USES CRT;
VAR X:CHAR; HZ:INTEGER; NM:STRING;
BEGIN
CLRSCR;
WRITELN('Inserisci da 1 a 9 per suonare, 0 per uscire.');
WHILE(X<>'0')DO BEGIN
REPEAT;
X:=READKEY;
UNTIL (X='0')OR(X='1')OR(X='2')OR(X='3')OR(X='4')OR(X='5')OR(X='6')
OR(X='7')OR(X='8')OR(X='9');
CASE X OF
'1': BEGIN HZ:=262; NM:='DO ';END;
'2': BEGIN HZ:=294; NM:='RE ';END;
'3': BEGIN HZ:=330; NM:='MI ';END;
'4': BEGIN HZ:=349; NM:='FA ';END;
'5': BEGIN HZ:=392; NM:='SOL';END;
'6': BEGIN HZ:=440; NM:='LA ';END;
'7': BEGIN HZ:=494; NM:='SI ';END;
'8': BEGIN HZ:=523; NM:='DO+';END;
'9': BEGIN HZ:=587; NM:='RE+';END;
END;
SOUND(HZ);
WRITE(NM,' ');
DELAY(100);
NOSOUND;
END;
WRITELN('Fine programma.');
READLN;
END.


Comunque sottolineiamo che per utilizzare il nostro Reyboz Sound non occorre essere geni d’informatica in quanto dal link citato in alto si ottiene un exe (e gli exe partono con due clic…). Ricordiamo inoltre a tutti i possessori di computer a 64 bit che il Turbo Pascal e i suoi derivati non funzionano o fanno capricci su Windows 7, quindi prendetevela con Bill se qualcosa non funziona sul vostro 7! ;) Buon Reyboz Sounding a tutti!

Orologio analogico in Turbo Pascal

Oggi vi presenteremo un programma in grado di simulare un orologio digitale. Per una piccola anteprima cliccate sull’immagine.

Immagine orologio offerta dal Reyboz Blog

Il file è disponibile gratuitamente da qui:

Analizziamo il programma

All’inizio vedremo una videata nera con una serie di numeri da zero a venti, e ci verrà chiesto di inserire il numero che per noi è al centro dello schermo. Il tutto verrà ripetuto finche non si inserisce uno di quei numeri da 0 a 20:

...
CLRSCR; (* Pulisci schermo *)
CC:=-1;
REPEAT (* Punto di ripetizione *)
FOR A:=0 TO 20 DO (* Ripeti 20 volte per scrivere 20 numeri *)
BEGIN
CC:=CC+1;
WRITE(CC:2,' ');
END; (* Fine ripetizione *)
WRITELN;
WRITELN;
WRITE('Scrivi il numero al centro del monitor: ');
READ(CC); (* L'utente inserisce CC *)
CLRSCR;
UNTIL (CC <= 20)AND(CC >= 0);
(* Da qui torna a 'repeat' se CC non è tra 0 e 20 *)
...

A questo punto il programma avrà come input questa fantomatica variabile CC. Servirà per sapere dove posizionare in futuro l’orologio, in modo che sembri al centro. Ma passiamo al punto in cui ci chiederà di inserire ore e minuti attuali, rappresentati da variabili intere HH e MM. Anche qui se l’ora inserita non sarà tra 0 e 24, e i minuti tra 0 e 60, il programma non andrà avanti e tornerà da capo:

...
REPEAT (* Punto di ritorno Until *)
IF(HH > 23)OR(MM > 59)OR(HH < 0)OR(MM < 0) THEN
WRITE('Errore formato. ');
WRITE('Scrivi l''ora attuale (HH MM): ');
READ(HH,MM); (* L'utente inserisce ora e minuti *)
CLRSCR; (* Ripulisci schermo *)
UNTIL (HH <= 23)AND(MM <= 59)AND(HH >= 0)AND(MM >=0);
...

Inseriti ore e minuti, siamo pronti a produrre l’orologio. Per fare ciò creeremo un’ulteriore variabile SS che conterrà i secondi, calcolati tramite uno script che rallenta di (17)*(17) mila volte il programma, avvicinandosi di molto ad un secondo reale:

...
T:=1700; (* T vale 1700 *)
WHILE(0 = 0)DO (* Inizia un ciclo infinito *)
BEGIN
SS:=SS+1; (* Aggiungi un secondo *)
FOR C:=0 TO T DO (* Inizio rallentamento *)
BEGIN FOR D:=0 TO T DO
BEGIN
END;
END; (* Fine rallentamento *)
CLRSCR;
IF(SS = 60)THEN (* Se ci sono 60 secondi crea un minuto *)
BEGIN
SS:=0;
MM:=MM+1;
END;
IF(MM = 60)THEN (* Se ci sono 60 min. crea un ora *)
BEGIN
SS:=0;
MM:=0;
HH:=HH+1;
END;
WRITE('Per interrompere: ctrl+pausa');
(* A questo punto a seconda di CC... *)
FOR A:=0 TO CC DO WRITELN; (* Crea CC spazi vuoti in verticale... *)
FOR B:=0 TO CC DO WRITE('   '); (* ...e in orizzontale *)
(* Ora scrivi ora, minuti, secondi *)
WRITE(' ',S1,HH:2,': ',MM:2,': ',SS:2,S2);
END;
...

Buona navigazione dallo staff.

Turbo Pascal di base

Ecco finalmente un riassunto schematico su funzioni condizioni strutture e operatori del Turbo Pascal, il famoso compilatore e esecutore di listati.

Turbo Pascal - Reyboz Blog

Download

Capiamo il linguaggio

Piccolo esempio

Program Potenza; Uses crt;
Var x,y: integer;
Begin
clrscr;
write('Inserisci qui un numero: ');
read(x);
y:=x*x;
writeln('Il quadrato di ',x,' è ,y);
readln
End.

Parti essenziali

  • Program per dare un nome al programma.
  • Uses per determinare la libreria (non lo cambiamo)
  • Var per nominare una lista di variabili e definirne il tipo
  • Begin per iniziare
  • End. per terminare.

Regole di scrittura essenziale

  • Ogni comando deve terminare con punto e virgola, il Begin fa eccezione.
  • L’End finale termina sempre in punto.
  • Prima di un Else non ci va mai il punto e virgola.

Funzioni predefinite

Legate a scrittura o lettura di una variabile

  • Clrscr; cancella l’output corrente
  • Delay(x); interrompe per x millisecondi il programma (solo in ambienti msdos)
  • Write(x); scrive x
  • Writeln(x); scrive x e va a capo
  • Writeln; scrive una riga vuota
  • Read(x); legge x da tastiera premendo invio
  • Readln(x); legge x da tastiera premendo invio e va a capo
  • Readln; crea una pausa che termina premendo invio
  • Sound(x); emette un bip alla frequenza inserita (occorre terminarlo con nosound;)
  • Nosound; interrompe il beep
  • X=Readkey; legge x da tastiera

Legate a calcoli con numeri interi

  • x=Sqr(x); calcola il quadrato di x
  • x=Chr(x); trova il carattere ASCII corrispondente a x
  • x=Sqrt(x); calcola il radicale di x
  • x=(x)div(y) esegue la divisione tra x e y
  • x=(x)mod(y) calcola il resto intero tra x e y

Legati a calcoli con numeri reali

  • x=In(x); calcola il logaritmo naturale di x
  • x=Int(x); calcola restituendo la parte intera di x
  • x=Sin(x); calcola il seno di x
  • x=Abs(x); calcola il modulo di x
  • x=Cos(x); calcola il coseno di x
  • x=Round(x); calcola approssimando ad intero x

Legati a calcoli con stringhe di testo

  • x=Lenght(x); conta il numero di caratteri di x

Calcoli con un carattere

  • x=Ord(x); individua il numero corrispondente a x come carattere

Condizioni logiche

Servono per definire un controllo tra più variabili.

  • (a<b) a minore di b
  • (a>b) a maggiore di b
  • (a<=b) a minore o uguale a b
  • (a>=b) a maggiore o uguale a b
  • (a<>b) a diverso da b
  • (a=b) a uguale a b

Operazioni logiche

Servono per definire un controllo tra più condizioni logiche.

  • ()and() Verifica una congiunzione logica
  • ()not() Verifica una negazione logica
  • ()or() Verifica una disgiunzione logica
  • ()xor() Verifica una disgiunzione esclusiva logica

Strutture iterattive

Servono per ripetere un operazione a seconda dell’uso.

  • While do
    Cosa fa: Controlla una condizione e ripete un’istruzione finchè la condizione è vera
    come si presenta: While (condizioni) do begin … end
  • Repeat until
    Cosa fa: Esegue un’istruzione e la ripete fintanto che la condizione non risulta vera
    Repeat (istruzioni) until (condizioni)
  • For to do
    Cosa fa: Impone un valore iniziale e finale, ripetendo un istruzione n volte
    Come si presenta: for a to n do begin (istruzioni) end