
Übersicht
Einleitung
1. Grundlagen
2. Variablen
3. Schleifen
4. Entscheidungen
5. Struktur
6. Eingabe
7. Gfx-Grundlagen
8. Bilder anzeigen
9. Kollision
10. Sound & Musik
11. Dateien
12. Multiplayer

Spiele
Grafik
Mathe
Netzwerk
String
Verschiedenes
|
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...
Zu ChannelVolume und ChannelPitch hab ich auch noch ein kleines Beispielproggy
geschrieben: pitchvolume.zip - 52 KB
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:
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. Ein kleines Beispiel zu
ChannelPan gibts hier: ChannelPanDemo.zip - 114 KB
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:
Und lässt ihn danach wieder weiterspielen:
Will man einen Sound ganz stoppen und danach nicht wieder mit ResumeChannel weiterspielen,
nehme man StopChannel.
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.
Druckversion
|
|