/** * Gain/Volume adjustment effect */ import { getAudioContext } from '../context'; /** * Apply gain to an audio buffer * @param buffer - Source audio buffer * @param gainValue - Gain multiplier (1.0 = no change, 0.5 = -6dB, 2.0 = +6dB) * @returns New audio buffer with gain applied */ export function applyGain(buffer: AudioBuffer, gainValue: number): AudioBuffer { const audioContext = getAudioContext(); const outputBuffer = audioContext.createBuffer( buffer.numberOfChannels, buffer.length, buffer.sampleRate ); // Apply gain to each channel for (let channel = 0; channel < buffer.numberOfChannels; channel++) { const inputData = buffer.getChannelData(channel); const outputData = outputBuffer.getChannelData(channel); for (let i = 0; i < buffer.length; i++) { outputData[i] = inputData[i] * gainValue; // Clamp to prevent distortion outputData[i] = Math.max(-1, Math.min(1, outputData[i])); } } return outputBuffer; } /** * Convert dB to gain multiplier * @param db - Decibels * @returns Gain multiplier */ export function dbToGain(db: number): number { return Math.pow(10, db / 20); } /** * Convert gain multiplier to dB * @param gain - Gain multiplier * @returns Decibels */ export function gainToDb(gain: number): number { return 20 * Math.log10(gain); }