Scrivere musica per il Commodore 64 con GoatTracker
Articolo di tsm_carmine, pubblicato il 12-12-2008.
Categoria: Tutorials.
  • 1. Introduzione.
  • 2. Cenni di acustica.
  • 3. Le varie parti del SID.
  • 4. Modi di "programmare" il SID.
  • 5. I "tracker" e la "tracked-music".
  • 6. Struttura del GoatTracker.
  • 7. I pattern.
  • 8. La Orderlist.
  • 9. Gli Strumenti e le Tabelle.
  • 10. I Comandi (o effetti).

1. Introduzione

Il tutorial che vi presentiamo è una panoramica su GoatTracker, l'unico editor cross-platform per la musica SID. La versione aggiornata di GoatTracker è disponibile presso il sito dell'autore.

Rispetto ai molti editor nativi per C64, GoatTracker rappresenta un notevole balzo in avanti in termini di comodità, perché senza limitazioni di risoluzione possiamo avere tutte le funzioni di uso più comune in una sola schermata. La possibilità di usare il mouse, inoltre, ci libera dal dover ricordare le assegnazioni di decine di tasti. Il suo unico svantaggio è l'uso di un engine di emulazione che, per quanto sofisticato e accurato, non ha un suono perfettamente identico a quello del SID. Un problema a cui si può ovviare in due modi: o installando nel proprio PC una scheda dedicata con un vero SID, oppure, più semplicemente, testando le proprie creazioni su un vero C64.

Si raccomanda di non usare questo articolo come un "prontuario": nonostante si sia cercato di spiegare tutte le funzioni del programma, per un suo uso corretto è indispensabile fare riferimento al "readme" accluso, il quale contiene elenchi dettagliati di valori, parametri ed esempi, che sarebbe stato inutile ripetere anche qui.

Molto spesso, sfogliando i newsgroup e i forum dedicati al Commodore 64, mi sono imbattuto in messaggi di appassionati che chiedevano informazioni sul programma da usare per cominciare a fare musica con l'amato biscottone. L'errore che molti commettono e che purtroppo induce la maggior parte di costoro ad abbandonare il proposito, è quello di voler partire da un programma. Per fare musica con il C64, il primo passo è una base di conoscenza sul suo modo di funzionare e in particolare su come funziona il SID.

Stiamo parlando di un programma che consente un controllo quasi totale sul SID: una caratteristica indispensabile per ottenere risultati di un certo livello. E dunque io stesso, durante la stesura dell'articolo, mi sono scontrato con il dilemma di dover decidere quanto spazio dedicare alla descrizione del SID, oltre che al programma vero e proprio. Spero che il dosaggio adottato sia quello giusto e, in ogni caso, consiglio di dare un'occhiata al libro "Voi e il vostro Commodore 64", presente nella Sezione Libri di questo sito: a partire da pagina 154 trovate una sezione dedicata al suono, dettagliata e scritta in modo molto piacevole.

Ovviamente, coloro che hanno esperienza di programmazione in Assembly, sanno che cos'è un registro e sono abituati ad avere a che fare con "bit" e "byte" saranno certamente avvantaggiati. Gli altri non devono comunque preoccuparsi: con una breve infarinatura sui sistemi esadecimale e binario si è già pronti a sfruttare ottimamente l'applicazione. Sono concetti molto semplici, ottimamente spiegati nei link che seguono:

http://it.wikipedia.org/wiki/Sistema_numerico_esadecimale

http://it.wikipedia.org/wiki/Sistema_numerico_binario

Chi invece volesse provare ad usare il programma senza particolari conoscenze tecniche e aritmetiche, può limitarsi ad imparare come inserire semplici note senza effetti, a editare i pattern e ad inserirli correttamente nella orderlist. Con un po' di pratica, semplicemente caricando strumenti già pronti da brani creati da altri, si possono ottenere risultati assolutamente dignitosi. Sarà sempre possibile, in un secondo momento, apprendere le nozioni necessarie per padroneggiare anche tutte le altre possibilità offerte dal programma.

2. Cenni di acustica

Il suono è una sensazione che noi esseri umani riceviamo quando c'è un corpo che vibra. In particolare, quando da piccoli giocavamo con il C64 sul televisore di casa, ascoltavamo i suoni dovuti alle vibrazioni della membrana dell'altoparlante della TV. Tra le caratteristiche del suono, le più importanti sono la frequenza, l'intensità e il timbro.

La frequenza è quella che differenzia i suoni gravi da quelli acuti: è tanto maggiore quanto più veloce vibra il corpo che produce il suono.
L'intensità non è altro che il volume del suono: se le vibrazioni sono più ampie otterremo un suono più forte e viceversa.
Il timbro, o forma d'onda, è ciò che differenzia tra loro gli strumenti: tutti siamo in grado di distinguere un pianoforte da un flauto, anche quando suonano la stessa nota. Ciò che differisce è appunto il timbro.

Inoltre, per "scolpire" con precisione ancora maggiore un suono, esistono anche delle tecniche chiamate "inviluppi". Si tratta di un concetto importante della musica elettronica, di cui parleremo più avanti.

3. Le varie parti del SID

Il responsabile di tutti i suoni emessi dall'altoparlante di cui sopra è, come tutti sanno, il SID. Si tratta di un circuito integrato dotato di registri. Scrivendo determinati valori numerici in questi registri, siamo in grado di pilotarlo per ottenere i suoni desiderati.

L'integrato si compone di 3 oscillatori, di un filtro programmabile e di 2 convertitori analogico-digitale usati per gestire le paddles o il mouse 1351. Ogni oscillatore è responsabile di una delle 3 voci sonore del SID e ogni voce può generare 4 diverse forme d'onda o combinazioni di queste 4.

E' anche possibile combinare tra loro 2 voci per ottenere effetti interessanti. È implicito che, per avere il pieno controllo del SID (con i software che lo permettono, come Goat, o direttamente programmando il C64), è indispensabile studiarne attentamente la struttura e il funzionamento su qualche manuale tecnico.

4. Modi di "programmare" il SID

Mi è capitato, a volte, di leggere su qualche sito amatoriale che il SID è un "processore sonoro". Questa affermazione è sostanzialmente sbagliata e potrebbe indurre a pensare al SID come a una strana CPU che incorpora un hardware audio. In realtà, nel C64, il processore è solo uno, il 6510. Ed è proprio la CPU che, opportunamente programmata, fa suonare il SID.

Molti di coloro che leggeranno questo articolo avranno provato almeno una volta a fare musica in Basic. La caratteristica più evidente, in questi programmi, era la gran quantità di istruzioni POKE necessarie per scrivere i valori nei registri del SID. Questo si deve al fatto che il SID è un integrato "memory mapped". Possiamo immaginare la memoria del C64 come una bacheca con tante caselle messe in colonna, ognuna identificata da un indirizzo, dove la CPU può leggere e scrivere numeri. Alcune di queste caselle appartengono al SID, e infatti sono dette "registri" del SID. Questo vale anche per altri integrati, che "appaiono" ovviamente in altre zone della memoria. L'istruzione POKE è quella che permette di inserire un valore in un determinato indirizzo di memoria e quindi anche in un determinato registro (che sia del SID o di un altro integrato).

Ecco perché i programmi di esempio contenuti nella guida del C64, in particolare nei capitoli dedicati alla grafica e al sonoro, contengono così tante istruzioni POKE. Dato, quindi, che tutti i registri che questo circuito espone al programmatore sono accessibili come normali indirizzi di memoria, il programmatore deve solo ricordarsi che a partire da un certo indirizzo cominciano i registri del SID e che quindi, scrivendo dei numeri in quelle particolari locazioni di memoria, influenzerà il comportamento del chip.

Il Basic non è affatto adeguato per fare musica con il SID: è lento, poco versatile e non permette di generare una musica di sottofondo, ad esempio per un gioco. Per creare una musica utilizzabile come sottofondo è necessario costruire un programma in linguaggio macchina. Anche usando un editor (compreso GoatTracker), quello che si ottiene in ultima fase è sempre un programma in linguaggio macchina. In particolare, le varie "routine" esistenti sono quasi tutte progettate per essere eseguite a brevi intervalli regolari: il processore sa che in un dato momento deve saltare alla routine di esecuzione e sarà la routine stessa, appena finita l'elaborazione, a rilasciare la CPU per altri compiti. Nel caso più comune, si tratta di 50 chiamate ogni secondo, ossia la frequenza di esecuzione è 50Hz. La singola chiamata, in gergo tecnico, è definita "frame". In ogni frame vengono eseguiti dei calcoli, vengono eventualmente iniziate nuove note, si modificano i parametri di note già in esecuzione, ecc.

È superfluo precisare che, anche se i frame vengono iniziati 50 volte al secondo, la loro durata è sempre molto inferiore ad 1/50 di secondo poiché altrimenti la CPU, oltre a gestire la routine musicale, non avrebbe tempo di fare nient'altro. Esiste invece un'unità di tempo fissa, definita "tick", che dura esattamente 1/50 di secondo, e viene usata come parametro in alcuni comandi che vedremo più avanti. Il modo in cui la CPU fa funzionare queste routine musicali, "switchando" in continuazione tra queste e altre routine di elaborazione non ci interessa: in fondo non siamo qui per imparare a fare musica in linguaggio macchina. È tuttavia utile sapere che 50Hz è considerata la velocità di riferimento di una routine musicale (1X). In caso di esecuzioni a 100Hz, infatti, si parla di velocità 2X e così via.

5. I "tracker" e la "tracked-music".

I "tracker" sono programmi per sequenziare musica, nati negli anni '80 sui computer Amiga. Erano lo strumento preferito per creare le musiche dei videogiochi. La musica composta con questi programmi si discosta sia dalla musica midi che da quella wave o mp3, potendosi considerare come una via di mezzo tra queste due "filosofie". Come nella musica midi, è presente una sequenza di note ed effetti, concettualmente simile a uno spartito. Ma a differenza del sistema midi, gli strumenti non sono esterni al brano, ma memorizzati nel file stesso sotto forma di suoni campionati.

Ogni nota contiene un riferimento a uno dei vari "sample" (campioni) presenti, da suonare a una certa velocità, per ottenere una melodia. Ogni brano è composto da un certo numero di "pattern", che possiamo considerare come le pagine del nostro spartito. Questi pattern sono eseguiti nell'ordine in cui sono elencati nella tabella chiamata "orderlist" e ogni pagina può essere ripetuta a piacere più volte e in qualunque posizione. Nei più comuni tracker dell'Amiga, ogni pattern ha in sé 4 sequenze distinte chiamate tracce, relative alle 4 voci hardware disponibili e ogni traccia è formata da 3 colonne: quella delle note, quella degli strumenti e quella degli effetti. Se su una riga troviamo "A-4 01 000", vorrà dire che in quella particolare posizione, il computer dovrà suonare il "la" della quarta ottava, usando lo strumento n. 01, mentre "000" indicherà che non vogliamo applicare alcun effetto alla nota.

Questo modo di comporre musica spesso porta a composizioni considerate troppo "omogenee", macchinose ed eccessivamente elettronicheggianti ma ha l'indubbio vantaggio di essere estremamente semplice, esentandoci dal conoscere la notazione musicale su pentagramma. Consiglio a chi fosse interessato di provare il programma MilkyTracker, uno degli ultimi esempi di tracker per PC, e di provare ad eseguire alcuni file MOD o XM per farsi un'idea.

6. Struttura del GoatTracker.

La prima, sostanziale differenza, tra GoatTracker e i tracker classici per Amiga/Atari ST/PC, è l'assenza di suoni campionati. Nel nostro caso ogni strumento è un insieme di parametri atti a definire un suono. Anche il sistema di pattern e orderlist è differente poiché le voci, come abbiamo detto, sono 3. Infine viene introdotto il concetto delle tabelle. La parte sinistra della schermata è tutta dedicata ai pattern attualmente visualizzati. La caratteristica di questi pattern è che ognuno di essi ha una sola traccia ed è quindi relativo a una sola voce. Durante l'esecuzione, quindi, saranno usati 3 pattern contemporaneamente. Questo è stato fatto per non sprecare memoria: possiamo ad esempio realizzare una melodia su più pagine con una base ritmica sempre uguale senza dover copiare/incollare la base ritmica in più pattern ma semplicemente riutilizzandola.

Tutto questo ha un'ovvia ripercussione sulla orderlist, ovvero la tabella in alto a destra, che descrive l'ordine in cui devono essere suonati i pattern. Invece di essere una sola sequenza di numeri, è costituita in realtà da 3 sequenze, una per ogni voce. Immediatamente sotto la orderlist troviamo gli strumenti, con i vari parametri che spiegheremo dopo. Più in basso trovano posto le tabelle, che sono sequenze di numeri a cui si fa riferimento dall'esterno per realizzare effetti o per descrivere alcuni parametri di uno strumento. Ancora più in basso si trova invece il campo usato per immettere il nome della composizione e altre informazioni identificative.

Posizionando il puntatore sulla barra blu in alto e tenendo premuto il tasto destro, avremo accesso a una serie di funzioni importanti come quella per salvare e caricare: bisogna fare molta attenzione quando si usano questi due comandi, perché possono agire sulla canzone o sullo strumento corrente, a seconda di dove si trova in quel momento il cursore di immissione dati. I comandi visualizzati sul menu in alto si attivano continuando a tenere premuto il tasto destro e premendo al contempo quello sinistro.

7. I Pattern

Prima di cominciare a parlare dei pattern, sarà bene spiegare come sono associate le note ai tasti della tastiera. Questo tipo di associazione è stato usato in quasi tutti i tracker fin dai primordi. Dunque, la tastiera copre un campo di 2 ottave. Ogni ottava si può immaginare come un piccolo pianoforte dotato solo delle note DO RE MI FA SOL LA SI DO e dei relativi tasti neri. La prima delle due comincia con il tasto 'Z' (DO), finisce con la ',' (DO alto) e usa i tasti della fila "ASDFGH..." come tasti neri (ma ovviamente non tutti!). La seconda comincia con 'Q', finisce con 'I' e usa parte dei tasti numerici come tasti neri.



Perché nello schema non compare la virgola? Perché le due ottave si sovrappongono di alcune note. Dopo la 'M', i tasti ',', 'L' e '.' sono associati alle stesse note dei tasti 'Q', '2' e 'W' dell'ottava alta. Si tratta delle note DO, DO# e RE e ovviamente il DO è in comune alle due ottave. Spiegheremo poi come si possa, con questo sistema, utilizzare tutte le ottave in realtà disponibili. Come detto poco sopra, un pattern non è altro che una sequenza di note ed effetti. Quando si comincia a editare un pattern vuoto, si nota che ogni riga contiene il testo "...00000". Il significato di questa strana "stringa" è sorprendentemente semplice:



L'accoppiata nota-ottava e il numero dello strumento si aggiornano automaticamente nel momento in cui premiamo uno dei tasti del nostro "piano virtuale" quando il cursore colorato si trova nella colonna nota-ottava. Possiamo provare anche adesso.

Lanciamo GoatTracker e prima di inserire la nostra prima nota osserviamo 2 cose: la scritta "INSTRUMENT NUM. 01" che si trova sulla destra e la scritta "OCTAVE 2" in basso a sinistra. Ora che sappiamo quali sono lo strumento corrente e l'ottava corrente, non dovremmo avere difficoltà a prevedere ciò che succederà premendo 'Z' sulla tastiera. Il testo sulla riga cambia in "C-201000", che sta per "DO, seconda ottava, strumento 01, nessun effetto". Se adesso premiamo 'Q' la seconda riga cambia in "C-301000", perché nella parte "alta" della tastiera abbiamo sempre a disposizione le note dell'ottava successiva a quella corrente. Ma come fare per usare ottave diverse da '2' e '3'?

Semplicissimo, basta cliccare sul numero dell'ottava con i tasti sinistro e destro per incrementare e decrementare il numero, cambiando l'ottava. La stessa identica cosa vale per lo strumento: cliccando con i tasti del mouse potremo cambiare il numero dello strumento e vedere aggiornarsi la lista dei parametri presente immediatamente sotto. Per inserire una nota più "distante nel tempo" dalla precedente, basta spostarsi verso il basso con i tasti freccia: al momento dell'esecuzione passerà tanto più tempo tra una nota e l'altra quante più righe vuote (... 00000) avremo lasciato in mezzo.

Esistono anche 2 simboli speciali che possiamo inserire nel campo "nota", e che servono rispettivamente ad azzerare il gatebit dello strumento, dando origine alla fase di release in cui il volume scema, e a reimpostare il bit a 1, per svegliare o risvegliare uno strumento che in un dato momento è muto. I simboli sono --- e +++, inseribili con INVIO e SHIFT-INVIO. Per ulteriori informazioni vedere il paragrafo riguardante gli strumenti, alle voci "Attack/Decay" e "Sustain/Release".

Bene, adesso proviamo ad inserire qualche nota, scegliendo di volta in volta ottave, strumenti e posizioni diverse. E' utile sapere che possiamo usare anche i tasti 'INS', 'CANC' e 'BackSpace' per editare il pattern con la massima comodità. Inoltre, usando questi tasti quando il cursore si trova nell'ultima riga, contrassegnata con la dicitura 'PATT.END', si modifica la lunghezza del pattern. Se provassimo ad eseguire il brano ora (il comando "PLAY" è tra quelli presenti nella barra superiore), non sentiremmo nulla, poiché gli strumenti sono tutti azzerati. Ora proviamo ad usare gli strumenti di una delle canzoni di esempio per comporre qualche breve melodia.

Mentre il cursore colorato si trova nel pattern editor, portare il puntatore del mouse sulla barra in alto e, tenendo premuto il tasto destro del mouse, cliccare su LOAD con il sinistro. Dopo aver caricato il brano, scegliere CLEAR sempre dal menu in alto. Rispondere 'yes' solo alle domande "clear orderlist" e "clear patterns". Su "pattern length: 64" premere invio. A questo punto inserire qualche nota scegliendo le ottave e gli strumenti come prima, usando magari tutti e tre i pattern visualizzati, in modo da sfruttare contemporaneamente le 3 voci del SID. La melodia si può ascoltare in ogni momento scegliendo PLAY dal menu in alto o premendo il tasto scorciatoia F1.

Il risultato potrà essere un po' deludente perché possono esserci strumenti che bisogna usare con accorgimenti particolari, come quelli che fanno uso del filtro. Prima di chiudere questo paragrafo è bene menzionare l'utilità della barra di spazio. Se mentre stiamo editando un pattern non siamo sicuri di quali note bisognerà usare in un certo passaggio, premendo spazio entreremo nella modalità "JAM", che ci consente di "suonare" con la tastiera senza che le note vengano effettivamente inserite nel pattern (utile anche per provare la "resa" di uno strumento).

8. La Orderlist

Ogni pattern è identificato da un numero esadecimale a due cifre. Siccome, da soli, i 3 pattern visualizzati non bastano certo a fare alcunché di serio, dobbiamo servirci della Orderlist per mettere in sequenza un certo numero di pattern. La Orderlist, ovvero la parte in alto a destra della schermata di GoatTracker, è composta da 3 sequenze di numeri, relative alle 3 voci del SID. I numeri, ovviamente, rappresentano i pattern. Il comando RSTxx posto alla fine di ogni sequenza stabilisce da quale posizione ricominciare l'esecuzione una volta finito di suonare l'ultimo pattern.

Editare la Orderlist è semplicissimo: dopo aver cliccato col mouse in un punto qualunque delle nostre sequenze, possiamo spostarci in lungo e in largo con i tasti cursore, inserire e cancellare pattern con i tasti 'INS' e 'CANC' e modificare numeri a piacimento. Quando si inserisce un numero di pattern nella lista, non è importante che questo sia stato effettivamente "popolato" con note e/o effetti; finché non ci preoccuperemo di farlo, esso apparirà vuoto. Per visualizzare subito il contenuto di un pattern, basta posizionarvi il cursore colorato e premere 'INVIO'. Lo vedremo apparire a sinistra, al centro o a destra, secondo la sequenza (e quindi il canale) di cui fa parte.

A questo punto lo si può leggere, ascoltare, modificare, ecc. E' importante ricordare che in questo modo, i pattern contemporaneamente visualizzati negli altri 2 canali non saranno necessariamente quelli che in fase di esecuzione saranno suonati insieme a quello appena scelto. Per cui, se abbiamo intenzione di fare un "ascolto di prova" del pattern visualizzato, sarebbe meglio visualizzare quelli giusti. Bisogna stare attenti quando si usano pattern di lunghezza differente l'uno dall'altro; è buona norma che in una stessa posizione i pattern abbiano la stessa lunghezza, altrimenti l'indicatore della posizione, durante l'esecuzione, si sposta in maniera diversa nelle varie sequenze e diventa difficoltoso apportare modifiche successive. Provare per credere! Restando in tema di 'prove di ascolto', sarà utile spiegare l'utilità dei tasti F1, F2, F3, F4 e 'Shift'.

  • F1: Come ho accennato prima, questo tasto avvia l'esecuzione del brano dall'inizio.
  • F2: Esegue il brano partendo dalle posizioni attualmente 'marcate' nella Orderlist. Per marcare una posizione, portare il cursore colorato su di essa e premere 'Spazio'. Il numero di pattern diventerà verde.
  • F3: Esegue solo i 3 pattern correntemente visualizzati, ciclicamente.
  • F4: 'Stop'. Utile anche quando si testano strumenti il cui suono si protrae a lungo.
  • Shift: Premendolo insieme a uno dei 3 tasti 'play', vedremo scorrere i pattern riga per riga durante l'esecuzione. Combinato con F4 è usato per disabilitare temporaneamente un canale audio.

Infine, nelle sequenze della Orderlist possono essere inclusi anche dei comandi, come ad esempio '+1', che serve ad aumentare di un semitono tutto ciò che verrà suonato da quel punto in poi; fare riferimento al corposo manuale del GoatTracker per una spiegazione completa di questi comandi.

9. Gli Strumenti e le Tabelle

Ogni brano può contenere fino a 63 strumenti diversi e ogni strumento non è altro che un insieme di valori, che ne definiscono le caratteristiche. Alcuni di questi parametri, come i famosi "Attack/Decay" e "Sustain/Release", vengono dati direttamente. Altri, come la "WaveTable Position", vengono specificati in maniera indiretta: il numero è in realtà un indice che punta ad una particolare riga all'interno di una delle tabelle. Nella tabella ci sarà una sequenza di numeri che si può interpretare come un piccolo programma, che fa variare in maniera più o meno veloce il contenuto di quel particolare registro del SID. Prendiamo come esempio proprio il parametro chiamato "WaveTable Position". Si tratta di un accorgimento che rende il programma molto flessibile, perché ci permette di specificare una sequenza di forme d'onda differenti per il nostro strumento, stabilendo la durata di ognuna, con la possibilità di inserire "loop" o "salti" all'interno della tabella. Nulla ci vieta, comunque, di specificare un'unica forma d'onda: basta inserirla seguita da un apposito comando (FF 00) che obbliga il player a terminare l'esecuzione della tabella. Passiamo in rassegna i vari parametri:

Attack/Decay. Le due cifre di questo parametro hanno ognuna un significato a sé stante. La prima (Attack) specifica il tempo necessario perché l'intensità del suono passi da 0 al massimo, la seconda (Decay) stabilisce in quanto tempo l'intensità passa dal massimo livello al livello di Sustain specificato dopo.

Sustain/Release. La prima cifra definisce il volume del suono, dove $0 è il minimo e $F il massimo. La seconda, che si comporta come Attack e Decay, stabilisce il tempo che il suono impiega per passare dal livello di Sustain a zero: il valore $0 taglierà il suono di netto, mentre $F darà un "fade-out" della maggior durata possibile. La fase di Release si innesca soltanto quando un certo bit, chiamato "Gate Bit", presente nel registro della forma d'onda viene azzerato. Questo avviene appunto modificando la forma d'onda. Il modo più semplice per fare questo è inserire nel pattern, dopo la nota, un "keyoff" (rappresentato come "---"), usando il tasto Invio.



In gergo musicale, il gruppo di parametri "Attack/Decay - Sustain/Release" costituisce un inviluppo di volume.

WaveTable Pos. Indicare qui il numero di riga in cui, nella Wave Table, comincia la sequenza di forme d'onda che si desidera associare allo strumento. Grazie a questa tabella, possiamo anche obbligare il player a suonare una o più note predefinite, ignorando completamente la nota inserita nel pattern. Un esempio molto comune di ciò sono gli strumenti percussivi, ottenuti specificando una serie di forme d'onda e note fisse (combinati ovviamente con valori adatti di ADSR, filtro e quant'altro). Non meno importante è poi la possibilità di inserire note relative ed eventualmente metterle in loop, per creare il famosissimo effetto di arpeggio così tipico del "sound" non solo del SID ma anche dei chip sonori di molti altri home computer. Il concetto è quello di dire al player: "Suona la nota del pattern, poi la stessa aumentata di 4 semitoni, poi ancora la stessa aumentata di 7 semitoni, torna all'inizio e ripeti". Ovviamente le note possono essere di più o di meno e il numero di semitoni si può scegliere a piacere.

PulseTable Pos. La vecchia guida dell'utente del Commodore 64, nel capitolo dedicato al SID, diceva che usando la forma d'onda "rettangolare", potevamo variarne il timbro impostando un particolare parametro chiamato "duty cycle". Questo parametro, oggi più noto come "PulseWidth", in parole povere stabilisce la proporzione tra la durata dello stato "alto" e la durata dello stato "basso" dell'onda rettangolare. Con GoatTracker possiamo non limitarci ad impostarlo una volta per tutte sullo strumento ma possiamo anche qui definire una lista di valori lunga a piacere ed eventualmente ciclica, ottenendo ciò che si chiama una "modulazione d'impulso". Ecco un esempio di suono a forma d'onda rettangolare con variazioni continue di duty cycle: pulsetable.wav.

FilterTable Pos. Indicare qui il punto in cui, nella tabella dedicata al filtro, cominciano i parametri per il filtro dello strumento. Se non si intende usare il filtro sullo strumento, il valore si può lasciare anche impostato a $00. Bisogna fare molta attenzione nell'uso del filtro, poiché oltre ai parametri "fisici" del filtro, bisogna indicare anche su quale canale (o canali) il filtro dovrà agire (e non su quale strumento!). Io di solito inserisco nel nome dello strumento il numero di canale su cui il suo filtro agisce e poi uso lo strumento solo in quel canale e mai contemporaneamente ad altri strumenti che pure fanno uso del filtro. Siccome abbiamo il pieno controllo sulla macchina (anche se emulata), possiamo (per errore o di proposito) assegnare a uno strumento un filtro impostato sul canale 1, mentre su tale canale facciamo suonare un altro strumento. Occhio!

Vibrato Parameter. Un indice alla Speed Table (una tabella che potremmo definire multiuso e di cui parleremo anche più avanti), dove bisogna dare una lista di parametri che definiscono la velocità e la profondità del "vibrato" dello strumento, detto anche "modulazione di frequenza", che consiste nella variazione periodica dell'altezza di una nota.

Vibrato Delay. Molto semplicemente, questo valore stabilisce dopo quanto tempo dovrà cominciare l'esecuzione del vibrato sullo strumento.

HR/Gate Timer. Per evitare che alcune note vengano suonate in maniera errata a causa di un bug nel SID, molte playroutines (inclusa quella del Goat) eseguono automaticamente una piccola procedura, chiamata HardRestart (HR), prima dell'inizio di ogni nota. Senza questo accorgimento, il SID tende, in presenza di determinati valori nell'ADSR, a "sbagliare" l'ADSR stesso o a saltare del tutto alcune note. Tale procedura può iniziare soltanto quando il "Gate Bit" (il bit nel registro della forma d'onda che, azzerato, avvia la fase di release) è impostato a 0. Con questo parametro, stabiliamo quando eseguire la sequenza "azzeramento del Gate Bit" & "esecuzione dell'HardRestart", indicando con quanti frames di anticipo questa deve avvenire rispetto all'inizio di ogni nota.

Ecco infine un breve riassunto delle tabelle e del loro uso. Ogni riga di una tabella è formata da 2 byte, che chiamiamo "lato sinistro" e "lato destro".

Wavetable. E' la tabella delle forme d'onda. Nel lato sinistro possiamo specificare forme d'onda, alcuni tipi di pattern-commands (di cui parleremo nel prossimo paragrafo) e il comando speciale FF ("salto" ad una particolare riga della tabella). Nel lato destro possiamo inserire note relative, note assolute, un parametro che indica di lasciare inalterata la frequenza della nota (80), o i parametri dei vari comandi (ad es. è qui che specifichiamo a quale riga saltare in presenza del comando FF). Inserendo determinati valori in questa tabella è anche possibile realizzare effetti interessanti combinando tra loro gli output di 2 canali: vedere il readme per maggiori dettagli. Inoltre il bit meno significativo del registro gestito da questa tabella, se impostato a zero, termina la fase di Sustain e avvia quella di Release. Siccome azzerare il bit meno significativo di un registro vuol dire inserire un numero pari nel registro, se usiamo un singolo valore di forma d'onda e lo scegliamo pari otterremo uno strumento che salta completamente la fase di Sustain, mentre se lo scegliamo dispari avremo uno strumento che, in assenza di interventi esterni (come un Keyoff inserito nel pattern) non raggiungerà mai la fase di Release. Infine, inserendo una sequenza di numeri dispari seguita da un numero pari, avremo uno strumento che, sempre fatti salvi interventi esterni, avrà una fase di Sustain di una certa durata e poi giungerà al Release.

Pulsetable. Se inseriamo nella colonna sinistra un valore compreso tra 01 e 7F, imposteremo i paramentri della modulazione di impulso; in questo caso il valore sinistro indicherà la durata dell'effetto e quello destro la velocità con cui varia la pulsewidth. Se, invece, inseriamo a sinistra un valore non appartenente all'intervallo suddetto e diverso da FF, possiamo impostare la pulsewidth in maniera fissa. In quest'altro caso, il nybble alto del valore dato a sinistra viene ignorato, il nybble basso rappresenta i 4 bit alti della pulsewidth e il valore nella colonna di destra, preso per intero, indica gli 8 bit meno significativi (bassi) della pulsewidth, per un totale di 12 bit. Anche qui, il comando FF è usato per saltare ad un'altra riga della tabella, indicata a destra. Il comando FF 00 termina l'esecuzione dei parametri in tabella.

Filtertable. Inserendo 00 sul lato sinistro, diremo al programma che vogliamo impostare la frequenza di cutoff del filtro (da specificare, ovviamente, nella colonna di destra). Inserendo un valore compreso tra 01 e 7F, possiamo realizzare la "filter modulation", cioè variazioni continue nel tempo della frequenza di cutoff; il lato sinistro indica per quanto tempo eseguire l'effetto, quello destro, considerato come numero con segno, indica la velocità con cui deve avvenire l'incremento (o il decremento) del cutoff. Un valore compreso tra 80 e F0 nella colonna a sinistra serve per indicare i parametri del filtro. Ecco come funziona. Il primo nybble del lato sinistro (il nybble basso è ignorato) seleziona il tipo di filtro, in questo modo:

9 -> passa - basso

A -> passa - banda

B -> passa - alto

C, D, E, F -> combinazioni varie dei 3 tipi principali

Il valore a destra stabilisce altri due parametri importanti: il valore di risonanza e l'indicazione di quale o quali canali debbano essere influenzati dal filtro. Il comando FF, infine, serve per saltare ad un'altra riga della tabella, il cui numero va specificato a destra. "FF 00" termina l'esecuzione della tabella.

Speedtable. È usata per il vibrato (sia esso insito nello strumento o inserito come comando all'interno del pattern), per il portamento (disponibile unicamente come comando dal pattern) e per il funktempo (idem). Vediamo come funziona caso per caso.

Vibrato: è l'operazione di innalzare ed abbassare ciclicamente il tono di una nota. Il numero a sinistra indica il tempo necessario affinché si passi, appunto, dalla fase di incremento a quella di decremento, mentre il numero a destra rappresenta la profondità dell'effetto, cioè di quanto aumentare o diminuire la nota ad ogni passaggio (tick).

Portamento: qui il valore a sinistra e quello a destra costituiscono rispettivamente il byte alto e il byte basso di un unico numero a 16 bit, che viene sommato al tono della nota una volta ogni "tick".

Funktempo: per capire di che cosa si tratta bisogna innanzi tutto capire che cosa si intende per "tempo". Il "tempo" non è altro che un numero, solitamente molto basso (nell'ordine delle unità), che stabilisce per quanti "tick" l'esecuzione dovrà "soffermarsi" su una singola linea di pattern prima di passare alla successiva. Siccome, spesso, lavorando in questo modo, non si riesce ad ottenere la velocità di esecuzione desiderata ma bisogna accontentarsi di una velocità leggermente più alta o più bassa, ci viene in aiuto questo comodo "effetto". I due valori, sinistro e destro, rappresentano ognuno un "tempo" indipendente; l'esecuzione si alterna in continuazione tra l'uno e l'altro, consentendoci di ottenere una velocità di esecuzione intermedia.

10. I Comandi (o effetti)

Nel paragrafo che parla dei pattern si è visto che su ogni riga, oltre alle varie note e relativi strumenti, c'è un ulteriore dato composto da 3 cifre, impostate per default a 000. Si tratta del "pattern command" ("comando di pattern"), che esisteva anche nei vecchi tracker dell'Amiga, dove tradizionalmente è sempre stato chiamato "effetto". La prima delle 3 cifre costituisce il comando vero e proprio, mentre le rimanenti 2 rappresentano il parametro da passare al comando. Ecco la descrizione dei vari comandi:

0XY: Niente!

1XY: Portamento in su. XY è interpretato come un indice ad un valore di 16 bit nella speedtable.

2XY: Portamento in giù. XY è interpretato come sopra.

3XY: Portamento a nota. La nota inserita su questa riga non viene "avviata" come nota a sé stante, ma il tono della nota precedentemente in esecuzione viene diminuito o aumentato fino a raggiungere il valore della nota data. Se XY vale 00, il portamento avviene istantaneamente; altrimenti è interpretato come un indice a un valore di 16 bit nella speedtable.

4XY: Vibrato. XY è un indice alla speedtable. Qui, il valore a sinistra e quello a destra indicano rispettivamente la velocità e la profondità dell'effetto.

5XY: Imposta Attack/Decay. Il registro di Attack/Decay del SID relativo al canale audio in cui ci troviamo viene impostato al valore dato in XY.

6XY: Imposta Sustain/Release. Il registro di Sustain/Release di questa voce è impostato al valore in XY.

7XY: Imposta forma d'onda. Imposta il registro forma d'onda al valore dato in XY. Non ha effetto se contemporaneamente l'esecuzione della wavetable sta modificando il registro.

8XY: Imposta puntatore wavetable. Forza l'esecuzione della wavetable a partire dall'indice dato in XY.

9XY: Imposta puntatore pulsetable. Forza l'esecuzione della pulsetable a partire dall'indice dato in XY.

AXY: Imposta puntatore filtertable. Forza l'esecuzione della filtertable a partire dall'indice dato in XY.

BXY: Imposta controllo filtro. Imposta la risonanza col valore in X e la channel bitmask col valore in Y. Se XY = 00, disattiva il filtro e arresta l'esecuzione della filtertable.

CXY: Imposta frequenza di cutoff. Usa il valore in XY per impostare la frequenza di cutoff. Non ha effetto se la filtertable sta cambiando la frequenza di cutoff nello stesso momento.

DXY: Imposta volume globale.

EXY: Funktempo. XY rappresenta un indice alla speedtable. Qui, il valore destro e quello sinistro vengono usati come tempo e alternati in continuazione l'uno con l'altro. Utile per ottenere un tempo intermedio di esecuzione. Vale per tutti i canali audio.

FXY: Imposta tempo. I valori da $03 a $7F impostano il tempo per tutti i canali. Quelli da $83 a $FF solo sul canale corrente (sottrarre $80 per ottenere il tempo vero e proprio). I numeri $00 e $01 richiamano i valori "funktempo" impostati dal comando EXY.

Congratulazioni, il tutorial termina qui!

Spero vivamente di non avere alimentato più dubbi che certezze in coloro che si sono presi la briga di leggere tutto fino alla fine. Detto ciò non posso che esortare tutti voi a comporre le vostre melodie e, se lo volete, farcele ascoltare.
Chi sa che uno di voi non sia un nuovo inconsapevole Jeroen Tel!

| | Share
Commenti
Commenta gioco Ci sono 2 commenti per questo articolo. Registrati se vuoi lasciarne uno.
da assiduo utilizzatore di protracker nei tempi che furono,trovo questo articolo semplicemente sublime,complimenti! ora ci provo a tirar fuori qualcosa dal sid :)
@ - postato da djp - 12 December 2008 [16:13]
Bravissimo TSM, eccellente articolo, i miei complimenti!
# - postato da pippo79 - 15 December 2008 [08:14]
Commodore 64
Utenti Online
Ciao, ospite!
(Login | Registrati)

Cerca un gioco
Random Game
Ultimo Commento
Clicca per leggere tutti i commenti
Cliff Hanger
"Ho giocato per ore, giorni, mesi.... Mi piaceva e mi piace tuttora! La grafica non è certo superlativa e nemmeno il sonoro è di prim'ordine, ma il gioco nel suo complesso è molto originale ed è facile rimanere incollati alla sedia per finire il liello!Ci sono ben tre serie differenti di livelli; la prima serie è tutto sommato facile da finire, ma dalla seconda cominciano i guai perchè si possono perdere molto facilmente le vite dato che spesso i mezzi usati per fermare il fuorilegge si rivelano trappole per noi stessi! Vi consiglio di provarlo a fondo!! Nella versione che usavo io il gioco si chiamava Sheriff..."
- Scritto da odla74
Ult. Commento Art.
I Drive Commodore
"Rileggendo questo articolo che avevo scritto ormai molti anni fa, ritengo utile riportare qualche precisazione. L'analisi qui riportata in merito all'affidabilità dei 1541 è valida dal punto di vista software, quindi posso tuttora ..."
- Scritto da MarC-ello
Ospitato su