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