# Adjusting volume with a slider

June 29, 1998
by Pat McClellan

Dear Multimedia Handyman,

I hope you don't mind but the user groups have not beeen able to help. You are my last hope. I want to be able to adjust volume through a slider mechanism. How do I do this?

Jared Fusedale

Jared,

It's a scary thought that I'm anybody's "last hope". Luckily, in this case I think I can help you out. Let's start with some definitions.

soundLevel is the volume level of the sound that is played through the computer's speaker. Setting range from a minimum of 0 (no sound) to a maximum of 7. soundLevel affects all channels of your programs sound.

volume of sound determines the volume of the sound channel which you specify (sound channels 1 to 8 -- with 1 and 2 being the channels appearing in the score.) In addition to being able to specifically affect a single sound channel, you also have a much greater range of dymamic control: from 0 (mute) to a maximum of 255. You can also use "the volume of member" for a SWA file and "the volume of sprite" for a digital video member.

Since "volume..." provides so much more control, I'll create a slider behavior which controls this. The properties we'll want to be able to set include whichChannel and the min and max of the slider's range. For example, if the slider's range happens to be 256 pixels, then there is a one-to-one correspondence between the slider's position and the volume level. However, it's not very likely that your slider will be exactly 256 pixels, so we'll build in the math necessary to make the conversion. Let's work out the math specifically.

The range of the slider needs to coincide with the range of the volume. So, we'll divide 256 (volume range) by the height of the slider trough. This gives us the amount that the volume will change for each pixel. Let's call that our deltaFactor. Now, multiply the change in locV of our slider knob by the deltaFactor to get volume. Here are the formulas -- NOT LINGO.

deltaFactor = 256/the height of the trough sliderChange = the bottom of trough - the locV of the slider knob volume = sliderChange * deltaFactor

For my demo movie, I created 2 tiny sound files (just over 100 bytes each) by using just a tiny bit of waveform and setting it to loop. (Thanks to Joe Sparks for the idea.) I'll set each of the tones up on a separate volume slider -- each using the same behavior -- but with different ranges. In this behavior, I'll make the assumption that the slider trough member is in the sprite channel just below the slider knob. For example, in my demo movie, slider 1's trough sprite is in channel 1, with the slider knob in channel 2. For the second slider, the sprites are in channels 3 and 4. This will allow us to automatically "grab" the range of the slider -- one less thing for you to worry about.

Now, let's write that behavior:

```
-- Volume Slider Behavior
-- assumes that the slider trough is in the
-- sprite channel just below the slider knob.
property pSoundChannel
property pRange
property pSliderBottom
property pDeltaFactor
property pMySprite
property pFlag
on getPropertyDescriptionList me
set pdlist to [¬
#pSoundChannel: [#comment:"Which Sound Channel",¬
#format:#integer,¬
#default:1,¬
#range:[#min:1,#max:8]] ]
return pdlist
end getPropertyDescriptionList
on beginSprite me
set pMySprite = the spriteNum of me
set myTroughSprite = pMySprite - 1
set pRange = the height of sprite myTroughSprite
put pRange
set pSliderBottom = the bottom of sprite ¬
myTroughSprite
set pDeltaFactor = 256/pRange
set pFlag = FALSE
end
on mouseDown me
set pFlag = TRUE
end
on mouseUp me
set pFlag = FALSE
end
on mouseUpOutside me
set pFlag = FALSE
end mouseUpOutside
on enterFrame me
if pFlag = TRUE then
if the mouseV <= pSliderBottom AND¬
the mouseV >= pSliderBottom - pRange then
set the locV of sprite pMySprite = the mouseV
end if
end if
end
set myLocV = the locV of sprite pMySprite
set sliderChange = pSliderBottom - myLocV
set the volume of sound pSoundChannel = ¬
sliderChange * pDeltaFactor
end

```
The only tricky part to this behavior stems from the fact that the the slider in my example goes from low to high, while the locV of the slider knob moves counter -- from high to low. This leads to some counter-intuitive math formulas. For example, for the tasks in the enterFrame handler to be executed, the mouseV must be less than the bottom of the slider trough and greater than the top of the trough. If you create a slider which is upside down, you'll need to change the signs in the formulas to accomodate.