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 vorenthalten. 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 aufschieben. 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 dieses 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 keinster Weise unterstützt, wie man das von größeren Computern ( 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 beendet sein.
Nun wollen wir aber einmal mit diesem sechsten Basickurs beginnen. Ich möchte Sie nun ein wenig in die
Soundprogrammierung des 64 ers einführen, die auch
nicht gerade ohne ist, und für die Sie die Informationen ü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-/ OUTPUToder EIN-/ AUSGABE-Bereich) liegen, der sich
von Adresse 53248 bis 57344 erstreckt." Puh!" werden
Sie sagen," Das sind ja mehr als 4000 Speicherzellen ! 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 benutzten Speicherzellen zu benutzen. Sollten Sie hier
einen Wert hineinschreiben, so wird gar nichts passieren, da die adressierte Speicherzelle nämlich physisch, also im Innern Ihres 64 ers, gar nicht existiert. 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 Speicherzelle des SID. Sie ist deshalb so wichtig, weil
wir sie benutzen wollen, um sogenannte " Register" adressieren zu können. Ein Register ist eine Speicherzelle des SID ( oder eines anderen I/ O-Bausteins) die man mit Hilfe der Basisadresse und der Registernummer 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 Basisadresse 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 64 er ü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 aufgeteilt in Tongenerator 1,2 und 3 . Jeder dieser Generatoren 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 einer bestimmten " Tonhöhe" und einem bestimmten " Klang" programmieren. Damit Sie dies ein wenig besser verstehen, 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 einem 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 Wellenform 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 Sinuswelle erzeugen. Dies klingt dann etwa wie eine
Oboe. Ein weicher und " perfekter" Klang, da die Wellenform 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 Hochund
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 erschien, 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önnen, wenn Sie einem Tongenerator eine " persönliche" Note geben möchten. Diese sind die Dreieck-( ich hatte diese Kurve oben schon erwähnt), Rechteck-, und
Sägezahnkurve. Dann gibt es da noch eine Wellenform
die eher eine Sonderstellung einnimmt, die Rauschkurve. Man kann hier eigentlich nicht mehr von einer
Wellenform reden, da das Rauschen nicht nach einer
vorgegebenen Kurve erzeugt wird, sonden von verschiedenen Zufallswerten, die den Abstand zum 0- Wert angeben und einfach nur aneinandergereiht werden. So
entsteht ein Eindruck des Rauschens.
Die Rechteckskurve nimmt ebenfalls eine Sonderstellung ein, was ihre Programmierung betrifft. Dies werde ich ein weinig später erläutern.
Wie man nun dem SID klarmacht, welche der 4 Möglichkeiten man auf einer Stimme spielen möchte, werde ich
Ihnen gleich erklären. Zunächst einmal noch zu der
2 ten 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ägezahnkurve, oder bei manchen Rechteckkurven ( mit laut
meine ich RICHTIG laut - wenn Sie auf einem Rockkonzert einmal nahe den Boxen standen als der Leadgittarist 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 weitere Angaben über einen Ton, bevor er richtig " loslegen" kann und zweitens gibt es mit der Frequenzangabe
auch noch einige kleine Probleme, die etwas mit der
Hardware des 64 ers 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 Register 25-28 aus Platzgründen ausgelassen habe. Wir
werden uns mit diesen sowieso nicht befassen, da deren 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 Frequenz, 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. Vielleicht 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 Mikroprozesor 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 Quarzbaustein, der eine bestimmte Taktfrequenz vorgibt. Alle
Bausteine greifen sich nun den Takt von diesem Quarz
ab und modulieren ihn meistens auf eine eigene Frequenz, mit der sie besser arbeiten können. Der Mikroprozessor in Ihrem C64 arbeitet zum Beispiel mit einer Taktfrequenz von 985 .2484 KHz. Dies ist genau der
18 Teil der Systemtaktfrequenz, die vom Quarz
herrührt. Diese beträgt demnach 17734472 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, spielen, so müssen Sie erst den SID-Wert hierfür berechnen. Dies sieht dann so aus :
440Hz * 2'24 / 17734472 = 416.25
Lassen wir nun noch die Stellen hinter dem Komma wegfallen, 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üssen 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=0000000110100000 Höherwertiges Byte ( die ersten 8 Bits von links) :
0000 0001 = 256 (dez.) Niederwertiges Byte (die nächsten 8 Bits von links) :
10100000=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 Registertabelle 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öherund 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 dasselbe bei Stimme 2 tun zu können, müssen Sie die Register 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 Wellenform angeben. Nehmen wir hierzu doch einfach einmal eine Dreieckskurve. Was ist nun zu tun, um dies
dem SID klarzumachen ? Hierzu benötigen wir für Stimme 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 aktivieren 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 dieser Bits ( außer dem 0 .) für eine bestimmte Wellenform. 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 :
00010000
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 angibt. 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ärkeregister 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 festgelegt. Wir können jetzt allerdings noch seinen
Lautstärkeverlauf, WÄHREND er gespielt wird bestimmen, 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 durchgegangen. Wozu nun das ganze ?
Wie Sie ja vielleicht wissen ist nicht jeder Ton, der
die gleiche Frequenz hat, allerdings von 2 verschiedenen Instrumenten gespielt wird, vom Klang her
gleich. Eine Oboe zum Beispiel hört sich " weicher" an
als ein Glockenspiel, obwohl die Wellenformen einander 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 meisten Schwingungen erzeugt und somit am lautesten klingt. Im Gegensatz zur Oboe, bei der die hindurchgeblasene Luft erst einmal einen Ton erzeugen und
quasi " in Schwingung" gebracht werden muß. Ein anderes Beispiel wäre eine Klaviersaite. Schlagen Sie
eine Taste auf der Klaviatur an, so wird der Ton anfangs 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 sehen also, daß ein Ton einen sogenannten Lautstärkeverlauf 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 Tongenerator 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öherwertigen" 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 angegebene 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 angegeben 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 eingeleitet. Sie gibt an in welcher Zeit der Ton von der
Sustainlautstärke wieder auf 0 absinkt.
Die Zeitwerte für die Decayund 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 HIund LO-Bytes bilden kann, lassen sich auch
" HIund LO-Halb- Bytes" bilden. Diese heißen dann
" Nibble" . Nun müssen Sie nur noch nach einem bestimmten Schema die verschiedenen Werte miteinander zu
multiplizieren ( der Umgekehrte Weg der Zerlegung in
LOund HI-Byte) . Nämlich nach der Formel :
HI-Nibble *16+ LO-Nibble
In unserem Fall hätten wir dann folgende Berechnungen
durchzuführen :
Attackund Decay-Byte :0*16+7=7 Sustainund 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 ! ! ! Keine 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 welchen 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 Attackphase 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 folgenden 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 munter weiter. Das war allerdings gar nicht der Effekt, den wir erzielen wollten. Der Ton sollte doch eigentlich 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, also :
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 Programmierer, 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 haben.
Nun will ich Ihnen noch erklären welch eine Besonderheit 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 Rechteckskurve 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 Rechteckskurve von ihrem Tiefstpunkt zu ihrem Höchstpunkt
" springt" in der sogenannten " Pulsbreite" angegeben.
Sie können in diesen beiden Registern also ganz einfach den Abstand dieser beiden Rechtecksseiten angeben. Dadurch können Sie den Klang der Rechteckskurve
noch einmal drastisch verändern. Mit niedrigen Pulsbreiten gespielt hört sich diese Welle sehr " krächzend" 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 maximale 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 genannten Vorgänge mit Registern usw. natürlich ebenfalls an den Stimmen 2 und 3 durchführen können. Sie
müssen nur in der Registertabelle nach dem entspechenden Ä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 verabschieden, wenn wir uns dann ein wenig mit der Datenspeicherung und der Peripherie des 64 ers 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ünsche ein fröhliches SID-Gedüdels, bis in einem Monat,
Ihr Uli Basters.