const audioSrc = [
'./assets/1.wav',
'./assets/2.wav'
];
const audioContext = new AudioContext();
const getAudioBuffer = (src) => {
return new Promise((resolve, reject) => {
fetch(src).then(response => response.arrayBuffer()).then(arrayBuffer => {
audioContext.decodeAudioData(arrayBuffer).then(buffer => {
resolve(buffer);
});
})
})
}
const arrBufferList = await Promise.all(audioSrc.map(src => getAudioBuffer(src)));
const concatAudio = (arrBufferList) => {
const audioBufferList = arrBufferList;
const maxChannelNumber = Math.max(...audioBufferList.map(audioBuffer => audioBuffer.numberOfChannels));
const totalLength = audioBufferList.map((buffer) => buffer.length).reduce((lenA, lenB) => lenA + lenB, 0);
const newAudioBuffer = audioContext.createBuffer(maxChannelNumber, totalLength, audioBufferList[0].sampleRate);
let offset = 0;
audioBufferList.forEach((audioBuffer, index) => {
for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {
newAudioBuffer.getChannelData(channel).set(audioBuffer.getChannelData(channel), offset);
}
offset += audioBuffer.length;
});
return newAudioBuffer;
}
const mergeAudio = (arrBufferList) => {
const audioBufferList = arrBufferList;
const maxDuration = Math.max(...audioBufferList.map(audioBuffer => audioBuffer.duration));
const maxChannelNumber = Math.max(...audioBufferList.map(audioBuffer => audioBuffer.numberOfChannels));
const newAudioBuffer = audioContext.createBuffer(maxChannelNumber, audioBufferList[0].sampleRate * maxDuration, audioBufferList[0].sampleRate);
audioBufferList.forEach((audioBuffer, index) => {
for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {
const outputData = newAudioBuffer.getChannelData(channel);
const bufferData = audioBuffer.getChannelData(channel);
for (let i = audioBuffer.getChannelData(channel).length - 1; i >= 0; i--) {
outputData[i] += bufferData[i];
}
newAudioBuffer.getChannelData(channel).set(outputData);
}
});
return newAudioBuffer;
}
const audioContext = new AudioContext();
const gainNode = audioContext.createGain();
gainNode.gain.value = 0.2;
gainNode.connect(audioContext.destination);
let source = audioContext.createBufferSource();
source.buffer = mergeAudio(arrBufferList);
source.connect(gainNode);
source.start(0);
console