function mixToOverlay(audioBuffer1, audioBuffer2) {
const silenceDuration = 3;
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const silentBuffer = audioContext.createBuffer(
1,
audioBuffer1.sampleRate * silenceDuration,
audioBuffer1.sampleRate
);
const silentChannelData = silentBuffer.getChannelData(0);
const totalLength =
silentChannelData.length + audioBuffer1.length + silentChannelData.length;
const mergedChannelData = new Float32Array(totalLength).fill(0);
mergedChannelData.set(silentChannelData, 0);
mergedChannelData.set(
audioBuffer1.getChannelData(0),
silentChannelData.length
);
mergedChannelData.set(
silentChannelData,
silentChannelData.length + audioBuffer1.length
);
const overlayBuffer = audioContext.createBuffer(
1,
totalLength,
audioBuffer1.sampleRate
);
overlayBuffer.getChannelData(0).set(mergedChannelData);
const mixedLength = Math.min(overlayBuffer.length, audioBuffer2.length);
const mixedChannelData = new Float32Array(mixedLength);
for (let i = 0; i < mixedLength; i++) {
mixedChannelData[i] =
overlayBuffer.getChannelData(0)[i] + audioBuffer2.getChannelData(0)[i];
}
const mixedBuffer = audioContext.createBuffer(
1,
mixedLength,
audioBuffer2.sampleRate
);
mixedBuffer.getChannelData(0).set(mixedChannelData);
return mixedBuffer;
}