es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El nodo BiquadFilterNode (API de Audio Web) aumenta gradualmente su volumen.

Tengo un problema con BiquadFilterNode (Web Audio API).
Hice un programa de audio simple que repite ruido cada barra.
El problema es cuando conecto un BiquadFilterNode al ruido, su volumen sigue aumentando gradualmente.
¿Podría alguien amablemente señalar por qué está sucediendo el aumento gradual de volumen?
¡Muchas gracias!

Página web que ejecuta el programa:

https://abirdwhale.github.io/javascript-web-audio-api-sketches/sequencers/test-biquadfilter-issue/

Repositorio de GitHub para recrear el problema:

https://github.com/abirdwhale/javascript-web-audio-api-sketches/tree/main/sequencers/test-biquadfilter-issue

HTML:

<!-- <!DOCTYPE html> -->
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="css/app.css">
</head>
<body>
    <button id="play-button">Play/Pause</button>
    <script type="module" src="js/app.js"></script>
</body>
</html>

JavaScript:

"use strict";

// para el navegador cruzado
const AudioContext = window.AudioContext || window.webkitAudioContext;
const audioCtx = new AudioContext();

let futureTickTime = audioCtx.currentTime;
let counter = 1;
let tempo = 120;
let secondsPerBeat = 60 / tempo;
let counterTimeValue = (secondsPerBeat / 4); // nota de 16

// Volumen de ruido
let noiseVolume = audioCtx.createGain();
noiseVolume.gain.value = 0.001; // Volumen de ruido antes de enviar a FX

// Parámetros de ruido
let noiseDuration = 1.; // Duración del ruido
let bandHz = 100;

function playNoise(time, playing) {
  if (playing) {
    const bufferSize = audioCtx.sampleRate * noiseDuration; // establecer el tiempo de la nota
    const buffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate); // crear un búfer vacío
    const data = buffer.getChannelData(0); // obtener datos

    // llenar el búfer con ruido
    for (let i = 0; i < bufferSize; i++) {
      data[i] = Math.random() * 2 - 1;
    }

    // crear una fuente de búfer para nuestros datos creados
    const noise = audioCtx.createBufferSource();
    noise.buffer = buffer;

    const bandpass = audioCtx.createBiquadFilter();
    bandpass.type = 'bandpass';
    bandpass.frequency.value = bandHz;

    // conectar nuestro gráfico
    noise.connect(noiseVolume);
    // 1. sin un filtro de bandpass
    // noiseVolume.connect(audioCtx.destination);
    // 2. con un filtro de bandpass
    noiseVolume.connect(bandpass).connect(audioCtx.destination);
    if (counter === 1) {
      noise.start(time);
      // noise.stop(time + noiseDuration);
    }
  }
}

const lookahead = 25.0; // con qué frecuencia llamar a la función de programación (en milisegundos)
const scheduleAheadTime = 0.1; // cuánto programar el audio (seg)

function playTick() {
  console.log("Esta nota de dieciseisavos es: " + counter);
  console.log("16º es: " + counterTimeValue);
  console.log("futureTickTime: " + futureTickTime);
  console.log("Web Audio Time: " + audioCtx.currentTime);
  counter += 1;
  futureTickTime += counterTimeValue;
  console.log("futureTickTime: " + futureTickTime);

  if (counter > 16) {
    counter = 1;
  }
}

function scheduler() {
  if (futureTickTime < audioCtx.currentTime + scheduleAheadTime) {
    playNoise(futureTickTime, true);
    playTick();
  }
  window.setTimeout(scheduler, lookahead);
}

scheduler();

document.getElementById("play-button").addEventListener("click", function () {

  if (audioCtx.state !== "running") {
    console.log("no funciona bien");
    audioCtx.resume();
  } else {
    console.log("funciona");
    audioCtx.suspend();
    console.log(audioCtx.state);
  }
});
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con BiquadFilterNode probablemente se deba al hecho de que ha establecido el valor de ganancia del noiseVolume a un valor muy bajo (0.001). Cuando conecta el ruido a BiquadFilterNode, es posible que el filtro esté amplificando la señal, lo que resulta en el aumento gradual del volumen que está experimentando.

    Para solucionar el problema, puede intentar aumentar el valor de ganancia del noiseVolume o ajustar la configuración de frecuencia del filtro. También puede experimentar con diferentes tipos de filtros para ver si afectan el aumento de volumen.

    Además, asegúrese de verificar que todas sus conexiones sean correctas y que no haya otros nodos en su gráfico de audio que puedan estar afectando la señal.

Comments are closed.