Sound effects behave differently on level 8

From DoomWiki.org

Revision as of 17:15, 15 November 2005 by Fraggle (talk | contribs)


Normally in Vanilla Doom, sound effects decrease in volume with distance, with a cutoff at 1200 units. Sound effects originating at a distance of more than 1200 units from the player are not heard.

This behavior is different on level 8. This affects level 8 when playing under any episode of Doom 1 as well as MAP08 of Doom 2 and Final Doom.

When playing on level 8, sound effects are not cut off. Furthermore, the effect of distance on volume is reversed. Close sound effects are quiet while sound effects at a distance are loud.

As the Boss levels in Doom 1 all occur on level 8, it is possible that this behavior was intended so that the player could always hear the boss monster from any distance.

Demonstrating the effect

The effect varies depending on the sound effect volume setting, and is more pronounced at low values To demonstrate it:

  1. Start Doom and warp to level 8 (mission 8 of any episode or MAP08).
  2. Go to the sound menu and move the sound effect volume slider to minimum.
  3. The effect should be immediately noticable in that sound effects at even a short distance can be heard despite the volume setting being at zero.

One demonstration can be performed by firing a rocket at a distant wall. The rocket will be heard hitting the wall but will not be heard when fired.

Technical

The cause of this is found in s_sound.c in the Doom source code:

// From _GG1_ p.428. Appox. eucledian distance fast.
approx_dist = adx + ady - ((adx < ady ? adx : ady)>>1);

if (gamemap != 8
  && approx_dist > S_CLIPPING_DIST)
{
    return 0;
}

This code calculates the distance of the sound from the player. If the sound is greater than the clipping distance (1200 units), the function returns and the sound does not play. However, a specific test is made to see if the current level is level 8. If so, there is no distance cutoff.

// volume calculation
if (approx_dist < S_CLOSE_DIST)
{
    *vol = snd_SfxVolume;
}
else if (gamemap == 8)
{
    if (approx_dist > S_CLIPPING_DIST)
        approx_dist = S_CLIPPING_DIST;
    *vol = 15+ ((snd_SfxVolume-15)
              *((S_CLIPPING_DIST - approx_dist)>>FRACBITS))
                    / S_ATTENUATOR;
}
else
{
    // distance effect
    *vol = (snd_SfxVolume
            * ((S_CLIPPING_DIST - approx_dist)>>FRACBITS))
           / S_ATTENUATOR; 
}

This is the code which decreases the volume of sound effects with distance. A different calculation is used here for level 8: infact, the effect of distance is reversed. Sounds increase in volume with distance.

The effect is dependent on the player's sfx volume setting. If the volume is set to maximum, all sound effects always play at maximum volume. The distance effect is more pronounced at lower volumes. At the minimum value, sound effects at a great distance (more than 1200 units) are played at the sound card's maximum volume.