The data type used internally to store
value is a single-precision
point numbers. As a result, the value you read from the
value property may
not always exactly equal what you set it to.
Consider this example:
const source = new AudioBufferSourceNode(/* … */); const rate = 5.3; source.playbackRate.value = rate; console.log(source.playbackRate.value === rate);
The log output will be
false, because the playback rate parameter,
rate, was converted to the 32-bit floating-point number closest to 5.3,
which yields 5.300000190734863. One solution is to use the
value specified—when setting
value, like this:
const source = new AudioBufferSourceNode(/* … */); const rate = Math.fround(5.3); source.playbackRate.value = rate; console.log(source.playbackRate.value === rate);
In this case, the log output will be
value of an
AudioParam can either be fixed or can vary
over time. This is reflected by the
value getter, which returns the value
of the parameter as of the audio rendering engine's most recent render
quantum, or moment at which audio buffers are processed and updated. In
addition to processing audio buffers, each render quantum updates the
AudioParam as needed given the current time and any established
time-based parameter value changes.
Upon first creating the parameter, its value is set to its default value, given by
AudioParam.defaultValue. This is the parameter's value at a time of 0.0
seconds, and will remain the parameter's value until the first render quantum in which
the value is altered.
During each render quantum, the browser does the following things related to managing the value of a parameter:
valuesetter has been used, the parameter's value is changed to the value given.
If the current time equals or exceeds the time specified by a previous call to
valueis changed to the value passed into
If any graduated or ramped value changing methods have been called and the current
time is within the time range over which the graduated change should occur, the value
is updated based on the appropriate algorithm. These ramped or graduated
value-changing methods include
value of a parameter is maintained to accurately reflect the
state of the parameter over time.
This example instantly changes the volume of a
GainNode to 40%.
const audioCtx = new AudioContext(); const gainNode = audioCtx.createGain(); gainNode.gain.value = 0.4; // which is identical to: gainNode.gain.setValueAtTime(0.4, audioCtx.currentTime);
|Web Audio API |
BCD tables only load in the browser
When changing the gain value of a
GainNode, Google Chrome prior to
version 64 (January 2018) would perform a smooth interpolation to prevent dezippering.
Starting with version 64, the value is changed instantly to bring it in line with the
Web Audio spec. See Chrome Platform Status for details.