BASIC-Kurs : "Von Adam und Eva..." (Teil 6)
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Herzlich Willkommen zum 6. Teil unsers BASIC-Kurses.
Nachdem mich meine Mitredakteure letzen Monat wegen
Platzmangels aus meiner Sparte geschmissen haben,
geht es nun wieder weiter im Text. Allerdings kann
ich Ihnen eine weitere kleine Enttäuschung nicht vor-
enthalten. Ich hatte Ihnen im Mai zwar versprochen,
daß wir uns dieses Mal mit der Grafik beschäftigen
würden, doch möchte ich dies nun erst einmal auf-
schieben. Der Grund hierfür liegt darin, daß nach
diesem Kurs hier ein Grafikkurs geplant ist. Da habe
ich dann auch genügend Platz und Freiheit, Ihnen die-
ses Thema besser zu erläutern und näher zu bringen.
Gerade die Grafik ist beim C64 ein sehr brisantes
Thema, zumal BASIC die Grafikprogrammierung in kein-
ster Weise unterstützt, wie man das von größeren Com-
putern (ich sage da ja nur "AMIGA" und "AmigaBasic")
gewohnt ist. Doch ganau das wird dann Thema dieses
Kurses werden, weshalb ich Sie jetzt noch 3 Monate
vertrösten muß. Dann wird nämlich der Basickurs been-
det sein.
Nun wollen wir aber einmal mit diesem sechsten Basic-
kurs beginnen. Ich möchte Sie nun ein wenig in die
Soundprogrammierung des 64ers einführen, die auch
nicht gerade ohne ist, und für die Sie die Informa-
tionen über das Binärsystem und den Speicheraufbau
des C64 vom letzten Mal genauso, wenn nicht sogar
noch mehr, benötigen.
Erinnern wir uns : mit der Soundprogrammierung hat
der SID, der Chip der Musik erzeugt, etwas zu tun.
Wir hatten ja gelernt, daß die Adressen mit denen man
ihn programmiert im sogenannten I/O-Bereich (INPUT-
/OUTPUT- oder EIN-/AUSGABE-Bereich) liegen, der sich
von Adresse 53248 bis 57344 erstreckt. "Puh!" werden
Sie sagen, "Das sind ja mehr als 4000 Speicherzel-
len ! Wie soll man sich die denn alle merken !" Doch
keine Angst ich kann Sie beruhigen. Der SID belegt
lediglich 28 davon. Ebenso wie alle anderen Ein-
/Ausgabe-Bausteine (es sind derer insgesamt vier, die
wir hier allerdings, außer dem SID, nicht behandeln
werden), die auch nicht mehr als 50 Bytes in diesem
Riesenbereich belegen. Doch Vorsicht. Sie können hier
zwar die meisten Adressen mit beliebigen Werten be-
schreiben, doch ist es NICHT möglich die nicht be-
nutzten Speicherzellen zu benutzen. Sollten Sie hier
einen Wert hineinschreiben, so wird gar nichts pas-
sieren, da die adressierte Speicherzelle nämlich phy-
sisch, also im Innern Ihres 64ers, gar nicht exi-
stiert. Sie bekommen irgendwelche Werte beim Auslesen
mit PEEK geliefert, und beim Schreiben mit POKE wird
der zu schreibende Wert einfach, wie bei einer ROM-
Speicherzelle, ignoriert.
Doch gehen wir nun einmal zu den Speicherzellen die
wir benutzen DÜRFEN. Die sogenannte Basisadresse des
SID liegt bei Adresse 54272. Dies ist die erste Spei-
cherzelle des SID. Sie ist deshalb so wichtig, weil
wir sie benutzen wollen, um sogenannte "Register"
adressieren zu können. Ein Register ist eine Spei-
cherzelle des SID (oder eines anderen I/O-Bausteins)
die man mit Hilfe der Basisadresse und der Register-
nummer anspricht. Hierzu vielleicht ein Beispiel. Mit
dem Befehl:
POKE SI+24,15
setzt man die Lautstärke der erzeugten Töne auf
"laut". Hierbei steht die Variable SI für die Basisa-
dresse des SID, wir haben ihr also vorher den Wert
54272 zugeordnet ! Das Register 24 des SID ist für
die Lautstärke verantwortlich. Schreibt man hier 0
hinein, so wird der Ton gänzlich abgeschaltet. Mit 15
schalten Sie volle Lautstärke ein. Natürlich können
Sie auch alle Werte zwischen 0 und 15 hier benutzen.
Diese sind dann eben je nach dem mehr, oder weniger
laut.
Nachdem Sie nun hoffentlich über die Bedeutung eines
Registers ausfgeklärt sind, möchte ich erst einmal zu
den Grundlagen übergehen. Wie Sie vielleicht wissen
verfügt Ihr 64er über drei "Stimmen". Das heißt er
kann 3 verschiedene Töne gleichzeitig gerenerieren.
Deshalb gibt man einer Stimme des SID auch den etwas
päßlicheren Namen "Tongenerator". Diese sind aufge-
teilt in Tongenerator 1, 2 und 3. Jeder dieser Gene-
ratoren arbeitet unabhängig von den anderen und kann
eigene Töne erzeugen ohne seine Kollegen damit zu
stören. Sie können jeden einzelnen von Ihnen mit ei-
ner bestimmten "Tonhöhe" und einem bestimmten "Klang"
programmieren. Damit Sie dies ein wenig besser ver-
stehen, schlage ich vor, daß wir einmal einen kleinen
Ausflug in die Physik machen:
Wie Sie vielleicht wissen besteht ein Ton, so wie ihn
das menschliche Ohr hört, aus nichts anderem als ei-
nem extrem schnellen Schwingen der Luft. Auch bekannt
unter dem Namen "Schall". Die Art dieses Tones, warum
sich Töne also voneinander unterscheiden können, wird
von zwei Komponenten bestimmt. Da wäre zum einen die
Wellenform und zum anderen die Frequenz. Die Wellen-
form gibt an, wie die Schwingungen verlaufen. Diese
lassen sich durch eine Grafiklinie darstellen, häufig
sogar durch eine mathematische Funktion. Ein Beispiel
wäre da sie Sinuskurve. Mit ihr lässt sich eine Si-
nuswelle erzeugen. Dies klingt dann etwa wie eine
Oboe. Ein weicher und "perfekter" Klang, da die Wel-
lenform ja dem perfektesten geometrischen 2-
dimensionalen Körper zugrunde liegt, dem Kreis.
Jedem der 3 Tongeneratoren Ihres C64 können Sie nun
eine eigene Wellenform einprogrammieren, die dann von
diesem erzeugt wird. Eine Sinuskurve kriegt der SID
zwar nicht ganz hin, doch reicht es immerhin zu einer
Dreieckskurve, die der Sinuskurve in Punkto Hoch- und
Tiefpunkten ja schon sehr ähnlich kommt. Sollten Sie
jetzt hier nur "Bahnhof, Abfahrt und Koffer geklaut"
verstehen, so möchte ich sie mit dem Folgenden
noch ein wenig mehr aufklären. Jede Wellenform kann
nämlich auch mit Hilfe eines Oszillators als Tonwelle
sichtbar gemacht werden. Aus der Schule kennen Sie
bestimmt noch diese Experimente, wo dann auf so einem
kleinen runden Bildschirm eine merkwürdige Kurve er-
schien, wenn der Lehrer irgend einen Ton von sich gab
(oder mit Hilfe eines Tongenerators erzeugte).
Der C64 versteht es nun, 4 veschiedene solcher Kurven
zu erzeugen, zwischen denen Sie dann auch wählen kön-
nen, wenn Sie einem Tongenerator eine "persönliche"
Note geben möchten. Diese sind die Dreieck- (ich hat-
te diese Kurve oben schon erwähnt), Rechteck-, und
Sägezahnkurve. Dann gibt es da noch eine Wellenform
die eher eine Sonderstellung einnimmt, die Rauschkur-
ve. Man kann hier eigentlich nicht mehr von einer
Wellenform reden, da das Rauschen nicht nach einer
vorgegebenen Kurve erzeugt wird, sonden von verschie-
denen Zufallswerten, die den Abstand zum 0-Wert ange-
ben und einfach nur aneinandergereiht werden. So
entsteht ein Eindruck des Rauschens.
Die Rechteckskurve nimmt ebenfalls eine Sonderstel-
lung ein, was ihre Programmierung betrifft. Dies wer-
de ich ein weinig später erläutern.
Wie man nun dem SID klarmacht, welche der 4 Möglich-
keiten man auf einer Stimme spielen möchte, werde ich
Ihnen gleich erklären. Zunächst einmal noch zu der
2ten Komponente, mit der sie einen Ton beeinflussen
können, der Frequenz. Davon haben Sie sicher auch
schon einmal gehört. Je höher die Frequenz ist, desto
schneller wird die Luft zu Schwingungen angeregt. Es
kommen quasi mehr Dreiecksspitzen einer Dreieckkurve
(beispielsweise) in gleichen Zeitabständen an Ihrem
Ohr an, als bei einer niedrigeren Frequenz. Dadurch
werden die Hörnerven mehr gereizt und es entsteht im
Gehirn der Eindruck eines höheren Tones. Dies kann
bis zum Schmerz gehen, wenn der Ton besonders laut
und intensiv gespielt wird, wie etwa bei einer Säge-
zahnkurve, oder bei manchen Rechteckkurven (mit laut
meine ich RICHTIG laut - wenn Sie auf einem Rockkon-
zert einmal nahe den Boxen standen als der Leadgitta-
rist ein Solo von sich gab, dann wissen Sie was ich
meine).
Diese Frequenzen kann man nun auch jedem Tongenerator
angeben, so daß dieser dann genau weiß, wie er den
Ton zu gestalten hat. Um beispielsweise den Kammerton
A zu spielen benötigen Sie eine Frequenz von 440 Hz
(Hertz). Geben Sie diese dem Computer an, so wird er
Ihnen genau diesen Ton vordüdeln. Das hört sich doch
ganz einfach an ! Nun ja, ist es allerdings nicht
unbedingt. Denn Sie können dem SID nicht einfach die
Zahl 440 irgendwo hinschreiben. Dem stehen 2 Dinge im
Weg. Erstens einmal benötigt der SID auch noch weite-
re Angaben über einen Ton, bevor er richtig "losle-
gen" kann und zweitens gibt es mit der Frequenzangabe
auch noch einige kleine Probleme, die etwas mit der
Hardware des 64ers zu tun haben.
Zunächst möchte ich Ihnen eine Übersicht aller SID-
Register geben. Anschließend können wir dann richtig
anfangen. Ich muß noch hinzufügen, daß ich die Regi-
ster 25-28 aus Platzgründen ausgelassen habe. Wir
werden uns mit diesen sowieso nicht befassen, da de-
ren Funktion für uns kaum von Nutzen ist. Nur als
Assemblerroutinen wären diese Register effektiv von
Nutzen, und dann auch nur sehr, sehr selten. Nun aber
zu unsrer Tabelle :
Register Adresse Funktion
–––––––––––––––––––––––––––––––––––––––––––––––––––––
00 54272 Frequenz für Stimme 1 - LO
01 54273 Frequenz für Stimme 1 - HI
02 54274 Pulsbreite für Stimme 1 - LO
03 54275 Pulsbreite für Stimme 1 - HI
04 54276 Ton anschlagen und Wellenform für
Stimme 1
05 54277 Hüllkurve ATTACK/DECAY Stimme 1
06 54278 Hüllkurve SUSTAIN/RELEASE Stimme 1
07 54279 Frequenz für Stimme 2 - LO
08 54280 Frequenz für Stimme 2 - HI
09 54281 Pulsbreite für Stimme 2 - LO
10 54282 Pulsbreite für Stimme 2 - HI
11 54283 Ton anschlagen und Wellenform für
Stimme 2
12 54284 Hüllkurve ATTACK/DECAY Stimme 2
13 54285 Hüllkurve SUSTAIN/RELEASE Stimme 2
14 54286 Frequenz für Stimme 3 - LO
15 54287 Frequenz für Stimme 3 - HI
16 54288 Pulsbreite für Stimme 3 - LO
17 54289 Pulsbreite für Stimme 3 - HI
Register Adresse Funktion
–––––––––––––––––––––––––––––––––––––––––––––––––––––
18 54290 Ton anschlagen und Wellenform für
Stimme 3
19 54291 Hüllkurve ATTACK/DECAY Stimme 3
20 54292 Hüllkurve SUSTAIN/RELEASE Stimme 3
21 54293 Filter-Grenzfrequenz LO
22 54294 Filter-Grenzfrequenz HI
23 54295 Resonanz und Filterschalter
24 54296 Filtermodus und Lautstärke
Doch nun frisch ans Werk. Wie Sie ja gesehen haben
gibt es hier jeweils 7 Register für jede Stimme. Als
aufmerksamer Leser sind Ihnen hierbei bestimmt für
Stimme 1 die Register 00, 01 und 04 aufgefallen. Mit
diesen Registern nämlich können wir unsere Töne
beeinflussen, so wie wir das bisher gelernt haben. In
Register 00 und 01 wird die Frequenz des Tons für
Stimme 1 angegeben und in Register 04 die Wellenform.
Wollen wir nun das Problem lösen, wie wir eine Fre-
quenz, in Hertz gemessen, in diese beiden Register
eingeben. Ich hatte ja schon angedeutet, daß dies
nicht so einfach sein wird.
Ich hole hierzu einmal ein wenig weiter aus. Viel-
leicht haben Sie ja schon einmal gehört, daß der C64
mit einer bestimmten Taktfequenz "getaktet" ist, so
wie das bei jedem Computer der Fall ist. Ein Mikro-
prozesor und überhaupt alle logischen Bausteine in
einem Computer brauchen so etwas ganz einfach, damit
die Arbeiten im Computer geregelt und gleichmäßig
ablaufen. Als Herzstück dient hierzu ein Quarzbau-
stein, der eine bestimmte Taktfrequenz vorgibt. Alle
Bausteine greifen sich nun den Takt von diesem Quarz
ab und modulieren ihn meistens auf eine eigene Fre-
quenz, mit der sie besser arbeiten können. Der Mikro-
prozessor in Ihrem C64 arbeitet zum Beispiel mit ei-
ner Taktfrequenz von 985.2484 KHz. Dies ist genau der
18 Teil der Systemtaktfrequenz, die vom Quarz
herrührt. Diese beträgt demnach 17 734 472 Hz. Also
knapp 17.7 MHz. Der SID benutzt nun ebenfalls diese
Frequenz. Um nun aus internen Gründen des Aufbaus des
SID auf den richtigen Wert zu kommen, mit dem dieser
dann die echte Tonfrequenz spielt muß man vorher noch
eine kleine Umrechnung vornehmen. Diese folgt der
folgenden Formel :
WERT=Tonfrequenz * 2'24 / Taktfrequenz
Möchten Sie also den Kammerton A, mit 440 Hz, spie-
len, so müssen Sie erst den SID-Wert hierfür berech-
nen. Dies sieht dann so aus :
440Hz * 2'24 / 17734472 = 416.25
Lassen wir nun noch die Stellen hinter dem Komma weg-
fallen, so erhalten wir den Wert 416. Genau diesen
Wert müssen Sie jetzt an den SID übergeben, damit
dieser einen 440 Hz-Ton erzeugt. Hierbei haben wir
allerdings ebenfalls noch ein kleines Problem zu
bewältigen. Wie Sie sich errinnern können wir mit dem
POKE-Befehl lediglich ein Byte verändern, also 8 Bit.
Die größte Zahl, die Sie mit dem POKE-Befehl also
übergeben können ist die Zahl 255 (2↑8 Bits - 1), die
nun folgende Zahl, die 256 also, hat jetzt schon 9
Bits, da ja ein Überlauf stattfand. Ich zeige Ihnen
das einmal in Form von (16 stelligen) Binärzahlen:
dezimal binär
255 0000 0000 1111 1111
256 0000 0001 0000 0000
Nun ist aber die Zahl 416 größer als 255, somit müs-
sen wir zu einem kleinen Trick greifen um sie zu
übermitteln. Wir schreiben sie einfach mit 16 Bit, da
eine 16-Bit-Zahl maximal den Wert 65535 aufnehmen
kann, was für unsere Zwecke vollkommen reicht. Dies
sieht dann so aus:
416 (dez.) = 0000 0001 1010 0000 (bin.)
Diese 16-Bit spalten wir jetzt ganz einfach in zwei
8-Bit-Zahlen auf. Die Eine nennen wir "höherwertiges
Byte", die Andere "niederwertiges Byte" einer 16-
Bit-Zahl. Das sähe dann für 416 etwa folgendermaßen
aus :
416 = 0000 0001 1010 0000
Höherwertiges Byte (die ersten 8 Bits von links) :
0000 0001 = 256 (dez.)
Niederwertiges Byte (die nächsten 8 Bits von links) :
1010 0000 = 160
Und siehe da, schon hätten wir unsere Zahl in zwei
Bytes zerlegt, die wir nun einzeln, mit Hilfe des
POKE-Befehls, an den SID übergeben können. Dieser
setzt sie dann intern wieder zusammen und erzeugt
dann die Frequenz 440 Hz !
Für diese beiden Frequenzbytes der Stimme 1 sind nun
die Register 00 und 01 zuständig. Oben in der Regi-
stertabelle waren deren Funktionen beschrieben mit
"Frequenz für Stimme 1 - LO" und "Frequenz für Stimme
1 - HI". Das "LO" und "HI" steht hierbei für "LOw
significant byte" und für "HIgh significant byte"
oder höher- und niederwertiges Byte. Sie müssen also
den LO-Wert von 416, also 160, in Register 00 POKEn
und den HI-Wert 1 in Register 01. Dies sieht als
kleines Programm geschreiben dann so aus :
10 SI=54272:REM BASISADRESSE SID
20 POKE SI+0,160
30 POKE SI+1,1
Und schon wäre der Kammerton A programmiert. Um das-
selbe bei Stimme 2 tun zu können, müssen Sie die Re-
gister 07 und 08 benutzen, bei Stimme 3 Register 14
und 15.
So, die Frequenz wäre gesetzt, aber hören können Sie
jetzt noch nichts. Wir müssen zuerst ja noch die Wel-
lenform angeben. Nehmen wir hierzu doch einfach ein-
mal eine Dreieckskurve. Was ist nun zu tun, um dies
dem SID klarzumachen ? Hierzu benötigen wir für Stim-
me 1 das Register 04 (analog für Stimme 2 und 3, die
Register 11 und 18). Dieses Register vereint mehrere
Funktionen in einem. Die einzelnen Bits in diesem
Register haben verschiedene Aufgaben, die erfüllt
werden, wenn man das entspechende Bit auf 1 setzt.
Ich möchte Ihnen die Bitbelegung hier einmal anhand
einer Grafik darstellen :

Die Bits 1, 2 und 3 sind für uns unwichtig. Sie akti-
vieren zu komplexe Funktionen, als daß sie hier in
den Kurs passen würden. Für uns sind eher die Bits
4-7 und Bit 0 wichtig. Wie Sie sehen steht jedes die-
ser Bits (außer dem 0.) für eine bestimmte Wellen-
form. Wir möchten nun eine Dreieckskurve spielen.
Also setzen wir einfach Bit 4. Die anderen bleiben
unberührt und haben somit den Wert 0. Unser Byte sähe
Binär geschrieben dann so aus :
0001 0000
Das enstpricht der dezimalen Zahl 16 (der Wert des 4.
Bits). Sollten Sie diese Zahl jetzt in Register 04
schreiben, so wird allerdings immer noch nichts zu
hören sein. Der SID benötigt nämlich noch 2 weitere
Angaben. Zum Einen müssen wir noch die Lautstärke der
vom SID gespielten Musik setzen und zum anderen
braucht dieser auch noch eine sogenannte "Hüllkurve",
die etwas über den Verlauf des gespielten Tons an-
gibt. Kommen wir jedoch erst einmal zur Lautstärke.
Diese schalten Sie am besten auf volle Lautstärke.
Wir hatten dies ja oben schon einmal. Sie müssen ein-
fach den Wert 15 (Maximalwert) in das Lautstärkeregi-
ster 24 schreiben. Also :
POKE SI+24,15
So. Nun machen wir uns einmal an die Hüllkurve heran.
Physikalisch haben wir den Ton ja nun schon festge-
legt. Wir können jetzt allerdings noch seinen
Lautstärkeverlauf, WÄHREND er gespielt wird bestim-
men, eben mit Hilfe der oben genannten Hüllkurve.
Diese besteht aus 4 Phasen. Diese heißen "Attack-",
"Decay-", Sustain-" und "Releasephase" und werden in
der eben angezeigten Reihenfolge vom SID durchgegan-
gen. Wozu nun das ganze ?
Wie Sie ja vielleicht wissen ist nicht jeder Ton, der
die gleiche Frequenz hat, allerdings von 2 verschie-
denen Instrumenten gespielt wird, vom Klang her
gleich. Eine Oboe zum Beispiel hört sich "weicher" an
als ein Glockenspiel, obwohl die Wellenformen einan-
der sehr ähnlich sind. Das Glockenspiel wird "härter"
gespielt als die Oboe. Das heißt, daß beim Anschlagen
einer Metalleiste des Glockenspiels der Ton die mei-
sten Schwingungen erzeugt und somit am lautesten
klingt. Im Gegensatz zur Oboe, bei der die hindurch-
geblasene Luft erst einmal einen Ton erzeugen und
quasi "in Schwingung" gebracht werden muß. Ein ande-
res Beispiel wäre eine Klaviersaite. Schlagen Sie
eine Taste auf der Klaviatur an, so wird der Ton an-
fangs am lautesten sein und nach und nach abklingen.
Dies kann manchmal bis zu 50 Sekunden dauern, wobei
die Oboe kaum mehr als 0.5 Sekunden braucht. Sie se-
hen also, daß ein Ton einen sogenannten Lautstärke-
verlauf bestitzt. Genau diesen Verlauf beschreibt
eben die Hüllkurve. Wie Sie in der obigen SID-Tabelle
sahen sind die Hüllkurvenregister für den ersten Ton-
generator die Register 05 und 06. In ihnen werden die
Werte für die 4 Hüllkurvenphasen gespeichert. Da wir
4 Werte haben, allerdings nur 2 Register, wird dies
so gehandhabt, daß jedes Register in zwei 4-Bit-
Bereiche aufgeteilt wird. So, daß die vier "höherwer-
tigen" Bits eine, und die vier "niederwertigen" Bits
eine andere Phase darstellen. Diese sind folgenderma-
ßen verteilt :
Register Bits 4-7 (HI) Bits 0-3 (LO)
––––––––––––––––––––––––––––––––––––––––
05 Attack Decay
06 Sustain Release
Somit sind Werte von 0-15 für jede Phase möglich
(2↑4-1). Wollen wir nun klären, welche Aufgaben die
einzelnen Phasen haben :
1.) Die Attackphase:
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Mit ihr kann die Zeit angegeben werden, in der ein
Ton von Lautstärke 0 auf die in Register 24 angegebe-
ne Lautstärke ansteigt, wobei bei dem Wert 0 diese am
schnellsten, und beim Wert 15 am langsamsten erreicht
wird. Hier eine Tabelle mit den genauen Werten :
WERT ZEIT (in Sekunden)
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
0 0.002
1 0.008
2 0.016
3 0.024
4 0.038
5 0.056
6 0.068
7 0.080
8 0.100
9 0.250
10 0.500
11 0.800
12 1.000
13 3.000
14 5.000
15 8.000
2.) Die Decayphase :
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Diese Phase gibt an, in welcher Zeit der soeben in
der Attackphase erreichte Wert der Lautstärke, auf
den Lautstärkewert absinkt, der als Sustainwert ange-
geben wird.
3.) Sustain-spanne :
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Hier wird ein Wert zwischen 0 und 15 angegeben, der
die Endlautstärke nach ablauf der Decay-Phase angibt.
4.) Releasephase :
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Wird ein Ton abgeschaltet (dazu kommen wir gleich
noch) dann wird unverzüglich die Releasephase einge-
leitet. Sie gibt an in welcher Zeit der Ton von der
Sustainlautstärke wieder auf 0 absinkt.
Die Zeitwerte für die Decay- und Releasephase können
Sie der folgenden Tabelle entnehmen :
WERT ZEIT (in Sekunden)
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
0 0.008
1 0.024
2 0.048
3 0.072
4 0.114
5 0.168
6 0.204
7 0.240
8 0.300
9 0.750
10 1.500
11 2.400
12 3.000
13 9.000
14 15.000
15 24.000
Angenommen, wir wollten ein Glockenspiel mit dem SID
simulieren, dann bräuchten wir einen Ton der schnell
auf voller Lautstärke steht und dann auch relativ
schnell wieder abklingt. Wählen wir also folgende
Werte für die einzelnen Phasen :
Attack - 00
Decay - 07
Sustain - 09
Release - 01
Die 2 Bytes für die Hüllkuve müßten dann folgenderma-
ßen aussehen :
1.) 0000 0111
A=0 S=7
2.) 1001 0001
S=9 R=1
Nun müssen Sie diese Bytes also nur noch ins dezimale
System umrechnen und in die Register 05 und 06 poken.
Die Werte wären demnach 7 und 145. Zugegebenermaßen
ist dies eine ein wenig mühselige Arbeit, wenn man
nicht gerade über einen Taschenrechner verfügt, der
das Binärsystem beherrscht. Deshalb kann das auch ein
wenig einfacher gehandhabt werden. Denn ebenso, wie
man HI- und LO-Bytes bilden kann, lassen sich auch
"HI- und LO-Halb-Bytes" bilden. Diese heißen dann
"Nibble". Nun müssen Sie nur noch nach einem bestimm-
ten Schema die verschiedenen Werte miteinander zu
multiplizieren (der Umgekehrte Weg der Zerlegung in
LO- und HI-Byte). Nämlich nach der Formel :
HI-Nibble * 16 + LO-Nibble
In unserem Fall hätten wir dann folgende Berechnungen
durchzuführen :
Attack- und Decay-Byte : 0*16+7= 7
Sustain- und Release-Byte : 9*16+1=145
Und schon wären wir am Ziel. Nun gilt es nur noch die
Werte im SID zu setzen, also :
POKE SI+5,7
POKE SI+6,145
Das wäre geschafft ! Doch - oh Enttäuschung - es
kommt immer noch nichts aus dem Lautsprecher !!! Kei-
ne Panik, das ist ganz normal so, denn wir haben noch
eine weitere Operation durchzuführen. Der SID weiß
jetzt zwar welche Frequenz er zu spielen hat, was für
eine Wellenform er unserem Ton geben soll, und wel-
chen Klangverlauf dieser haben soll, damit er aber
nun endlich die Hüllkurve abspielt, muß man ihm auch
noch mitteilen, wann er dies zu tun hat. Wir müssen
ihm also quasi ein "Startzeichen" geben, daß er die
Attackphase einleiten darf. Dies geschieht mit Hilfe
des 0. Bits aus Register 04 (ich hatte es vorhin
schon einmal erwähnt, siehe auch Grafik). Erst wenn
dieses Bit gesetzt wird, beginnt er nämlich die At-
tackphase einzuleiten. Wir müssen somit also zu dem
Wellenform-Wert 16 für die Dreieckskurve auch noch
eine 1 addieren, damit dies der Fall ist (1 ist die
Wertigkeit des 0. Bits). Schreiben Sie also nun fol-
genden Befehl :
POKE SI+4,17
Nun kommt er endlich aus dem Lautsprecher, unser lang
erwarteter Ton. Lange hat es gedauert, doch schließ-
lich und endlich haben wir es doch noch geschafft!
Wie Sie jetzt allerdings schnell merken werden, hört
er gar nicht mehr auf zu spielen, sondern brummt mun-
ter weiter. Das war allerdings gar nicht der Effekt,
den wir erzielen wollten. Der Ton sollte doch eigent-
lich wieder in der Releasephase abklingen ! Der Grund
hierfür liegt darin, daß die Releasephase noch gar
nicht eingeleitet wurde ! Dies geschieht nämlich
erst, wenn das 0. Bit in Register 04 wieder auf 0
gesetzt wird. Bitte, probieren Sie - diesmal kommt
also nur 16 in dieses Register, da wir ja die
Dreieckswellenform ja noch beibehalten möchten, al-
so :
POKE SI+4,16
Und schon hört der Krach auf. Dies ist ein Punkt den
Sie beim Soundprogrammieren genauestens beachten
sollten. Die Zeit, in der der Ton auf der Sustain-
Lautstärke gehalten wird, bestimmen Sie als Program-
mierer, nicht der SID. Sie müssen ihn erst "von Hand"
wieder abschalten. Praktisch läßt sich das etwa mit
einer Verzögerungsschleife realisieren.
Sie programmieren einfach eine Schleife, in der der
Computer zwar mit dem Abarbeiten der Schleife
beschäftigt ist, jedoch nichts tut. Es fehlt ganz
einfach der Schleifenrumpf. Hier ein Beispiel :
FOR I=1 TO 100:NEXT
Sie sehen, die Schleife zählt ganz still und heimlich
bis 100. Effektiv tut der Computer jedoch nichts. So
können wir das Programm mit Scheinberechnungen quasi
"anhalten", damit der SID auch genug Zeit hat, die
ersten 3 Phasen auch durchzuspielen. Am besten sehen
Sie sich einmal das Programm "MINISOUNDDEMO" auf der
Rückseite der MagicDisk einmal an. Hier habe ich alle
notwendigen Befehle noch einmal zusammengerafft,
damit Sie auch ein kleines praktisches Beispiel ha-
ben.
Nun will ich Ihnen noch erklären welch eine Besonder-
heit die Rechteckskurve auf sich hat, und wofür die
Register 02 und 03 benutzt werden. In diesen beiden
Registern können Sie nämlich die Pulsbreite der Rech-
teckskurve für Stimme 1 angeben. Wie Sie oben in der
Wellenformgrafik gesehen haben, wird der Abstand, der
zwischen den beiden Punkten liegt, an dem die Recht-
eckskurve von ihrem Tiefstpunkt zu ihrem Höchstpunkt
"springt" in der sogenannten "Pulsbreite" angegeben.
Sie können in diesen beiden Registern also ganz ein-
fach den Abstand dieser beiden Rechtecksseiten ange-
ben. Dadurch können Sie den Klang der Rechteckskurve
noch einmal drastisch verändern. Mit niedrigen Puls-
breiten gespielt hört sich diese Welle sehr "kräch-
zend" an, fast schon wie ein "Sägezahn". Je größer
die Abstände werden, desto weicher und voller wird
der Klang. Hier liegt es an Ihnen, die einzelnen
Zustände einmal durchzuprobieren. Es sei nur noch
gesagt, daß hier mit einem 12-Bit-Wert gearbeitet
wird. Das heißt, daß die Bits 4-7 von Register 03
KEINE Auswirkung auf die Pulsbreite haben. Der maxi-
male Pulsbreitenwert liegt somit bei 2↑12-1, also
4095. Probieren Sie einfach einmal ein wenig herum,
denn, wie heißt es so schön : "Nur die Übung macht
den Meister." Wie Sie dies handhaben, sollten Sie ja
mittlerweile wissen, ich hatte Ihnen die Problematik
von HI- LO-Byte oben ja schon erklärt. Sie müssen
hier nur darauf achten, daß Sie im Register 04 auch
die Rechteckwellenform einschalten, und daß das HI-
Nibble (Bits 4-7) der Pulsbreite immer 0 ist.
Im übrigen sei noch erwähnt, daß Sie alle hier ge-
nannten Vorgänge mit Registern usw. natürlich eben-
falls an den Stimmen 2 und 3 durchführen können. Sie
müssen nur in der Registertabelle nach dem entspe-
chenden Äquivalent des Registers für die entspechende
Stimme suchen. Sie werden merken, daß diese alle in
der gleichen Reihenfolge für die einzelnen Stimmen
angeordnet sind. Im übrigen sind die meisten Register
des SID nicht auslesbar (bis auf die der 3. Stimme).
Es passiert also dasselbe, wie wenn Sie auf eine der
oben erwähnten I/O-Adressen zugreifen...
Ich möchte mich nun bis nächsten Monat wieder verab-
schieden, wenn wir uns dann ein wenig mit der Daten-
speicherung und der Peripherie des 64ers beschäftigen
werden. Sie werden dann auch gleich noch den noch
fehlenden Befehlssatz von BASIC 2.0 kennenlernen.
Ich bedanke mich nun für Ihre Aufmerksamkeit und wün-
sche ein fröhliches SID-Gedüdels, bis in einem Monat,
Ihr Uli Basters.