ChucK 101 – Lezione 1: Hello Sine!

Benvenuto alla prima lezione del corso «ChucK 101», ovvero il corso introduttivo al linguaggio di programmazione real-time dedicato alla musica di cui ho già parlato qui.

È la prima volta che programmi?

Nel caso in cui la risposta a questa domanda sia si, prima di cominciare ad avventurarci nei meandri del codice, è il caso di spendere due parole per mettere in chiaro alcune questioni fondamentali:

  1. Programmare non è semplice; richiede tempo per migliorarsi e un sacco di pazienza.
  2. Non copiare il codice! Mi rendo conto che la tentazione di fare un veloce copia-incolla del codice che troverai di seguito sia troppo forte ma, così facendo, non imparerai nulla. Inserire a mano, di volta in volta, le righe di codice ti darà la possibilità di imparare più in fretta il linguaggio di programmazione e di capire realmente quello che si sta facendo.
  3. Sperimenta. Questo è un concetto fondamentale: non basarti solo su quello che troverai scritto nei miei post. L’obiettivo è sperimentare: prova a sostituire dei valori, delle variabili, intere parti di codice, ecc… . Solo così facendo riuscirai a imparare a programmare in ChucK esplorandone tutte le possibilità.
  4. Debug. Ti potrà capitare che i tuoi programmi non funzionino. È normale, succede a tutti (anche ai programmatori più esperti) e succede di continuo. Talvolta gli errori sono dovuti a sviste banali: errori di digitazione, punti o virgole mancanti, ecc…, altre volte individuare il problema può essere un’attività lunga complessa. La cosa che devi imparare subito è capire e interpretare correttamente i messaggi di errore che ti vengono restituiti dal compilatore quando il programma non funziona. Prima imparerai a riconoscerle questi messaggi e le relative cause del problema, più semplice sarà effettuare il debug del programma.
  5. Copia gli altri e non cancellare mai niente. Molti programmatori rilasciano parti di codice liberamente e con licenze che ti permettono di copiare o modificare i loro programmi. Non reinventare la ruota ogni volta; cerca se qualcuno ha affrontato il problema prima di te, studia le loro soluzioni (ma non prenderle mai come oro colato perché potrebbero non essere aggiornate) e, se consentito, copia il loro codice. Non c’è modo migliore di imparare e migliorarsi che guardare come programmatori più esperti hanno risolto lo stesso problema. Ricorda di non cestinare mai i tuoi programmi, in futuro quelle porzioni di codice potrebbe sempre tornarti utile.
  6. Google è tuo amico. Quando sbatti la testa contro un problema che non riesci a risolvere, cerca su Google, è molto probabile che qualcuno l’abbia fatto prima di te e abbia già trovato la soluzione (e sia stato così gentile da condividerla da qualche parte).

Il software: miniAudicle

Il primo passo da compiere è quello di scaricare il software  miniAudicle da questo indirizzo. L’ultima versione disponibile, al momento, è la 1.3.4.0. Il programma è diviso in tre finestre principali: Main Window (dove scriveremo il codice), Virtual Machine Monitor Window (il server che dobbiamo avviare ogni volta che vogliamo far girare un nostro programma), Console Monitor Window (finestra che si attiva quando avviamo la virtual machine e che ci mostra vari messaggi).

Main Window
Main Window
Virtual Machine Monitor Window
Virtual Machine Monitor Window
ChucK Console Monitor
Console Monitor Window

Hello World!

Normalmente il primo programma che si impara a scrivere, indipendentemente dal linguaggio utilizzato, si chiama “Hello World!”. Lo scopo di tale programma è quello di far scrivere sul monitor del computer queste due parole come output del programma.

Nella Main Window digitate:

<<<"Hello World!">>>;

Salvate il programma andando nel menu File > Save (scorciatoia Command + S). Dopodiché nella finestra Virtual Machine cliccate sul pulsante Start Virtual Machine e, infine, nella Main Window cliccate sul pulsante Add Shred (Command + “+”).

Se avete scritto tutto correttamente, dovreste ottenere un risultato come quello nell’immagine seguente:

ChucK Hello World

Dopo l’inizializzazione della Virtual Machine  (con i relativi parametri di configurazione), potete notare che il programma ha restituito in output quello che volevamo: la scritta “Hello World!”.

Con questo semplice programma abbiamo imparato due cose importanti: la prima è che alla fine di ogni riga di istruzioni dobbiamo utilizzare il punto e virgola, la seconda è che per vedere scritto qualcosa nella finestra Console Monitor dobbiamo utilizzare il comando <<<” “>>>.

Hello Sine!

Siccome ChucK è un linguaggio di programmazione orientato alla musica, il nostro obiettivo è quello di produrre dei suoni. Mettiamo dunque da parte il nostro primo programma “Hello World” e concentriamoci sul nostro primo esperimento musicale: “Hello Sine!”.

Per non rendere questo post troppo lungo e noioso con questioni teoriche, sorvolerò alcune questioni di base sull’audio, le forme d’onda, ecc… .

L’obiettivo del programma sarà:

  1. Utilizzare un oscillatore con onda sinusoidale (la forma d’onda più semplice)
  2. Fare in modo che tale oscillatore sia collegato al convertitore digitale-analogico (ovvero quel componente che permette al computer di emettere dei suoni attraverso gli speaker)
  3. Assegnare un valore di gain (volume) all’oscillatore
  4. Assegnare un valore di frequenza all’onda sinusoidale
  5. Emettere un suono per 1 secondo

Il codice del nostro programma:

// Hello Sine
// Aprile 2014
SinOsc sine => dac;
0.7 => sine.gain;
440 => sine.freq;
1::second => now;

Una volta completata la digitazione, avviando la Virtual Machine e cliccando su Add Shred, il vostro computer emetterà un suono a 440Hz (la nota di riferimento che viene utilizzata dai musicisti per accordarsi).

Analizziamo il codice che abbiamo scritto: le prime due righe, precedute da //, sono semplicemente di commento. All’inizio del tuo percorso, ti consiglio di commentare il più possibile ogni passaggio, più migliorerai, più sarai in grado di valutare autonomamente quando sarà necessario scrivere un commento e quando no. Cosa molto importante: tutto ciò che è scritto nei commenti verrà completamente ignorato dal compilatore.

Con il comando SinOsc abbiamo richiamato un oggetto unit generator in grado di generare il suono di un’onda sinusoidale. Il nostro generatore l’abbiamo chiamato sine (ma avremmo potuto scegliere un nome qualsiasi) e, attraverso l’operatore =>, l’abbiamo collegato al dac (digital to analog converter).

Abbiamo assegnato il valore .7 al gain e 440 alla frequenza emessa dal nostro oscillatore. A differenza di molti linguaggi di programmazione, in ChucK si esprime prima il valore e poi la variabile a cui tale valore deve essere assegnata (e lo si fa utilizzando sempre l’operatore => che, come vedremo in futuro, sarà onnipresente nei nostri esercizi).

Come avrete intuito, le variabili sono legati all’oggetto di riferimento attraverso la sintassi oggetto.impostazione per cui dobbiamo utilizzare nomi efficaci e che abbiano senso. Per esempio, se avessimo assegnato all’oscillatore il nome «pippo» (SinOsc pippo => dac;) avremmo dovuto scrivere pippo.gain pippo.freq per assegnare correttamente i valori.

Infine, abbiamo detto al nostro programma di avanzare di un secondo nel tempo con il comando: 1::second => now;

Mi rendo conto che quest’ultima parte potrebbe non essere chiara al momento ma in futuro spiegherò esattamente come funziona la gestione del tempo in ChucK.

Compiti a casa

Per concludere questa prima lezione ti lascio con qualche spunto per divertirti un po’ nell’attesa della prossima lezione:

  • SinOsc ha prodotto un’onda sinusoidale, prova a utilizzare TriOsc (onda triangolare), SqrOsc (onda quadra) o SawOsc (onda a dente di sega)
  • Utilizza /* per aprire un commento di più righe e */ quando vuoi chiuderlo. Questo sistema tornerà molto utile in fase di debug per escludere, commentandole, le righe di codice non funzionante.
  • Prova a creare una breve composizione utilizzando solo ed esclusivamente le cose descritte fino a qui. Suggerimento: quando vuoi creare una “pausa”, devi impostare il valore del volume dell’oscillatore a 0. Ricordati di lasciare nei commenti un link alla tua composizione!