From the “bing” of a coin box in Super Mario Bros to the reveal chimes of the Zelda series, sound effects provide a powerful mechanism for informing the player of what is happening in your game world.
SoundEffect Class
MonoGame represents sound effects with the SoundEffect
class. Like other asset types, we don’t normally construct this directly, we rather load it through the content pipeline. Usually, a sound effect will start as a .wav file, though a handful of other file formats are acceptable.
Once loaded, the SoundEffect
can be played with the SoundEffect.Play()
method. This is essentially a fire-and-forget method - you invoke, it and the framework takes care of loading and playing the sound.
You can also use the SoundEffect.Play(float volume, float pitch, float pan)
to customize the playback:
volume
ranges from $ 0.0 $ (silence) to $ 1.0 $ (full volume)pitch
adjusts the pitch from $ -1.0 $ (down an octave) to $ 1.0 $ (up an octave), with $ 0.0 $ indicating no changepan
pans the sound in stereo, with $ -1.0 $ entirely on the left speaker, and $ 1.0 $ on the right, and $ 0.0 $ centered.
Note that the per-sound-effect volume is multiplied by the static SoundEffect.MasterVolume
property. This allows for the adjustment of all sound effects in the game, separate from music.
Note that if you invoke Play()
on a sound effect multiple frames in a row, it will start playing another copy of the sound effect on each frame. The result will be an ugly mash of sound. So be sure that you only invoke Play()
once per each time you want to use the sound!
SoundEffectInstance Class
If you need finer control of your sound effects, you can also create a SoundEffectInstance
from one with: SoundEffect.CreateInstance()
. This represents a single instance of a sound effect, so invoking its Play()
method will restart the sound from the beginning (essentially, SoundEffect.Play()
creates a SoundEffectInstance
that plays and disposes of itself automatically).
The SoundEffectInstance
exposes properties that can be used to modify its behavior:
IsLooped
is a boolean that when set to true, causes the sound effect to loop indefinitely.Pan
pans the sound in stereo, with $ -1.0 $ entirely on the left speaker, and $ 1.0 $ on the right, and $ 0.0 $ centered.Pitch
adjusts the pitch from $ -1.0 $ (down an octave) to $ 1.0 $ (up an octave), with $ 0.0 $ indicating no changeVolume
ranges from $ 0.0 $ (silence) to $ 1.0 $ (full volume)State
returns aSoundState
enumeration value, one of (SoundState.Paused
,SoundState.Playing
, orSoundState.Stopped
)
The SoundEffectInstance
also provides a number of methods:
Play()
plays or resumes the sound effectPause()
pauses the sound effectResume()
resumes a paused sound effectStop()
immediately stops the sound effect (so when started it starts from the beginning)Stop(bool immediate)
also stops the sound effect, immediately iftrue
, or its authored release phase, i.e. a fade, iffalse
Perhaps the strongest reason for creating a SoundEffectInstance
is to be able to crate positional sound. We’ll discuss this next.