Der Soundchip: Programmierung in Basic

Zu der Entstehung dieses Programmes ist zu sagen, daß ich mich mit den Möglichkeiten der Soundprogrammierung auf dem Atari ST vertraut machen wollte. Dabei ist es am Anfang doch recht schwer gewesen, mit den Anweisungen SOUND und WAVE ein vernünftiges Ergebnis zu bekommen. Deshalb habe ich mich hingesetzt und ein Basicprogramm geschrieben, welches erlaubt, die Parameter mittels Maus auf dem Bildschirm zu ändern und den Sound, den der Chip im Computer erzeugt, gleich nach der Änderung zu hören. Ebenfalls wird als Ergebnis eine Basiczeile ausgegeben, die den gerade eingestellten Sound auch zu einem anderen Zeitpunkt in einem anderen Programm durch diese Zeile einfach erzeugen läßt. Bevor ich aber jetzt auf das Programm zu sprechen komme, werde ich erst einmal die SOUND-und WAVE-Anweisung näher erklären.

Unser Computer besitzt zur Sound-Erzeugung einen Sound-Chip mit der Bezeichnung YM-2149. Dieser hat eine Vielzahl an Registern, die erst entsprechend gesetzt werden müssen, bevor ein Ton erklingen kann. Die Alarmglocke und das Tastatur klicken sind ebenfalls vom Betriebssystem erzeugte Soundkommandos mittels des ICs. Wenn wir nun mit SOUND- und WAVE-Befehl einige Register setzen und danach die Alarmglocke oder das Tastaturklicken ertönt, sind die Register mit anderen Werten verändert worden. Der SOUND-Befehl in Basic hat maximal 5 Parameter, das heißt, wenn wir nur die ersten zwei Parameter angeben, bleiben die anderen unverändert. Der SOUND-Befehl lautet also:

SOUND Kanal, Lautstärke, Tonhöhe, Oktave, Dauer

Wir haben drei Kanäle, mit denen wir gleichzeitig einen Sound erzeugen können. Daraus folgt, daß der Parameter „Kanal“ die Werte 1, 2 und 3 annehmen kann. Bei dem Parameter „Lautstärke“ ergibt 15 volle Lautstärke und 0 entspricht „ganz leise“. Der Parameter „Tonhöhe“ kann die Werte von 1 bis 12 annehmen, da eine Oktave aus 12 Tonstufen (einschließlich den Halbtönen) besteht.

C, C#, D, D#, E, F, F#, G, G#,A, A#, H

Dies ist für einen Nichtmusiker nicht ganz klar, da dieser die Tonleiter vielleicht nur mit 8 Tönen kennt. Der Frequenzbereich von 30 Hz bis fast in den unhörbaren Bereich erlaubt eine Unterteilung in 8 Oktaven. Die Werte für diesen Parameter liegen also zwischen 1 und 8. Die Tondauer bestimmt die Zeit, wie lange das Programm an dieser Anweisung verweilt, bevor es weitere Anweisungen abarbeitet. Diese Zeitdauer wird in 1/50 sec gemessen. Das heißt, für eine Pause nach dem Einschalten des Tons für 5 Sekunden muß man den Wert 250 angeben. Es leuchtet auch ein, wenn man die SOUND-Anweisung als exakte Zeittiming Anweisung in sein Programm einbauen kann, indem man die Lautstärke gleich Null setzt. Der Parameter „Dauer“ kann Wert zwischen 0 und 255 annehmen.

Man kann die Dauer auch entfallen lassen, dann fährt das Programm sofort weiter. Der Ton wird erst wieder durch eine neue SOUND-, WAVE-Anweisung, Tastatur klicken oder durch die Alarmglocke verändert.

Der WAVE-Befehl hat ebenfalls fünf Parameter. Diese sind aber etwas schwieriger zu verstehen, da hier mit Dualzahlen gearbeitet wird. Aber keine Angst, ich habe es auch verstanden.

Dies sind die Parameter. Der erste dient zum Mischen der einzelnen Kanäle. Soll zum Beispiel Kanal 1 und Kanal 2 erklingen und aus Kanal drei Rauschen ertönen, so muß eine 35 gesetzt werden. An einer Tabelle wird es vielleicht deutlicher:

WAVE Ton Osz./Rausch Osz.,Hüllkurve,Hüllkurvenform,Periode,Dauer
Tongenerator für Kanäle ein/aus:	K3	K2	K1	Unser
Rauschgeneratorf. Kanäle ein/aus:	K3	K2	Kl	: : : Parameter
Dual:	1	0	0	0	1	1
Dezimal: 32 + 0 + 0 + 0 + 2+1=35

Jede 1 bedeutet ein gesetztes Bit. Wer sich ein wenig mit Binärzahlen auskennt, kann die Dezimalzahl direkt ablesen. Man kann aber auch einfach das Ergebnis mittels Tabelle schnell errechnen. Der Maximale Zahlenbereich für diesen Parameter liegt also zwischen 0 und 63. Null schaltet somit alles aus. Der zweite Parameter wird ebenfalls nach gleichem Schema errechnet, nur diesmal liegen hier die Werte von 0 bis 7. Dieser Parameter gibt dem Chip die Anweisung für welchen Kanal die Hüllkurvenform oder die Lautstärke (bei SOUND-Befehl) gelten soll.

Eine gesetzte Null bedeutet: dieser Kanal erhält das Volumen über den letzten SOUND-Befehl, eine Eins bedeutet, daß die Lautstärke über die Hüllkurvenform geregelt wird. Wie aus der Tabelle ersichtlich, liegen die Werte zwischen 0 und 7. Der Parameter „Hüllkurvenform“ bestimmt eine Form, nach der die Lautstärke vom IC geregelt wird. Dies ist eine 4-stellige Dualzahl, wobei jedes Bit für Continue, Attack, Alternate und Hold zuständig ist. Damit ist der Wertebereich auf 0 bis 15 beschränkt. Allerdings ergibt nicht jede Zahl eine sinnvolle Hüllkurvenform. Der sinnvolle Bereich liegt von 8 bis 15.

Dies sollte man einfach einmal mit dem Programm testen und vor allem hören. Der nächste Parameter beeinflußt ebenfalls die Hüllkurve. Jede Hüllkurve wird periodisch wiederholt, dies geschieht in einer ganz bestimmten Dauer - der Periodendauer. Diese Zahl kann Werte von 0 bis 65 535 annehmen. 65 535 bedeutet hierbei eine lange Periode. Bei Perioden unter 500 kann man feststellen, daß die Hüllkurve durch eine sehr schnelle Schwingung ebenfalls eine hörbare Frequenz erzeugt. Der letzte Parameter bestimmt ebenfalls - wie bei SOUND — eine Wartezeit, bevor das Programm weiter arbeitet (s. Dauer unter SOUND).

Und nun zu dem Programm. Ich habe versucht, die Möglichkeiten der Werte für das SOUND- und WAVE-Kommando zu vereinfachen, indem ich die Berechnung der Dualzahlen übernehme. Der Benutzer kann einfach Rauschen des 1. Kanals einschalten, ohne zu überlegen, welchen Wert der WAVE-Befehl nun bekommt. Dies kann er dann in der unteren Zeile sehen.

Nachdem Sie das Programm hoffentlich fehlerfrei eingetippt haben, sollten Sie es erst einmal speichern, da falsche POKE-Anweisungen schnell zu einem Absturz führen können. Danach kann man es mit RUN starten. Es sollte nun ein Bildschirmaufbau wie in der Abb. zu sehen sein. Für jeden Kanal existiert eigens ein Einstellfeld. Durch Anklicken des jeweiligen Begriffes wird sich dieser ändern. Klicken Sie mit der linken Taste, so wird die Zahl des zugehörigen Begriffes erniedrigt, mit der rechten um eins addiert. Die Hüllkurvenform und die Periodendauer gelten für alle drei Kanäle, somit stehen sie in einem gesonderten Kasten. Da die Periode einen relativ großen Bereich mit ihren Zahlen abdeckt, habe ich mich entschlossen, hier den Faktor 100 für das Andern zu nehmen. Um das Programm zu verlassen, müssen beide Maustasten gleichzeitig betätigt werden. Hierbei muß der Mauszeiger natürlich auf „Programmende“ stehen.

Mir war das Programm recht hilfreich, man kann schnell einige Effekte programmieren. Zum Beispiel:

ein Hubschrauber beim Fliegen : sound 1,15,10,4:sound 2,15,l,l:sound 3,15,12,8:wave 56,7,10,400

einmaliges Anschlägen eines Glöckchens : sound 1,15,10,6:wave 1,1,9,65500

einmaliges Anschlägen eines tiefen Gongs : sound 1,15,8,3:wave 1,1,9,65500

Pfeifton : sound 1,15,12,8,:wave 0,1,10,0

gleichmäßiges Motorendröhnen : sound 1,15,2,2:wave 1,1,10,100

ungleichmäßiges Motorengeräusch : sound 1,15,1,2:wave 1,1,10,100

Motorengeräusch, Fahrgeräusch und Wasserrauschen : sound 1,15,1,3:sound 2,11,1,2:sound 3,11,1,1:wave 35,1,10,300

Diese Beispiele finden Sie im Listing „SOUNDS“. Nach dem Starten können Sie die Sounds hören, durch Drücken einer Taste kommt der nächste.


Ulrich Stumm
Aus: ST-Computer 06 / 1986, Seite 14

Links

Copyright-Bestimmungen: siehe Über diese Seite