home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Computer Club Elmshorn Atari PD
/
CCE_PD.iso
/
pc
/
0600
/
CCE_0616.ZIP
/
CCE_0616.PD
/
AUDIOFUN
/
AUDIOFUN.TXT
< prev
next >
Wrap
Text File
|
1993-05-30
|
31KB
|
1,082 lines
AUDIOFUN V1.0
1. ALLGEMEINES
--------------
Mit dem Programm AUDIOFUN können Sie den Soundchip (PSG)
programmieren. Interessant ist es vor allem für Leute, die
Spiele programmieren, für diese aber keine digitalisierten
Soundeffekte benutzen wollen oder können - z.B. wegen Verbrauch
von Speicherplatz und/oder Rechenzeit. Der PSG ist aber leider
trotz vorhandenen Hüllkurvengenerator keine Ohrenweide.
Dieses Manko soll dieses Programm zumindest zum Teil
beseitigen. Für jeden der drei Kanäle ist nun eine eigene (und
echte!) ADSR-Hüllkurve sowie diverse Effekte verfügbar. Jeder
Kanal ist unabhängig und kann beliebig gestartet oder gestoppt
werden. Es ist allerdings nicht möglich, ellenlanges Gedudel zu
erzeugen. Vielmehr kann zu Situationen (Ball berührt Bande,
Game over etc.) ein entsprechender akustischer Kommentar
gegeben werden.
1.1. Hardware
Entwickelt habe ich dieses Programm auf einem 1040 STE mit
Farbmonitor. Da es aber vollständig in GEM eingebunden ist,
sollte es mit sämtlichen Auflösungen ab 320x200 zurechtkommen,
egal ob bunt oder monochrom.
Mit dem Rechnermodell sollte es eigentlich ebenso sein.
Voraussetzung ist, daß sowohl der TIMER_A und natürlich der PSG
vorhanden sind.
Der Speicherbedarf von AUDIOFUN ist gering und läuft daher
auch auf kleinsten Modellen.
1.2. Public Domain
AUDIOFUN ist öffentliches Gut! Das bedeutet für Sie, daß Sie
dieses Programm kostenlos benutzen, kopieren und verschenken
können und sollen. Wird dieses Programm verkauft, so darf sich
der Preis nur aus dem Kopieraufwand, Porto und Verpackung
zusammensetzen!
Trotz sorgfältiger Programmierung sind natürlich Bugs nie
auszuschließen. Sollten also wider erwarten Fehlfunktionen
auftreten, bin ich für eine kurze schriftliche Mitteilung
dankbar. Aber auch wenn Ihnen dieses Programm nur gefällt oder
Sie einen Verbesserungsvorschlag haben, dürfen (und sollten)
Sie mir eine (Ansichts-) Karte schicken! Meine Adresse lautet:
Harald Förster
Tünkenhagen 1
23552 Lübeck
- 1 -
AUDIOFUN V1.0
1.3. Zwei in Einem
Dieses Programm besteht eigentlich aus zwei Programmen. Zu
einem ist da natürlich AUDIOFUN, welches mit Sozobon C
geschrieben wurde. Hiermit können Sie Ihre Sounddaten eingeben,
testen und bei Bedarf ändern usw. Die fertige Datei wird dann
auf Massenspeicher gesichert.
Das zweite Programm ist der SOUNDWORKER, der
Ausführgeschwindigkeit zuliebe mit TurboAss entwickelt. Dieses
Programm ist in der von Ihnen gesicherten Datei enthalten und
kann nun zu Ihrem Programm geladen werden, wobei es keine Rolle
spielt, welche Programmiersprache Sie verwenden. Der
SOUNDWORKER wird alle 20ms gestartet (Interrupt), berechnet die
Sounddaten und schreibt sie in den PSG.
Da beide Programme also unterschiedliche Aufgaben haben,
wird die Beschreibung getrennt erfolgen: erst AUDIOFUN, damit
Sie wissen, wie Sie Klänge einstellen und danach SOUNDWORKER,
damit Sie diese Klänge auch ins eigene Programm bekommen.
2. AUDIOFUN
-----------
Nach starten des Programms sollten Sie am oberen
Bildschirmrand eine Menüzeile sehen.
2.1. Audiofun
Wie beim Desktop Zugriff auf die Info-Box und den
Accessories.
2.2. File
Ebenfalls kaum ein Unterschied zu anderen GEM-Programmen,
trotzdem einige Erläuterungen.
2.2.1. New
Es wird eine im Speicher stehende Datei kommplett gelöscht.
Sollte diese noch ungesichert sein, erscheint vorher eine
Warnung. Diese Funktion ist nur möglich, wenn es etwas zu
löschen gibt!
- 2 -
AUDIOFUN V1.0
2.2.2. Load...
Eine vorher gesicherte Datei kann wieder geladen werden. Als
Extension habe ich "FUN" gewählt, kann von Ihnen aber geändert
werden.
2.2.3. Save
Eine Datei wird gesichert. Diese Funktion ist erst möglich,
wenn ein gültiger Dateiname existiert, also nach Load oder Save
as.
2.2.4. Save as...
Wie bei Save wird eine Datei gesichert, nur können Sie hier
ein anderes Laufwerk auswählen und der Datei einen Namen geben.
Diese Funktion ist erst möglich, wenn es etwas zu sichern gibt!
Wählen Sie eine schon vorhandene Datei, die nichts mit
AUDIOFUN zu tun hat (z.B. DESKTOP.INF), erscheint eine
Fehlermeldung.
2.2.5. Save DR
Diese Funktion ist für Sie interessant, wenn Ihr Compiler
das Linkformat von Digital Research versteht. Es wird ein
Objekt-File gesichert, daß Sie direkt zu Ihrem Programm linken
können.
Eine so gesicherte Datei kann nicht mehr geladen werden!
2.2.6. Quit
Das Programm wird verlassen. Eine Rückfrage gibt es nicht,
wohl aber eine Warnung im Falle einer ungesicherten Datei.
2.3. Edit
Unter diesem Titel befinden sich alle Einträge, die etwas
mit dem PSG zu tun haben. Tatsächlich dienen sie aber nur zum
öffnen der entsprechenden Fenster. Pro Eintrag kann nur ein
Fenster geöffnet werden. Jedes kann getoppt, verschoben und
geschlossen werden.
Die Einstellungen selbst werden immer im obersten Fenster
vorgenommen. Um etwas zu ändern, bewegt Sie den Mauscursor auf
einen der Pfeile und betätigen die linke Maustaste. Je nach
Richtung des Pfeils wird nun der Wert erhöht bzw. erniedrigt.
Bei Zahlen mit mehr als zwei Stellen kann auch die rechte Taste
- 3 -
AUDIOFUN V1.0
benutzt werden, wobei statt 1 dann 10 addiert oder subtrahiert
werden.
Bei der Erklärung der einzelnen Parameter werde ich die
möglichen Werte in eckigen Klammern angeben. Es bedeutet dann
also [1...999], daß sämtliche Einstellungen von 1 bis 999
möglich sind.
2.3.1. Frequency
Dieses Fenster ist nach Programmstart schon geöffnet und
eben für die Frequenzen zuständig.
2.3.1.1. Channel [A...C]
Einer der drei Kanäle A, B oder C kann gewählt werden.
2.3.1.2. Part [1...8]
Zu jedem Kanal gehören acht Parts mit eigenen Frequenzen,
Hüllkurven und Effekten, wobei natürlich pro Kanal nur ein Part
zur Zeit gespielt werden kann. Sie können also bis zu 24 Klänge
bzw. kurze Melodien eingeben.
2.3.1.3. Tempo [1...2000]
Dieser Wert bestimmt die Zeitdauer eines Taktes. Jede
Einheit einer Zeitangabe hat immer die Länge von 20ms.
Wenn bei Tempo z.B. einen Wert von 50 steht, hat ein Takt
die Länge von 50*20ms, also einer Sekunde.
2.3.1.4. Test
Der eingestellte Kanal wird gestartet und der Part gespielt.
Wenn Sie den Test vorzeitig abbrechen wollen, so verlassen Sie
mit dem Mauspfeil das Testfeld.
2.3.1.5. Sound [0 - 30...4095]
Jeder Part ist maximal 16 Takte lang (Time 0 bis Time F).
Ein Takt kann die Einträge 30 (höchster Ton) bis 4095 (tiefster
Ton) annehmen.
Die 0 hat hierbei eine besondere Bedeutung. Einerseits wird
überhaupt kein Ton gespielt. Zum anderen kann man erreichen,
daß ein Ton mehrere Takte lang ist. Wenn Sie zum Beispiel 100,
200, 0, 0, 100 eingeben, hat der erste Ton die Länge von Tempo,
- 4 -
AUDIOFUN V1.0
der zweite dagegen die dreifache. Geben Sie nun 0, 200, 0, 0,
100 ein, so ist der Unterschied zum vorigen Beispiel der, daß
im ersten Takt kein Ton zu hören ist.
2.3.1.6. Noise [0...32]
Im Prinzip genau das gleiche wie bei Sound. Der Wert 32
entspricht hier dem physikalischen Wert 0 des PSG (höchstes
Rauschen).
Einen wichtigen Unterschied gibt es aber doch: da der PSG
nur einen Rauschgenerator besitzt, habe ich diesen fest an
Kanal A gebunden. Mit anderen Worten: Rauschen ist auf den
Kanälen B und C nicht möglich!
Deshalb können Sie die Noise-Werte auch nur verändern, wenn
der Kanal A eingestellt ist.
2.3.1.7. Hinweise zu Frequency
Überlegen Sie, welche Klänge kein Rauschen benötigen. Diese
legen Sie vorrangig auf die Kanäle B und C.
Da bis zu drei Geräusche gleichzeitig erklingen können,
verteilen Sie diese, die tatsächlich gleichzeitg oder zeitlich
kurz aufeinander vorkommen können, auf A, B und C.
Die Ereignisse, die nie gleichzeitig auftreten können (z.B.
Spielstart, neues Level und Game over) gehören alle auf einen
Kanal (etwa Part 1 bis 3 auf C).
2.3.2. Envelope
Mit einer Hüllkurve wird der Lautstärkeverlauf eines Tones
festgelegt. Aufgrund der wenigen Hüllkurven des PSG habe ich
per Software eine komplette und relativ frei programmierbare
ADSR-Hüllkurve realisiert. Im Gegensatz zum PSG hat nun jeder
Kanal seinen eigenen Generator, wodurch alle Kanäle vollkommen
unabhängig voneinander werden.
2.3.2.1. Rand
Dieses Feld ist fast identisch mit dem Testfeld. Im
Unterschied dazu werden aber nicht die programmierten, sondern
zufällige Frequenzen gespielt. Rauschen und alle anderen
Parameter bleiben unverändert.
- 5 -
AUDIOFUN V1.0
2.3.2.2. Attack
Der Beginn einer Hüllkurve ist immer Attack. Dabei bewegt
sich die Lautstärke von 0 auf Maximum. Je nachdem, ob dieser
Anstieg schnell oder langsam abläuft, kann man z.B Zupf- von
Streichinstrumenten unterscheiden.
2.3.2.2.1. Attack [1...999]
Die Zeit, nach der die maximale Lautstärke erreicht werden
soll.
2.3.2.2.2. Volume [1...15]
Die Lautstärke, die nach Beendigung von Attack erreicht
werden soll.
2.3.2.3. Decay
Wenn Sie eine Klaviertaste drücken und diese gedrückt
halten, wird der Ton recht schnell die größte Lautstärke
erreichen (Attack), um anschließend langsam abzuklingen.
Hierfür ist Decay zuständig.
2.3.2.3.1. Decay [0...999]
Länge der Decay-Phase. Ist dieser Wert 0, wird kein Decay
ausgeführt.
2.3.2.3.2. Volume [0...15]
Lautstärke, die nach Ablauf von Decay erreicht werden soll.
Beachten Sie, daß im Gegensatz zu natürlichen Instrumenten hier
die Decay-Lautstärke auch größer oder gleich der von Attack
sein kann.
Ist die Decay-Dauer 0, wird die Lautstärke nicht beachtet.
2.3.2.4. Sustain
Drücken Sie statt einer Klavier- eine Orgeltaste, ergibt
sich ein anderer Lautstärkeverlauf. Nach erreichen der
maximalen Lautstärke bleibt diese nun nun solange konstant, bis
die Taste losgelassen wird.
- 6 -
AUDIOFUN V1.0
2.3.2.4.1. Sustain [0...999]
Angabe, wie lange die Lautstärke von Attack oder Decay
gehalten werden soll. Ist dieser Wert 0, wird Sustain nicht
ausgeführt.
2.3.2.5. Release
Noch einmal zum Klavier. Wenn Sie diesmal eine Taste
drücken, diese aber nach einer kurzen Zeit wieder loslassen,
ergibt sich folgender Hüllkurvenverlauf: Nach Attack beginnt
die Decay-Phase, wird aber mit dem loslassen der Taste durch
Release ersetzt. Die Folge ist, daß der Ton nicht mehr langsam,
sondern recht schnell ausklingt.
2.3.2.5.1. Release [0...999]
Dauer, bis die Attack- oder Decaylautstärke 0 erreicht. Ist
der Wert von Release 0, wird diese Funktion nicht ausgeführt.
2.3.2.6. Hinweise zu Envelope
Wie Sie gesehen haben, lassen sich Hüllkurventeile auch
ausblenden. Dadurch muß nicht eine komplette ADSR-Hüllkurve
programmiert werden, möglich sind außerdem: A, AD, AS, AR, ADS
sowie ADR.
Ist die Gesamtdauer der Hüllkurve (also A+D+S+R) länger als
ein Takt, so gehen die Töne ineinander über. Ist dagegen der
Takt länger, klingt das ganze abgehackt (staccato).
Wenn ein Ton mehrere Takte hörbar sein soll, muß die
Gesamtdauer der Hüllkurve ein vielfaches von Tempo sein.
Beim letzten Ton hängt die Taktlänge nicht mehr von Tempo,
sondern von der Hüllkurve ab.
2.3.3. Effects
Auch mit einer ADSR-Hüllkurve klingt der Sound vom PSG immer
noch recht langweilig. Um diesen lebendiger und
abwechslungsreicher zu gestalten, stehen Ihnen hier noch einige
Effekte zur Verfügung.
2.3.3.1. Tremolo
Die Hüllkurve wird amplitudenmoduliert, d.h. der Ton wird
abwechselnd lauter und leiser.
- 7 -
AUDIOFUN V1.0
2.3.3.1.1. Speed [1...15]
Dieser Wert bestimmt die Geschwindikeit des
Lautstärkewechsels, wobei die Werte 8 bis 14 aber identisch
sind.
2.3.3.1.2. Delay [1...2000]
Mit dieser Zeitangabe können Sie den Einsatz des Effektes
verzögern. Die Angabe muß aber kleiner als Tempo sein, da sonst
der Effekt nicht ausgeführt wird. Wenn sich der Ton und der
Effekt über mehrere Takte erstreckt, wird die Verzögerung nur
im ersten Takt beachtet.
2.3.3.1.3. FEDCBA9876543210
Die Effekte können Sie für jeden Takt freigeben (1) oder
sperren (0). Diese Zeile gibt die Taktnummern an, in der Zeile
darunter befinden sich die dazugehörigen Schalter. Bewegen Sie
den Mauspfeil auf die entsprechende Ziffer und betätigen die
linke Taste. Aus einer 0 wird dann eine 1 und umgekehrt.
2.3.3.2. Sound Vibtrato
Der Ton wird frequenzmoduliert. Hierbei pendelt die Tonhöhe
periodisch um die Grunfrequenz.
2.3.3.2.1. Add [1...4095]
Dieser Betrag wird in jedem Interrupt zur Frequenz addiert.
2.3.3.2.2. Count [1...2000]
Ein Zähler, der die Vibratofrequenz bestimmt. Je größer
dieser Wert ist, desto geringer die Frequenz.
Add und Count stehen in einem engen Zusammenhang. Add=100
und Count=1 ergeben den gleichen Frequenzhub wie Add=25 und
Count=4, nur die Vibratofrequenz ist unterschiedlich.
2.3.3.3. Noise Vibrato
Vibrato für den Rauschgenerator. Veränderungen sind nur
möglich, wenn Kanal A eingestellt ist.
- 8 -
AUDIOFUN V1.0
2.3.3.3.1. Add [1...31]
Gleiche Bedeutung wie bei Sound Vibrato.
2.3.3.3.2. Count [1...2000]
Da der Rauschgenerator im PSG nur 5 bit schmal ist, bestimmt
dieser Eintrag nicht wie bei Sound Vibrato zusammen mit Add den
Hub. In diesem Fall wird nur die Rauschfrequenz für die
angegebene Zeit gehalten.
2.3.3.4. Sound Pitch Bend
Während beim Vibrato die Frequenz um den Grundton schwankt,
biegt dieser Effekt den Ton in nur eine Richtung.
2.3.3.4.1. Add [1...4095]
Bestimmt, wieviel in jedem Interrupt zur Frequenz addiert
wird. Angaben bis 2047 ziehen den Ton nach unten, die darüber
nach oben.
2.3.3.5. Noise Pitch Bend
Pitch Bend für den Rauschgenerator. Kann ebenfalls nur im
Kanal A verändert werden.
2.3.3.5.1. Add [1...31]
Bis 15 wird das Rauschen tiefer, sonst höher.
2.3.3.6. Sound Legato
Dieser letzte Effekte ist ebenfalls zur Frequenzbeinflussung
gedacht. Die Tonhöhe wird dabei auf die des folgenden Tones
gezogen. Bekannt dürfte solches von der Geige, Posaune oder
Hawaiigitarre sein.
Zu beachten ist hier, daß dieser Effekt immer
zusammenhängend durchgeführt wird. Wenn ein Ton z.B. drei
Takte dauert, gibt es mehrere Möglichkeiten, Legato
einzusetzen. Es kann nur im ersten Takt erlaubt sein, wobei die
folgenden beiden dann schon die Frequenz des folgenden Tones
haben. Auch kann Legato bei allen drei Takten freigegeben
werden, dann ist die Änderung langsamer. Fast alle anderen
Kombinationen sind ebenfalls möglich.
Nur eines funktioniert in diesem Beispiel nicht: Legato,
- 9 -
AUDIOFUN V1.0
kein Legato, Legato! Nachdem im ersten Takt Legato ausgeführt
wurde, hat der zweite Takt schon die Frequenz des nächsten
Tones. Im dritten Takt kann also kein Legato mehr ausgeführt
werden.
Eine Möglichkeit gibt es aber doch. Wenn Sie zu obigen
Beispiel zusätzlich kein Pitch Bend, Pitch Bend, kein Pitch
Bend eingeben, klappt es. Nach dem ersten Legato wird im
zweiten Takt der Ton verbogen, im dritten Takt kann also erneut
Legato erfolgen.
Zu guter letzt: beim letzten Ton ist natürlich kein Legato
möglich!
2.3.3.7. Hinweise zu Effects
Alle Effekte sind auch untereinander mischbar. Allerdings
sollten Sie es nicht übertreiben: Legato zusammen mit Vibrato
und Pitch Bend ist des Guten zuviel!
2.3.4. Test all
In diesem Fenster können Sie alle Kanäle und Parts parallel
testen. Gestartet wird ein Part, indem der Mauspfeil auf das
entsprechende Feld bewegt und die linke Taste gedrückt wird.
Möchten Sie den Part vorzeitig stoppen, drücken Sie die rechte
Taste.
Sie können auch - während ein Part abgearbeitet wird -
diesen erneut oder einen anderen starten. Dadurch hat Ihr
Programm die Möglichkeit, immer die aktuellen Ereignisse
akustisch wiederzugeben.
Während eines Lade -oder Speichervorganges wird der Sound
abgestellt. Anschließend können Sie aber wie gewohnt weiter
testen.
3. SOUNDWORKER
--------------
Nachdem Sie mühsam Ihre Sounddaten zusammengestellt und
abgespeichert haben, sollen Sie jetzt erfahren, wie Sie eine
solche Datei in Ihr Programm bekommen und von dort aus
ansprechen können.
- 10 -
AUDIOFUN V1.0
3.1. Binding und Datentypen
Für OMIKRON.BASIC und Sozobon C habe ich je ein Binding
geschrieben. Sollten Sie mit einer anderen Programmiersprache
arbeiten, ist dieses kein Problem. Schreiben Sie sich ein
eigenes Binding oder verzichten Sie völlig auf ein Binding.
Die folgenden Funktionen sind als Deklarationen aufgeführt,
damit Sie wissen, von welchem Datentyp die Übergabeparameter
sind. In OMIKRON.BASIC bedeutet ein "%" hinter einer Variable,
daß es sich um einen 16 bit Integerwert handelt, "%L" um 32 bit
Integer.
Steht ein "R" vor einer Variable, wird in dieser der
Rückgabewert abgelegt. Das "R" darf beim Aufruf aber nicht
angegeben werden.
Da OMIKRON.BASIC auf Zeilennummern besteht, beginnt das
Binding bei 63000. Wenn eine Biblothek ebenfalls diese Nummern
benutzt, müssen Sie das Binding umnummerieren.
3.2. Deklarationen
Mit den folgenden Deklarationen können Sie den SOUNDWORKER
aus Ihrem Programm ansprechen. Es kann sein, daß Sie nicht alle
Möglichkeiten nutzen. In diesem Fall streichen Sie alle nicht
benötigten Funktionen im Binding.
3.2.1. Load
Eine Datei wird zum Programm geladen. Der benötigte
Speicherplatz wird dabei reserviert.
Deklaration: Swk_Load(R Lret%, Filename$)
int swk_load(char *filename)
Parameter: Dateiname
Rückgabe: 1 bzw. TRUE alles OK
sonst Fehler
Den Rückgabewert sollten Sie auf jeden Fall abfragen. Es
könnte ja sein, daß die Datei nicht gefunden wurde oder es sich
um eine fremde Datei handelt. In diesem Fall müssen Sie Ihr
Programm mit einer Fehlermeldung abbrechen!
Wenn Sie Ihre Sounddatei mit Save DR gesichert und zu Ihrem
Programm gelinkt haben, können Sie diese Funktion natürlich im
Binding streichen.
- 11 -
AUDIOFUN V1.0
3.2.2. Start
Timer_A wird gestartet. Bevor irgendwelche Daten an den
SOUNDWORKER übergeben werden, muß diese Funktion aufgerufen
werden!
Deklaration: Swk_Start
void swk_start()
Parameter: keine
Rückgabe: keine
3.2.3. Stop
Timer_A wird gestoppt. Diese Funktion muß immer vor
Programmende oder laden einer anderen Datei aufgerufen werden!
Deklaration: Swk_Stop
void swk_stop()
Parameter: keine
Rückgabe: keine
3.2.4. Play
Ein Kanal wird gestartet und der gewünschte Part gespielt.
Deklaration: Swk_Start(Channel%, Part%)
void(int channel, int part)
Parameter: Kanalnummer 0 bis 2 für Kanäle A bis C
Partnummer +/- 1 bis 8 (negativ für zufällige
Frequenzen)
Rückgabe: keine
Bei einer ungültigen Partnummer wird der Kanal
stummgeschaltet.
- 12 -
AUDIOFUN V1.0
3.2.5. Till
Nicht immer möchte man alle Takte hören. Bei den
Zufallsfrequenzen werden z.B. immer alle 16 Takte benutzt. Mit
dieser Funktion können Sie die Anzahl der zu spielenden Takte
vermindern. Im Unterschied zum AUDIOFUN zählt der SOUNDWORKER
die Takte von 1 bis 16. Dieser Aufruf muß immer vor Play
erfolgen!
Deklaration: Swk_Till(Channel%, Last%)
void swk_till(int channel, int last)
Parameter: Kanalnummer 0 bis 2 für Kanäle A bis C
Nummer des letzten zu spielenden Taktes
Rückgabe: keine
3.2.6. Exec
In bestimmten Situationen kann es sinnvoll sein, zu Beginn
eines Taktes eine Aktion auszulösen, z.B. den Bildschirm
invertieren.
Mit diesem Aufruf können Sie die Startadresse einer
(kurzen!) Routine übergeben, die dieses oder ähnliches
ausführt. Die Routine wird im Supervisor-Modus ausgeführt und
muß mit einem RTS abgeschlossen sein. Sie können die
XBIOS-Funktionen, die mit dem Bildschirm zu tun haben,
benutzen. Die Aufrufe sollten Sie (Sozobon C Programmierer
müssen, also auf gar keinen Fall OSBIND.H benutzen!) aber in
Assembler schreiben.
Exec muß vor Play aufgerufen werden. Ihre Routine kann dann
aber wieder Exec aufrufen. Sie könnten so z.B. den Bildschirm
invertieren und nach einigen Takten wieder normal darstellen.
Wahlweise können Sie auch Till aufrufen.
Deklaration: Swk_Exec(Channel%, Begin%, Routine%L)
void swk_exec(int channel, int begin,
long (*routine()))
Parameter: Kanalnummer 0 bis 2 für Kanäle A bis C
Nummer des Taktes, bei dem die Routine
gestartet werden soll. Bei einer 0
wird die Routine am Ende des Parts
ausgeführt.
Startadresse der Routine.
Rückgabe: keine
- 13 -
AUDIOFUN V1.0
3.2.7. Time
Diese Funktion liefert die Nummer des momentan gespielten
Taktes.
Deklaration: Swk_Time(R Tret%, Channel%)
int swk_time(int channel)
Parameter: Kanalnummer 0 bis 2 für Kanäle A bis C
Rückgabe: Momentane Taktnummer oder 0, wenn Kanal
inaktiv
Wenn Sie gleich nach Play diese Funktion aufrufen, werden
Sie aller Wahrscheinlichkeit nach die Partnummer erhalten, die
Sie eben mit Play übergeben haben. Abhilfe: mindestens 20ms
warten oder folgenden Aufruf vorschalten!
3.2.8. Part
Diese Funktion liefert die Nummer des momentan gespielten
Parts.
Deklaration: Swk_Part(R Pret%, Channel%)
int swk_part(int channel)
Parameter: Kanalnummer 0 bis 2 für Kanäle A bis C
Rückgabe: Momentane Partnummer oder 0, wenn Kanal
inaktiv
Part sollten Sie immer vor Time verwenden, um sicher zu
stellen, daß der Wert, den Sie erhalten, auch gültig ist. Nur
wenn es sich um eine Partnummer handelt, ist auf die Taktnummer
verlass.
Einzige Ausnahme: Sie übergeben bei Play eine ungültige
Partnummer größer 255 und fragen anschließend die Partnummer
ab!
Die Funktionen Time und Part können Sie z.B. dazu benutzen,
daß Ihr Programm bis Erreichen eines bestimmten Taktes in einer
Leerschleife verharrt und somit der Programmablauf für diese
Zeit gestoppt wird.
3.2.9. Joy_Start
Im SOUNDWORKER ist auch eine Joystickabfrage integriert, die
Sie, falls Ihr Programm mit dem Joystick gesteuert wird, auch
benutzen sollten. Damit stellen Sie sicher, daß Ihr Programm
- 14 -
AUDIOFUN V1.0
auch unter anderen TOS-Versionen läuft!
Dieser Aufruf startet die Abfrage. Beachten Sie, daß dann
die Maus nicht mehr abgefragt werden kann!
Deklaration: Joy_Start
void joy_start()
Parameter: keine
Rückgabe: keine
3.2.10. Joy_Stop
Die Joystickabfrage wird beendet. Diesen Aufruf können Sie
verwenden, um von Joystick- auf Mausabfrage umzuschalten. Auf
jeden Fall muß er vor Programmende erfolgen!
Deklaration: Joy_Stop
void joy_stop()
Parameter: keine
Rückgabe: keine
3.2.11. Joy_Last
Liefert den Wert des zuletzt bewegten Joysticks.
Deklaration: Joy_Last(R Jlast%)
int joy_last()
Parameter: keine
Rückgabe: 254 für Joystick 0 und 255 für Joystick 1.
Ist die Abfrage nicht eingeschaltet, erhalten
Sie eine 0.
3.2.12. Joy_0
Liefert momentane Stellung von Joystick 0.
Deklaration: Joy_0(R Stick_0%)
int joy_0()
Parameter: keine
- 15 -
AUDIOFUN V1.0
Rückgabe: Wert für Joystick 0. Bei gedrückter Feuertaste
um 128 erhöht.
3.2.13. Joy_1
Liefert momentale Stellung von Joystick 1.
Deklaration: Joy_1(R Stick_1%)
int joy_1()
Parameter: keine
Rückgabe: Wert für Joystick 1. Bei gedrückter Feuertaste
um 128 erhöht.
3.3. Andere Sprachen
Damit Sie sich Ihr eigenes Binding schreiben oder den
SOUNDWORKER direkt ansprechen können, werde ich jetzt den
prinzipiellen Aufbau einer solchen Datei beschreiben.
Zuerst müssen Sie in Ihrem Programm (oder Binding) ein 16
bit Integerfeld mit 2512 Elementen einrichten, also z.B. DIM
Feld%(2512). Anschließend ermitteln Sie die Anfangsadresse des
Feldes und laden Ihre Sounddatei binär dorthin.
Wenn Sie die Datei zu Ihrem Programm gelinkt haben, müssen
Sie dieses Feld (oder besser noch Struktur) als extern
deklarieren. Der Feldname ist _swk, wobei zumindest
C-Programmierer den Unterstrich weglassen müssen (extern
swk[2512]).
Für die Kommunikation mit dem SOUNDWORKER sind einige
Feldelemente zuständig, die ich nun erklären werde. Dabei nehme
ich an, daß das erste Element den Index 0 hat. Wenn in der
Sprache, die Sie verwenden, dieses der Index 1 ist, müssen Sie
zu den folgenden Feldangaben immer eine 1 addieren.
3.3.1. ID [Index 0 bis 8]
In den ersten 18 Bytes befindet sich die Dateikennung
"SOUNDWORKER V1.0" (ohne Gänsefüßchen), mit zwei Nullbytes
abgeschlossen.
3.3.2. Kanal A [Index 9]
Um den Kanal A zu starten, schreiben Sie in dieses Feld die
Nummer des gewünschten Parts. Ist dieser Wert negativ, werden
- 16 -
AUDIOFUN V1.0
anstelle der programmierten zufällige Frequenzen gespielt.
Erlaubt sind die Werte +/- 1 bis 8. Alle anderen Werte
schalten den Kanal stumm.
Beim lesen erhalten Sie im oberen Byte die Part- und im
unteren die Taktnummer. Sind diese Werte 0, ist der Kanal
inaktiv.
Kanal B [Index 10]
Kanal C [Index 11]
3.3.3. Begin/Last A [Index 12]
Nummer, ab welchen Takt eine Routine gestartet oder bis zu
welchem Takt ein Part gespielt werden soll. Für die
Entscheidung, welche der beiden Möglichkeiten gültig ist, ist
der folgende Eintrag zuständig.
Dieser Wert muß schon vorhanden sein, bevor der Kanal
gestartet wird! Bei einer 0, die nicht eingetragen werden muß,
wird der Part normal zu Ende gespielt.
Begin/Last B [Index 13]
Begin/Last C [Index 14]
3.3.4. Routine A [Index 15 und 16]
Startadresse der Routine. Die Routine muß eine kurze
Ausführungszeit haben, da Sie im Interrupt aufgerufen wird!
Steht hier eine 0,die Sie nicht hineinschreiben müssen,
interpretiert der SOUNDWORKER Begin/Last als Last.
Es wird also der Part bis zum angegebenen Takt gespielt und
keine Routine aufgerufen.
Bei einem Wert ungleich 0 wird dieser als Startadresse der
Routine gewertet. Diese wird bei Erreichen der Taktnummer in
Begin/Last aufgerufen.
Routine B High-Word [Index 17]
Routine B Low-Word [Index 18]
Routine C High-Word [Index 19]
Routine C Low-Word [Index 20]
3.3.5. Joy_Last [Index 21]
Hier steht der Wert für den zuletzt bewegten Joystick. 254
bedeutet Joystick 0 und 255 Joystick 1.
- 17 -
AUDIOFUN V1.0
3.3.6. Joy_0 [Index 22]
Stellung von Joystick 0. Bei gedrückter Feuertaste um 128
erhöht.
3.3.7. Joy_1 [Index 23]
Stellung von Joystick 1. Bei gedrückter Feuertaste um 128
erhöht.
3.3.8. Start/Stop
Von den vier folgenden Feldelementen müssen Sie die
jeweiligen Adressen (also die absoluten Adressen der
Speicherplätze, an denen sie sich befinden) ermitteln und diese
an Supexec (XBIOS 38) übergeben.
Supexec ruft eine von den vier Routinen auf, die den
SOUNDWORKER oder die Joystickabfrage starten bzw. stoppen. Sie
sollten diese Routinen nur mit Supexec aufrufen, da einige
Registerinhalte verändert werden und die Routinen nur im
Supervisor-Modus funktionieren!
3.3.8.1. Swk_Start [Index 24]
Der Timer_A wird gestartet und daduch der SOUNDWORKER alle
20ms aufgerufen. Bevor Sie also irgend etwas mit dem
SOUNDWORKER anfangen können, muß der TIMER gestartet werden!
3.3.8.2. Swk_Stop [Index 26]
Der Timer wird gestoppt. Dieses müssen Sie vor Programmende
immer machen!
3.3.8.3. Joy_Start [Index 28]
Die Joystickabfrage wird eingeschaltet. Das Arbeiten mit der
Maus ist dann nicht mehr möglich!
3.3.8.4. Joy_Stop [Index 30]
Die Joystickabfrage wird abgeschaltet. Ebenfalls vor
Programmende nicht vergessen!
- 18 -