Prendiamoci un minuto per po' di storia: era stato proprio Pitagora uno dei primi ad indagare il rapporto tra suoni diversi, i parametri fisici che li determinano (es: livello di liquido in un'anfora percossa, lunghezza di una corda pizzicata), la loro misura numerica, e il fatto che alcuni stiano bene insieme, ed altri no. In particolare, Pitagora aveva "scoperto" che due suoni sono "armonici", cioè stanno bene insieme, se le loro frequenze stanno in certi particolari rapporti, tipo 2/3, o 1/2. Questa osservazione lo aveva rafforzato nella sua convinzione che i numeri hanno un enorme potere di descrivere gli elementi della realtà: in questo caso persino una qualità apparentemente sfuggente, emotiva, estetica come l'armonia.

Questo, insomma, lo aveva convinto ancora di più che: tutto è numero...

Ma torniamo alle nostre API!

In particolare, immagina di voler suonare un altro accordo: quello formato dalle note di frequenza 440, 880, 1000.

Semplice, no? Basta scrivere gli stessi comandi di prima, cambiando i numeri che denotano le frequenze.

Però, però: scrivere la stessa cosa, cambiando solo i numeri, è un po' noioso! Non sarebbe bello poter riutilizzare tutto quello che abbiamo scritto, e cambiare soltanto quello che deve cambiare (cioè i numeri delle frequenze delle note?)

Ebbene, in Javascript (come in quasi tutti i linguaggi di programmazione) questo è possibile. Ti faccio vedere come si fa con un esempio:

 anfore.tricordo = function (a, b, c)
 { 
 anfore[0].suona(a); 
 anfore[1].suona(b); 
 anfore[2].suona(c); 
 }

function è una parola chiave del linguaggio, mentre tricordo è il nome che diamo alla nostra combinazione di comandi.

È bello poter dare nomi alle cose? Beh, nonostante alcune filosofie zen riconducano l'origine di tutta la sofferenza dell'universo alla tendenza irresistibile dell'uomo di etichettare tutto, la cosa ha decisamente i suoi lati positivi... Approfondiremo la questione più avanti, ma prima torniamo al nostro tricordo: abbiamo appena definito una funzione, cioè una combinazione parametrica di comandi.

Cosa vuol dire "parametrica"? Vuol dire che il suo comportamento non è completamente determinato, ma dipende appunto da alcuni parametri, valori che possiamo passare di volta in volta per precisarne il comportamento (in questo caso tre numeri che rappresentano le frequenze delle note che vogliamo suonare).

Non tutte le funzioni devono necessariamente ricevere dei parametri... se non ne ricevono nessuno, nella definizione, le parentesi tonde non conterranno niente.

Attenzione: fin qui la funzione l'abbiamo solo definita! Ora però vogliamo usarla, per suonare un accordo. Come facciamo? E' semplicissimo. Chiediamo di eseguire il comando:

anfore.tricordo(500,600,700);

Tecnicamente, questo comando chiede di "valutare" la funzione tricordo... cosa che si tramuta nell'esecuzione dei comandi che la definiscono.

Definisci un metodo bicordo che, ricevuti due parametri a e b, li suoni contemporaneamente, sulle anfore 0 e 1. Quindi invocalo, per suonare le note alle frequenze 440 e 550. Cosa noti? Come stanno le note, tra di loro? Stanno "bene insieme"?

Clicca Coding-mooc Polimi per accedere all'esercizio.

Scrivi un metodo anfore.ottava che, data una frequenza f, suoni la nota a quella frequenza, e la nota alla frequenza doppia. Quindi, invocala, passando come parametro la frequenza 400... Cosa noti? Come stanno le note, tra di loro? Stanno "bene insieme"?

Clicca Coding-mooc Polimi per accedere all'esercizio.