pyxen.Sound

Ein kurzer Audioclip, der einem Entity als Komponente angehängt wird.

Sounds werden vollständig in den Speicher geladen — verwende sie für kurze Effekte wie Sprünge, Treffer und Einsammelgeräusche.

Audio-Konzepte findest du unter Audio.


Konstruktor

Sound(filename, *, volume=1.0, pan=0.0, loop=False, delay=0.0, pitch=1.0)

filename ist das einzige Positionsargument: der Name eines WAV-Audio-Assets im Projekt. Die anderen fünf sind reine Schlüsselwortargumente und setzen den Startwert der gleichnamigen Eigenschaft (siehe Komponenteneigenschaften).


Parameter

ParameterTypBeschreibung
filenamestrName des WAV-Assets, ohne Endung; ein Sound in einer Sound-Bank heißt bank/sound
volumefloatStart-Lautstärke. Standard 1.0
panfloatStart-Stereoposition, -1.0 bis 1.0. Standard 0.0
loopboolBeim Ende neu starten. Standard False
delayfloatSekunden Stille vor dem Start. Standard 0.0
pitchfloatWiedergabegeschwindigkeit, 0.25 bis 4.0. Standard 1.0

Beispiel

jump_sound = Sound("jump")
quiet_echo = Sound("jump", volume=0.3, delay=0.15)
high_jump = Sound("jump", pitch=2.0)

Einen Sound anhängen

Beim Spawn:

sfx = world.spawn(sound=Sound("jump"))

Oder nachträglich:

entity.sound = Sound("jump")

Das Zuweisen eines Sounds startet die Wiedergabe sofort.


Komponenteneigenschaften

Zugriff über entity.sound:

EigenschaftTypL/SBeschreibung
loopboolL/SSchleife aktivieren
volumefloatL/SLautstärke (begrenzt >= 0.0)
panfloatL/SStereo-Panning (-1.0 bis 1.0)
timefloatR/WAktuelle Wiedergabeposition (Sekunden)
delayfloatR/WSekunden Stille vor dem Start
pitchfloatR/WWiedergabegeschwindigkeit (0.25 bis 4.0)
durationfloatLGesamtlänge (Sekunden)
finishedboolLTrue wenn Wiedergabe abgeschlossen

loop

entity.sound.loop = True

Wenn aktiviert, startet der Sound nach dem Ende automatisch neu.


volume

entity.sound.volume = 0.5

Werte unter 0.0 werden auf 0.0 begrenzt.


pan

entity.sound.pan = -1.0  # ganz links
entity.sound.pan =  1.0  # ganz rechts
entity.sound.pan =  0.0  # Mitte

Begrenzt auf den Bereich -1.0 bis 1.0.


time

t = entity.sound.time
entity.sound.time = 0.25     # überspringt die erste Viertelsekunde

Die Wiedergabeposition in Sekunden. Eine Zuweisung springt an diese Stelle; Werte hinter dem Ende werden auf das Ende begrenzt, und ein beendeter Ton läuft danach wieder.


delay

entity.sound.delay = 0.002   # startet in zwei Millisekunden

Sekunden Stille, bevor der Ton startet. Anders als bei time wird nichts übersprungen — der Ton beginnt weiterhin bei seinem ersten Sample, nur später.

Das ist das Mittel der Wahl, wenn derselbe Effekt mehrfach in einem Frame ausgelöst wird. Kopien einer Wellenform, die auf demselben Sample beginnen, addieren sich phasengleich: zwei ergeben die doppelte Amplitude, nicht das 1,4-Fache, und zehn treiben jede Mischung über die Vollaussteuerung. Ein paar Millisekunden Abstand genügen, um sie zu dekorrelieren, und sind viel zu kurz, um als Lücke hörbar zu sein.

Eine Verzögerung trennt die Attacks und hilft daher vor allem bei kurzen perkussiven Effekten; bei einem gehaltenen Ton bewirkt sie nichts.


pitch

entity.sound.pitch = 2.0     # eine Oktave höher
entity.sound.pitch = 0.5     # eine Oktave tiefer

Wie schnell der Sound abgespielt wird: 1.0 wie aufgenommen, 2.0 eine Oktave höher und in der halben Zeit, 0.5 eine Oktave tiefer und doppelt so lang. Werte werden auf 0.25 bis 4.0 begrenzt, zwei Oktaven in jede Richtung. Ein Sound mit steigender Tonhöhe ergibt eine Tonleiter, also braucht eine Kette oder eine Serie einen Sound, nicht einen pro Note:

def on_match(step):
    world.spawn(sound=Sound("match", pitch=1 + 0.12 * step))

time und duration bleiben in den Sekunden des Sounds selbst: Bei pitch 2.0 spielt ein einsekündiger Sound eine halbe Sekunde, während sein time von 0.0 bis 1.0 läuft.


duration

d = entity.sound.duration

Nur lesbar. Gesamtlänge des Sounds in Sekunden, wie aufgenommen (unabhängig von pitch).


finished

if entity.sound.finished:
    world.destroy(entity)

Nur lesbar. True wenn der Sound fertig abgespielt wurde (und loop False ist).


Format

Sound-Assets müssen WAV-Dateien sein.


Häufige Fehler

Fehlender Dateiname

Sound()
ValueError: Sound must have a file

Ungültiges Asset

Sound("nonexistent")
ValueError: Sound 'nonexistent' not found. For sounds inside a sound bank, use 'bank/sound'.

Das Spiel hält mit diesem Fehler an. Gib den Asset-Namen ohne die Endung .wav an; ein Sound aus einer Soundbank heißt bank/sound.