{"id":"bass-pulse","version":"1.0.0","title":"Bass Pulse","summary":"A speaker cone kicks on every beat and rings of pressure race outwards, bending a neon grid. Loops perfectly.","kind":"background","target":"three","collections":["backgrounds","hypnotic-loops"],"tags":["bass","pulse","rings","speaker","sound","music","rhythm","shockwave","neon","loop","background"],"loopable":true,"motion":"procedural","durationSeconds":8,"status":"published","media":{"poster":"https://aipixelwizard.com/media/bass-pulse/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/bass-pulse/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/bass-pulse/1.0.0/sample.mp4","sampleBytes":3114336,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/bass-pulse","manifest":"https://aipixelwizard.com/api/v1/visuals/bass-pulse/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/bass-pulse/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/bass-pulse/1.0.0/","demo":"https://aipixelwizard.com/registry/bass-pulse/1.0.0/index.html"},"description":"A deep bass note made visible: at every beat the cone of a speaker at the centre kicks and a ring of pressure leaves it, racing outwards, thinning and fading, bending the neon grid of the floor behind it and splitting into its colours at its edge. Several rings are always in flight, so the whole screen throbs in rhythm. Choose the colours (neon, fire, ice or mono), the beats per loop, how many rings are in flight, their punch, thickness and decay, and how much the grid bends.","role":"Background (WebGL shader, full frame): a rhythmic, bass-heavy backdrop for music, club, gaming and title content.","useCases":["A music, DJ or club title background","A podcast or audio-product backdrop","A beat-synced game or app intro"],"synonyms":["sound waves","subwoofer pulse","pressure waves","audio visualiser","shockwave rings","beat rings"],"digest":"2d8e3029463a95c73d8797e65ab42f57f36a2521c0f39ca5968047b73953dd12","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/bass-pulse.js","exports":[{"name":"createBassPulse","signature":"createBassPulse({ beats?, rings?, palette?, punch?, thickness?, decay?, warp? }) => { scene, camera, setSize(width, height), update(time, loopSeconds), dispose() }","description":"The speaker, rings and grid as one full-screen shader; render its scene with its camera, ideally through createBloomPass."},{"name":"createBloomPass","signature":"createBloomPass(renderer, { width, height, glow?, exposure?, grain? }) => { render(scene, camera, output?), dispose() }","description":"A small bloom with filmic tone mapping."},{"name":"PALETTES","signature":"PALETTES: { neon, fire, ice, mono }","description":"Core, fringe and grid colours (sRGB hex)."}],"reusable":["src/bass-pulse.js"],"demo":"demo.js","harness":"index.html"},"dependencies":[{"id":"three","version":"0.185.1","scope":"source","reason":"Renderer, geometry and shader materials."},{"id":"apw-runtime","version":"1.0.0","scope":"demo","reason":"Demo harness."}],"uses":[],"usedBy":[],"params":[{"key":"beats","label":"Beats per loop","type":"integer","min":2,"max":16,"step":1,"default":8},{"key":"rings","label":"Rings in flight","type":"integer","min":3,"max":12,"step":1,"default":6},{"key":"palette","label":"Colours","type":"select","default":"neon","options":[{"value":"neon","label":"Neon"},{"value":"fire","label":"Fire"},{"value":"ice","label":"Ice"},{"value":"mono","label":"Mono"}]},{"key":"punch","label":"Punch","type":"number","min":0.5,"max":2,"step":0.05,"default":1},{"key":"thickness","label":"Ring thickness","type":"number","min":0.01,"max":0.08,"step":0.005,"default":0.025},{"key":"decay","label":"Decay","help":"How fast a ring fades.","type":"number","min":0.2,"max":1.2,"step":0.05,"default":0.6},{"key":"warp","label":"Grid bend","type":"number","min":0,"max":2,"step":0.05,"default":1}],"presets":[{"id":"default","label":"Neon, eight beats","params":{}},{"id":"fire","label":"Fire, heavy","params":{"palette":"fire","beats":4,"punch":1.4,"thickness":0.04}},{"id":"ice","label":"Ice, fast","params":{"palette":"ice","beats":12,"rings":9,"decay":0.9}},{"id":"mono","label":"Mono, wide rings","params":{"palette":"mono","thickness":0.06,"warp":1.6}}],"output":{"width":1080,"height":1080,"fps":30,"durationSeconds":8,"posterSeconds":1,"alpha":false,"motion":"procedural","loop":{"seamless":true,"cycleSeconds":8,"method":"Rings are born at every beat and a whole number of beats make a loop; ring i has age fract((beat + i) / rings), so the set of ring ages after the loop is the set before and everything else is a function of the beat's fractional part."},"seed":null},"composition":{"inputs":"Time within the loop; the beats, rings, colours, punch, thickness, decay and grid bend.","outputs":"A full frame, drawn by one shader on a full-screen quad.","coordinates":"Centred on the frame, 1 = the frame's half-height; rings travel out to 1.35.","lighting":"Self-lit; the bloom gives the glow.","timing":"update(time, loopSeconds) sets the loop phase; frames render in any order.","compatibleWith":["kinetic-title","number-reveal"],"notes":["Each ring is a Gaussian band whose centre is 1.35·(1 − (1 − a)^2.2), whose width grows with age a and whose brightness decays; red and blue are sampled slightly inside and outside it for the colour fringe."]},"reuse":["Club or DJ title: Neon, eight beats.","Heavy intro: Fire, heavy.","Product backdrop: Mono, wide rings."],"integration":{"newProject":"Create a WebGLRenderer, createBassPulse() and createBloomPass(renderer, { width, height }); call pulse.setSize(width, height), then each frame pulse.update(time, loopSeconds) and bloom.render(pulse.scene, pulse.camera).","existingProject":"Copy src/bass-pulse.js; render pulse.scene with pulse.camera into a render target (or through the bloom pass) as a backdrop."},"performance":{"notes":"One full-screen pass with up to twelve rings per pixel and a small bloom. A few milliseconds a frame at 1080p on an integrated Intel GPU.","limits":"Software WebGL renders in under a second a frame."},"limitations":["The rhythm is a regular count, not driven by audio.","The rings are circles in a plane, not a simulation of a pressure wave."],"license":{"spdx":"MIT","notice":"Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.","thirdParty":[]},"rights":{"approvedForPublicRelease":true},"provenance":"Adapted from the owner's threejs-sketches/audio-musical/bass-pulse (MIT) and rebuilt for AI Pixel Wizard in October 2026 as an original shader: beat-born rings with chromatic fringes bending a neon grid, a kicking speaker cone and an exact loop.","changelog":[{"version":"1.0.0","date":"2026-10-05","notes":"Initial release."}],"verification":{"testedOn":"2026-10-06","inputs":{"bass-pulse@1.0.0":"2d8e3029463a95c73d8797e65ab42f57f36a2521c0f39ca5968047b73953dd12","three@0.185.1":"664ca387e5fab46ff2daaa6895e1d015426850891af5ea5082cbbcc3985b068c","apw-runtime@1.0.0":"5be859cdac74823ba0bcc32c6daf06688a871104d24db5d4ceaffffd84d7c40d"},"environment":"Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0","renderer":"WebGL 2 via SwiftShader (software)","width":1080,"height":1080,"fps":30,"frames":240,"renderSeconds":193.1,"loopCheck":{"checked":true,"seamless":true,"maxDifference":0,"note":"Frame 0 vs end state (progress 1): mean |Δ| 0.0000, max |Δ| 0 of 255."},"determinism":{"checked":true,"identical":true},"errors":[],"media":{"poster":"/media/bass-pulse/1.0.0/poster.webp","preview":"/media/bass-pulse/1.0.0/preview.mp4","sample":"/media/bass-pulse/1.0.0/sample.mp4","sampleBytes":3114336}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/bass-pulse/1.0.0/LICENSE"},{"path":"asset.json","size":7741,"sha256":"b16275c97914dff1c2e50bea386ad4620c5b006cdc2fe7b1e5310220f1542485","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/bass-pulse/1.0.0/asset.json"},{"path":"demo.js","size":1028,"sha256":"b8d9c9b89fa0bbf96c7f022c87efa90695da4926625f6051f3ff4b49e5cb8e29","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/bass-pulse/1.0.0/demo.js"},{"path":"index.html","size":524,"sha256":"3a8c74ea5f357e0da65456f6eeca608bcaab1607a14f3d2289fe557cfce6d9db","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/bass-pulse/1.0.0/index.html"},{"path":"src/bass-pulse.js","size":11170,"sha256":"fddadfc39a38dce5607debf5c628f92fe0eb5cb2f2fd647c02063c19e8f4f933","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/bass-pulse/1.0.0/src/bass-pulse.js"}],"warnings":[]}