Assembler-Ecke #12 -------------------- von Tim-Philipp Müller Hallo und herzlich Willkommen! Heute soll sich alles um die Sound- Programmierung dreheh, wofür sich übrigens der POKEY-Chip im XL/XE verantwortlich zeigt. Wer in sein Programm Sounds einbinden will, hat drei Möglichkeiten dies zu bewerkstelligen: - Programmierung über den Pokey - Erstellung von Sound über Musik-Editoren - Digi-Sounds ------------- Digi-Sounds ------------- Das Problem bei Digi's ist, daß zum Abspielen eine Menge Rechenzeit nötig ist (oft muß man Bildschirm und Interrupts abschalten). Für längere Stücke, die im Hintergrund als Begleitmelodie ertönen soll, ist Digi- Music also ungeeignet (für den Otto- Normal-Programmiere). Sehr schöne geeignet ist sie hingegen für allerlei kurze Effekte (z.B. ein Stöhnen beim Zusammenbrechen des Karatefighters), und besonders für Drum-Stücke. Das Abspielen dieser Sounds erfolgt über die s.g. Volume-Only-Funktion eines Kanals. Dabei kann das Membran des Lautsprechers direkt in 16 Stellungen ausgelenkt werden. Daraus erklärt sich auch der Aufbau von Digi- Files: In 1 Byte werden immer 2 Auslenkungswerte gepackt (2x 4 Bits). Nötige Register: SKCTL,AUDCTL,AUDC1 (Beschreibung unter 'POKEY-Sounds') ----------- Editor-Sounds ------------- Immer sehr gut geeignet für längere Musikstücke, die zudem noch problemlos im Hintergrund laufen. Außerdem sind mit den oben genannten Editoren Musikstücke sehr einfach zu programmieren und stellen auch noch zahlreiche Extras wie Glissando, Hüll- Kurven etc. zur Verfügung. Brauchbare Assembler-Routinen zum Einbinden eigener Musikstücke sind eigentlich überall vorhanden, nur MASIC liefert ledeglich eine halbfertige BASIC-Routine. Deshalb eine eigene Routine zum Spielen von MASIC-Sounds in Assembler anbei: File MASIC.ASM: Routine MLOAD: Lädt compiliertes MASIC- File in Speicher. File- Name in und MPLAY: Spielt/Stoppt Musik(VBI) MPAUSE: Pause ein/aus START: Demo (lädt BOOGIE.OBJ) Soundeditoren: MASIC, Black Magic Composer, Benji-Soft Composer, The Soundmachine, Softsynth (PD). ----------- Sounds aus dem Pokey ------ Über die POKEY-Regs kreiert man entweder kurze Effekte oder auch Musiken, obwohl dies natürlich aufwendiger als mit Sound-Editoren ist. Zuerst einmal muß der Pokey-Chip initialisiert werden. Dies geschieht so LDA #3 STA SKCTL LDA #0 STA AUDCTL Hier alle Register, die man für die Tonerzeugung so braucht: AUDF1 $D200 AUDC1 $D201 AUDF2 $D202 AUDC2 $D203 AUDF3 $D204 AUDC3 $D205 AUDF4 $D206 AUDC4 $D207 AUDCTL $D208 SKCTL $D20F Man hat also 4 Kanäle zur Verfügung, die jeweils alle einzeln in Lautstärke, Frequenz und Verzerrung gesteuert werden können. Zunächst hat man jedoch erstmal die Taktfrequenz des Kanals vor Augen. Diese beträgt 64 kHz -wenn über AUDCTL nichts anderes eingestellt wurde. In AUDF1-4 kann man den Frequenzwert für den jeweiligen Kanal eintragen, wobei 256 Abstufungen möglich sind. Teilt man die Basisfrequenz durch diesen Frequenzwert+1 (der Pokey addiert automatisch 1, da man nicht durch 0 teilen kann) erhält man die Ausgangsfrequenz. Basisfrequenz Also: Ausgangsfrequenz= --------------- Frequenzwert Die Lautstärke des Tons schreibt man in die Bits 0-3 von AUDC1-3 (je nach Kanal), die 0 bis 15 betragen kann. Die Verzerrung schreibt man in die Bits 5-7 des gleichen Registers. Die Gesamtlautstärke aller Kanäle sollte nicht größer als 32 sein, da die Töne sonst verzerrt klingen können. Über Bit 4 kann man die s.g. Volume- Only- Funktion einschalten, d.h. der Membran wird in 16 Stellungen direkt ausgelenkt (diese muß man in die Bits 0-3 schreiben). *********** Register im Überblick: **** AUDF1-4 $D200,$D202,$D204,$D206 Frequenzwert von Kanal 1-4 --------------------------------------- AUDC1-4 $D201,$D203,$D205,$D207 Control-Register von Kanal 1-4: Bit 0-3: Lautstärke Bit 4: Volume-only ein/aus Bit 5-7: Verzerrung: B7 B6 B5 Verzerrung durch 1 1 1 4-Bit-Polyzähler 1 0 1 reine Rechteckskurve 1 0 0 17-Bit-Polyzähler 0 1 0 5-Bit und 4-Bit-Zähler 0 0 1 5-Bit-Polyzähler 0 0 0 5-Bit und 17-Bit-Zähler Was ein Polyzähler ist, möchte ich hier nicht besprechen. Grundsätzlich gilt jedoch: Je mehr Bits er hat, desto verzerrter klingt er. --------------------------------------- AUDCTL $D208 Audio-Control-Register B0=1: Taktfrequenz von 64kHz auf 15Khz B1=1: Kanal 2 gibt nur noch die Töne aus, die höher als die von Kanal vier liegen (Höhenfilter). B2=1: Höhenfilter Kanal 1 durch Kanal 3 B3=1: Kanäle 3+4 werden als 16-Bit Register verwendet, d.h. es kann in 65536 Werten abgestuft werden. B4=1: Kanäle 1+2 als 16-Bit-Register B5=1: Kanal 3 wird mit 1.79MHz getaktet B6=1: Kanal 1 wird mit 1.79MHz getaktet B7=1: 9-Bit-Polyzähler statt 17-Bit --------------------------------------- SKCTL $D20F Durch Einschreiben von 3 wird der Pokey initialisiert. --------------------------------------- So,das war's auch schon wieder. Anbei diesmal ein Beispiel für die Pokey- Register: SOUND.ASM Nach Assemblieren mit RUN START starten Cioa!