Kapitel 7: Musik mit dem COMMODORE 64

Die Tonerzeugung mit dem Computer hat zwei Hauptanwendungsgebiete: das Spielen von Musikstücken und das Erzeugen von Klangeffekten. Wie werden nun kurz darauf eingehen, wie ein Musikprogramm im allgemeinen aufgebaut ist und besprechen dann ein Programm, mit dem Sie experimentieren können.

Zur Struktur eines Musikprogramms

Der Klang eines Tones wird durch vier Eigenschaften bestimmt: die Tonhöhe, die Lautstärke, die Klangfarbe und die Art des Anschlags. Die beiden letzten Eigenschaften bewirken, daß wir überhaupt verschiedene Instrumente mit dem Gehör unterscheiden können, gerade diese wichtigen Eigenschaften werden Sie daher mit Ihrem Programm auch beeinflussen wollen.

Ihr COMMODORE 64 besitzt zu diesem Zweck wieder einen eigens konstruierten elektronischen Baustein, den SID (Sound Interface Device). Im SID ist eine Reihe von Speicherplätzen für die Parameter enthalten, die das gewünschte Klangbild zu synthetisieren gestatten. Sie wissen schon, daß Ihr COMMODORE 64 drei Stimmen gleichzeitig erzeugen kann; sehen wir uns zunächst die erste dieser Stimmen an.

Die Basisadresse des SID – wir wollen sie analog zum vorigen Kapitel durch die Variable SI abkürzen – ist 54272:

Plain Text

Die Tonhöhe wird physikalisch durch die Frequenz bestimmt; die Frequenz wird im SID durch einen Parameter gespeichert, der Werte zwischen fast Null und 65000 annehmen kann. Sie haben im vorigen Kapitel gelernt, daß man so große Zahlen nicht in einer Speicherzelle abspeichern kann; wir müssen den Frequenz-Parameter zerlegen in ein höherwertiges und ein niederwertiges Byte, meist als Hi-(High)-Byte und Lo-(Low)-Byte bezeichnet. Diese beiden Bytes belegen die ersten beiden Register im SID:

Plain Text

Für die Lautstärke sind im SID 16 Stufen vorgesehen, von Null (ausgeschaltet) bis 15 (volle Lautstärke). Der entsprechende Parameter wird in Register 24 abgespeichert:

Plain Text

Das war leicht. Nun kommt die Klangfarbe: Sie wird im wesentlichen durch die Art der Wellen bestimmt, die das betreffende Musikinstrument erzeugt. Der COMMODORE 64 bietet Ihnen vier Grundformen an: Dreieck, Sägezahn, Rechteck und Rauschen. Im Programmier-Handbuch werden Sie lernen, wie man diese Grundformen auf raffinierte Weise verändern und durch Filter beeinflussen kann. Hier reichen uns zunächst die Grundformen: Jede von Ihnen wird durch ein Bit im Register 4 kontrolliert:

Plain Text

In dieses Register schreiben Sie zur Auswahl der oben genannten Grundformen einen der Parameter 17, 33, 65 und 129. Wählen Sie 65 (die Rechteck-Welle) müssen Sie zusätzlich noch einen Parameter zwischen Null und 4095 für das sogenannte Tastverhältnis (das Verhältnis zwischen „Ein“ und „Aus“ Ihres Rechtecks) festlegen: die beiden Bytes dieses Parameters kommen in die Register 2 und 3:

Plain Text

Nun noch das Faszinierendste: der Anschlag, der Verlauf eines Tones. Ihr COMMODORE 64 läßt jeden Ton zunächst auf die im Register 24 eingestellte Lautstärke ansteigen und dann wieder etwas abschwellen, die nun erreichte Lautstärke bleibt erhalten, solange Sie den Ton eingeschaltet lassen; dann klingt der Ton ganz aus. An dieser „Hüllkurve“ sind, wie Sie sehen, vier Parameter beteiligt, die der SID in zwei weiteren Registern verwaltet:

Plain Text

Jedes dieser Register ist in zwei Teile aufgespalten (vergleichen Sie noch einmal die Einführung in die Binär-Arithmetik im vorigen Kapitel): Der Parameter in den vier höherwertigen Bits von A regelt das Anklingen des Tones, der in den vier niederwertigen Bits das Abschwellen: kleine Werte bedeuten schnell, hart; große Werte langsam, weich. Dies gilt ebenfalls für die vier niederwertigen Bits von H, die das Ausklingen des Tones nach seinem Abschalten kontrollieren. Die höheren vier Bits von H bestimmen die Lautstärke, mit der der Ton gehalten wird, der höchste Wert ergibt die in Register 24 vorab eingestellte Lautstärke, kleinere Werte schwächen diese Lautstärke mehr oder weniger ab.

Beispielprogramm

Als erstes müssen Sie sich entscheiden, welche STIMMEN (oder TONGENERATOREN) Sie benutzen wollen. Für jede dieser Stimmen müssen dann die 4 oben erwähnten Einstellungen (Lautstärke, Wellenform etc.) festgelegt werden. Sie können bis zu drei Stimmen zugleich verwenden, unser Beispiel benutzt jedoch nur die Stimme Nr. 1.

  1. Definition der Registeradressen
Plain Text
  1. Volle Lautstärke
Plain Text
  1. Anschlag
Plain Text
  1. Halten und Ausklingen
Plain Text
  1. Hi und Lo Byte der Frequenz, hier für den Kammerton A. Für andere Töne sind die beiden Werte aus der Tabelle im Anhang P zu entnehmen.
Plain Text
  1. Wellenform. Muß immer als letztes eingestellt werden, da das niedrigste Bit in den Register den Tongenerator ein- bzw. ausschaltet.
Plain Text
  1. Schleife zur Einstellung der Tondauer
Plain Text
  1. Ausschalten von Wellenform- und Hüllkurveneinstellungen
Plain Text

Nach dem Eintippen von RUN können Sie die Note hören, die mit diesem Programm erzeugt wird.

Melodien mit dem COMMODORE 64

Sie brauchen kein Musiker zu sein, um mit dem COMMODORE 64 Melodien zu erzeugen. Hier ist ein Beispielprogramm, an dem gezeigt wird, wie man das macht. Wir benutzen wieder nur eine Stimme von den dreien, die uns zur Verfügung stehen.

Löschen Sie mit NEW das vorhergehende Programm und tippen Sie dann folgendes ein:

Plain Text

Wenn wir Töne erzeugen wollen, die denen eines Cembalos ähneln, müssen wir Zeile 80 in folgender Weise abändern.

Plain Text

Durch diesen POKE-Befehl wählen wir einen „Sägezahn“ als Wellenform; dadurch erhalten wir obertonreichere, „schärfere“ Klänge, als es bei der bisher benutzten „Dreieck“-Wellenform der Fall war. Aber die Wahl der Wellenform ist ja nur eine der Möglichkeiten, den Klangcharakter zu bestimmen. Durch eine spezielle Wahl des Anschlag-Wertes können wir aus dem Cembalo ein Banjo machen. Dies geschieht mit dem nachstehenden Poke-Befehl in Zeile 40.

Plain Text

Sie können also wie mit einem echten „Synthesizer“ den Klang verschiedener Instrumente nachahmen. Wie das gemacht wird, d. h. in welcher Weise wir zu diesem Zweck die betreffenden Registerinhalte ändern müssen, werden wir jetzt besprechen.

Wichtige Klangeinstellungen

1. Lautstärke – Die Wahl der Lautstärke gilt für alle 3 Tongeneratoren des COMMODORE 64. Das in Frage kommende Register hat die Adresse 54296; Sie erhalten die maximale Lautstärke, wenn Sie in dieses Register eine 15 poken:

Plain Text

Um die Tongeneratoren auszuschalten, schreiben Sie eine 0 in das Register:

Plain Text

Im allgemeinen stellen Sie die Lautstärke zu Beginn eines Musikprogramms fest ein; Sie können jedoch durch programmierte Änderung der Lautstärke interessante Effekte erzielen.

2. WELLENFORM – Wie Sie in unserem Beispiel gesehen haben, bestimmt die Wellenform sehr stark den Klangcharakter eines Tones. Sie können für jede Stimme des COMMODORE 64 die Wellenform getrennt einstellen, dabei haben Sie die Wahl zwischen Dreieck, Sägezahn, Rechteck und Rauschen. Eine Zusammenstellung der entsprechenden Adressen und ihrer Inhalte, die den verschiedenen Stimmen und Wellenformen entsprechen, gibt die nachstehende Tabelle. Wenn Sie z.B. für die 1. Stimme die Wellenform „Dreieck“ wählen wollen, müssen Sie folgenden Befehl anwenden:

Plain Text

Die Einstellung der Wellenform

Wir haben diese Tabelle in Zeile 30 unseres Tonleiterprogramms angewendet. Mit POKE Sl+4,17 haben wir das „Dreieck“ als Wellenform gewählt, die wir dann zur Änderung des Klangcharakters durch einen „Sägezahn“ ersetzt haben, indem wir die 17 in eine 33 umänderten. Als nächstes wollen wir sehen, wie wir die Hüll-Kurve verändern können, die den Lautstärkeverlauf innerhalb eines Tones bestimmt. Beachten Sie, daß Sie nur dann einen Ton erhalten, wenn Sie, wie oben beschrieben, auch Lautstärke und Wellenform festlegen.

3. HÜLLKURVEN-EINSTELLUNG – Die Werte für Anschlag und Abschwellen, die wie die Wellenform für jede Stimme getrennt gewählt werden können, werden zusammen durch einen Zahlenwert dargestellt. Während der Anschlag-Parameter die Zeit angibt, in der der Ton bis zur maximalen (vorher eingestellten) Lautstärke ansteigt, ist der Abschwellparameter ein Maß dafür, wie schnell die Lautstärke auf den Halte-Pegel abfällt. Wurde als Halte-Pegel 0 gewählt, so ergibt der Abschwell-Parameter die Abklingzeit bis zur Lautstärke 0 und bestimmt dadurch die Tondauer. Die den einzelnen Stimmen zugeordneten Adressen und die den verschiedenen Anschlag-Einstellungen entsprechenden Werte können der folgenden Tabelle entnommen werden. Die für Anschlag und Abschwellen gewählten Werte werden addiert und die Summe in das entsprechende Register gepoked.

Anschlag-Einstellungen

Wenn Sie lediglich eine Anschlag-Zeit wählen, z. B. durch POKE 54277,64, so wird die Abschwell-Zeit automatisch 0 gesetzt (und umgekehrt). Durch POKE 54277,66 stellen Sie den Anschlag auf einen mittleren Wert (64=4*16) und das Abschwellen auf einen kleinen Wert (2), der Wert 66 ergibt sich dann als Summe von 64 und 2. Am besten erkennen Sie die Zusammensetzung, wenn Sie statt POKE 54277,66 schreiben: POKE A,4*16+2 (wobei natürlich die Registeradresse A vorher definiert werden muß!)

Wir sind jetzt an einem Punkt angelangt, wo es wahrscheinlich am sinnvollsten ist, das bisher Besprochene im Rahmen eines Programms zusammenzufassen. Tippen Sie NEW ein, drücken Sie die <RETURN>-Taste und geben Sie folgendes Programm ein:

Plain Text

Wir benutzen die Stimme 1 zur Erzeugung eines Tones mit kurzer Anstiegszeit und kurzer Abfallphase nach Erreichen der Maximallautstärke (Zeile 60!). Was dabei herauskommt, klingt etwa wie ein Ball, der in einer Blechtonne hin- und herspringt. Um einen anderen Klang zu erzeugen, ändern wir diese Zeile. Dazu stoppen wir das Programm mit <RUN/STOP>, lassen uns das Programm mit LIST (mit nachfolgendem Drücken der <RETURN>-Taste) auslasten und ändern die Zeile 60, wie folgt:

Plain Text

Wenn wir jetzt <RETURN> drücken, übernimmt der Computer die geänderte Zeile in seinen Programmspeicher.

Der Ton, den wir mit dieser Einstellung erhalten, hat etwa den Klang einer Oboe oder eines sonstigen Holzblasinstruments. Experimentieren Sie nun, und ändern Wellenform und Hüllkurve um ein Gefühl dafür zu bekommen, wie die verschiedenen Werte dieser Parameter den Toncharakter verändern.

Mit der Halte-Einstellung können Sie festlegen, welche Lautstärke der Ton nach dem Anschlagen beibehält. Die Dauer des Tons wird dabei wie gewöhnlich mit einer FOR … NEXT-Schleife geregelt. Ähnlich wie beim vorigen Register werden Halten und Ausklingen des Tons durch einen Zahlenwert festgelegt, der sich durch Addition aus den Werten ermitteln läßt, die in der folgenden Tabelle aufgeführt sind:

Halten / Ausklingen

Ersetzen Sie die Nullen in Zeile 70 durch irgendwelche Werte bis maximal 15 und hören Sie, was dabei herauskommt!

5. DIE WAHL DER STIMMEN UND DER NOTEN – Wie Sie bereits erfahren haben, müssen Sie zur Erzeugung eines Tones zwei Werte eingeben, die wir Hi-Byte und Lo-Byte der Frequenz genannt haben. Die Zuordnung dieser Werte zu den Notennamen können Sie der Tabelle in Anhang P entnehmen.

Da den Stimmen unterschiedliche Adressen zugeordnet sind (siehe folgende Tabelle), können Sie die drei Stimmen Ihres COMMODORE 64 unabhängig voneinander programmieren und auf diese Weise z.B. dreistimmige Musikstücke erstellen.

Adressen der drei Tongeneratoren und POKE-Werte Hi-Byte und Lo-Byte der Töne der mittleren (5.) Oktave

Um den Ton C mit der Stimme 1 zu erzeugen, müssen Sie folgende POKE-Befehle verwenden:

Plain Text

oder

Plain Text

Denselben Ton mit der Stimme 2 erhalten Sie durch:

Plain Text

oder

Plain Text

Wir programmieren ein Lied auf dem COMMOD0RE 64

Mit dem folgenden Beispielprogramm kann man Lieder „komponieren“ und wiedergeben; der Computer benutzt dazu die Stimme 1. Beachten Sie bitte, daß in der Programmzeile 110 die Adressen der häufig verwendeten Register numerischen Variablen zugeordnet werden und dadurch im Programm bequemer angewendet werden können. Wenn z.B. die Wellenform gewählt werden soll, so genügt es, im entsprechenden POKE-Befehl den Buchstaben W statt der Zahl 54276 einzusetzen.

Weiterhin sollten Sie sich für die Verwendung in eigenen Programmen merken, wie mit den DATA-Zeilen gearbeitet wird. Im vorliegenden Programm werden in den DATAS die drei Zahlen, die zur Beschreibung eines Tones notwendig sind, hintereinander abgespeichert. Es handelt sich hierbei um Hi-Byte und Lo-Byte der Frequenz und die TONDAUER.

Die Tondauer wird durch eine Schleife bestimmt, die von 1 bis zu einem bestimmten Wert läuft. Dieser Wert steht in den DATAS jeweils an dritter Stelle. Dabei entspricht 125 einer Achtelnote, 250 einer Viertelnote, 375 einem punktierten Viertel, 500 einer halben und 1000 einer ganzen Note. Je nach Tempoangabe oder musikalischem Geschmack können diese Werte natürlich nach oben oder unten abgeändert werden.

Schauen wir uns nun mal die Zeile 110 an; die 17 und die 103 sind Hi-Byte und Lo-Byte für die Note „C“ und die Zahl 250 an der dritten Stelle Stelle bewirkt, daß es eine Viertelnote wird. Auch die zweite Note ist ein Viertel, diesmal ist es aber ein „E“ etc…. Sie können in die DATA-Zeilen aber auch selbstgewählte Werte eintragen, die Sie mit Hilfe der Notentabelle im Anhang P ermitteln können. Dabei können Sie Ihre Melodie so lang wählen, wie Speicherplatz in Ihrem COMMODORE 64 verfügbar ist, Sie müssen nur dafür sorgen, daß die letzte Programmzeile den Ausdruck DATA-1,-1,-1 enthält. Zeile 130 sorgt dann dafür, daß das Programm endet, wenn es in dieser Zeile angelangt ist.

Plain Text

Klangeffekte

Im Unterschied zur Musik sollen Klangeffekte Ereignisse, die auf dem Bildschirm stattfinden, untermalen (Explosion eines Raumschiffs etc.) oder sie sollen den Benutzer eines Programms informieren oder warnen (z. B., daß er gerade im Begriff ist seine Datendiskette zu löschen etc.) Hier einige Vorschläge, die zum Experimentieren anregen sollen:

  1. Ändern Sie die Lautstärke während der Ton erklingt, Sie können damit z. B. einen „Echoeffekt“ erzielen.
  2. „Springen“ Sie schnell zwichen zwei Tonhöhen hin und her, um ein „Tremolo“ zu erzielen.
  3. Probieren Sie verschiedene Wellenformen aus.
  4. Beschäftigen Sie sich eingehend mit der Hüll-Kurve.
  5. Durch unterschiedliches Programmieren der drei Stimmen (z. B. den Ton in einer Stimme etwas länger anhalten als den anderen) kann man überraschende Effekte erzielen.
  6. Benutzen Sie die Rechteckwelle und ändern Sie die Pulsbreite (Anhang O).
  7. Experimentieren Sie mitdem Rauschgenerator zur Erzeugung von Explosionsgeräuschen, Gewehrfeuer, Schritten etc.
  8. Ändern Sie in schneller Folge die Frequenz über mehrere Oktavin hinweg.

Klangeffekte zur Demonstration

Die hier besprochenen Programmbeispiele können Sie in direkter, oder in abgeänderter Form in eigene BASIC-Programme einbauen. Sie sollen Sie zum Experimentieren anregen und Ihnen zeigen, welche Klangmöglichkeiten in Ihrem COMMODORE 64 stecken.

Plain Text
Plain Text
Plain Text