Einleitung Die wichtigsten Parametrisierungen Die Programmierpraxis Registertabelle mit Erläuterungen Die MOS 6381 Hardware

-

C64 SID-Chip Programmierung

Erzeugung von Tönen mit dem Commodore 64 und Basic


C64 SID Chip

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.:

NR

NOTE

FREQUENZ

HIGHBYTE

LOWBYTE

36

C - 3

130,8

8

180

37

C# - 3

138,6

9

56

38

D - 3

146.8

9

196

....

 

 

 

 

52

E - 4

329,6

21

237

Selbst rechnen ist müßig…siehe C64 NotenTabelle.txt

 

Lautstärkeverlauf

Der Lautstärke-Verlauf teilt sich auf

in Attackzeit bis zur vollen Lautstarke,

 

Decayzeit auf Sustainlautstärke,

 

die Zeit, bis das Steuerbit in Reg.$04 auf 0 gesetzt wird (Sustainzeit) und die

 

Releasezeit, das Abklingen des Tons.

 

 

Wie und in welche Register diese Werte gesetzt werden müssen, siehe Tabelle unten.

Lautstärkeverlauf C64 SID Chip

Wellenform

Im Highbyte des Register $04 wird die Wellenform gesetzt. Es gibt zur Auswahl:

10002 = Dreieckwelle

Dreieck C64 SID Chip

01002 = Sägezahnwelle

Saegezahn C64 SID Chip

00102 = Recheckwelle

C64 SID Chip

00012 = Rauschen

C64 SID Chip

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.

 

Zur praktischen Seite:

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

C64 SID Chip

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)

00

2 ms

08

100 ms

01

8 ms

09

250 ms

02

16 ms

10

500 ms

03

24 ms

11

800ms

04

38 ms

12

1 s

05

56 ms

13

3 s

06

68 ms

14

5 s

07

80 ms

15

8 s

Dauer Decayphase (DECAYZEIT=0-15)

00

8 ms

08

300 ms

01

24 ms

09

750 ms

02

48 ms

10

1500 ms