Intervista a Bob Yannes
Questa è un'intervista a Bob Yannes, il creatore del chip SID, che dopo aver lavorato per la
Commodore co-fondò la famosa compagnia di sintetizzatori Ensoniq. Nella seconda parte
dell'intervista ci darà una descrizione veramente dettagliata sulla tecnologia del SID.
L'intervista è stata effettuata via e-mail nell'Agosto 1996 da Andreas Varga; alcune
domande sono di Linus Walleij.
> Avresti mai previsto che la gente trattasse il tuo piccolo VLSI chip come uno strumento?
Io ero un appassionato di musica elettronica prima di entrare a lavorare nella MOS Technology (una delle divisioni produttrice di chips della Commodore) e non sapevo niente sul design dei chip VLSI. Fui assunto per le mie conoscenze sulla musica sintetizzata, ritenute utili per futuri prodotti MOS/Commodore. Quando disegnai il chip SID, tentavo di creare un singolo chip sintetizzatore voice con la speranza di trovargli un posto nel campo dei sintetizzatori polifonici/politimbrici.
> Sei a conoscenza dell'esistenza di programmi come SIDPLAY,
PlaySID, ... che emulano il chip SID con un
> semplice click?
Solo recentemente sono venuto a conoscenza di questi programmi. Ho paura di non aver pensato abbastanza al SID negli ultimi 15 anni... Sono costantemente sbalordito e gratificato dal grande numero di persone che sono positivamente affezionate dal chip SID e dal Commodore 64 (ho contribuito al design anche di quest'ultimo) e che continuano a produrre materiale con essi nonostante la loro "obsolescenza".
> Hai mai ascoltato brani di alcuni compositori SID come Rob Hubbard, Martin Galway, Tim Follin, Jeroen Tel ed altri?
Temo di no, sono disponibili le loro registrazioni negli Stati Uniti?
> Credevi che fosse possibile ottenere quello che fa il tuo chip?
Fino a quando non lo sentii non ero sicuro di quello che stavo facendo, comunque io disegnai il chip SID con una risoluzione sufficiente a produrre musica di alta qualità. Purtroppo non sono mai stato capace di ottimizzare il rapporto segnale/rumore al livello che volevo.
> Fino a che punto ti ha inspirato l'architettura del SID nel tuo lavoro sui sintetizzatori Ensoniq?
Il chip SID fu il mio primo lavoro sugli oscillatori ad accumulazione di fase, che sono il cuore di tutti i sistemi wavetable sintetizzati. A causa dei tempi ristretti, gli oscillatori nel SID non furono multiplexati, quindi essi occuparono molto spazio disponibile nel chip e riducendo di conseguenza il numero delle voci inseribili in un chip. Tutti i chip sonori Ensoniq usano un oscillatore multiplexato che permette l'utilizzo di almeno 32 voci per chip. Una piccola parte del SID si può trovare nel design dei nostri prodotti come ad esempio nella Mountain Computer sound card per l'Apple II (le basi del sistema Alpha Syntauri). Il chip DOC I usato in Mirage e ESQ-1fu modellato su questa scheda sonora. I nostri attuali design sono nuovi e si basano solamente sulla nostra immaginazione.
> Quanto pensi che sia stato grande l'impatto del SID nell'industria dei sintetizzatori?
Non penso che abbia avuto un grande impatto. Quando ero alla Commodore ricordo che la Sequential Circuits era interessata all'acquisto del chip, ma poi non se ne fece più nulla. La mia intenzione (quando ancora la MOS Technology era indipendente e quindi poteva immettere nel mercato i chip prodotti) era quella di vendere i chip SID ai produttori di sintetizzatori. L'intera produzione di chip fu assorbita dai Commodore 64 mano a mano che i chip erano disponibili.
> Che cosa avresti cambiato nel design del SID se avessi avuto un maggior budget dalla Commodore?
Il problema non fu il budget, ma il tempo di sviluppo e le dimensioni ristrette del chip. Le fasi di design/prototipo/debug/produzione del chip SID, del chip VIC-II e Commodore 64 furono incredibilmente brevi (se non impossibili) -- facemmo il tutto velocemente come la Commodore non aveva mai fatto prima e come sicuramente non riuscì più a ripetere! Se avessi avuto più tempo, avrei sviluppato un appropriato op-amp MOS che avrebbe eliminato il segnale di perdita che si sente quando il volume della voce è a zero. Questo porta ad un pessimo rapporto segnale rumore che comunque poteva essere attenuato stoppando l'oscillatore. Avrei anche voluto migliorare le performance dei filtri, specialmente per ottenere un'alta risonanza. Originariamente avevo anche pensato di aggiungere una tavola esponenziale di look-up per provvedere ad una diretta translazione della scala equal-tempered, ma impiegava troppo silicone ed inoltre poteva essere fatta anche via software.
> Il SID fu molto complesso per i suoi tempi. Perchè non avevate usato un design più semplice?
Penso che i chip presenti nel mercato (inclusi quelli dei computers Atari) erano troppo primitivi e sicuramente furono disegnati da persone che non sapevano niente di musica. Come detto prima, io volevo creare un chip sintetizzatore da usare a livello professionale.
> Possiedi ancora un C64 (o qualcosa con il SID) ?
Certamente, ne ho un paio (compreso il portatile), ma onestamente non li ho riaccesi da anni...
> La commodore non ha mai pensato di creare una versione migliorata del SID?
Non lo so. Dopo che me ne andai non penso che ci fosse qualcun altro abbastanza competente da migliorare il SID. Volevo migliorarlo io stesso prima che fosse rilasciato, ma non credo che avesse fatto la differenza nel successo del C64.
> Puoi descriverci velocemente l'architettura interna?
E' molto brutale, poichè non ho avuto il tempo per renderla elegante. Ogni voce è composta da un oscillatore, un generatore di forme d'onda ed un selettore, un convertitore D/A per forma d'onda, un convertitore multiplying D/A per il controllo dell'ampiezza ed un generatore di inviluppo per la modulazione. L'uscita analogica di ogni voce può essere inviata attraverso un filtro analogico multimode o bypassare il filtro ed il convertitore D/A multiplying finale, provvedendo alla regolazione manuale del volume.
Voglio ricordare che l'oscillatore è un 24 bit a fase di accumulazione dove i 16 bit bassi sono programmabili per il controllo pitch. L'uscita dell'accumulatore va direttamente al convertitore D/A attraverso un selettore di forme d'onda. Normalmente l'uscita di un oscillatore ad accumulazione di fase dovrebbe essere usata come un indirizzo in memoria contenuto in una wavetable, ma il SID doveva essere completamente in un unico chip e quindi non c'era posto per una wavetable.
La forma d'onda a dente di sega è creata inviando i 12 bits alti dell'accumulatore al 12-bit waveform D/A.
La forma d'onda triangolare è creata usando un MSB dell'accumulatore per invertire i rimanenti 11 bits superiori dell'accumulatore usando porte EXOR. Questi 11 bits vengono quindi shiftati a sinistra (fuori l'MSB) ed inviati al waveform D/A (così che la risoluzione della forma d'onda triangolare sia la metà di quella della dente di sega, ma con la stessa ampiezza e frequenza).
La forma d'onda rettangolare (pulse) è creata inviando i 12 bits superiori dell'accumulatore ad un comparatore digitale a 12 bit. L'uscita del comparatore può essere a 0 o a 1. Questo singolo output viene infine inviato a tutti i 12 bits del waveform D/A.
La forma d'onda rumore è creata usando un generatore di pseudo-sequenza casuale (uno shift register con output specifico che rientra in ingresso con apposita logica combinata). Lo shift register è cloccato da uno dei bit intermedi dell'accumulatore in modo da mantenere il contenuto della frequenza della forma d'onda rumore relativamente lo stesso delle forme d'onda pitch. I 12 bits superiori dello shift register vengono poi inviati al waveform D/A.
Da quando tutto delle forme d'onda è in bits digitali, il selettore di forma d'onda è composto da multiplexer che selezionano quale forma d'onda in bits debba essere inviata al Waveform D/A. I multiplexer sono singoli transistors e non sono provvisti di "lock-out", permettendo la selezione di combinazioni di forme d'onda. La combinazione è un AND logico dei bits di ogni forma d'onda, che produce risultati imprevedibili, così io non incoraggiai questo, specialmente fino a quando poteva "lock-up" il generatore di pseudo sequenza casuale riempiendola di zero.
L'uscita del Waveform D/A (che da questo punto è in formato analogico) entra nell'ingresso di riferimento di un 8-bit multiplying D/A, creando un DCA (amplificatore digitalmente controllato). La parola di controllo digitale che modula l'ampiezza della forma d'onda proviene dal generatore di inviluppo.
Il generatore di inviluppo è semplicemente un contatore a 8 bit up/down che, quando "triggerato" dal bit di Gate, conta da 0 a 255 alla velocità di Attack, da 255 al valore di Sustain e al valore di decay, rimanendo al valore di Sustain fino a quando il bit di Gate non viene azzerato quindi il conteggio in basso riparte dal valore di Sustain a 0 alla velocità di Release.
Un divisore di frequenza programmabile è usato per impostare le varie velocità (sfortunatamente non ricordo quanti bits ha il divisore, se 12 o 16). Una piccola tabella di "look-up" converte i 16 valori del registro programmabile nell'appropriato numero da caricare nel divisore di frequenza. In dipendenza dallo stato del generatore di inviluppo (ADS o R), l'appropriato registro viene selezionato e il numero viene translato e caricato nel divisore. Ovviamente sarebbe stato meglio avere un individuale bit di controllo del divisore che avrebbe portato una migliore risoluzione per ogni velocità, comunque non c'era abbastanza spazio per aggiungere altri bits di registro. Usando questo sistema, sono stato capace di riempire un'ampia gamma di velocità in 4 bits, permettendo all'ADSR di essere definito in due bytes invece di 8. Gli attuali numeri nella tabella di "look-up" sono arrivati soggettivamente impostando dei tipici patches in una Sequential Circuits Pro-1 e misurando i tempi di inviluppo ad orecchio (ecco perchè le velocità disponibili sembrano strane)!
In modo da avere più vicini modelli di decadimento esponenziale dei suoni, an'altra tabella di "look-up" all'uscita del generatore di inviluppo dovrebbe dividere sequenzialmente il clock del generatore stesso per due ad uno specifico valore di conteggio nei cicli di Decay e Release. Questo crea un pezzo-saggio di approssimazione lineare di un esponenziale. Sono particolarmente felice di come lavora bene, considerando la semplicità del circuito. L'Attack, comunque, è lineare, ma suona bene.
Un comparatore digitale viene usato per la funzione di Sustain. I 4 bits superiori del contatore up/down vengono comparati con il valore di Sustain programmato e stoppano il clock del generatore di inviluppo quando il contatore conteggia in down fino al valore di Sustain. Questo crea 16 livelli spaziali-lineari di sustain senza passare per la transcodifica dalla tabella di "look-up" tra il valore a 4 bit del registro e l'output a 8 bit del generatore di inviluppo. Questo significa anche che i livelli di sustain sono regolabili in passi da 16. Di nuovo, un numero maggiore di bits avrebbe comportato una maggiore risoluzione.
Quando il bit di gate viene azzerato, il clock viene riabilitato, permettendo al contatore di contare fino a 0. Come in un generatore di inviluppo analogico, il generatore di inviluppo del SID traccia il livello di Sustain se cambia in un valore più basso durante la porzione di Sustain dell'inviluppo, comunque, il contatore non conterà in alto se il livello di Sustain è impostato più alto.
L'uscita a 8 bit del generatore di inviluppo viene inviata al Multiplying D/A converter per modulare l'ampiezza dell'oscillatore di forma d'onda selezionata (per essere più tecnicamente accurati, la forma d'onda modula l'uscita del generatore di inviluppo, ma il risultato è lo stesso).
L'Hard Sync viene portato a termine azzerando l'accumulatore di un oscillatore basato sull'accumulatore MSB dell'oscillatore precedente.
La modulazione ad anello viene portata a termine sostituendo l'accumulatore MSB di un oscillatore nella funzione EXOR del generatore di forma d'onda triangolare con l'accumulatore MSB dell'oscillatore precedente; ecco perchè deve essere impostata la forma d'onda triangolare per poter usare la modulazione ad anello.
Il filtro è un classico multi-mode (a stato variabile) VCF design. Non c'è sistema per creare un amplificatore a transconduttanza variabile nel nostro processo NMOS, così ho semplicemente usato dei FET come voltage-controlled resistors per controllare la frequenza di cutoff. Un convertitore D/A a 11 bit genera il voltaggio di controllo per i FETs (in realtà è un 12 bit D/A, ma il LSB non ha effetti udibili e quindi l'ho disconnesso!).
La risonanza del filtro è controllata da un 4 bit weighted resistor ladder. Ogni bit abilita uno dei weighted resistors e permette ad una parte dell'output di effettuare un feed-back all'ingresso. Il state-variable design provvede uscite passa-basso simultanei, passa-banda e passa-alto. Degli switches analogici selezionano quale combinazione di uscite debbano essere inviate all'amplificazione finale (un filtro notch è creato abilitando contemporaneamente l'uscita passa-alto e passa-basso).
Il filtro è la peggior parte del SID perchè non ho potuto creare degli amplificatori operazionali high-gain in NMOS, che sono essenziali per un filtro a risonanza. In aggiunta, la resistenza dei FETs varia considerabilmente con il processo, quindi differenti lotti dei chip SID hanno differenti caratteristiche della frequenza di cutoff. Sapevo che non avrebbe lavorato al meglio, ma tutto questo è meglio di niente ed inoltre non avevo tempo per migliorare il tutto.
I switches analogici sono anche usati per guidare l'uscita di un oscillatore attraverso ad intorno il filtro fino all'amplificatore finale. L'amplificatore finale è un 4-bit multiplying D/A converter che permette al volume del segnale d'uscita di essere controllato. Con l'arresto di un oscillatore, è possibile applicare un voltaggio continuo a questo D/A. L'audio può quindi essere creato quando il microprocessore scrive nel registro di volume finale in real-time. I programmi di giochi spesso usano questo metodo per sintetizzare la voce oppure per eseguire suoni campionati.
Un segnale audio esterno in ingresso può essere mixato all'amplificatore finale o processato attraverso il filtro.
I registri di modulazione probabilmente non sono stati mai usati fino a quando potevano essere facilmente simulati in software senza impostare una voce. Questo serve ai novelli programmatori per creare vibrato o filter sweeps senza dover scrivere molto codice (basta leggere il valore dal registro di modulazione e scriverso sul registro frequenza). Questi registri permettono al microprocessore di accedere agli 8 bits superiori del valore istantaneo della forma d'onda e dell'inviluppo della voce 3. Fino a quando probabilmente non vuoi sentire la sorgente di modulazione nell'uscita audio, uno switch analogico provvede a spegnere l'uscita audio della voce 3.
> Altri aneddoti interessanti?
Una cosa divertente che mi ricordo è quando avevo messo le mani su in intero gruppo di videogames per C64 scritti in Giappone. I giapponesi sono ossessivi sulle specifiche tecniche sul codice che avevano scritto in accordo con le specifiche del SID (che io avevo scritto prima ancora che esistesse un prototipo del SID). Niente da dire, le specifiche non erano accurate. Piuttosto che correggere il loro codice, essi produssero i giochi senza una traccia sonora in uscita ed impostazioni di filtro, ottenendo solo suoni cupi. Così come era stato concepito, non importava che il loro codice era completamente sbagliato, avevano scritto i programmi seguendo correttamente le specifiche, questo era il vero problema!