Home › Kategorie 05

🔊 Sound & Musik

BEGINNER ⏱ ~20 Min

Warum Sound wichtig ist

Sound ist ein wesentlicher Teil des Spielerlebnisses. Gutes Audio-Design kann ein Spiel von "ok" zu "großartig" machen. Arcade bietet ein einfaches aber mächtiges Sound-System, das auf pyglet basiert.

🎵 Musik

Hintergrundmusik via Streaming. Große Dateien werden nicht komplett in den RAM geladen.

💥 Sound Effects

Kurze Sounds (Schüsse, Münzen, Schritte). Werden statisch geladen für schnelle Wiedergabe.

🎚️ Kontrolle

Lautstärke, Geschwindigkeit, Pan, Loop – vollständige Kontrolle über die Wiedergabe.

Wellenform-Visualizer – Spiele und sieh den Sound
Freq: 440Hz
Lautstärke: 80%

⚠️ Lautstärke vorher prüfen! Nutzt Web Audio API für echte Soundausgabe.

Sounds laden & abspielen

PYTHON – Grundlegendes Sound-System
def setup(self):
    # Sounds laden (einmal beim Start)
    self.coin_sound = arcade.load_sound(
        ":resources:sounds/coin1.wav"
    )
    self.jump_sound = arcade.load_sound(
        ":resources:sounds/jump1.wav"
    )
    self.hurt_sound = arcade.load_sound(
        ":resources:sounds/hurt1.wav"
    )
    self.gameover_sound = arcade.load_sound(
        ":resources:sounds/gameover1.wav"
    )

def on_update(self, delta_time):
    # Münzen einsammeln
    coins_hit = arcade.check_for_collision_with_list(
        self.player, self.coin_list
    )
    for coin in coins_hit:
        coin.remove_from_sprite_lists()
        # Sound abspielen
        arcade.play_sound(self.coin_sound)

def on_key_press(self, key, modifiers):
    if key == arcade.key.UP:
        if self.physics_engine.can_jump():
            self.player.change_y = 20
            arcade.play_sound(self.jump_sound)

Wiedergabe-Kontrolle

PYTHON – Erweiterte Kontrolle
# play_sound() gibt einen Player zurück
my_player = arcade.play_sound(
    sound=self.explosion_sound,
    volume=0.5,        # 0.0 - 1.0
    pan=0.0,           # -1.0 (links) bis 1.0 (rechts)
    loop=False,        # Sound wiederholen?
    speed=1.0          # Wiedergabegeschwindigkeit
)

# Sound stoppen
arcade.stop_sound(my_player)

# Lautstärke während Wiedergabe ändern
my_player.volume = 0.3

# Prüfen ob Sound noch läuft
if my_player.playing:
    print("Sound läuft noch")

# Räumlicher Sound (Stereo Pan basierend auf Position)
def play_spatial_sound(self, sound, source_x):
    # Pan berechnen: -1 (links) bis 1 (rechts)
    screen_center = 400
    pan = (source_x - screen_center) / screen_center
    pan = max(-1.0, min(1.0, pan))  # Begrenzen
    arcade.play_sound(sound, pan=pan)
⚠️ Performance-Tipp: Lade Sounds einmal in setup() und spiele sie beliebig oft ab. Niemals load_sound() in on_update() aufrufen!

Musik-Streaming

Für lange Musikstücke verwendet man Streaming – die Datei wird nicht komplett in den RAM geladen, sondern stückchenweise abgespielt.

PYTHON – Musik
def setup(self):
    # Musik als Streaming laden (streaming=True)
    self.background_music = arcade.load_sound(
        ":resources:music/funkyrobot.mp3",
        streaming=True  # Für große Musikdateien
    )
    # Musik starten
    self.music_player = arcade.play_sound(
        self.background_music,
        volume=0.3,
        loop=True       # Endlos wiederholen
    )

def toggle_music(self):
    # Musik pausieren/fortsetzen
    if self.music_player.playing:
        self.music_player.pause()
    else:
        self.music_player.play()

def change_level_music(self, new_music_path):
    # Alte Musik stoppen
    arcade.stop_sound(self.music_player)
    # Neue Musik laden und starten
    self.background_music = arcade.load_sound(new_music_path, streaming=True)
    self.music_player = arcade.play_sound(
        self.background_music, volume=0.3, loop=True
    )

Formate & Audio-Backends

FormatTypEmpfehlungKompatibilität
.wavUnkomprimiertSound Effects✅ Überall
.oggKomprimiert, Open SourceMusik & SFX✅ Fast überall
.mp3KomprimiertMusik⚠️ Meistens
.flacLosslessHochqualität⚠️ Backend-abhängig
💡 Empfehlung: Nutze .wav für kurze Sound-Effects (garantiert auf allen Plattformen) und .ogg für Musik (gute Komprimierung, Open Source, breite Unterstützung).
PYTHON – Backend auswählen
# Audio-Backend explizit setzen (vor import arcade)
import os
os.environ["ARCADE_SOUND_BACKEND"] = "ffmpeg"  # oder "openal", "pyglet"
import arcade

# Verfügbare Backends:
# "pyglet"  - Standard, breite Formatunterstützung
# "ffmpeg"  - Maximale Formatunterstützung (ffmpeg muss installiert sein)
# "openal"  - Low-latency, gut für 3D-Audio

Built-in Sounds & Musik

Arcade liefert eine Sammlung von Sound-Effects und Musik mit, die sofort genutzt werden können:

PYTHON – Eingebaute Assets
# Sound Effects
":resources:sounds/coin1.wav"      # Münze aufheben
":resources:sounds/coin2.wav"
":resources:sounds/coin3.wav"
":resources:sounds/coin4.wav"
":resources:sounds/coin5.wav"
":resources:sounds/hurt1.wav"      # Schaden
":resources:sounds/hurt2.wav"
":resources:sounds/hurt3.wav"
":resources:sounds/hurt4.wav"
":resources:sounds/jump1.wav"      # Springen
":resources:sounds/jump2.wav"
":resources:sounds/jump3.wav"
":resources:sounds/jump4.wav"
":resources:sounds/jump5.wav"
":resources:sounds/gameover1.wav"  # Game Over
":resources:sounds/gameover2.wav"
":resources:sounds/gameover3.wav"
":resources:sounds/gameover4.wav"
":resources:sounds/gameover5.wav"
":resources:sounds/explosion1.wav" # Explosion
":resources:sounds/laser1.wav"     # Laser
":resources:sounds/laser2.wav"

# Musik
":resources:music/1918.mp3"
":resources:music/funkyrobot.mp3"