----------------------------------------------------

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.