Dem Klang auf der Spur - Teil 3
Nachdem im zweiten Teil dieser Reihe einige allgemeine Grundlagen aus dem Themenkomplex »Musik und Computer« dargestellt worden sind, wird in dieser Folge ausführlich der Synthesizer Chip SID (Sound Interface Device) 6581 vorgestellt.
Der SID (Sound Interface Device) ist funktionell an das klassische Konzept von Moog angelehnt. Dadurch ist seine Arbeitsweise leicht verständlich. Bild 1 zeigt das Blockschema des SID. Dieses Schema dient dazu, den Fluß der Audio-Signale zu veranschaulichen. Die Funktionsblöcke waren in ähnlicher Form bereits Bestandteile des Synthesizer-Schemas aus Teil 2. Den linken Teil des Schemas bilden drei identische, voneinander unabhängige, Funktionsgruppen.
Eine solche Gruppe setzt sich aus einem DCO (Digital Controlled Oscillator), einem Amplitudenmodulator (oder auch DCA = Digital Controlled Amplifier) und einem Hüllkurvengenerator (EG = Envelope Generator) zusammen. Der DCO kann wahlweise eine von vier Kurvenformen erzeugen: Dreieck, Sägezahn, Rechteck und Rauschen. Dabei ist das Tastverhältnis der Rechteckkurve steuerbar. Unter dem Tastverhältnis versteht man das Verhältnis zwischen der Länge des Kurvenabschnitts mit hoher Spannung zur gesamten Periodenlänge. Eine symmetrische Rechteckkurve hat demnach ein Tastverhältnis von 50 Prozent. Eine Veränderung im Tastverhältnis T bewirkt eine Klangfarbenänderung. So klingt eine Rechteckkurve mit T = 50 Prozent voluminös. Bewegt man sich mit T in Richtung 0 Prozent oder 100 Prozent, so wird der Klang zunehmend obertonreicher aber dünner, da der Anteil des Grundtons abnimmt. Einen besonders lebendigen Klang erhält man durch dynamische Veränderung des Tastverhältnisses, wras zwar in der SID-Hardware nicht realisiert, aber softwaremäßig möglich ist.
Funktioneller Aufbau des SID
Der Hüllkurvengenerator beeinflußt über den Amplitudenmodulator den zeitlichen Lautstärkeverlauf der vom DCO kommenden Kurve. Die Hüllkurve wird nach dem bekannten ADSR-Schema parametrisiert.
Synchronisation und Ringmodulation
Die senkrechten Verbindungen von DCO1 zu DCO2, von DCO2 zu DCO3 und von DCO3 zurück zu DCO1 können einzeln zu- oder abgeschaltet werden. Sie dienen Spezialeffekten, die das Spektrum des SID beträchtlich erweitern. Im Normalfall, wenn diese Steuerpfade unwirksam geschaltet sind, schwingen die drei DCOs unabhängig voneinander, jeder in seiner vorprogrammierten Frequenz und Kurvenform. Im Falle der Synchronisation zwingt der synchronisierende DCO einen weiteren DCO dazu, gleichphasig zu schwingen. In Bild 2 erzeugt DCO1 eine Sägezahnschwingung von 100 Hz und synchronisiert DCO2, der ebenfalls auf Sägezahn, aber 350 Hz eingestellt ist. Nach jeweils dreieinhalb Perioden wird DCO 2 gezwungen, eine neue Periode anzufangen. DCO2 erzeugt so eine viel komplexere Kurvenform, als er es ohne Synchronisation tun würde. Variiert man nun noch die Frequenz eines der beiden DCOs, während man die des anderen konstant hält, so erzeugt DCO2 ständig andere Kurvenformen. Man erhält damit schwer zu beschreibende, aber meistens »elektronisch« (im Sinne von »unnatürlich«) klingende Muster.
Wenn man zu jedem Zeitpunkt die Werte zweier Kurvenzüge miteinander multipliziert, so spricht man von Ringmodulation Dieser Vorgang hat eine Ähnlichkeit mit der Modulation einer Schwingung mit einer Hüllkurve, wie sie im SID auch vorkommt. Die Hüllkurve ist aber eine Funktion, die sich, verglichen mit dem Signal das sie moduliert, nur langsam verändert. Dadurch bleibt bei dieser Modulation der Klangcharakter des modulierten Signals erhalten, es ändert sich nur seine Lautstärke.
Bei der Ringmodulation dagegen ist das modulierende Signal von ähnlicher Beschaffenheit wie das modulierte Signal. Beide Signale dürfen ähnliche Frequenzen haben und als Kurvenzüge auch positive und negative Werte annehmen, wogegen eine Hüllkurve immer nur nichtnegative Werte hat. Bei der Ringmodulation geht im Allgemeinen der Klangcharakter beider beteiligten Kurven verloren; es entsteht ein ganz neuer Klang. Man macht sich das am besten anhand zweier Sinusschwingungen klar:
\[ \sin(\omega_1 t) \sin(\omega_2 t) = \frac{1}{2} \left( \cos((\omega_1 - \omega_2)t) - \cos((\omega_1 + \omega_2)t) \right) \]
Das bedeutet, daß man durch Multiplikation zweier Sinusschwingungen ein Signalgemisch erhält, das aus Schwingungen mit der Summe und der Differenz der ursprünglichen Frequenzen besteht. Die ursprünglichen Frequenzen verschwinden dabei vollkommen. Die Formel liefert auf der rechten Seite zwar Cosinus-Terme, für den Klang ist das allerdings unerheblich, da sich Sinus und Cosinus nur durch eine Phasenverschiebung unterscheiden. Unterzieht man nun andere Kurvenformen einer Ringmodulation, so muß man alle Obertöne der einen Kurve mit allen Obertönen der anderen Kurve gemäß der obigen Formel verrechnen. Dadurch entsteht ein sehr reichhaltiges neues Obertonspektrum. Die neuen Obertöne stehen dabei nicht mehr in harmonischen, das heißt ganzzahligen Verhältnissen zueinander. Aus diesem Grund eignen sich Ringmodulatorklänge auch kaum zur Wiedergabe von Melodien. Im natürlichen Umfeld findet man unharmonische Obertonverhältnisse zum Beispiel bei Glocken, Gongs und schwingenden Metallplatten. Zu deren Nachahmung eignen sich die Ringmodulatorklänge.
Beim SID steht zur Ringmodulation nur die Dreiecksschwingung zur Verfügung. Wenn DCO1 den DCO2 moduliert, ist das Ringmodulatorprodukt nur dann hörbar, wenn DCO2 auf Dreieckskurve eingestellt ist. Noch komplexere Klänge erhält man beim SID durch Einbeziehen aller drei DCOs in die Modulationskette, wobei man durch den Signalpfad DCO3 nach DCO1 den Kreis auch noch schließen kann. Die Ergebnisse werden dann allerdings schwer vorhersagbar, lassen also noch genug Räum für Experimente und Überraschungen.
Filterung
Leider hat der SID nur ein gemeinsames Filter für die drei DCO-EG-AM-Gruppen. Möchte man unterschiedliche Klangbilder zur gleichen Zeit erzeugen, so kann man nur durch die Wahl von Kurvenform und Hüllkurve differenzieren. Man hat aber immerhin die Wahl, ob man die DCO-EG-AM-Produkte überhaupt durch das Filter schickt oder am Filter vorbei direkt zum Ausgang. Diese Funktion erfüllen im Blockschema die Schalter »FILTER 1«, »FILTER 2« und »FILTER 3«. Das Filter kann als Hochpaß, als Bandpaß oder als Tiefpaß wirken, wobei die Funktionen auch parallel schaltbar sind. So erhält man zum Beispiel aus der Kombination Hochpaß und Tiefpaß eine sogenannte Bandsperre (oder »Notch-Filter«), die ein schmales Band aus dem Gesamtspektrum unterdrückt. Es sind die Parameter Eck- beziehungsweise Mittenfrequenz (für HP, BP und TP gemeinsam) sowie die Resonanz programmierbar. Ein weiteres Qualitätskriterium eines Filters ist seine Steilheit. Diese Größe beschreibt, wie schnell ein Filter in der Umgebung der Eck- beziehungsweise Mittenfrequenz vom durchlassenden in den sperrenden Zustand übergeht.
Als Faustregel gilt, daß ein Filter um so »besser« klingt, je steiler es ist. Beim Hoch- und Tiefpaß des SID beträgt die Steilheit 12 db/Oktave, beim Bandpaß 6 dB/Oktave. 12 dB/Oktave bedeuten, daß zum Beispiel im Übergangsbereich des Tiefpasses ein Signal um das Vierfache abgeschwächt wird, wenn seine Frequenz verdoppelt wird. 6 dB/Oktave bedeuten eine Abschwächung (oder Anhebung) um das Zweifache bei Frequenzverdopplung. Die Filtersteilheit ist im Allgemeinen und auch beim SID fest vorgegeben. Zur Orientierung sei noch erwähnt, daß die Filter im professionellen Synthesizer meistens eine Steilheit von 24 dB/Oktave haben.
Die gefilterten oder ungefilterten Signale im SID werden auf einen DCA geführt, wo man noch die Gesamtamplitude des Ausgangssignals programmieren kann. Über einen Analogeingang kann man auch noch ein externes Signal gefiltert oder ungefiltert zumischen. Dieses Signal könnte zum Beispiel von einem zweiten SID stammen.
Gegenüber dem im ersten Teil vorgestellten klassischen Synthesizerkonzept findet man im SID keinen LFO, mit dem man Frequenz, Amplitude oder einen Filterparameter modulieren könnte. Diese Funktion kann man aber rein softwaremäßig realisieren. Eine Hilfe dazu können DCO3 und EG3 sein. Man kann zu jedem Zeitpunkt den Amplitudenwert von DCO3 und von EG3 abfragen. Programmiert man DCO3 als LFO, das heißt auf eine sehr niedrige Frequenz, so kann man die Amplitudenwerte von DCO3 (mit geeigneter Skalierung) zur Frequenz von DCO1 oder DCO2 addieren. Tut man das in regelmäßigen Zeitabständen und mehrfach innerhalb einer Periodendauer von DCO3, so kann man damit ein Vibrato realisieren.
Auf gleiche Weise kann man auch die von EG3 gelieferte Hüllkurve zur Modulation beispielsweise des Filters heranziehen. Beide Möglichkeiten erfordern allerdings zusätzliche schnelle Programme, die sich nur in Maschinensprache realisieren lassen.
Wenn man DCO3 und/oder EG3 zu Modulationszwecken benützt, möchte man das von AM3 produzierte Signal unter Umständen nicht hören. Dazu kann man es mit dem zusätzlichen Schalter »AUS« unterdrücken.
Im letzten Teil wurde schon angesprochen, daß ein digitaler Synthesizer wie der SID nicht durch Potentiometer und durch Spannungen beeinflußt wird, sondern durch digitalisierte Parameter. Dazu besitzt der SID 29 Register mit einer Länge von 8 Bit. Davon können 25 nur beschrieben werden (ihre Inhalte steuern das Verhalten des SID) und 4 nur gelesen werden. Die 29 Register werden durch die Adreß-Decodierungs-Hardware auf dem CPU-Speicherbereich $D400 bis $D41C abgebildet (dezimal: 54272 bis 54300).
Die Steuerung des SID
Die SID-Register lassen sich so mit allen hauptspeicherbezogenen Maschinenbefehlen oder mit PEEK und POKE ansprechen. Da in einzelnen Registern oft mehrere Bits mit unterschiedlicher Bedeutung zusammengefaßt sind, erfordert ihre Programmierung ein hohes Maß an maschinennahem Denken, egal ob in Basic oder in Maschinensprache programmiert wird.
Die Tabelle 1 zeigt die Bedeutung der einzelnen Register im Detail. Der Registersatz gliedert sich in drei mal sieben Register zur Steuerung der drei DCO-EG-AM-Gruppen für die drei Stimmen, in vier Register zur Filtersteuerung und in vier Leseregister. Die sieben Register zur Steuerung einer DCO-EG-AM-Gruppe haben für alle drei Stimmen den gleichen Aufbau und die gleiche Bedeutung.
Frequenz low/high (Register 0 und 1)
Die beiden Register 0 und 1 steuern die Frequenz von DCO1 mit einer Genauigkeit von 16 Bit. Register 0 enthält das niederwertige, Register 1 das höherwertige Byte einer 16-Bit-Größe F. Zwischen der Ausgangsfrequenz f und der Zahl F besteht der Zusammenhang:
(1) f = F × T/2↑24(Hz)
Dabei ist T die Taktfrequenz der CPU, die auch am SID anliegt. Sie beträgt bei der deutschen Version des C 64 0,985248 MHz
Damit gilt:
(2) f = F × 0,0587254 (Hz) oder
(3) F = f × 17,0284
Die Gleichungen (2) und (3) zeigen, daß sich die Frequenzen der DCOs sehr fein, in Schritten zu zirka 1/17 Hz, programmieren lassen. Möchte man eine vorgegebene Frequenz f (im Beispiel FAUS) erzeugen, so errechnet man F nach (3),
10 FAUS = 440
20 F = FAUS * 17.0284
man zerlegt F in das Low- und das High-Byte,
30 F = INT(F + 0.5) :REM RUNDUNG
40 HI = INT(F/256)
50 LO = F - 256*HI
und besetzt Register 0 und 1 damit
60 SID = 54272 :REM BASISADRESSE
70 POKE SID,LO
80 POKE SID + 1,HI
Pulsweite low/high (Register 2 und 3)
Der Inhalt dieser Register steuert das Tastverhältnis der Rechteckkurve. Er ist nur dann bedeutend, wenn als Kurvenform das Rechteck gewählt wird. Die Pulsweite kann auf 12 Bit genau festgelegt werden. Register 2 enthält das Low-Byte, Register 3 das High-Byte, von dem nur die unteren 4 Bits (P8 bis P11) berücksichtigt werden. Zwischen der 12-Bit-Größe P und dem Tastverhältnis PAUS besteht der Zusammenhang:
(4) PAUS = P / 40.95 (%)
oder
(5) P = PAUS * 40.95
Die Programmierung gestaltet sich dann in der Praxis analog zu der der Frequenz:
90 PAUS = 50
100 P = PAUS * 40.95
110 P = INT(P + 0.5) :REM RUNDUNG
120 HI = INT (P/256)
130 LO = P - 256*HI
140 POKE SID + 2,LO
150 POKE SID + 3,HI
Kontrollregister (Register 4)
Jedes Bit dieses Registers hat eine eigene Bedeutung.
GATE (Bit 0)
Dieses Bit steuert den Hüllkurvengenerator EG 1. Wird es gesetzt, startet EG1 eine Ättack-Decay-Sequenz. Die Hüllkurve bleibt anschließend auf dem programmierten Sustain-Pegel, bis das GATE-Bit zurückgesetzt wird. Durch das Zurücksetzen geht die Hüllkurve in die Release-(Auskling-)Phase.
Synchronisation (Bit 1)
Wird es gesetzt, so wird DCO1 von DCO3, wie schon beschrieben, synchronisiert.
Ringmodulation (Bid 2)
Wird es gesetzt, so erzeugt DCO1 das Ringmodulatorprodukt der Dreieckskurven von DCO3 und DCO1. Diese wird allerdings nur dann hörbar, wenn als Kurvenform von DCO1 das Dreieck gewählt wird.
Test (Bit 3)
Bei gesetztem Test-Bit wird DCO1 auf Nullpegel gezwungen. Er erzeugt in diesem Zustand keine Schwingung. Man kann DCO1 damit softwaregesteuert synchronisieren, um, ähnlich wie durch die Synchronisation durch DCO3, komplexere Kurvenformen zu erhalten.
Kurvenform (Bit 4 bis 7)
Durch Setzen eines dieser 4 Bits wählt man eine der Kurvenformen Dreieck, Sägezahn, Rechteck oder Rauschen. Es muß mindestens eines dieser Bits gesetzt sein, damit überhaupt etwas hörbar wird. Eine Eigenart des SID ist es, daß sich die Kurvenformen nicht additiv verhalten. Werden mehrere der Bits 4 bis 7 zugleich gesetzt, so erzeugt der SID eine Kurvenform, deren Amplitudenwerte man durch logische AND-Verknüpfung der Amplitudenwerte der einzelnen Kurven erhält. Diese AND-Verknüpfung muß man sich bitweise auf die Amplitudenwerte darstellenden Bytes angewandt vorstellen.
Das Rauschen verdient noch eine besondere Betrachtung. Bei Rauschen kann man nicht von einer Frequenz im üblichen Sinne reden. Dennoch ist der Charakter des SID-Rauschens über die Größe F in Register 0 und 1 beeinflußbar. Rauschen wird im SID durch eine Quasi-Zufallsfolge von numerischen Werten realisiert. Die Rate, mit der der DCO diese Zufallszahlen erzeugt, ist genau die durch F programmierte Frequenz. Ein Rauschen mit »hoher Frequenz« klingt heller oder »weißer« als Rauschen mit niedriger Frequenz.
Bei der Programmierung des Kontrollregisters muß man sich vorher den Wert jedes einzelnen Bits zurechtlegen und in das Byte packen. Das Anstoßen eines Rechteckklanges beispielsweise wird durch Setzen von Bit 0 und Bit 6 erreicht. Der numerische Wert des Kontrollbytes ist dann: 2↑0 + 2↑6 = 65
also: 240 POKE SID+4,65
Ein hörbares Resultat wird aber auch erst dann erzielt, wenn vorher die Hüllkurvenparameter vernünftig gesetzt sind.
ADSR (Register 5 und 6)
Die Parameter A, D, S und R können in 16 Abstufungen entsprechend 4 Bit Auflösung programmiert werden. Die Stufung für den Sustain-Pegel ist linear. S = 0 entspricht dem Ruhepegel, S = 15 entspricht dem Maximalpegel nach Attack. Bei S = 15 besitzt die Hüllkurve keine Decay-Phase. Die Abstufungen für die Attack-, Decay- und Release-Zeiten sind vernünftigerweise nicht linear, um sehr kurze und sehr lange Zeiten gleichermaßen zu ermöglichen. Tabelle 2 enthält die realisierbaren Attack-, Decay- und Release-Zeiten.
Wert Dez. | Hex | Attack | Decay/Release |
0 | 0 | 2 ms | 6 ms |
1 | 1 | 8 ms | 24 ms |
2 | 2 | 16 ms | 48 ms |
3 | 3 | 24 ms | 72 ms |
4 | 4 | 38 ms | 114 ms |
5 | 5 | 56 ms | 168 ms |
6 | 6 | 68 ms | 204 ms |
7 | 7 | 80 ms | 240 ms |
8 | 8 | 100 ms | 300 ms |
9 | 9 | 250 ms | 750 ms |
10 | A | 500 ms | 1,5s |
11 | B | 800 ms | 2,4 s |
12 | C | 1 s | 3s |
13 | D | 3s | 9s |
14 | E | 5s | 15 s |
15 | F | 8 s | 24 s |
Die Zeiten gelten bei einer System-Taktfrequenz von 1 MHz. Da diese Frequenz beim deutschen C 64 mit 0,985248 MHz nur gering davon abweicht, ist die Tabelle auch für diese Frequenz brauchbar.
Quelle: Commodore 64 Programmers Reference Guide
Decay und Release können direkt in die Register 5 und 6 geschrieben werden, während Attack und Sustain vorher mit 16 zu multiplizieren sind, was einer Linksverschiebung um vier binäre Stellen entspricht. Ein Beispiel:
160 A = 2 :REM 16 MS
170 D = 12 :REM 3 S
180 S = 1
190 R = 10 :REM 1.5 S
200 POKE SID + 5,A*16 + D
210 POKE SID + 6,S*16 + R
Nach vorläufigem Umgehen des Filters und Setzen der maximalen Lautstärke
220 POKE SID + 23,0 :REM FILTER AUS
230 POKE SID + 24,15 :REM LAUTSTÄRKE
führt das Setzen des GATE-Bits:
240 POKE SID + 4,65 :REM GATE AN
zu einem vernünftigen Resultat. Zum Abschalten des Klanges kann man einfach das Kontrollregister mit 0 besetzen,
270 POKE SID + 4,0
doch dann hat DCO1 keine Gelegenheit, der Release-Phase entsprechend auszuklingen, da auch das Kurvenform-Bit (Nr. 6) zurückgesetzt ist. Besser ist also, Bit 6 gesetzt zu lassen:250GETA$:IFA$ = “ " THEN 160
260 REM WARTE AUF EINE TASTE
270 POKE SID + 4,64 :REM GATE AUS
Die Basic-Zeilen zeigen natürlich keinen effizienten Programmierstil; sie sollen nur die Vorgehensweise darstellen.
Auf die Steuerung des Filters und auf die Anwendung der Leseregister wird im nächsten Teil noch ausführlich eingegangen werden. So ist die Abfrage eines analogen Gebers (zum Beispiel Paddle) erst durch den SID möglich. Die sechs kleinen Beispielprogramme demonstrieren einige Effekte, die man mit den bis hierher beschriebenen Registern realisieren kann.
(Thomas Krätzig/aa)