Faculteit Toegepaste Wetenschappen Vakgroep Elektronica en Informatiesystemen Voorzitter: prof. dr. ir. J. Van Campenhout
Bouwen van een Modulaire Synthesizer op FPGA
door Benoit Catteau en Wouter Rogiest
Promotor: prof. dr. ir. D. Stroobandt Thesisbegeleider: ir. B. Schrauwen
Afstudeerwerk ingediend tot het behalen van de academische graad van burgerlijk elektrotechnisch ingenieur
Academiejaar 2003–2004
Dankwoord We willen iedereen bedanken die ons hielp – misschien zelf onbewust of indirect. Wetend dat we altijd mensen vergeten vermelden we enkelen in het bijzonder. Beginnen we met de vrienden in Rome. Paola, en de familie Statuti-Sterpetti, jullie slaan alle records in gastvrijheid. Filippo, je stond klaar voor ons. Giovanna, je avondmalen zijn onvergetelijk; ook bedankt voor je wegwijs in het italiaans. Marco, Fabrizio, Daniele: jullie waren groots...legendarisch...maar ga...! Irene, Claudio, Luisa, Francisco,... jullie verlichten alle zorgen met jullie vriendschap. Een hartelijke dank gaat uit naar de professionele hulp die we in Rome ontvingen. Professor Uncini stond ons bij in de synthesizerwereld, en maakte altijd tijd voor ons. Professor Balsi en professor Olivieri hielpen ons wegwijs in digitaal ontwerp, en lieten ons de kans onze boodschap te prediken. Professor Rizzi tenslotte leerde ons onszelf te zijn, en dat is zelf in het kader van een thesis belangrijk. Matthias, onze beschermengel, merci – je weet waarom. Tom en Peter, merci voor jullie inbreng in onze virtuele infrastructuur. Ridders, en leden van de cake-club, wij zien mekaar binnenkort! Thomas, merci voor al je betrokkenheid, en de wonderlijke foto’s. Jan en Stijn, merci voor de uitlijning. Moog, Bode en Fourier, jullie deden wel. Sjah, een mens werkt dan een gans jaar aan een thesis en behoort dan ook een dankwoord te schrijven. Het jammere is dat er van zo’n thesisproject enkel de code overblijft, en die vertelt ons niet welke mensen er allemaal hun steentje hebben bijgedragen, zowel bij het schrijven als bij het ondersteunen van de ontwerpers zelf. Toch wens ik, Benoit, speciaal mijn ouders te bedanken die me de kans hebben gegeven om op Erasmus te gaan. En de vele mensen die ons zijn komen opzoeken, zoals de delegatie van JET Symphonic Band (Isabelle, Geert, Nico, Caroline, Julie, Marieke, Steven en Jeroen), Eva en Mieke, die onverwacht ons wat kwamen opvrolijken en natuurlijk ook Thomas en Evelyne met wie we Rome vanuit een ander perspectief hebben bekeken.
i
Ik, Wouter, wil mijn vader, mijn zus en Martine bedanken voor de steun, betrokkenheid en motivering. Zonder jullie stond ik hier niet. Een heel dierbaar iemand verdient mijn dank op alle vlak – naar jou gaat de dedicatie. Vincent, Fr´ed´erick en Koen, merci voor jullie gulle aanwezigheid. Carl was zo vriendelijk ons een jaar lang op zijn infrastructuur te trakteren. Geert, mijn grootouders, VIP Philippe en Marianne, bedankt voor de goede zorgen. Simon, salve. Peter, ook jij, gegroet. Plato, Rorty, Pirsig, Kubrick en Darwin, bedankt. Een speciale dank verdienen de mannen op ELIS. Hendrik en zijn makker Jonas hielpen ons uit de nood met een MIDI keyboard. Harald, Jan en Wim hielpen ons vooruit met VHDL en de chip-programmering. Marc schoot ons op vele manieren te hulp, en wijdde ons ook in in de wereld van de alternatieve klavieren. Philippe bracht vele verhelderende tips aan voor het softwareontwerp, en flateerde ons met zijn betrokkenheid. Tot slot vermelden we onze promotor en begeleider. Professor Stroobandt verdient onze oprechte dank. Hij stond ons toe het ontwerp mee te nemen op Erasmus naar Rome. Hij toonde steeds begrip voor de complicaties die een erasmusverblijf met zich meebrengt, en gaf ons vertrouwen. Benjamin tenslotte, was de man op wie we terecht mochten rekenen. Hij stond ons, ook vanop afstand, bij in het toewerken naar de grote doorbraken. Hij zag niet op tegen de moeite die lange afstanden met zich meebrengen. Tenslotte was hij steeds betrokken in ons wedervaren, en dat van de Fynth. Benoit en Wouter, Rome, juni 2004
ii
Acknowledgements We want to thank everybody who helped us – some of you might not even be aware of doing it. Though aware of the fact that including names will always leave us an incomplete list, we want to thank the below mentioned explicitly. We start with our friends in Rome. Paola, and the whole family Statuti-Sterpetti, you broke all records in hospitality. Filippo, you were there for us. Giovanna, your suppers are unforgettable, a special thanks for the language assistance. Marco, Fabrizio, Daniele: you were great...heroic... but go...! Irene, Claudio, Luisa, Francisco,... you turned Rome into a second home for us. Some grateful words go out to the professional help we received in Rome. Professor Uncini assisted us in the world of synthesizers, en always made the time to listen to us. Professor Balsi and professor Olivieri helped us in digital design, and gave us the opportunity to tell Italy of our project. Professor Rizzi thought us to be ourselves, and that is, even for a thesis, an important thing. Matthias, our guardian angel – you know why – thanks. Tom and Peter, thank you for your aid in virtual tools. Knights, and all members of the Cake Society, we meet again! Thomas, thanks for all your involvement, and the marvellous pics. Jan and Stijn, thanks for the lay-out. Moog, Bode en Fourier, you did well. When one is working on a thesis for a whole year, at the end he’s expected to write down some acknowledgements. Since the result of such a thesis is a huge amount of code, it cannot tell who has helped us, when writing the code and when we needed some support. So I, Benoit, wish to thank my parents, who gave me the chance to do a year of erasmus in Rome. Also those who came to visit us, the delegation of JET Symphonic Band (Isabelle, Geert, Nico, Caroline, Julie, Marieke, Steven en Jeroen), Eva and Mieke, who came to cheer us up unexpectedly and of course Thomas and Evelyne with whom we look at Rome through the viewfinder. I, Wouter, want tho thank my father, my sister and Martine for their support, involvement and motivating words. If it wasn’t for you, I wouldn’t be here. A very iii
precious someone deserves my gratitude in every way – the dedication is to you. Vincent, Fr´ed´erick and Koen, thanks for your cheerful presence. Carl showed his kindness by lending us his accommodation for a year. Geert, my grandparents, VIP Philippe and Marianne, thanks for your warm support. Simon, salve. Peter, you too, salve. Plato, Rorty, Pirsig, Kubrick and Darwin, thanks. A special thanks for the boys at ELIS. Hendrik and his friend Jonas helped us with a MIDI keyboard. Harald, Jan and Wim explained us VHDL and chip programming. Marc was a help to us in many ways, and introduced us to alternative keyboards. Philippe helped us with the software design, and flattered us with his involvement. Last but not least, we name our promotor and assistant. Professor Stroobandt deserves our sincere gratitude. He allowed us to take the design all the way to Rome. He showed empathy for all complications, inherent to an Erasmus Project, and gave us his confidence. Benjamin, finally, was always there for us, preparing with us for the break-throughs. He never complained, and was unceasingly involved in our actions, and those of the Fynth. Benoit and Wouter, Rome, june 2004
iv
Ringraziamenti Un ringraziamento sincero a tutte le persone che ci hanno aiutato. Pur sapendo che dimentichiamo sempre qualcuno, ringraziamo qualche persona in particolare. Cominciamo con gli amici di Roma. Paola e tutta la famiglia Statuti-Sterpetti, avete meritatato qualche medaglia (almeno tre) per la vostra ospitalit`a. Filippo, eri sempre l`ı per noi. Giovanna, le tue cene sono indimenticabili, e grazie tanto per l’assistenza per l’italiano. Marco, Fabrizio, Daniele: siete stati grandi...mitici...ma andate ...! Irene, Claudio, Luisa, Francisco,... la vostra amicizia `e pi` u cara dell’ oro. Un ringraziamento speciale per l’aiuto professionale che abbiamo potuto ricevere a Roma va: al professor Uncini, esperto nel mondo dell’ audio digitale, che ha messo a disposizione il suo tempo per aiutarci; professor Balsi e Olivieri ci hanno aiutato con il design digitale, e ci hanno offerto l’opportunit`a di parlarne in publico. Professore Rizzi ci ha insegnato ad essere noi stessi, e questa lezione vale anche nel caso della nostra tesi. Matthias, nostro angelo custode, grazie mille – sai perch`e. Tom e Peter, grazie per l’aiuto con il nostro ambiente virtuale. Cavalieri, e soci dell’ associazione “Cake Club”, ci vediamo! Thomas, grazie per la participazione e le foto meravigliose. Jan e Stijn, grazie per il lay-out. Moog, Bode e Fourier, siete stati bravi. Quando si lavora tutto un anno su una tesi, ci spetta dover fare anche qualche parola di ringraziamento. Perch`e il risultato `e una marea di codice, non `e facile dire chi ci ha aiutato, durante la programmazione, e quando i noi progettisti abbiamo avuto bisogno di sostegno. Allora, io, Benoit, vorrei ringraziare i miei genitori, che mi hanno dato la possibilit`a di andare in Italia per fare l’Erasmus. E anche quelli che sono venuti a visitarci: il gruppo del JET Symphonic Band (Isabelle, Geert, Nico, Caroline, Julie, Marieke, Steven e Jeroen), Eva e Mieke, che sono apparsi e ci hanno fatto ridere, e sicuramente Thomas e Evelyne con i quali abbiamo visto Roma dietro una macchina fotografica.
v
Io, Wouter, vorrei ringraziare mio padre, mia sorella e Martine per il supporto, la participazione e l’aiuto. Senza voi non stavo qua. Una persona carissima merita tutta la mia gratitudine – sei la persona a cui viene dedicato queso lavoro. Vincent, Fr´ed´erick en Koen, grazie per la vostra compagnia divertente. Carl, grazie per averci offerto il tuo materiale per un anno. Geert, i miei nonni, VIP Philippe e Marianne, grazie per tutto. Simon, Salve. Peter, salve anche a te. Plato, Rorty, Pirsig, Kubrick, e Darwin, grazie. Un ringraziamento speciale per quelli che lavorano ad ELIS. Hendrik e Jonas ci hanno aiutato con la tastiera MIDI. Harald, Jan e Wim ci hanno aiutato con VHDL, e la programmazione del chip. Marc ci ha aiutato in tante maniere, e ci ha presentato alle tastiere alternative. Philippe ci ha sostenuto con il design del software, e ha mostrato la sua participazione. Finalmente, vorremmo scrivere del nostro promotor e assistente: professore Stroobandt che ci ha offerto l’opportunit`a di svolgere il nostro progetto in Italia. Ha mostrato sempre la sua condiscendenza in caso di complicazioni, legate al progetto Erasmus. Benjamin `e stata la persona che potevamo disturbare con le nostre domande. Non si `e mai lamentato di tutti i problemi che gli abbiamo causato, legati alla nostra distanza. Lui era sempre l`ı, per aiutarci, e per participare nella costruzione del Fynth. Benoit e Wouter, Roma, guigno 2004
vi
Bouwen van een Modulaire Synthesizer op FPGA door Benoit Catteau en Wouter Rogiest Afstudeerwerk ingediend tot het behalen van de graad van burgerlijk elektrotechnisch ingenieur Academiejaar 2003–2004 Universiteit Gent Faculteit Toegepaste Wetenschappen Vakgroep Elektronica en Informatiesystemen Voorzitter: prof. dr. ir. J. Van Campenhout Promotor: prof. dr. ir. D. Stroobandt Thesisbegeleider: ir. B. Schrauwen
Samenvatting Modulaire synthesizers bestaan al sinds jaar en dag in de wereld van analoge elektronica. Robert Moog1 legde de grondslagen in 1965 vast met een door hem bedacht prototype, in [3]. Het concept was vernieuwend: scheid signaalbronnen, signaalverwerkers en signaalversterkers in afzonderlijke modules, voorzie ze elk van in- en uitgangen op hun frontpaneel, en verbind ze extern met kabels. Deze geboorte bleek direct levensvatbaar, omdat het de muzikant een quasi onbeperkte vrijheid levert in het cre¨eren van nieuwe klanken, en imiteren van bestaande instrumenten. Vandaag zijn modulaire synthesizers onverminderd een “hot topic” in de audiowereld, en genieten blijvende aandacht van kenners in de elektronische muziekwereld. Zo groot de aandacht, zo talrijk de variaties. Modulaire synthesizers zagen in de meest kleurrijke formaten en vormen het daglicht. Analoog ging het verhaal van enkele luttele modules, over grote expansie van het gamma aan modules, naar miniaturisatie. In de digitale wereld werd er zowel in hardware en software ontworpen in het kader van marktgerichte, goed verkopende producten. Het voorliggende ontwerp gaat verder. Het implementeert de modulaire synth op ´e´en FPGA chip. Het kind draagt de naam Fynth. Het is een 8 noten polyfone synthesizer met stereo uitgang en bemonsteringsfrequentie 32 kHz. Het bedient zich van woordenschat uit de analoge synth-wereld, en is tegelijk gestoeld op elementaire principes uit de wereld van digitale systemen: Moore machines, busprotocols, time 1
uitspraak: zoals de lange ’o’ in het engelse vogue
vii
scheduling,... Het is baanbrekend in zijn miniaturisatie, en biedt een sterke flexibiliteit. Een muzikant zonder voorkennis in hardware-ontwerp wordt de mogelijkheid geboden de modulaire synthesizer via software te herprogrammeren en te bespelen. Een hardware-ontwerper grijpt zijn kans om de synth volstrekt naar zijn wens te kneden, en kiest zelf welke modules hij in hardware aanwezig wil zien. Trefwoorden: synth, digitale audio, ELIS, FPGA
viii
Building of a Modular Synthesizer on FPGA by Benoit Catteau and Wouter Rogiest Final Project to obtain the title of Elektotechnical Engineer Academic Year 2003–2004 University of Ghent Faculty of Applied Science Department of Electronics and Information Systems Head: prof. dr. ir. J. Van Campenhout Promotor: prof. dr. ir. D. Stroobandt Assistant: ir. B. Schrauwen
Abstract Modular synthesizers exist for decennia in the world of analog electronics. Robert Moog2 defined the principles in 1965, with a prototype from his own hand, in [3]. The concept was new: separate signal sources, signal elaborators, give each of them an input and output on the front panel, en connect externally, using cables. This birth soon proved to be vital, giving the musician access to almost unlimited freedom to create new sounds, and simulate existing instruments. Up to now, modular synthesizers remain a hot topic in audio land, and have the continuing attention of experts in the world of electronic music. As big the attention, so big is the number of variations. In the past decennia, modular synthesizers were created in the most colourful formats. Analog synthesizers started out from having only few modules, arriving at a large number, each having smaller size. Digital synths were developed in both hardware and software, attaining success as commercial products. The presented design takes synthesizers further. It implements a modular synthesizer on a single FPGA chip, and is called Fynth. It is an eight note polyphonous synthesizer, with stereo output, and a sampling rate of 32 kHz. It uses vocabulary of the analogue world of synths, yet is simultaneously build upon elementary principles of digital design: Moore Machines, bus protocols, time scheduling. As a new design, it is a leap forward in its small scale and its flexibility. A musician without knowledge of hardware design is able to control an play the synth, 2
pronunciation: as the long ’o’ in vogue
ix
using software written for that purpose. A hardware designer feels himself lucky, discovering a synth that can be tuned according to his personal wishes. He himself chooses which modules he wants to include in hardware. Keywords: synth, digital audio, ELIS, FPGA
x
Costruzione di un Sintetizzatore Modulare su FPGA da Benoit Catteau e Wouter Rogiest Tesi di Laurea Specialistica per ottenere il titolo di Ingegneria Elettronica Anno Academico 2003–2004 Universit`a di Gent Facolt`a di Scienze Applicate Dipartimento di Elettronica e Sistemi di Informazione Presidente: prof. dr. ir. J. Van Campenhout Promotor: prof. dr. ir. D. Stroobandt Assistente: ir. B. Schrauwen
Riassunto I sintetizzatori modulari esistono da quattro decenni nel dominio dell’elettronica analogica. All’epoca, Robert Moog3 introduceva gli elementi con un prototipo di 1965. Il concetto era tutto nuovo: fare la separazione tra sorgenti, elaboratori e amplificatori dei segnali, e costruire blocchi separati, con un ingresso e uscita sul front, e legati tra loro con dei cavi. Questo ha mostrato un gran successo. Il musicista aveva la libert`a di creare nuovi suoni, e poteva simulare gli strumenti classici. Ora, sintetizzatori modulari rimangono un “hot topic” nel dominio di musica elettronica. Le variazioni sono numerosissime. Nel mondo analogico, la storia comminciava con qualche blocco e continuava con la creazione di un modulario pi` u diverso, ognuno miniaturizzato. Nel dominio digitale, prodotti ben diversi, sia hardware che software, sono stati costruiti. Questo progetto implementa un sintetizzatore modulare su FPGA. Si chiama Fynth. Ha 8 voci independenti, una uscita di due canali, e una frequenza di campionamento di 32kHz. Per di pi` u, si basa su tutti gli elementi di una sistema digitale: Macchina di Moore, protocolli, divizione del tempo,... Offre un strumento ancora pi` u miniaturizzato, e una flessibilit`a profonda. Un musicista `e capace di suonarlo e programmarlo con il software. Il progettista hardware invece `e capace di cambiare la struttura stessa, grazie alle propriet`a di riconfigurazione. 3
pronuncia: come ’o’ nella parola inglese vogue
xi
Keywords: sintetizzatore, audio digitale, FPGA
xii
Aan Reinilde & Liesbeth
Inhoudsopgave 1 Inleiding
1
1.1
Probleemstelling
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
Invalshoek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.3
Overzicht van dit document . . . . . . . . . . . . . . . . . . . . . . .
2
2 Synthesizers en Audio 2.1
5
Synthesizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.1.1
Muzieksynthese . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.1.2
Modulaire Synthesizers . . . . . . . . . . . . . . . . . . . . . . 13
2.2
MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3
Digitale Synthesizers . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3.1
Criteria voor Digitale Geluidskwaliteit . . . . . . . . . . . . . 19
2.3.2
Digitale audio en Vaste Komma . . . . . . . . . . . . . . . . . 26
3 FPGA
31
3.1
Een Herprogrammeerbare Chip . . . . . . . . . . . . . . . . . . . . . 31
3.2
Het Aanbod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3
3.2.1
In & Uit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.2
Geheugens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.3
DSP’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2.4
PLL’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2.5
LAB’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Samenspel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
i
4 De Fynth 4.1
4.2
4.3
4.4
41
Verdeel en Heers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.1.1
Een Instrument . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.1.2
Een Multiprocessor . . . . . . . . . . . . . . . . . . . . . . . . 43
4.1.3
In en Uit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1.4
Tussenin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1.5
Klokken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.1.6
Time Scheduling . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.7
Integratie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.1.8
Parti¨ele Herconfiguratie . . . . . . . . . . . . . . . . . . . . . 57
The Big Picture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.2.1
De Opstelling . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.2.2
Van Keyboard tot Boxen . . . . . . . . . . . . . . . . . . . . . 59
4.2.3
De Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Look Closer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.3.1
Geluidssignalen en controlesignalen . . . . . . . . . . . . . . . 61
4.3.2
Enkele verbreide Operaties . . . . . . . . . . . . . . . . . . . . 63
4.3.3
Een Verbreid Proces – Noise Generator . . . . . . . . . . . . . 65
De Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.4.1
Chronos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.4.2
Deltasigma . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.4.3
Een Algemene Muziekmodule . . . . . . . . . . . . . . . . . . 68
4.4.4
Sencoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.4.5
De Square . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.4.6
Sawtooth, Triangle, Sine en Noise . . . . . . . . . . . . . . . . 81
4.4.7
ADSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.4.8
Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.4.9
Delay Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.4.10 Middleman . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.4.11 Mixer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 4.5
Protocols 4.5.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Patch Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . 98 ii
4.6
4.5.2
Demo Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . 99
4.5.3
PCI Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.5.4
Serieel Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.5.5
Parallel Protocol . . . . . . . . . . . . . . . . . . . . . . . . . 103
De Persing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5 Extensies & Conclusie 5.1
Stand Van Zaken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 5.1.1
5.2
5.3
107
Versie 1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Toekomstmuziek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 5.2.1
Partieel Herconfigureren . . . . . . . . . . . . . . . . . . . . . 110
5.2.2
MIDI Rechtoe Rechtaan . . . . . . . . . . . . . . . . . . . . . 111
5.2.3
Op een Xilinx chip... . . . . . . . . . . . . . . . . . . . . . . . 111
5.2.4
Verdere Alternatieven . . . . . . . . . . . . . . . . . . . . . . 112
Besluit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 5.3.1
Strategie¨en . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
5.3.2
Nooit Rond . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
A Fynth - The Specs A.1 Technical Information
115 . . . . . . . . . . . . . . . . . . . . . . . . . . 115
A.2 MIDI Implementation Chart . . . . . . . . . . . . . . . . . . . . . . . 115 B Integraal schema van de Fynth
116
C Quartus Report
118
C.1 De resultaten: algemeen . . . . . . . . . . . . . . . . . . . . . . . . . 118 C.2 De resultaten: timing . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 C.3 Het grondplan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 D Geheugenindeling
121
D.1 Square . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 D.1.1 Implementation Section . . . . . . . . . . . . . . . . . . . . . 121 D.1.2 Note Section . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 D.2 ADSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 iii
D.2.1 Implementation Section . . . . . . . . . . . . . . . . . . . . . 122 D.2.2 Note section . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 D.3 Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 D.3.1 first order memory block . . . . . . . . . . . . . . . . . . . . . 124 D.3.2 second order memory block . . . . . . . . . . . . . . . . . . . 125 D.4 Delay Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 D.4.1 Implementation section . . . . . . . . . . . . . . . . . . . . . . 126 D.4.2 Note section . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 D.5 Middleman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 D.5.1 Implementation section . . . . . . . . . . . . . . . . . . . . . . 127 D.5.2 Note section . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 E Overzicht van de bijgeleverde digitale documentatie
130
Bibliografie
131
iv
Lijst van figuren 2.1
De Moog-synthesizer . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.2
Een wavetable instrument dat gebruikt maakt van 4 wavetables. Elke omhullende rechts komt overeen met een wavetable links . . . . . . .
8
Een elliptische baan en het resulterende signaal. De bovenste figuur toont een bovenaanzicht van het oppervlak dat voldoet aan de vergelijking wave(x, y) = (x − y) × (x + 1) × (y − 1) × (y + 1) . . . . . . . .
9
2.3
2.4
Tijdsvari¨erende additieve synthese: aparte frequentie en amplitudeomhullenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5
boven: een vereenvoudigd zicht op een zoemgeluid met een aantal harmonischen met gelijke bijdrage. onder: na de substractieve synthese is dit spectrum gecre¨eerd met vier pieken . . . . . . . . . . . . . . . . 11
2.6
Frequentiemodulatie . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.7
Het spectrum van ´e´en teruggekoppelde oscillator dat varieert naarmate β toeneemt, met x = 200 Hz. De horizontale as heeft een bereik van 0 tot 10 kHz. De verticale as gaat van 0 tot 60 dB. . . . . . . . . 12
2.8
Modellen van trillende oppervlakken en volumes aan de hand van het massa-veer model. (a) een trillend oppervlak, (b) een model van een trom met een circulaire ordening van de massa’s en veren en (c) een trillend volume kan gemodelleerd worden door een traliewerk van massa’s verbonden met veren aan de zes zijden . . . . . . . . . . . . . 13
2.9
De MiniMoog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.10 De verschillende oscillatoren . . . . . . . . . . . . . . . . . . . . . . . 15 2.11 De frequentiekarakteristiek van het Moogfilter . . . . . . . . . . . . . 15 2.12 Een ADSR volume-omhullende, met zijn vier fases A,D,S en R. . . . 16 2.13 Een DSP-chip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.14 Frequentierepresentaties . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.15 Enkele en dubbele precisie van vaste komma . . . . . . . . . . . . . . 26
v
2.16 Statistiek van de inkomende informatie, onder het niveau van de kwantisatiestap q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.17 Conversie van een analoog signaal naar een 4 bits vaste komma digitaal signaal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.18 Dezelfde conversie maar door de ruis zijn de overgangen niet te voorspellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.19 De ladder- en de tralie-implementatie van digitale filters
. . . . . . . 29
3.1
Het bordje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2
Schematisch overzicht van de chip . . . . . . . . . . . . . . . . . . . . 33
3.3
Zicht op het binnenste van de chip . . . . . . . . . . . . . . . . . . . 34
3.4
Een pll schematisch weergegeven . . . . . . . . . . . . . . . . . . . . . 36
3.5
Een zicht op de architectuur van een logic element . . . . . . . . . . . 37
4.1
Een eenvoudig schema van de Fynth . . . . . . . . . . . . . . . . . . . 42
4.2
Conceptuele voorstelling van een eenvoudige patch
4.3
Hardware-voorstelling van de eenvoudige patch
4.4
conceptuele voorstelling van de eenvoudige patch
4.5
Schema van de door chronos uitgedeelde busenables
4.6
De acht mogelijke overgangen van regel 30 . . . . . . . . . . . . . . . 65
4.7
De evolutie van regel 30 in de tijd . . . . . . . . . . . . . . . . . . . . 65
4.8
Schema van de deltasigma modulator . . . . . . . . . . . . . . . . . . 67
4.9
Voorbeeld van de deltasigma modulatie van de waarde -1/4
. . . . . . . . . . 49
. . . . . . . . . . . . 55 . . . . . . . . . . . 56 . . . . . . . . . 57
. . . . . 68
4.10 Algemene Opbouw van een Muziek-Module . . . . . . . . . . . . . . . 69 4.11 Conceptueel Schema van de Note Handling . . . . . . . . . . . . . . . 76 4.12 C code voor een Moog VCF . . . . . . . . . . . . . . . . . . . . . . . 85 4.13 Blokschema van het filter . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.14 Regalia Mitra Filter, en de klassieke implementatie van de All-Pass Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.15 Tralie-implementatie van eerste en tweede orde . . . . . . . . . . . . . 87 4.16 Simulatie van de overdrachtsfunctie van de module filter. . . . . . . . 88 4.17 Delay line in zijn werking als “panning only” (p.o.), en als “delay depth delay line” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 4.18 Delay line in zijn werking als “echo delay line” vi
. . . . . . . . . . . . 91
4.19 Schema van de mixer . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.20 Smart step down . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 B.1 Algemeen overzicht van de verschillende modules. . . . . . . . . . . . 117 C.1 Het grondplan van de FPGA-chip. Onderaan (roze) zijn een aantal LogicLock -regio’s te zien voor de PCI interface. In het blauw ziet men waar de sinus-generator zich situeert op de chip. . . . . . . . . . . . 120
vii
Lijst van tabellen 4.1
Opsomming van de modules, en hun aantal implementaties . . . . . . . . . . .
54
4.2
Overzicht van de door controlesignalen gemoduleerde parameter, per module
4.3
Operaties van de sencoder
4.4
Operaties van de oscillatoren, met hun digitale codering in het serieel protocol.
4.5
Operaties van de ADSR, met hun digitale codering in het serieel protocol.
4.6
Operaties van het filter, met hun digitale codering in het serieel protocol. . . . .
89
4.7
Operaties van de delay line, met hun digitale codering in het serieel protocol. . .
92
4.8
Operaties van de Middleman, met hun digitale codering in het serieel protocol.
4.9
Operaties van de Mixer, met hun digitale codering in het serieel protocol.
. . 63
. . . . . . . . . . . . . . . . . . . . . . . . . . 74 . 80
. . . 83
. 94
. . . 97
4.10 Standaard opbouw van een boodschap in Fynth patch protocol. . . . . . . . . . 98 4.11 Benaming onder woorden van de verschillende modules, en hun benaming in het Patch protocol en het PCI protocol . . . . . . . . . . . . . . . . . . . . . . 99 4.12 Benaming onder woorden van de verschillende commando’s, hun benaming in het patch protocol, en hun codering in het PCI protocol . . . . . . . . . . . . . . 100 4.13 Standaard opbouw van een boodschap in Fynth demo protocol. . . . . . . . . . 101 4.14 Standaard opbouw van een boodschap in zowel Fynth PCI protocol als Fynth serieel protocol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 4.15 Module-adressen op seri¨ele en parallelle bus, in decimale notatie . . . . . . . . 102 4.16 Standaard opbouw van een boodschap in Fynth parallel protocol. . . . . . . . . 104 c Flow Summary . . . . . . . . . . . . . . . . . . . . . . . 118 C.1 De Quartus II
C.2 Het Timing analyser rapport . . . . . . . . . . . . . . . . . . . . . . . . . 119
viii
Hoofdstuk 1 Inleiding 1.1
Probleemstelling
Het doel van deze thesis is de bouw van een modulaire synthesizer in FPGA. Belangrijk hierin is het modulaire concept: het zorgvuldig isoleren van verschillende modules, tot in de hardware. De muzikale vereisten zijn meerstemmigheid, en volledige patch-herconfigureerbaarheid.
1.2
Invalshoek “Hardwareontwerp is zoals smijten met een boomerang: hoe meer ervaring je hebt, hoe minder hij tegen je kop knalt.” Benoit Catteau
Hardwareontwerp is zweten. Hardwareontwerp is vallen en opstaan. Hardwareontwerp is al doende leren. Hardware is een kick, na doormaken van het voorgaande. Hardware dwingt je tot beslissingen – de goeie vlijen zich neer in je ontwerp, de slechte krijg je vroeg of laat naar je hoofd geslingerd. Dit document is met verschillende doeleinden geschreven. • Uiteenzetten wat er bestaat aan synthesizers en FPGA’s, om te tonen hoe dit werk zich verhoudt tot beide. • De lezer vertellen hoe hij de Fynth, resultaat van de thesis, kan hanteren. • De opbouw van de hardware uitvoerig belichten, in de hoop dat een mogelijke opvolger-ontwerper er mee gediend is. 1
• Tonen waar de onwerpers hindernissen ontmoeten, en op welke manier ze een uitdaging vormden op gebied van creativiteit, analytisch denken, geduld en werkzaamheid. Dit document tracht leesbaar te zijn voor iedereen. Evenwel is het een illusie te beweren dat het geen voorkennis van de lezer onderstelt. In het bijzonder wordt van de lezer verwacht dat hij reeds noties heeft van digitale representaties (signalen, data, boodschappen), digitale systemen, en, specifieker, met hardware ontwerp op FPGA met behulp van VHDL. Niettemin trachten hoofdstuk 2 en 3 een tegemoetkoming te zijn. Verder willen de auteurs benadrukken dat dit document geen beeld van het werk zelf geeft. Het schept een beeld van het resultaat, en houdt voor de helderheid van het betoog de chronologie van het ontwerpproces op de achtergrond. Dikwijls scheen het de ontwerpers toe dat verbeten uitproberen de beste weg is, en dat slechts achteraf de ware verklaring van het resultaat op de proppen komt. Dit document tracht zo vaak mogelijk wetenschappelijk te zijn in zijn benadering, maar het devies blijft: uit de techniek komt de wetenschap voort, niet noodzakelijk omgekeerd.
1.3
Overzicht van dit document
Hoofdstuk 2 valt in twee secties uiteen. De eerste sectie gaat in op een jong instrument in de muziekwereld, wiens implementatie het doel is van dit project: de synthesizer. Er wordt een beknopt overzicht gegeven van de verschillende types bestaande synthesizers. De lezer wordt ingewijd in elementaire begrippen rond synthesizers, en de verschillende vormen van muzieksynthese. Vervolgens wordt toegespitst op ´e´en welbepaald type synth, de modulaire synthesizer. Elementaire opbouw en mogelijke varianten worden kort besproken. Een volgende sectie geeft een ruwe schets van de werking van de MIDI-standaard, en duidt de rol aan van dit protocol in het kader van dit project. De derde sectie behandelt digitaal audio ontwerp. Verschillende mogelijke implementaties van digitale audio worden in kaart gebracht, en FPGA-ontwerp wordt binnen dit geheel gesitueerd. De determinerende rol van de gehanteerde getalrepresentatie (vaste komma) wordt afgewogen. Een focussering op het correct gebruik van vaste komma vormt het sluitstuk van dit hoofdstuk. Hoofdstuk 3 voert de tweede hoofdrolspeler in ons project ten tonele: de FPGA-chip van ALTERA, samen met talrijke additionele elektronica ge¨ıntegreerd op een Stratix PCI Development Board, een in de PC inschuifbare PCI kaart. Het hoofdstuk vangt aan met een bondige inleiding over FPGA’s, en hoopt het onderwerp toegankelijk te maken voor de leek. Een volgende sectie schetst hoe de chip 2
zich verhoudt tot de andere electronica op het bord, en hoe hun symbiose de gebruiker toestaat om het kaartje op een hoger abstractieniveau te herprogrammeren. De rol van de toolchain, VLSI design en VHDL worden uiteengezet. Ook wordt kort aangegeven met welke programma’s de ontwerpers te werk gingen. De laatste sectie belicht de verschillende protocols en geheugens die de Stratix kaart biedt; ze maakt de brug naar synthesizerontwerp door het nut van de voorhanden zijnde componenten te meten aan de noden van een modulaire synthesizer: in- en uitwegen, gebruikte geheugens, gehanteerde klokken,... worden besproken. Hoofdstuk 4 brengt het kind van dit ontwerpproject ten berde: de Fynth. Aanvattend met een kwalitatief discours, gaat de uitleg, conform een top-down strategie, van grote naar steeds kleinere schaal; van de globale opstelling, tot de bespreking van de procesverdeling binnen ´e´en enkele module. Vooreerst wordt er geschetst hoe de “verdeel-en-heers-strategie” uit de analoge wereld vertaalbaar is naar FPGA-ontwerp. Het verband wordt gelegd tussen gescheiden conceptuele blokken, en hun hardware-projectie. De verschillende protocols (vier in aantal) worden opgesomd en toegelicht. Er wordt ingegaan op het belang van time scheduling, proces-orthogonaliteit en geheugenscheiding. Er wordt een black-box model vooropgesteld van elk blok. Er wordt bepleit hoe uniformisatie van de interne signaalvoorstelling, gekoppeld met fixed time scheduling, de flexibiliteit aanzienlijk ten goede komt. Ook wordt er getoond dat bepaalde integraties (“het samennemen van implementaties”) de autonomie van de afzonderlijke implementaties niet in gedrang brengen, en de hardware veel effici¨enter benutten. Tenslotte wordt aangegeven hoe het black-box model de weg opent naar parti¨ele herconfigureerbaarheid at runtime – een luxe voor de muzikant, die zijn analogon niet (of nauwelijks) kent in de analoge wereld. De volgende sectie toont het project in zijn volledige ontplooiing: hier wordt schematisch weergegeven wat de Fynth zoal nodig heeft om te werken, en wordt van elk onderdeel de taak toegelicht. Ook wordt aangeduid hoe de communicatie verloopt. Een aparte sectie is gewijd aan de opsomming van de protocols, en een grondig overzicht van hun eigenschappen. Aansluitend komt de sectie die de taakverdeling in de Fynth onder de loep neemt. We kijken nu zuiver op niveau van de FPGA-chip, en bestuderen de inhoud en hi¨erarchie. Alle blokken worden aan de lezer voorgesteld, en krijgen een duiding omtrent hun bestaansreden en verantwoordelijkheden. Verder in de fijnstructuur van de Fynth doordringend, analyseert de volgende sectie de interne werking van elk blok afzonderlijk, en geeft van de intern gescheiden processen het nut van hun autonomie weer, en hun eventuele communicatiemechanismen. Een aparte sectie, getiteld “De Persing”, geeft een beeld van de wijzigingen die de ontwerpers doorvoerden in hun poging om misschien wel de meest ondoordringbare kunst in hun ontwerp tot een goed einde te brengen: het inbrengen van de succesvol
3
gesimuleerde code in de hardware. Het slothoofdstuk, hoofdstuk 5, vat aan met een overzicht van al dan niet ge¨ımplementeerde zaken en mogelijke bugs. In een volgende sectie onderzoeken de ontwerpers verschillende scenario’s voor uitbreiding, en schatten hun moeilijkheidsgraad. De conclusie is het slot. In bijlage zitten nog enkele appendices. De appendix “Specs” zet de technische specificaties van de Fynth op een rijtje. Een aparte appendix geeft een integraal structureel grondplan van de Fynth. Een volgende appendix geeft extracten uit het compilatierapport van Quartus, ultieme scheidsrechter in een FPGA-ontwerp. Een andere appendix geeft een beeld van het geheugen-gebruik van de verschillende modulen, en wil toekomstige opvolger-ontwerpers van dienst zijn met details over adreslocaties. De laatste appendix somt op wat de nieuwsgierige lezer kan vinden op de bijgeleverde digitale documentatie.
4
Hoofdstuk 2 Synthesizers en Audio “Music is the art of sounds in the movement of time.” Anonymous
2.1 2.1.1
Synthesizers Muzieksynthese
Instrumentenbouw Van oudsher is de mens gefascineerd door geluid. Instinctief ervaren we lage geluiden eerder als rustgevend en hoge geluiden veeleer als alarmerend. Het spreekt voor zich dat de mens ook zelf geluiden wou produceren en imiteren. Instrumentenbouw begon met simpel houten slagwerk. In de loop van de geschiedenis kwamen gaandeweg meer en meer complexe en gevarieerde instrumenten ter wereld. Instrumentenbouw groeide uit tot een ware kunst; een goed klassiek instrument vervaardigen vergt jaren tot decennia aan ervaring en studie. Voor de bouw van een elektronisch instrument geldt in principe dezelfde regel; gelukkig wordt van de bouwers veel minder technische ervaring gevergd; ze kunnen immers voor veel problemen terugvallen op wetenschappelijke grondslagen, eigen aan de elektrotechniek. Elektronische Muziek De twintigste eeuw was vooral gedreven door het algemeen gebruik van elektriciteit. Zo openden zich op 26 september 1906 de deuren van de“Telharmonic Hall” in New York. Daar konden 900 toehoorders een concert beleven van een nieuw instrument, het Telharmonium van Thaddeus Cahill. Het was de eerste en grootste synthesizer ooit. Als eerste produceerde het tonen van niet-mechanische oorsprong, dergelijke tonen worden tot op vandaag synthetische tonen genoemd. 5
Begin jaren zestig deden de Bell laboratoria baanbrekend onderzoek naar de gloednieuwe transistortechnologie. Voor de analoge wereld betekent dit de opkomst van opamps. Robert Moog maakte hier handig gebruik van, en luidde een nieuw tijdperk in voor de elektronische muziek; hij cre¨eerde de modulaire synthesizer 1 . Het resultaat heet “Moog”, en is te zien in Figuur 2.1. De MiniMoog was klein, robuust, en klonk daarenboven goed. Van bij zijn marktlancering genoot hij een razende populariteit. De MiniMoog werd d`e standaard om nieuwe geluiden te ontdekken, en blijft een niet weg te denken protagonist in de geschiedenis van de modulaire synthesizers.
Figuur 2.1: De Moog-synthesizer
Computers & Muziek Ook in de computerwereld drong muziek door. De Bell Laboratories namen het voortouw in de beginjaren, en lieten hun computers, IBM 704’s, geluiden synthetiseren met om het even welke stemming of golfvorm, inclusief tijdsvari¨erende frequentieen amplitude-omhullenden2 . De gehanteerde programmeertaal heette “Music I”, en bood de gebruiker de mogelijkheid om een driehoeksgolf te genereren met willekeurige frequentie en duur3 . 1
Lees meer over Robert Moog op www.salon.com Protagonist was Max V. Matthews; hij hanteerde de IBM 704 machine. Deze was capabel 36 bit brede woorden te verwerken, had een ingebouwde vlottende komma processor, en had een gehaugencapaciteit van 144 kB. Samen met een 12 bit met vacuumbuizen gebouwde Digitaal-Analoog Convertor was de onderzoeksgroep de enige die door computers gegenereerd geluid kon produceren. 3 De eerste compositie in deze taal, ”In a silver scale”, is een monofone studie, geschreven door psycholoog Newman Guttman op 17 mei 1957. 2
6
In 1958 had de IBM 704 al plaatsgemaakt voor een verbeterde versie, gemaakt uit transistoren: de IBM 7094. Dat gaf meteen de aanleiding tot een verbeterde programmeertaal, “Music II”. Het was toen al mogelijk om 4 onafhankelijke stemmen te gebruiken, evenals zestien in het geheugen opgeslagen golfvormen. In 1958 werd in New York City het eerste concert voor met computermuziek georganiseerd. John Cage was er de moderator van een nabeschouwing. In de jaren zestig volgden de talen elkaar op, in het kielzog van de ontwikkeling van de computertechnologie. Naar al die programma’s wordt nu gerefereerd als “Music N” talen. Vandaag bestaan er enorm veel mogelijkheden. Het kan gaan van een gewone comc puter waarop een programma als Cubase is ge¨ınstalleerd, tot een volledig gespeciac
liseerde blok hardware, zoals de Korg , een legende als het op synthesizers aankomt. Synthese – de filosofie¨ en Om geluid te synthetizeren kan men verschillende paradigma’s hanteren. De voornaamste sommen we hier op. Wavetable Synthese: Deze invalshoek werd gebruikt bij de eerste computermuziek. De werking gaat als volgt. Verschillende relatief eenvoudige golfvormen zijn in het geheugen opgeslagen, of althans een periode ervan. Met die basisvormen kan men dan op twee manieren tewerk gaan. Ofwel gebruikt men de verschillende golfvormen niet tegelijk, maar gaat men geleidelijk van de ene in de andere over naarmate de toon evolueert zoals in Figuur 2.2. Het heeft als voordeel dat bijvoorbeeld voor de aanslag van een piano een aparte golfvorm kan worden gebruikt. De andere manier is een uitbreiding van additieve synthese (zie verder). Hier komen de golfvormen niet na elkaar, maar worden ze gesommeerd. Door die verschillende lagen te gebruiken, bereikt men hybride timbres zoals een saxofoon/fluittoon. Golfgebied Synthese: Een uitbreiding van de wavetablesynthese is golfgebied synthese(Figuur 2.3). Men maakt daarbij opnieuw gebruik van een wavetable, maar dan geen ´e´endimensionale tabel, maar wel tweedimensionale. De waardes van de golfvorm kunnen weergegeven worden in een driedimensionaal oppervlak dat dus afhankelijk is van twee variabelen. Daarna kan men paden bedenken op dat oppervlak, wat resulteert in een bepaalde sequentie van waarden, die opnieuw in een golfvorm resulteren. Bemonstering: Bij “bemonstering” of sampling gebruikt men, net zoals bij wavetablesynthese een golfvorm die in het geheugen is opgeslagen. Maar de golfvorm is hier eigenlijk een echte opname, wat betekent dat het geheugen duizenden cycli bevat. Daardoor zit het hele verloop in frequentie en volume allemaal bevat in dat ene sample en vertoont het geluid dadelijk al een grote rijkdom 7
Figuur 2.2: Een wavetable instrument dat gebruikt maakt van 4 wavetables. Elke omhullende rechts komt overeen met een wavetable links
aan eigenschappen. Men kan de opname dan onveranderd gebruiken voor een montage, maar meestal wordt de mogelijkheid gegeven om te loopen. Dat is een eenvoudige manier om het geluid langer te maken door een stuk er voortdurend uit te herhalen, zonder dat het echt opvalt. Meer gesofisticeerde technieken zijn pitch-shifting en sample-rate conversion without pitch-shifting. Door de eerste techniek wordt het mogelijk om het geluid te hergebruiken, maar op een andere toonhoogte. Dit wordt gerealiseerd door een temporegeling. Wanneer men ook de tweede techniek gebruikt, dan kan men zelfs de oorspronkelijke lengte van het monster behouden, terwijl de toonhoogte toch is veranderd. Additieve Synthese: Additieve synthese is een populaire techniek die gebaseerd 8
Figuur 2.3: Een elliptische baan en het resulterende signaal. De bovenste figuur toont een bovenaanzicht van het oppervlak dat voldoet aan de vergelijking wave(x, y) = (x − y) × (x + 1) × (y − 1) × (y + 1)
is op de fouriergetransformeerde van signalen. Er is immers aangetoond dat elk signaal kan ontbonden worden in een oneindige som van sinussen. Vandaar dat, waneer men over een rijke bron van sinussen zou beschikken, men elk mogelijk denkbaar geluid zou kunnen synthetiseren. Doordat men echter steeds over een eindig aantal oscillatoren beschikt, is men uiteraard beperkt in de praktische verwezenlijking (Figuur 2.4). Dan wordt er teruggegrepen naar technieken als principal component analysis, waarbij enkel de voornaamste frequenties door de sinusbronnen worden gemaakt in de hoop het gewenste geluid daarmee zo goed mogelijk te benaderen. Granulaire Synthese: Bij granulaire synthese is er gedacht aan de golf-deeltjesdualiteit die bestaat bij elektromagnetische verschijnselen zoals licht. Net zoals we licht kunnen voorstellen als een golf of anderzijds als deeltjes (fotonen), kunnen we ook geluid proberen te modelleren als verschijnselen opgebouwd uit elementaire deeltjes. Deze voorstelling is vooral geschikt wanneer we een ingewikkeld geluid willen voorstellen. Dan is de gemakkelijkste manier om dat 9
Figuur 2.4: Tijdsvari¨erende additieve synthese: omhullenden
aparte frequentie en amplitude-
te doen, gebruik maken van geluidsdeeltjes. Die deeltjes zijn van korte duur (1 tot 100 ms) maar lang genoeg zodat de lengte, de frequentie, en de amplitude nog kunnen waargenomen worden. Die representatie houdt het midden tussen de tijdsrepresentatie (zoals bij sampling) en de frequentierepresentatie (zoals bij additieve synthese). Door gebruik te maken van een verzameling basiselementen, kan men ook hier aan de slag om een welbepaald geluid te genereren. Substractieve Synthese: De naam substractieve synthese doet dadelijk denken aan additieve synthese. Het is immers de regelrechte tegenhanger. In plaats van te starten van geluidsbronnen die precies ´e´en frequentie weergeven, start men van oscillatoren die naast een grondtoon, ook een groot gamma aan boventonen genereren. Het komt er dan op neer om het gewenste spectrum aan tonen te extraheren. Daarvoor worden filters gebruikt. Men bekomt een resultaat als in Figuur 2.5. Deze techniek werd voor het eerst toegepast in de vocoder. Dit instrument tracht de menselijke stem te imiteren. Daarvoor legt men een bron aan die bij benadering alle frequentiecomponenten bevatte. Daarna wordt dat geluid door een filterbank gejaagd. Het resultaat was dat men erin slaagde om het spectrum van klinkers goed na te bootsen. Een zingende stem bleek redelijk goed na te bootsen, een spreker daarentegen werd vertaald in iets onverstaanbaars. 10
Figuur 2.5: boven: een vereenvoudigd zicht op een zoemgeluid met een aantal harmonischen met gelijke bijdrage. onder: na de substractieve synthese is dit spectrum gecre¨eerd met vier pieken
Voor synthesizers bleek deze techniek een groot succes, ondermeer dankzij de realiseerbaarheid en de zeer typische rauwe, krachtige klank. Vele van de legendarische klanken uit de popmuziek van de jaren ’80 kwamen tot stand met deze methode.
Figuur 2.6: Frequentiemodulatie
Modulatiesynthese: Ook modulatiesynthese bestaat. 11
Zowel AM (amplitude-
modulatie), FM (frequentiemodulatie) en fasedistortie worden als synthesetechniek gebruikt. De meest gebruikte van die verzameling is teruggekoppelde FM synthese. Bij die techniek wordt de uitgang teruggekoppeld naar de fase-ingang en opgeteld bij het fase-increment dat nodig is om de gevraagde frequentie te produceren. In Figuur 2.6 is dit weergegeven. In formulevorm bekomen we uitgang = A · sin(y) met y = x + β · A · sin(y)
Figuur 2.7: Het spectrum van ´e´en teruggekoppelde oscillator dat varieert naarmate β toeneemt, met x = 200 Hz. De horizontale as heeft een bereik van 0 tot 10 kHz. De verticale as gaat van 0 tot 60 dB.
Een belangrijk voordeel van deze techniek, is dat ´e´en enkele oscillator een veelzijdige bron wordt; naarmate β varieert is de resulterende golfvorm een zuivere sinus, of juist een golfvorm vol boventonen. Dit wordt getoond in Figuur 2.7. Fysische Modellering: Een andere manier is het starten van een muziekinstrument en het trachten te modelleren met fysische wetten: physical modeling. Dit is aangegeven in Figuur 2.8. 12
Figuur 2.8: Modellen van trillende oppervlakken en volumes aan de hand van het massaveer model. (a) een trillend oppervlak, (b) een model van een trom met een circulaire ordening van de massa’s en veren en (c) een trillend volume kan gemodelleerd worden door een traliewerk van massa’s verbonden met veren aan de zes zijden
Andere: Met computertoepassingen kan men verder gaan. Men kan b.v. de vereiste fequentiepieken opgeven en de computer de daarvoor nodige bronnen en filters laten berekenen, waarna het gewenste geluid kan worden geproduceerd. Het analogon in het tijdsdomein bestaat ook: een periode van een golfvorm d.m.v. een aantal punten aangeven. Daarmee kan de computer door interpolatie (van lineair tot splines) de benodigde waardes berekenen en in het geheugen stoppen. Het resultaat leent zich uitstekend om aan wavetable synthese te doen. Er bestaan zelfs methodes voor synthese op basis van stochastische regels. De mogelijkheden reiken zowaar verder dan de horizon... Als besluit van deze paragraaf vermelden we onder welk paradigma de Fynth ontworpen werd: substractieve synthese.
2.1.2
Modulaire Synthesizers
Deze thesis implementeert een modulaire synthesizer met substractieve synthese. De combinatie is geenszins nieuw; een legendarische voorganger oogstte er reeds groot succes mee: de MiniMoog. Een afbeelding is te zien in Figuur 2.9. De MiniMoog is een muziekinstrument. Ontwerper Robert Moog liet zijn kennis van de elektrotechniek gelden, en liet zich veelvuldig inspireren door zijn vrien13
Figuur 2.9: De MiniMoog
den muzikanten. Als afgestudeerd ingenieur fysica (vastestof-fysica) was hij gefascineerd door de mogelijkheid om met opamps en transistoren muziek te maken. Zijn populairste verwezenlijking is de MiniMoog, de eerste elektronische synthesizer die muzikanten mee op het podium konden nemen4 .
Modulariteit Uniek aan een modulaire synthesizer is de mogelijkheid om elke module als een onderdeel van de geluidsweg zelf te gebruiken, of om het blokje toe te passen om een bepaalde parameter in die geluidsweg te be¨ınvloeden. Wanneer men de MiniMoog even naderbij bekijkt, kan men inderdaad verschillende modules onderscheiden. Oscillator De eerste module is de oscillator, het circuit dat “vibreert”. Dat blokje kan de rauwe golfvorm genereren, en kan aangezien worden als het trillende riet of de snaar van een klassiek muziekinstrument. De vorm van de rauwe golfvorm is belangrijk, want naargelang die vorm, verandert de harmonische inhoud en dus ook het timbre van het geluid. Men kan de oscillatoren als echte geluidsbronnen gebruiken, maar anderzijds kan het geproduceerde signaal ook bv de frequentie van een andere oscillator moduleren. Ook in de Fynth zijn er oscillatormodules aanwezig. Er is een blokje dat een zaagtandgolf genereert. Die vorm zorgt voor het grootst aantal harmonischen en klinkt helder en zoemerig. Een blokgolfmodule heeft daarentegen enkel even harmonischen en klinkt daardoor helder, maar hol als een klarinet. De pulsbreedte van de blokgolf kan gevarieerd worden, het blijft echter een heldere dunne klank. Men kan ook een driehoekige golfvorm gebruiken. De harmonischen zijn daar zo laag in amplitude dat het geluid gedempt en fluitachtig klinkt. De ontwerpers hebben ook een sinusgenerator voorzien, niet echt als geluidsbron, maar eerder om effecten als triller, of vibrato te kunnen bekomen. Ten laatste is er ook een ruisbron. Ook die kan 4
Robert Moog is een legende in de synthesizerwereld, en is in vele opzichten het gezicht van digitaal audio-ontwerp. Hij stond aan de basis van de ontwerpsfilosofie (modulaire synthesizers). Hij ontwierp de Minimoog. Hij stond mee aan de basis van h`et standaardprotocol voor digitale muziekuitvoering: MIDI (zie Sectie 2.2).
14
moeilijk een echte oscillator worden genoemd, maar is nuttig voor het bereiken van speciale effecten en bovendien kan er een bepaalde frequentie in herkend worden als dit blokje gebruikt wordt in combinatie met een filter. De golfvormen ziet men samengevat in Figuur 2.10.
Figuur 2.10: De verschillende oscillatoren
Filter Filters zijn de modules die de naam substractieve synthese in de praktijk omzetten. Het neemt immers een aantal frequenties weg uit het ingangssignaal. Algemeen bestaan er drie soorten filters. Een laagdoorlaatfilter (Figuur 2.11) neemt alle frequenties boven zijn afsnijfrequentie weg. Een hoogdoorlaatfilter laat die frequenties net wel door. En de laatste soort, banddoorlaatfilters, heeft twee afsnijfrequenties. Die twee defini¨eren een band waartussen alle frequenties doorgelaten worden. De Fynth bevat een laagdoorlaatfilter met mogelijkheid van resonantie. 5
Figuur 2.11: De frequentiekarakteristiek van het Moogfilter
5
Er is vaak discussie over de definitie van afsnijfrequentie. Laten we voor alle duidelijkheid aannemen dat dit het punt is waar de amplitude ten opzichte van de doorlaatband met 3 dB wordt verminderd (of de amplitude is gehalveerd) [6]
15
ADSR De ADSR staat toe om het volume te regelen, en is in technische termen een volumeomhullende generator. Deze module beschrijft de omhullende van het geluid naarmate het evolueert in de tijd. Om de eigenschappen van dit blok te regelen zijn er meestal vier parameters voorzien. “Attack”, gemeten in de tijd, bepaalt het volume bij de toonaanzet. Dan wordt met “decay” geregeld hoe gauw de toonaanzet overgaat in het aangehouden gedeelte van de toon, de “sustain”. Met die parameter wordt de geluidssterkte geregeld gedurende die tijd. Als laatste is er “release”: hiermee wordt bepaald hoe lang het duurt vooraleer de noot uitsterft. Deze vier parameters samen vormen een ADSR-generator. Dit is weergegeven in Figuur 2.12; men notere dat de betekenis van de parameter sustain niet de lengte van de sustainfase aanduidt (zoals de figuur lijkt te suggereren), maar de hoogte. Ook in het ontwerp is een ADSR-generator aanwezig. Het is een belangrijk element in de toonvorming. Wanneer men een toon van een klassiek instrument bestudeert, kan men er een vergelijkbaar verloop in herkennen.
Figuur 2.12: Een ADSR volume-omhullende, met zijn vier fases A,D,S en R.
Mixer De laatste belangrijke component is de mixer. Daar wordt immers het aandeel van alle geluidsbronnen in het eindsignaal geregeld. Het spreekt voor zich dat deze component ook in het ontwerp niet ontbreekt, want hij is van cruciaal belang om een goede samensmelting van de verschillende klanken te bekomen. 16
Regelen Een belangrijke eigenschap van de MiniMoog is de mogelijkheid om parameters te moduleren. Zo kan b.v. de frequentie van een oscillator door de uitgang van een andere oscillator worden beinvloed. Daardoor krijgt men een trillereffect en een complexer toonbeeld. Voor de MiniMoog is dat mogelijk, omdat elk blokje een uitgangswaarde genereert, gemeten in spanning, die zonder meer bewerkingen met b.v. een spanningsgecontrolleerd filter kan worden verbonden (wah-wah effect). Vandaar dat de componenten voltage controlled oscillators (VCO), voltage controlled filters (VCF) en voltage controlled amplifiers (VCA) heten. Om die effecten toe te laten heeft men bovendien nog een LFO voorzien, een low frequency oscillator. Hij genereert frequenties beneden de 20 Hz, dus onhoorbaar, maar wel uitermate geschikt als moduleersignaal. De ontwerpers hebben ook deze filosofie gevolgd. Aan elk blokje (behalve de eindmixer dan) wordt de mogelijkheid gegeven om ofwel een geluidselement of een controle-element te zijn. Een nieuwe MiniMoog? Hierboven is de Fynth vergeleken met de MiniMoog, maar dat neemt niet weg dat hij de vergelijking met andere modulaire synthesizers niet zou doorstaan. Het verschil zit hem dan vooral in kleinere dingen zoals bepaalde opties die wel of niet aanwezig zijn. Het grote verschil ten opzichte van de MiniMoog is dat het ontwerp 8 notenpolyfonie ondersteunt, terwijl de MiniMoog een monofone en dus pure ”leadsynthesizer is.
2.2
MIDI
MIDI6 is een communicatie-standaard om digitale muziekinstrumenten (typisch piano keyboards) met elkaar te verbinden. MIDI werd ontwikkeld in de vroege jaren ’80, en maakt het mogelijk letterlijk tientallen instrumenten te verbinden en te laten samenwerken. MIDI abstraheert een muzikale partituur of live-uitvoering tot een reeks van gebeurtenissen, en zet alleen deze om tot – bijgevolg compacte – digitale code. Het indrukken van een noot op het klavier genereert een MIDI “Note-On” boodschap, bestaande uit 3 boodschappen van elk 7 bit, geflankeerd door een startbit (0) en een stopbit (1). De eerste boodschap geeft de aard van het commando aan (voor “Note On” is dat de binaire sequentie 1001 0000, of, in hexadecimale notatie, 0x90), de volgende 7 bit geven het nootnummer aan, en de laatste 7 bit geven de velocity of aanslagintensiteit aan7 . Het indrukken van e.g. de la van het 6 7
Music Instrument Digital Interface Voor details over MIDI-protocol verwijzen we naar [5].
17
vierde octaaf8 genereert een note-on boodschap voor nootnummer 69. Er bestaan vele types MIDI-boodschappen, waarvan sommige betrekking hebben op de uitvoering, andere op meer formele zaken als synchronisatie, verandering van instrument. Van alle MIDI-boodschappen die door het keyboard uitgezonden en door de PC ontvangen worden, behoudt de Fynthsoftware enkel de note-on en noteoff boodschappen, en negeert de andere. De nuttige boodschappen worden door de software omgezet in het Fynth-eigen protocol, dat verder toegelicht wordt in Subsectie ?? en “PCI Protocol” heet (omwille van de bus waarover de boodschappen reizen). Vanaf de conversie naar PCI protocol is er geen sprake meer van MIDI als standaard9 . Het PCI protocol bevat de aanslagintensiteit niet meer, en geeft alleen een (geschikt genormeerde) frequentie door, die correspondeert met het nootnummer. De Fynth herkent deze informatie en onderneemt passende acties. Uit bovenstaande mag het de lezer duidelijk zijn dat de Fynth geenszins een MIDI-machine is. Het MIDI-protocol werd ontworpen voor de digitale nabootsing van instrumenten en orkesten, en biedt ons slechts weinige commando’s die een voldoende breeddragende betekenis dragen om ons tot nut te zijn. Enerzijds zijn vele MIDI-commando’s die de Fynth schijnbaar van pas kunnen komen te eng in betekenis als het op modulaire synthesizers aankomt 10 . Anderzijds vallen vele MIDI-commando’s (zoals het implementeren van verschillende MIDI-kanalen) buiten het bestek van dit afstudeerwerk, of buiten het interessegebied. Voorgaande argumenten nopen ons ertoe enkel de in betekenis samenvallende MIDI-commando’s te gebruiken, en de rest via software te controleren11 . MIDI dient ons veeleer als muzikant – wat is er beter dan een echt pianoklavier onder de vingers – en minder als ingenieur.
2.3
Digitale Synthesizers
Men moet goed beseffen dat het maken van muziek via hardware nog niet lang bestaat, maar wel degelijk een hele evolutie heeft doorgemaakt. Van uren rekenwerk 8
Dit is de diapason, genoteerd als A in Helmholtz-notatie, en sinds 1938 per definitie vastgelegd op 440 Hz. Meer informatie in [2] 9 Het “niet standaard zijn” kan uitnodigen tot uitbreidingen van de Fynth; voor uitdieping refereren we aan Hoofdstuk 5. 10 Nemen we het voorbeeld van een handige draaiknop op het MIDI keyboard om de attack time te regelen, dan zien we dat de regeling van de verondersteld unieke ADSR voor de Fynth met zijn zes ADSR’s een spraakverwarring vormt. Een software-gestuurde selectie van ADSR’s die door MIDI dienen aangestuurd biedt soelaas, doch zadelt ons al gauw op met rendementsarm programmeerwerk en een gebruiksonvriendelijk voorkomen 11 Software, die we overigens al nodig hebben voor het doorsturen van patches, vreemd aan MIDI.
18
voor een streepje muziek, is het streefdoel van de hedendaagse geluidsingenieur het ontwerp van een “real-time” digitale synthesizer. Daartoe beroept hij zich vooral op gespecialiseerde DSP-chips die de nodige bewerkingen voldoende rap kunnen uitvoeren en die de “real-time” synthese de dag van vandaag mogelijk maken. Er zijn dan ook een aantal criteria ontstaan om DSP-chips te kwantificeren.
2.3.1
Criteria voor Digitale Geluidskwaliteit
Voor DSP’s12 (Figuur 2.13) zijn de belangrijkste criteria bemonsteringsfrequentie, woordbreedte, en interne coderesolutie. Als men tonen wil genereren, horen daar ook de lengte van de wavetable, en de frequentieresolutie bij. Bemonsteringsfrequentie De bemonsteringsfrequentie of sampling rate houdt direct verband met het Nyquisttheorema. Als men het ganse hoorbare spectrum (20 - 20000 Hz) zou willen bestrijken, dan heeft men minstens een frequentie nodig van 40 KHz. Het spreekt voor zich dat daarom industri¨ele standaarden zijn aangenomen. De meest gangbare frequentie voor professioneel gebruik is 48 KHz. Maar om historische redenen is bij de compact disc een andere frequentie aangenomen, nl. 44,1 KHz, die veel algemener is ingeburgerd door het succes van die informatiedrager.
Figuur 2.13: Een DSP-chip
De ontwerpers hebben geopteerd voor een systeem dat aan geen van beide standaarden voldoet. De Fynth is een synthesizer geworden met een sample-frequentie van 32 KHz. Aangezien het MIDI-protocol wordt geondersteund, moet de hoogst mogelijke frequentie kunnen worden voorgesteld. Die bedraagt voor MIDI 12544 Hz, en blijft ook met deze samplefrequentie representeerbaar. De aandachtige lezer merkt op dat, voor een toon van 12 kHz, alle harmonischen onrepresenteerbaar zijn, conform het Nyquist-theorema. De eerste harmonische heeft immers de dubbele frequentie, 24 kHz, reeds ver buiten het domein van representeerbare frequenties. Wat gebeurt er met de harmonischen? We detecteren een 12
Digital Signal Processor
19
knelpunt ter hoogte van de oscillatoren, de signaalgeneratoren. Redeneren we verder op de 12kHz toon, e.g. gegenereerd door een zaagtand, in zijn aard rijk aan harmonischen. Denken we aan Nyquist, dan beseffen we dat de juiste generatie alleen de grondtoon zou leveren. Alle harmonischen (frequentie f0 ) zijn immers onrepresenteerbaar, en kunnen dus alleen, via aliasing, het signaal bevuilen op frequenties (16 kHz - f0 ). Om de mathematisch correcte 12 kHz te genereren, zou de zaagtand zijn signaal moeten afleiden uit een sinuso¨ıdaal verloop (vrij van harmonischen). In de Fynth evenwel, wordt de 12 kHz toon rechtstreeks afgeleid uit de zaagtand-functie. Deze laatste is rijk aan harmonischen, die in het geval van een 12 kHz toon boven de bemonsteringsfrequentie vallen. Deze bron leidt om evidente redenen tot andere monsterwaarden, dan in het geval bemonstering van een sinuso¨ıdaal signaal. Het verschil tussen de sinus-monsterwaarden, en de monsterwaarden uit de zaagtand, zijn foutwaarden. Hun opeenvolging, het foutsignaal, cre¨eert stoorsignalen in het uitgaand signaal. Deze stoorsignalen zijn evenwel van secundair belang, om volgende redenen. • Het vermogen van het foutsignaal blijft heel laag voor signalen met frequentie voldoende onder de bemonsteringsfrequentie. • Zelf een vleugelpiano (het type piano met het grootste frequentiebereik) heeft voor zijn hoogste noot slechts 8 kHz. Niettemin schaden zij de geluidskwaliteit. Nemen we de oplossingen in overweging, dan stellen we twee dingen vast. • Een elegante oplossing lijkt het plaatsen van een laagdoorlaatfilter na elke oscillator. Dit is echter ronduit verkeerd: de ongewenste frequenties zijn reeds in het signaal doorgedrongen, en bevinden zich op een willekeurige positie in het spectrum. Filtering kan niet baten, het kwaad is reeds geschied. • Een echte oplossing zou een eenzijdig wavetable-gebaseerde aanpak zijn. Per octaaf13 zou een wavetable voorzien kunnen worden, die vooraf al netjes ontdaan is van alle frequenties, hoger dan de bemonsteringsfrequentie. Deze oplossing is afdoend, en hoewel ze behoorlijk wat geheugen opslorpt, is ze qua structuur weinig “hardware-vretend”. Om redenen van relatief laag grensnut, zagen de ontwerpers af van de implementatie van deze complexere structuur14 . De ontwerpers beperkten zich tot een simpele 13
beter nog ware per 1/3 octaaf Deze structuur nodigt evenwel uit tot uitbreiding van de Fynth, en wordt als dusdanig vermeld in Hoofdstuk 5. 14
20
mathematische calculatie15 , beseffend dat ze hiermee een zekere fout laten bestaan. Evenwel menen ze dat deze daling van geluidskwaliteit voor hoge frequenties het speelplezier niet hoeft te remmen. woordbreedte Denken we aan de representatie van een audio-signaal in een amplitude-tijd diagram. Als de x-as de tijdsas zou zijn, dan is de bemonsteringsfrequentie de resolutie bekeken langs deze as. Maar even belangrijk is de woordbreedte, de resolutie langs de yas. De gangbare norm is zowel 16 bits input en 16 bits output. Om dat iets tastbaarder te maken, kunnen we deze cijfers ook vertalen in dynamiek. Met de volgende vuistregel dynamischbereik = aantalbits × 6, 11[dB] bekomt men voor deze zestien bits een bereik van 96 dB. Studies hebben aangetoond dat het oor een bereik heeft van 0 dB tot ongeveer 125 dB. Die bovengrens komt overeen met de pijndrempel. De standaard 16 bit bestrijken dus het grootste deel van wat het oor aankan. Niettemin zijn de laatste jaren ook DSP’s beschikbaar die werken met 20 bits aan in- en uitgang en dan met 120 dB uiteraard nog meer voldoen. De grotere woordbreedte vertaalt zich, in signaal-technische termen, in een vermindering van de kwantisatieruis. Als er een breedte van 16 bits aan in- en uitgang wordt gehanteerd, wil dat niet zeggen dat intern die breedte wordt aangehouden, integendeel. Ook hier is het zo dat, wanneer men vertrekt van 16 bit in/uit, intern meestal een breedte van 24 bit wordt aangehouden. Dan nog is die breedte niet voldoende om hoogwaardige filteroperaties uit te voeren. Er is sowieso bij hardware filters gevaar dat er limit cycles optreden. Dit betekent dat het filter uit zichzelf begint te oscilleren, door de propagatie van kleine numerieke fouten. De oplossing hiervoor is het opdrijven van de woordbreedte tot 48 bit. Nadeel is natuurlijk dat de verwerkingssnelheid dan gehalveerd wordt, of de opge¨eiste chipoppervlakte verdubbeld. Het veel gebruikte alternatief is het voorzien van een 32- tot 64-bit vlottende komma voorstelling. In het ontwerp is aan de eis van 16 bit aan de uitgang voldaan. Intern gebruiken we 18 bit. Die keuze is bepaald door de structuur van het bordje zelf. De ontwerpers gebruikten de DSP-blokjes op de chip. Deze hanteren woordbreedtes die een veelvoud zijn van 9 bit. De ingangen van de DSP-blokken hebben alle breedte 9 bit (18 bit voor twee DSP’s in parallel), de uitgangen hebben breedte 18 bit (36 bit 15
Het gebruik van de mathematische functie kunnen we, in signaal-termen, bestempelen als het terugvallen op een signaal met oneindige bandbreedte. Het beperken van de bandbreedte gebeurt pas door het bemonsteren zelf; hoe goed dit bemonsteren gebeurt hangt af van de kwaliteit en complexiteit van het bemonsteringsalgoritme.
21
voor twee in parallel). De breedte verdubbelt dus na vermenigvuldiging. Als men de filters bekijkt, dan wordt daar gewerkt met registers van 36 bit, dus ook hier is de registerbreedte verdubbeld. Door de keuze van de filterstructuur zou de kans op gelimiteerde cycli moeten verkleind zijn, of althans zou hun aandeel moeten beperkt zijn. Dit is de gunstige eigenschap van de gebruikte implementatie: een traliestructuur met truncatie, zoals vermeld in [6]. Vaste versus Vlottende Komma Normaal gezien wordt een DSP ontworpen om bewerkingen in vaste komma uit te voeren van 16-, 24- of zelfs 32-bit. Nochtans zijn een aantal DSP’s ook in staat om te rekenen in vlottende komma. De precisie van beide soorten processoren is hetzelfde, maar h´et grote voordeel is het dynamisch bereik. Door die representatie kan een 16-bit processor het beperkte bereik van een 16-bit vaste kommaprocessor [-32768, 32767] weglachen met een aanzienlijk groter bereik. Bekijken we e.g. in het geval van 1 tekenbit, 11 bits mantisse en 4 bits exponent, dan hebben we 4
−(211 − 1)2 = −9.5 · 1052 tot 9.5 · 1052 Het grote bereik maakt vlottende komma aantrekkelijk voor audio- toepassingen, om diverse redenen. • Het absolute bereik is groter. • Het dynamisch bereik is veel groter: telkens de amplitude van een signaal in vaste komma halveert, vermindert het aantal van nul verschillende bits in de mantisse met 1. Om die reden zakt de SNR aanzienlijk, en geven toepassingen met heel laag volumeniveau16 ronduit zwakke resultaten. Vlottende komma heeft hier hoegenaamd geen problemen mee: hoezeer het volume ook afneemt, de resolutie van de representatie blijft gelijk. • De kans op saturatie, ten gevolge van overflow, is virtueel onmogelijk. De mogelijkheid van overflow bemoeilijkt in het algemeen alle structuren waar terugvoeding gewenst is. In concreto refereren we aan de implementatie van de filter, die in vaste komma een lastige bevalling is. Waarom dan nog opteren voor vaste komma? De redenen zijn als volgt. • Vlottende komma-bewerkingen vragen gespecialiseerde hardware. Deze was niet als core 17 beschikbaar aan de ontwerpers, en het zelf implementeren van deze bewerkingen is ronduit een aparte thesisopdracht waard. 16
wat in muziekpartituren als pianissimo betiteld wordt Met core doelt men op stukken code, vervaardigd door derden, die een bepaalde ingangsuitgangsrelatie realiseren. Sommige zijn kant en klaar in hardware implementeerbaar, andere vergen nog aanpassingen. 17
22
• Vlottende komma is duur – de gespecialiseerde hardware slorpt een stuk van de beschikbare ruimte op de chip op, en laat minder ruimte voor de modules van het ontwerp. Wavetable In de wereld van synthesizers en samplers is de geheugengrootte van zeer groot belang. Meer geheugen betekent meer ruimte en dus zowel grotere precisie in woordbreedte en ook langere geluiden. Natuurlijk kan de lengte van geluiden oneindig lang worden als er een lusstructuur wordt voorzien en zo voortdurend een stukje wordt herhaald. Desalniettemin is de lengte van de wavetable bepalend voor de zuiverheid van de geluidsweergave. Om de gedachten te vestigen, citeren we enkele cijfers18 . Wanneer men een wavetable laat horen van 256 waarden, dan haalt die maximaal een SNR van 43 dB. Als men die lengte verviervoudigt en de geheugentoegang vier maal sneller maakt, dan bekomt men een geluid van dezelfde lengte, maar wel met een SNR van om en bij de 55 dB. Ook dat resultaat is nog niet om naar huis te schrijven, dus is men meer en meer interpolerende oscillatoren gaan gebruiken. Waar vroeger de waarde werd benaderd door de dichtsbijzijnde waarde opgeslagen in het geheugen, worden nu veelal de tussenliggende waarden berekend via een interpolatie (gaande van lineair tot hogere orde). Daar wordt b.v. met een wavetable die 1024 waarden bevat waarop lineaire interpolatie wordt toegepast, een uitstekende 109 dB SNR waarde gehaald. Aangezien geheugen geen probleem was, is een sinusoscillator ge¨ımplementeerd die gebruik maakt van een wavetable met 4096 18bit waarden opgeslagen. Bovendien is er ook lineaire interpolatie toegepast zodat de SNR geen zorg is. De andere oscillatoren (blokgolf, zaagtand, driehoek en ruis) hebben geen wavetable nodig. De signaal-ruisverhouding van de oscillatoren is belangrijk omdat door de daarop volgende bewerkingen (volume-omhulling, filtering,...) de SNR enkel negatief zullen benvloeden. Frequentieresolutie en Afstemmen Ook de voorstelling van de frequentie zelf is belangrijk. Met frequentieresolutie wordt bedoeld hoe fijn frequenties kunnen worden voorgesteld over het ganse audiobereik. 18
Deze zijn afkomstig uit het werk van Curtis Roads, [5], dat verbluft door zijn volledigheid en diepgang. Zeker dit laatste is een grote verdienste binnen zijn genre, ‘overzichtswerk”.
23
Vooreerst bekijken we de probleemstelling. Het audiobereik bestrijkt het frequentiegebied 20 Hz – 20 kHz. Uit hoortests blijkt dat een mens een goede frequentiewaarneming heeft in de lage- en middenregisters. Voor hoge frequenties daalt de nauwkeurigheid van de waarneming. De muziekwaarneming zelf werkt met verhoudingen: tussen twee frequenties wordt niet het absolute verschil in Hertz waargenomen, maar integendeel de verhouding. Een halve toon omhoog gaan wordt fysisch vertaald in het cre¨eren van een frequentieverhouding; dit betekent een vermenigvuldiging met een factor, eigen aan de gekozen stemming. Voor gelijkzwevende stemming is die factor, per halve toon, steeds de twaalfdemachtswortel van twee. Een halve toon omhoog gaan betekent voor een toon van 100 Hz een increment met 5.95 Hz; voor 1000 Hz is dit 59.5 Hz.
Figuur 2.14: Frequentierepresentaties
De eenvoudigste aanpak is een lineaire frequentievoorstelling: een omrekenings24
factor vertaalt de binair voorgestelde waarden rechtstreeks in de fysische frequentie. Deze voorstelling is toegepast in de Fynth, en wordt ge¨ıllustreerd in Figuur 2.14. Ze heeft evenwel een aanzienlijk nadeel: een overgang van toonhoogte (e.g. een halve toon omhoog) wordt in absoluut frequentieverschil, in Hertz, met constante nauwkeurigheid gerepresenteerd. Dit is incompatibel met de waarneming, die, voor een representatie met een te laag gekozen aantal bit, de lage tonen als vals zal ervaren, en de hoge als juist gestemd. Daarom wordt het aantal bit in deze voorstelling volledig afgestemd op de vraag voor de laagste tonen: vanaf hoeveel bit klinken ze juist? De best aan het oor aangepaste representatie is de logaritmische voorstelling; zij is afgebeeld in Figuur 2.14. Een tussenoplossing, geschikt voor vaste komma toepassingen, is een afzonderlijke codering van het octaaf, in e.g. 4 bit, en een lineaire voorstelling binnen dit octaaf. Deze oplossing beperkt de woordbreedte. De ontwerpers hielden zich bij de lineaire voorstelling, om de rekentechnische problemen van deze voorstelling te vermijden. De Fynth heeft een woordbreedte van 18 bit. Dit volstaat om, bij normaal indrukken van de toetsen, goed gestemd te klinken19 . Om speciale effecten te hanteren als een vlotte glissando is de minimum woordbreedte van 21 bit evenwel aangewezen. Tegenwoordig is een frequentieresolutie van 1 mHz courant. Vertaald naar MIDI toonhoogte zou dit een resolutie tot op 1 cent20 eisen. De Fynth heeft een frequentieresolutie van 6 mHz, te laag om de effecten helder weer te geven op alle mogelijke frequenties. Gaan we nog dieper in op de cijfers. In het ontwerp wordt als standaard woordbreedte 18 bit gehanteerd; evenzo geldt dit voor de frequentie. De Fynth frequentierepresentatie stelt zijn maximum (alle 18 bits op 1) gelijk aan de maximaal representeerbare frequentie aan 32kHz, dit is 16kHz21 . De frequentieresolutie bedraagt 0,06 Hz over gans de bandbreedte. Kijkt men echter naar de vereisten voor de effecten dan wordt het meest stringente verschil berekend tussen 2 frequenties die 1 cent van elkaar verschillen. Die vindt men in de kelder van het bereik. Als men kijkt naar de laagste noot die door het MIDI-protocol kan worden meegegeven, dan is die C-1, of een frequentie van 8,1760 Hz. De halve toon daarboven, C#-1, is 8,6620 Hz. Dat maakt een verschil van bijna een halve Hz, of m.a.w. een cent van de laagste halve toon is 4,862 mHz, waardoor een glissandoeffect maar aangenaam overkomt vanaf A2, ofte 110 Hz. 19
aldus [5] 1/100 van een halve toon 21 In feite stelt de definitie van de Fynth frequentierepresentatie het binaire geheel getal, bestaande uit ´e´en 1, gevolgd door 18 nulletjes, gelijk aan de helft van de exacte bemonsteringsfrequentie van de Fynth, dat is de helft van net geen 32kHz. 20
25
2.3.2
Digitale audio en Vaste Komma
Vaste Komma en Dither De ontwerpers hebben ervoor gekozen om de signaalverwerking in vaste komma uit te voeren. Dit is weliswaar gemakkelijker dan het uitwerken van vlottende komma, maar toch zijn er addertjes onder het gras. Ten eerste is er de representatie. Het ontwerp heeft als standaard woordbreedte 18 bits. Vertaald naar vaste komma representatie is de meest linkse bit een tekenbit (0 is positief, 1 is negatief) en de rest vertegenwoordigt de waarde. Nu, vaste komma wil zeggen dat de komma vast staat, en in het ontwerp is dat net links van de 17 significante bits. Vandaar dat het bereik beperkt is van -1 (of binair “10 0000 0000 0000 0000”)tot 1 (“01 1111 1111 1111 1111”)22 . Dit is echter de voorstelling voor enkele precisie. Bij de filters wordt dubbele precisie gebruikt. Dan zijn er 36 bits ter beschikking. Deze bits komen voort uit het product van twee 18 bits enkele precisie vaste komma-getallen. Daaruit volgt dat er in de dubbele precisie plaats is voor twee tekenbits en er dus 34 bits overblijven om de waarde te kunnen voorstellen (zie Figuur 2.15). Bovendien kan aan de hand van die twee tekenbits aan overflowdetectie worden gedaan: ze moeten immers steeds gelijk zijn aan elkaar, anders treedt er overflow op.
Figuur 2.15: Enkele en dubbele precisie van vaste komma 22
dus eigenlijk 0,99999237060546875
26
Aan de ene kant is die precisie gewenst, maar aan de andere kant moeten we de vaak terugstappen van die grote precisie naar de standaard 18 bit. Dat gebeurt niet zonder meer. Bij elke overgang naar een geringere precisie moet immers een afrondingsschema gebruikt worden. Dat kan van truncatie tot afronding gaan. Maar bij om het even welk afrondingsschema wordt er nog meer kwantisatieruis toegevoegd. Dat is er natuurlijk altijd, maar het gevaar is dat die ruis zou gecorreleerd worden met het nuttige signaal zelf. Er wordt namelijk op een deterministische manier de overstap gemaakt naar een lagere precisie. Vandaar dat men bewust ruis toevoegt, vooraleer het afrondingsschema wordt toegepast: dither. Bijzonderheden hierover zijn te vinden in [7].
Figuur 2.16: Statistiek van de inkomende informatie, onder het niveau van de kwantisatiestap q
Voor de eenvoud nemen we aan dat we een continu signaal gaan discretiseren, zoals veel gebeurt bij analoog naar digitaal omzetting. We moeten kwantiseren; hiervoor gaan we uit van een uniforme verdeling van de inkomende waarden, onder het niveau van de kwantisatiestap q. Dit wordt afgebeeld in Figuur 2.16. Aangezien truncatie is toegepast, betekent dat voor de kwantisatieruis een uniforme verdeling tussen 0 en q, de resolutie van de voorstelling. In Figuur 2.17 wordt echter duidelijk dat daardoor de ideale afronding niet wordt bereikt. Daarom voegt men ruis toe, ook met een uniforme verdeling tussen 0 en q, zodanig dat we schematisch het volgende verkrijgen (Figuur 2.18) en veel beter de bissectrice benaderen. Het komt erop neer om bij elke overgang van dubbele naar enkele precisie ruis toe te voegen, om een zo goed mogelijke afronding te verkrijgen. Digitale filters De Moog modulaire synthesizers hebben een overdrachtsfunctie zoals afgebeeld in Figuur 2.11. Een implementatie op algoritmisch niveau is ronduit simpel; in vaste
27
Figuur 2.17: Conversie van een analoog signaal naar een 4 bits vaste komma digitaal signaal
Figuur 2.18: Dezelfde conversie maar door de ruis zijn de overgangen niet te voorspellen
komma is evenwel voorzichtigheid geboden. De voorstelling laat toe van getallen voor te stellen in het interval -1 tot 1. Vandaar dat er re¨eel gevaar bestaat voor overflow! Er is dan ook naarstig onderzoek gedaan om robuuste filterimplementaties te vinden, die uit zichzelf binnen het voorstelbaar bereik blijven. De eerste, en ook heel strenge eis, is de structurele passiviteit. Dat wil dus zeggen 28
dat uit de structuur z´elf volgt dat de overdrachtsfunctie de volgende eigenschap bezit.
|H(ejω )| ≤ 1, ∀ω.
Een gevolg van deze eigenschap is dat de gevoeligheid voor een verandering van een parameter steeds beperkt blijft. Bijvoorbeeld, wanneer men de hoogte van een doorlaatband met ´e´en parameter regelt, dan zal de gevoeligheid buiten die doorlaatband tot nul worden gereduceerd. De tweede eis is stabiliteit. Daaruit volgt dadelijk dat terugkoppellussen uit den boze zijn. Bovendien zijn bepaalde structuren veel robuuster dan andere. Er bestaat immers zoiets als limit cycles. Het gaat hem om het feit dat een filter uit zichzelf kan beginnen oscilleren en dus ook resoneren. Dat effect is eigenlijk niet-lineair en daardoor enkel te voorkomen door de keuze van de structuur, samen met het afrondingsschema. Er bestaan twee robuuste implementaties: lattice- en ladder -filters, zie Figuur2.19.
Figuur 2.19: De ladder- en de tralie-implementatie van digitale filters
Er is gekozen voor een lattice-implementatie, samen met afkapping, zodat de aanwezige limit cycles beperkt blijven [6]. De lattice-structuur is niet rechtstreeks 29
op het filter toegepast, maar eerst is het filter opgesplitst in all-pass filters. Met gemak kunnen die dan in de robuuste structuur gegoten worden. Die eisen blijven niet zonder gevolgen. Ze zorgen ervoor dat men resonantie op een totaal andere manier moet implementeren. Normaal gezien zorgt een terugkoppellus voor het resonantiefenomeen. Maar het vaste komma filter mag geen terugkoppellus bevatten, zal dus de volledig uitgeschreven overdrachtsfunctie implementeren. In het project is er vertrokken van een filterbeschrijving met terugkoppellus en vlottende komma. Zodoende waren de ontwerpers eerst gedwongen om het filter te normaliseren, zodat de maximum waarde van |H(ejω )| gelijk is aan 1. Om toch resonantie te cre¨eren, kan men dus de bijdrage van een bepaalde band behouden, en de rest dempen. Daardoor is het effect van totaal andere aard dan wat met een vlottende komma voorstelling kan verkregen worden. In het ontwerp is bovendien de methode van Regalia-Mitra gebruikt[6]. Het is immers normaal gezien zo dat parameters verschillende eigenschappen van het filter be¨ınvloeden. Om geschikt te zijn voor een synthesizer zouden eigenlijk enkel de afsnijfrequentie en de resonantie regelbaar moeten zijn, en liefst zo onafhankelijk mogelijk. En dat is precies waar Regalia-Mitra voor staat. Vandaar dat in het ge¨ımplementeerde filter de afsnijfrequentie, de resonantie en ook de resonantieband regelbaar is - die laatste gewoon omdat het model ook toelaat om deze parameter te regelen. Gelukkig bezorgen al deze beperkingen ons ook het voordeel dat de stabiliteit wel degelijk wordt bewaard (het volstaat om na te gaan dat de co¨effici¨enten van de overdrachtsfunctie kleiner zijn dan 1, wat met vaste komma altijd gegarandeerd is). Bovendien zijn we wat minder bezorgd om limit cycles, die toch nog steeds voorkomen, maar zouden beperkt blijven. En ten laatste vermelden we ook dat de afrondingsruis door het gebruik van een filter slechts lineair toeneemt met de graad van de overdrachtsfunctie en zelfs onafhankelijk is van de positie van de polen.
30
Hoofdstuk 3 FPGA “The only difference between not knowing it and knowing it, is learning it!” The Man
3.1
Een Herprogrammeerbare Chip
Wanneer men als ontwerper een volledig custom ontwerp wil uitdenken en realiseren, dan heeft men een zee van tijd nodig. Daarom zijn heel wat oplossingen voorhanden om het leven als designer draaglijker te maken. Een van die manieren is een bibliotheek van componenten beschikbaar stellen, standard cells, waarmee de ontwerper dan zijn volledig theoretische design in de praktijk kan omzetten, zonder al te veel last te hebben van problemen als latch-up, waarmee hij anders wel rekening zou moeten houden. Ofwel maakt men het hem nog gemakkelijker door hem een siliciumontwerp voor te schuiven waarop reeds componenten aanwezig zijn. Dan komt het erop aan om enkel de juiste verbindingen aan te brengen in een volgende laag. Eigenlijk zijn voornoemde methoden nog steeds omslachtig en vergen ze van de ontwerper een enorme kennis en ervaring. Daarom zag al gauw een ander soort chips het leven. Daar was de filosofie: alle mogelijke componenten en verbindingen zijn aanwezig, de ontwerper moet enkel de overbodige verbindingen verwijderen. Bijvoorbeeld kan hij dat door de baantjes gewoon weg te smelten. Daaraan is nog ´e´en nadeel verbonden: eens gemist is de fout niet meer te herstellen, en mag de chip de vergeethoek in. Vandaar dat men h´erprogrammeerbare componenten ging aanwenden. En daar is de FPGA-oplossing er ´e´en van. Op zo’n chip zijn er een groot aantal structuren aanwezig. Hij is op hi¨erarchische wijze opgebouwd uit een aantal bouwstenen. Er wordt onderscheid gemaakt 31
tussen ingang-uitgangblokjes, de configureerbare logische blokjes en de interconnectiestructuren die de componentjes met elkaar verbinden. Meer en meer komen daar nog gespecialiseerde blokjes bij zoals gedistribueerd geheugen op de chip zelf en zoals bij de Stratix-chip ook nog DSP-blokjes in staat zijn om vermenigvuldigingen aan een hoog tempo uit te voeren.
3.2
Het Aanbod
c De ontwerpers kregen een StratixII PCI development board (Figuur 3.1) ter beschikking. Zoals de naam al laat vermoeden, huist er op dat kaartje nog veel meer dan enkel de herprogrammeerbare chip.
Figuur 3.1: Het bordje
Heel belangrijk aan dat kaartje is het feit alleen al dat het kan ingeschoven worden op een PCI-slot1 . Daardoor kan men, mits men de chip gepast programmeert, communiceren via het PCI-protocol en daarmee is de hardware dadelijk met de buitenwereld verbonden. Naast de chip is er nog plaats voor andere componenten. Heel belangrijk zijn de extra geheugenmodules. Op het bord is immers een DDR-RAM2 geheugen geplaatst van maar liefst 256 Mbyte en een flashgeheugen. Daarenboven is er plaats voorzien om twee kristalklokken te monteren: een 33 MHz 1 2
Peripheral Component Interconnect Double Data Rate Random Access Memory
32
en een 100 MHz klok zijn aanwezig. Daarnaast is er nog de externe JTAG-poort, een aantal andere in/output poorten zoals de standaard ethernetpoort. Ook zijn er aantal LED-jes3 geplaatst, enerzijds om te tonen of de voeding van het kaartje in orde is en anderzijds nog 8 LED-jes die door de ontwerpers kunnen aangewend worden om signaaltjes naar buiten te brengen. Naast de LED’s zitten nog drukknoppen. De rechtse reset het ganse bordje, maar de drie overige kunnen vrij door de ontwerpers worden aangewend. Wat voor het ontwerp van de synthesizer nog belangrijk is, zijn de pinnen die gemonteerd zijn en waaraan ook signalen kunnen worden aangesloten. Daarlangs wordt immers het uiteindelijke audiosignaal naar buiten gebracht. De omgeving van de chip laat al vermoeden dat deze component met een bepaald doel is ontworpen. Wanneer men ook het binnenwerk (Figuur 3.2 en 3.3) van de chip bestudeert, wordt het helemaal duidelijk dat deze chip in hoofdzaak bedoeld is om aan digitale signaalverwerking te doen. In het geval van beeldverwerking, kan immers het DDR-RAM geheugen gebruikt worden om een volledig beeld op te slaan. Dat beeld kan dan in kleinere stukken binnengeloodsd worden in het gedistribueerde geheugen van de chip zelf. Daar kan dan de gepaste operatie worden uitgevoerd en het resultaat opnieuw via DDR-ram en PCI-bus naar de computer zelf worden gesluisd.
Figuur 3.2: Schematisch overzicht van de chip
3.2.1
In & Uit
Op de chip zelf zijn aan de rand een groot aantal input/output elementen voorzien met als doel een groot aantal standaarden te ondersteunen t.o.v. de buitenwereld. Elke standaard heeft immers een andere manier van buffering, aanpassing, en daarvoor worden die elementen aangewend. 3
Light Emitting Diode
33
Figuur 3.3: Zicht op het binnenste van de chip
3.2.2
Geheugens
Geheugenruimte is belangrijk. Daarom wordt een aanzienlijke hoeveelheid ruimte, niet alleen op het bordje, maar ook in de chip, ingenomen door geheugen. Het wordt aangeboden in drie soorten. Elk heeft als structuur simple dual port: het gaat om tweepoortsgeheugens.
• Ten eerste is er het M512 geheugen, snelste van de drie. Het geheugen is 512 bit groot, en kan werken aan 318MHz en 18 bits per behandelen via ´e´en of twee poorten. Voornamelijk worden die geheugens (op ons kaartje zijn er 224 in twee kolommen aanwezig) aangewend als FIFO-buffer4 of voor DSP-toepassingen of nog om van het ene naar het andere klokdomein over te stappen. • Het iets grotere M4K geheugen heeft plaats voor 4 kilobit. is ook voorzien en kan 36 bitwoorden per kloktik van hoogstens 291 MHz aan. Daarvan zijn 4
First In - First Out. Is m.a.w. bruikbaar als schuifregister: het eerst ingeschreven datawoord wordt ook eerst uitgelezen
34
er 138 in twee kolommen geschikt en die kunnen veel algemener aangewend worden. Bijvoorbeeld kan men er processorcode in opslaan (wanneer men de chip als processor heeft geprogrammeerd) of kan men er een opzoektabel in stockeren (wat bij synthesizerontwerp mooi meegenomen is (zie verder)). • Als laatste zijn er nog twee reuzeblokken voorzien: M-RAM (MegaRAM). Die hebben een capaciteit van 576 kilobit5 , en werken aan een maximum van 269 MHz en een woordlengte van ten hoogste 144 bit. Zij zijn vooral belangrijk om een grote hoeveelheid data op de chip beschikbaar te hebben.
3.2.3
DSP’s
De DSP’s6 zijn voorzien als twee kolommen gespecialiseerde blokken, nuttig voor signaalverwerking. Op de chip zijn ook daarvoor twee kolommen vrijgehouden. Het zijn deze die het leven van de ontwerper heel wat vergemakkelijken, want ze zijn geoptimaliseerd om vermenigvuldigingen of de zo gegeerde vermenigvuldiging gevolgd door een optelling (zoals bij FIR-filters7 ) aan een hoog tempo uit te voeren. Deze versie telt zelfs 8 DSP- blokken waarvan ´e´en enkel blok ofwel 8 9 x 9 bit vermenigvuldigingen kan uitvoeren, ofwel 4 18 x 18 bit of ook ´e´en 36 x 36 bit vermenigvuldiging tot een goed einde kan brengen. Bovendien kan elke vermenigvuldiger zo geprogrammeerd worden dat de bewerking gepijplijnd wordt uitgevoerd waardoor deze blokjes een nooit geziene verwerkingssnelheid halen.
3.2.4
PLL’s
Een PLL is een antwoord op de vraag naar hogere kloksnelheden8 . Aangezien er enkel een 33MHz of 100 MHz kristalklok aanwezig is, hoe kan men dan het geheugen aan kloksnelheden laten draaien die nog veel hoger liggen? Ook daaraan is gedacht: aan boord zijn er immers nog een ander soort blokjes, geoptimaliseerd voor kloktoepassingen. Ze laten toe om uit een ingang van 33 MHz een uitgaande klok aan een veelvoud ervan te laten draaien. De chip kan zelfs tot 6 PLL’s bevatten. Dat betekent dat op de component de ruimte kan worden ingedeeld in een aantal klokdomeinen. Specifiek is men daarmee in staat om het geheugen aan een andere kloksnelheid te laten werken dan de rest van het ontwerp. 5
in het geval van configuratie met 18 bit per geheugenadres Digital Signal Processor, een gepecialiseerde programmeerbare rekeneenheid in staat om aan een hoog tempo mathematische berekeningen uit te voeren. 7 Finite Impulse Response Filter: dit soort filters zijn enkel afhankelijk van voorbije inputs en hun antwoord op een impuls resulteert daardoor eindig in de tijd 8 Phase Locked Loop, ofte een fase vergrendelde kring 6
35
De werking van een PLL vertrekt vanuit een zeer stabiele bron. De kristaloscillatoren zijn daarvoor uitermate geschikt, zie Figuur 3.4. Het uitgangssignaal geldt als controlesignaal. Het uitgangssignaal aan de hogere frequentie wordt immers geleverd door een spanningsgecontroleerde oscillator(VCO). Die frequentie wordt gedeeld en daarna vergeleken met het signaal van de kristalklok. Als die fase niet nul is, dan wordt een andere spanning aan de VCO aangelegd die daardoor in de juiste zin zijn uitgangsfrequentie corrigeert. Om de terugkoppeling stabiel te houden, wordt na de fasevergelijking nog een laagdoorlaatfilter toegepast. Zo wordt de kring enkel gevoelig aan de trend die zich lang genoeg manifesteert.
Figuur 3.4: Een pll schematisch weergegeven
3.2.5
LAB’s
De rest van de ruimte wordt opgevuld met de belangrijke LAB-elementen9 . Die bestaan elk uit 10 LE’s10 , de logische elementen en kleinste blokjes aanwezig op de chip. En elk logisch element is de basisbouwsteen (Figuur 3.5) van een ontwerp. Zo’n blokje is in staat om op 4 variabelen elke mogelijke logische functie toe te passen. Intern is daarvoor een LUT-blokje aanwezig. Bovendien kan een logisch elementje gebruikt worden als een schakel in een optelling/aftrekking en kan het dus ook een carry bit verwerken. Daarna is er een register aanwezig dat het resultaat kan bufferen en zelfs in staat is om het resultaat terug te koppelen naar de ingang van het logische element. Die blokjes stellen de ontwerpers dus in staat om om het even welke boolese functie te implementeren (door de LUT voorzien in elk logisch element), om optellingen en aftrekkingen uit te voeren. Niet alleen van 4 bit brede variabelen maar door het groot aantal voorziene controlesignalen kunnen een aantal LE’s zo geprogrammeerd worden om gangbare groottes als 16 of 18 bits te verwerken. Wat meer en meer belangrijk wordt, is het aantal voorziene interconnecties. Het zou mooi zijn om alle controlesignalen en ingangen te voorzien, maar de verbindingsbaantjes te verwaarlozen. Zeker wanneer men aan hoge kloksnelheden werkt, b.v. aan 200 MHz, zijn die componenten van cruciaal belang. Er is dan ook speciaal 9 10
Logic Array Block Logic Elements
36
Figuur 3.5: Een zicht op de architectuur van een logic element
aandacht besteed aan de interconnecties tussen de LAB-blokjes onderling. Een LAB moet immers kunnen verbonden worden met zijn buren, maar het kan gebeuren dat de uitgang van een ge¨ımplementeerde functie verwacht aan de andere kant van de chip. Daarom zijn er zowel directe verbindingen voorzien met de aanliggende blokjes als baantjes van verschillende breedte om blokjes op dezelfde rij en dezelfde kolom te kunnen verbinden. Die laatste zijn zelfs zodanig dat er 3 verschillende zijn voor elke rij en kolom waartussen gekozen wordt om aan de vereiste snelheid en de vereiste afstand te voldoen.
3.3
Samenspel
Als men even abstractie maakt van de chiparchitectuur, is de grote vraag: “Hoe wordt zo’n chip dan geprogrammeerd?” Daarvoor is een hele reeks programma’s nodig, die elk een schakel zijn in de toolchain... Nadat de ontwerper uitgedacht heeft wat hij zal realiseren en hoe, krijgt zijn ontwerp een eerste re¨ele vorm in een programmeeromgeving. Daarmee wordt geen 37
software-programmeertaal als C++ bedoeld, maar veeleer een hardware-taal. De meest gangbare is VHDL11 . Wanneer de code in die omgeving succesvol is gecompileerd, is het tijd voor de eerste test. De ontwerper kan dan middels een testbank nagaan of de geprogrammeerde processen inderdaad de vooropgestelde functie vervullen.
Toolchain Na die verificatie kan het echte werk beginnen. Het ontwerp moet daarna immers ingepast worden in de door de chipboer voorziene software om de functie uiteindelijk c in de chip te doen belanden. Voor Stratix is dat de Quartus II -omgeving. Dat pakket bevat de nodige componenten om over te gaan van een voor de ontwerper leesbare VHDL-code naar een voor de chip leesbaar bestand. Dat die hele vertaling toolchain (letterlijk vertaald “werktuigreeks”) heet, heeft zo zijn redenen. Nadat het ontwerp in een overkoepelend VHDL-bestand is ingepast, worden verschillende stappen doorlopen. Vooreerst start de Analysis & Synthesis. Er wordt van de code overgestapt naar een databank, waarin alle bestanden hi¨erarchisch worden ingepast. Daarna wordt er een logische synthese uitgevoerd, die de gebruikte logica minimaliseert en afbeeldt op de aanwezige elementen van de chip, zoals de logic elements. Dan is het de beurt aan de Fitter. Die toepassing vertrekt van de informatie die door de Analysis & Synthesis is verschaft. Het bekijkt de logic elements en beeldt ze af op de fysische structuren aanwezig in het kaartje. Dat betekent dat de Fitter het ontwerp voor ´e´en specifieke chip optimaliseert. Na die operatie bepaalt de Fitter ook de fysische interconnecties tussen zowel de gebruikte pinnen als logic elements. Die routing is belangrijk om de timing requirements te halen en het spreekt voor zich dat de Fitter meer tijd nodig heeft dan de Analysis & Synthesis-tool. Als het ontwerp op het kaartje kan worden ingepast, mag de Assembler zijn gang gaan. Die neemt de verantwoordelijkheid om het bestand te maken waarmee de chip effectief zal geprogrammeerd worden. Aangezien de beschikbare chip gebaseerd is op een SRAM proces, komt het erop neer dat het statische geheugen geprogrammeerd wordt en daarmee verteld wordt aan de chip welke functie elk logic element uitvoert en met welke andere structuren de uitgang verbonden wordt. SRAM is hiervoor een uitstekende keuze, want het geheugen moet niet worden opgefrist en bovendien laat het toch toe dat de chip voor om het even welke toepassing kan worden hergeprogrammeerd. Met de informatie van de Fitter kan de Timing Analyser aan het werk. Dan wordt immers nagegaan of de ontwerpers zich gehouden hebben aan al de tijdsvereisten. Daarbij denken we vooral aan de setup11
Very high speed integrated circuits Hardware Description Language. Een nieuwer alternatief, dat integratie voorziet met C, is SystemC. Deze laatste maakt zijn opmars, maar vertoont capriolen op het moment dat het ontwerp, hoe dan ook, moet omgezet worden naar VHDL
38
en holdtijden die moeten gerespecteerd worden bij het gebruik van registers. Daaruit vloeit dan een rapport dat alle timing-info bevat. Teneinde dit te illustreren, werd in appendix het rapport opgenomen, hiervoor refereren we aan Appendix C.
JTAG c Maar met een bestand op de harde schijf van de computer waarop Quartus II een plaatsje heeft gevonden, is de chip nog steeds niet geprogrammeerd. Daarvoor c wordt de in Quartus II ingebouwde Programmer gebruikt. Die maakt gebruik van een speciaal kabeltje dat via de parallelle poort van de computer verbinding maakt met het kaartje. Langs dat kaartje wordt de FPGA-chip aangesproken via een speciaal protocol: JTAG12 . Oorspronkelijk is deze oplossing ontstaan om ge¨ıntegreerde circuits te kunnen testen. Vroeger bestonden daarvoor speciale chips die een groot aantal pinnen naarbuiten brachten. Daar konden de ontwerpers dan een testsignaal aanhangen en aan een andere pin nagaan of de juiste uitgang werd bekomen of niet. Naarmate de miniaturisatie zich meer en meer doorzette, werd het onmogelijk om nog zo’n chips te maken die veel meer elementen bevatten en tegelijkertijd voldoende testpinnen hadden.
Met de tijd is de idee ontstaan om een andere manier van testen toe te passen: de Boundary Scan. Men zorgt ervoor dat in de chip een aantal “virtuele” testpinnen worden voorzien, die met aangepaste circuiterie met de rand van de chip, genaamd boundary scan cells, verbonden worden. Hieraan zijn veel voordelen verbonden: aangezien chips onderling ook kunnen verbonden worden, kan met ´e´en externe poort het ganse bord getest worden, met een geoptimaliseerd aantal pinnen en baantjes en bovendien kan de test in hoge mate automatisch worden uitgevoerd. Na een fabriekstest kan de chipfabrikant steunend op JTAG beweren een werkend product op de markt te brengen. Bovendien biedt het protocol nog veel meer mogelijkheden, want men is erin geslaagd om de chip met een en hetzelfde protocol ook te programmeren. Dan stuurt men geen testinformatie naar de boundary scan cells, gewoon configuratie-informatie waarmee de SRAM kan geprogrammeerd worden. JTAG boundary chain biedt nog een andere mogelijkheid: na het programmeren kan je er testinfo mee naar buiten te brengen. Daarbij kan men gebruik maken van c een andere krachtige toepassing in het Quartus II -pakket: de SignalTap II Logic Analyser. Wanneer men de Logic Analyser wil gebruiken, moet men wel vooraf bepalen welke signalen men naar buiten wil brengen. Daarvoor is wel wat ruimte nodig op de chip, naast het te testen ontwerp. Want de signaalwaardes worden eerst gebufferd in het gedistribueerd geheugen en daarna via JTAG binnen de Quartus 12
Joint Test Action Group
39
c II -software geloodst. Die zorgt voor een duidelijke weergave onder de vorm van tijdsdiagrammen en is een hele hulp om het ontwerp te testen, e.g. op communicatie.
Zoet Zoals men aanvoelt, is men al een tijdje zoet om al deze toepassingen te leren gebruiken. Toch is deze software een onmisbaar element is bij digitaal ontwerp. Zo vertelt de Fitter al of het ontwerp op het kaartje past, de Timing Analyser of ook alle vereisten qua tijd zijn gerespecteerd en SignalTap II Logic Analyser kan tijdens de werking van de chip een grote hulp zijn en duidelijk maken aan de ontwerpers of een bepaald signaal wel degelijk het juiste gedrag vertoont. De toolchain is een onmisbaar instrument om een ontwerp tot een goed einde te brengen.
40
Hoofdstuk 4 De Fynth “Truth in our ideas means their power to work.” William James In dit hoofdstuk brengen de ontwerpers hun geesteskind naar voor: de Fynth. Voortbouwend op hoofdstuk 2 en 3 wil dit hoofdstuk tonen hoe de daar aangehaalde elementen tot een synth gekneed werden – een proces dat in stappen verloopt. Voor de totstandkoming waren de ontwerpers genoopt tot letterlijk honderden ontwerpskeuzes. Deze grootte-orde hoeft de lezer niet te verbazen, daar het om een merkwaardige combinatie gaat: de implementatie van een modulaire synthesizer – het meest flexibele type; en een zo divers benutbaar hardware-platform als een FPGA. Het doorslaggevend argument in beslissingen bleek in vele gevallen de algemeenheid (en daarmee verbonden uitbreidbaarheid) te zijn, in enkele was het de controleerbaarheid.
4.1
Verdeel en Heers “The difficulty is the choice.” Matrix Revolutions
4.1.1
Een Instrument
De Muziek Maak kennis met de Fynth. De Fynth is een modulaire synthesizer met 2 audiokanalen, een bemonsteringsfrequentie van 32kHz, en een polyfonie van acht noten.
41
Figuur 4.1: Een eenvoudig schema van de Fynth
Figuur 4.1 geeft een schematische weergave van de hardware. We herkennen verschillende blokken, modules genaamd. Sommige blokken herkennen we uit het betoog van de modulaire synthesizers, andere zijn nieuw. De blokken, vertaalbaar naar de wereld van de analoge modulaire synths, noemen we muziek-modules. De modules die integendeel ontstaan zijn om redenen van hardware-ontwerp, noemen we controlemodules. Een opsomming: • muziek-modules – De Oscillatoren, geluidsbronnen: ∗ ∗ ∗ ∗ ∗
square, of blokgolf sawtooth, of zaagtand triangle, of driehoek sine, of sinus noise, of ruis
– De geluidsverwerkers: ∗ ∗ ∗ ∗
ADSR filter delay line, of vertragingslijn middleman, of de sommator 42
∗ mixer • controlemodules – sencoder – chronos – deltasigma De muziek-module middleman heeft een heel eenvoudige werking: het maakt de som van twee inkomende signalen, en stuurt die naar de uitgang. De muziekmodule vertragingslijn realiseert een stereo-effect, door verschillen te cre¨eren tussen linkeren rechterkanaal, zowel in volume als in ogenblik van aanvatten (vertraging). De andere muziek-modules zijn reeds vermeld in Hoofdstuk 2. Vermelden we toch dat er historisch nog een andere module in het spel was: custom. Custom speelt een willekeurige, door de gebruiker gedefinieerde golfvorm af. Deze module is niet ge¨ımplementeerd in de huidige versie van de Fynth. Niettemin wordt de module ook vernoemd in dit document, daar zij reeds een plaats verworven heeft in de organisatie van de bus. De controlemodule sencoder heeft een complexe taak: zij is het die de polyfonie mogelijk maakt. Zij maakt abstractie van de acht verschillende noten, en houdt bij welke noot aan of af staat. Ook treedt zij op als bemiddelaar tussen de input en de muziek-modules. De controlemodule chronos is een heel eenvoudige module. Zij beheert de parallelle bus, en neemt er de tijdsplanning, de time scheduling voor haar rekening. De controlemodule deltasigma doet, net als de muziek-modules, aan signaalverwerking. Toch wordt zij niet als muziek-module betiteld, omdat zij niet op de parallelle bus huist. Zij is enkel verantwoordelijk voor post-processing van de audio. Zij zet een klassiek digitaal stereo audio-signaal, bemonsterd aan 32kHz, om in een deltasigma-gemoduleerd signaal, dat uit de chip naar buiten gebracht wordt. De Hardware Keren we terug naar Figuur 4.1 en belichten we nu het hardware-aspect van de Fynth. De blokjes stellen modules voor, de lijnen stellen de seri¨ele bus (´e´en elektrische lijn) en de parallele bus (dertig elektrische lijnen) voor; het geheel vormt de Fynth en is als dusdanig volledig aanwezig in de FPGA-chip. De afgebeelde input bestaat uit 32 bit brede boodschappen, binnenkomend vanuit de PCI bus. De output is het muzieksignaal, dat langs metalen contactpinnen het Stratix kaartje verlaat.
4.1.2
Een Multiprocessor
Om aan te vatten met de uitleg over het ontwerp, beginnen we met de inhoud van de FPGA chip. De Fynth is in se een hardware-circuit, volledig en exclusief 43
aanwezig in de FPGA. Alle modules, met hun verbindingen en hun geheugen, zijn aanwezig in de herprogrammeerbare chip. Alle omringende apparatuur, zoals de rest van het Stratix kaartje, de PC waarin het kaartje huist, het MIDI keyboard, de geluidsversterking,... kunnen we conceptueel zien als randapparatuur. Zij staan de gebruiker toe de synthesizer te bespelen en te controleren, met de chip te communiceren, en het geproduceerde resultaat te beluisteren. Ze zorgen ook voor de toelevering van bepaalde noodzakelijke inputs aan de chip: elektrische voeding, en meerdere hoge-precisie kloksignalen. Het hart van de opstelling blijft evenwel de FPGA-chip, de Fynth, die een welomlijnde taak heeft: binnenkomende digitale boodschappen omzetten in analoge muziek. Het is in letterlijke zin zo dat de digitale, 32 bit brede boodschappen binnenstromen langs 32 pinnetjes van de chip, en de muziek van linker-, resp. rechterkanaal langs twee andere pinnetjes. Over de output moet nog gezegd dat het audiosignaal deltasigma-gemoduleerd is. Dit betekent dat het reeds een analoog signaal is, maar nog door een laagdoorlaatfilter moet, om een echt “klassiek muzieksignaal” te worden, en naar een gewone muziekversterker te mogen gestuurd worden.
Indien we de Fynth formeel benaderen als een digitaal systeem, dan zien we dat de ontwerpsfilosofie het meest verwantschap vertoont met die van een messagepassing multiprocessor. Een multiprocessor is een processor die gelijktijdig meerdere instructies uitvoert op meerdere data1 . In het geval van de Fynth hebben we te maken met verschillende processoren (de modules), die elk over een eigen geheugen beschikken, en werken met message passing, het doorgeven van boodschappen. Een algemene regel voor multiprocessors is de volgende. Voor een multiprocessor met N processoren (modules), is de snelheidswinst, door het verhogen van het aantal modules van 1 naar N, steeds kleiner is dan die in het geval van ´e´en enkele module, die werkt aan een N keer snellere klok. Deze regel blijft onbeperkt geldig in het geval van de Fynth, evenwel mag vermeld dat het bewaren van het modulaire concept zonder twijfel voorrang geniet op de snelheid van de muzieksynthese, daar de effecten van snelheidsverlaging verwaarloosbaar zijn2 . Verder is de Fynth als multiprocessor message-passing: de boodschappen kunnen we formeel betitelen als “data in verwerking”, die hun weg afleggen van module naar module. Alle modules, op de sencoder na, zijn verbonden met een parallelle bus, 1
Voor definitie en korte uitleg over multiprocessoren refereren we aan [4] Als vuistregel mag gesteld dat een vertraging onder 100 µs in de hardware volstrekt onwaarneembaar is. Onze interne vertragingen zijn van die grootte-orde. Men notere dat het gebruik van het MIDI protocol, met zijn relatief lage datadebiet van 31.25 kbit/s, voor vertragingen van de grootte-orde ms zorgt. 2
44
waarover de boodschappen doorgegeven worden. De sencoder, de seri¨ele encoder, treedt op als controller, die de interpretatie van de ingang regelt, en taken doorgeeft aan de modules via de seri¨ele bus. De keuze voor de multiprocessor-filosofie was een eenvoudige. Als we terugdenken aan het concept van modulaire synthesizers, dan wordt het duidelijk dat de gewenste scheiding van oscillatoren, filters, ADSR... slechts volledig is als ze effectief tot in de hardware doorgevoerd wordt. Deze werkwijze maakt het mogelijk dat processen onafhankelijk en gelijktijdig draaien, basiseigenschappen van een multiprocessor. Dit biedt niet alleen comfort tijdens het ontwerp voor het detecteren van fouten, dit biedt bovendien het onschatbare voordeel dat ge¨ısoleerde modules in hardware functioneren, zonder dat de andere noodzakelijkerwijs aanwezig zijn. Dit betekent dat we in het schema, behalve de obligate controller sencoder, er bijvoorbeeld kunnen voor opteren alleen de square en de mixer in de hardware te implementeren. Het hoeft niet te verwonderen dat de ontwerpers hun testen zonder uitzondering richtten op ´e´en module per keer, en veel baat ondervonden bij die modulaire aanpak. Verder dient nog opgemerkt dat de voordelen van uitbreidbaarheid legio zijn: moeiteloos3 staat het model ons toe om een module weg te laten, te vervangen of bij te voegen4 . De keuze voor een message-passing multiprocessor was verre van triviaal. Het alternatief, modules die parallel opereren op een gedeeld geheugen, leek eerst een haalbaar alternatief. Een instructiegeheugen zou dan beurtelings uitgelezen worden door elke module, die in het geheugen te verwerken data en de geschikte parameters aantreft, en na uitvoering aangepaste parameters en verwerkte data achterlaat. Van dit alternatief durven we beweren dat het haalbaar is, en, ter afweging ten opzichte van het door ons gekozen message-passing alternatief, volgen hier enkele voordelen: • De initialisatie van de hardware is eenvoudiger, want er is slechts ´e´en geheugen. • Studie van het gedrag is in eerste benadering beperkt tot studie van de inhoud van dit ene geheugen, daar het er een onmiddellijke weerspiegeling van is (of behoort te zijn). • Betrouwbaarheid hangt niet af van de zwakste schakel in de ketting. In het geval van de Fynth is het zo dat het volstaat dat ´e´en module niet functioneert (en zijn boodschap niet doorgeeft aan de volgende module) opdat gans het systeem ineenstort, en de synthesizer stom blijft. Bij gedeeld geheugen zou een in het geheel niet functionerende module de synthesizer niet platleggen: integendeel zou alleen het effect van de niet functionerende module afwezig blijven in het uiteindelijke geluid. 3
Tenminste wat betreft het uitdenken van het concept betreft, want de moeilijkheid wordt eigenlijk bepaald door de minder voorspelbare, strenge hardware. Ook hier geldt het devies: 10% inspiratie, 90% transpiratie; hoe eenvoudig het concept ook, de hardware-implementatie is moeilijk. 4 Zo ging het met de module Middleman, uitgedacht en gecre¨eerd in de laatste weken van het ontwerp.
45
Toch zijn er ook nadelen aan gedeeld geheugen: • Toegang van alle modules tot ´e´en geheugen vergt, behalve een goede tijdsplanning (ook nodig voor message-passing) ook aangepaste, extra logica voor toegang tot het geheugen. • Een ongeluk komt nooit alleen. Bij gedeeld geheugen kan het optreden van slecht ´e´en enkele fout, op ´e´en enkel moment, in slechts ´e´en enkele module, resulteren in het foute klank van alle geluid die op die ene fout volgt. Dit kan bij de Fynth nooit het geval zijn. Oorzaak van dit onrobuust gedrag is juist het terugvallen op exact ´e´en tabel, die alles determineert. Indien een module in die tabel ´e´en wijziging op een verkeerde plaats of op een verkeerde manier aanbrengt, zijn de gevolgen niet te overzien, en kunnen het gedrag van andere modules onderuit halen. Dit laatste effect kan bij de Fynth nooit optreden. Systeem-analytisch gesproken zijn er twee vormen van foutpropagatie denkbaar voor shared-memory multiprocessoren. De eerste propagatie gebeurt in de data: de geluidsdata in verwerking wordt verkeerd verwerkt door de malfunctionerende module, en resulteert onvermijdelijk in een fout geproduceerde geluidsmonster. Hieronder hebben zowel shared memory als message-passing multiprocessoren te lijden. De tweede propagatie is in de module-werking: ´e´en foute handeling van een module kan het functioneren van andere modules in het gedrang brengen. Dit is bij de Fynth niet denkbaar. Deze nadelen waren voor de ontwerpers het argument om voor message-passing te opteren. Het uitsluiten van foutenpropagatie over de modules heen bevestigt hen in hun streven naar een modulaire filosofie.
4.1.3
In en Uit
Met de basisopzet in gedachten, kunnen we nu ingaan op de taakverdeling en timing binnen de chip. We gaan op zoek naar het antwoord op volgende hoogst basale vraag: Hoe kan een hoop blokjes, aangesloten op een bus, muziek maken? Vooreerst bekijken we de inkomende boodschappen van dichterbij. De ingang brengt boodschappen aan. Deze boodschappen zijn nodig om de Fynth te lanceren. Ze brengen de Fynth informatie over hoe de gesynthetizeerde muziek moet klinken, en over welke noten al dan niet moeten beginnen of eindigen. De eerste vorm van boodschappen noemen we patchinformatie, de tweede nootinformatie. • De patchinformatie is steeds gericht aan ´e´en module tegelijk. 46
• De nootinformatie is steeds gericht aan alle modules tegelijk; om die reden noemen we de boodschappen met nootinformatie ook broadcast (noot-)boodschappen. Als we denken aan de analoge modulaire synthesizer, dan speelt de patchinformatie, afkomstig van de software, een dubbelrol: het geeft de aangesproken module informatie over hoe hij afgesteld is, en informatie over de verbinding die aan zijn uitgang hangt. In de analoge wereld is de eerste soort niet meer dan de instelling van de knopjes die op de module zitten: duty cycle (voor een square-module); attack, decay, sustain en release (voor een ADSR-module),... De tweede rol is een andere zaak: in de analoge wereld zijn de verbindingen elektrische kabels, die de output jack van de ene module met de input jack van de andere module verbinden. Het digitaal analogon is verrassend eenvoudig: elke module houdt ´e´en 8 bit breed doeladres, het target, bij, waarmee zij juist ´e´en andere module kan aanspreken. Een module houdt geen bronadres bij – een module is blind ten aanzien van de herkomst van de te verwerken boodschappen. Twee modules hebben geen doeladres: de mixer, aangezien hij obligaat met de uitgang verbonden is, en de seri¨ele encoder, daar hij vast met de seri¨ele lijn verbonden is. Dit verbindingsmodel is heel eenvoudig, en bovendien behoorlijk flexibel, zoals duidelijk zal worden verderop in het betoog, wanneer de part¨ele herconfigureerbaarheid besproken wordt. Broadcast messages zijn boodschappen die niet naar ´e´en specifieke module gezonden worden. Dit zijn de boodschappen die nootoperaties aanbrengen: het aanzetten van een bepaalde noot (note on boodschap), het afzetten van een bepaalde noot (note off ), en het glijden van de frequentie van een bepaalde noot (glissando). Daar de Fynth het gelijktijdig weerklinken van 8 noten ondersteunt, wordt er in de Fynth logica vereist, die abstractie maakt van de verschillende noten, bijhoudt welke aan of af staan, en beslist welke oude noten met nieuwe noten mogen vervangen worden. Deze verre van triviale taak is weggelegd voor de sencoder. Hij is het die alle inkomende nootboodschappen verwerkt, en ze bovendien vertaalt naar voor de modules verstaanbare informatie.
Leggen we nu ons oor te luisteren bij de uitgang. Zodra de Fynth ge¨ınitialiseerd is en de gebruiker de eerste noot ingedrukt heeft, klinkt de eerste muziek aan de uitgang. Deze muziek verkeert evenwel nog in een gemoduleerde vorm wanneer ze de FPGA-chip verlaat. De output left en output right die weergegeven worden in Figuur 4.1 zijn nog geen audiosignalen in de zuiverste vorm: ze zijn deltasigmagemoduleerd. Waarom is dit nodig? Wanneer de audiosignalen de mixer verlaten, is hun formaat zeer vergelijkbaar aan de signaalvoorstelling zoals we ze kennen van CD en PC: een 47
digitaal bemonsterd stereo signaal, met woordbreedte 16 bit, en bemonsteringsfrequentie 32kHz. Toch is er nog een extra tussenstap nodig, om over te gaan naar een analoog signaal, dat naar een muziekversterker kan geleid worden. De meest klassieke oplossing ware een D/A converter, die het twee keer 16 bit brede signaal als ingang krijgt, en aan de uitgang een continu audiosignaal produceert. Daar er geen D/A convertor in de chip of op het Stratix bordje voorhanden is, zijn we gediend met een andere methode. Die bestaat erin beide 16 bit brede audiosignalen elk naar een deltasigma modulator te sturen. Daar wordt het signaal geconverteerd naar een analoog signaal, dat met een variatietempo van 33MHz afwisselend de waarde van de maximale uitgangsspanning aanneemt, en spanning nul. Dit signaal heeft de belangrijke eigenschap dat zijn frequentie-inhoud in het Fourierdomein, behalve de voor ons oninteressante piek op 33Mhz, ook de frequenties van ons ingaand (tot dan toe digitaal gerepresenteerd) signaal heeft. Verderop wordt de werking van de deltasigma modulator toegelicht in een apart onderdeel. Voorlopig volstaat het te weten dat we de stereo, deltasigma-gemoduleerde output van de chip door een analoog laagdoorlaatfilter sturen, en aan de uitgang het gewenste analoge signaal vinden. De laagdoorlaatfilter werd voor beide kanalen ge¨ımplementeerd met een simpel RCfilter, met een afsnijfrequentie die met een kleine marge boven de maximaal voorstelbare frequentie5 van het audiosignaal ligt. Gewapend met deze kennis, besluiten we dat de uitgang van de laagdoorlaatfilter mag doorverbonden met een klassieke muziekversterker. Wij kozen voor de meest nabije oplossing in een computeromgeving: de geluidskaart.
4.1.4
Tussenin
Bekijken we opnieuw Figuur 4.1. Hogerop werd uitgeweid over het formaat van in- en uitgang, en over de boodschappen die meegedeeld worden over de seri¨ele bus. Op de figuur is duidelijk zichtbaar dat alle modules expliciet verbonden zijn met mekaar langs de parallelle bus. Uit de uiteenzetting over doeladressen, begrijpen we hoe elke module impliciet slechts met juist ´e´en module verbonden is, door het gebruik van deze adressen op de parallelle bus. Nu zetten we uiteen hoe de modules communiceren, en wat ze mekaar doorgeven over de parallelle bus. Om precies te zijn is het aan de gebruiker om te vertellen hoe hij de modules verbonden wil zien. Hij doet dit door een patch vast te leggen. Een patch is een groep van verbindingen, die de modules vertellen hoe ze moeten verbonden worden. Zodra een gebruiker zijn patch samengesteld heeft, kan hij de Fynth ermee configureren; wanneer ook dat gebeurd is kan hij de Fynth bespelen. 5
Voor 32kHz geldt als supremum de helft, 16kHz, zoals Nyquist en Shannon betoogden.
48
Figuur 4.2: Conceptuele voorstelling van een eenvoudige patch
Om meer inzicht te verwerven in dit mechanisme, bekijken we om de gedachten te vestigen een eenvoudige patch. Ze wordt ge¨ıllustreerd in Figuur 4.2. Een eenvoudig scenario is een square module, die als doeladres een ADSR heeft, die op zijn beurt als doeladres het linkerkanaal van de mixer heeft (De mixer heeft twee kanalen, en is als dusdanig een stereo-module. Meer hierover in Subsectie 4.1.7). Onderstellen we dat de patch-boodschappen alle toegekomen zijn, en de modules succesvol ge¨ınitialiseerd zijn. Dit betekent o.a. dat alle modules die we nodig hebben, als doeladres het juiste doeladres meekregen: de square kreeg het doeladres van de ADSR (0x8)6 , de ADSR het doeladres van de mixer (0xD), en de mixer geen. (Een exhaustieve opsomming van de verschillende commando’s volgt verderop.) Alle niet gebruikte modules, die aanwezig zijn in de hardware, luisteren op elk moment mee naar nootboodschappen. Ze draaien dus op elk moment even actief als de modules die wel gebruikt worden; het verschil is dat ze hun doeladres op nul hebben staan7 . Alle modules die capabel zijn om te reageren op nootboodschappen, doen het, en produceren het nootgeluid aan hun uitgang, zelf indien de gebruiker niet ge¨ınteresseerd is in hun werking. De gebruiker heeft evenwel de vrijheid om de doeladressen van de modules te wijzigen: het volstaat om alle niet betrokken modules het doeladres (0x0) mee te geven, opdat hun geluid nooit doorgang zou vinden naar de uitgang. Het doeladres (0x0) noemen we het drain address, het adres waarheen alle overtollige boodschappen wegvloeien8 . Na een harde reset (het drukken op de “user reset” knop op het Stratix kaartje) staan alle doeladressen op nul, evenals alle instelwaarden. Keren we nu terug naar het voorbeeld, en beelden we ons in dat de gebruiker een noot indrukt. Twee modules zullen hierop een reactie vertonen: de square, en de ADSR. De square reageert door het produceren van de passende eerste 18 bit brede geluidsmonster van een oscillatie met de frequentie van de noot. De ADSR reageert door klaar te staan in de attack fase (eerste fase van de vier-fasen ADSR envelope). 6
Het prefix 0x duidt op hexadecimale notatie, zo is 0xD het decimaal getal 13. Dit was een ontwerpsbeslissing met veel voeten in de aarde. De oplossing waarin alle modules draaien op elk moment (en dus niet geactiveerd worden op een bepaald moment) is volgens de ontwerpers de elegantste, met het oog op parti¨ele herconfigureerbaarheid, een concept waar verderop een ganse paragraaf aan gewijd wordt. 8 In feite is het enige dat gebeurt is dat deze drain boodschappen wel op de parallelle bus komen, maar dat geen enkele module er naar luistert. 7
49
Zodra de square gereed is en permissie heeft, schrijft hij een boodschap op de parallelle bus. Deze boodschap bevat de 18 bit brede sound-sample, of het geluidsmonster. Ernaast bevat de boodschap ook het doeladres, zodat de ADSR weet dat de boodschap voor hem bestemd is, en als enige module het geluidsmonster binnenneemt. Zodra ook de ADSR gereed is, vertrekt het herbewerkte geluidsmonster naar de mixer. Dit gebeurt opnieuw door een boodschap op de parallelle bus te zetten, dit keer met als doeladres de linker-mixer. De mixer neemt het geluidsmonster binnen, en telt hem bij bij de huidige accumulatorwaarde. In het geval van ons voorbeeld is die nul, omdat geen andere bronnen van geluid in het spel zijn. Met het traject van de geluidsmonsters geschetst, zijn we klaar om de rol van de klokken toe te lichten.
4.1.5
Klokken
Nu gaan we in op de aanwezigheid van twee klokken. De eerste klok draait aan 33MHz, en wordt in dit document systematisch betiteld als de snelle klok. De snelle klok geeft het werktempo aan van alle modules. Op systeemniveau kunnen alle modules betiteld als groeperingen van toestandsmachines. Toestandsmachines vergen een klok, die hun werktempo, en de timing van hun in- en uitgangen regelt. De modules in de Fynth zijn opgebouwd uit verschillende processen, die afzonderlijk beschouwd alle eindige toestandsmachines zijn. Meer bepaald zijn alle processen van het type Moore Machine, en werd het gebruik van Mealy Machines vermeden9 . De snelle klok is de klok voor alle toestandsmachines, en is in alle operaties betrokken. De tweede klok speelt een geheel andere rol. De tweede klok in ons systeem wordt consequent betiteld als de trage klok. De trage klok draait aan 32kHz10 . Een alternatieve benaming ware “de audioklok”, aangezien haar frequentie gelijk is aan de bemonsteringsfrequentie van het gesynthetizeerde audiosignaal. De trage klok speelt binnen de chip een relatief beperkte rol. Zij dicteert haar waarden slechts aan ´e´en module, de mixer. Impliciet speelt zij echter een heel dominante rol, daar haar tempo indirect het aantal modules bepaalt, dat binnen de Fynth actief kan zijn. Hoe stuurt de trage klok nu de bemonsteringsfrequentie? Het antwoord vergt eerst een beeld van de taak van de mixer. De mixer treedt op als eindpunt van de geluids9
Een Moore machine is een automaat waarvan de uitgang alleen afhangt van de huidige toestand. Vanuit het oogpunt van robuustheid van gedrag, is de Moore Machine superieur aan de Mealy Machine. 10 Om precies te zijn draait de trage klok aan 31.990kHz, wat exact 1/1042 keer de snelle klok is. De ontwerpers opteerden voor deze oplossing. Op die manier bekomen ze een eenvoudiger denkkader: de snelle klokcycli volgen mekaar op, zijn alle exact even lang, en exact om de 1042 snelle klokcycli, begint er een trage klokcyclus.
50
monsters, als de plaats waar alle in de Fynth nuttig verwerkte data naartoe stroomt. De enige daad die de mixer stelt, is het binnennemen van de toekomende waarden, en ze optellen bij zijn huidige accumulatorwaarde. Zoals men kan vermoeden laat men deze accumulatorwaarde niet oneindig oplopen; ze wordt integendeel periodiek op nul gezet, en de aangetroffen waarde voor de reset wordt naar de uitgang gebracht. De periode van dit gebeuren is de periode van de trage klok, en het uitgaand signaal is een digitaal audiosignaal, met als bemonsteringsfrequentie de trage klok. Refereren we terug aan het voorbeeld van Figuur 4.2, dan zien we hoe de mixer slechts ´e´en bron van inkomsten heeft: de square. Square, ADSR en mixer fungeren als toestandsmachines, en zijn gedreven door de snelle klok. Het aantal snelle klokcycli dat nodig is om het afgebeelde pad geheel af te leggen, is echter niet geweten. Dankzij de chronos time scheduling zijn er echter twee garanties. 1. De pad-duur, of het aantal snelle klokcycli dat nodig is om het gehele pad af te leggen, is constant. 2. De modules ontvangen van buitenaf ´e´en stimulus per trage klokcyclus. Deze twee garanties stellen de Fynth in staat om, zonder de pad-duur te kennen, de correcte bemonsteringsfrequentie te realiseren. De eerste garantie verzekert dat er per geluidsbron (in het geval van Figuur 4.2, alleen de ene square) een constant debiet van geluidsmonsters per trage klokcyclus binnengaat in de mixer. De tweede garantie zorgt dat dit debiet juist ´e´en is. De eerste garantie vertoont een zekere soepelheid. Er wordt immers geenszins gevergd dat de pad-duur onder de duur van ´e´en trage klokcyclus blijft, integendeel mag het willekeurig lang zijn. Het enige gevolg van een lange pad-duur is een kleine vertraging van de weergave11 . Een vari¨erende pad-duur daarentegen zou resulteren in een hoogst ongewenst effect, zelf indien garantie 2 nog voldaan is. Denken we aan het voorbeeld uit Figuur 4.2, dan zie we in hoe per trage-klokcyclus juist ´e´en bijdrage van de oscillator de mixer binnensijpelt. Vermindert echter opeens de pad-duur, dan krijgen we te maken met de mogelijkheid van ineens twee bijdragen; vermeerdert de duur opnieuw, dan hebben we mogelijks ineens nul bijdragen tijdens een andere periode van de trage klok. Het belang van deze twee garanties moet gezien worden in het licht van de keuze van de time scheduling strategy, de strategie van de tijdsplanning. Wij kozen voor een afdoende doch stringente oplossing, chronos time scheduling, die in de volgende paragraaf besproken wordt. 11
Om precies te zijn veroorzaakt de pad-duur, per toename van 1042 snelle klokcycli, een extra vertraging van 31.3µs, de bemonsteringsperiode.
51
4.1.6
Time Scheduling
Onder time scheduling verstaan we in nauwe zin de regeling van de toegangen op de parallelle bus. In brede, impliciete zin betekent het ook de regeling van de bemonsteringsfrequentie. Uit Figuur 4.1 treedt nu een cruciale controlemodule naar voor: chronos. Chronos heeft uitgaande lijnen naar het merendeel van de modules, m.n. dat deel dat in staat is te spreken op de parallelle bus – het gaat hier om alle muziek-modules behalve de mixer. Chronos geeft busenables: beurtelings zet hij precies ´e´en signaal hoog, en houdt alle andere laag, en geeft op die manier groen licht aan juist ´e´en module om te schrijven op de parallelle bus. De op die manier aangespoorde module reageert hierop, door zijn (reeds in een buffer gereed zittende) boodschap naar de parallelle bus te schrijven. Chronos regelt het busverkeer. Hij hanteert een streng “´e´en spreekt, alle luisteren”patroon. Hij maakt het busverkeer heel overzichtelijk, en volgt in het toekennen van zijn buspermissies een periodiek schema. In dit schema komt elke module juist ´e´en keer aan bod, en de periode is dezelfde periode als die van de trage klok. Chronos hanteert een eenvoudig denkschema: elke noot krijgt ´e´en keer spreekrecht per trage klokcyclus. Hoewel het hanteren van verschillende noten pas verderop besproken wordt, kan de lezer denken aan het voorbeeld van Figuur 4.2, en zich inbeelden dat de modules slechts ´e´en noot tegelijk kunnen weergeven. In dat geval krijgt elke module ´e´en busenable van chronos per trage klokcyclus. De geschetste strategie heeft een eenvoudig resultaat: elke trage klokcyclus mag een geluidsmonster een stapje, een module verder, dichter naderend naar de mixer. De patch treedt op als de verbinding tussen de verschillende stapjes van een pijplijn, waarin het monster, a rato van ´e´en stap per trage klok, doorheen sijpelt. Het moment waarop hij dat mag doen blijft gelijk voor alle geluidsmonsters die hem volgen, daar chronos dezelfde tijdsplanning periodiek herhaalt. Dit geldt bovendien voor alle modules, daar elk van hen een busenable krijgt12 . Door deze democratische regelgeving worden de garanties, aangehaald in subsectie 4.1.5, gerealiseerd. We mogen m.a.w. op beide oren slapen: de pad-duur is constant, en de modules worden eens per trage klokcyclus gestimuleerd.
4.1.7
Integratie
In Figuur 4.1 gaven we de inhoud weer van de Fynth. We beeldden er elke module precies ´e´en keer af, en hielden in bovenstaande de lezer in de waan dat er van 12 Men notere dat alle modules een busenable krijgen, inclusief de niet door de gebruiker geactiveerde. Parametrisering van het gedrag van chronos is zeker denkbaar, en zou bijvoorbeeld de weergave van 16 noten of meer kunnen mogelijk maken, afhankelijk van de (eenvoud van de) patchkeuze.
52
elke module slechts ´e´en implementatie in hardware aanwezig is. Bovendien werd er totnogtoe gezwegen over hoe deze modules niet ´e´en, maar acht noten tegelijk kunnen spelen. Beide aspecten worden in dit onderdeel besproken. Ontdubbeling Een modulaire synthesizer moet goed klinken. Kunnen we nog tevreden zijn met het vijftal oscillatoren uit Figuur 4.1, met ´e´en ADSR vindt de gevorderde gebruiker geen muzikale bevrediging. Daarom gaan we ontdubbelen: we verhogen het aantal modules. Om spraakverwarring te vermijden, stellen we hier enkele duidelijke definities. • De entiteit module is een hardwareblok. Ze heeft ´e´en geheugen, en is verbonden met de parallelle bus door juist ´e´en verbinding. Ze herbergt in haar binnenste meerdere implementaties. Nemen we het voorbeeld van de square, dan mogen we zeggen dat de module square exact twee implementaties van de square herbergt. • De entiteit implementatie is g´e´en hardwareblok. Ze is, samen met andere, volledig gelijkaardige collega’s, aanwezig binnenin een module. Ze is een deelverzameling van de module, en mag gedurende een beperkt deel van de tijd gebruik maken van de fysische toegang tot de parallelle bus. Ze fungeert volledig zelfstandig, en correspondeert met de modules die we kennen van bij de analoge synthesizers. De verschillende implementaties, aanwezig in een module, delen zo goed als alle logica en fysische kanalen; hun onderscheid zit eigenlijk alleen in bepaalde instelwaarden: elke implementatie heeft in het modulegeheugen een volledig eigen, ongedeeld gebied. Eerst en vooral melden we dat het betoog in dit hoofdstuk tot hier louter kwalitatief was, en we met het woord module totnogtoe heel slordig omsprongen. Tot hier bedoelden we met module “hetgeen correspondeert met een module van een analoge modulaire synthesizer”. Met bovenstaande definities wordt deze betekenis ronduit omgegooid : voortaan worden de modules uit de analoge synthesizerwereld implementaties genaamd. De hardwareblokken, waarin de implementaties gegroepeerd zitten, heten we in het geval van de Fynthmodules; zij kennen evenwel geen analogon in de analoge wereld13 ! 13
De wijze van formulering verraadt al dat de ontwerpers zich bewust zijn van het onlogische van de benaming. De namen zijn historisch gegroeid, en nu de hele Fynth in die benaming geformuleerd is, ware het maar een verwarrende operatie om de namen post factum nogmaals om te draaien.
53
modulenaam onder woorden sencoder chronos square sawtooth triangle sine noise custom ADSR filter delayline delayline (p.o.) middleman mixer
aantal implementaties 1 1 2 2 2 2 2 0 6 6 1 5 12 1
Tabel 4.1: Opsomming van de modules, en hun aantal implementaties
In Tabel 4.1 wordt het aantal implementaties van de modules weergegeven. We merken op hoe de sencoder en chronos uniek zijn, omwille van hun taak van controller. De muziek-modules kunnen we ons conceptueel voorstellen als alle 41 aangesloten op de parallelle bus. Door hun aantal moet hun adres op de parallelle bus uitgebreid: volstonden zonder ontdubbeling nog vier bits, nu hebben we nood aan een 8 bit doeladres. De eerste vier bit duiden het soort module aan, de volgende vier duiden het implementatienummer aan.
Integratie Ontdubbeling is eenvoudig. We maken van ´e´en ADSR zes ADSR’s, door gewoon zes verschillende implementaties in hardware te maken, elk met een verschillend doeladres14 – en klaar is kees. Hoewel afdoend, ware deze oplossing weinig effici¨ent. Aangezien de verschillende implementaties van eenzelfde module fundamenteel hetzelfde doen, ware het beter hen in ´e´en blok te verenigen, zodat de gelijklopende processen dezelfde hardware delen. Dit is dan ook gedaan. Alle implementaties zijn steeds verenigd in ´e´en blok. Dit reduceert het aantal muziekmodules uit Tabel 4.1 terug van 41 tot 10. De groepering van de implementaties gebeurt inwendig door het bijhouden van een tabel met implementatie-specifieke parameters: ´e´en groep parameters per implementatie. De chronos time scheduling wordt als volgt aangepast: 14
dit dankzij hun verschil in implementatienummer
54
1. De pad-duur is constant. 2. Elke implementatie ontvangt van buitenaf ´e´en stimulus per trage klokcyclus. De eerste garantie is ongewijzigd, de tweede geldt nu per implementatie: voor chronos zijn er te bedienen implementaties, veeleer dan te bedienen modules. Hetzelfde kan gezegd voor de gebruiker: conceptueel zijn de verschillende implementaties geheel gescheiden, en de gebruiker kan ze in die hoedanigheid programmeren met een patch. De hardware-optimalisatie van integratie is een onzichtbare overwinning voor de ontwerpers, niet te ontwaren voor de gebruiker.
Figuur 4.3: Hardware-voorstelling van de eenvoudige patch
Om de ontdubbeling te illustreren, hernemen we het eenvoudige voorbeeld van Figuur 4.2, en vertalen het naar het hardware-schema van Figuur 4.3. We merken op dat de gebruiker veeleer het schema van Figuur 4.2 blijft zien, met het verschil dat de verschillende implementaties een volgnummer krijgen. We spreken dus van “square 0”, “ADSR 0” en “mixer” – de laatste zonder nummer, daar de module slechts ´e´en implementatie kent. Deze conceptuele benadering is ge¨ıllustreerd in Figuur 4.4. Ze is zonder twijfel de handigste naar de gebruiker toe; om die reden blijven we ze verderop in dit document hanteren. Elke blok in deze voorstelling heet implementatie; e.g. “square 0” is de naam van een implementatie. Alternatief kunnen we e.g. “square 0” ook betitelen als implementatie 0 van de module square. We besluiten met de voornaamste boodschap omtrent integratie: Implementaties zijn conceptuele blokken, voelbaar voor de gebruiker. Modules zijn hardwareblokken, voelbaar voor de ontwerper. Polyfonie Nu we het ware aantal modules kennen, zijn we toe aan de vraag van polyfonie: hoe hanteert de Fynth acht noten? Het antwoord ligt besloten in een analoge redenering 55
Figuur 4.4: conceptuele voorstelling van de eenvoudige patch
als die van de ontdubbeling. Vooreerst een kleine schets van de nootstrategie van de Fynth. Zoals vermeld in Subsectie 4.1.3, zorgt de sencoder voor abstractie van de nootinformatie. De sencoder houdt de noten met een volgnummer van 0 tot 7 bij. Wanneer hij de implementaties vraagt een noot te beginnen spelen, bedient hij zich van broadcast boodschappen, onderdeel van het seri¨ele busprotocol. Daarin deelt hij de frequentie mee, `en het bijhorende nootnummer. Implementaties spelen dus geen bepaalde frequenties, veeleer spelen ze bepaalde noten, gekenmerkt door een bepaalde frequentie. Deze abstractie resulteert in een eenvoudige eis aan elke implementatie: “wees in staat acht noten te verwerken”. De stategie om dit te bekomen loopt gelijk aan die van de ontdubbeling: i.p.v. lompweg acht verschillende hardware-blokken elk naar ´e´en noot te luisteren, integreren we alles in ´e´en implementatie. Elke implementatie houdt een tabel bij, met nootinformatie voor acht verschillende weer te geven noten. De chronos timing strategie wordt opnieuw uitgebreid: 1. De pad-duur is constant. 2. Elke implementatie ontvangt van buitenaf acht stimuli per trage klokcyclus. Het volstaat nu dat chronos elke implementatie acht keer van busenables voorziet, opdat het geheel zou fungeren. Ten opzichte van de situatie met ´e´en noot moet chronos het patroon dat hij volgt per trage klokperiode acht keer herhalen. Op die manier is de polyfonie ge¨ımplementeerd. Ter illustratie van de geschetste time scheduling, geeft Figuur 4.5 de busenables schematisch weer. Er dient opgemerkt dat het weergegeven schema zestien keer herhaald wordt per trage klok. In de snelle klokcycli die dan nog overblijven binnen ´e´en trage klokperiode, zwijgt chronos, en gebeurt er niets op de parallelle bus. Verder merken we nog op dat er busenables voorzien zijn voor zes oscillatormodules, dat is ´e´en meer dan er in hardware aanwezig zijn. Reden is dat deze voorziening er reeds is voor de custom module, die, zoals betoogd wordt in Hoofdstuk 5, een welkome uitbreiding vormt. Besluitend stellen we dat de hi¨erarchie drielagig is geworden. De 14 modules uit 56
Figuur 4.5: Schema van de door chronos uitgedeelde busenables
Tabel 4.1 herbergen in het totaal 43 implementaties; elke implementatie kan acht verschillende noten weergeven.
4.1.8
Parti¨ ele Herconfiguratie
Ofschoon de uitleg rond de functionaliteit van de afzonderlijke blokken totnogtoe heel summier was, kreeg de patch-filosofie in bovenstaande een breed betoog. Om die reden achten de auteurs de tijd reeds rijp voor een blik op parti¨ele herconfigureerbaarheid. Parti¨ele herconfigureerbaarheid kan men in twee contexten benaderen: de eerste in context van de hardware, de tweede in de context van patchen.
• In de context van hardware betekent parti¨ele herconfiguratie het toestaan van de gebruiker om, tijdens het spelen, implementaties of ganse modules in- en uit de hardware te laden, zonder dat het spel onderbroken moet worden. Dit, gelinkt aan een eventuele schaalbaarheid, biedt voordelen. Het ware een tegemoetkoming naar de gebruiker toe, om de eindige grootte van de chip te compenseren met “chip-overstijgende” speelmogelijkheden. De ontwerpers hebben zich hier niet in verdiept; voor een verdere discussie verwijzen we naar Hoofdstuk 5, Subsectie 5.2.1. • In de context van patchen betekent parti¨ele herconfiguratie het toestaan van de gebruiker om, tijdens het spelen, de patch aan te passen. De gebruiker is e.g. in staat om, tijdens het spelen, een extra oscillatorimplementatie aan een extra ADSR-implementatie te hangen, en deze naar de mixer te leiden. Dit is de gebruiker mogelijk door de gewenste extra modules ´e´en voor ´e´en van het juiste doeladres te voorzien. 57
Eenmaal dit gedaan is kan de gebruiker spelen. Om precies te zijn zal de uitbreiding beginnen meespelen, zodra de extra ADSR-implementatie als doeladres het adres van de mixer ontvangen heeft. Naadloos zal het instrument weerklinken met, bovenop de klanken van de reeds aanwezige implementaties, ook de klanken van de extra oscillator met ADSR-omhullende. Omgekeerd kan de gebruiker ook “at runtime” ganse takken in de patch afschakelen. Hij doet dit door het doeladres van de betrokken implementaties op nul te zetten, te beginnen bij de module die naar de mixer schrijft, en dan verder terugkerend naar de oscillator, bron van het geluid15 . Deze vrijheid heeft de Fynth te danken aan het feit dat alle implementaties op elk moment werken16 . Dankzij deze ontwerpskeuze houden alle modules de actieve noten bij, en schrijven ook op elk moment hun gepaste uitgangen op de parallelle bus. Zolang hun doeladres op nul staat, gaan de boodschappen verloren; zodra hun doeladres naar een echte module geschreven wordt, worden de berekende waarden benut.
4.2
The Big Picture
Teneinde de blik breed te houden, nemen we even afstand van de organisatie binnenin de chip, en kijken naar de grotere omgeving. We beschouwen de “randapparatuur” van de chip, de context die noodzakelijk is om de Fynth als toetsenman te bespelen.
4.2.1
De Opstelling
We willen de Fynth bespelen. Wat hebben we nodig? Sommen we vooreerst de benodigde hardware op. Een ontvangende computer We hebben nood aan een PC die onze PCI-kaarten behuist, en hen van elektrische voeding voorziet. Bovendien moet het een LINUX-machine zijn, daar de besturings-software een LINUX-programma is. Het toetsenbord (bij voorkeur QWERTY, door het software-ontwerp). Verder moet er een “MIDI in” voorzien zijn. 15 Het staat de gebruiker vrij eender welke volgorde te hanteren bij het afkoppelen. De geschetste is de enige die in alle situaties verzekert dat er geen ongewenst, ander geluid uit de Fynth vloeit tijdens het afkoppelen 16 Zoals reeds vermeld in een voetnoot in Subsectie 4.1.4, was dit in vroegere ontwerpsversies niet mogelijk. De hier genoemde vrijheid vergde het volledig wegwerken van elke vorm van obligate initialisatie in de Fynth. Het enige wat aan initialisatie rest is de soft reset operatie, die het nootgeheugen ledigt.
58
c ALTERA PCI Development Kit, Stratix Edition Deze kit omvat het Stratix c PCI Development Board (waar de Fynth huist), Quartus II software (zie c software) en een Download Cable (om het kaartje met Quartus II te kunnen programmeren).
Twee RC laagdoorlaatfilters Deze halen de storende harmonischen van de deltasigma-modulatie uit het uitgaande signaal van het kaartje. Bij dit ontwerp zitten beide filters met plakband aan een dun audiokabeltje geplakt. Een geluidskaart en boxen Deze, of elk ander analoog audiosysteem, geven de analoge audiosignalen weer via boxen. Een MIDI Keyboard en MIDI kabel Het keyboard wordt aan de PC verbonden met een MIDI kabel, via de “MIDI in”. Bekijken we nu de benodigde software. Linux De Fynth wordt bestuurd vanuit Linux. Hermes Hermes is de besturings-software van de Fynth. Zij is van de hand van de ontwerpers, en is geschreven in C. Bij het programma worden enkele voorbeeldpatches en demo’s meegeleverd. De code is gebaseerd op het programma pcicp [1]. c Quartus II , en een geldige sof-file Met behulp van het programma Quartus c
II en de download Cable is de gebruiker in staat te herprogrammeren, zodat de Fynth in de chip belandt. Om te programmeren is er nood aan een “sof-file”, een bestand met extensie “.sof”, die de verbindingsinformatie bevat, nodig om de chip om te trimmen tot de Fynth.
Met deze opstelling zijn we klaar om de Fynth te laten draaien.
4.2.2
Van Keyboard tot Boxen
Bekijken we opnieuw de eenvoudige patch van Figuur 4.4. Stel dat het onze wens is deze patch als instrument te bespelen. Hoe gaan we daartoe te werk? Vooreerst verzekeren we dat de Fynth in de chip aanwezig is. Dit doen we door c met Quartus II de sof-file van de Fynth in de chip te laden. Na de herprogrammering drukken we op de “user reset” knop op het kaartje, teneinde alle registers op nul te initialiseren. Vervolgens verzekeren we dat, op de ontvangende Linux PC, de connectie over de
59
PCI bus functioneert17 . We sluiten ook het MIDI keyboard aan op deze PC, en starten Hermes. We volgen de aanwijzigingen op het scherm, die ons toestaan patchen in te laden, demo’s af te spelen,... Om de patch van Figuur 4.4 te bekomen volstaat het de vanuit software beschikbare patchlist “pioneersquare.txt”, beschikbaar onder het Patch Menu, te versturen. Zodra de patch ingeladen is kan het spelen beginnen. Na afsluiten van Hermes is de Fynth niet meer bereikbaar via PC klavier of MIDI klavier. Evenwel blijven alle nog actieve noten klinken, daar de hardware onafhankelijk van het programma verder werkt.
4.2.3
De Software
Over de software moet in dit document niet te veel uitgewijd. De software is duidelijk niet het hoofddoel van een hardware-ontwerp; om die reden houden we dit onderdeel heel kort, en bekijken alles vanuit het gezichtspunt van de hardware. Een MIDI-Kanaal De software is in staat om in MIDI Mode te gaan. Op dat moment legt ze een kanaal tussen het MIDI keyboard en de Stratix kaart. De rol van de software in MIDI Mode is beperkt tot het omzetten van note on en note off boodschappen, en het verzenden van de vertaalde boodschappen over de PCI bus. De input van de conversie zijn nootboodschappen in MIDI protocol, de output zijn nootboodschappen in PCI Bus Protocol (Dit protocol is een Fynth-eigen protocol, en wordt nader toegelicht in Sectie 4.5.). Na de conversie verstuurt de software de nootboodschap over de PCI bus, naar de Fynth. Noteer dat deze bewerking een real-time actie is, waarop het oor weinig vertraging duldt. De vertraging t.g.v. het gebruik van MIDI, inherent aan het MIDI-protocol, is al van de grootte-orde ms; gelukkig blijken de andere tussenstappen snel te verlopen: verzending over PCI neemt een, ofschoon niet constante, toch heel korte tijdspanne in beslag; de verwerking in hardware neemt zoals vermeld slechts een 100 µs in. Zo blijft de totale vertraging aanvaardbaar. Een Actieve Patcher De software kan, vertrekkend van een tekstuele patchlijst, de Fynth configureren met de in tekst genoteerde patch. Om dit te bekomen maakt Hermes gebruik van het Patch Protocol. Meer details 17
Na herprogrammering van de kaart verliest de kaart zijn PCI-identiteit op de PCI bus. Een afdoende oplossing is Linux heropstarten.
60
hierover zijn te vinden in Sectie 4.5. Hier volstaan het ons te zeggen dat de gebruiker een comfortabel protocol ter beschikking staat, dat hem toelaat patchlijsten te cre¨eren in tekstformaat. Op die manier ontsnapt hij aan de kwelling patchlijsten te schrijven in getallen, of – erger nog – hexadecimale code. Een Bestuurder Over de rol van de software moet, tot slot, benadrukt worden dat zij een cruciale rol speelt in de totstandkoming van de noten. In de bovenvermelde conversie van MIDI protocol naar PCI protocol voert zij immers een niet triviale vertaling door: ze vertaalt de toetsnummers (afkomstig van het MIDI klavier) naar frequenties18 . De frequenties zijn genoteerd in Fynth frequentievoorstelling, zoals toegelicht in Hoofdstuk 2.
4.3
Look Closer
In deze sectie willen we terug focussen op de hardware zelf. We bekijken eerst enkele bijzonderheden nader, die in Sectie 4.1 nog onbesproken waren: de notie van controle- en geluidssignalen. In de sectie, volgend op deze, geven we per module een exhaustieve opsomming van de mogelijke commando’s. In deze sectie willen we al een aanloop naar die volgende nemen, door enkele operaties te bespreken die bij meerdere modules voorkomen.
4.3.1
Geluidssignalen en controlesignalen
Geluidssignalen Geluidssignalen worden in de Fynth voorgesteld door 18 bit brede fixed point data, die geluidsmonster per geluidsmonster aangemaakt wordt door oscilatormodules. Eenmaal geproduceerd, ondernemen de geluidsmonsters volledig individueel hun tocht op de parallelle bus, verpakt in een parallelle bus-boodschap. Afhankelijk van het doeladres waarvan de boodschap voorzien is, gaat de geluidsmonster onherroepelijk verloren (als de eerste 4 bit van de doeladres 0 zijn, dit is 18 Binnen de ontwerpsfilosofie gezien is dit veeleer een inconsequentie; er zijn eleganter oplossingen denkbaar, waarbij een conversietabel van nootnummer naar frequentie in hardware bijgehouden wordt. De software houdt dan op noodzakelijke bestuurder te zijn. Dit is trouwens een conditio sine quae non voor de uitbreiding, vermeld in Sectie 5.2.2 van Hoofdstuk 5.
61
de drain), of wordt binnengenomen in een andere implementatie 19 . In de andere implementatie ondergaat het geluidsmonster een verwerking, tot hij weer in een parallelle bus-boodschap de bus opgegooid wordt. Als het lot hem gunstig gezind is, bereikt het geluidsmonster na verloop van tijd een mixerkanaal; daar vloeit hij in de figuurlijke zee van de accumulator, wiens inhoud bij de aanvang van de volgende trage klokcyclus naar de deltasigma modulator gaat. Het geschetste verhaal is het lot van een geluidsmonster. Controlesignalen Een heel ander lot vergaat het de controlesignalen, en hun controlemonsters. Alle geluidsmonsters en controlemonsters zijn gecre¨eerd door oscillatoren. Bij controlemonsters is het evenwel nooit de bedoeling dat ze de uitgang bereiken. Geluidssignalen dienen om geluid te maken, controlesignalen om de parameters van andere implementaties te controleren. Het totaal verschillende doel uit zich conceptueel in een bijzonder onderscheid: de frequentie-representatie verschilt. De maximaal weergeefbare frequentie van een sound oscillator is de helft van de bemonsteringsfrequentie, of 16kHz. De maximaal weergeefbare frequentie van een control oscillator is een 1/256e van de bemonsteringsfrequentie, of 125Hz20 . Reden van dit verschil is louter conceptueel: een controle-oscillator werkt gewoonlijk aan relatief lage frequenties, in de grootte-orde 1Hz. Het verschil tussen geluidssignalen en controlesignalen is ook op de parallelle bus aanwezig. In het parallelle bus-protocol is een veld van ´e´en bit voorzien, een tag genaamd “control/sound”, om aan te duiden of de verzonden waarde een controleof geluidsmonster is, respectievelijk de waarde 1 en 0. Over de productie van controlesignalen: alle modules, behalve de mixer, kunnen zo ingesteld worden dat de waarden aan hun uitgang controlesignalen zijn. Zij doen dit ongeacht de origine van het gecre¨eerde monster: of het monster nu binnenkwam als geluidsmonster, of het integendeel gaat om een zelf gegenereerde monster, steeds zal de uitgaande monster de markering van controlemonster dragen. Samenvattend betekent controle-implementatie zijn: • dat de module het veld “control/sound” in de uitgaande parallelle bus-boodschappen hoog zet • dat de module werkt met de controle-frequentie-representatie 19
Men notere hier het gebruik van het woord implementatie. Het is namelijk mogelijk dat ´e´en implementatie naar een andere implementatie van dezelfde module schrijft. Dit is in overeenstemming met de stelling dat de verschillende implementaties kunnen gezien worden als conceptueel gescheiden blokjes, elk met eigen toegang tot de parallelle bus. De implementaties werken volledig apart, niets houdt hen tegen om onbeperkt (ongeacht hun fysische locatie, mogelijks in dezelfde module) naar mekaar te schrijven. 20 Een geluidsoscillator is een oscillator die geluidsmonsters produceert; een controle-oscillator produceert controlemonsters.
62
Een typische situatie is een geluidsoscillator, die door een controle-oscillator in frequentie gemoduleerd wordt. In het geval van een controlefrequentie van 1 Hz, betekent dit dat de geluidsoscillator geluid zal produceren, waarvan de frequentie niet constant is, maar schommelt rond de nootfrequentie met een periode 1 Hz, en een variatie-grootte evenredig aan het volume van het controlesignaal. Het mag de lezer duidelijk zijn dat het wenselijk is dat de precisie van frequentieregeling rond waarden van 1 Hz zo hoog mogelijk moet zijn; alleen om die reden heeft de controleoscillator een andere representatie. De andere typische situatie is de sync van een geluidsoscillator door een controleoscillator. De geluidsoscillator wordt in dat geval gereset in fase, telkens de controle-oscillator een nuldoorgang met positieve afgeleide heeft. In dit geval speelt alleen de frequentie van de controle-oscillator een rol, niet het volume. modulenaam onder woorden square sawtooth triangle sine noise ADSR filter delayline delayline (p.o.) middleman mixer
gemoduleerde parameter frequentie of sync frequentie of sync frequentie of sync frequentie of sync x
sustain cut-off frequentie panning panning x x
Tabel 4.2: Overzicht van de door controlesignalen gemoduleerde parameter, per module
Zo gaat het ook voor de andere modules. We verwijzen naar Tabel ?? waarin van alle modules weergegeven is welke parameter door inkomende controlesignalen gemoduleerd wordt. De modules met een x negeren controlesignalen. Verder dient opgemerkt dat alleen de oscillatoren een keuze hebben wat betreft de gemoduleerde parameter. Standaard staan ze ingesteld op modulatie van de frequentie, met het oscillatorcommando “sync/mod and control/sound” kan daar evenwel verandering in gebracht worden.
4.3.2
Enkele verbreide Operaties
Boodschappen stromen in de Fynth binnen via de PCI input. Alle boodschappen zijn geformuleerd in het PCI protocol. Ze hebben een veld waarin de operatie aangeduid wordt, die met de in de boodschap meegegeven waarde dient uitgevoerd te worden. 63
Ze gaan eerst naar de sencoder. De sencoder maakt, zoals vermeld in Subsectie 4.1.3, onderscheid tussen patchboodschappen en nootboodschappen. Hij zet beide types op de seri¨ele bus; de eerste ongewijzigd, de tweede door hem gewijzigd. Het protocol dat nu heerst is het seri¨ele protocol, ook deze boodschappen hebben een veld “operatie”. Het parallel protocol heeft geen veld operatie meer; alle boodschappen zijn monsters. Het doel van deze subsectie is reeds enkele operaties toelichten, die bij meerdere modules voorkomen. Een integrale lijst per module wordt pas gemaakt in de volgende sectie. Soft Reset Soft reset heeft tot doel het nootgeheugen van een module te ledigen. Op die manier “vergeet” de module met welke noten hij bezig was. Soft reset treedt op als initialisatie-commando, en grijpt om die reden niet in op implementaties (zoals bij de meeste operaties het geval is) maar op ganse modules. De operatie is van kracht voor alle muziek-modules, en de sencoder. Na een soft reset blijft alle patch informatie behouden. Dit betekent dat, wanneer de Fynth juist een nieuwe patch kreeg ingeladen en er nog niet gespeeld is, de soft reset een nuloperatie is, en niets wijzigt. Toegepast op alle modules tegelijk, levert de soft reset een mute, een verstomming van de Fynth op. Op ´e´en module toegepast, hangt het effect sterk af van de module, en de concrete patch. Doeladres Deze operatie kan aan alle muziek-modules meegegeven worden, met uitzondering van de mixer. Ze stelt het doeladres in, of voluit “het doeladres op de parallelle bus”. Het doeladres op de parallelle bus, een deel van de hoofding van elke parallelle busboodschap, heeft een vaste lengte van 8 bit: 4 bit om de module aan te duiden, 4 bit om het implementatienummer aan te duiden. Toch heeft de operatie target niet steeds een lengte 8 voor zijn argument. De oorzaak is tweeledig: • De implementatie heeft ´e´en kanaal als ingang, maar twee kanalen als uitgang. De implementaties van de module delay line zijn in dat geval. • De operatie target wordt benut om, naast het doeladres, ook andere parameters mee te geven, zoals de control/sound-status. Om deze redenen varieert de syntax van het target commando over de modules heen. Voor details refereren we aan de uitleg per module, zoals uiteengezet in de volgende sectie. 64
4.3.3
Een Verbreid Proces – Noise Generator
Dit proces dankt zijn bestaan aan audio-technische overwegingen, en komt voor in bijna alle modules die de Fynth rijk is. Het produceert quasi-witte ruis.
Figuur 4.6: De acht mogelijke overgangen van regel 30
De ontwerpers implementeerden de ruisbron met een cellulaire automaat. Er wordt gewerkt met een 32 bit breed register, en met een heel simpele regel, regel 30. Het register evolueert elke snelle klokcyclus naar een volgende toestand; de nieuwe toestand wordt direct ingeschreven in hetzelfde, enige 32 bit register. Om de overgang te bepalen, vertalen we, per drie aanwezige bits in het originele register, naar een nieuwe bit. We doen deze vertaling conform regel 30. Deze regel is ge¨ıllustreerd in Figuur 4.6. De zwarte vakjes stellen waarde 1 voor, de witte waarde nul. De bovenste regel stelt de oude toestand voor, de onderste de nieuwe. Om randcondities te mijden (die de willekeur in de weg staan) werken we cyclisch, m.a.w. de nieuwe bit 31 wordt bepaald uit oude bit 0, bit 31 en bit 30. Ter illustratie staat de evolutie ook in de tijd aangegeven in Figuur 4.7. Het algoritme vergt slechts dit ene register als geheugen, en vergt vermenigvuldigingen noch delingen. Om die reden is het heel aantrekkelijk voor hardwareimplementatie.
Figuur 4.7: De evolutie van regel 30 in de tijd
Men notere dat de keuze voor cellulaire automaten eerder een “dissidente” is 65
binnen de audiowereld. Gewoonlijk wordt er met de methode van lineaire congruentie gewerkt. Deze methode werkt op basis van een recursieve betrekking: Xi+1 = (a.Xi + c)mod(m); met i = 0, 1, ... X0 is de seed, a is de constante vermenigvuldiger, c is het increment, m de modulus. Deze methode levert tevens een eenvoudige implementatie, daar de modulo-operatie, in het geval dat a en m machten van 2 zijn, geen delingen vergt. De uitgang van beide processen is met goede benadering witte ruis. Eventuele “minder witte karakteristieken” brengen geen schade aan de globale werking van de Fynth, en in zekere zin was de keuze voor een specifieke implementatie arbitrair, daar beide “voldoend witte karakteristieken” hebben. Evenwel vergt de eerstgenoemde zelfs geen optelling, om die reden genoot het de voorkeur.
4.4
De Modules
Na de schets van de chipinhoud (de Fynth), het grote beeld (de opstelling), en de rol van de diverse soorten boodschappen, is de tijd rijp om tot het bot te gaan: we bespreken de module-opbouw in dit onderdeel, en de boodschap-opbouw in de volgende. In deze sectie leggen we ons toe op de fijnstructuur van de modules. We analyseren ze ´e´en voor ´e´en en we wijzen op anatomische gelijkenissen en verschillen tussen modules onderling. Met deze sectie zal het skelet van de Fynth tot op het laagste niveau blootgelegd worden.
4.4.1
Chronos
Over de module chronos werd al breedvoerig uitgewijd in Subsectie 4.1.7, in het bijzonder in het onderdeel “Polyfonie”. Chronos is met gescheiden lijnen verbonden met alle muziek-modules, behalve de mixer. Chronos is op geen enkele manier bereikbaar voor de gebruiker, en is een eenvoudige Moore machine. De taak van deze module bestaat erin de toegangen tot de parallelle bus te regelen. Hij doet dit door beurtelings busenables te versturen over de verschillende lijnen. Het schema van de busenables is te zien op Figuur 4.5.
4.4.2
Deltasigma
De deltasigma modulator is de eindtrap van de Fynth. Deze module zit niet op de parallelle bus, is niet toegankelijk voor de gebruiker. Ze heeft twee ingaande en uit66
Figuur 4.8: Schema van de deltasigma modulator
gaande, volledig gescheiden kanalen (een linker- en rechterkanaal). Haar ingangen zijn verbonden met de uitgangen van de mixer; haar uitgangen vormen de uitgangen van de Fynth zelf, en zijn doorverbonden met de pinnetjes op het Stratix kaartje. Op Figuur 4.8 is een schema van de module weergegeven. We houden in gedachten dat dit slechts ´e´en van beide kanalen is, laat ons zeggen links; het rechterkanaal is volstrekt gelijk qua opbouw. De weergegeven input is 18 bit, en is de uitgang van het rechter mixerkanaal, vermeerderd met twee bits. De output is een 0 of 1, en wordt rechtstreeks afgeleid uit de 18 bit brede value, als zijnde de tekenbit. Hoe gaat dit fenomeen te werk? Op hoger abstract niveau volstaat het te zeggen dat de deltasigma modulator streeft naar “goede gemiddeldes”. De modulator cre¨eert aan zijn uitgang nullen en enen aan een tempo van 33Mhz, terwijl zijn input slechts varieert aan 32kHz. Op die manier heeft hij 1042 cycli lang dezelfde, 18 bit brede waarde aan zijn ingang. Hij streeft er nu naar om, als we de gemiddelde waarde maken over de 1042 nullen en eentjes aan zijn uitgang, zo goed mogelijk de fixed point waarde van de ingang te benaderen in numerieke grootte. Dit herhaalt hij voor elke nieuwe waarde, beschikbaar gesteld aan zijn input, 1042 klokcycli lang. Het volstaat het uitgaand signaal naar een laagdoorlaatfilter te sturen, om het laagfrequent signaal terug ten gehore te brengen. Hoe werkt de schakeling? Ter illustratie staat een voorbeeld op Figuur 4.9. Zeggen we ook eerst waarom de input uitgebreid werd met twee bit: om overflow te voorkomen. Er zijn twee optellingen in het spel, die per optelling een extra bit plaats vereisen21 . 21 Door de aard van negatieve feedback zijn er slechts deze twee nodig, en kan er geen overflow optreden door resonanties in de feedbacklus.
67
Figuur 4.9: Voorbeeld van de deltasigma modulatie van de waarde -1/4
De input, in het voorbeeld de waarde -1/4 wordt aangelegd. De value resulteert eruit. Deze value wordt enerzijds teruggekoppeld, anderzijds geeft ze aanleiding tot een uitgang middels haar tekenbit. De tekenbit zelf vormt bovendien de beslissingsregel om hetzij de feedback te verminderen met 1/2 (in het geval de value groter dan 0), hetzij te verminderen met 1/2 (value kleiner dan 0). Resulterend is het error-signaal, dat op zijn beurt value be¨ınvloedt. Kijken we naar het voorbeeld, dan zien we hoe de terugkoppellus, na een korte transi¨ent, reeds voldoet met een periode vier. Dit resultaat is tevens vatbaar voor intu¨ıtieve interpretatie: vier keer ´e´en of nul volstaat inderdaad om −2−2 , of -1/4 als exact gemiddelde te bekomen. We begrijpen ook hoe de volstrekt audiovreemde periode van 4 snelle klokcycli gemakkelijk met een laagdoorlaatfilter kan gestopt worden. Langere terugkoppelperiodes kunnen zich voordoen, maar blijven keurig boven de 16kHz, het grootst voorstelbare audio-signaal. Zij interferen dus niet met het eindresultaat, het audiosignaal.
4.4.3
Een Algemene Muziekmodule
Gaan we nu dieper in op de opbouw van een algemene muziek-module. In principe hebben alle muziek-modules een eigen unieke anatomie. Vaak blijkt er echter sprake van verschillende rassen, veeleer dan echt verschillende soorten. Om die reden is het heel zinvol van een algemeen schema te vertrekken, die het meest aanleunt bij de opbouw van de oscillatoren.
68
Figuur 4.10: Algemene Opbouw van een Muziek-Module
De Module Op Figuur 4.10 wordt de opbouw van een module weergegeven. Om ons niet te laten overrompelen door de complexiteit van de figuur, geven we het commentaar eerst op macro-niveau, en wijden ons gaandeweg aan de kleinere schaal. De blok in stippelijn is de module zelf. Ze is geconnecteerd met parallelle en seri¨ele bus, zoals ook aangegeven op Figuur 4.1. Ze heeft als ingaande signalen de 33MHz snelle klok, die het tempo opgeeft aan alle FSM. Ze heeft het signaal busenable als ingang, dat komt van chronos en het parallelle bus-verkeer regelt. Ze heeft een ingaande resetlijn, deze is verbonden met de “User Reset Pushbutton”, en dient om alle registers op nul te zetten. Ze heeft ook een multiplying clock als ingaand signaal, we noemen dit de vermenigvuldigingsklok. Deze is niet te verwarren met de snelle klok; de vermenigvuldigingsklok draait vier keer zo snel als de rappe klok (dat maakt 133Mhz), vereist PLL’s, en dient om de snelheid van de vermenigvuldiging op te drijven. Hierop wordt dieper ingegaan in Appendix C.
69
Processen en Geheugen De zes blokken binnenin zijn vijf processen, en in het midden een geheugenblok. De geheugenblok dient voor de stockering van informatie van alle implementaties, en van de noten. Twee processen dienen louter om de communicatie met seri¨ele en parallelle bus tot stand te brengen: de seri¨ele decoder en de parallel decoder. E´en proces dient om de wijzigingsinformatie, binnenkomend van de seri¨ele bus, in het geheugen weg te schrijven. Een ander proces dient om de specifieke functie van het blok te effectueren, e.g. voor een ADSR is dit het aanbrengen van een volume-envelope. Een laatste proces is de noise generator. Geheugen De geheugenblok heeft, behalve conceptueel, ook fysisch deze rechthoekige vorm: het gaat om een M4K blok. Het is tweepoort-RAM, die in de chip ge¨ıntegreerd zit. Het doel van het geheugen is het bijhouden van implementatie- en noot-informatie. De implementatie-informatie geeft aan hoe een bepaalde implementatie 22 functioneert. Zij wordt bijgehouden in de implementatie-sectie van het geheugen. De noot-informatie is eigen aan een implementatie, en bevat de ogenblikkelijke fasewaarden voor elke noot23 . De fasewaarden geven e.g. aan hoe ver de noot zat in de weer te geven periode, in het geval van de oscillator. Zij wordt bijgehouden in de noot-sectie van het modulegeheugen.
De Seri¨ ele Decoder De seri¨ele decoder decodeert de boodschappen van de seri¨ele bus. Ze doet op geen enkele manier aan adresherkenning, en wordt enkel geactiveerd door een nieuwe binnenstromende waarde. Zodra de 32 bit brede boodschap in ´e´en register zit, geeft de seri¨ele decoder aan de settings changer te kennen dat de nieuwe boodschap gereed zit. De settings changer neemt de boodschap in en zet, zodra de boodschap verwerkt is, het signaal changer ready op hoog. De processen doen aan hand-shaking 24 . 22
We herinneren eraan hoe elke module verscheidene implementaties kan herbergen. Deze moeten volledig onafhankelijk draaien, om die reden omvat implementatieinformatie steeds een waarde voor het doeladres, en de huidige instelwaarden van de door de gebruiker modifieerbare parameters. 23 Het betreft informatie van alle 8 noten, ´e´en keer voor elke implementatie apart. Voor 6 implementaties betekent dit 48 noten. 24 Deze vorm van inter-proces communicatie werd veelvuldig toegepast. De ontwerpers ervaren hem als robuust en betrouwbaar.
70
Parallel Encoder/Decoder De werking van de parallelle encoder/decoder is zeer gelijklopend. Het proces heeft twee modi om te opereren. • Ze haalt binnenkomende boodchappen in ´e´en keer binnen en stockeert het in haar buffer-register. Op dezelfde manier als geschetst voor het serieel geval, doet ze aan handshaking met haar collega settings changer. • Ze reageert op impulsen (het kortstondig op ´e´en gaan) van het function ready signaal, komend van het proces “the function”. Ze neemt op dat moment de function output binnen in haar uitgaande buffer, en gooit het op de parallelle bus na groen licht van chronos (busenable signaal). Men notere dat de modi nooit kunnen interfereren, daar de chronos time scheduling hun werking orthogonaliseert in de tijd. Settings Changer Settings changer is een luisteraar. Hij verwerkt boodschappen van twee inkomende bronnen, en vertaalt ze in wijzigingen, aan te brengen in het geheugen. Zodra hij een boodschap binnenkrijgt van ´e´en van beide encoders, genereert hij zijn vertaling: • Hij determineert of het om een patch-boodschap of een noot-boodschap gaat. In het eerste geval zal hij het geheugen in de implementatie-sectie wijzigen; in het tweede geval in de noten-sectie. • Hij bepaalt het bij de operatie horende geheugenadres, en schrijft de met de boodschap meegegeven waarde ernaartoe. We merken op hoe de beide inputs geenszins georthogonaliseerd zijn – het is goed mogelijk dat de inputs tegelijk de settings changer trachten op te eisen. Om die reden zorgden de ontwerpers voor een prioriteitsvolgorde: parallel gaat voor op serieel.
“The Function” “The Function” implementeert de door de module uit te voeren bewerkingen. Hier zit het ware karakter van de module, hier huizen alle structuren die de module zijn algemeenheid ontnemen, die ingebakken zijn. Voor e.g. de square bouwt “The Function” de blokgolf op, voor de ADSR vermenigvuldigt zij de geluidsmonsters met het gepaste volume. 71
Wie “The Function” beter wil begrijpen, ziet het best als een rigide, onverstoorbare automaat. Ze pakt in elke trage klokcyclus elke noot van elke implementatie aan25 . Dit simpele, statische gedrag maakt dat gewoon weergeven van actieve noten de meest “reguliere” situatie is in hardware, zoals het hoort; het veranderen van noten of patch info daarentegen (de settings changer) wordt gezien als exeptionele handeling. “The Function” voert klakkeloos uit wat in het geheugen te lezen staat. Hij haalt daarvoor, voor elke noot opnieuw, alle nodige parameters op uit het geheugen. Deze informatie omvat: • Nootinformatie die niet gewijzigd wordt door “The Function”; dit zijn de frequentie en de offset. • Nootinformatie die gewijzigd wordt door “The Function”, zoals de fase. • Patch Informatie, eigen aan de implementatie. Deze informatie omvat alle parameters, die niet ingebakken zitten in “The Function”, en de gebruiker toestaan de werking te tunen. “The Function” wijzigt deze nooit. Met deze informatie concipieert “The Function” het monster voor de uitgang. Hij geeft deze na afwerking door aan de parallelle bus, enige uitgang van de module. “The Function” krijgt nooit rechtstreeks te maken met seri¨ele of parallelle bus. Alle via deze kanalen aangebrachte wijzigingen hebben hun repercussies op de uitgang via het geheugen om. We noteren nog hoe weer twee processen in ´e´en geheugen bewegen. De meerderheid van de geheugenwaarden is veilig georthogonaliseerd (het ene proces schrijft, het andere leest). In een deel van de modules26 zijn er echter adressen die beschreven worden door beide processen. De ontwerpers vingen dit op door ook hier handshaking te implementeren, nu tussen Settings Changer en “The Function”. Noise Generator Dit proces dankt zijn bestaan aan audio-technische overwegingen. Het produceert quasi-witte ruis, zoals vermeld in Subsectie 4.3.3. Het doel van de bron is het aanbrengen van dither in het uitgaande monster. Voor de betekenis van dither verwijzen de auteurs naar Hoofdstuk 2. Het Noise Generator Proces produceert elke rappe klokcyclus een nieuwe ruiswaarde aan zijn output, deze is 17 bit breed27 . “The Function” neemt van al deze waarden 25
“The Function” doet dit sowieso, ongeacht of bepaalde noten werkelijk actief zijn. Passieve noten leveren een nulboodschap, wel degelijk een boodschap dus. 26 meer bepaald alle oscillatoren, en de ADSR 27 De dither dient toegevoegd aan het 36 brede register, dat bekomen wordt na vermenigvuldiging van het monster met, e.g. in het geval van de oscillatoren, het volume. We wensen neer te stappen naar woordbreedtes van 18 bit. Hiertoe moeten we, van de 34 niet-tekenbits van het brede register, 17 bit wegsnijden. Dit doen we door dithering met een breedte, ´e´en bit minder dan de weg te snijden string.
72
slechts af en toe ´e´en binnen, m.n. op het moment dat hij ruis nodig heeft om zijn monster af te werken, overeenkomstig de dither theorie. Algemeenheid De meeste modules, in het bijzonder de oscillatoren, zijn rechtstreeks ge¨ent op de uiteengezette structuur. Modules als ADSR, filter en delay line vertonen tevens sterke verwantschap. Het raamwerk van de mixer is anders, omdat zijn doelstelling fundamenteel verschilt (e.g. hij verstuurt zelf geen boodschappen op de parallelle bus). De module middleman heeft een eenvoudiger opbouw, omdat hij een veel eenvoudiger taak vervult.
4.4.4
Sencoder
De seri¨ele encoder vervult een tweeledige taak in de Fynth: hij encodeert seri¨ele boodschappen, en bemeestert de 8-notige polyfonie. Hij speelt de rol van de controller. Daar zijn werking volledig geori¨enteerd is op het “correct regeren” over de muziek-modules, schiepen de auteurs eerst een beeld van de “onderdanen”28 . De Vertaler Vertrekken we van Figuur 4.1. Sencoder is de bemiddelaar tussen input en modules. In formele zin treedt hij op als vertaler: van het PCI protocol naar het Serieel Protocol. Zijn optreden als vertaler staat reeds uitgelegd in Subsectie 4.1.3; in deze sectie gaan we dieper in op zijn rol in de polyfonie, als “Note Handler”. De Notenkraker Om 8 noten tegelijk te verwerken, heeft de Fynth nood aan bepaalde logica. Hoewel schijnbaar een verbreid, typisch synth-probleem, vonden de ontwerpers geen enkel voorbeeld in de literatuur, vatbaar voor implementatie in de Fynth. De enige oplossing bestond in het zelf uitdenken van deze structuur29 . 28
Net als in de ideale democratie bepalen de onderdanen de inhoud van de controle, en niet omgekeerd. 29 In den beginne waren de ontwerpers de mening toegedaan dat “note handling” een eenvoudig probleem is. Niets bleek minder waar, en het debuggen van de sencoder-code is wekenlang een hoofdbezigheid geweest.
73
Boodschappen De sencoder verwerkt nootboodschappen, ook wel broadcast boodschappen, en reageert dus op deze. Bovendien reageert hij nog op twee patch-boodschappen, die alleen voor hem bestemd zijn. codering in PCI protocol
0 1
naam van de operatie
breedte waarde (in bit)
aard waarde
operaties, in PCI protocol geschreven naar de module zelf soft reset x x unitone 1 Boolean
ingaande operaties, geschreven in PCI protocol als broadcast boodschap 1 glissando 18 unsigned int 2 note off 18 unsigned int 3 note on 18 unsigned int uitgaande operaties, geschreven in serieel protocol als broadcast boodschap 1 glissando 18 unsigned int 2 note off 3 unsigned int 3 note on 18 + 3 2x unsigned int
Tabel 4.3: Operaties van de sencoder
In Tabel 4.3 worden alle in het spel zijnde boodschappen vermeld. Men notere dat alle niet vermelde patch-boodschappen, en alle niet herkende boodschappen, ongewijzigd op de seri¨ele bus worden gezet.
Patchboodschappen Wat betreft de patch-boodschappen onderkennen we in Tabel 4.3 twee operaties. Unitone stelt de sencoder met een boolese variabele in ´e´en van zijn beide modi. De modes zijn acht-tonig (waarde 0) en ´e´en-tonig (waarde 1). In het eerste geval werkt de Fynth volwaardig, en verwerkt acht noten tegelijk. In het laatste geval geeft de Fynth slechts ´e´en noot weer. Deze functie is in het bijzonder nuttig voor glissando, een functionaliteit die alleen in unitone-modus ondersteund wordt. Soft Reset ledigt het geheugen van de sencoder.
74
Nootboodschappen Kijken we nu naar de noot-boodschappen. Tabel 4.3 getuigt van de omzetting die de sencoder doorvoert: hij vertaalt inkomende noot-boodschappen naar het serieel protocol. Hij zorgt voor het “bestempelen” van frequenties: de ene frequentie wordt verwerkt als noot 7, een andere als noot 2,... Het linken van een bepaalde frequentie aan een bepaalde noot-nummer gebeurt bij de aankomst van een note-on boodschap; het verband tussen nootnummer en frequentie blijft bewaard tot een note-off voor die frequentie aankomt. Wat is het nut van een dergelijk verband? Keren we terug naar het beeld van de algemene muziek-module. Zoals gezegd is de interne structuur ontdubbeld met verschillende implementaties, en verschillende noten. Het weze echter duidelijk dat de module slechts een bescheiden FSM is, die serieel de noten afloopt binnen een trage klokcyclus, en intelligentieloos een cyclus doorloopt, gestuurd door zijn nootgeheugen. Modules denken in noten; het is echter aan een externe module om te beslissen welke frequentie zal weergegeven worden door welk nootnummer: de sencoder. Het MIDI-keyboard vertelt de sencoder welke frequenties moeten beginnen of eindigen. De sencoder vertelt aan de modules welke noot moet beginnen of eindigen, en begroot op die manier de commando’s op maat van eenvoudige FSM. Om die reden bevatten zowel note-on als note-off boodschappen een nootnummer. Teneinde de modules mee te delen welke frequentie voor de startende noot moet gespeeld, wordt, behalve het noodzakelijke noot-nummer, ook de frequentie meegegeven. Voor een note-off boodschap is zulks niet meer nodig: de modules weten reeds wat ze aan het afspelen zijn, en zo komt het dat alleen het nootnummer volstaat. Wat zijn nu de verantwoordelijkheden van een note handler, v´o´or de opbouw en versturing van de boodschap over de seri¨ele bus ? We sommen op. • Het labelen van inkomende note-on frequenties met een nootnummer. • Het opzoeken van het nootnummer van binnenkomende note-off frequenties. • Het bijhouden van de noten die het langst geleden gede-activeerd zijn, om op verstandige manier oude noten met nieuwe te vervangen. Men merke op dat dit verschilt van de langst geleden geactiveerde noten30 . • Het limiteren van het aantal actieve noten (noten die in note-on staan, en nog niet gedesactiveerd zijn door een note-off boodschap) op acht. Komen er meer 30
Men kan zich voorstellen dat de muzikant een basnoot ingedrukt houdt, en tegelijk een hoge melodie speelt met de andere hand. Er dient over gewaakt dat de nog steeds actieve basnoot niet vervangen wordt door de noten van de hoge melodie; dit gebeurt met de geschetste strategie.
75
note-on boodschappen door (de gebruiker drukt meer dan acht noten tegelijk) dan worden die genegeerd. • Het negeren van overbodige note-off boodschappen. Soms stuurt een MIDI keyboard meer dan ´e´en note off; het is de taak van de sencoder de overbodigheid te detecteren, en te zorgen dat deze overbodige boodschap niet tot bij de modules raakt. • Het detecteren van meerdere note-on boodschappen op dezelfde frequentie. Er moet over gewaakt dat een bepaalde frequentie maximaal op ´e´en enkele noot actief is. Men mag een zelfde frequentie slechts weer in note on brengen, als ze eerst in note off gebracht is.
Figuur 4.11: Conceptueel Schema van de Note Handling
De geschetste verantwoordelijkheden lieten reeds vermoeden dat de implementatie niet triviaal is. Bekijken we nu het conceptueel31 schema van Figuur 4.11. De afgebeelde tabellen beslaan elk acht posities in het sencoder geheugen, elkeen achttien bit breed. 31
Het schema is geenszins een hardware-schema, om redenen van beknoptheid bepreken de auteurs het betoog tot de filosofie van de implementatie.
76
De Note Off Tabel geldt als FIFO32 . Ze stockeert een nootnummer in haar wachtrij, telkens de desbetreffende noot met een note-off boodschap gede-activeerd wordt. Anderzijds neemt ze een noot uit haar rij, telkens een note-on boodschap aankomt; de sencoder benut dit nummer om er de nieuw aangekomen frequentie op te activeren. In de extrema bevat de tabel acht noten als er geen enkele toets ingedrukt is (dit is ook de situatie na soft reset van de sencoder), nul noten als er acht of meer toetsen ingedrukt zijn. In het geval van enkele actieve noten bevat de FIFO de resterende vrije noten. De Note On Tabel is een opzoek-tabel. Ze verbindt aan elke noot (adres 0 tot 7) een welbepaalde frequentie (telkens 18 bit), en doet dit op elk moment. Na een soft reset van de sencoder staan alle frequenties op nul; dit betekent de facto dat de noten niet actief zijn. Telkens een note on arriveert, haalt de sencoder het te activeren nootnummer uit de note off FIFO, en schrijft op het door het nootnummer aangegeven adres de nieuw gearriveerde frequentie. Telkens een note off aankomt, zoekt de sencoder in de note on tabel op om welk nootnummer gaat, en zet er vervolgens de frequentie op nul. Hij zet het aangetroffen nummer op de note off FIFO, en zet het nootnummer ook op de seri¨ele bus met een note off boodschap. Een laatste taak van de note handler is het behandelen van glissando. De glissando-boodschappen leveren een noot-glijding op. De glissando wordt getriggerd door de aanslag van een nieuwe noot. Glissando bestaat erin om de overgang te maken van de oude naar de nieuwe noot op “een vloeiende manier”. In fysische termen betekent dit in een korte doch waarneembare tijdspanne de frequentie te laten “glijden” van de oude naar de nieuwe. Er wordt verondersteld dat sencoder in unitone staat. Dit betekent dat er slechts exact ´e´en noot gespeeld kan worden33 . In de verwerking verschillen glissando’s van note on en note off boodschappen. Daar deze optie alleen in unitone werkt, is het meegeven van een nootnummer overbodig – alleen noot 0 wordt gebruikt. Het commando doet in noot-opzicht een nuloperatie: er worden geen noten geactiveerd of gede-activeerd. De enige invloed is de aanpassing van de frequentie van de actieve noot. Een glissando wordt bovendien volledig gestuurd van buitenuit: het is de taak van de software om, in geval van glissando, tussenliggende, “interpolerende” frequenties te berekenen en door te sturen via de glissando-boodschap. Hiermee is de rol van de sencoder als note handler aangeduid; de auteurs beperken er zich verder toe te vermelden dat alle boven vermelde vereisten ook gehaald zijn dankzij enkele kunstgrepen in de code. 32
First In First Out, een wachtlijnstructuur Deze beperking heeft vooral te maken met muziektechnische overwegingen: indien drie stemmen gelijktijdig aan het glijden gaan, valt het resultaat bezwaarlijk nog esthetisch te noemen. 33
77
4.4.5
De Square
Het Prototype De square voldoet aan het schema van Figuur 4.10, en volgt ook de algemene werking zoals uiteengezet in Subsectie 4.4.3. Drie signalen dienen voor alle oscillatoren toegevoegd aan het schema, en lopen van Settings Changer naar “The Function”. Het gaat om “notechanger”, “noteinfo” en “noticed”. Het dient om het geval van note on boodschap te regelen: zodra deze arriveert wil de settings changer de fase van de oscillatie op nul zetten34 . Dit mag evenwel niet zonder permissie van “the function”, die in het algemeen de fase beheert. De oplossing is weer hand-shaking. Notechanger en Noteinfo geven te kennen aan “the function” dat er een note on is, en geven het nootnummer mee. “The function” zet zelf de fase op nul, en bevestigt aan settings changer door het signaal noticed hoog te zetten.
Signaalproductie Oscillatoren produceren signalen: ze berekenen 18 bit brede monsters en zetten ze op de bus. Oscillatoren doorlopen permanent hun acht noten, van de eerste tot de achtste, ongeacht of de frequentie verschilt van nul. Binnenkomende nootboodschappen kennen aan welbepaalde noten welbepaalde frequenties toe, en brengen de oscillator tot het resetten van de fase, telkens een nieuwe frequentie aan een noot wordt toegekend. De verschillende manieren om te reageren op nootboodschappen zijn evenwel divers. Fundamenteel zijn er drie modi waarin de oscillator kan functioneren, en waartussen de gebruiker met een patch-boodschap (sync/mod en control/sound) kan schakelen. De verschillende modi zijn gekenmerkt door de toestand van twee boolese waarden (sync/mod en control/sound), die in de hardware bepalen hoe het proces “The Function” omspringt met een groep van drie noot-variabelen. De drie noot-variabelen zijn de fase, de frequentie en de offset. • De frequentie is 18 bit breed en komt binnen in de oscillator via nootboodschappen. • De offset is tevens 18 bit breed en komt binnen via de parallelle bus. • De fase is 26 bit en wordt binnen het “The Function” proces aangepast. Uit de fase wordt, rekening houdend met de aan de oscillator specifieke golfvorm, het monster aangemaakt. De fase wordt gereset, telkens een nieuwe noot begint. 34
Dit om audio-technische redenen: het oor is niet fase-gevoelig, tenzij het om een start- of eind-punt gaat.
78
Met hun drie¨en bepalen zij volledig het gedrag van individuele noten, of beter, zijn zij het enige onderscheid in hardware tussen twee verschillende noten binnen dezelfde implementatie. Bekijken we nu nader de drie modi, alle als afzonderlijke implementaties binnen een module. Een GeluidsOscillator met frequentie-modulerende ingang heeft sync/mod op nul (modulerend) en control/sound op nul. Elke trage klokcyclus leest hij, voor elke noot apart, de huidige fase uit. Hij telt er een increment bij, en bepaalt daaruit de geluidsmonster. Het increment zelf wordt bepaald door de som van de frequentiewaarde, en de offset35 . Een GeluidsOscillator met sync-ingang heeft sync/mod op ´e´en (sync) en control/sound op nul. Hij werkt tevens met increment op de fase, doch nu bepaalt alleen de frequentie die. De offset treedt geheel anders op: ze doet de fase resetten, zodra haar teken van negatief naar positief gaat36 . Een controle-oscillator heeft control/sound op ´e´en. De optie sync/mod wordt genegeerd. Het increment op de fase wordt nu alleen bepaald door de offset; de frequentie wordt dus niet gebruikt. De offset kan ingegeven worden door de gebruiker tijdens het patchen, maar kan ook keer op keer binnenkomen via de parallelle bus. Deze werkwijze is ingegeven door de typische situatie, waarin een controle-oscillator een sound-oscillator in frequentie moduleert, en het niet gewenst is dat de variatiefrequentie afhangt van de toonhoogte van de noot. De aansturing van de controle-oscillator verloopt op een particuliere manier: telkens een nieuwe note-on boodschap aankomt, begint de controle-oscillator te “wachten”: hij wacht op een patch-boodschap, meer bepaald een offset-boodschap. Deze vertelt hem welke hij frequentie hij moet weergeven. Men notere dat deze boodschap in de software moet gebeuren, daar er geen patchintelligentie in de Fynth zelf aanwezig is; alleen de software weet wie controleoscillator is, en wie sound-oscillator. De Operaties De square wordt net als alle modules gecommandeerd vanuit de seri¨ele bus. De boodschappen zijn geformuleerd in het serieel protocol. Dit is een rechtstreekse vertaling van het PCI protocol, dat gehanteerd wordt door de gebruiker. Details over protocols staan uitvoerig beschreven in Subsectie 4.5. Hier beperken we ons tot een analyse van de operaties. Bekijken we daartoe het schema van de operaties 35
Het increment is letterlijk de som van frequentie en offset, er treedt dus geen multiplicator op. De oscillatie is dus gerealiseerd door twee simpele optellingen, een “comfort in hardware”. 36 In hardware-termen betekent dit dat alleen de eerste bit bekeken wordt, en de overgang van 0 naar 1 de fase-reset triggert.
79
waarop de square reageert, in Tabel 4.4. We merken direct op dat, behalve duty cycle, de operaties in voegen zijn bij alle oscillatoren. E`en kolom is gewijd aan de codering van de operatie, deze is identiek in PCI en serieel protocol. De syntax van de boodschap daarentegen kan bij de twee protocols verschillen; hier staat alleen het protocol waarmee de oscillator in contact komt, het serieel protocol. codering in PCI protocol
naam van de operatie
breedte waarde (in bit)
aard waarde
3 4 5 6
operaties geschreven naar de module zelf soft reset x x volume 18 signed int sync/mod and 2 2x Boolean control/sound frequency 18 unsigned int offset 18 signed int target 8 adres duty cycle 8 unsigned int
1 3
operaties geschreven als broadcast boodschap glissando 18 unsigned int note on 18 + 3 2x unsigned int
0 1 2
Tabel 4.4: Operaties van de oscillatoren, met hun digitale codering in het serieel protocol.
Soft reset leegt de waarden in de geheugenblok. Deze actie verzekert dat de oscillator geen activiteit vertoont; evenwel laat ze de de patch informatie ongeschonden. Ze stopt wel alle noten. Volume laat toe de uitzwaai aan de uitgang te regelen. Maximaal volume (0x1FFF) laat de 18 bit brede uitgaande monsters het volle bereik bestrijken; voor volume 0 ziet men aan de uitgang alleen nullen. Sync/Mod en Control/Sound staat toe twee boolese waarden mee te geven; beide boolese waarden zijn afzonderlijk te beschouwen, en hebben geen vast verband. Zij zetten een oscillator in een bepaalde modus, zoals toegelicht in het onderdeel over signaalproductie. Frequency dient om de frequentie mee te geven, die dient als noot-informatie. De rol hiervan wordt tevens toegelicht in het onderdeel over signaalproductie. Offset geeft eveneens noot-informatie mee, en staat toegelicht in het deel signaalproductie. Target geeft 8 bit target mee: 4 bit voor het module-adres, 4 bit voor het implementatie-nummer. 80
Duty Cycle wordt uitsluitend toegepast voor de square. Het is een parameter met bereik tussen 0 en 1, die toestaat om de golfvorm te modifi¨eren. Een square is een golfvorm die (in het genormeerde geval) slechts 2 waarden aanneemt: +1 en -1. De duty cycle geeft de fractie aan van de periode, waarin de waarde aan de uitgang het maximum is; de rest van de periode wordt opgevuld met als waarde het minimum. Een duty cycle van 0x80 levert een symmetrische blokgolf. Note On activeert een nieuwe noot, met de meegegeven frequentie. De noot-fase wordt op nul in het geheugen, en de noot-frequentie wordt ingeschreven. Note Off doet, merkwaardig genoeg, niets. We stellen het hier duidelijk en ondubbelzinnig: oscillatoren reageren niet op note off boodschappen. De dynamiek van volume-daling, wanneer de gebruiker de toets lost, wordt aan de gebruiker mogelijk gemaakt door een ADSR te verbinden aan de uitgang van de oscillator. Glissando heeft in de oscillator een heel eenvoudige uitwerking: de settings changer vervangt de oude frequentie telkens met een nieuwe. Zo gaat de glijding, dankzij vele discrete stapjes, continu klinken. Hiermee hebben we de werking van de square toegelicht; voor de andere oscillatoren blijft het merendeel van de voorgenoemde uitspraken gelden.
4.4.6
Sawtooth, Triangle, Sine en Noise
Omtrent de Sawtooth en de Triangle valt weinig nieuws te vertellen. Het zijn beide autonome modules met twee implementaties, die slechts verschillen van de square op enkele punten. • Het module-adres van de module sawtooth is 3, dat van de triangle is 4, sine 5 en noise 6. Dit wordt ook vermeld in Tabel 4.15. • Het proces “The Function” realiseert een andere golfvorm. – Sawtooth en Triangle cre¨eren het gekende stuksgewijze lineair verloop. – Noise laat de frequentie onbenut, en maakt integendeel gebruik van een gealtereerd Noise Generator proces. Waar het proces in de algemene muziekmodule ´e´en uitgang heeft van 17 bit, heeft het proces nu een uitgang van 18 bit, nodig voor het genereren van het geluidsmonster, en de uitgang van 17 bit voor de dithering. Beide uitgangen blijven evenwel afgeleid uit hetzelfde 32 bit brede register.
81
– Sine maakt in het proces “The Function” gebruik van een M4K geheugenblok, geprogrammeerd als ROM. Het bevat 4096 monsters van ´e´en periode van een sinus. De tussenliggende waarden bekomt “The Function” door interpolatie. Hiertoe is een vermenigvuldiging nodig, wat maakt dat de sine beslag legt op een deel van onze (kostbare) in de chip aanwezige DSP blokken. • Sawtooth, Triangle, Sine noch Noise hebben een duty cycle; dit betekent dat in Tabel 4.4, commando 6 vervalt. Behalve de bovengenoemde verschillen, zien alle oscillatoren er intern identiek uit, en laten zich op dezelfde manier hanteren en commanderen.
4.4.7
ADSR
ADSR, een Muziekmodule De ADSR is een muziekmodule met 6 implementaties, die de amplitude van monsters wijzigt. Hiertoe vermenigvuldigt zij de binnenkomende monsters met een opportuun volume. Dit volume is noot-afhankelijk, en wijzigt elke trage klok. Het is afgeleid uit een ADSR envelope, concept dat reeds toegelicht werd in Subsectie 2.1.2. Wat betreft haar interne werking, duiden we op de voornaamste verschillen in de context van Figuur 4.10, en de uiteengezette werking van de square. Wat opvalt ten opzichte van de square is o.a. de andere geheugeninhoud. • In de implementatie-sectie bevinden zich, naast het doeladres: attack, decay, sustain en release waarden. • In de nootsectie wordt, naast een volume, ook een “stage” gestockeerd. Dit is een twee bit brede waarde die, afhankelijk van de vordering van de ADSR-envelope, de waarde 0 (a), 1 (d), 2 (s) of 3 (r) bijhoudt. Bovendien wordt de te bewerken monster, na aankomst via de parallelle bus, gestockeerd in de nootsectie. De strategie van weergave is als volgt. De ADSR heeft na een soft reset de ganse nootsectie op nul. Wanneer een note on arriveert, e.g. voor noot nul, start het proces “The Function” in stage 0 (attack) met volume nul. Het volume ontvangt van dan af een increment van de grootte “attack increment” per trage klokcyclus. Elke trage klokcyclus wordt de nieuw binnengekomen monster vermenigvuldigd met het nieuw berekend volume, en op de parallelle bus gezet. Dit verhaal gaat door tot `of volume 1 bereikt is (over naar stage 1, decay), `of een
82
note off arriveert. In het geval van note off gebeurt overigens steeds hetzelfde, onafhankelijk van de huidige stage: de noot-stage springt naar 3 (release). In stage 1, 2 en 3 gebeuren vergelijkbare dingen. In stage 1 wordt het volume gedecrementeerd met “decay decrement”. Dit stopt wanneer het volume gezakt is tot het niveau van de “sustain level” (naar stage 2), of tot de aankomst van een note off (naar stage 3). In stage 2 wordt de sustain level als volume aangehouden, tot een note off doet springen naar stage 3. In stage 3 wordt gedecrementeerd met “release decrement”, tot het volume exact nul is. De geschetste strategie volstaat om de ADSR als module te implementeren. De verdere werking van de andere processen, van businterface tot en met dithering, blijft ongewijzigd die van algemene module en square. De operaties codering in PCI protocol
0 1 2 3 4 5
2 3
naam van de operatie
breedte waarde (in bit)
aard waarde
operaties geschreven naar de module zelf soft reset x x attack increment 18 unsigned int decay decrement 18 unsigned int sustain level 18 signed int release decrement 18 unsigned int target and 4+4 + 1 2x uint control/sound boolean operaties geschreven als broadcast boodschap note off 3 unsigned int note on 18 + 3 2x unsigned int
Tabel 4.5: Operaties van de ADSR, met hun digitale codering in het serieel protocol.
We geven nu een lijst van de operaties die op de ADSR kunnen afgevuurd worden, zie Tabel 4.5. Het ADSR adres op de seri¨ele bus is 8, haar implementaties zijn 0..5. In de tabel merken we op dat het target commando een aanhangsel kreeg: na de 8 bit van het doeladres, volgt een boolese variabele om aan te duiden of de ADSR als controle-ADSR (1) of sound-ADSR (0) optreedt. De betekenis van controle vs. geluid is vergelijkbaar met die bij de square; voor de ADSR betekent het gewoon dat uitgaande monsters getagd worden als controlemonsters. De waarden voor attack, decay, sustain en release verdienen een opmerking. De definitie van sustain is voor de hand liggend: net als volume is het een signed integer met als maximum 1, minimum 037 . Attack, decay en release zijn daarentegen 37
De schrandere lezer merkt op dat het meegeven van een tekenbit volstrekt overbodig is, daar
83
gedefinieerd als “increments” en “decrements”. Het volstaat om volgende formules in software te implementeren om de eenheid te veranderen naar de comfortabelere milliseconde. 18
2 −1 attack[ms] = Ts [ms]. attackinc 18
−1)−sustain decay[ms] = Ts [ms]. (2 decaydec sustain release[ms] = Ts [ms]. releasedec
met Ts [ms] = sampling rate (ca. 1/32), [attackinc] = unsigned int, [decaydec] = unsigned int, [sustain] = signed int, [releasedec] = unsigned int
Reden van deze andere eenheden is het vermijden van (in hardware-termen) dure vermenigvuldigingen. Tenslotte merken we ook op dat, van de note-on boodschappen, de ADSR alleen het nootnummer bijhoudt, en zich niet interesseert voor de frequentie. Ook merken we op dat glissando genegeerd wordt door de ADSR.
4.4.8
Filter
Het filter is een module met 6 implementaties, en heeft tot doel de frequentieinhoud van binnenkomende signalen te wijzigen. Zijn doeladres op de parallelle bus is 9. Hij implementeert een IIR filter van vijfde orde, en is een laagdoorlaatfilter met resonantie omheen de verschuifbare afsnijfrequentie. De werking werd reeds geschetst in Subsectie 2.1.2, het gedrag in het frequentiedomein is er te zien op Figuur 2.11. Ontwerpsstrategie Voor op de hardware in te gaan, moeten we vooreerst ingaan op de gevolgde ontwerpsstrategie. In Figuur 4.12 wordt de C-code afgebeeld38 , die in software een Moog filter implementeert. Ons doel is een soortgelijke filter cre¨eren in hardware. die verplicht nul is. De ontwerpers meenden evenwel dat dit de band tussen programmeur en te programmeren medium dichter zou aangetrokken houden; bovendien ware het pas op het niveau van grafische interface (die niet ge¨ımplementeerd is) dat een gebruiker zich kan veroorloven niet te weten wat gebeurt in de hardware. 38 Afkomstig van het web, musicdsp.org.
84
Figuur 4.12: C code voor een Moog VCF
Figuur 4.13: Blokschema van het filter
Onze eerste strategie leverde een dood spoor. Vertrekkend van het algemeen schema van Figuur 4.13, gecombineerd met de code uit Figuur 4.12, hoopten de ontwerpers het filter te bekomen met poortextractie 39 . Vele uren Maple volgden. Helaas vergaten de ontwerpers het maximum van de door Figuur 4.12 gedefinieerde filter te normeren op 1. Dit laatste, overtreding van een bindende wet in fixed point, leverde onaanvaardbare afwijkingen op de bekomen overdrachtsfunctie. De dagen 39
Poortextractie is een techniek om, vertrekkend van een rationale overdrachtsfunctie, een ontbinding te bekomen in eerste- en tweede-orde filters. Het is een niet triviale techniek, toegelicht in [6].
85
zinloos werk noopten de ontwerpers geenszins tot een nieuwe poging aan mathematisch complexe poort-extractie te doen, veeleer bewandelden ze een andere weg. Met in de achterhoofd de wetenschap dat het voorbeeld uit Figuur 4.12 vijfde orde is, gingen de ontwerpers de heuristische toer op. Vooropstellend dat er van de vijf polen vier complex, en ´e´en re¨eel moet zijn40 , gingen ze aan de slag met Maple.
Figuur 4.14: Regalia Mitra Filter, en de klassieke implementatie van de All-Pass Filter
De strategie gaat als volgt. Hebben we 4 complex toegevoegde polen, en ´e´en re¨ele, dan kan het filter ge¨ımplimenteerd als de cascade van twee all-pass filters van tweede orde, en ´e´en van eerste orde. Gezien het om fixed point gaat, dient men enkele zaken zorgvuldig in het oog te houden. • Het uitsluiten van overflow door feedback. Fixed point betekent risico voor overflow, en feedback is een evidente oorzaak. • Robuustheid van de implementatie. Fixed point design wordt bedreigd door instabiliteit, perturbatie van afrondingsfouten, limited cycles,... 40
Dit is een onderstelling, ingegeven door de simulatie van de functie; die leverde ´e´en snijpunt met de re¨ele as.
86
Figuur 4.15: Tralie-implementatie van eerste en tweede orde
Een betrouwbare oplossing levert de cascade van Regalia-Mitra met tralie-implementatie. Zij sluiten problemen rond afronding en feedback uit, en hebben een lage kans op het optreden van limited cycles41 . Er werd geopteerd voor Regalia-Mitra, omwille van de voordelen vermeld in Hoofdstuk 2. Figuur 4.14 toont bovenaan een Regalia-Mitra filter. Een elementair deel hiervan is de All-Pass filter. De All-Pass filter kan van eerste, maar ook van tweede orde zijn. Een klassieke implementatie wordt getoond in Figuur 4.14 onderaan. De tralie-implementatie wordt getoond in Figuur 4.15, bovenaan in eerste orde, en onderaan in tweede orde (als cascade van eerste ordes). De tralie-implementatie is om bovenvermelde redenen van stabiliteit en afronding te verkiezen boven de klassieke. Met bovenstaande is het denkkader uitgebouwd. Met Maple simuleerden de ontwerpers het gedrag van de overdrachtsfuncties van zowel eerste- als tweede-orde Regalia-Mitra met tralie-implementatie. Inspectie (trial and error) leverde de meest opportune parameters voor de frequentie-karakteristiek van eerste orde (low pass) 41
Meer over robuuste filterimplementaties is te vinden in [6].
87
Figuur 4.16: Simulatie van de overdrachtsfunctie van de module filter.
en tweede orde (band pass). Het volstond om twee tweede ordes met ´e´en eerste orde te vermenigvuldigen om de gegeerde karakteristiek van Figuur 4.16 te bekomen. Dit betekende het eindpunt van de heuristische weg: de hardware implementatie van het filter was gevonden.
De Muziekmodule Filter Gaan we nu in op de interne werking. We bouwen onze uitleg opnieuw uit in een vergelijking met Figuur 4.10, en de square. De geheugeninhoud van het filter ziet er als volgt uit. • In de implementatie-sectie bevinden de waarden voor afsnijfrequentie, resonantie en bandbreedte. • De nootsectie is een monster-geheugen. Het te bewerken monster, na aankomst via de parallelle bus, wordt er gestockeerd. Daarenboven bevinden zich hier, voor elke noot, de monsters van de laatste 5 trage klok-periodes. 88
De stockering van deze laatsten heeft alles te maken met de orde van het filter. In het Z-domein gerepresenteerd (Figuur 4.15), zien we in totaal 5 keer een z-1 -blokje. Deze “oudere” waarden dienen bijgehouden te worden, willen ze bijdragen tot de uiteindelijke output. Bovenstaande elementen volstaan voor een elementair begrip van het filter. Men merke op dat de vele problemen, denkbaar in fixed point, veeleer voorkomen zijn (door een goede implementatie-keuze) dan genezen na ondervinding42 . De operaties codering in PCI protocol
0 1 2 3 5
naam van de operatie
breedte waarde (in bit)
aard waarde
operaties geschreven naar de module zelf soft reset x x cut-off frequency 18 unsigned int resonance 18 signed int bandwidth 18 signed int target and 4+4 + 1 2x uint control/sound boolean operaties geschreven als broadcast boodschap
x
x
x
x
Tabel 4.6: Operaties van het filter, met hun digitale codering in het serieel protocol.
Het filter reageert op de operaties vermeld in Tabel 4.6. Hun betekenis is als volgt. Soft Reset leegt de nootsectie van het geheugen, net als bij square. Cut-Off Frequency stuurt de frequentie aan waarboven het filter afsnijdt; een typische waarde is 0x03000. Resonance bepaalt hoe sterk de resonantiepiek in het frequentiedomein mag zijn, en is uitgedrukt met een positieve, 18 bit brede signed int. Voor een waarde van 0x03000 bekomen we een stevige, doch nog steeds “genietbare” resonantie. Bandwidth is een variabele wiens variatie resulteert in de evenredige variatie van de bandbreedte. Het is een 18 bit signed int, met een typische waarde rond 0x18FF, kort onder het maximum 0x1FFF. 42
Professor Uncini, veteraan in digitale audio, meende dat limited cycles ons ontwerp “mogelijks nog belagen”. Hij adviseerde de implementatie door te voeren, en dan op het oor af te gaan.
89
Target and control/sound : Target geeft het adres op de parallelle bus mee, en bestaat uit 4 bit doelmodule en 4 bit implementatienummer. Control/sound zegt of de implementatie controle(1)- of geluidssignalen(0) moet produceren. Noteren we tenslotte hoe note on en note off boodschappen geen invloed hebben: er gebeurt hoegenaamd niets, en waarden van de vorige noot vloeien nog 5 trage klokcycli (5e orde) het filter uit. Hiermee eindigt de uitleg over het filter. Merken we op dat het filter een echte signaalverwerkingsblok is, die een diepgaand onderzoek vergde voor zijn totstandkoming. De drie controlevariabelen zijn aanvaardbaar goed georthogonaliseerd, doch zijn dat nooit helemaal. Lineaire systeemtheorie leert immers dat orthogonale controlering in het frequentiedomein zelden vertaalbaar is naar een rationale overdrachtsfunctie. Niettemin is Regalia-Mitra een aardige oplossing, die een bevredigend resultaat in het frequentiedomein levert.
4.4.9
Delay Line
Stereo Muziekmodule De delay line, of vertragingslijn, is een module met 6 implementaties en cre¨eert stereo. Zijn ingang is een monofoon kanaal, aan zijn uitgang staan twee kanalen: links en rechts. Naar de delay line wordt geschreven via slechts ´e´en module-adres (10), zijn twee uitgangen hebben echter elk nood aan een doeladres: ´e´en voor links, ´e´en voor rechts. De delay line kent twee fundamentele strategie¨en voor stereo, en een derde als effect. • Panning depth: het cre¨eren van een volumeverschil tussen linker- en rechterkanaal. Dit geeft de luisteraar een gevoel van localisatie; het effect is ge¨ımplementeerd op alle zes de implementaties. • Delay Depth: het cre¨eren van een tijdsverschil tussen linker- en rechterkanaal, of, in hardware, het aanbrengen van een tijdsvertraging op ´e´en van beide kanalen. Dit ervaart de luisteraar als een winst aan diepte, ruimte binnen het geluid. Dit effect is slechts aanwezig voor ´e´en implementatie (m.n. implementatie 0), daar het een volledige MRAM-blok op de chip opeist. • Echo: er wordt echo gecre¨eerd door een terugkoppeling. Deze terugkoppeling moet sowieso geattenueerd (vaste komma = overflow gevaar); de preciese attenuatie kan ingesteld met echo factor. Deze echo optie grijpt, net als delay depth, slechts op ´e´en implementatie in: implementatie 0. Bovendien is ze mutueel exclusief met de delay depth: de eerste van de zes implementaties vertoont `of delay depth, `of echo; de andere (implementaties 0 tot 5) zijn “p.o.”, “panning only”. 90
Figuur 4.17: Delay line in zijn werking als “panning only” (p.o.), en als “delay depth delay line”
Figuur 4.18: Delay line in zijn werking als “echo delay line”
Een schema van de delay line, met zijn drie mogelijke manieren van werking, is weergeven in Figuur 4.17 en Figuur 4.18. Als muziekmodule wijkt de delay line af van het algemeen schema van Figuur 4.10 op enkele punten. 91
• Er is een MRAM blok bijgekomen. Deze is ter beschikking van “The Function”, die hem gebruikt om vertraging te cre¨eren. Het proces stockeert er van 8 noten de gecre¨erde monsters, en haalt ze er, afhakelijk van de delay depth, direct (depth 0) terug uit, of, met een aangepaste pointer, pas later. De maximale delay is 125ms, en hangt samen met de capaciteit van de MRAM blok: er is plaats voor 32000 waarden van 18 bit. Voor 8 noten, en sampling rate 32kHz, betekent dat elke noot 1/8 seconde ter beschikking heeft. • De geheugeninhoud: de implementatiesectie houdt volume left en right bij, delay depth of echofactor, en twee doeladressen en een control/sound bit per implementatie. De nootsectie bewaart enkel de binnenkomende monsters. De Operaties codering in PCI protocol
0 1 2 3 4 5 6
naam van de operatie
breedte waarde (in bit)
operaties geschreven naar de module zelf soft reset x volume left 18 volume right 18 delay depth 15 echo factor 18 target left, control/sound left 8+1+8+1 target right, control/sound right echo/delay depth selector 1+1+1
aard waarde
x
unsigned int unsigned int unsigned int signed int uint+boolean uint+boolean 3x Boolean
operaties geschreven als broadcast boodschap x
x
x
x
Tabel 4.7: Operaties van de delay line, met hun digitale codering in het serieel protocol.
De delay line werkt met de commando’s vermeld in Tabel 4.7. Soft Reset leegt de nootsectie van het geheugen, net als bij square. Volume Left regelt het volume van het uitgaande linkerkanaal. Volume Right doet hetzelfde voor het rechterkanaal. Delay Depth geeft aan hoeveel delay gewenst is. Het beschikt over 15 bit, en 15 staat op die manier toe tot 28 trage klokcycli te vertragen. Dit betekent dat de bovenste 12 bit benut worden om het aantal trage klokcycli vertraging in te geven; de onderste drie bit worden niet benut 43 . 43
Reden voor deze particulariteit is het feit dat de ontwerpers eerst tot een seconde vertraging wilden gaan. Helaas vergt dit acht MRAM blokken, de chip heeft er slechts 2.
92
Echo Factor dient om de terugkoppeltak van de echo te attenueren. Op zijn maximum staat zijn waarde gelijk aan ´e´en. Merk op dat waarden groter dan 0,5 in sommige gevallen overflow kunnen veroorzaken; de ontwerpers opteerden ervoor om de gebruiker de vrijheid te laten vrij in te stellen. target left, control/sound left, target right, control/sound right: Dit allegaartje geeft ineens doeladres en controlebit van linkerkanaal, en idem voor rechterkanaal, achter mekaar geschreven middels in het totaal 8+1+8+1 = 18 bit. Echo/delay depth selector bestaat uit drie bit, boolese variabelen. • De eerste bit geeft aan of er effect gewenst is op het linker(0)- of rechter(1)kanaal. • De tweede bit geeft, indien 1, aan dat het effect echo gewenst is. • De derde bit geeft, indien 1, aan dat het effect delay depth gewenst is. Men merke op dat van alle implementaties 5 implementaties de tweede en derde bit op nul moeten houden (p.o.). E´en implementatie mag `of echo, `of delay depth krijgen; evenwel niet allebei. Dit betekent dat de drie bits samen de waarde 0, 1, 2 of 5 kunnen aannemen. Ten opzichte van de algemene muziekmodule, heeft de delay line er een proces bij: de switch. Deze verzorgt de toegang tot de parallelle bus, en maakt dat tegelijk twee kanalen (links en rechts) naar de parallelle bus kunnen schrijven. Noteren we tenslotte hoe note on en note off boodschappen geen invloed hebben.
4.4.10
Middleman
Een Bescheiden Muziekmodule De meest eenvoudige muziekmodule in de Fynth is zonder twijfel Middleman. Hij telt twee inputsignalen op, en brengt de som naar zijn uitgang. Hij attenueert vooraf beide inputs met factor 1/2, de minimale waarde om overflow uit te schakelen. Als module kent hij twaalf implementaties. Hij heeft twee adressen op de parallelle bus (11 en 12), daar hij toegang verstrekt aan twee verschillende signalen. Als muziekmodule heeft hij alle processen, aangeduid in Figuur 4.10. Evenwel is de woordenschat van elk heel beperkt. In zijn geheugen stockeert hij doeladres in de implementatiesectie; recentelijk toegekomen waarden buffert hij in de nootsectie.
93
codering in PCI protocol
0 5
naam van de operatie
breedte waarde (in bit)
operaties geschreven naar de module zelf soft reset x target, control/sound 8+1
aard waarde
x
uint+boolean
operaties geschreven als broadcast boodschap x
x
x
x
Tabel 4.8: Operaties van de Middleman, met hun digitale codering in het serieel protocol.
De Operaties Tabel 4.8 geeft de commando’s van Middleman weer. Soft Reset leegt de nootsectie van het geheugen, net als bij square. target and control/sound bepalen voor elke implementatie het doeladres, en bepalen de aard van het uitgaande signaal.
4.4.11
Mixer
De Monding De mixer is het eindpunt van de monster-stroom; alle hoorbare signalen passeren hier, en worden door de mixer omgezet in een standaard stereo audio-signaal met bemonsteringsfrequentie 32kHz. Als module heeft hij slechts ´e´en enkele implementatie, met twee kanalen44 . Voor een keer is er sterke afwijking van het beeld van de algemene muziekmodule: • Er is geen geheugenblok. • “The Function” wordt, i.p.v. vanuit het geheugenblok, gecommandeerd door alleen de trage klok. Hij voert twee types bewerkingen uit: – Ongebreideld accumuleren, gedicteerd door niets of niemand. – Getriggerd door de trage klok, het legen van de accumulatoren, en het verzorgen van de signaalconversie van de inhoud: van accumulatorsom, tot audiosignaal. 44
Of, voor lingu¨ı: de module mixer heeft twee implementaties: ´e´en voor linkerkanaal, ´e´en voor rechterkanaal. Dit is strikt gezien een correctere betiteling, implementatie zijnde een deelverzameling van een module.
94
Figuur 4.19: Schema van de mixer
De werking van de mixer is ge¨ıllustreerd in Figuur 4.19. We zien in hoe de monsters binnenstromen via twee doeladressen (13 en 14) en bij de accumulator opgeteld worden. De trage klok verzorgt het tempo waarmee de accumulatoren geleegd worden, en hun waarden naar het deelproces “smart step down” vloeien. Na dit proces volgt nog een vergelijking met een door de gebruiker aangebrachte clipping waarde. (Deze vertelt wat de maximale uitzwaai van de output mag zijn.). Na deze stap bekomen we left en right output, twee 16 bit 32kHz bemonsterde signalen. Het deelproces “smart step down” is ge¨ıllustreerd in Figuur 4.20. De rol van de window-positie wordt er verduidelijkt. Een raam van 15 bit, dat de uitgaande data uit het 32 bit brede accumulatorregister moet lichten, schuift onder impuls van de window-position. Hiernaast resulteren de beide tekenbits uit de accumulator eenduidig in de ene tekenbit van de uitgaande data. De window position is een maat voor “het te verwachten volume, ingaand in de mixer”. Hoe meer oscillatoren actief, en hoe hoger hun volume is, hoe groter de 95
Figuur 4.20: Smart step down
uitzwaai is van het signaal, dat in de accumulator gerepresenteerd wordt door 34 bit. Gewenst aan de uitgang is echter een signaal van woordbreedte 16 bit. Berekenen we wat de maximaal mogelijke uitzwaai is van het in de mixer ingaande volume, onderstellend dat alle 10 oscillatoren aan maximaal volume naar de uitgang schrijven, elk met acht noten actief, dan bekomen we de wetenschap dat de accumulator minimaal 25 bit breed moet zijn, om overflow uit te sluiten45 . Kiezen we nu een vaste raampositie, en kiezen we de 15 hoogste bit uit de 32 waardebits, dan gaan we nooit in overflow, maar gooien al te veel significante bits weg. In het extreme geval van 1 oscillatoren, en slechts 1 klinkende noot, zou dit betekenen dat van de 15 waardebits aan de uitgang, slechts de laatste 8 benut worden, en de hoogste 7 nul blijven; dit betekent een regelrechte drop van de SNR46 . Kort gesteld: we hebben nood aan een variabele raampositie. De raampositie is gecodeerd in 4 bit, en de gebruiker dient deze lager dan het maximum (15) in te 45
Dit getal wordt bekomen als de som van de woordbreedte van ´e´en monster, de 4 bit van de vermenigvuldiging met tien (4 bit gevergd om het te kunnen representeren) en de 3 bit van de vermenigvuldig met 8. 46 Hanteren we de vuistregel SN R = 6.n, met n het aantal bits, dan bekomen we 96 dB voor 16 bit (CD-kwaliteit), en 54 dB voor 9 bit (ca. audio-cassette kwaliteit, in het geval zonder ruisonderdrukking)
96
stellen wanneer niet alle oscillatoren op maximum volume actief zijn. Met deze positie wordt het monster gevensterd, en na vergelijking met de clipping value naar de uitgang gestuurd.
De Operaties codering in PCI protocol
0 1 2 3 4 5
naam van de operatie
breedte waarde (in bit)
aard waarde
operaties geschreven naar de module zelf soft reset x x volume left 9 signed int volume right 9 signed int clip left 16 signed int clip right 16 signed int window position 4 unsigned int operaties geschreven als broadcast boodschap
x
x
x
x
Tabel 4.9: Operaties van de Mixer, met hun digitale codering in het serieel protocol.
Tabel 4.9 somt de commando’s van de mixer op. Ook deze module is ongevoelig aan nootboodschappen. Verder is commando 5, bij alle andere modules het commando target, window position geworden.
4.5
Protocols
Deze sectie wil de boodschapstructuur tot op de bit tentoon spreiden. Niet minder dan vijf protocols werden door de ontwerpers in het leven geroepen. Teneinde “spraakverwarring in bit-land” te vermijden dient dit onderdeel – veeleer dan als onderhoudende lectuur – als een onontbeerlijk vademecum voor een actief ontwerper47 . Vooreerst is er de communicatie tussen de gebruiker en de software; deze wordt tot stand gebracht met het patch protocol, het demo protocol en het MIDI protocol 48 . 47
De auteurs hebben bij het schrijven van deze sectie een andere methodologie van compositie gehandhaafd. Waar andere secties trachtten een gevoel van continu¨ıteit met vorige en volgende onderdelen te cre¨eren, wil deze sectie een op zich staand referentie-formulier zijn. Omwille van het belang van de protocols voor het ontwerp, hebben we de sectie in het corpus, en niet in appendix opgenomen. 48 Het MIDI protocol werd hier niet opgenomen (daar de ontwerpers het in hun originele vorm handhaafden), doch wordt vermeld in Hoofdstuk 2, Sectie 2.2.
97
Vervolgens is er de communicatie tussen software en hardware, deze wordt verzorgd door het PCI protocol. Intern hanteert de Fynth het serieel en het parallel protocol.
4.5.1
Patch Protocol
Het patch protocol stelt de gebruiker in staat om in relatief leesbare tekstuele vorm parameters van de Fynth af te stellen. In strikt formele zin is het een overbodig protocol, daar er een injectief verband bestaat tussen de commando’s in dit protocol en die van het PCI protocol. Zijn bestaansreden is dus alleen gebruiksgemak. Typisch worden in patchprotocol geschreven commando’s opgeslagen in een patch list, een bestand in tekstformaat (e.g. patchlist.txt), dat in ´e´en keer ingelezen wordt door Hermes en integraal naar de hardware verzonden wordt. Een patch list legt de verbindingen tussen de verschillende modules vast, en geeft initialisatiewaarden mee aan elke module afzonderlijk. In muzikale zin definieert een patch list een instrument, dat speelklaar is. Door stockeren van patches in autonome bestanden wordt de gebruiker de mogelijkheid geboden een database van patch lists bij te houden en de Fynth naar eigen smaak te initialiseren. Een afzonderlijke patch boodschap heeft de in Tabel 4.10 geschematiseerde vorm. Het commando is steeds 20 ASCII karakters breed, en heeft vier velden: module, nr, op en value, gescheiden door arbitraire ASCII-karakters op posities 12 en 5. module 19
nr 14
13
op 11
value 6
4
0
Tabel 4.10: Standaard opbouw van een boodschap in Fynth patch protocol.
Het veld module duidt de module aan die door het commando aangesproken wordt. De interne modules, twaalf in aantal, krijgen in dit protocol een zes letters brede woordbenaming, die te zien is in Tabel 4.11. Ter referentie wordt in de laatste kolom ook al het getaladres in het PCI protocol (het protocol waarnaar vertaald zal worden) weergegeven. Het veld nr geeft het implementatienummer in hexadecimale notatie aan, en heeft waarden tussen ’0’ en ’F’. Het veld op geeft de operatie aan die de module moet uitvoeren; in dit protocol hebben ook de operaties alle een zes letters brede woordbenaming, te vinden in Tabel 4.12. Tenslotte beslaat het laatste veld, value, vijf ASCII karakters, elk een hexadecimale waarde van ’0’ tot ’F’ uitdrukkend. Dit staat in principe toe waarden mee te geven tot 24 bit breed, het werkelijke maximum bedraagt 18 bit49 . 49
Men notere dat de bitbreedte van de waarde volledig afhangt van de operatie, en de maximaal
98
modulenaam onder woorden sencoder
modulenaam in patchprotocol sencod
x
x
square sawtooth triangle sine noise custom ADSR filter delayline middleman
square sawtth triang singen noise custom ADSR filter delay midman
x
x
mixer
mixer
x
x
x
x
module-adres in PCI protocol 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Tabel 4.11: Benaming onder woorden van de verschillende modules, en hun benaming in het Patch protocol en het PCI protocol
Tenslotte vermelden we nog het bestaan van het bestand patchlist.txt, beschikbaar in de met het project meegeleverde code. Het gaat hier om een exhaustieve lijst van alle commando’s van het patch protocol, het is m.a.w. de opeenstapeling van alle commando’s waarover de gebruiker beschikt om de Fynth te programmeren voor patchdoeleinden. De gebruiker kan deze lijst als een invullijst zien, en mag alle regels die voor zijn specifieke patch overbodig zijn laten staan, daar ongewijzigde regels de modules als ongebruikt initialiseren.
4.5.2
Demo Protocol
Het demo protocol is een klein en bescheiden protocol, dat in het leven geroepen werd om ook zonder een MIDI-keyboard muziekstukken te laten horen. Het demo protocol laat toe een partituur te noteren en op te slaan in tekstformaat, en vervolgens te verzenden met Hermes. Het resultaat is een aanvaardbare weergave50 van de partituur door de Fynth. voorkomende bitbreedte in operaties 18 bit is, de minimale 1 bit. De waarde wordt rechts uitgelijnd, en overtollige bits worden meegegeven als nullen. Het is aan de gebruiker om toe te zien over de correcte invulling van de waarde, z` o dat aan het bereik voldaan is. Al het voorgaande resulteert tenslotte in commando’s met een herkenbaar uiterlijk, e.g. square0 volume 1FFFF. Voor een opsomming van de betekenis en argumenten van alle operaties verwijzen we naar Hoofdstuk 4. 50 Hermes interpreteert de partituur in een “nulde orde benadering”: er wordt verondersteld dat de verzending van een boodschap naar de hardware verwaarloosbaar kort verloopt, een onderstelling die voor problemen zorgt bij vari¨erend notendebiet. De variabelen drempel en msg minimum uit de
99
onder woorden naam module operatie alle modules soft reset alle behalve mixer target address on parallel bus serial encoder unitone alle oscillatoren volume sync/mod and control/sound frequency offset square duty cycle ADSR attack increment decay decrement sustain level release decrement filter cut-off frequency resonance bandwidth delay line volume left volume right delay depth echo factor echo/delay depth selector mixer volume left volume right clipping value left clipping value right window position broadcast glissando note off note on
patchprotocol operatie sreset target uniton volume synctr freque freque dutcyc attack decay sustai releas cutoff resona bwidth voluml volumr ddepth echofa echdep voluml volumr clipvl clipvr window x x x
PCI protocol operatie 0 101 001 001 010 011 100 110 001 010 011 100 001 010 011 001 010 011 100 110 001 010 011 100 101 01 10 11
Tabel 4.12: Benaming onder woorden van de verschillende commando’s, hun benaming in het patch protocol, en hun codering in het PCI protocol
Commando’s in het demo protocol hebben als enige doel (van tijdstip voorziene) nootinformatie door te geven: hetzij noten die actief worden (de MIDI “note on” boodschap, “velocity” verschillend van nul), hetzij noten die passief worden (de MIDI “note on” boodschap, “velocity” nul). Ze zijn steeds van de vorm vermeld in Tabel 4.13. Elk vakje stelt een ASCII karakter voor, de opengelaten vakjes 9, 8, 5 en 2 zijn willekeurige karakters. Het eerste veld, time, geeft de tijdspositie aan, in ms, decimaal genoteerd. Het tweede veld, raw MIDI, geeft in zes hexadecimaal genoteerde karakters een MIDI boodschap door. Zoals vermeld worden alleen MIDI “Note On” boodschappen ondersteund, op een willekeurig kanaal51 . Hermes C-code verhelpen hieraan gedeeltelijk, door betekenisloze boodschappen tussendoor mee te verzenden, en zo het boodschappendebiet constanter te houden. Deze oplossingen werken alle slechts gedeeltelijk; echt soelaas vindt de gebruiker door de Fynth aan te sturen met een MIDI keyboard, en van daaruit demo’s te verzenden. 51 meer over MIDI in Hoofdstuk 2, Sectie 2.2
100
In de meegeleverde code zit ook een demo-bestand, daan sdd.csv, dat met Hermes kan weergegeven worden op de Fynth, met een patch naar keuze. time 14
raw MIDI 10
7
6
4
3
1
0
Tabel 4.13: Standaard opbouw van een boodschap in Fynth demo protocol.
4.5.3
PCI Protocol target
op
impl.nr.
value and zeroes
1 31
1 30
27
26
24
23
20
19
Tabel 4.14: Standaard opbouw van een boodschap in zowel Fynth PCI protocol als Fynth serieel protocol.
Het Fynth PCI protocol legt het formaat van de boodschappen vast, zoals ze verzonden worden over de PCI bus. De boodschappen worden op de PCI bus gezet door de software, en zijn of vertaalde versies van MIDI boodschappen, of boodschappen van het programma Hermes zelf. Alle worden in de Fynth ge¨ınterpreteerd door de module sencoder, en daar vertaald naar het (overigens weinig verschillend) serieel protocol. Het PCI protocol is een fundamenteel protocol, in de zin dat het de unieke brug vormt tussen software en hardware. In Tabel 4.14 wordt de standaardopbouw van een PCI boodschap weergegeven. Elke boodschap is precies 32 bit lang, elk vakje bevat ´e´en bit. De boodschap start en eindigt bij conventie met bitwaarde 1. Men notere direct dat op deze algemene vorm uitzonderingen zijn: broadcast messages hebben slechts een 2 bit breed veld op, oscillatoren hebben slechts een 1 bit breed veld impl.nr. (omdat er slechts twee implementaties zijn) en de mixer heeft het veld impl.nr. niet. Al deze uitzonderingen resulteren in de dopschuiving naar rechts van alle erop volgende velden. Het veld target doelt op de module waarheen we de boodschap wensen te zenden, en beslaat vier bit. De juiste adressering gebeurt met de zogenaamde “Module-adressen op de PCI Bus” en is te vinden in de eerste twee kolommen van Tabel 4.15. Het veld op encodeert in drie bits het commando, dat module-afhankelijk is en weergegeven wordt in Tabel 4.12. Het veld impl.nr. beslaat in de regel 4 bits, en vertelt voor welke implementatie van de module het commando bestemd is. Het laatste veld, value en zeroes, bevat de waarde die meegegeven wordt aan het commando. De bitbreedte van de waarde is afhankelijk van de aard van het commando, eventueel resterende bits tussen de waarde en de stopbit worden opgevuld met nullen. Het PCI protocol staat toe zowel patch-instellingen te wijzigen, als noten aan, resp. 101
1
0
af te zetten. Hermes staat in voor de verzending van de commando’s, en respecteert een wachttijd van meer dan 50 µs na de verzending van elk commando52 . Dit staat de Fynth toe alle commando’s serieel te verwerken. Over het demoprotocol moet gezegd dat het nut niet te onderschatten is: bij het ontvlooien gebruikten de ontwerpers steeds weer een demo als test. PCI bus modulenaam adres sencoder 0
seri¨ele bus modulenaam adres x
x
square sawtooth triangle sine noise custom ADSR filter delayline middleman
x
square sawtooth triangle sine noise custom ADSR filter delayline middleman
13
mixer
2 3 4 5 6 7 8 9 10 11
x
x
broadcast
x
2 3 4 5 6 7 8 9 10 11
x
mixer
13
x
15
parallelle bus modulenaam adres drain 0
broadcast
15
square sawtooth triangle sine noise custom ADSR filter delayline middleman input 1 middleman input 2 mixer left mixer right
2 3 4 5 6 7 8 9 10 11 12 13 14
x
Tabel 4.15: Module-adressen op seri¨ele en parallelle bus, in decimale notatie
4.5.4
Serieel Protocol
Na de verzending over de PCI bus worden de boodschappen intern alle toegeleverd aan de module sencoder, de seri¨ele encoder. Deze module treedt op als controller in de hardware, en is verbonden met alle andere modules via een seri¨ele lijn, waarop alleen hij spreekt, en alle andere modules luisteren. De sencoder geeft de ontvangen boodschappen zonder uitzondering door, maar doet een conversie van de boodschappen van PCI protocol naar Serieel Protocol, alvorens ze , bit voor bit (a rato van de snelle klok), op de seri¨ele bus te plaatsen. De conversie van PCI protocol naar Serieel Protocol heeft al bij al weinig om het lijf. De schematische vorm blijft ongewijzigd de 32 bit brede van het PCI protocol (zie Tabel 4.14).De inkomende boodschappen worden alle ongewijzigd doorgegeven, op twee types na. 52
Deze wachttijd respecteert een veilige marge. In de praktijk neemt de verwerking van commando’s gewoonlijk slechts 1 ` a 2 µs; de hoge marge is te wijten aan de lange tijdsduur van de soft reset van de ADSR.
102
• De boodschappen, bestemd voor de seri¨ele encoder zelf. Zij worden ter plekke ge¨ınterpreteerd, en niet geconverteerd naar serieel protocol. • De broadcast boodschappen of nootboodschappen. Deze worden, m.b.v. logica en notentabel van de sencoder, vertaald naar serieel protocol. – Voor de note on boodschappen betekent dit het toevoegen van 3 bit voor het nootnummer, volgend op de frequentiewaarde in het veld value. – Voor de note off boodschappen betekent dit het vervangen van de frequentiewaarde in het veld value door een 3 bit breed nootnummer. – Voor de glissandowaarden betekent dit het vertalen van de gehele boodschap naar een frequency offset boodschap, bestemd voor de oscillatoren.
4.5.5
Parallel Protocol
Het parallelle protocol verschilt sterk van alle andere, omdat het een andere bestaansreden heeft. Waar de voorgaande protocols alle dienden om hetzij afzonderlijke modules hetzij de Fynth in zijn geheel te controleren, dient het Parallel Protocol om tussentijds berekende waarden door te geven. In de samenwerking van de modules, zijn alle modules (behalve sencoder) verbonden met elkaar via de parallelle bus. Het parallel protocol dient om het formaat vast te legen, waarin te verwerken waarden binnenkomen in de module, en verwerkte waarden de modules verlaten. Het algemeen schema van een boodschap in parallel protocol wordt weergegeven in Tabel 4.16. De boodschap is 30 bit breed en heeft 5 velden. Het eerste en tweede veld, target en impl.nr. vormen samen het doeladres op de parallelle bus. Dit is het adres op de parallelle bus waarnaar precies ´e´en implementatie van ´e´en module naar luistert; een boodschap op de parallelle bus wordt dan ook steeds slechts door de ene bestemmeling, aangegeven door de eerste 8 bit, ontvangen. Het derde veld, c/s geeft aan of de in de boodschap meegegeven waarde het doel heeft de bestemmeling te controleren, of in tegendeel een “sound value”, een geluidswaarde is. In het eerste geval staat dit veld op 1, in het andere op 0. Het veld note nr. geeft vervolgens het nootnummer aan, waarop de boodschap betrekking heeft. Het laatste veld, value, geeft de te verwerken waarde aan, en is steeds 18 bit breed53 . Dit besluit het onderdeel over protocols. Als slotopmerking dient nog toegevoegd dat dit onderdeel, ofschoon op zich technisch, heel determinerend is voor de grondslagen van het ontwerp: digitale abstractie, en modulariteit. Dit onderdeel is het enige dat voor de ontwerpers noodzakelijk was om altijd bij de hand te hebben, of het nu ging om het hardware-ontwerp, muzikaal abstracte redeneringen, software-ontwerp... De protocols kenden gaandeweg een zevental versies en moesten voortdurend bijgewerkt 53
Er wordt dus niet aangevuld met nullen, zoals in het serieel protocol het geval was.
103
op papier om spraakverwarring te vermijden. Ze bakenen het strijdterrein af, en zijn het uitgekiende evenwicht tussen controleerbaarheid en flexibiliteit54 . target 29
impl.nr. 26
25
c/s 22
21
note nr. 20
18
value 17
Tabel 4.16: Standaard opbouw van een boodschap in Fynth parallel protocol.
4.6
De Persing
Helaas komt bij programmeren van hardware veel meer kijken dan software. Wanneer het ganse project succesvol door de testbank is gedraaid, zijn de ontwerpers immers nog helemaal niet zeker of het ontwerp ongehavend door de toolchain raakt. Zelfs dan is men niet zeker of de re¨ele tests het gewenste resultaat zullen geven. In de simuleeromgeving is het ontwerp op een aantal vlakken vereenvoudigd. Ten eerste is de notie van “eindige middelen” afwezig. Denkt men specifiek aan de Stratix chip, dan weet men dat er acht en juist acht DSP blokken fysisch aanwezig zijn. In het geval men 8 36 x 36 bits vermenigvuldigers wil gebruiken, dan is dadelijk de ganse voorraad op. Hetzelfde geldt voor het gedistribueerd geheugen. En natuurlijk is ook het aantal LAB’s beperkt. Bij de implementatie moet men dus steeds rekening houden met de harde eis dat het ontwerp op het kaartje moet passen. Ten tweede gebruikt de simulatie een beperkt tijdsmodel, en wordt de dimensie ruimte niet in simulaties opgenomen. Er is, toegegeven, een voorziening om signalen een zeker tijdsgedrag mee te geven. Evenwel kan de simulatie onmogelijk rekening houden met de klokverschuiving die veroorzaakt wordt doordat de ene module al iets verder van de klok verwijderd is dan een andere module. Ook vertraging die ontstaat doordat het signaal door een multiplexer wordt geloodst, blijft buiten het softwaremodel. Zeker bij dit laatste moesten de ontwerpers zich onvoorwaardelijk neerleggen. De omgeving k`an nog geen rekening houden met dit soort tijdseffecten, daar de uiteindelijke schikking van de modules nog niet gekend is. Deze oversimplifi¨eringen in simulaties beloven problemen – na een simulatie is slechts de helft van de weg afgelegd. De andere helft is het malen van de code door 54
Een goed voorbeeld hiervan is de aanwezigheid van afzonderlijke initialisatiecommando’s in oudere versies van het protocol. Het argument voor de invoering was de controleerbaarheid. Gaandeweg werd de overbodigheid duidelijk, en werd de idee van initialisatie zelfs een doorn in het oog van de flexibiliteit, die pas geleidelijk aan door de ontwerpers in zijn brede vorm werd onderkend.
104
0
de toolchain. c Quartus II schotelt ons vier gangen voor. • Analysis and Synthesis • Fitter • Assembler • Timing Analyzer Deze vier stappen conditioneren de verwerking van ons ontwerp, en hebben zo elk hun particulariteiten. Analysis & Synthesis De Analysis & Synthesis zorgt ervoor dat de code optimaal wordt omgevormd in registers en combinatori¨ele logica. Hij informeert de ontwerpers over syntactische fouten in de code, zoals “Non-synthesizable code” of “Wrongly assigned Pins”. Hij doet er slechts een 10 minuten over, en de remedies zijn over het algemeen eenvoudig. Fitter De eerste rechter is de Fitter. De naam zelf verklapt eigenlijk al dat bij deze stap specifiek wordt nagegaan of het ontwerp al dan niet in de beschikbare chip past. Is het antwoord negatief, ´e´en devies: herbeginnen. De hercompilatie neemt al gauw een uur. Assembler In een enkele minuut berekent de Assembler welke programmering de chip te wachten staat. Het resultaat wordt gestockeerd in een sof-file. Deze gang genereert nooit fouten. Timing Analyzer We zijn gekomen aan de laatste stap. De plaats van alle signalen op de chip bekend, en de software is in staat om alle vertragingen te weten. De Timing Analyser berekent deze in een minuutje. Hij informeert de ontwerpers met “critical warnings”, waaronder de (aan de ontwerpers reeds veel te vertrouwde) “Timing Requirements were not met.”. Voor de Fynth zijn een aantal optimalisatietechnieken onderzocht om aan de strenge eisen van de busarbitrage te kunnen voldoen. Zo zijn 105
het geheugen en de vermenigvuldigers geklokt aan 133.33 MHz, het viervoud van de algemene 33 MHz klok. Dat heeft helemaal geen grote gevolgen bij een simulatie - buiten het feit dat alles wat rapper gaat - maar zeer zeker voor de analyse van de tijdsvereisten. Gelukkig is die 133 MHz afgeleid uit de 33 MHz en hoeven we niet al te streng rekening te houden met de overgang van het ene naar het andere klokdomein. Maar aan de andere kant kan men zonder veel geduld het ontwerp niet doen slagen in deze test. Men heeft immers nood aan een faseverschuiving, zodat de vereiste setup-tijden gerespecteerd worden. Bovendien gebruiken al de modules van de Fynth elk hun stukje van het gedistribueerd geheugen, waardoor opnieuw verschillende klokverschuivingen gelden voor verschillende blokjes. Om die reden zijn 3 verschillende faseverschuivingen toegepast, alle drie voor dezelfde vermenigvuldigingsklok van 133 MHz, die de Fitter meer vrijheid geven om de blokjes te schikken. Trial and error is de boodschap. De strategie gaat als volgt: zijn de timing requirements niet gehaald, verschuif dan de fase van ´e´en van de lussen dan over enkele graden (of minder), druk op “compile”, en wacht een zestigtal minuten om te weten of je gok goed zat. Om het volledige ontwerp in te passen herhaalden de ontwerpers deze procedure zeven dagen lang.
106
Hoofdstuk 5 Extensies & Conclusie “Nothing really ends.” dEUS Dit hoofdstuk dient drie doeleinden. Vooreerst scheppen de auteurs een beeld van de stand van zaken: hoe ver kwamen de ontwerpers met de beoogde opdracht? Wat leverden de tests? Wat blijft ongetest? Zoals het een jong ontwerp betaamt, pretendeert het niet foutloos te zijn, maar krijgt integendeel een opsomming mee van zijn kinderziektes. Zulks is opgesomd in “bugs”. Ten tweede geeft het hoofdstuk een beeld op mogelijke extensies. Door zelf aan de basis te staan van de Fynth, gingen de ontwerpers al gauw aan het dromen over kleine en grote uitbreidingen. Zo schetsen ze enkele mogelijkheden, en bespreken kort (naar hun bescheiden oordeel) de haalbaarheid van elk. Ten laatste formuleren de ontwerpers een besluit.
5.1
Stand Van Zaken
Waar staat de effectieve implementatie van de Fynth? Zoals het gaat met hardwareontwerp wordt het concept op een dag geboren uit het brein van de ontwerpers, maar laat het moment van beluistering vanuit de hardware maanden op zich wachten1 . Ook op het moment van schrijven van dit document2 zijn de ontwerpers nog aan het testen. Vraag is wat al werkt. 1
De allereerste noot, effectief komende vanuit de chip, geproduceerd door de square en gaande naar de mixer, klonk pas op 17 mei 2004. Dit is veel later dan de ontwerpers hoopten. 2 vandaag, 25 juni 2004
107
5.1.1
Versie 1.0
Wat betreft hardware testen delen we de functionaliteiten op in drie deelgroepen: zij die met zekerheid werken (na uitgebreid testen), zij die zouden moeten werken (maar nog onvoldoende getest werden) en zij die met zekerheid mankementen vertonen (bugs). Wat Werkt Wat werkt zijn volgende functionaliteiten. • de module chronos • de module sencoder (na ettelijke debugrondes): alle functionaliteiten behalve de commando’s offset en frequency • de module deltasigma3 • de module square, als ongemoduleerde sound oscillator • idem als square voor alle andere oscillatoren: sawtooth, triangle, sine en noise • ongemoduleerde ADSR • de module middleman • de module mixer • de module delay line, in ongemoduleerde werking • de module filter, in ongemoduleerde werking Wat Zou Moeten Werken Volgende functionaliteiten werden nog onvoldoende getest om uitsluitsel te bieden, doch leverden positief resultaat bij simulaties. • de module sencoder in unitone glissando modus, en bij de operaties offset en frequency • de module square: als extern gemoduleerde sound oscillator; als control oscillator • idem als square voor alle andere oscillatoren: sawtooth, triangle, sine en noise • extern gemoduleerde ADSR 3
Deze werd ons in werkende staat overhandigd door Ir. Benjamin Schrauwen, waarvoor dank.
108
Bugs Vermelden we hier ook een probleem. Af en toe komt een note on of note off commando niet door. Dit gebeurt ongeveer ´e´en keer op 10 als we een test met een demo doen, in cijfers betekent dat dat ´e´en nootboodschap op 5000 verloren gaat. De oorzaak is de ontwerpers onbekend. Software Besluiten we met de stand van zaken wat betreft de software. Het Linuxprogramma Hermes
• is operationeel • is in staat demo’s te draaien • ondersteunt MIDI • vertaalt patches van patch protocol naar PCI protocol en verstuurt ze • verstuurt individuele PCI boodschappen • staat toe particuliere tuning (zoals stemmingen) aan te brengen • staat noteninput vanuit het PC keyboard toe • heeft geen aan de ontwerpers bekende bugs • staat open voor uitbreiding van zijn C-code... Wat nog ontbreekt, is de intelligentie om de opdrachten frequency, offset en glissando te ondersteunen. Dit is een spijtige zaak, daar de ontwerpers deze functionaliteiten in de laatste ontwerpsdagen toch nog aan de praat kregen in de hardware. De ontwerpers hopen dat het door anderen kan uitgeprobeerd worden...
5.2
Toekomstmuziek
In deze sectie komen mogelijke uitbreidingen, zoals ze gezien worden door de ontwerpers, aan bod. Uiteraard is deze lijst een smaak-getinte opsomming, die veel goede alternatieven onbesproken laat.
109
5.2.1
Partieel Herconfigureren
De mogelijkheden van parti¨ele herconfiguratie van de hardware spreken tot de verbeelding. In Hoofdstuk 4, Subsectie 4.1.8, werd reeds aangehaald waarop we doelen. De ontwerpers gingen al even door op de diverse denkpistes, en kwamen op het volgende uit. Het Stratix Development Board biedt een “Remote Configuration Mode”. Die voorziet een “page mode feature”, die toestaat de chip heel snel te herconfigureren. De ontwerpers verdiepten zich in de Stratix Manual, en leidden daaruit af dat het mogelijk moet zijn verschillende “sof-files4 ” in het kaartgeheugen te stockeren, en relatief vlot te wisselen van programmering. Daar de onwerpers dit niet in de praktijk uitprobeerden, zeggen ze het volgende met voorbehoud: we menen dat het niet mogelijk is de chip te herconfigureren, zonder dat het geluid wegvalt. De tijd, nodig om de chip te herprogrammeren, ligt vermoedelijk te hoog5 . Indien dit zo is, is het een streep door de rekening van de meest aantrekkelijkste vorm van herconfiguratie: die waarbij het geluid onverminderd doorspeelt. Toch resten er nog aantrekkelijke uitbreidingen aan de herconfigureerbaarheid. Zo is het denkbaar dat de gebruiker zijn gewenste patch te kennen geeft, en veel meer vrijheid heeft bij het kiezen van zijn implementaties, in de zin dat hij er meer van elk moduletype ter beschikking heeft. Zodra hij de Fynth opdraagt de patch in te laden, begint de software met een herprogrammering van de chip, m.n. die chipconfiguratie die veel implementaties voorziet van de soort, waarvan de gebruiker er veel vraagt. Vervolgens worden de patch-verbindingen gelegd op de werkwijze die momenteel gangbaar is bij de Fynth. Deze uitbreiding biedt de gebruiker in muzikale zin enkele vrijheden die nog niet aanwezig zijn in het huidige ontwerp. De voornaamste vrijheid is misschien wel de mogelijkheid om aan additieve synthese te doen: het volstaat dat de gebruiker een chipconfiguratie krijgt met een hele resem aan sinusgeneratoren (en voor de rest quasi niets), opdat hij zijn gang kan gaan in de creatie van een additief gesynthetiseerd instrument. 4
“.sof” is de extensie van bestanden die de programmering van de gehele chip herbergen. Ware deze tijd echt laag, dan worden andere scenario’s terug denkbaar, waarin software de chip herprogrammeert, en vervolgens vliegensvlug uit een ongewist geheugen de spelende noten heractiveert in de nieuw geconfigureerde chip. 5
110
5.2.2
MIDI Rechtoe Rechtaan
De Stratix PCI kaart is op zich voorzien van talrijke input pinnen. Anderzijds is het MIDI protocol een welomlijnd en overzichtelijk protocol, dat tot op het bot kan doorgrond worden. Een mooie uitbreiding ware het MIDI keyboard rechtstreeks aan de pinnen van de Stratix kaart te hangen. De decodering van MIDI boodschappen zou dan integraal deel worden van het hardware-ontwerp. Dit beeld wordt extra verleidelijk indien er een methode van initialisatie zou toegepast worden, die geen nood heeft aan software6 . In dat geval zou er immers geen nood meer zijn aan de PCI input7 . De kaart kan dan werken met een adaptorvoeding, en kan de ontvangende PC verlaten. De kaart kan in een doos gemonteerd worden, en fungeren als een volwaardige MIDI machine: input is een MIDI-signaal (en voeding), output is een stereo analoge audio-uitgang. Dit scenario zou de Fynth in zijn autonomie aanschouwelijk maken: hardware-ontwerp, zonder de nood aan een ontvangende PC.
5.2.3
Op een Xilinx chip...
Indien we dit ontwerp zouden implementeren op een Xilinx-chip, dan levert dit direct nieuwe vrijheden op. De belangrijkste is waarschijnlijk de herconfigureerbaarheid van de chip zelf. Hier zou een volgende strategie merkwaardige resultaten kunnen opleveren... Scheiden we de parallelle encoder/decoder en de seri¨ele decoder van elke muziekmodule van de rest van de module, dan bekomen we nieuwe vrijheden. De bovenvermelde twee vormen een interface-gedeelte, dat verplicht in de hardware aanwezig blijft. Deze interface-blokken hebben elk hun eigen adres op de bus. Wat aan deze interface hangt, wordt variabel. Het staat de gebruiker vrij om andere muziekmodules in te laden in de chip, en via de interface te connecteren, eventueel at runtime. Belangrijk probleem aan deze strategie is het formaat van de blokken. De oscillatoren, ADSR, middleman en delay line hebben vergelijkbare groottes; de filter is evenwel ongeveer drie keer groter. Wie soepel wil wisselen van module moet zeker op het gebied van schikking een grondig onderzoek doorvoeren... 6
Nog ´e´en struikelblok dient vermeld: de conversietabel van nootnummer naar frequentie zit in de huidige versie van de Fynth nog in software, en moet naar de hardware, als onderdeel van de sencoder, indien men de software wil loskoppelen van de hardware. 7 Een user pushbutton kan bv. de Fynth initialiseren met een ingebakken patchlijst. De commando’s worden dan gestockeerd in e.g. een MegaRam blok. Dit zou kunnen gecombineerd worden met een patchlist-toggle met behulp van het MIDI keyboard.
111
5.2.4
Verdere Alternatieven
In vogelvlucht sommen we nog enkele andere mogelijkheden op. Grotere woordbreedte: Typische vaste komma implementaties werken met interne representatie van 24 bit (na vermenigvuldiging 48 bit). Dit zou de geluidskwaliteit, en de frequentieresolutie ten goede komen. Evenwel een waarschuwing: de DSP-blokken maken intern direct de stap naar 36 bit woordbreedte! Willekeurige Golfvorm: Dit levert een mooie uitbreiding. Bedoeld wordt een oscillator, die in plaats van een golfvorm met vaste periode, een willekeurige door de gebruiker ingegeven sample afspeelt. De stockering van een dergelijke sample vergt, door zijn omvang, het gebruik van het DDR-geheugen. Het DDR-geheugen is totnogtoe onbenut in het ontwerp. Aanslaggevoeligheid: Deze uitbreiding zou de Fynth gevoelig maken aan de kracht waarmee een muzikant de toetsen indrukt. Meer bepaald zou de kracht het volume van de oscillatoren kunnen moduleren, en zo toestaan harde (forte) en zachte (piano) passages te spelen. Een dergelijke uitbreiding maakt de Fynth veel aantrekkelijker voor de toetsenman, en is haalbaar. (Meerstemmige) Partituurinlezing: Deze implementatie omvat zowel software als hardware. Ze stelt de gebruiker in staat een MIDI bestand, wijd verbreid bestandsformaat op het web, door de Fynth te laten weergeven. Daar deze bestanden overwegend polyfoon zijn, en meerdere instrumenten vergen, zou in hardware aan elk instrument een verschillende patch kunnen verbonden worden. Elk van deze patches zou dan onafhankelijk en simultaan een deel van de partituur weergeven, en zo een popgroep, tot een klein orkest simuleren. Deze implementatie is aantrekkelijk, en vormt een niet triviale doch haalbare uitdaging. Foutloze harmonischen: De mogelijke implementatie van de oscillatoren als wavetable generatoren, werd reeds aangehaald in Hoofdstuk 2, Subsectie 2.3.1. Het vormt, net als grotere woordbreedte, een verbetering van de geluidskwaliteit. De ontwerpers willen er hier op wijzen dat zij de aangehaalde oplossing nergens in de literatuur terugvonden, en dit misschien wel de eerste implementatie van een dergelijke oplossing ooit zou kunnen zijn. Het is zonder meer wenselijk om, alvorens dit soort oplossing door te voeren, eerst het grensnut te bestuderen, best tot en met simulatie van een typische compositie, met een waarde voor de gemiddelde SNR-winst als resultaat. Het is mogelijk dat deze winst heel laag uitvalt, en de uitbreiding nutteloos verklaart; in het andere geval kan het ontwerp zich na uitbreiding beroepen op een “nog kwaliteitsvollere geluidssynthese”. 112
Geparametriseerde dynamische herconfigureerbaarheid: De geschetste dynamische herconfiguurbaarheid uit Hoofdstuk 4 kan uitgebreid via parametrisatie. I.p.v. zo snel mogelijk van de ene patch naar de andere te switchen, zou men de gebruiker kunnen toestaan om, gedurende een door hem ingegeven periode, te glijden van ´e´en patch naar een andere. Filosofie: De woorden van professor Uncini8 citerend, “moet elke synthesizer een filosofie hebben”. In zijn opinie moeten moderne synthesizers volwaardige emulaties bieden van “de cult-legendes”, zoals Minimoog en Arp Odyssey, en zich vervolgens onderscheiden door nog beter te presteren op gebied van mogelijkheden. Uiteraard is zijn betoog eerder door synthesizer-ontwerp dan door hardware-ontwerp ingegeven; niettemin menen de ontwerpers dat de Fynth een uitgebouwde basis biedt om er een emulatie op uit te bouwen. Door het aanzienlijk deel software dat hierbij komt kijken, is dit evenwel geen typische uitbreiding voor een hardware-ontwerp. Het vormt een mooie opdracht als softwareimplementatie. Effici¨ entie Door modules als chronos te parametriseren, zou het denkbaar worden dat niet gebruikte bus-enables9 vrijkomen voor “behoeftige modules”. Dit zou leiden tot een verder integratie van de patch-intelligentie in de hardware. Deze laatste huist nu nog grotendeels in de software. Een andere denkpiste ware het aantal noten te parametriseren. Momenteel is het aantal noten acht, een typischer getal in polyfone toepassingen is 16. Een gebruiker zou e.g. tot 16 noten kunnen gaan, indien zijn patch voldoende eenvoudig blijft.
5.3 5.3.1
Besluit Strategie¨ en
Zoals zo vaak in het leven is ook hardware programmeren iets dat men al doende leert. De chip kwam de ontwerpers initieel voor als een mystieke, te onderwerpen labyrinth. Zij stelden vast hoe de black box zich, om voor hen onaanwijsbare redenen, ook door hen, onwetenden, liet programmeren. Achteraf begrepen ze hoe eenvoudig het kan zijn kleine ontwerpen in een chip te stoppen, en hoe moeilijk het kan worden voor grote ontwerpen. 8 Professor Uncini is professor aan universiteit “La Sapienza” te Rome. Hij doceert er “Theorie van Audiosignalen”. Hij is verbonden aan IEEE, is actief in de synthesizerwereld en organiseert jaarlijks een workshop rond elektronische muziek te Rome. Hij was ons van grote hulp met zijn in ervaring gewortelde advies. 9 t.t.z. bus-enables die uitgedeeld worden aan modules, die geen rol spelen in de huidige patch
113
De onwerpers willen benadrukken hoe vele initieel vage problemen en bugs zich na een tijd vertaalden in: • het herwerken van een protocol, of het uitwerken van een extra protocol • het uitdenken van nieuwe woordenschat, om uitzonderingsgevallen te kunnen duiden • het (her-)bedenken van de proces-verantwoordelijkheden • het restringeren van de interproces-communicatie • het orthogonaliseren van werkelijk alle geheugentoegangen Globaal genomen bleek, zeker na het debuggen, het bemeesteren van meerdere noten het meest complexe probleem. Binnen het ontwerp zijn op twee gebieden metastructuren aangebracht in de hardware: • implementaties als deelverzamelingen van modules • enkele-noot-weergave als deelverzameling van een implementatie Hoewel de behandeling van deze uitbreidingen conceptueel vergelijkbaar is, bleek de implementering in hardware totaal verschillend, en vergde steeds weer nieuwe, andere oplossingen.
5.3.2
Nooit Rond
De Fynth bleek een stevige kluif. Nooit tevoren hadden de ontwerpers zich verdiept in een opdracht waar werkelijk geen eind aan komt. Zoals het een goed uitgeschreven thesisonderwerp betaamt, geven de uitdenkers de denkpistes aan, en ontmoeten de ontwerpers zelf de grenzen. Zonder uitzondering waren zijzelf het, die zich moesten beknotten in hun ambitie, als weer een nieuwe weg zichtbaar werd. Het eerste gevoel was steeds opnieuw “The Sky is the Limit”. Af en toe wisten ze dit enthousiasme te temperen onder het motto: “Eerst zorgen dat de rest werkt”. Om toch een uitlaatklep te hebben voor onze ide¨een, namen we Sectie 5.2 op. De Fynth levert de ontwerpers vele mogelijke, en enkele effectieve implementaties. De ontwerpers menen dat ze met de Fynth een dynamisch huwelijk hebben tot stand gebracht: de jonge wereld van de digitale audio, met de niet minder jonge van FPGA-onwerp. Het ontwerp bleek zeer levensvatbaar te zijn, en werkt effectief tot in de hardware. Het is de stellige hoop van de ontwerpers dat dit werk verder groeit, en in handen van een opvolger-ontwerper een volgende leven krijgt. 114
Bijlage A Fynth - The Specs A.1
Technical Information
Sampling Rate (in kHz): approx. 32kHz1 Number of Output Channels: 2 Number of Notes: 8 Word Length of Output (in bit): 16 Word Length of Internal Representation (in bit): 18 Internal Number Representation: Fixed Point Data Input Medium: PCI bus, 33MHz Keyboard Input Standard: MIDI2
A.2
MIDI Implementation Chart
Fynth is receiving MIDI device only; recognised messages are
• note on (velocity ignored if not zero) • note on velocity zero (= note off) • note off 1 2
that is, 31.990kHz, derived from through software conversation
1 100 1042 . 3 M Hz
115
Bijlage B Integraal schema van de Fynth
116
117 Figuur B.1: Algemeen overzicht van de verschillende modules.
Bijlage C Quartus Report C.1
De resultaten: algemeen Flow Status Revision Name Top-Level Entity Name Family Device Total logic elements Total pins Total memory bits DSP block 9-bit elements Total PLLs Total DLLs
Successful - Fri Jun 25 23:36:54 2004 stratix top stratix top Stratix EP1S25F1020C5 19,009/25,660 (74 %) 151/207 (21 %) 724,653/1,944,576 (37 %) 38/80 (47 %) 1/6 (16 %) 0/2 (0 %)
c Flow Summary Tabel C.1: De Quartus II c Wat men in tabel C.1 ziet, is het algemene overzicht dat Quartus II ons geeft nadat de volledige toolchain doorlopen is.
In het bijzonder merken we op dat een groot aantal van de logische elementen is gebruikt. 74 % is niet niks, zeker niet voor een FPGA. Eigenlijk kan een FPGA enkel theoretisch 100 % worden benut. Het is beter om een beetje plaats over te hebben om de Fitter wat meer ademruimte te geven. Het percentage geheugengebruik is niet niks, maar liefst 37 %. Dat is veel als men weet dat er slechts ´e´en MegaRAM-blok is gebruikt. Het lege MegaRAM-blok kwam van pas bij het gebruik van de SignalTap II Logic Analyser. Wat nog interessant is, is het feit dat de ontwerpers voldoende hadden met de kleine helft van de DSP-blokken. Dat biedt de eventuele opvolgers de mogelijkheid om de woordbreedte bij vermenigvuldigingen wat uit te breiden, maar opnieuw geeft het aan de Fitter de vrijheid om de plaatsing uit te voeren. De ontwerpers hebben 1 PLL gebruikt om de 133 MHz klok te genereren. 118
C.2
De resultaten: timing Type Worst-case tsu Worst-case tco Worst-case tpd Worst-case th Worst-case minimum tco Worst-case minimum tpd Clock setup: ’pll: clk2 ’ Clock setup: ’pll: clk1 ’ Clock setup: ’pll: clk0 ’ Clock setup: ’clk’
Slack 0.706 ns 0.654 ns N/A 0.667 ns N/A N/A 0.045 ns 0.139 ns 0.216 ns 0.481 ns
Required Time 3.000 ns 6.000 ns None 0.000 ns None None 133.33 MHz (period 7.500 133.33 MHz (period 7.500 133.33 MHz (period 7.500 33.33 MHz (period 30.000
ns) ns) ns) ns)
Tabel C.2: Het Timing analyser rapport
De setuptijd (tsu), de Worst case clock to output tijd (tco) en de Worst case hold tijd (tpd) zijn mooi gehaald. Het meeste geduld is opgeofferd aan het halen van de tijden voor de 133.33 MHz klok. Zoals eerder vermeld hebben de ontwerpers drie maal deze klok gegenereerd, maar steeds met een andere fase vertraging (clk0 : 153 graden, clk1 : 122 graden en clk2 : 105 graden). Vanzelfsprekend zijn ze gestart met ´e´en 133 MHz klok, maar toen dat niet bleek te voldoen zijn gaandeweg clk1 en clk2 ook ontstaan. Men merke op dat er voor clk2 bv. weinig overschot is op de slack, ofte het verschil tussen de vereiste tijden en de gehaalde tijden. Vele keren is het voorgevallen dat het cijfertje in het rood werd afgebeeld en alles opnieuw moest door de Toolchain worden gehaald.
C.3
Het grondplan
In figuur C.1 is een typisch grondplan afgebeeld. We zien duidelijk dat heel wat c van de chip is ingepalmd door de Fynth. Ook biedt de QuartusII -omgeving de mogelijkheid om LogicLock -regio’s te voorzien. Dat zijn gebieden die de ontwerpers kunnen aanduiden en verbinden met een bepaalde module. M.a.w. men kan zelf de modules plaatsen in de hardware. Door het gebruik van LogicLock -gebieden kunnen de timing-vereisten beter gehaald worden. Daar is ook in de meegeleverde code voor de PCI-interface aan gedacht. Natuurlijk hebben ook de ontwerpers geprobeerd om met LogicLock -gebieden de tijdsvereisten te halen. Maar het resultaat was niet beter, integendeel. Een veel probatere oplossing was het introduceren van een extra 133.33 MHz klok! Het gevolg is dat de modules niet zoals in het algemeen schema, te vinden in Appendix B, mooi rechthoekig zijn afgelijnd. In Figuur C.1 is e.g. in het blauw te zien waar de sinusgenerator is neergeplant.
119
Figuur C.1: Het grondplan van de FPGA-chip. Onderaan (roze) zijn een aantal LogicLock regio’s te zien voor de PCI interface. In het blauw ziet men waar de sinus-generator zich situeert op de chip.
120
Bijlage D Geheugenindeling In deze appendix wordt de inhoud van modulegeheugens toegelicht. E´en voor ´e´en gaan we de modules met geheugen af, in de hoop dat een opvolger-ontwerper ermee gediend is. Om historische redenen is dit geformuleerd in het engels.
D.1
Square
The info is stored in a M4K block, configured as 128x18bit. Each position (pos) has 18 bits available. It consists of an Implementation section, and a Note Section. This information is also valid for other oscillators.
D.1.1
Implementation Section
contains information that is valid for one entire implementation of the e.g. square First implementation: Pos0 Target -Impl num- Duty Cycle - Sync - contr/sound Bit: 17 14 13 .. 10 9 2 1 0 Pos1 Volume Bit: 17 0 Second Implementation: same on Pos2 and 3
121
D.1.2
Note Section
contains information that is specific for each note First Implementation, first note: Pos4 Phase (eight MSB’s)- zeroes Bit: 17 10 9 0 Pos5 Frequency Bit: 17 0 Pos6 Offset Bit: 17 0 Pos7 Phase Bit: 170 Second Implementation, first note: same on Pos 8-11 This is repeated for the eight notes Impl0 Note 0: 4-7 Impl1 Note 0: 8-11 Impl0 Note 1: 12-15 Impl1 Note 1: 16-19 Impl0 Note 2: 20-23 Impl1 Note 2: 24-27 Impl0 Note 3: 28-31 Impl1 Note 3: 32-35 Impl0 Note 4: 36-39 Impl1 Note 4: 40-43 Impl0 Note 5: 44-47 Impl1 Note 5: 48-51 Impl0 Note 6: 52-55 Impl1 Note 6: 56-59 Impl0 Note 7: 60-63 Impl1 Note 7: 64-67 Space: Position 68 to 127 are empty
D.2
ADSR
supports 6 implementations
D.2.1
Implementation Section
Implementation section Pos0-7: Implementation 0 Pos 0 attackinc Pos 1 decaydec Pos 2 sustain Pos 3 releasedec 122
Pos 4 sustainmod Pos 5 target - impl info - control - zeroes Bit: 17 14 13 10 9 8 ... 0 Pos 6 / Pos 7 / Pos8-15: Impl1; Pos16-23: Impl2; Pos24-31: Impl3; Pos32-39: Impl4; Pos40-47: Impl5;
D.2.2
Note section
Note section another m4k block Pos 0 stage(17-16) Pos 1 phase Pos 2 valuein Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5
Note1: Note1: Note1: Note1: Note1: Note1: Note2: Note2: Note2: Note2: Note2: Note2: Note3: Note3: Note3: Note3: Note3: Note3: Note4: Note4: Note4: Note4: Note4: Note4:
0 - 3 Impl0 Note5: 128 - 131 4 - 7 Impl1 Note5: 132 - 135 8 - 11 Impl2 Note5: 136 - 139 12 - 15 Impl3 Note5: 140 - 143 16 - 19 Impl4 Note5: 144 - 147 20 - 23 Impl5 Note5: 148 - 151 32 - 35 Impl0 Note6: 160 - 163 36 - 39 Impl1 Note6: 164 - 167 40 - 43 Impl2 Note6: 168 - 171 44 - 47 Impl3 Note6: 172 - 175 48 - 51 Impl4 Note6: 176 - 179 52 - 55 Impl5 Note6: 180 - 183 64 - 67 Impl0 Note7: 192 - 195 68 - 71 Impl1 Note7: 196 - 199 72 - 75 Impl2 Note7: 200 - 203 76 - 79 Impl3 Note7: 204 - 207 80 - 83 Impl4 Note7: 208 - 211 84 - 87 Impl5 Note7: 212 - 215 96 - 99 Impl0 Note8: 224 - 227 100 - 103 Impl1 Note8: 228 - 231 104 - 107 Impl2 Note8: 232 - 235 108 - 111 Impl3 Note8: 236 - 239 112 - 115 Impl4 Note8: 240 - 245 116 - 119 Impl5 Note8: 246 - 250 123
D.3
Filter
supports 6 implementations 3 M4K blocks : one for first orderfilter, one for each second order filter
D.3.1
first order memory block
Implementation section Pos0-7: Implementation 0 Pos 0 cutoff frequency Pos 1 cutoff modulation Pos 2 resonance Pos 3 bandwidth Pos 4 target - impl info - control - zeroes Bit: 17 14 13 10 9 8 ... 0 Pos 5 / Pos 6 / Pos 7 / Pos8-15: Impl1; Pos16-23: Impl2; Pos24-31: Impl3; Pos32-39: Impl4; Pos40-47: Impl5;
Note section pos 0 valuein pos 1 memory Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1
Note1: Note1: Note1: Note1: Note1: Note1: Note2: Note2:
128 130 132 134 136 138 144 146
-
129 131 133 135 137 139 145 147
Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1
Note5: Note5: Note5: Note5: Note5: Note5: Note6: Note6:
192 194 196 198 200 202 208 210
-
124
193 195 197 199 201 203 209 211
Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5
Note2: Note2: Note2: Note2: Note3: Note3: Note3: Note3: Note3: Note3: Note4: Note4: Note4: Note4: Note4: Note4:
D.3.2
148 150 152 154 160 162 164 166 168 170 176 178 180 182 184 186
-
149 151 153 155 161 163 165 167 169 171 177 179 181 183 185 187
Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5
Note6: Note6: Note6: Note6: Note7: Note7: Note7: Note7: Note7: Note7: Note8: Note8: Note8: Note8: Note8: Note8:
212 214 216 218 224 226 228 230 232 234 240 242 244 246 248 250
-
213 215 217 219 225 227 229 231 233 235 241 243 245 247 249 251
second order memory block
In this blocks, only note information is stored. pos 0 memory1 pos 1 memory2 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5
Note1: Note1: Note1: Note1: Note1: Note1: Note2: Note2: Note2: Note2: Note2: Note2: Note3: Note3: Note3: Note3: Note3: Note3:
0 - 1 Impl0 Note5: 64 - 65 2 - 3 Impl1 Note5: 66 - 67 4 - 5 Impl2 Note5: 68 - 69 6 - 7 Impl3 Note5: 70 - 71 8 - 9 Impl4 Note5: 72 - 73 10 - 11 Impl5 Note5: 74 - 75 16 - 17 Impl0 Note6: 80 - 81 18 - 19 Impl1 Note6: 82 - 83 20 - 21 Impl2 Note6: 84 - 85 22 - 23 Impl3 Note6: 86 - 87 24 - 25 Impl4 Note6: 88 - 89 26 - 27 Impl5 Note6: 90 - 91 32 - 33 Impl0 Note7: 96 - 97 34 - 35 Impl1 Note7: 98 - 99 36 - 37 Impl2 Note7: 100 - 101 38 - 39 Impl3 Note7: 102 - 103 40 - 41 Impl4 Note7: 104 - 105 42 - 43 Impl5 Note7: 106 - 107 125
Impl0 Impl1 Impl2 Impl3 Impl4 Impl5
Note4: Note4: Note4: Note4: Note4: Note4:
D.4
48 50 52 54 56 58
-
49 51 53 55 57 59
Impl0 Impl1 Impl2 Impl3 Impl4 Impl5
Note8: Note8: Note8: Note8: Note8: Note8:
112 114 116 118 120 122
-
113 115 117 119 121 123
Delay Line
supports 6 implementations 1 M4K block and one M RAM block: the delayline itself
D.4.1
Implementation section
Pos0-7: Implementation 0 Pos 0 controllers (17 downto 15) Pos 1 echofactor Pos 2 volume left Pos 3 volume right Pos 4 delaydepth Pos 5 delaymod Pos 6 targetl - impl info l - controll - target - impl info r - controll Bit: 17 14 13 10 9 8 5 4 1 0 Pos 7 / Pos8-15: Impl1; Pos16-23: Impl2; Pos24-31: Impl3; Pos32-39: Impl4; Pos40-47: Impl5;
D.4.2
Note section
pos 0 valuein Impl0 Impl1 Impl2 Impl3 Impl4
Note1: Note1: Note1: Note1: Note1:
64 65 66 67 68
Impl0 Impl1 Impl2 Impl3 Impl4
Note5: Note5: Note5: Note5: Note5:
96 97 98 99 100
126
Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5
Note1: Note2: Note2: Note2: Note2: Note2: Note2: Note3: Note3: Note3: Note3: Note3: Note3: Note4: Note4: Note4: Note4: Note4: Note4:
D.5
69 72 73 74 75 76 77 80 81 82 83 84 85 88 89 90 91 92 93
Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5 Impl0 Impl1 Impl2 Impl3 Impl4 Impl5
Note5: Note6: Note6: Note6: Note6: Note6: Note6: Note7: Note7: Note7: Note7: Note7: Note7: Note8: Note8: Note8: Note8: Note8: Note8:
101 104 105 106 107 108 109 112 113 114 115 116 117 120 121 122 123 124 125
Middleman
supports 12 implementations one M4K block
D.5.1 Pos Pos Pos Pos Pos Pos Pos Pos Pos Pos Pos
Implementation section
0: Implementation 0 target - impl info - control - zeroes 1: Implementation 1 target - impl info - control - zeroes 2: Implementation 2 target - impl info - control - zeroes 3: Implementation 3 target - impl info - control - zeroes 4: Implementation 4 target - impl info - control - zeroes 5: Implementation 5 target - impl info - control - zeroes 6: Implementation 6 target - impl info - control - zeroes 7: Implementation 7 target - impl info - control - zeroes 8: Implementation 8 target - impl info - control - zeroes 9: Implementation 9 target - impl info - control - zeroes 10: Implementation 10 target - impl info - control - zeroes
127
Pos 11: Implementation 11 target - impl info - control - zeroes
D.5.2
Note section
pos 256 valuein left pos 257 valuein right Impl0 Note1: 256 - 257 Impl0 Note5: 384 - 385 Impl1 Note1: 258 - 259 Impl1 Note5: 386 - 387 Impl2 Note1: 260 - 261 Impl2 Note5: 388 - 389 Impl3 Note1: 262 - 263 Impl3 Note5: 390 - 391 Impl4 Note1: 264 - 265 Impl4 Note5: 392 - 393 Impl5 Note1: 266 - 267 Impl5 Note5: 394 - 395 Impl6 Note1: 268 - 269 Impl6 Note5: 396 - 397 Impl7 Note1: 270 - 271 Impl7 Note5: 398 - 399 Impl8 Note1: 272 - 273 Impl8 Note5: 400 - 401 Impl9 Note1: 274 - 275 Impl9 Note5: 402 - 403 Impl10 Note1: 276 - 277 Impl10 Note5: 404 - 405 Impl11 Note1: 278 - 279 Impl11 Note5: 406 - 407 Impl0 Note2: 288 - 289 Impl0 Note6: 416 - 417 Impl1 Note2: 290 - 291 Impl1 Note6: 418 - 419 Impl2 Note2: 292 - 293 Impl2 Note6: 420 - 421 Impl3 Note2: 294 - 295 Impl3 Note6: 422 - 423 Impl4 Note2: 296 - 297 Impl4 Note6: 424 - 425 Impl5 Note2: 298 - 299 Impl5 Note6: 426 - 427 Impl6 Note2: 300 - 301 Impl6 Note6: 428 - 429 Impl7 Note2: 302 - 303 Impl7 Note6: 430 - 431 Impl8 Note2: 304 - 305 Impl8 Note6: 432 - 433 Impl9 Note2: 306 - 307 Impl9 Note6: 434 - 435 Impl10 Note2: 308 - 309 Impl10 Note6: 436 - 437 Impl11 Note2: 310 -311 Impl11 Note6: 438 - 439 Impl0 Note3: 320 - 321 Impl0 Note7: 448 - 449 Impl1 Note3: 322 - 323 Impl1 Note7: 450 - 451 Impl2 Note3: 324 - 325 Impl2 Note7: 452 - 453 Impl3 Note3: 326 - 327 Impl3 Note7: 454 - 455 Impl4 Note3: 328 - 329 Impl4 Note7: 456 - 457 Impl5 Note3: 330 - 331 Impl5 Note7: 458 - 459 Impl6 Note3: 332 - 333 Impl6 Note7: 460 - 461 Impl7 Note3: 334 - 335 Impl7 Note7: 462 - 463 Impl8 Note3: 336 - 337 Impl8 Note7: 464 - 465 Impl9 Note3: 338 - 339 Impl9 Note7: 466 - 467 Impl10 Note3: 340 - 341 Impl10 Note7: 468 - 469 128
Impl11 Note3: 342 - 343 Impl11 Note7: 470 - 471 Impl0 Note4: 344 - 345 Impl0 Note8: 480 - 481 Impl1 Note4: 346 - 347 Impl1 Note8: 482 - 483 Impl2 Note4: 348 - 349 Impl2 Note8: 484 - 485 Impl3 Note4: 350 - 351 Impl3 Note8: 486 - 487 Impl4 Note4: 352 - 353 Impl4 Note8: 488 - 489 Impl5 Note4: 354 - 355 Impl5 Note8: 490 - 491 Impl6 Note4: 356 - 357 Impl6 Note8: 492 - 493 Impl7 Note4: 358 - 359 Impl7 Note8: 494 - 495 Impl8 Note4: 360 - 361 Impl8 Note8: 496 - 497 Impl9 Note4: 362 - 363 Impl9 Note8: 498 - 499 Impl10 Note4: 364 - 365 Impl10 Note8: 500 - 501 Impl11 Note4: 366 - 367 Impl11 Note8: 502 - 503
129
Bijlage E Overzicht van de bijgeleverde digitale documentatie Samen met dit document stellen de ontwerpers ook documentatie in digitale versie ter beschikking. Op het pakket bevinden zich de volgende zaken. • Dit document in Adobe Acrobat pdf-formaat. • Het bestand van de presentatie van de Fynth, gegeven te Rome op 10 juni 2004, in het kader van de cursus “Sistemi Digitali”, opleidingsonderdeel aan de universiteit “La Sapienza”. • De bestand van de presentatie van de Fynth, gegeven te Gent op 1 juli 2004, ter verdediging van de thesis, opleidingsonderdeel aan de “Universiteit Gent”. • Een Quartus II, versie 4 project, met alle VHDL-code erin gebundeld. • Enkele opnames van demo-weergaves van de Fynth, gestockeerd in wave-formaat. • Tussentijdse, voorlopige documentatie (die uiteindelijk tot het einddocument geleid heeft), gebundeld in een map “Unfinished”. • Het programma Hermes, en zijn broncode, geschreven in C.
130
Bibliografie [1] P. Faes. Pcicp - pci copy program for linux, 2003. Programma geschreven in C. 59 [2] Dani¨el Gistelinck. Vademecum van de Algemene Muziekleer. Aniscore, 1997. derde druk. 18 [3] R.A. Moog. Voltage-controlled electronic music modules. Journal of the Audio Engineering Society, 13(3):200–206, July 1965. vii, ix [4] Mauro Olivieri. Sistemi digitali. Technical report, Universit`a di Roma ”La Sapienza”, Dipartimento Elettronica, Via Eudossiana, 18 I-00184 Roma, 2002. 44 [5] Curtis Roads. The Computer Music Tutorial. the MIT Press, 1996. ISBN 0-252-18158-4. 17, 23, 25 [6] Aurelio Uncini. Trattamento del segnale audio. Technical report, Universit`a di Roma ”La Sapienza”, Dipartimento INFOCOM, Via Eudossiana, 18 I-00184 Roma, April 2004. 15, 22, 29, 30, 85, 87 [7] John Watkinson. An Introduction To Digital Audio. Focal Press, 1994. reprint 1995, ISBN 0-252-18158-4. 27
131