Quiero que se reproduzca un tono de un oscilador debajo de un clip de audio de una canción. ¿Cómo hago para que el volumen de los tonos coincida con el volumen de la muestra? Quiero que el tono sea más bajo cuando la canción sea más baja y que el tono sea más fuerte en las partes más fuertes. He usado createAnalyzer para detectar el volumen de la muestra, pero el código no funciona.
const audioContext = new AudioContext(); const audiodiv = document.querySelector('.audiodiv') const buffer = audioContext.createBuffer( 1, audioContext.sampleRate * 1, audioContext.sampleRate ); const channelData = buffer.getChannelData(0) for (let i = 0; i < buffer.length; i++){ channelData[i] = Math.random() * 2 - 1; } const primaryGainControl = audioContext.createGain() primaryGainControl.gain.setValueAtTime(0.005, 0); primaryGainControl.connect(audioContext.destination); const samplebutton = document.createElement('button') samplebutton.innerText = 'sample' samplebutton.addEventListener('click', async () => { let volume = 0 const response = await fetch('testsong.wav') const soundBuffer = await response.arrayBuffer() const sampleBuffer = await audioContext.decodeAudioData(soundBuffer) const analyzer = audioContext.createAnalyser() volume = analyzer.frequencyBinCount const sampleSource = audioContext.createBufferSource() sampleSource.buffer = sampleBuffer sampleSource.playbackRate.setValueAtTime(1, 0) sampleSource.connect(primaryGainControl) sampleSource.start() }) audiodiv.appendChild(samplebutton) const toneButton = document.createElement('button') toneButton.innerText = "tone" toneButton.addEventListener("click", () => { const toneOscillator = audioContext.createOscillator(); toneOscillator.frequency.setValueAtTime(150, 0) toneOscillator.type = "sine" toneOscillator.connect(oscGain); toneOscillator.start() toneOscillator.stop(audioContext.currentTime + 5) const oscGain = audioContext.createGain() oscGain.gain.value = volume oscGain.connect(primaryGainControl) }) audiodiv.appendChild(toneButton)