| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| 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) |
| } |
|
|