Files
audio-ui/lib/audio/effects/gain.ts

53 lines
1.3 KiB
TypeScript
Raw Normal View History

/**
* 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);
}