Magic Disk 64

home to index to text: MD8907-KURS-BASIC_KURS_TEIL_6-1_:_VON_ADAM_UND_EVA...(TEIL_6)-2.1.txt
     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 :

MD8907-KURS-2.16.hires.png

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.

Valid HTML 4.0 Transitional Valid CSS!