Mit Pauken und Trompeten: DMA-Sound-Programmierung bei STE und TT

Man nehme: einen STE, Mega STE oder TT, ein Sample und einen Verstärker. Bringe alles zusammen, und schon hat man den tollsten Sound. Hier erfahren Sie, wie Sie in Ihrem neuen Atari-Computer Pauken and Trompeten wecken.

Es gab schon die wildesten Gerüchte über die musikalischen Fähigkeiten von STE & Co. Um es mal richtigzustellen: Neben dem herkömmlichen Soundchip AY-3-8910 der STs besitzen die neuen Computer zwei D/A-Wandler, mit denen sie digitalisierte Klänge bei einer Auflösung von 8 Bit in Mono oder Stereo spielen. Monosamples benutzen beide Kanäle. Zum digitalen Klang dürfen Sie auch die Töne des alten Soundchips mischen. Alles zusammen steht dann an den Audio-Cinchbuchsen zur Weiterverarbeitung bereit und gelangt außerdem -wenn auch nur Mono - zum Monitorlautsprecher. Der Pegel an den Cinchbuchsen läßt den direkten Anschluß an die heimische Stereoanlage (etwa am AUX-Eingang) zu. Sowohl in Mono als auch in Stereo sind die Wiedergabefrequenzen 6,25, 12,5, 25 und 50 kHz erlaubt. Bei Stereosamples fallen somit bis zu 100000 Bytes pro Sekunde an, da Stereo werte je ein Byte für links und rechts benötigen. Dank des DMA-Verfahrens (Direct Memory Access) verschwendet der Prozessor keine Rechenzeit bei der Verarbeitung dieser gewaltigen Datenmengen. Auf gut Deutsch bedeutet das: Der Computer liest Sampledaten nur aus dem Speicher, wenn der Prozessor Internes erledigt. Durch die geschickte Auslegung der Hardware lassen sich Samples nahtlos hintereinander spielen, auch wenn diese wahllos im Speicher verteilt sind. Schließlich spendierte Atari noch einen Klangregler. Mit ihm beeinflussen Sie die Höhen und Tiefen sowie die Lautstärke. Letztere sogar für jeden Kanal einzeln, etwa als Balanceregler.

A/D-Wandler

Um eigene Samples aufzunehmen, bedarf es eines A/D-Wandlers. Doch alle für den Atari erhältlichen Sampler haben eines gemeinsam: ein anderes Datenformat als der DMA-Sound.

Sampler haben ihre Nullinie bei einem Bytewert von 128 und folglich ihr Minimum beziehungsweise Maximum bei 0 beziehungsweise 255. Die neue Klanghardware behandelt die Bytes hingegen als vorzeichenbehaftete Werte, das heißt der Wertebereich geht von -128 über 0 bis +127. Zur Konvertierung invertiert man lediglich das höchstwertige Bit jedes Bytes. Der Assembler-Befehl

EORI.L #80808080, (A0)

übernimmt diese Arbeit gleich für vier Byte. Apropos Format: Bei Stereosamples ist der Wert für den linken Kanal immer im höherwertigen Byte, hat also die geraden Speicheradressen. Ein Stereosample läßt sich deshalb einfach aus zwei Monosamples zusammensetzen, indem Sie die beiden Monosamples abwechselnd ineinander verzahnen.

Die neuen Register

Die gewünschte Samplefrequenz und Kanalzahl legt die Adresse $FF8921 (Sound-Modus-Register) fest. Die Bits 0 und 1 bestimmen die Samplerate: 0=6,25 kHz, 1=12,5 kHz, 2=25 kHz, 3=50 kHz.

Bei gesetztem Bit 7 ist Mono angesagt sonst Stereo. Die DMA-Soundhardware weiß jetzt, wie sie spielen soll, allerdings nicht, wo sich das betreffende Stück befindet. Die Start- und Endadresse sind jeweils nur drei Byte lang, da der 68000er sowieso nicht mehr als 16 MByte verwalten kann. Außerdem muß in beiden Adressen das unterste Bit 0 sein. Daraus resultiert eine Samplelänge, die ein Vielfaches von 2 ist. Diese Restriktion gilt für Mono- und Stereosamples gleichermaßen. Zwischen den Speicherstellen, die das Low-/Mid- beziehungsweise Highbyte der Adressen aufnehmen, ist jeweils ein Abstand von einem Byte erforderlich (Tabelle 1). Normalerweise kein Problem in Assembler, denn der Befehl »MOVEP« schreibt ein Wort oder Langwort genau so in den Speicher. Der Haken ist, daß ein Wort zu kurz ist und ein Langwort schon in das nächste Register mit hineinschreibt.

Den gleichen Aufbau hat der Sounddatenzähler, der nur gelesen werden darf. Das Ergebnis ist die Adresse, die der DMA-Sound gerade bearbeitet. Bei genauerer Betrachtung der Register fällt auf, daß kein Platz mehr für ein viertes Byte bei den Adressen ist. Das stört nicht nur für MOVEP, sondern vielleicht auch in Hinblick auf den Atari TT, dessen 68030-Prozessor einen 32 Bit Adreßraum verwalten kann. Ataris Entwickler teilten aber den Speicher des TT in ST-RAM und Fast-RAM. Nur das Fast-RAM liegt so im Speicher, daß es die Bits 24 bis 31 der Adressen anspricht. Das Fast-RAM heißt aber Fast-RAM, weil hier der Prozessor König ist. Die DMA-Soundhardware darf nur auf das ST-RAM zugreifen. Drei Byte sind also genug.

Endlich können wir im Sound-Control-Register die Musik anknipsen. Einfach Bit 0 setzen und schon geht's los. Bit 1 aktiviert die Endloswiedergabe. Achten Sie darauf, daß Anfang und Ende auf einem Nulldurchgang liegen, um ein Knacksen zu vermeiden. Löschen Sie Bit 0, herrscht wieder Ruhe und Frieden.

Klangregler

Besonders bei niedrigen Samplefrequenzen läßt der Klang zu wünschen übrig. Lindernd wirken hier Filter. Besonders beliebt ist der Tiefpaß, der das hochfrequente, physikalisch bedingte Surren und Klirren dämpft. Aber auch an einen Hochpaß (senkt die Bässe) und Lautstärkeregler wurde in Ataris Bastelbude gedacht (Tabelle 2). Dabei ist auch noch alles in Schritten von 2 dB regelbar. Zudem passen sich die Filter automatisch der gewählten Samplefrequenz an. Die Einstellung erfolgt über das neu geschaffene Microwire-Interface (MWI), das aber nur die Brücke zwischen dem Prozessor und der eigentlichen Klangregler-Hardware darstellt. Theoretisch lassen sich mit dem MWI noch weitere digitale Helfer ansteuern, nur gibt es die noch nicht.

Da sie aber vorgesehen sind, benötigt das MWI die Kennummer der gewünschten Peripherie. Diese ist nur zwei Bit lang und hat den Wert 2 für den Klangregler, der noch über sechs interne Register verfügt. Zur Adressierung der Register fallen folglich drei weitere Bits an. Daneben werden immer sechs Datenbits übertragen. Macht zusammen elf Bit, die wir dem MWI anvertrauen. In den niederwertigsten sechs Bit stehen die Daten. Die drei nächsten sind für die Registerauswahl verantwortlich. Die letzten beiden enthalten schließlich die Kennummer.

Diesen Bitwust packen wir in das Daten register des MWI. Zuvor setzen wir im Masken register diejenigen Bit, die wir im Datenregister nutzen. Dabei ist es ohne Belang, welche Bits wir verwenden, solange es in beiden Registern die gleichen sind. Wir nehmen die untersten, folglich kommt der Wert &0000 0111 1111 1111= $7FF in das Maskenregister. Anschließend dürfen wir unser eigentliches Anliegen im Datenregister vortragen.

Nun ist so ein MWI nicht gerade flink, da es die Daten seriell überträgt. Während der Bitschieberei (ca. 16 Microsekunden lang) sollten wir das MWI daher in Ruhe lassen.

Wer nicht zu lange warten möchte, kann das Maskenregister im Auge behalten. Während der Übertragung steht dort nämlich alles mögliche - nur nicht $7FR Alle Register lassen sich nur im Supervisor-Modus ansprechen.

Tabelle 1. Alles übersichtlich auf einen Blick: die neuen Adressen der DMA-Sound-Hardware
Tabelle 2. Das Microwire-Interface als Mixer und Equalizer

Samplesequenzer

Wenn wir mehrere unabhängige Samples nahtlos nacheinander ab-spielen wollen (Sequenzerbetrieb), kommt uns die Pufferung der Sounddatenregister zugute. Ändern wir die Start- oder Endadresse während der Computer ein Sample spielt, passiert zunächst nichts. Erst am Ende des Samples übernimmt er die neuen Adressen. Der Sequenzerbetrieb ist jetzt kein Problem. Nach dem Start des ersten Samples im Endlosmodus übergeben wir die Adressen des zweiten Samples, und so weiter.

Prima Plan, nur wer sagt uns, wann ein Stück zu Ende ist? Den Sounddatenzähler zu kontrollieren, ist hervorragend umständlich. Deshalb liefert der DMA-Sound jedesmal ein Signal, wenn ein Sample fertig ist. Dieses gelangt an den Ereigniszählereingang des Timer A im MFP und außerdem an die Portleitung 7 des MFP. Allerdings hängt an dieser Leitung noch das »Monochrom-Detect«-Signal. Damit wir durch diesen Interrupt jederzeit - unabhängig vom Monitor - ein Soundende erkennen, werden beide Informationen Exklusiv/ Oder verknüpft. Übrigens hat die Sequenzersteuerung via Timer A-Interrupt den Vorteil, daß der Interrupt nicht unbedingt nach dem ersten Durchlauf eines Samples ausgelöst werden muß. Die Anzahl ist im Timer A-Date-Register zwischen 1 und 256 einstellbar.

Leider ist es nicht immer möglich, den Weg des Interrupts zu gehen. Um trotzdem das Ende eines Samples nicht zu verpassen, läßt sich auch einfach das Datenregister des Timer A überwachen, wenn dieser mal wieder Ereignisse zählt. Diesen Weg geht auch der Mini-Sequenzer des Listings auf der TOS-Diskette.

Damit sind alle Grundfunktionen erklärt, aber der DMA-Sound hat, besonders im Zusammenspiel mit dem Klangregler, noch einiges zu bieten. Wie wäre es mit einer Kanalkontrolle? Sie spielen ein Stereostück, aber nur der rechte oder linke Kanal ist zu hören. Vieles ist machbar. (ah)


Arne Österheld
Aus: TOS 09 / 1991, Seite 27

Links

Copyright-Bestimmungen: siehe Über diese Seite