2.10 Musik und Sound
2.10.2 Abspielen von WAV-Dateien 2.10.4 Konfiguration der Soundlibrary Unter R-BASIC gibt es folgende Möglichkeiten Töne auszugeben:
Beispiele zur Verwendung der Sound- und Musik-Befehle finden Sie im Ordner "R-BASIC\Beispiel\Sound".
2.10.1 Einfache Töne und TonfolgenBEEPGibt einen oder mehrere kurze Töne aus. Tonhöhe und Länge können nicht verändert werden.
Beispiel: |
BEEP 3 ' Drei kurze Töne |
StandardSoundGibt einen der sechs GEOS Standardtöne aus.
Beispiel: |
StandardSound SS_ALARM |
SoundDie Anweisung SOUND spielt eine Tonfolge mit bis zu 11 Tönen. Die Töne werden dabei durch ihre Frequenz und die Tondauer bestimmt. Außerdem können Sie die Lautstärke und die verwendeten Instrumente auswählen und Sie können entscheiden, ob die Tonfolge im Vordergrund oder im Hintergrund gespielt wird."Im Vordergrund" bedeutet, dass R-BASIC so lange wartet, bis die Tonfolge beendet ist. "Im Hintergrund" bedeutet, dass R-BASIC weiterarbeitet, noch während die Tonfolge gespielt wird. Dabei können Sie festlegen, dass eine Warteschlange verwendet wird. Das bedeutet, dass die nächste Sound-Tonfolge erst gespielt wird, wenn alle vorher angegebenen Sound-Tonfolgen fertig sind. Wenn Sie festlegen, dass keine Warteschlange verwendet werden soll, dann werden allen nacheinander angegebenen Sound-Tonfolgen sofort - und damit faktisch gleichzeitig - abgespielt, vorausgesetzt die Sound-Hardware lässt das zu.
Um die Klangfarbe der Töne zu ändern können Sie jederzeit ein anderes Instrument auswählen. Dazu geben Sie die Nummer des Instruments (siehe nächstes Kapitel) als negative Zahl an. Startwert für jeden Sound-Befehl ist das Instrument 19 (IP_CHURCH_ORGAN). Tipps:
|
Sound "", 1000, 0.3, 0, 0.1, 1000, 0.3 |
| Beispiel: Morsecode der Buchstaben "MMS" im Vordergrund |
Sound "", 1000, 0.3, 0, 0.1, 1000, 0.3 ' M Sound "", 0, 0.3 ' Pause Sound "", 1000, 0.3, 0, 0.1, 1000, 0.3 ' M Sound "", 0, 0.3 ' Pause Sound "", 1000, 0.1, 0, 0.1, 1000, 0.1, 0, 0.1, 1000, 0.1 ' S |
| Beispiel: Morsecode der Buchstaben "MMS" im Hintergrund. Durch die Angabe des Steuerzeichens "q" (Warteschlange) werden die Töne nacheinander gespielt. |
Sound "q", 1000, 0.3, 0, 0.1, 1000, 0.3 ' M Sound "q", 0, 0.3 ' Pause Sound "q", 1000, 0.3, 0, 0.1, 1000, 0.3 ' M Sound "q", 0, 0.3 ' Pause Sound "q", 1000, 0.1, 0, 0.1, 1000, 0.1, 0, 0.1, 1000, 0.1 ' S |
| Beispiel: mit einem anderen Instrument |
Sound "", 440, 0.2, 0, 0.1, 440, 0.2, 0, 0.1,\ -12, \ 440, 0.2, 0, 0.1, 440, 0.2, 0, 0.1, 660, 0.2 |
KCSoundKCSound ist ein Kompatibilitätsbefehl. Er ersetzt den Sound-Befehl des KC85-Homecomputers. Im Original steuert der Befehl die Hardware des Computers (die CTC-Einheit) an. Die CTC teilt die Taktfrequenz dieses Computers (1,75 MHz) herunter und erzeugt so einen hörbaren Ton. Dabei stehen zwei Kanäle zur Verfügung. Jeder Kanal hat einen Vorteiler (erlaubte Werte: 0 und 1) und einen Zähler (erlaubte Werte 0 bis 255). Wird der Zähler auf Null gesetzt, erfolgt keine Tonausgabe auf diesem Kanal.Die ausgegebene Frequenz berechnet sich aus dem Vorteiler v und dem Zähler z folgendermaßen:
Vorteiler v = 0:f = 1.75E6/(32*z)
Hinweise:
|
KCSound 249, 0, 166, 0, 31, 50 |
Beispiele zur Verwendung der Befehle Sound und KCSound finden Sie in der Beispieldatei "R-BASIC\Beispiel\Sound\Sound Demo".
^2.10.2 Abspielen von WAV-DateienGEOS verfügt über die Möglichkeit WAV-Dateien (*.WAV") abzuspielen. GEOS selbst kann nur Dateien mit dem Format "8 Bit Mono" abspielen. R-BASIC umgeht dieses Problem, indem es andere Formate (z.B. "16 Bit Stereo") vorher nach 8 Bit Mono konvertiert. Da das WAV Format ein sehr einfaches Datenformat ist und die WAV-Dateien meist nicht sehr groß sind führt das in den meisten Fällen zu keiner hörbaren Verzögerung.Unter GEOS kann immer nur eine WAV-Datei gleichzeitig abgespielt werden. R-BASIC organisiert eine "Warteschlange", wenn Sie versuchen, mehrere WAV-Sounds gleichzeitig abzuspielen. Sie werden dann nacheinander abgespielt. GEOS verfügt aktuell nicht über die Möglichkeit, in das Abspielen von WAV-Dateien einzugreifen. So hat man z.B. nicht die Möglichkeit die Lautstärke zu ändern oder das Abspielen abzubrechen. Dieses Problem kann R-BASIC nicht umgehen. Überblick
PlayWavPlayWav spielt eine WAV-Datei ("*.wav") ab. Falls erforderlich wird die Datei vorher in das Format "8 Bit Mono" konvertiert. Dazu wird eine temporäre Kopie erstellt, die Originaldatei wird nicht verändert. Der nächste R-BASIC-Befehl wird erst abgearbeitet, wenn die WAV-Datei vollständig abgespielt wurde.PlayWav setzt die globale Variable "fileError". Hinweis: GEOS kann nur eine WAV-Datei gleichzeitig abspielen. Die WAV-Datei wird daher nicht abgespielt wenn bereits eine WAV-Datei im Hintergrund abgespielt wird. Verwenden Sie PlayWavBG um die Datei in die Warteschlange zu stellen.
Beispiele: |
PlayWav "TATA.WAV" Print "Fertig" |
DIM t$ t$ = "TATA.WAV" PlayWav "C:\\MUSIC\\CHORD1.WAV" PlayWav t$ Print "Fertig" |
Die Print-Anweisung wird jeweils ausgeführt, nachdem der letzte Ton der Datei "TATA.WAV" verklungen ist.
PlayWavBGPlayWavBG spielt eine WAV-Datei ("*.wav") im Hintergrund (background) ab. R-BASIC arbeitet weiter während die Datei im Hintergrund abgespielt wird. Sollte bereits eine WAV-Datei im Hintergrund gespielt werden, so wird die neue Datei auf die "Warteliste" gesetzt und erst abgespielt, sobald die anderen Dateien auf der Liste abgespielt wurden.Sie können PlayWavBG den Namen eines Action-Handlers übergeben. Dieser Handler wird automatisch aufgerufen, sobald die Datei vollständig abgespielt wurde. Er muss als TimerAction oder als ButtonAction deklariert sein. Ihr Programm kann so auf dem Laufenden bleiben, ob im Hintergrund noch WAV-Sounds spielen oder nicht. Der Handler wird auch gerufen, wenn die Datei nicht abgespielt werden konnte. Im Parameter actionData finden Sie einen Fehlercode bzw. Null, wenn die Datei korrekt abgespielt wurde. Eine Liste der Fehlercodes finden Sie im Anhang B. Verwenden Sie die Funktion ErrorText$, um den Fehlercode in einen anschaulichen Text zu konvertieren. Falls erforderlich wird die Datei vor der Ausgabe in das Format "8 Bit Mono" konvertiert. Dazu wird eine temporäre Kopie erstellt, die Originaldatei wird nicht verändert. PlayWavBG setzt die globale Variable "fileError".
Beispiele: |
PlayWavBG "TRUMPET.WAV" Print "Fertig" |
PlayWavBG "TRUMPET.WAV" PlayWavBG "C:\\MUSIC\\CHORD1.WAV", ZwischenHandler PlayWavBG "TATA.WAV", FinishHandler Print "Fertig" |
| Die Print-Anweisung wird jeweils ausgeführt noch während die Datei "TRUMPET.WAV" abgespielt wird. Im zweiten Beispiel werden die Handler "ZwischenHandler" und "FinishHandler" aufgerufen, nachdem die entsprechenden Dateien abgespielt wurden. |
TIMERACTION ZwischenHandler Print "Jetzt spielt 'TATA' " End ACTION |
TIMERACTION FinishHandler Print "Nun ist Ruhe." Print ErrorText$( actionData ) ' ggf Fehlercode ausgeben End ACTION |
GetWavBGCountDiese Funktion liefert die Anzahl der WAV-Dateien, die in der Wartschlange sind. Dabei wird die aktuell spielende Datei mitgezählt. Der Rückgabewert 1 bedeutet also, dass gerade eine WAV-Datei im Hintergrund spielt, die Warteschlange aber leer ist.Syntax: <numVar> = GetWavBGCount ( ) StopWavBGStopWavBG löscht die Warteschlange der für die WAV-Ausgabe verantwortlichen Library. Der aktuell im Hintergrund spielende WAV-Sound wird nicht abgebrochen (das wird vom System nicht unterstützt). StopWavBG darf auch gerufen werden, wenn gerade kein WAV-Sound spielt. Es wird empfohlen, StopWavBG im OnExit-Handler zu rufen, wenn man sich sicher ist, ob noch WAV-Sounds in der Warteschlange sind.Syntax: StopWavBG Beispiel: |
PlayWavBG "TATA.WAV" PlayWavBG "CHORD.WAV" PlayWavBG "TRUMPET.WAV" PlayWavBG "PIANO.WAV" StopWavBG PlayWavBG "BOING.WAV" |
Beim Aufruf von StopWavBG spielt die Datei TATA.WAV im Hintergrund. CHORD.WAV, TRUMPET.WAV und PIANO.WAV werden aus der Warteschlange entfernt. TATA.WAV wird zu Ende gespielt, danach wird BOING.WAV gespielt.
GetWavInfoMit GetWavInfo können Sie verschiedene Informationen über eine WAV-Datei erhalten. GetWavInfo liefert Null wenn die übergebene Datei keine WAV-Datei ist oder nicht geöffnet werden kann. Im ersten Fall enthält die globale Variable fileError den Wert Null, im anderen Fall einen Fehlercode.
ConvertWavConvertWav fertigt eine Kopie einer Wav-Datei an und konvertiert sie dabei ins Format 8 Bit Mono. Nur dieses Format kann von GEOS abgespielt werden. Es ist daher sinnvoll alle WAV-Dateien, die Sie in ein Installationspaket packen wollen, vorher nach 8 Bit Mono zu konvertieren. ConvertWav erspart Ihnen die Verwendung eines Fremdprogramms. Es kopiert auch 8 Bit-Mono-Dateien.Prüfen Sie die globale Variable "fileError" bzw. spielen Sie die Kopie ab, um zu sehen, ob das Konvertieren erfolgreich war.
Hinweis: Es ist nicht sinnvoll, vor jedem Abspielen einer WAV-Datei ihr Format zu prüfen und falls notwendig ConvertWav zu rufen. Die PlayWav-Routinen rufen ConvertWav selbständig, falls es erforderlich ist. Und sie sind dabei wesentlich effizienter als jeder BASIC-Code. ^2.10.3 Ausgabe von FM-SoundsNeben der Ausgabe von gesampelter Musik (z.B. der Ausgabe von WAV-Dateien) können Computer auch Musikinstrumente simulieren. Das dazu häufig verwendete Verfahren heißt Frequenz-Modulation (kurz: FM). Die so erzeugten Töne oder Tonfolgen werden daher auch als FM-Sounds bezeichnet. Berühmt wurde dieses Verfahren, weil es in den erfolgreichen SoundBlasterTM Soundkarten verwendet wurde.^2.10.3.1 Beschreibung von Instrumenten und NotenDieser Abschnitt enthält die Grundlagen für die folgenden Kapitel (Spielen von einzelnen Noten und Spielen von FM-Musik).InstrumenteWie Sie wissen klingt ein bestimmter Ton, z.B. ein tiefes C, auf jedem Instrument anders. Das liegt im Wesentlichen an zwei Dingen:Einerseits spielt die Anzahl und Amplitude der Oberwellen eine Rolle. Neben der Grundfrequenz enthält jeder Ton noch die doppelte, dreifache, vierfache usw. Frequenz. Je nachdem, wie stark diese Oberwellen sind, klingt der Ton anders. Der zweite Aspekt ist der Amplitudenverlauf. Zum Beispiel erreicht der Ton eines Saiteninstruments sehr schnell seine volle Lautstärke um dann sofort mehr oder weniger langsam abzuklingen. Bei einem Blasinstrument kann hingegen die volle Lautstärke des Tons über längere Zeit gehalten werden. Hört der Musiker auf zu blasen so klingt der Ton sehr schnell ab. So hat jedes Musikinstrument seine eigene Charakteristik. Computer simulieren diese Eigenschaften häufig mit einem Verfahren, dass man Frequenzmodulation (FM) nennt. Die so erzeugten Töne oder Tonfolgen bezeichnet man deshalb als FM-Sounds. Dabei wird die Grundfrequenz des Tones in einem bestimmten (sehr schellen) Rhythmus verändert. Dadurch entstehen - je nach Stärke und Geschwindigkeit der Änderung - unterschiedlich viele und unterschiedlich starke Oberwellen. Zusätzlich kann man den Amplitudenverlauf simulieren. Auf diese Weise gibt es extrem viele Möglichkeiten ein Instrument zu simulieren. GEOS bietet Ihnen 175 vordefinierte Instrumente an. Jedes Instrument wird dabei durch eine Zahl (im Bereich von Null bis 174) beschrieben. In der R-BASIC Library "MusicValues" sind entsprechende Konstanten definiert. Sie finden diese auch im R-BASIC Anhang, Kapitel G. Die Namen der Konstanten sind direkt dem PC/GEOS SDK entnommen und sind an die englischen Bezeichnungen der Instrumente angelehnt. R-BASIC selbst definiert die folgenden Konstanten. Diese Werte sind Kopien der Werte aus der Library, so dass Sie in vielen Fällen ohne das Einbinden der Library auskommen.
Das Beispiel "R-BASIC\Beispiel\Sound\Instrument Demo" erlaubt Ihnen, die Instrumente auf einfache Weise auszuprobieren. Die Instrumente mit den Nummern 0 bis 127 sind "normale" Instrumente, die jeden Ton spielen können. Die Instrumente mit den Nummern 128 bis 174 hingegen sind Percussion-Instrumente. Laut Dokumentation sollten Sie mit einer genau auf das Instrument angestimmten Frequenz gespielt werden, damit sie so klingen wie gewünscht. Konstanten für die entsprechenden Frequenzen finden Sie ebenfalls in der Library "MusicValues" sowie im Anhang G. Die Erfahrung zeigt aber, dass viele Percussion-Instrumente auch gut klingen, wenn sie mit anderen Noten gespielt werden. Das oben genannte Beispiel macht davon Gebrauch. Leider bedürfen insbesondere die Percussion-Instrumente unter GEOS einer Überarbeitung. Vielleicht erreichen Sie ja gerade durch Veränderung der gespielten Note den gewünschten Effekt.
Da das Aufsuchen der Standard-Frequenz zu einem Percussioninstrument mühsam und fehleranfällig ist kann man den Routinen PlayNote und AllocNoteHan (siehe nächstes Kapitel) den Frequenzwert Null übergeben. Die Routinen suchen dann selbst den passenden Frequenzwert heraus. Das Gleiche gilt für die Routinen PlayMusic, PlayMusicBG und AllocMusicHan.
GEOS und damit R-BASIC kann einzelne Töne oder ganze Tonfolgen auf diese Weise abspielen. Wie das gemacht wird ist in den folgenden Kapiteln beschrieben.
Die TonhöheDie Tonhöhe einer Note wird durch ihre Frequenz festgelegt. Dabei gelten die folgenden Regeln:
Weil es sehr mühsam und auch nicht üblich ist, Musikstücke durch die Aufzählung der Frequenzen der Töne zu beschreiben, bietet R-BASIC die Routinen PlayMusic, PlayMusicBG und AllocMusicHan, denen man nur die Noten als String (z.B. "cdefgggg" ) übergeben muss.
Der NotenwertDieser Begriff beschreibt, ob es sich z.B. um eine viertel, eine achtel oder eine ganze Note handelt.Das TempoNeben der Tonhöhe und dem Instrument, mit dem eine Note gespielt werden soll, müssen Sie auch angeben, wie lang die Note ist. Dabei geht R-BASIC folgenden Weg:
Die LautstärkeTöne oder Musikfolgen können in unterschiedlicher Lautstärke abgespielt werden. Die Lautstärke wird in R-BASIC grundsätzlich als Prozentwert von der Maximallautstärke, also im Bereich von 0 bis 100, angegeben. R-BASIC simuliert das physiologische Lautstärkeempfinden. Das heißt, mit dem Wert 50 klingt jede Note nur etwa halb so laut wie mit dem Wert 100. Das genaue Resultat hängt jedoch auch vom gewählten Instrument ab. Außerdem kann es sein, das bei einem Lautstärkewert von Null der Ton trotzdem ganz leise zu hören ist.FM-MusikDer Parameter musicString für die Befehle PlayMusic, PlayMusicBG und AllocMusicHan ist eine Zeichenkette, die genau beschreibt, welche Note, wie lange und mit welchem Instrument gespielt werden soll. Dabei gelten folgende Grundregeln:
Anmerkungen
(2) Um Percussion-Instrumente automatisch mit der für sie korrekten Frequenz zu spielen können Sie den Frequenzwert Null angeben ( "#0" ). (3) Eine mit einem Sternchen eingeleitete Hintergrundnote (oder explizite Frequenzangabe) wird nicht sofort, sondern gemeinsam mit der nächsten Vordergrundnote, Frequenzangabe oder Pause gespielt. Die Hintergrundnote wird dabei genauso lange wie die Vordergrundnote gespielt. (4) Wenn Sie hier z.B. den Wert 3 angeben ( "*3" ), so werden im Gegensatz zu Anmerkung (3) alle folgenden Hintergrundnoten so lange gespielt, wie 3 Vordergrundnoten dauern. Tipp: Damit Sie den Unterschied hören, müssen Sie für den Hintergrund ein Instrument verwenden, das den Ton hält (z.B. die Instrumente 16 bis 20). |
PlayMusic "cde_f~g~h~c'.", 7 |
PlayMusic "i20 c.f~ e%2f_ %4d~g.", 7 |
|
Beispiel mit Hintergrundnoten: Die Hintergrundnoten c und f werden gemeinsam mit den Vordergrundnoten e und h gespielt. Vorher wird das Instrument Nr. 3 als Hintergrundinstrument ausgewählt. |
PlayMusic "*i3 *cedc *fhag", 10 |
^2.10.3.2 Spielen von einzelnen NotenBevor Sie diesen Abschnitt lesen, sollten die das vorherige Kapitel (Beschreibung von Noten und Instrumenten) gelesen haben.Um eine Note zu spielen müssen Sie folgendes angeben:
- Die Note wird gespielt. Das kann auch mehrfach geschehen. - Die Datenstruktur wird wieder freigegeben. Dazu muss das Spielen der Note vorher sicher beendet sein. Notfalls muss das Spielen der Note abgebrochen werden. R-BASIC erledigt dies automatisch. Zum Spielen einzelner Noten stehen Ihnen die folgenden Befehle zur Verfügung:
Die Anweisung PlayNote spielt eine einzelne Note. Der Parameter "delay" (engl: Verzögerung) bestimmt dabei, wie die Note gespielt werden soll. Wird Delay nicht angegeben so wird die Note im Hintergrund abgespielt.
PlayNote ist sehr einfach zu benutzen. Allerdings müssen Sie vorher wissen, wie lange die Note gespielt werden soll, denn Sie haben nicht die Möglichkeit, das Spielen der Note vorzeitig abzubrechen. Wenn Sie z.B. ein Piano programmieren wollen ist jedoch genau das nötig. Die Note soll beim Drücken einer Taste erklingen und beim Loslassen wieder enden.
Deswegen bietet R-BASIC die Kommandos AllocNoteHan, PlayNoteHan, StopNoteHan und FreeNoteHan. AllocNoteHan legt die notwendige Datenstruktur an und liefert ein Handle darauf. Für ein Piano-Programm könnten Sie z.B. folgendes tun: Wenn der Nutzer eine Taste drückt rufen Sie PlayNoteHan und der Ton erklingt. Den Parameter "time" setzen Sie z.B. auf 600 (10 Minuten), damit der Ton nicht "von allein" aufhört. Lässt der Nutzer die Taste wieder los so rufen Sie StopNoteHan. Wenn Sie die Note sicher nicht mehr brauchen, müssen Sie FreeNoteHan rufen, um die Datenstruktur wieder freizugeben.
PlayNoteSpielt eine einzelne Note im Vordergrund oder im Hintergrund ab.
Beispiele: |
PlayNote IP_MARIMBA, 262, 0.7, 100 |
| Die Note 'c' (262 Hz) wird auf dem Instrument MARIMBA für 0.7 Sekunden mit 100% Lautstärke im Hintergrund gespielt. Das heißt, R-BASIC führt den nächsten Befehl aus, noch während die Note erklingt. |
PlayNote IP_REED_ORGAN, 440, 0.6, 80, 0.4 |
| Die Note 'a' (440 Hz) wird auf dem Instrument REED_ORGAN für 0.6 Sekunden mit 80% Lautstärke gespielt. R-BASIC wartet eine Sekunde (0.6 + 0.4 = 1) bevor der nächste Befehl abgearbeitet wird. |
PlayNote IP_ACOUSTIC_BASS_DRUM, 0, 0.2, 100 |
Das Percussion-Instrument IP_ACOUSTIC_BASS_DRUM wird mit der passenden Frequenz (automatische Auswahl durch den Frequenzwert Null) für 0,2 Sekunden mit voller Lautstärke im Hintergrund gespielt.
AllocNoteHanSpeichert die Daten einer Note in einer internen Datenstruktur und liefert ein Handle darauf.
PlayNoteHanSpielt eine einzelne Note im Vordergrund oder im Hintergrund ab. Die Note wird durch ein Handle beschrieben, das von AllocNoteHan geliefert wurde.
StopNoteHanStoppt das Abspielen einer mit PlayNoteHan im Hintergrund gespielten Note. StopNoteHan darf auch gerufen werden, wenn die durch "han" spezifizierte Note nicht oder nicht mehr spielt.
FreeNoteHanGibt die von AllocNoteHan angelegte Datenstruktur frei.
Beispiel: |
Dim h as HANDLE h = AllocNoteHan (IP_REED_ORGAN, 550, 100) PlayNoteHan h, 600 ' Ton an (10 min.) Pause 20 ' 2 Sekunden StopNoteHan h ' Ton vorzeitig aus Pause 10 ' 1 Sekunde PlayNoteHan h, 2, 0 ' Ton an (2 Sekunden, im Vordergrund) StopNoteHan h ' Ton aus. Zur Sicherheit FreeNoteHan h ' Fertig |
^2.10.3.3 Ausgabe von FM-MusikBevor Sie diesen Abschnitt lesen, sollten die das Kapitel 2.10.3.1 (Beschreibung von Noten und Instrumenten) gelesen haben.In der Datei "R-BASIC\Beispiel\Sound\FM Musik Demo" finden Sie mehrere Beispiele zur Verwendung der FM-Musik-Routinen. Zum Spielen eines FM-Musikstücks stehen Ihnen die folgenden Befehle zur Verfügung:
PlayMusic ist sehr einfach zu benutzen. Allerdings haben Sie nicht die Möglichkeit, das FM-Musikstück vorher abzubrechen oder mehrere Musikstücke nacheinander im Hintergrund zu spielen. Die Kommandos AllocMusicHan, PlayMusicHan, StopMusicHan und FreeMusicHan lösen das erste Problem. AllocMusicHan legt die notwendige Datenstruktur an und liefert ein Handle darauf. Zum Spielen des FM-Musikstücks rufen Sie PlayMusicHan, um das Spielen vorzeitig abzubrechen, rufen Sie StopMusicHan. Mit FreeMusicHan geben Sie die von AllocMusicHan belegten Datenstrukturen wieder frei.
Um mehrere FM-Musikstücke im Hintergrund nacheinander zu spielen rufen Sie mehrfach hintereinander PlayMusicBG. R-BASIC organisiert automatisch eine Warteschlange, so dass die FM-Musikstücke automatisch nacheinander angespielt werden. Mit GetMusicBGCount und StopMusicBG haben Sie Zugriff auf diese Warteschlange.
PlayMusicSpielt ein FM-Musikstück im Vordergrund oder im Hintergrund ab.
Beispiele: |
PlayMusic "cdefgahc'", 15 ' Tonleiter im Hintergrund spielen |
PlayMusic "cdefgahc'", 15, 0 ' Im Vordergrund spielen |
PlayMusic "i0c i4c i32c i108c", 15, 0 ' Mehrfach Note c spielen |
| Beispiel: Für Percussion-Instrumente (Instrumentennummer >= 128) kann man die "Standard"-Frequenz automatisch auswählen lassen, wenn man als Frequenz den Wert Null übergibt. |
PlayMusic "i128#0 i158#0_ i128#0#0", 14 |
Hinweis: Die Erfahrung zeigt, dass andere Noten als die "Standard-Frequenz" bei Percussion-Instrumenten ebenfalls gut klingen. Im Einzelfall sollten Sie das ausprobieren. Das Beispiel "R-BASIC\Beispiel\Sound\FM Musik Demo" macht für die Hintergrundstimme davon Gebrauch. Auch das Beispiel "R-BASIC\ Beispiel\Sound\Instrument Demo" verwendet diese Variante.
PlayMusicBGSpielt ein FM-Musikstück im Hintergrund ab, wobei eine Warteschlange organisiert wird. Die an PlayMusicBG übergebene Musikfolge wir erst gespielt, wenn alle vorher an PlayMusicBG übergebene Musikstücke abgespielt wurden.Hinweis: Der Sound-Befehl (Kapitel 2.10.1) verwendet die gleiche Hintergrundwarteschlange.
Beispiel Zuerst wird die Tonfolge "cdef" und dann, mit geringerer Geschwindigkeit, die Tonfolge "gahc' " abgespielt. Der Text "Musik spielt" erscheint noch während die Tonfolgen zu hören sind. |
PlayMusicBG "cdef", 12 PlayMusicBG "gahc'", 20 Print "Musik spielt" |
GetMusicBGCountDiese Funktion liefert die Anzahl der FM-Tonfolgen, die in der Wartschlange sind. Dabei wird die aktuell spielende FM-Tonfolge mitgezählt. Der Rückgabewert 1 bedeutet also, dass gerade eine FM-Tonfolge im Hintergrund spielt, die Warteschlange aber leer ist.Syntax: <numVar> = GetMusicBGCount ( ) Hinweis: Der Sound-Befehl (Kapitel 2.10.1) verwendet die gleiche Hintergrundwarteschlange wie der Befehl PlayMusicBG. GetMusicBGCount zählt also auch Sound-Anweisungen, die in der Warteschlange sind. StopMusicBGStopMusicBG löscht die Warteschlange der für Ausgabe von FM-Tonfolgen verantwortlichen Library. Der aktuell im Hintergrund spielende FM-Tonfolge wird nicht abgebrochen. StopMusicBG darf auch gerufen werden, wenn gerade keine FM-Tonfolge spielt. Es wird empfohlen, StopMusicBG im OnExit-Handler zu rufen, wenn man sich sicher ist, ob noch FM-Tonfolgen in der Warteschlange sind.Syntax: StopMusicBG Hinweis: Der Sound-Befehl (Kapitel 2.10.1) verwendet die gleiche Hintergrundwarteschlange wie der Befehl PlayMusicBG. Sie können also den Befehl StopMusicBG auch verwenden, um die Warteschlange für Sound-Befehle zu leeren. Beispiel: |
PlayMusicBG "cdefgahc'_", 7 PlayMusicBG "cdefgahc'_", 7 StopMusicBG PlayMusicBG "c~c~c~d~e~c~", 7 |
Beim Aufruf von StopMusicBG spielt die erste Tonleiter. Sie spielt zuende. Die zweite Tonleiter wird aus der Warteschlange entfernt. Stattdessen spielt sofort die Tonfolge "c~c~c~d~e~c~".
AllocMusicHanSpeichert die Daten eines FM-Musikstücks in einer internen Datenstruktur und liefert ein Handle darauf. Das Musikstück kann später mit PlayMusicHan abgespielt werden. Sie müssen das Handle nach Gebrauch mit FreeMusicHan wieder freigegeben.
PlayMusicHanSpielt ein Musikstück im Vordergrund oder im Hintergrund ab. Das Musikstück wird durch ein Handle beschrieben, das von AllocMusicHan geliefert wurde.
StopMusicHanStoppt das Abspielen einer mit PlayMusicHan im Hintergrund gespielten Musik. StopMusicHan darf auch gerufen werden, wenn das durch "han" spezifizierte Musikstück nicht oder nicht mehr spielt.
FreeMusicHanGibt die von AllocMusicHan angelegte Datenstruktur frei.
Beispiel: Die Tonfolge "eefggfed_" wird mehrfach, aber mit verschiedener Geschwindigkeit, im Vordergrund abgespielt. Als Musikinstrument wird "Grand Piano" (Nummer 0) verwendet. |
DIM th1$ DIM h as handle th1$ = "eefggfed_" h = AllocMusicHan ( "i0" + th1$) PlayMusicHan h, 14, 0 PlayMusicHan h, 10, 0 PlayMusicHan h, 5, 0 StopMusicHan h FreeMusicHan h |
GetMusicTimeGetMusicTime ermittelt die Spielzeit eines FM-Musikstücks in Sekunden, wenn es mit dem angegebenen Tempo-Wert gespielt wird.Die Funktion GetMusicTime liefert immer die Zeit, die das Musikstück insgesamt spielt. Es ist egal, ob das Musikstück bereits zur Hälfte gespielt ist oder ob es überhaupt schon spielt.
|
DIM mh as Handle DIM longMusic$, t longMusic$ = ....' sehr viel Musik mh = AllocMusicHan ( longMusic$ ) PlayMusicHan mh, 14 PRINT "Sie hören jetzt "; GetMusicTime(mh); " Sekunden Musik." |
^2.10.4 Konfiguration der SoundlibraryDie Ausgabe von WAV- und FM-Sound wird von einer Library, der RabeSoft-Audio-Library, übernommen. Je nach Systemversion und nach installiertem Sound-Treiber kann die WAV- und FM-Sound Ausgabe möglich sein oder nicht. Zum Beispiel spielt die Sound.geo von GEOS 3.2 Wav-Dateien hörbar zu kurz ab. Die RS-Audio-Library verfügt sowohl über die Möglichkeit, diesen Fehler auszugleichen, als auch (durch Befragen des Nutzers) zu testen, ob dieser Ausgleich nötig ist. Deshalb bietet R-BASIC an, den entsprechenden Konfigurations-Dialog aufzurufen als auch den Konfigurationsstatus abzufragen.Sie können mithilfe der hier beschriebenen Befehle herausbekommen, ob auf dem System des Nutzers z.B. keine WAV-Dateien abgespielt werden können. Sie können dann stattdessen einen FM-Sound abspielen. Hinweise:
DoAudioConfigDoAudioConfig ruft den Konfigurationsdialog der RS-Audio-Library auf. Der User hat hier die Möglichkeit, zu testen, ob die WAV und die FM-Ausgabe funktioniert. Die Library merkt sich die Einstellungen in der GEOS.INI unter [Rabe-Soft diverses] "Audio".
Hinweis: Durch die Konfiguration der Library kann der User nicht verhindern, dass Sounds abgespielt werden. Er kann dem Programm nur mitteilen, ob bestimmte Sounds auf seinem System hörbar sind. Das bedeutet folgendes:
Wenn Sie in Ihrem Programm die Ausgabe von WAV und/oder FM-Sound verwenden sollten Sie im OnStartup-Handler folgende Zeile einbauen: |
DoAudioConfig FALSE |
|
Sie bewirkt, dass der Konfigurations-Dialog der RS-Audio-Library aufgerufen wird, falls die Library nicht oder nicht vollständig konfiguriert ist. Außerdem sollten Sie einen Menüpunkt "Audio-Library konfigurieren" anbieten, dessen Actionhandler folgendermaßen aussieht: |
Buttonaction ConfigureAudioLib DoAudioConfig TRUE End Action |
Damit hat der Nutzer die Möglichkeit, die Konfiguration der RS-Audio-Library nachträglich zu verändern, z.B. wenn er einen neuen Sound-Treiber ausprobiert.
GetAudioConfigDie Funktion GetAudioConfig liefert die vom Nutzer angegebenen Konfigurationsdaten, d.h. ob das System Wav- und FM-Sound unterstützt und ob die RS-Audio-Library vollständig konfiguriert ist. Sollte die RS-Audio-Library nicht oder nicht vollständig konfiguriert sein, so nimmt GetAudioConfig an, dass die nicht konfigurierten / getesteten Funktionen unterstützt werden.Sie können GetAudioConfig z.B. verwenden, um einen FM-Sound abzuspielen, falls die Wav-Ausgabe auf dem System des Users nicht unterstützt wird. Syntax: <numVar> = GetAudioConfig ( ) Der Rückgabewert von GetAudioConfig sind Bitflags. Die folgenden Werte sind definiert. Hier nicht aufgeführte Bits sind reserviert!
Hinweis: GetAudioConfig liefert die Konfigurationsdaten der RS-Audio-Library. Es führt selbst keinen Prüfungen durch.
|