| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | export function createGain(context, value = 1) { |
| | const gain = context.createGain() |
| | gain.gain.setValueAtTime(value, context.currentTime) |
| | return gain |
| | } |
| |
|
| | |
| | |
| | |
| | export function createAnalyser(context, fftSize = 128) { |
| | const analyser = context.createAnalyser() |
| | analyser.fftSize = fftSize |
| | analyser.smoothingTimeConstant = 0.8 |
| | return analyser |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | export function createStemGraph(context, buffer, gainNode, masterGain) { |
| | const source = context.createBufferSource() |
| | source.buffer = buffer |
| | source.connect(gainNode) |
| | gainNode.connect(masterGain) |
| | return source |
| | } |
| |
|
| | |
| | |
| | |
| | export function fadeGain(gainNode, targetValue, duration = 0.05) { |
| | const now = gainNode.context.currentTime |
| | gainNode.gain.linearRampToValueAtTime(targetValue, now + duration) |
| | } |
| |
|
| | |
| | |
| | |
| | export function getFrequencyData(analyser) { |
| | const data = new Uint8Array(analyser.frequencyBinCount) |
| | analyser.getByteFrequencyData(data) |
| | return Array.from(data).map(v => v / 255) |
| | } |
| |
|
| | |
| | |
| | |
| | export function calculateRMS(audioData) { |
| | let sum = 0 |
| | for (let i = 0; i < audioData.length; i++) { |
| | sum += audioData[i] * audioData[i] |
| | } |
| | return Math.sqrt(sum / audioData.length) |
| | } |
| |
|
| | |
| | |
| | |
| | export function dbToGain(db) { |
| | return Math.pow(10, db / 20) |
| | } |
| |
|
| | |
| | |
| | |
| | export function gainToDb(gain) { |
| | return 20 * Math.log10(gain) |
| | } |
| |
|