----------------------------------------------------
Kapitel
10
TON
----------------------------------------------------
1.
Die Hardware-Möglichkeiten den ATARI Computer Systems
Der
ATARI Computer besitzt leistungsfähige Tonerzeugungsfähigkeiten. Es gibt
4 Tonkanäle, wobei jeder unabhängig von den anderen kontrollierbar ist.
Jeder Kanal besitzt ein Frequenzregister, welches die Tonhöhe bestimmt, sowie
ein Kontroll-Register, das die Lautstärke und den Klang festlegt. Einige Optionen
gestatten das Einfügen von HI(gh)-Paß-Filtern, das Setzen verschiedener
Optionsmodi usw.
Zum
besseren Verständnis dieses Kapitels ist es erforderlich, einige spezielle Fachausdrücke
zu erklären:
1
Hz (Hertz) entspricht 1 Schwingung pro Sekunde
1
kHz (Kilo-Hertz) entspricht 1.000 Schwingungen pro Sekunde
1
MHz (Mega-Hertz) entspricht 1.000.000 Schwingungen/Sekunde
Ein
Impuls bezeichnet hierbei den ruckartigen Anstieg der elektrischen Spannung, dem
ein ebenso plötzlicher Abfall derselben folgt; in Verbindung mit einem Lautsprecher
entsteht so ein hörbares "PLOPP"-Geräusch.
Eine
"Welle" beschreibt die Spannung in Abhängigkeit zur Zeit wodurch die
Tonart bestimmt wird. (Die vom ATARI Computer erzeugten Wellen sind Rechteck-Schwingungen
(siehe Abbildung 10.2), Blechblasinstrumente erzeugen Sägezahn-Schwingungen
und die von einem Sänger erzeugten Schwingungen weden als Sinus-Kurve bezeichnet.)
Wird eine elektrische Welle zum Lautsprecher übertragen, so wird sie in eine
Schallkurve umgewandelt.
Eine
unterbrochene Folge von Rechteck-Impulsen ergibt eine Rechteckwelle.
Im
Computer gibt es sogenannte Schieberegister, die für die Tonerzeugung benötigt
werden und einem ganz gewöhnlichen Speicherbyte entsprechen in dem Binär-Daten
gespeichert werden. Ein solches Schiebe-Register bewegt allerdings alle Bits um eine
Position nach rechts, wenn es dazu angewiesen wird. So erhält Bit 5 den Wert
von Bit 4, Bit 4 den Wert von Bit 3 usw. Der Wert des am weitesten rechts stehenden
Bit wird aus dem Register geschoben und Bit 1 erhält einen neuen Wert:
Abbildung
10.1:
Diagramm
der Bit-Bewegung in einem Schiebe-Register
Der
Ausdruck AUDF1-4 bedeutet: "eines der 4 Audio- Frequenz-Register."
Die
Adressen dieser Register sind:
$D201,
$D203, $D205, $D207 (53760, 53762, 53764, 53766).
Der
Ausdruck AUDC1-4 steht für: "eines der 4 Audio- Kontroll-Register."
Die
zugehörigen Adressen sind:
$D201,
$D203, $D205, $D207 (53761, 53763, 53765, 53767).
Die
Wörter "Frequenz", "Ton" und "Note" werden abwechselnd
benutzt. Für dieses Kapitel ist ihre Bedeutung identisch.
"Rauschen"
und Verzerrung werden ebenfalls abwechslend in diesem Kapitel benutzt, obwohl ihre
Bedeutung in Wahrheit nicht die gleiche ist. "Rauschen" entspricht eher
der durch den ATARI 400/800™ ausgeführten Funktion.
Der
50-hz-Interrupt, auf den im 2. Teil dieses Kapitels verwiesen wird, kann auch als
Vertical-Blank-Interrupt bezeichnet werden.
Alle
vorliegenden Beispiele wurden in BASIC geschieben, sofern nicht anders angegeben.
Bei der Eingabe dieser Beispiele muF auf die Form geachtet werden, d.h., wenn keine
Zeilennummer angegben wurde, darf auch keine eigegeben werden. Stehen mehrere Statements
in einer Zeile, so müssen sie auch in einer Zeile stehend eingetippt werden,
usw.
Bei
Soundmanipulation mittels POKE-Befehl in Basic bzw. in Maschinensprache können
kleinere Probleme auftreten, da der POKEY-Chip initialisiert werden muF, bevor er
einwandfrei arbeiten kann. In BASIC geschieht dieses mit einer SOUND 0,0,0,0-Anweisung.
In Maschinensprache muF eine 0 in AUDCTL ($D208 = 53768) und eine 3 in SKCTL ($D20F
53775) gespeichert werden.
AUDF1-4
Jeder
Kanal besitzt ein zugehöriges Frequenz-Register, das die vom Computer zu erzeugende
Note kontrolliert.
Das
Frequnz-Register enthält einen Wert "N", der in einer "dividiere-durch-"N"-Schaltung
verwendet wird. Dieses Teilen ist keine Divsion im mathematischen Sinn, sondern ein
einfacheres Zuordnenz: auf jedem N-ten eingehenden Impuls wird ein Impuls ausgegeben.
Das folgende Beispiel zeigt eine "dividiere-durch-4"-Funktion:
Abbildung
10.2:
"dividiere-durch-4"-Funktion
Wird
der Wert von N größer, so sinkt die Zahl der ausgegebenen Schwingungen
- der Ton wird tiefer.
Im
Zusammenhang mit diesem Kapitel bezeichnet "Frequenz" die Anzahl von Schwingungen
innerhalb eines bestimmten Zeitraumes. Ein Teil mit der Frequenz 100 Hz bedeutet
z.B., daF in einer Sekunde 100 Schwingungen erzeugt werden. Eine Sopran-Sängerin
singt auf einer sehr hohen Frequenz (ungefähr 5 Khz). Eine Kuh erzeugt mit ihrem
Muh eine sehr niedrige Frequenz (ungefähr 100 Hz).
AUDC1-4
Jeder
Kanal besitzt neben dem Frequenzregister auch ein zugehöriges Kontroll-Register.
Diese Register gestatten das Steuern von Verzerrung und Lautstärke für
Jeden einzelnen Kanal. Die Bit-Zuordnung von AUDC1-4 lautet wie folgt:
AUDC1-4
LAUTSTƒRKE:
Die Lautstärken-Kontrolle für die einzelnen Kanäle ist sehr einfach
aufgebaut. Die unteren 4 Bit der Audio-Kontroll-Register stellen eine 4 Bit-Zahl
dar, welche die Lautstärke 0 angibt. Eine 0 in diesem Nibble bedeutet - nicht
hörbar. Eine 15 bedeutet so laut wie möglich. Es gibt 16 Lautstärken.
Die
Summe der Lautstärken der 4 Kanäle sollte 32 nicht überschreitenten,
da dieses eine ‹bermodulation der Audio-Ausgabe zur Folge hätte. Der ausgegebene
Ton würde nicht mehr die gewünschte Lautstärke besitzen und einem
Brummton gleichen.
VERZERRUNG:
Jeder Kanal besitzt auFerdem noch 3 Bit, welche die Verzerrung kontrollieren. Das
Rauschen wird zum Erzeugen spezieller Ton-Effekte benutzt, wenn ein reiner Ton unpassend
ist oder nicht gewünscht wird.
Die
Anwendung der Verzerrung durch den ATARI™-Computer ist in der Industrie einzigartig.
Die Vielseitigkeit und Kontrollierbarkeit gestattet die Erzeugung einer nahezu endlosen
Anzahl von Ton-Effekten. Dieses geht vom reinen Ton über Rumpel-, Rassel-, Klick-,
und ßüster-Geräuschen zu Quak-Tönen und Hintergrund-Rythmen.
Die
vom ATARI™ Personal Computer System verwendete Verzerrung entspricht nicht der standardmäFigen
Interpretation. So sind z.B. die Begriffe "harmonisch" und "Intermodulations-Verzerrung"
bei Stereo-Geräten qualitätsgebend. Sie geben die Stärke einer Schwingungs-Veränderung
an, die durch kleine Fehler in der Elektronik auftritt. Die Verzerrung gibt beim
ATARI™-Computer nicht die Veränderung von Kurven, sondern die Entfernung der
ausgesuchten Schwingungen innerhalb einer Kurve an (es werden vom Gerät immer
nur Rechteck-Schwingungen ausgegeben). Diese Technik wird durch das Wort "Verzerrung"
nicht korrekt bezeichnet; ein besserer Begriff wäre "Rauschen".
Doch
bevor uns den "Rausch"-Techniken zuwenden, muF der Leser erst den Begriff
"Poly-Zähler" kennen.
Poly-Zähler
werden vom ATARI-Computer-System als Quelle für zufällige Schwingungen
bei der Rauscherzeugung verwendet. Die Poly-Zähler bestehen zum gröFten
Teil aus Schiebe-Registern (siehe Beschreibung am Anfang dieses Kapitels), die zum
schnellen Umschieben (1.79 MHz) verwendet werden. Der Ausgang dieser Schiebe-Register
liefert die zufälligen Schwingungen, wobei ihre Eingänge durch Verarbeiten
der Werte festgelegter Bits dieser Register bestimmt werden.
Das
untere Diagramm zeigt, daF z.B. der Wert von Bit 5 aus dem Register geschoben wird,
wodurch die nächste Zufall-Schwingung erzeugt wird. Um das freigewordene Bit
1 neu zu laden, werden die Bits 5 und 3 miteinander verknüpft:
Abbildung
10.4:
5
Bit Poly-Zähler
Der
Bit-Prozessor erhält neue Werte, indem bestimmte Bits desselben (im oberen Fall
die Bits 3 und 5) auf eine für diese Besprechung unmaFgebliche Weise verknüpft
werden. Der Verknüpfungswert wird im Bit 1 des Prozessors gespeichert.
Die
Werte, die diese Poly-Zähler ausgeben, sind im Prinzip nicht "zufällig",
da sich die Bitfolge der Ausgabe nach einer bestimmten Zeit wiederholt. Diese Wiederholungs-Rate
hängt von der GröFe des Registers (Anzahl der Bits) ab; je gröFer
das Register, desto seltener wiederholt sich die Folge.
Nach
dieser Einführung in die Funktionsweise der Poly-Zähler können wir
uns jetzt der Erzeugung von Verzerrung mit dem ATARI™ Personal Computer System zuwenden.
Die
Verzerrung wird beim ATARI Computer durch Benutzung dieser zufälligen Schwingungen
vom Poly-Zähler erreicht, die sich wiederum in einer "Selektions-Schaltung"
befinden. Diese Schaltung ist in Wahrheit ein digitaler Vergleicher, wird aber durch
den oben genannten Begriff besser beschrieben. Aus diesem Grunde wird in diesem Kapitel
der Ausdruck "Selektions-Schaltung" verwendet.
Die
einzigen Schwingungen, die durch die Selektions-Schaltung gelangen, sind die mit
den Zufalls-Schwingungen übereinstimmenden. Dadurch werden verschiedene Impulse
"zufällig" eleminiert. Die folgende Abbildung veranschaulicht diese
Methode. Die gestrichelten Linien zeigen übereinstimmende Impulse:
Abbildung
10.5:
Funktion
der Selektions-Schaltung zum
Einbringen
von Verzerrung
Der
End-Effekt ist dabei folgender: einige Impulse der Frequenz, die durch eine Schaltung
dividiert wird, werden gelöscht (siehe Abschnitt dem Kapitels -AUDF1-4. Offensichtlich
ändert sich die Wirkung des Tones hörbar, wenn verschiedene Impulse gelöscht
werden. Auf diese Weise wird die Verzerrung eines Tones erreicht.
Da
Poly-Zähler ihre Bit-Folge wiederholen, wird auch die Folge der Impulse wiederholt.
AuFerdem wird eine Note auch dieses Muster besitzen, sofern sie verzerrt und dieser
Selektions-Schaltkreis benutzt wird. Diese Methode gestattet dem Programmierer die
Erzeugung von Motoren-, Summ- und anderen Geräuschen, die sich wiederholende
Folgen besitzen.
Der
ATARI Computer besitzt drei Poly-Zähler unterschiedlicher GröFe, wodurch
verschiedene Zufalls-Stufen vorhanden sind. Die kürzeren Poly-Zähler (4
& 5 Bit lang) wiederholen ihre Sequenz oft genug, um Geräusche zu erzeugen,
die rasch ansteigen und abfallen, wogegen der gröFere Poly-Zähler (17 Bit
groF) zu lange braucht, um sich zu wiederholen, so daF im Prinzip kein Muster bei
der Verzerrung vorliegt. Dieses 17 Bit-Register kann zur Erzeugung von Rauch-, Explosions-
und allen anderen Geräuschen benutzt werden, bei denen ein zufälliges "Knistern"
und "Krachen" gewünscht wird. Dieses Register ist ebenfalls unregelmäFig
genug zum Erzeugen von weiFem Rauschen (ein Ton-Begriff, der einen zischenden Klang
beschreibt). Ein Beispiel hierfür wäre:
SOUND
0,100,8,
POKE
53768,64
Eine
Poly-Zähler Option von 9 Bit liefert einen vernünftigen Kompromiss zwischen
den kleinen und groFen Poly-Registern (siehe Abschnitt I, Besprechung von AUDCTL).
Jeder
Audio-Kanal liefert 6 verschiedene Kombinationsmöglichkeiten der drei Poly-Zähler:
Anmerkung:
"Takt" bezeichnet die Basis-Frequenz -- siehe Besprechung von AUDCTL in
Teil 1.
Ein
"x" bedeutet, daF es nicht maFgeblich ist, ob dieses Bit
gesetzt
ist oder nicht. Die in 10.7 gezeigte Struktur verdeutlicht, warum dieses der Fall
ist
Abbildung
10.6:
Mögliche
Kombinationen der Poly-Zähler
Die
oberen Bits von AUDC1-4 kontrollieren 3 Schalter im Audio-Schaltkreis, der in der
folgenden Abbildung dargestellt wird. Dieses Diagramm verdeutlicht, warum die Tafel
in Abbildung 10.6 ihre Form hat:
Abbildung
10.7:
AUDC1-4
Block-Diagramm
Jede
Kombination der Poly-Zähler liefert einen anderen Klang. Sucht der Programmierer
einen bestimmten Sound, sollte er jede Kombination der Poly-Zähler in mehrern
Frequenzen durchprobieren, da sich ein bestimmtes Rauschen bei unterschiedlichen
Frequenzen ganz anders anhören kann. Die folgende Abbildung zeigt eine grobe
‹bersicht, damit der Leser einen Anhaltspunkt hatt:
Abbildung
10.9
Durch
verschiedenartige Kombination von
Verzerrung
und Frequenz erzeugte Geräusche
Zusammenfassung:
Ein Schieberegister wird als Hauptbestandteil eines Poly-Zählers benutzt, welche
wiederum zum Erzeugen von "zufälligen" Impulsen verwendet wird. Mit
den zufälligen Impulsen werden bestimmte Tonschwingungen gelöscht, wodurch
der Ausgangston eines Kanals verzerrt wird. Die oberen Bit (5, 6 und 7) von AUDC1-4
verändern 3 Schalter, die zum Auswählen der Poly-Zähler für die
Verzerrung benutzt werden.
NUR
LAUTSTƒRKE: Das
4. Bit von AUDC1-4 legt einen Nur-Lautstärke Modus fest. Ist dieses Bit gesetzt,
werden die Lautstärke-Bits (AUDC1-4 Bits 0 bis 3) als Lautstärke zum Fernseh-Lautsprecher
gesendet: durch dieses Bit wird keine Frequenz mehr übertragen.
Um
diese Operations-Art zu verstehen, muF der Leser die Funktionsweise eines Lautsprechers
kennen, der einen Impuls erhält.
Jeder
Lautsprecher besitzt einen beweglichen Metallbolzen. Die Position dieses Bolzens
ist jederzeit proportional der Stromstärke, die vom Computer ausgesendet wird.
Beträgt die Spannung z.B. Null Volt, so befindet sich der Bolzen in Ruhestellung.
Durch diese Bewegung des Bolzens wird die Lautsprecher-Membran in Bewegung gesetzt,
was wiederum die Luft zum Schwingen bringt. Das menschliche Ohr erfaFt diese Schwingungen
schlieFlich als Ton.
Die
für einen Impuls getroffene Defininition besagt, daF ein solcher aus einem plötzlichen
Spannungs-Anstieg, gefolgt von einem plötzlichen Abfall desselben besteht. Wird
ein solcher Impuls zum Fernseh-Lautsprecher gesendet, so erzeugt dieser eine einzelne
Luftschwingung, die das Ohr als kurzes "PLOPP"-Geräusch wahrnimmt.
Die folgende Anweisung produziert einen solchen Impuls, der zum Lautsprecher des
Fernsehgerätes gesendet wird:
POKE
53761,31:POKE 53761,16
Eine
Reihe von Impulsen (= Welle), die zum Lautsprecher gesendet werden, erzeugen eine
gleichmäFige Bewegung des Bolzens, wodurch ein durchgehendes Summen zu hören
ist. Auf diese Weise liefert der Computer Töne und Geräusche.
Ein
Impuls fällt nicht automatisch auf Null ab, sondern bleibt konstant, bis der
Abfall durch das Programm oder eine Anweisung bewirkt wird. Ein Programm muF, um
ein Geräusch oder einen Ton zu erzeugen, den Impuls oft genug verändern.
Geben Sie bitte folgende Befehle in den Computer ein und achten Sie nach jedem einzelnen
auf das erzeugte Geräusch:
POKE
53761,31
POKE
53761,31
Bei
der Ausführung der ersten Anweisung ist, wie sicherlich vermutet, ein Knacken
vernehmbar; der Metallbolzen wird nach außen gedrückt und es entsteht
eine Luftbewegung. Bei der Ausführung des zweiten Befehls ist nichts mehr zu
hören, da der Bolzen bereits in der entsprechenden Position steht; die Luft
wird nicht mehr bewegt.
POKE
53761,16
POKE
53761,16
Genau
wie vorher ist beim ersten Befehl ein Knacken zu hören, weil der Metallbolzen
wieder in den Lautsprecher zurückgezogen wird. Auch hier ist bei der Ausführung
der zweiten Anweisung nichts zu vernehmen, da sich der Bolzen bereits in der angesprochenen
Position befindet.
Die
Lautstärke-Bits gestatten also die absolute Kontrolle über die Bolzenposition.
Obwohl die oberen Beispiele nur binärer Natur sind (entweder alles eingeschaltet
oder alles ausgeschaltet), ist der Programmierer in der Bearbeitung des Lautsprechers
nicht eingeschränkt. Der Lautsprecher kann tatsächlich auf 16 verschiedene
Positionen gebracht werden.
Es
ist möglich eine Sägezahn-Schwingung zu erzeugen (womit die von Blechinstrumenten
hervorgerufenen Schwingungen bezeichnet werden), indem eine Reihe von Lautstärken
gesendet wird, die sich ständig wiederholt (z.B. Lautstärken 8, 9, 10,
9, 8, 7, 6, 5, 6, 7 und schlieFlich wieder 8. BASIC ist für einen solchen Effekt
zu langsam.) In diesem Beispiel werden nur 7 von 16 möglichen Bolzenstellungen
benutzt. (Das angegebene Programm für die Tonerzeugung mit Maschinensprache
würde in der Tat eine Sägezahn-Schwingung liefern, sofern die Tabelle für
die Schwingungsdauer nur Einsen enthalten würde).
Durch
schnelles ƒndern der Lautstärke kann also nahezu jede Schwingungsform erreicht
werden. Der Computer könnte klar verständlich "Hallo" sagen.
Hat
der Leser sich noch nicht mit Tonerzeugung, Schwingungsformen usw. beschäftigt,
so erscheint die Benutzung dieser Lautstärke-Bits ziemlich kompliziert. In einem
solchen Fall sollte der Leser sich mit Hilfe von Literatur über diese Dinge
informieren.
In
Teil II wird die Besprechung dieses Bits fortgesetzt.
AUDCTL
Zusätzlich
zu den unabhängigen Kontrollbytes für die einzelnen Kanäle (AUDC1-4)
gibt es ein Options-Byte (AUDCTL), welches alle Kanäle beeinßuFt. Jedem
Bit in AUDCTL ist eine spezielle Funktion zugeordnet:
AUDCTL
($D208 = 53768)
BIT
Ist dieses Bit
gesetzt, dann...
0
wird der Haupttakt
von 64 kHz auf 15 kHz umgeschaltet.
1
wird ein High-PaF-Filter
in Kanal 2 eingefügt,
der durch Kanal 4 getaktet wird.
2
wird ein High-PaF
Filter in Kanal 1 eingefügt,
der durch Kanal 3 getaktet wird.
3
werden die
Kanäle 4 und 3 verbunden,
(16 Bit-Dauerstellung)
4
werden die
Kanäle 2 und 1 verbunden
(16 Bit-Dauerstellung).
5
wird Kanal
3 mit 1,79 MHz getaktet.
6
wird Kanal
1 mit 1,79 MHz getaktet.
7
wird der 17
Bit Poly-Zähler in einen
9 Bit Poly-Zähler umgewandelt.
Abbildung
10.9:
Bit-Zuordnung
in AUDCTL
TAKT:
Bevor wir mit der Erklärung der AUDCTL-Optionen fortfahren, muF der Leser die
Bedeutung des Begriffes Takt verstehen. Im allgemeinen ist ein Takt eine Reihe von
Impulsen, die zum synchronisieren der Millionen internen Operationen im Computer
benutzt wird. Ein Takt ist eine gleichmäFige Folge von Impulsen, wobei jeder
Impuls dem Computer mitteilt, daF er die nächste Operation ausführen kann.
Im
Abschnitt zum Begriff Frequenz wurde gesagt, das ein Frequenz-Teiler nur jeden n-ten
Eingangs-Impüls einen Impuls wieder ausgibt. Diese Eingangs-Impulse sind der
Takt.
In
einem Computer werden mehrere Takte benutzt. AUDCTL gestattet dem Benutzer nun, den
als Eingang verwendeten Takt zu ändern, wodurch sich eine langsamere oder schnellere
Taktgeschwindigkeit ergibt. Durch ƒndern des Eingangstaktes ändert sich logischerweise
auch der Ausgangstakt proportional.
Man
stelle sich einen Takt mit einer Frequenz von 15 kHz vor, wobei das Frequenz-Register
so gesetzt ist, daF es durch 5 dividiert.Die durch die Teiler-Schaltung ausgegebene
Frequenz wäre 3 kHz. Wird aber nun der Takt (=Eingangs-Frequenz) z.B. auf 40
kHz geändert, ohne daF das Frequenz-Register geändert wird, so würde
der Teiler-Schaltkreis weiterhin bei jedem 5. Eingangsimpuls einen Impuls ausgeben.
Die Ausgabe erfolgt also schneller, mit dem Ergebnis, daF die Ausgangsfrequenz auf
8 kHz ansteigt.
Die
Formel für die Ausgangs-Frequahz ist sehr einfach:
Ausgangs-Frequenz
= Takt-Frequenz
N
Die
Ausgangsfrequenz ist also direkt proportional zur Eingangs-Frequenz.
Wird
die Taktfrequenz erhöht, so wird alles, was auf diese angewiesen ist, mit geringerer
Verzögerung ausgeführt. Im Falle der Audio-Schaltkreise des ATARI 400/8OO™
bedeutet eine Erhöhung der Taktfrequenz eine dichtere Folge von Tonimpulsen,
die zum Fernseh-Lautsprecher gesendet werden;, der ausgegebene Ton wird höher
(siehe Teil 1, Abschnitt über Frequenzen).
Das
oben Besagte gilt ebenfalls für den gegenteiligen Fall - wird die Taktfrequenz
erniedrigt - so hat dieses eine weniger dichte Reihe von Tonimpulsen zur Folge, wodurch
ein tieferer Ton zustande kommt.
15
kHz-Option: Geben Sie
bitte folgendes ein:
SOUND
0,128,10,9 mittlerer
Ton
POKE
53768,1
AUDCTL 15 kHz-Option
Wie
in diesem Abschnitt zum Takt erklärt, bewirkt eine ƒnderung der Zeitbasis eine
proportionale ƒnderung der hörbaren Frequenz. In diesem Falle bewirkt das Speichern
einer 64 in AUDCTL, daF für Kanal 1 eine 1,79 MHz-Zeitbasis anstelle einer 64
kHz-Zeitbasis verwendet wird. Wie der Leser wahrscheinlich aus dem vorangegangenen
Abschitt gefolgert hat, verursacht das POKEn die Erhöhung eines Tones. Dieses
ist eine sehr schwerwiegende ƒnderung, da 1,79 MHz fast 30 mal schneller als 64 kHz
ist.
Das
Setzen von AUDCTL-Bit 5 zwingt Kanal 3 zur Benutzung vom 1,79 MHz anstelle des 64
kHz-Taktes.
SOUND
2,255,10,8 Kanal 3 einschalten,
tiefer Ton
POKE
53768,32
Setzen von AUDCTL-Bit 5
Diese
Optionen erweitern den Bereich der zu erzeugenden Frequenzen bis über die Grenzen
hinaus, die das menschliche Ohr wahrnehmen kann (der Mensch kann Frequenzen bis zu
20 kHz hören).
16
BIT-OPTIONEN: Die Bits
Nr. 3 und 4 von AUDCTL gestatten das Zusammenfügen von zwei Kanälen zu
einem einzigen, der dann eine gröFere dynamische Reichweite besitzt. Arbeiten
die Kanäle unabhängig voneinander, so haben sie jeweils einen Frequenzbereich
von 0 bis 255 (8-Bit-dividiert-durch-N-Möglichkeit). Das Zusammenschalten von
zwei Kanälen gestattet einen Frequenzbereich von 0 bis 65535 (16 Bit-dividiert-durch-N-Möglichkeit).
In diesem Modus ist es möglich die Ausgabe-Frequenz auf einen einzelnen Impuls
zu reduzieren, wovon mehrere jeweils durch einige Sekunden getrennt werden. Das folgende
Programm benutzt zwei Kanäle im 16 Bit-Modus, wobei zwei Paddles zur Frequenz-Eingabe
verwendet werden:
10
SOUND 0,0,0,0:REM Sound initialisieren
20
POKE 53768,80:REM Takt von 1,79 für Kanal 1 & 2
30
POKE 53761,160:POKE 53763,168:REM Kanal 1 aus, K. 2 ein
40
POKE 53760,PADDLE(0):POKE 53762,PADDLE(l):REM regeln
50
GOTO 40:REM der Frequenzen mit PADDELS
Das
rechte Paddle stellt den Ton grob, das linke den Ton fein ein.
Das
Programm setzt als erstes die Bits Nr. 4 & 6 von AUDCTL. Dieses bedeutet: ìWähle
einen Takt von 1,79 MHz für Kanal 1 und verbinde Kanal 2 mit Kanal l."
Sobald dies geschehen ist, werden die beiden 8-Bit-Frequenz-Register der einzelnen
Kanäle zusammengezogen, um ein 16 Bit-Frequenz-Register zu bilden. Dieses 16
Bit-Register gibt die Zahl N, die zum Dividieren des Eingangstaktes verwendet wird.
Als
nächstes wird die Lautstärke von Kanal 1 auf Null gesetzt, weil die Ausgabe
von diesem Kanal nur Bedeutung für Kanal zwei besitzt. Wenn diese Kanäle
in den 16 Bit-Modus gebracht werden, verursachen interne ƒnderungen, daF die zwei
Kanäle wie ein einziger (16 Bits) behandelt wird. Diese ƒnderungen schalten
die Ausgabe durch Kanal 1 ab.
Das
Frequenzregister von Kanal 1 wird als Fein- bzw. niederwertiges Byte der Tonerzeugung
benutzt. Das Frequenzregister von Kanal 2 dient entsprechend als Grob- oder höherwertiges
Byte. So bewirkt z.B. das Setzen einer 1 in Frequenzregister von Kanal 1, daF durch
1 dividiert wird. Dagegen hat ein Setzen einer in Frequenzregister von Kanal 2 eine
Division durch 256 zur Folge. Setzt man eine 1 in die beiden Register, so wird durch
257 dividiert.
Das
3. Bit von AUDCTL kann zur entsprechend verwendeten Kombination von Kanal 3 und 4
benutzt werden.
Die
16 Bit-Option ist in Programmen nützlich, bei denen eine feinere Kontrolle der
Frequenzen gewünscht bzw. erforderlich ist. Diese feinere Kontrolle wird durch
Auswahl des 1,79 MHz-Taktes und der 16-Bit-Option, wie in Zeile 20 des oberen Programms
gezeigt, erreicht.
Um
den Grund für die feineren Abstufungen der einzelnen Frequenzhöhen zu verstehen,
muF der Leser wissen, was mit der Ausgabe-Frequenz geschieht, wenn der Wert des Frequenz-Registers
geändert wird. Als erstes ein konkretes Beispiel: dividiert das Frequenz-Register
durch 1 und beträgt die Eingangs-Frequenz 1 kHz, so liegt die Ausgabe-Frequenz
ebenfalls bei 1 kHz. Wenn der Wert des Registers nun um 1 erhöht wird, also
durch 2 dividiert wird, dann wird eine Frequenz von 500Hz ausgegeben. Dieses entspricht
einem Abfall um die Hälfte. Wird er Wert des Frequenz-Registers nochmals um
1 erhöht, so beträgt die Ausgabe-Frequenz 333 Hz der Abfall nur noch 167
Hz. Die zweite Inkrementierung des Frequenz-Register-Wertes hat also einen geringeren
Abfall der Ausgabe zur Folge, als die erste. Daraus läFt sich schlieFen: fährt
man fort, den Wert des Frequenz-Registers zu erhöhen, so hat dieses jedesmal
einen geringeren Frequenz-Abfall als beim vorigen Mal zur Folge.
Die
Grundidee hierbei ist: je gröFer die Zahl N im Frequenz-Register ist, umso geringer
ist der Unterschied zwischen den einzelnen Ausgabe-Frequenzen, wenn N sich ändert.
Wird
nun ein 16 Bit-Kanal mit einem Takt von 1,79 MHz durch einen Wert von mehreren Tausend
geteilt, so hat dieses die gleiche Ausgabe zur Folge, wie ein 8 Bit-Kanal des Taktes
64 kHz, der durch mehrere Hundert geteilt wird. Der 16 Bit-Kanal gestattet eine feinere
Abstufung zwischen den einzelnen Frequenzen, da jedes Erhöhen des Frequenz-Register-Wertes
einen geringeren Effekt hat.
Das
folgende Beispielprogramm arbeitet mit 16 Bit-Kanälen. Geben Sie es bitte einmal
ein und experimentieren Sie damit, indem Sie die Wertkombinationen der letzten 4
POKE-Befehle ändern.
SOUND
0,0,0,0
POKE
53768,24
POKE
53761,168
POKE
53763,168
POKE
53765,168
POKE
53767,168
POKE
53760,240:REM ändern Sie die folgenden 4
POKE
53764,252:REM Speicherstellen mit den POKE-
POKE
53762,28:REM Befehlen.
POKE
53766,49
HIGH-PAF-FILTER:
mit den Bits 1 & 2 von AUDCTL werden die High-PaF-Filter der Kanäle 2 und
1 kontrolliert. Ein High-PaF Filter gestattet nur hohen Frequenzen den Durchgang.
Im
Falle dieser High-PaF Filter sind hohe Frequenzen als die definiert, welche höher
liegen, als der Takt. Der Takt ist hierbei die Ausgabe eines anderen Kanals.
Wenn
Kanal 3 z.B. den ìMUH"-Laut einer Kuh ausgibt und Bit 2 von AUDCTL gesetzt
wurde, dann werden nur Töne ausgegeben, deren Frequenz über der des ìMUH"s
liegen. Alles tiefer liegende wird ausgefiltert.
Abbildung
10.10:
Diagramm
der Wirkung eines High-PaF Filters
der
in Kanal 1 eingesetzt und durch Kanal 3
getaktet
wird.
Der
Filter ist in Realzeit programmierbar, da dieses ein anderer Kanal ist, der jederzeit
gändert werden kann. Dem Programmierer wird hierdurch ein groFes Feld von Anwendungs-Möglichkeiten
eröffnet.
Die
Filter werden meistens zum Erzeugen spezieller Toneffekte verwendet. Geben Sie bitte
folgendes Beispiel ein:
SOUND
0,0,0,0
POKE
53768,4
POKE
53761,168:POKE 53765,168
POKE
53760,240:POKE 53764,127
POKE
53760,240:POKE 53764,127
9
BIT POLY-UMWANDLUNG:
Bit 7 von AUDCTL schaltet den 17 Bit Poly-Zähler in einen 9 Bit Poly-Zähler
um. In dem Abschnitt über diese Zähler wurde erklärt, daF sich eine
Verzerrungs-Folge umso öfter wiederholt, je kürzer der Poly-Zähler
ist. Daraus kann man schlieFen, daF die ƒnderung des 17 Bit Poly-Zählers in
einen mit 9 Bits einen klarer zu erkennenden Verzerrungseffekt hat.
Geben
Sie bitte folgendes Beispiel zur 9 Bit Poly-Option ein und hören Sie genau hin,
wenn der POKE-Befehl ausgeführt wird:
SOUND
0,80,8,8:REM 17-Bit-Poly wird benutzt
POKE
53768,128:REM ƒnderung in 9-Bit-Poly-Zähler
II.
SOFTWARE-TECHNIKEN FüR DIE GERƒUSCH- UND TONERZEUGUNG
Es
gibt zwei Möglichkeiten das Sound-System des ATARI Computers zu benutzen: die
statische und die dynamische. Statische Tonerzeugung bedeutet, daF der Programmierer
einen oder mehrere Tonkanäle einschaltet, eine gewisse Zeit wartet und sie dann
wieder ausschaltet. Dynamisch bedeutet, daF die Tongeneratoren ständig neue
Werte erhalten, während das Programm ausgeführt wird. Ein Beispiel hierfür:
statisch:
SOUND
0,120,8,8
dynamisch:
FOR
X=0 TO 255:SOUND 0,X,8,8:NEXT X
Statische
Tonerzeugung
Der
statische Ton ist in seiner Wirkung sehr beschränkt. Meistens sind die einzigen
Töne, die erzeugt werden können, nur Klick-, Piep- oder Summgeräusche.
Natürlich gibt es auch Ausnahmen. Zwei Beispiele sind die in Abschitt I dieses
Kapitels angegebenen Programme (Teile über High-PaF Filter und 16-Bit Tonerzeugung).
Ein anderes, einfacheres Beispiel ist die Benutzung von 2 Tonkanälen auf die
folgende Weise:
SOUND
0,255,10,8
SOUND
1,254,10,8
Der
seltsame Effekt entsteht durch den kleinen Frequenz-Unterschied der Töne, wodurch
Schwingungen erzeugt werden, wie im folgenden Diagramm dargestellt. Es zeigt zwei
von den 2 Tonkanälen ausgegebene Sinuskurve und ihre Summe. Die Summenkurve
zeigt das ungewöhnliche Interferenz-Muster, das durch die Addition der beiden
Kanäle entsteht.
Abbildung
10.11:
Zwei
Sinuswellen unterschiedlicher
Frequenz
und ihre Summe
Bevor
die Tonkanäle zum Fernseh-Lautsprecher gesendet werden, werden sie gemischt.
Dieser Mischvorgang entspricht dem im menschlichen Ohr; es ist eine einfache Adddition.
Abbildung
10.11 veranschaulicht, daF die Schwingungen sich an einigen Stellen so überlagern,
daF sie sich gegenseitig verstärken, wogegen sie sich an einigen Stellen gegenseitig
aufheben. Die Addition von Schwingungen, deren Schwingungsrichtung gleich verläuft,
bedeutet also eine Verstärkung, eine Addition zweier gegeneinanderlaufender
Schwingungen eine Schwächung der Lautstärke.
Die
dargestellte Kurve der Addition zeigt diesen Vorgang. Zum Ende des Graphen hin steigt
die Lautstärke an, da sich die beiden Schwingungen von Kanal 1 und 2 ergänzen;
die Lautstärke wird nahezu verdoppelt. In der Mitte des Graphen stehen die beiden
Schwingungen gegeinander, daraus resultiert eine fast vollständige Löschung
des Tones. Ein interessantes Programm wäre, die Schwingungen von 2, 3 oder 4
Tonkanälen und deren Additionsergebnis darzustellen.
Je
geringer der Unterschied in der Frequenz zwischen den einzelnen Kanälen ist,
umso länger dauert es, bevor sich die Ergebnis-Schwingung wiederholt. Um dieses
zu verstehen, sollte der Leser sich noch einige Graphen wie in Abbildung 10.11 zeichnen
und die Wechselwirkungen studieren. Geben Sie nun bitte folgendes Beispiel in den
Computer ein:
SOUND
0,255,10,8
SOUND
1,254,10,8
SOUND
1,253,10,8
SOUND
1,252,10,8
Ein
anderes Beispiel wäre:
SOUND
0,254,10,8
SOUND
1,127,10,8
Dynamische
Tonerzeugung
Im
allgemeinen muF jeder Ton, der nicht ein einfaches Klicken oder Piepen ist, dynamisch
erzeugt werden. Dem Programmierer steht die Wahl zwischen drei Arten der dynamischen
Tonerzeugung frei: Sound in BASIC, 50-Hz-Interrupt oder Sound in Maschinensprache.
SOUND
IN BASIC: BASIC ist
in gewisser Hinsicht in den Möglichkeiten der Tonerzeugung beschränkt.
Wie der Leser vielleicht schon bemerkt hat, löscht jede SOUND-Anweisung eine
geänderte AUDCTL-Einstellung. Dieses Problem kann umgangen werden, indem anstelle
des SOUND-Befehls direkt mit POKE gearbeitet wird. Das Programm in Teil I (16 Bit-Optionen
von AUDCTL) ist ein gutes Beispiel für diese Technik.
AuFerdem
besteht in BASIC ein weiteres Problem in der begrenzten Ausführungs-Geschwindigkeit.
Sofern das Programm nicht speziell auf Tonerzeugung ausgelegt wurde, reicht die Prozessorzeit
im allgemeinen nicht aus, um mehr als statischen Sound zu erzeugen. Natürlich
kann dieses umgangen werden, indem sämtliche anderen Aktionen gestoppt werden
und das Gerät nur auf die Tongenerierrung beschränkt wird.
Eine
weitere Schwierigkeit tritt dann auf, wenn der Computer Musik auf mehr als einem
Kanal gleichzeitig spielen soll. Werden alle 4 Kanäle benutzt, so kann die Zeit,
die zwischen Einschalten des 1. und des 4. Kanals vergeht, ausreichen um einen hörbaren
Missklang zu erzeugen.
Das
folgende Programm wäre eine Lösung für dieses Problem:
10
SOUND 0,0,0,0;DIM SIMUL$(16)
20
RESTORE 9999:X=l
25
READ Q:IF Q<>-1 THEN SIMUL$(X)=CHR$(Q):X=X+1:GOTO 25
27
RESTORE 100
30
READ ß,Cl,F2,C2,F3,C3,F4,C4
40
IF ß=-l THEN END
50
X=USR(ADR(SIMUL$),ß,Cl,F2,C2,F3,C3,F4,C4)
55
FOR X=0 TO 150:NEXT X
60
GOTO 30
100
DATA 182,168,0,0,0,0,0,0
110
DATA 162,168,182,166,0,0,0,0
120
DATA 144,168,162,166,35,166,0,0
130
DATA 128,168,144,166,40,166,35,166
140
DATA 121,168,128,166,45,166,40,166
150
DATA 108,168,121,166,47,166,45,166
160
DATA 96,168,108,166,53,166,47,166
170
DATA 91,168,96,166,60,166,53,166
999
DATA -1,0,0,0,0,0,0,0
9000
REM
9010
REM Diese Datenzeilen enthalten das Mgschinen-Sprache
9020
REM Programm, das in SIMUL$ eingelesen wird.
9030
REM
9999
DATA 104,133,203,162,0,104,157,0,210,232,228,203,208,
10000
DATA 246,96,-l
SIMUL$
ist ein kleines Maschinensprache-Programm, das die Werte für die 4 Tonkanäle
fast gleichzeitig setzt. Jedes Programm, bei dem diese Routine benutzt wird, kann
die 4 Tonkanäle gleichzeitig starten.
Jedes
Programm kann SIMUL$ aufrufen, indem die Werte für die SOUND-Register in die
in Zeile 50 gezeigte USR-Funktion geschrieben werden. Die Parameter müssen wie
gezeigt angeordnet werden, wobei der Wert für das Kontroll-Register dem für
das Frequenz-Registers folgt. Diese Folge wird 1 bis 4 mal wiederholt und zwar für
jeden Kanal, der gesetzt werden soll, einmal.
Das
Programm in SIMUL$ hat den Vorteil, daF eine beliebige Anzahl von Kanälen (natürlich
bis zu 4) gesetzt werden kann. Hierfür müssen lediglich die nicht zu benutzenden
Parameter aus der USR-Funktion gelassen werden. Die folgende Anweisung zeigt die
USR-Funktion, bei der nur die ersten beiden Kanäle gesetzt werden:
X=USR(ADR(SIMUL$),ß,Cl,F2,C2)
Das
SIMUL$-Programm liefert einen weiteren Vorteil gegenüber der SOUND-Anweisung
in BAISC: da kein SOUND-Befehl verwendet wird, bleibt der Wert in AUDCTL erhalten.
Es
gibt eine weitere Möglichkeit der Tonerzeugung, die über den BASIC-INTERPRETER
nicht vollständig ausgenutzt wird. Sie besteht in der Benutzung des ìNur-Lautstärke"-Bits
der 4 Kanäle. Geben Sie bitte folgendes Beispiel ein und starten Sie es:
SOUND
0,0,0,0
10
POKE 53761,16:POKE 53761,31:GOTO 10
Dieses
Programm setzt das Nur-Lautstärke-Bit von Kanal 1 und moduliert die Lautstärke
von 0 bis 15; dieses geschieht allerdings nur so schnell (oder langsam), wie es in
BASIC eben möglich ist. Um es konkret auszudrücken: dieses Programm benutzt
100% der verfügbarn Prozessor-Zeit und erzeugt dabei nur ein tiefes Brummen.
Die
beste Methode, um in BASIC komplexe Töne zu erzeugen, ohne daF der Prozessor
mit Beschlag belegt wird, ist die Benutzung des 50-Hz-Interrupts. Dieser wird im
nachfolgenden Abschnitt besprochen.
DER
50-HZ-INTERRUPT: Die
Tonerzeugung über diesen Interrupt ist wahrscheinlich die nützlichste und
praktischste Methode, aller auf dem ATARI™ verfügbaren.
Präzise
jede 50tel Sekunde erzeugt die Hardware des Computers einen Interrupt (=Unterbrechung).
Wenn dieses geschieht, verläFt der Computer zeitweilig das eigenliche Programm
(z.B. BASIC oder STAR RAIDERS™) und führt eine sogenannte ìinterrupt-Service-Routine"
aus. Dieses ist ein sehr kleines Programm, das speziell zum Bearbeiten solcher Interrupts
vorgesehen ist. Wurde diese Routine abgearbeitet, dann folgt ein Maschinensprache-Befehl,
der den Computer veranlaFt, wieder zum Hauptprogramm zurückzukehren. Alles dieses
geschieht (sofern richtig), ohne das Hauptprogramm zu beeinßussen.
Die
augenblicklich noch im ATARI Personal Computer residente Interrupt-Service-Routine
erhält die Timer aufrecht, übersetzt die Informationen von Kontrollern
und bearbeitet die anderen Dinge, die eine regelmäFige Beachtung erfordern.
Bevor
aber die Interrupt-Service-Routine wieder zum eigenlichen Programm führt, kann
der Benutzer veranlassen, daF eine weitere, von letzterem geschriebene Routine abgearbeitet
wird, z.B. eine Sound-Routine. Diese Möglichkeit ist ideal für die Tonerzeugung,
da das Timing präzise kontrolliert wird und ein anderes Programm laufen kann,
ohne auf die Sound Generatoren achten zu müssen.
Ein
weiterer Vorteil dieser Routine ist ihre Vielseitigkeit. Ein Interrupt zur Tonerzeugung
führt auf die gleiche Weise zu jedem Hauptprogramm zurück, egal in welcher
Sprache letzteres geschrieben wurde (z.B. Assembler, BASIC, FORTH, PASCAL usw.).
In der Tat werden nur geringe oder sogar keine ƒnderungen nötig, damit das Interrupt-Programm
für Tonerzeugung mit einem anderen Hauptprogramm oder einer aneren Sprache arbeitet.
Eine
ìtabellen-gesteuerte" Routine liefert ein Maximum an ßexibilität
und Einfachheit für solche Zwecke. ìTabellen-gesteuert" bezeichnet
ein Programm, das auf Daten-Tabellen im Speicher zugreift, um die notwendigen Informationen
zu erhalten. Im Falle der Tonerzeugung würde so eine Tafel die Werte für
die Frequenz (und evtl. für die Kontroll-) Register enthalten. Die Routine würde
einfach die Werte lesen und sie in die zugehörigen Register übertragen.
Auf diese Weise könnten die Noten bis zu 50 mal in jeder Sekunde geändert
werden, was für die meisten Anwendungen ausreichend sein dürfte.
Die
Routine muF in Maschinen-Sprache geschrieben werden, da sie regelrecht zu einem Teil
des Operating Systems wird!
Sobald
ein solches Programm geschrieben und im Speicher plaziert wurde (z.B. bei Speicherstelle
$600 beginnend), muF es zu einem Teil der 50-Hz-Interrupt-Routine werden. Dieses
wird durch eine Technik erreicht, die als ìVektor-ƒnderung" bezeichnet
wird und die in Anhang I ausführlich erklärt wird.
Die
Speicherstellen $224 und $225 enthalten die Adresse einer kleinen Routine: XITVBL
( = EXIT - Vertical - Blank - Interrupt Service-Routine = verlasse Interrupt - Service
für Vertical Blank). XITVBL wird ausgeführt, nachdem sämtliche Arbeiten
zum 50-Hz-Interrupt abgeschlossen sind. Sie dient dazu den Computer wieder (wie vorangehend
besprochen) auf das Hauptprogramm zurückzuführen.
Um
die Sound-Routine einzusetzen, müssen folgende Schritte durchgeführt werden:
1)
das Programm wird in den Speicher gebracht;
2)
die letzte Anweisung muF ein JMP $E462 sein ($E462 ist die Adresse von XITVBL, damit
das Hauptprogramm fortgesetzt werden kann.);
3)
das X-Register wird mit dem höherwertigen Byte der Routinen-Adresse geladen
(in diesem Fall eine 6);
4)
das Y-Register wird mit dem niederwertigen Byte der Routinen-Adresse geladen (in
diesem Fall eine 0);
5)
im Akkumulator wird eine 7 gespeichert;
6)
es wird ein JSR $E45C (zum Setzen der Speicherstellen $224 und $225) ausgeführt.
Die
Schritte 3-6 sind lediglich zum ƒndern des Wertes in $224 und $225 erforderlich.
Die aufgerufene Routine heiFt SETVBV (Setze die Vertical-Blank-Vektoren); sie bringt
nur die Speicherstellen (siehe Anhang I).
Einmal
eingebracht, arbeitet das System wie folgt, sobald ein Interrupt auftaucht:
1)
die Interrupt-Routine des Computers wird ausgeführt;
2)
es wird zum Benutzerprogramm gesprungen, dessen Adresse in den Speicherstellen $224
und $225 steht;
3)
die Benutzer-Routine wird ausgeführt;
4)
es wird zu XITVBL gesprungen;
5)
XITVBL bringt den Computer wieder zum eigentlichen Programm zurück.
Zum
Vergleich hier noch einmal die Aktionen, wenn keine
Benutzer-Routine
vorhanden ist:
1)
die Interrupt-Routine des Computers wird ausgeführt;
2)
es wird zur in $224 und $225 stehenden Adresse gesprungen (in diesem Falle XITVBL);
3)
XITVBL bringt den Computer wieder zum eigentlichen
Programm
zurück.
Möchte
der Leser keine eigene Routine schreiben, so kann er sich einer schon Vorhandenen
bedienen. Ein BASIC-Editor gestattet die Erzeugung und ƒnderung von Ton-Daten, während
der Leser das Ergebnis prüft. Dieser Editor ist mit einem oben beschriebenen
Interrupt Sound-Generator kombiniert. Dieses Programm heiFt INSONIA (INterrupt
SOuNd
Initialiser/Alterer
= Initialisierer/ƒnderer für Interrupt-Sound) und wird vom ATARI™ auf der Diskette
ìUtility" angeboten.
TONERZEUGUNG
IN MASCHINENSPRACHE:
Durch die Benutzung von Maschinen-Sprache eröffnen sich zahlreiche Möglichkeiten
der Tonerzeugung. Der Benutzer kann nun z.B. versuchen, bestimmte Musikinstrumente
zu simulieren. Der Programmierer muF hierfür als erstes ein Programm schreiben,
das der 50-Hz-Interrupt-Routine entspricht und tafel-gesteuert ist. Die Ausgabe dieser
Routine sieht wie folgt aus:
Abbildung
10.12:
Beispiel
von 3 Noten, die
von
einer normalen Musik-Routine
gespielt
werden
Da
nun mehr Verarbeitungszeit zur Verfügung steht, können wir einen Schritt
weiter gehen und die Frequenz einer Note ändern, während sie gespielt wird.
Mit dem Computer ist es möglich, einen beim Anschlagen einer Klaviertaste entstehenden
Klang zu simulieren. Dieses geschieht, indem sehr schnell eine bestimmt Frequenztafel
gespielt wird, die z.B. folgendes Aussehen besitzt:
Abbildung
10.13:
Graphisch
dargestellte Tafel von Frequenzen,
die
dem Klang eines Klaviers nahekommen.
Die
obere Tafel ist eine ìModifikations-Tafel" und die in ihr enthaltenen
Daten sind eine ìKlavier-Modifikation". Um ein Klavier zu simulieren,
müFen die Originaltöne des Computers durch Addition der Klavier-Modifikation
geändert werden. Die Note wird also während ihres Ertönens leicht
verändert. Eine KlavierSimulation für die 3 Töne in Abbildung 10.12
würde wie folgt aussehen:
Abbildung
10.14:
Beispiel
der drei Noten aus Abbildung 10.12,
die
mit einer Klaviermodifikation gespielt werden
Das
Ergebnis ist grundsätzlich der gleiche Sound, der auch von einer normalen Musikroutine
erzeugt wird. Die Töne erhalten aber jetzt den Klang eines Klaviers anstelle
eines einfachen durchgehenden Klanges.
Unglücklicherweise
muF für jede Erzeugung dieses Klavierklanges sämtliche andere Verarbeitung
geopfert werden. Der Sound wird nicht mehr bei jeder Note erneuert, sondern ungefähr
100 mal innerhalb jeder einzelnen Note.
NUR
LAUTSTƒRKE: Es wurde
schon vorangehend mit den Nur-Lautsärecke-Bits von AUDC1-4 experimentiert, wodurch
ihnen eine groFe Leistungsfähigkeit zugeschrieben worden sind. Augenscheinlicherweise
sind sie aber nicht von groFem Nutzen. Dieses ist aber ein FehlschluF, der daher
rührt, daF BASIC nicht schnell genug für die effektive Benutzung dieser
Bits ist. Für Maschinen-Sprache trifft dieses aber nicht zu!
Wie
schon angesprochen, eröffnen diese Bists eine sehr gute Möglichkeit für
fein kontrollierbare Tonerzeugung. Es ist mit diesen Bits die Erzeugung wirklicher
Schwingungskurven (mit Rücksicht auf die Lautstärke-Außösung
des Computers) möglich. Anstatt einen Klavierklang zu erzeugen, kann dieser
nun regelrecht kopiert werden.
Ein
Nachteil des Computers hierbei ist, daF ein Instrument niemals absolut präzise
simuliert werden kann. 4 Bit (16 Werte) ist keine weitreichende Lautstärken-Außösung,
was jedoch nicht heiFen muF, daF ein Versuch von vornherein ausssichtslos ist. Das
folgende Programm benutzt die Nur-Lautstärke Bits. Wenn Sie ein Assembler-Modul
besitzen, geben Sie es bitte einmal ein starten Sie es:
0100
;
0110
; VONLY Bob Fraser 23.7.1981
0120
;
0130
;
0140
; Testroutine (Nur-Lautstärke) für AUDC1-4
0150
;
0160
;
0170
AUDCTL=$D208
0180
AUDF1=$D200
0190
AUDC1=$D201
0200
SKCTL=$D20F
0210
;
0220
;
0230
*=$B0
0240
TEMPO .BYTE 1
0250
MSC .BYTE 0
0260
;
0270
;
0280
*=$4000
0290
LDA #0
0300
STA AUDCTL
0310
LDA #3
0320
STA SKCTL
0330
LDX #0
0340
;
0350
LDA #0
0360
STA $D40E VBIs
1oeschen
0370
STA $D20E IRQs
1oeschen
0380
STA $D400 DMA
loeschen
0390
;
0400
;
0410
;
0420
L00 LDA DTAB,X
0430
STA MSC
0440
;
0450
LDA VTAB,X
0460
L0 LDY TEMPO
0470
STA AUDC1
0480
L1 DEY
0490
BNE L1
0500
;
0510
; Dekrementieren
0520
;
0530
DEC MSC
0540
BNE L0
0550
;
0560
; Neue Note
0570
;
0580
INX
0590
CPX NC
0600
BNE L00
0610
;
0620
; Noten-Zeiser einfuegen
0630
;
0640
LDX #0
0650
BEQ L00
0660
;
0670
;
0680
NC .BYTE
28 Noten-Zaehler
0690
;
0700
; Tabelle der zu spielenden Toene
0710
;
0720
VTAB
0730
.BYTE 24,25,26,27,28,29,30,31
0740
.BYTE 30,29,28,27,26,25,24
0750
.BYTE 23,22,21,20,19,l8,17
0760
.BYTE 18,19,20,21,22,23
0770
;
0780
; Diese Tabelle enthält die jeweils zugehörige Dauer
0790
;
0800
DTAB
0810
.BYTE 1,1,1,2,2,2,3,6
0820
.BYTE 3,2,2,2,1,1,1
0830
.BYTE 1,1,2,2,2,3,6
0840
.BYTE 3,2,2,2,1,1
‹berraschenderweise
ist die Geschwindigkeit hier nicht das Problem. Die Kurve besteht aus fast 50 Stufen
und könnte sogar in einer noch höheren Geschwindigkeit gespielt werden
(ungefähr 10 kHz).
Entfernen
Sie bitte die Zeilen 360 und 370 und starten Sie das Programm erneut. Das Ergebnis
ist ein sehr ungleichmässiger Ton. Der Grund hierfür ist der 50-Hz-Interrupt,
der im vorangegangenen Abschnitt besprochen wurde. Man kann den genauen Zeitpunkt
des Interrupts durch Zuhören feststellen, da während der fraglichen Zeit
sämtliche Tonerzeugung gestoppt wird.
Die
Zeile 380 schaltet den Bildschirm-DMA aus. Daher erhält der Bildschirm eine
feste Hintergrundfarbe, sobald das Programm ausgeführt wird. Dieses Ausschalten
dient zwei Zweckenz: zum einen wird die Ausführungsgeschwindigkeit erhöht
und zum anderen bleibt das Timing konstant, da der DMA in unregelmäFigen Zeitabständen
Maschinenzyklen ìstiehlt". Siehe Kapitel 5 für weitere Information
zum DMA.
In
diesem speziellen Fall ist der erzeugte Ton eine Sinuskurve. Die Schwingung ist gleichmäFig
und hört sich tatsächlich nach einer Sinuskurve an. Werden die Daten in
einen Graphen übertagen, ergibt sich folgendes Bild:
15-
-----
14-
--- ---
13-
--
--
12-
--
--
11-
--
--
10-
-
-
9-
-
-
8---------------------------------------------------------
7-
-
-
6-
- -
5-
--
--
4-
--
--
3-
--
--
2-
--- ---
1-
-----
Abbildung
10.15:
Daten
der Sinuskurve des vorangegangenen Programms
Mit
den Sound-Möglichkeiten des ATARI Computers kann der
Programmierer
viel erreichen. Die Frage ist ìWarum Sound?".
Die
Produzenten von Filmen wissen seit langem von der Wichtigkeit der Hintergrundmusik.
Das fantastische Weltraumabenteuer von George Lucas ist hierfür das beste Beispiel.
Betritt der Schwarze Lord den Raum, wird dieses durch die Hintergrundmusik entsprechend
begleitet, so daF ein Gefühl von Furcht und HaF beim Zuschauer erzeugt wird.
Gleiches gilt für das Auftreten des Helden, wenn er die Prinzessin befreit.
Die Musik erzeugt ein Gefühl der Freude, In Horror-Filmen ist die Musik eines
der wichtigsten Mittel, um dem Zuschauer Furcht einzußöFen. Selbst an
Stellen, an denen nichts gefährliches geschieht, kann durch die Hintergrundmusik
beim Betrachter Angst erzeugt werden.
Das
SPACE INVADERS™-Programm hat als Eigenheit ein Pulsgeräusch, das schneller und
lauter wird, je weniger Angreifer vorhanden sind. Dieses löst beim Spieler eine
gewisse Anspannung aus. Wann ein Zylon bei STAR RAIDERS™ ein Photonen-Torpedo abfeuert,
reiFt der Benutzer den Steuerknüppel herum, um diesem Schuß auszuweichen.
Impressionistische
Geräusche und Töne beeinßlussen unseren Gemütszustand. Dieses
ist möglich, da Töne immer unsere Ohren erreichen, auch wenn wir nicht
hinhören. Sound eröffnet dem Programmierer daher die Möglichkeit,
direkt das Gemüt des Benutzers zu erreichen.
Selbst
ein langweiliges Spiel kann durch Einfügen von speziellen Ton- und Geräuscheffekten
interessant gemacht werden. Dieses kann für ein Spiel oder Programm sehr vorteilhaft
sein, auch wenn solche Effekte einigermaFen schwer zu entwickeln sind.