# Sound Effects

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 change
• pan 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.

### 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 change
• Volume ranges from $0.0$ (silence) to $1.0$ (full volume)
• State returns a SoundState enumeration value, one of (SoundState.Paused, SoundState.Playing, or SoundState.Stopped)

The SoundEffectInstance also provides a number of methods:

• Play() plays or resumes the sound effect
• Pause() pauses the sound effect
• Resume() resumes a paused sound effect
• Stop() immediately stops the sound effect (so when started it starts from the beginning)
• Stop(bool immediate) also stops the sound effect, immediately if true, or its authored release phase, i.e. a fade, if false

Perhaps the strongest reason for creating a SoundEffectInstance is to be able to crate positional sound. We’ll discuss this next.