計算機科学のブログ

マルチメディアを学ぶ 音の再生、周波数の分析、フィルタをかける、Canvasへの描画

ハンズオンJavaScript (あんどうやすし(著)、オライリー・ジャパン)の15章(マルチメディアを学ぶ)、15.9(練習問題)の15-5の解答を求めてみる。

コード

let jscanvas = document.querySelector('#jscanvas'),
  ctx = jscanvas.getContext('2d'),
  soundBuffer,
  audioContext = new AudioContext();

fetch('./bulbul.mp3')
  .then(resp => resp.arrayBuffer())
  .then(buffer => audioContext.decodeAudioData(buffer))
  .then(buffer => {
    let source = audioContext.createBufferSource(),
      filter = audioContext.createBiquadFilter(),
      analyser = audioContext.createAnalyser();

    source.buffer = buffer;
    filter.type = 'lowpass';
    filter.frequency.value = 500;
    analyser.fftSize = 256;
    source
      .connect(filter)
      .connect(analyser)
      .connect(audioContext.destination);

    let bufferLength = analyser.frequencyBinCount,
      dataArray = new Uint8Array(bufferLength),
      height = 200,
      imageData = ctx.getImageData(0, 0, bufferLength, height),
      count = 0,
      draw = () => {
        analyser.getByteFrequencyData(dataArray);
        for (let i = 0; i < dataArray.length; i++) {
          for (let j = 0; j < 3; j++) {
            imageData.data[4 * (128 * count + i) + j] = dataArray[i];
          }
          imageData.data[4 * (128 * count + i) + 3] = 255;
        }
        if (count < height) {
          count++;
          requestAnimationFrame(draw);
        } else {
          ctx.putImageData(imageData, 0, 0);
        }
      };

    source.start(0, 0, 4);
    draw();
  });

Canvasに描画された画像