canvas+webgl实现三维shader驱动的音乐立体空间效果代码

代码语言:html

所属分类:三维

代码描述:canvas+webgl实现三维shader驱动的音乐立体空间效果代码,可拖动旋转切换视角,墙上流体动画。

代码标签: canvas webgl 三维 shader 驱动 音乐 立体 空间

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  

  
</head>

<body>
  
  
      <script  >
const choose = a => a[Math.floor(Math.random() * a.length)];
const speeds = [.8];
const resont = [.9];
const volmns = [1];
const options = {
  volume: choose(volmns),
  resonance: choose(resont),
  speed: choose(speeds) };


let shaderTime = 0;
let pan = 0;
const Composer = () => {

  let context,
  main, verb, bus, compressor;

  const trigger = Object.freeze({
    trig: function () {
      let prev = 0;
      let t = false;
      return function (val) {
        t = prev < 0 && val >= 0;
        prev = val;
        return t;
      };
    },
    change: function () {
      let prev = 0;
      let t = false;
      return function (val) {
        t = prev != val;
        prev = val;
        return t;
      };
    },
    pulse: function (threshold) {
      let prev = 0;
      let t = false;
      return function (b) {
        if (b) prev++;
        if (prev == threshold) {
          t = true;
          prev = 0;
        } else {t = false;}
        return t;
      };
    },
    skip: function (n) {
      let count = n;
      return function (b) {
        return count++ % n == 0;
      };
    } });


  const lowTrig = trigger.trig();
  const highTrig = trigger.trig();
  const bassTrig = trigger.trig();
  const lowChanged = trigger.change();
  const bassChanged = trigger.change();
  const highChanged = trigger.change();
  const roots = [21, 23, 24, 26, 28, 30];

  let b = Float32Array.from({ length: 24 }, () => Math.random() < .25 ? Math.random() * 2 - 1 : 0);
  let m = [0, 4, 0, 9, 0, 4, 9];
  let root = pickItem(b[1], 0, 20, roots);

  function loop() {
    main.gain.value = dbamp(lerp(options.volume, 0, 1, -60, 3));
    compose();
    setTimeout(() => loop(), expInterp(options.speed, 0, 1, 800, 80));
  }

  function compose() {

    options.resonance = .2 + .8 * (1. - Math.abs(pan));

    for (let i = 0; i < b.length; i++) {
      b[i] = -Math.min(b[mod(i + 3, b.length)], Math.random() * 2 - 1);
    }


    if (lowTrig(b[21])) {
      const note = pickNote(b[21], 15, 35);
      if (lowChanged(note)) {
        sine(
        midicps(note),
        pickVolume(1 - Math.abs(pan), -24, -9),
        pan);

      }
    }

    {
      const note = pickNote(b[11], 20, 25);
      if (highChanged(note)) {
        tri(
        midicps(note),
        pickVolume(b[12], -24, -9),
        b[13]);

      }
      sine(
      midicps(pickNote(b[11], 15, 35)),
      pickVolume(1 - Math..........完整代码请登录后点击上方下载按钮下载查看

网友评论0