Skip to content

Instantly share code, notes, and snippets.

@fantasywind
Last active August 25, 2016 21:19
Show Gist options
  • Save fantasywind/f9924c70bef80fde4cb3623d1029f61d to your computer and use it in GitHub Desktop.
Save fantasywind/f9924c70bef80fde4cb3623d1029f61d to your computer and use it in GitHub Desktop.
Javascript Audio Frequency Based Equalizer
// Sample of setting
// const setting = {
// left: [
// [50, 0],
// [1000, 0],
// [2000, 0],
// [4000, 0],
// [8000, 0],
// [12000, 0],
// [15000, 0],
// [18000, 1],
// ],
// right: [
// [50, 1],
// [1000, 0],
// [2000, 0],
// [4000, 0],
// [8000, 0],
// [12000, 0],
// [15000, 0],
// [18000, 0],
// ],
// };
function bindSetting(context, splitter, merger, set, right = true) {
const [
frequency,
gain,
] = set;
const filter = context.createBiquadFilter();
const gainNode = context.createGain();
filter.type = 'bandpass';
filter.Q.value = parseInt(filter.Q.maxValue, 10);
filter.frequency.value = frequency;
gainNode.gain.value = gain;
splitter.connect(filter, 1);
filter.connect(gainNode);
gainNode.connect(merger, 0, right ? 1 : 0);
}
export default function loadAudio(url, setting = {}) {
return new Promise((resolve, reject) => {
if (!Array.isArray(setting.left) || !Array.isArray(setting.right)) {
return reject(new Error('setting left and right should be array'));
}
const context = new AudioContext();
return fetch(url)
.then(response => response.arrayBuffer())
.then(response => context.decodeAudioData(response, audioBuffer => {
// Play Audio
const source = context.createBufferSource();
source.buffer = audioBuffer;
const splitter = context.createChannelSplitter(2);
const merger = context.createChannelMerger(2);
source.connect(splitter);
setting.left.forEach(set => bindSetting(context, splitter, merger, set, false));
setting.right.forEach(set => bindSetting(context, splitter, merger, set, true));
merger.connect(context.destination);
resolve(source);
}, e => reject(e))
).catch((ex) => reject(ex));
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment