| Einleitung | Die wichtigsten Parametrisierungen | Die Programmierpraxis | Registertabelle mit Erläuterungen | Die MOS 6381 Hardware |
-
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 |
Mit dem Commodore 64 BASIC und dem SID lassen sich Frequenzen von 16Hz bis 3738Hz erzeugen. 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-1, 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 |
Im Highbyte
des Register $04 wird die Wellenform
gesetzt. Es gibt zur Auswahl: |
|||||||||||||||||||||||||||||||||
|
10002
= Dreieckwelle
|
01002
= Sägezahnwelle
|
00102
= Recheckwelle
|
00012
= Rauschen
|
|||||||||||||||||||||||||||||||
|
Startbit auf 1
setzen |
Setzen des Bit 0 von Register $04 auf 1 (ungrade
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. |
|||||||||||||||||||||||||||||||||
|
Dieses
Beispielprogramm soll veranschaulichen 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:
Recheckkurve gewählt, Steuerbit gesetzt, abspielen beginnt |
|
|
80 FOR I= 1 TO
2000:NEXT |
REM: Das
Timing der Sustainphase+Attackphase+Decayphase muss selbst
überbrückt werden! Z.B.: durch eine Schleife |
|
|
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. Um dieses
Programm zu verstehen betrachten sie die untenstehende Tabelle mit der
Bedeutung der einzelnen Register und ihrer Bits sowie Angaben zur
Berechnung der richtigen Poke Codes. |
||
|
Die folgende
Tabelle stellt die Funktion aller 29 Register dar. Angaben zur
Findung der 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)
die Arbeit. |
|
OSC |
54272+ REG |
Bit
7 |
Bit
6 |
Bit
5 |
Bit
4 |
Bit
3 |
Bit
2 |
Bit
1 |
Bit
0 |
Poke
it ! |
R/W |
||||||||||||||||||||||||||||||||||||||||||||
|
S T I M M E E I N S |
$ 00 |
Oszillator-Frequenz
LOWBYTE FREQUENZ=2^(NR/12)*16.35 Änderung
von NR um 1 bewirkt Halbtonschritt,
NR+12 erhöht um eine Oktave NR=0,
C NR=1,
C# NR=3,
D
usw… WERT=FREQUENZ*2^24/TAKTFREQUENZ (Europa TAKTFREQUENZ =
17734472/18, Amerika TAKTFREQUENZ 14318180/14) LOWBYTE=WERT-256*HIGHBYTE |
Poke
54272,LOWBYTE Calculation: LOWBYTE= WERT-256*HIGHBYTE |
W |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
$ 01 |
Oszillator-Frequenz
HIGHBYTE HIGHBYTE
= INT(WERT /256) |
Poke
54273,HIGHBYTE Calculation: HIGHBYTE
= INT(WERT /256) |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
$ 02 |
Pulsbreite bei
Rechteckwelle LOWBYTE WERT = 0 bis 255 |
Poke 54274, WERT |
W |
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
$ 03 |
unbenutzt |
unbenutzt |
unbenutzt |
unbenutzt |
Pulsbreite bei
Rechteckwelle HIGHNIBBEL, WERT = 0 bis 15 |
Poke
54275,WERT |
W |
||||||||||||||||||||||||||||||||||||||||||||||||
|
$ 04 |
Dreieck |
Sägezahn |
Rechteck |
Rauschen |
Eine
Doppelauswahl von Rauschen und einer andren Schwingungsform kann den
Rauschgenerator blockieren. Mit setzen des
Bit3=1 wird diese Blockade gelöst. |
1:
Dreickesschwingungs-ausgang von Oszillator 1 gibt gemischete Frequenz von
Oszillator 1 und 3 aus. |
1: Synchronisieren Synchronisiert
Oszillator 1 und 3 |
Steuerbit 1:Attack 0:Release Phase einleiten |
Poke 54276,WERT Calculation: Bsp.: WERT
11000001=193, binär umformen! [ Grader WERT=Attack Ungrader WERT=Release ] |
W |
|||||||||||||||||||||||||||||||||||||||||||||
|
Es ist
möglich mehrere Wellenformen gleichzeitig zu aktivieren. Das Ergebnis
entspricht dann einer logischen AND Verknüpfung der Signale. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
$ 05 |
Dauer
Attackphase
(ATTACKZEIT = 0–15)
|
Dauer
Decayphase
(DECAYZEIT=0-15)
| |||||||||||||||||||||||||||||||||||||||||||||||||||||