Rob´s BB-Kurs 2

Sound und Musik


© Robert Gerlach 2001

www.robsite.de



In den letzten 9 Kapiteln haben wir soviel gelernt, dass wir schon ein kleines Spiel schreiben können, nur eins fehlt noch: Sound.
Wo man sich früher noch mit dem mickrigen Piepsen des eingebauten Lego-Lautsprechers begnügen musste, gibt es heute Dolby-Surround Pro Logic digital 5.1 Systeme mit 20 Lautsprechern und 1000 Watt Doppel-Subwoofern. Das ist toll. Und genau diese Sachen können wir mit Blitz Basic ansteuern. Ok, nicht alles davon, aber für Stereo-Lautsprecher reichts ^_^'.


Nun denn. Ab Version 1.36 sind neue Sound-befehle dazugekommen und ein paar alte wurden rausgeworfen, daher geh ich jetzt nur auf die neuen ein. Da selbst die Demo schon Version 1.60 erreicht hat dürfte das auch kein größeres Problem sein.

Seit v1.36 gibt es die Channel Befehle mit denen man Soundkanäle steuern kann. Man lädt also einen Sound von der Festplatte, weist ihm einen Speicherplatz zu (eine Variable) und wenn man ihn dann abspielt weist man ihm nochmal eine Channelvariable zu mit der man ihn dann verändern kann.
Das ganze nochmal genauer:

Mit


soundvariable = LoadSound("sound.wav")


lädt man einen Sound in den Speicher. Die Demoversion unterstützt .WAV und MIDI Dateien, mit der Vollversion kann man auch noch mp3, raw, x3m u.s.w benutzen, mit dem LoadSound Befehl kann man allerdings nur .wav und .mp3 laden.
Nun haben wir also unseren Sound im Speicher und können ihn abspielen indem wir folgendes schreiben:


channel = PlaySound(soundvariable)


Der Sound wird nun gespielt und mit der channel-Variable können wir ihn verändern. Zuerst aber noch ein paar Soundkommandos die man öfters mal braucht:


; Um in den Loop-Modus zu schalten (den Sound also immer wieder abzuspielen), schreibe man:
LoopSound sound
; Es wird allerdings nur in den Modus geschaltet, den Sound abspielen muss man immernoch mit PlaySound.


; Um einen nicht mehr gebrauchten Sound aus dem Speicher zu löschen:
FreeSound sound


Gut. Nun können wir also Sound laden und abspielen. Das ganze würde dann in etwa so aussehen:


sound = LoadSound("sound.wav")
kanal = PlaySound(sound)


Ganz einfach. Man kann den Sound aber auch noch verändern, in Geschwindigkeit und Lautstärke. Dazu gibt es die Channel-Befehle.


ChannelVolume kanal, volumen#


Mit ChannelVolume kann man die Lautstärke eines Sounds bestimmen. Sie geht von 0 (Stille) bis 1 (volle Laustärke), also sollte man dazu am besten eine Float-Variable nehmen, denn sonst könnte man ja nur zwischen 1 und 0 wechseln (bei Integer --> Ganzzahlen).

Eine zweite Möglichkeit den Sound zu manipulieren hat man mit ChannelPitch:


ChannelPitch kanal, frequenz


Die Frequenz nennt man auch Samplerate, sie liegt meist bei 44100 oder 22050. Die Samplerate ist die Anzahl der Schwingungen pro Sekunde. Hat eine Sounddatei eine höhere Samplerate (44100 oder mehr) hat sie somit auch eine bessere Qualität. In etwa so wie eine höhere Auflösung bei einem Bild.
Hat nun ein Sound eine Samplerate von 44100 und setzt man diese mittels ChannelPitch auf 88200, wird er doppelt so schnell abgespielt, bei 22050 dann halb so schnell u.s.w...
Das ganze kann man z.B. gut einsetzen um ein Auto zu simulieren. Bei schnellerer Fahrt wird das Motorengeräusch höher und im Leerlauf ganz langsam. Auch kann man so mit sehr wenig Speicher sehr lange Hintergrundgeräusche erzeugen. Man nehme irgendein einfaches Soundfile in dem z.B. Gesprochen wird, verlangsame es so dass nur noch sehr tiefe Geräusche zu hören sind und man hat... tiefe Hintergrundgeräusche (für ein Horrorspiel...) über eine lange Zeit hinweg die zudem noch sehr wenig Platz wegnehmen...

Da an den meisten Computer Stereo- oder bessere Lautsprecher hängen, kann man das mit BB nutzen um feine Effekte zu erzeugen. Z.B. Sounds die von einem zum anderen Lautsprecher wandern, je nach dem von wo ein Gegner kommt links oder rechts den Sound abspielen u.s.w. Dazu gibt es den ChannelPan-Befehl:

ChannelPan(kanal, pan)


Wobei pan für folgendes steht:
-1 - Linker Lautsprecher.
0  - Direkt in der Mitte, beide Lautsprecher.
1  - Rechter Lautsprecher.

pan muss dann natürlich wieder eine Float-Variable sein.


Es gibt aber noch mehr. Man kann z.B. prüfen ob ein bestimmter Sound gerade abgespielt wird:


If ChannelPlaying(kanal) = 1 Then
  Print "Sound wird gerade gespielt"
Else ; Wenn ChannelPlaying 0 zurückgibt
  Print "Sound wird nicht gespielt..."
EndIf


Oder man hält die Wiedergabe eines Soundkanals kurz mal an:


PauseChannel(kanal)


Und lässt ihn danach wieder weiterspielen:


ResumeChannel(kanal)


Will man einen Sound ganz stoppen und danach nicht wieder mit ResumeChannel weiterspielen, nehme man StopChannel.


StopChannel(kanal)


Bis jetzt ging es nur um Sounds. Man kann aber auch sehr einfach Hintergrundmusik abspielen:


kanal = PlayMusic("music.mid")


PlayMusic lädt die Musikdatei (nur .wav und .mid) und spielt sie sofort im Loop-Modus ab. Mp3 geht auch, nur nicht auf jedem Rechner. Sollte man also lieber weglassen oder optional anbieten (auswählen lassen, vorher testen)...


Nun haben wir alle wichtigen Soundkommandos durch, nur einer fehlt noch. Man kann nämlich auch Musik direkt von CD spielen. Das ist was sehr feines. Man muss z.B. bei einem auf CD ausgelieferten Spiel nicht so viel auf die Festplatte kopieren oder man kann den Spieler/Anwender seine Lieblingsmusik im Hintergrund spielen lassen. Dazu wirft man einfach eine CD ins CD-Laufwerk ein und schreibe:


kanal = PlayCDTrack(Nummer [,Modus])


Die Nummer gibt die Liednummer an, der Modus folgendes:

  1 - Diesen Track genau einmal abspielen.
  2 - Diesen Track immer abspielen (Loop-Modus).
  3 - Bis CD-Ende spielen.

Eigentlich müsste so alles funktionieren, macht es aber nicht immer. Hat man z.B. als Laufwerk D einen Brenner (in den man die CD nicht legt) und als Laufwerk E das CDROM-Laufwerk, könnte es vorkommen dass das ganze nicht abgespielt wird, denn BB sucht erstmal im ersten Laufwerk (D) und nicht im zweiten. Also sollte man das ganze auch nur als Option anbieten...
ChannelPitch kannm man natürlich auch nciht darauf anwenden, denn die Sounddaten werden ja mit iener festen Geschwindigkeit übertragen. Die CD müsste entsprechende schneller oder langsamer ausgelesen werden, was... sehr schwer ist und irgendwann auch nicht mehr geht (wenn man einen Sound sehr schnell abspielen will).





Zusammenfassung


; Einen Sound in den Speicher laden:
sound = LoadSound("sound.wav")


; Einem Sound einen Kanal zuweisen und ihn abspielen:
kanal = PlaySound(sound)


; In den Loop-Modus schalten:
LoopSound sound


; Einen Sound aus dem Speicher löschen:
FreeSound sound


; Die Lautstärke eines Sounds festlegen (0 bis 1):
ChannelVolume kanal, volume


; Die Geschwindigkeit eines Sounds (aber nciht eines CD-Tracks) legt man so fest:
ChannelPitch kanal, frequenz ; Frequenz: 44100 oder 22050 sind Standard.


; Gibt eine 1 zurück wenn ein Sound gespielt wird, sonst 0:
ChannelPlaying(kanal)


; Um einen Sound zu pausieren:
PauseChannel kanal


; Um ihn wieder weiterzuspielen:
ResumeChannel kanal


; Um ihn ganz zu stoppen:
StopChannel kanal


; Sozusagen als Kombination aus LoadSound, PlaySound und LoopSound, nur bei .mid und .wav, für Musik:
kanal = PlayMusic("musik.mid")


; Für das abspielen eines CD-Tracks:
kanal = PlayCDTrack(Nummer [,Modus])
; Modus: 1 - Diesen Track einmal spielen.
;        2 - Diesen Track loopen.
;        3 - Bis zum Ende der CD spielen.


Das wars ^_^. Weiter gehts mit Dateien und wie man mit ihnen arbeitet.