-
Erzeugung
von Tönen mit dem Commodore 64 und Basic
MOS Technology 6581 SID
zusammengestellt
von Christian
Riedel/ MH, x3works, dopeconnection.net
Das Sound Interface
Device
des Commodore 64 besteht aus 3 Tongeneratoren,
welche über die 29 Register 54272 bis 54300 kontrolliert werden können. Ein
Register hat dabei eine Länge von einem Byte bzw. acht Bits:
1 Byte Register |
|||||||
High-Nibble |
Low-Nibble |
||||||
Bit |
Bit |
Bit |
Bit |
Bit |
Bit |
Bit |
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Um Register zu setzen gibt
es unter C64 Basic den Befehl : POKE Register , Wert
Der Commodore
64 ist in der Lage ein breites Spektrum an Tönen zu erzeugen. In der folgenden Tabelle sind die wichtigsten Parametrisierungen
zusammengestellt: |
||||||||||||||||||||||||||||||||||
Frequenz Register 00 und 01 |
Die
Ton-Frequenzen der chromatischen Tonleiter können nach folgendem Schema
berechnet werden: FREQUENZ = 2^( NR /
12 ) * 16.35 Hz
Dabei entspricht NR=0 dem Ton C-0,
NR=1 dem Ton C#, NR=2 dem Ton D, NR = 3 dem Ton D#,
NR = 4 dem Ton E, NR=5 dem Ton F …usw…
Um das C eine Oktave höher zu transponieren muss 12 zu NR addiert
werden.
Der Ton D-3 hat also die NR=2+36=38. Der
zu berechnende 16bit WERT ist = FREQUENZ * 2^24 / TAKTFREQUENZ
Die TAKTFREQUENZ kennt regionale Unterschiede:
Europäischer C64: TAKTFREQUENZ = 17734472 / 18 Hz
Amerikanischer C64: TAKTFREQUENZ = 14318180 / 14 Hz Der
16bit WERT wird aufgespalten in 8bit-LOWBYTE und 8bit-HIGHBYTE
und so jeweils in die Register 00 und 01 (Stimme 1) geschrieben. HIGHBYTE = INT( WERT / 256 )
, LOWBYTE = WERT – 256 * HIGHBYTE Zur
Erleichterung ist sinnvoll sich eine Tabelle mit den benötigten Tönen
anzulegen. z.B.:
Selbst
rechnen ist müßig…siehe C64 NotenTabelle.txt |
|||||||||||||||||||||||||||||||||
Lautstärkeverlauf |
|
|||||||||||||||||||||||||||||||||
Wellenform Register 04, 11 und
18 |
Im
Highbyte des Register 04 wird die Wellenform
gesetzt. Es gibt zur Auswahl: |
|||||||||||||||||||||||||||||||||
10002 =
Rauschen |
01002 =
Sägezahnwelle |
00102 =
Recheckwelle |
00012 =
Dreieck |
|||||||||||||||||||||||||||||||
Startbit auf 1
setzen |
Setzen
des Bit 0 von Register 04 auf 1 (ungerade Integerzahl)
: Der SID Chip spielt die Attack
und Decayphase. |
|||||||||||||||||||||||||||||||||
Startbit auf 0
setzen |
Die
Sustainphase bleibt erhalten, bis Bit 0 von
Register 04 zurück auf 0 gesetzt wird und die Releasephase
den Ton ausblendet. |
Im folgenden soll veranschaulicht werden, wie man in Basic einen
Ton mit Tongenerator 1 erzeugen kann. |
||
|
||
10
POKE 54296,15 |
REM:
Kein Filter, maximale Lautstärke=15 |
|
20 POKE 54272, 196 |
REM: LOWBYTE, Note D-3, Oszillatorfrequenz
146.8Hz |
|
30 POKE 54273, 9 |
REM: HIGHBYTE, Note D-3, Oszillatorfrequenz
146.8Hz |
|
40 POKE 54277, 105 |
REM: Attackphase 1s,
Decayphase = 750ms |
|
60
POKE 54278, 252 |
REM:
Sustainlautstärke = 10, Releasezeit
= 2,4s |
|
70
POKE 54276, 33 |
REM:
Rechteckform gewählt, Steuerbit gesetzt, abspielen beginnt |
|
80
FOR I= 1 TO 1700:NEXT |
REM:
Das Timing der Sustainphase+Attackphase+Decayphase muss
selbst überbrückt werden! Z.B.: durch eine Schleife (ca.850 Durchläufe /
Sekunde) |
|
90
POKE 54276,34 |
REM:
Rechteckkurve gewählt, Steuerbit nullgesetzt, Releasephase
beginnt, abspielen des Tons endet danach. |
|
|
Download d64 Image : SIDchip.zip |
|
Erzeugt
wird ein D mit einer Frequenz von 146.8Hz und eingeprägter Rechtecksform. Die Lautstärke steigt in 1s auf volle
Lautstärke, klingt dann in 750ms auf 2/3 dieser Lautstärke ab. Der Ton wird
bis zum Ende der FOR-Schleife gehalten und in 24ms Releasezeit
ausgeblendet. Die genaue
Funktion der mit dem Poke-Befehl beschriebenen Register kann der folgenden
Tabelle entnommen werden. |
Angaben zur
Berechnung der C64 Basic Poke-Codes sind in der Zeile Poke it! zusammengefasst. Damit ist man in
der Lage jeden beliebigen Ton mit dem C64 zu erzeugen, also viel Spaß bei
ausprobieren! Möchten sie ganze Musikstücke mit dem C64 komponieren, vereinfachen sogenannte Tracker (z.B.: asterion sid tracker |
Diese Abbildung soll nur einen kurzen Überblick über die
Art der Pinanschlüsse des MOS6581 geben. |
|||
Read/Write. Bei anliegendem TTL Low Signal wird ins Register geschrieben, bei
High gelesen. |
|||
|
64
Intern, (Brückmann, Englisch, Felt, Gelfand, Gerits, Krsnik) , 5.Auflage, Data Becker, 1986
Der Autor übernimmt
keine Verantwortung für Fehler oder Irrtümer.