Kleine Soundbastelei

von Ralf Däubner

 

 

Am Anfang war der Ton…

 

Tja, womit beginnen, wenn man noch nicht weiß, wie. Also…

 

Wie die ersten Homecomputer auf dem Markt kamen, also Anfang der 1980er Jahre, standen zwar brauchbare CPU und auch passende Chipsätze zur Verfügung, sowie auch einige Spezialchips, welche vorrangig aus dem Arcade stammen. Allerdings hat nicht jeder Hersteller wohl aus Kostengründen als auch in der Beschaffbarkeit darauf zurück gegriffen, so das einige spezielle Lösungen entstanden. Bei der Firma Sincliar eine ULA, welche etliche Chips ersetzte. In der kleinen DDR war eher das Problem der Beschaffbarkeit, weswegen komplett auf die Z80 Chipsätze zurückgriff, welche mittlerweile im eigenen Land beschaffbar waren. Im Homecomputer-Bereich mußte sich allerdings die CPU komplett um Grafik und auch Sound kümmern. Im Professionellen Bereich, der hauptsächlich von Platzhirsch Robotron beherrscht wurde, kamen die richtigen neuen Sachen erst direkt zum Einsatz. Hier soll es hauptsächlich um die Töne gehen, welche aus den Heimcomputern Piepsten.

 

Sincliar‘s Spectrum ZX81 fand auch in der DDR eine gewisse Verbreitung, nicht zuletzt durch die Nachbauprojekte. Hier trifft aber auch der Satz ‚BEEP BEEP hab mich lieb.‘ vollständig zu. Der Computer kommt in einem schwarzen Gehäuse daher, üblicherweise mit intrigierten Tastatur. Hier wird der Befehl BEEP richtig zur einfachen Tonausgabe genutzt.

 

BEEP Tonlänge,Tonhöhe

 

Die Tonlänge wird im vollem Numerischen Ausdruck angegeben, 1 bedeutet 1 Sekunde.

Die Tonhöhe wird von mittleren C aufsteigen in Einserschritten durchgezählt, inklusive der in der Reihe liegenden Halbtöne. Dabei bedeutet 0 das mittlere C. In -1-Schritten geht es eine Oktave niedriger. Leider sind hier nur 3 Oktaven, ausgehend von der Oktave 0 sinnvoll. Trotz der von Amstrad produzierten Spectrum‘s später eingesetzten AY-Chips ist dieses im BASIC noch vorhanden. Warum beim KC87 diese einfache Art nicht in das BASIC fand, ist heute nicht wirklich nachzuvollziehen.

 

Geben Sie beispielsweise Folgendes ein:

10 PRINT "Frere Gustav"
20 BEEP 1,0: BEEP 1,2: BEEP. 5,3: BEEP.5,2: BEEP 1,0
30 BEEP 1,0: BEEP 1,2: BEEP .5,3: BEEP.5,2: BEEP 1,0
40 BEEP 1,3: BEEP 1,5: BEEP 2,7
50 BEEP 1,3: BEEP 1,5: BEEP 2,7
60 BEEP .75,7: BEEP .25,8: BEEP .5,7: BEEP .5,5: BEEP .5,3:
BEEP.5,2: BEEP 1,0
70 BEEP .75,7: BEEP .25,8: BEEP .5,7: BEEP .5,5: BEEP .5,3: BEEP .5,2:
BEEP 1,0
80 BEEP 1,0: BEEP 1, -5: BEEP 2,0
90 BEEP 1, 0: BEEP 1, -5: BEEP 2,0

 

Beim Z9001 aka KC85/1 und die Weiterendwicklung KC87 war schon immer von einem Soundmodul die Rede, realisiert mit einem AY aber erst im Jahre 2017. Um aber den KC unter Basic zum Dudeln zu bringen, wurde das über einem PIO-Kanal, also dem eingebauten Summer realisiert. Hier ein Ausschnitt aus dem 2ten Handbuch zur BASIC-Programierung:

 

Mit dem robotron Z 9001" können Sie, wie in Abschnitt 5.5 beschrieben

worden ist, Töne unterschiedlicher Höhe und Länge erzeugen. Das erlaubt

es Ihnen, kleine Melodien auch ohne Musikmodul wiederzugeben.

Ein Beispiel dafür liefert das folgende Programm.

 

10 ! Kommt ein Vogel geflogen

20 DATA 172,.5,162,.5,144,1,172,1

30 DATA 172,1,172,1,193,1,193,.5

40 DATA 172,.5,162,1,193,1,193,.5

50 DATA 128,.5,144,2,172,.5,162,.5

60 DATA 144,1,172,1,172,1,172,1

70 DATA 193,1,193,.5,172,.5,162,1

80 DATA 229,1,229,1,216,2

90 ! Melodienwiedergabe

100 OUT 136,128:T=300

110 FOR I=1 TO 27

120 READ H,L:GOSUB 1000

130 NEXT

140 OUT 136,0:END

980 ! -----

990 ! Tonwiedergabe

1000 IF H=0 THEN GOTO 1020

1010 IF H>0 THEN OUT 128,7:OUT 128,H:ELSE OUT

128,39:OUT 128,-H

1020 FOR QQ=1 TO L*T:NEXT:OUT 128,3:RETURN

 

Nach dem Start des Programms hören Sie über den im Heimcomputer

eingebauten Summer ein Volkslied. Eine bessere Klangqualität können

Sie erreichen, wenn Sie die "Musik" über den Lautsprecher des Kassettengerätes

(beim Geracord GC 6020 sind dazu eine Kassette

einzulegen sowie die Pausen-, die Aufnahme- und die Wiedergabetaste zu

drücken) ausgeben.

Das im Beispiel verwendete GOSUB-Unterprogramm zur Tonwiedergabe

(Zeile 1000 bis 1020) können Sie in Ihren eigenen Programmen

verwenden. Bevor es aufgerufen wird, müssen den Variablen H (Maß für

die Tonhöhe), L (Maß für die Tonlänge) und T (Maß für das Tempo der

Wiedergabe) Werte zugewiesen werden. Für T werden Werte um 300

empfohlen. Werte für H und T sind der nachfolgenden Tabelle zu

entnehmen.

 

Wobei nur 3 Oktaven möglich sind.

 

Bessergestellt waren jedoch die Mühlhausener KC 85/2-4. Diese hatten nicht nur PIXEL-Grafik, sondern auch einen richtigen einfachen Soundbefehl.

 

SOUND Ton1,Teiler1,Ton2,Teiler2,Lautstärke(über dem AV und internen Summer),Tonlänge

 

Intern kommt der Sound aus der CTC, die Lautstärkeänderung aber über einem Spannungsteiler. Dafür 32 Schritte beim KC85/2 und /3 aber nur noch 16 beim KC85/4. Allerdings mit dem Makel, gerne mal falsch zu Spielen. Aber man kann sich an 5 Oktaven erfreuen.

 

10 CLS :rem siehe Abschnitt CPC KCC

20 FOR x=0 TO 3 :Rem erste schleife

30 FOR y=0 TO 24 :Rem schleife 2

40 READ T

50 SOUND T,0,0,0,16,9

60 NEXT Y

70 RESTORE

80 NEXT X:END

90 DATA 86,86,128,114,108,96

100 DATA 86,86,108,86,86,108,86

110 DATA 86,128,108,128,162,108

120 DATA 128,128,96,108,114,0

 

Richtig lustig wurde es aber beim CPC. Der 464 unterscheidet nicht nur im Betriebssystem, sondern auch die Sound-Tabelle ist etwas anders. Der 664 und der 6128 unterscheidet sich nur im RAM-Ausbau und dem Floppy. Der KC-Compact ist allerdings mehr (System-ROM) ein 6128, weshalb die Tabelle gleich ist. Der intern verwendete AY-3-8912 besitzt immerhin 3 Stimmen, also Tonkanäle. Intern wird allerdings einige Arbeit abgenommen, müssen doch für einem Ton 3 Register angesteuert werden, inklusive des Mischers sogar 4. Der PIO-Port wird übrigens intern für die Tastatur verwendet.

 

SOUND Stimme(n),Tonhöhe,Dauer,Lautstärke,Lautstärkehüllkurve,Tonhüllkurve,Geräuschperiode

 

Wobei bei der Stimme es so ist,

1= Stimme 1

2= Stimme 2

4= Stimme 3

3= Stimme 1 und 2

7= Stimme 1 und 2 und 3

 

Maximalwert ist aber 128, da es noch einige Funktionen mehr gibt.

Was die Sache doch ein wenig konfus macht. Im Handbuch für den CPC6128 ist da ein wenig trocken erklärt. Dafür gibt es doch nette Beispiele im Handbuch. Zusätzlich gibt es noch einige weitere BASIC-Befehle, so zum Beispiel ENV und ENT, welche direkt auf den Ton wirken. Das eine setzt die eigentlich letzten 3 Register des AY, welche für die Hüllkurve zuständig sind und das andere sorgt für einen sogenannten Tremolo-Effekt. Fest vorgegeben sind die Variablen Stimme und Tonhöhe, die restlichen Variablen können unter Berücksichtigung der erforderlichen Kommas und bedingenden Variablen bei bedarf verwendet werden. Im CPC-BASIC stehen noch die Befehle ON SQ GOSUB, RELEASE und SQ zur Verfügung.

 

Hier ein kleines Beispiel in Locomotive BASIC 1.1 (CPC6128 oder KCC)

 

10 FOR i=1 to 3 :rem schleife wird 3mal durchlaufen

20 Restore 100 :Rem setzte Read-Zeiger auf Zeile 100

30 Read Note :rem Werte aus den Data-Zeilen holen

40 While Note <> -1

50 Sound 1,Note,35

60 Read Note

70 Wend

80 Next

90 Sound 1,142,100

100 Data 95,95,142,127,119,106

110 Data 95,95,119,95,95,119,95

120 Data 95,142,119,142,179,119

130 Data 142,142,106,119,127,-1

 

Weit aus lustiger ist das beim BIC A5105 gelöst. PLAY und SOUND, wobei PLAY sicherlich sein Vorbild beim Comodore C128 hat. Was sicherlich kein Problem sein sollte, nur hier fehlte es wieder an dem irgendwann kommenden Sound-Modul.

 

Hier ein kleines Listing aus dem Handbuch:

 

10 BEEP :rem auf Standard setzen

20 PLAY „c4 d8 e8 f2 g4 a8 d8 c2“ :REM Tonleiter mit unterschiedlichen Tonlängen.

 

Aber auch hier wird sich entschuldigt, das was passendes noch nicht Implementiert wurde.

Wobei bei SOUND sich die Lage noch prägerer zeigte. Dieser ist im dem falle noch umständlicher zu erreichen. Dafür wird der allgegenwärtige Tastenclick mittels SCREEN (eigentlich zum Einstellen der Bild-Modi) deaktiviert.

Nun zu dem viel beschriebenen Soundmodul. Dieses gibt es als M066 für den KC85/2-5 als auch für die ROBOTRON-K1520-Systeme, unter dem auch die wenigen Heimcomputer als auch für die Volksbildung vorgesehenen BIC A5105 gehören. Und somit zur guten Seite dieser Module. Diese werden unter BASIC direkt über die OUT-Befehle in den Registern angesprochen. Intern sind bis auf einige Geräte spezifische Eigenheiten gleich aufgebaut, eigener Oszilator, eigene CTC und ein AY, im dem Fall die große Variante. Basierend auf eine Endwicklung für den NKC. Als erstes macht es im Programm Sinn, den Mischer Register/ zu setzen. Danach können die restlichen Register entsprechend gesetzt werden. Wobei es erst ziemlich umständlich erscheinen mag. Daher ist es einfacher, das ganze mit Unterprogrammen (GOSUB; Return) zu realisieren.

 

10000 OUT 56,7:OUT 57,248:REM OHNE PORTS

10010 OUT 56,0:OUT 57,T1:REM KANAL 1

10020 OUT 56,1:OUT 57,D1:REM TEILER

10030 OUT 56,2:OUT 57,T2:REM KANAL 2

10040 OUT 56,3:OUT 57,D2:REM TEILER 2

10050 OUT 56,4:OUT 57,T3:REM KANAL 3

10060 OUT 56,5:OUT 57,D3:REM TEILER 3

10070 OUT 56,8:OUT 57,V1:REM VOLUME K1

10080 OUT 56,9:OUT 57,V2:REM VOLUME K2

10090 OUT 56,10:OUT 57,V3:REM VOLUME K3

10100 OUT 56,11:OUT 57,H1:REM HUELLKURVE FEIN

10110 OUT 56,12:OUT 57,H2:REM HUELLKURVE GROB

10120 OUT 56,13:OUT 57,H3:REM HUELLKURVE FORM

11000 RETURN

 

Dabei stehen T für Tone, D für divider, V für Volume und H für Hüllkurve. Das ganze funktioniert sogar recht gut und ist auch Übertragbar zum Beispiel auf das RBASIC. Die Zahlen dahinter dementsprechend für die Kanäle oder Funktionen. Die Tonlänge müsste hier entweder mit Pause oder einer im leere laufende FOR-NEXT-Schleife gelöst werden. Das schöne ist aber hier die einfache Handhabung. Im grunde muß man sich nur die Variablen merken, Im BASIC-Programm würde das so aussehen:

 

10 V1=15:GOSUB 10000 ← setze Kanallautstärke auf 15.

 

Das als vielleicht unvollständiges Beispiel. Man kann auch via INKEY die Variable ändern, der Fantasie sind keine Grenzen gesetzt. Oder spielt seine Musik über READ-DATA ab. Tatsächlich gibt es schon ein Composer-Programm, welches .TTT-Files ablegt. Dieses habe ich im KC-Archiv entdeckt, stammt von Jens Hasenstein und nennt sich <Music.sss>. Allerdings wird hier der Interne Soundbefehl genutzt, was nicht unbedingt ein Problem darstellt, es an das M066 anzupassen.

 

Fazit: Viele Wege führen nach Rom oder besser gesagt zum Ton. Auch wenn hier unterschiedliche Systeme vorgestellt wurden, einiges verbindet diese. Zum einem der Z80-Prozessor und zum anderen den AY, zum Teil serienmäßig (CPC), zum Teil auch nur nachgerüstet. Die Robotron-Rechner haben als Merkmal den K1520-Bus, unabhängig vom Einsatzzweck. Für den Spectrum gibt es eine AY-Karte, welche sogar die späteren von Amstrad gefertigten Spectrums aufwertet. Man sieht aber auch, welcher Aufwand schon im BS getrieben wurde, um den AY vernünftig zu verwalten. Aber auch die vielen unterschiedlichen Lösungen seitens der Hersteller für ein Problem.

Für viele Systeme gibt es inzwischen Handbücher im Netz, teils in html und teils als PDF. Was auch eine Folge der Emulatoren ist. Was mir aber auch geholfen hat