{"id":"chladni-plate","version":"1.0.0","title":"Chladni Plate","summary":"A metal plate shaken at the pitch of a note, sand running into fine lines and lattices, then thrown and settling into the next figure. Loops perfectly.","kind":"background","target":"three","collections":["satisfying","backgrounds","hypnotic-loops"],"tags":["chladni","cymatics","sand","vibration","resonance","standing wave","sound","physics","pattern","metal plate","satisfying","loop","background"],"loopable":true,"motion":"procedural","durationSeconds":15,"status":"published","media":{"poster":"https://aipixelwizard.com/media/chladni-plate/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/chladni-plate/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/chladni-plate/1.0.0/sample.mp4","sampleBytes":12034785,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/chladni-plate","manifest":"https://aipixelwizard.com/api/v1/visuals/chladni-plate/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/chladni-plate/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/chladni-plate/1.0.0/","demo":"https://aipixelwizard.com/registry/chladni-plate/1.0.0/index.html"},"description":"The classic experiment of Ernst Chladni, as a quietly hypnotic loop: a square brass (or steel, or copper) plate lies under a soft sliding light, clamped by a bolt at its middle. Each note it is shaken at makes the plate move in some places and stand still along lines; the sand on it runs from the moving places to the still ones and draws the figure. Every few seconds the note changes: the plate is shaken hard, the sand is thrown across it and runs again into a new, more or less intricate figure of lines, crossings and lattices, until the loop comes back to the first. Choose the look (brass, steel, copper or glowing neon sand), how many figures a loop holds, how intricate they are, how much sand there is and how big its grains, how wide the bands are, how violently it is thrown, how much the metal shimmers and the seed that picks the figures.","role":"Background (WebGL, full frame): a calm, scientific, satisfying loop for music, sound, physics and meditation content.","useCases":["A backdrop for ambient, drone and electronic music","A physics or acoustics explainer on standing waves and resonance","A meditation, sound-healing or science title scene"],"synonyms":["cymatics","chladni figures","chladni patterns","sound visualisation","sand on a vibrating plate","resonance patterns","nodal lines","acoustic patterns"],"digest":"5fe5b44a93067851c05cea7b7ad07776c6cabc2d0e44169ae646f6d6f91bf51d","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/chladni-plate.js","exports":[{"name":"createChladniPlate","signature":"createChladniPlate({ look?, modes?, order?, grains?, grainSize?, spread?, shake?, shimmer?, seed? }) => { scene, camera, sequence, setSize(width, height), update(time, loopSeconds), dispose() }","description":"The plate, its table and bolt on a full-screen quad and the sand as points moved by a vertex shader: render its scene with its camera after setSize and update, 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: draws a scene to the canvas with its glow."},{"name":"planModes","signature":"planModes({ count?, order?, seed? }) => [n, m, sign][]","description":"The figures of a loop: modes cos(nπx)cos(mπy) + sign·cos(mπx)cos(nπy), more intricate as order rises, none repeated."},{"name":"LOOKS","signature":"LOOKS: { brass, steel, copper, neon }","description":"Plate, sand and table colours (sRGB hex) for each look."}],"reusable":["src/chladni-plate.js"],"demo":"demo.js","harness":"index.html"},"dependencies":[{"id":"three","version":"0.185.1","scope":"source","reason":"Renderer, the plate shader, the sand points and the bloom targets."},{"id":"apw-runtime","version":"1.0.0","scope":"demo","reason":"Demo harness."}],"uses":[],"usedBy":[],"params":[{"key":"look","label":"Look","type":"select","default":"brass","options":[{"value":"brass","label":"Brass and sand"},{"value":"steel","label":"Steel and salt"},{"value":"copper","label":"Copper and sand"},{"value":"neon","label":"Glowing neon sand"}]},{"key":"modes","label":"Figures","help":"How many different notes (figures) one loop holds.","type":"integer","min":2,"max":5,"step":1,"default":3},{"key":"order","label":"Intricacy","help":"How fine the figures are: higher notes draw more lines.","type":"integer","min":1,"max":6,"step":1,"default":3},{"key":"grains","label":"Sand","help":"The number of grains: finer figures need more.","type":"integer","min":10000,"max":100000,"step":5000,"default":26000},{"key":"grainSize","label":"Grain size","type":"number","min":0.6,"max":1.6,"step":0.05,"default":1},{"key":"spread","label":"Band width","help":"How wide the bands of sand are round the lines.","type":"number","min":0.4,"max":2,"step":0.05,"default":1},{"key":"shake","label":"Shake","help":"How violently the sand is thrown between figures.","type":"number","min":0,"max":1.6,"step":0.05,"default":1},{"key":"shimmer","label":"Shimmer","help":"How much the metal shimmers with the vibration.","type":"number","min":0,"max":1.5,"step":0.05,"default":0.6},{"key":"seed","label":"Seed","type":"integer","min":1,"max":999,"step":1,"default":7}],"presets":[{"id":"default","label":"Brass plate, three figures","params":{}},{"id":"steel","label":"Salt on steel, four figures","params":{"look":"steel","modes":4,"order":4,"grains":60000,"seed":12}},{"id":"copper","label":"Copper lattices","params":{"look":"copper","order":6,"grains":80000,"grainSize":0.8,"seed":31}},{"id":"neon","label":"Glowing neon sand","params":{"look":"neon","modes":4,"order":4,"grains":50000,"spread":1.2,"seed":5}},{"id":"gentle","label":"Gentle low notes","params":{"modes":2,"order":1,"grains":25000,"grainSize":1.3,"shake":0.6,"seed":2}}],"output":{"width":1080,"height":1080,"fps":30,"durationSeconds":15,"posterSeconds":4.5,"alpha":false,"motion":"procedural","loop":{"seamless":true,"cycleSeconds":15,"method":"Each figure owns an equal share of the loop; every grain's place is a formula of the position in the loop (its walk to the nearest line is a fixed number of steps), the hop of the grains is a sine of whole cycles per loop and the light slides as a sine of the loop, so the last frame meets the first."},"seed":{"param":"seed","behavior":"Seed picks which figures the loop holds and where every grain starts for each note: same seed, same figures."}},"composition":{"inputs":"Time within the loop; the look, the number and intricacy of the figures, the amount and size of the sand, the width of its bands, the shake, the shimmer and the seed.","outputs":"A full frame: the plate and its table drawn by one shader, the sand as points drawn over it.","coordinates":"The plate is a square centred on the frame, 86 % of its height wide, with coordinates 0 … 1 across; the bolt is at its middle. Each figure is the zero set of cos(nπx)cos(mπy) + s·cos(mπx)cos(nπy).","lighting":"Self-lit: a soft light from the upper left with a band of light that slides over the brushed metal once per loop; the neon look glows and blooms.","timing":"update(time, loopSeconds) sets the loop phase; frames render in any order.","compatibleWith":["kinetic-title","number-reveal"],"notes":["For each note a grain starts at a hashed place and takes 20 regularised Newton steps along the slope of the vibration towards the nearest zero of the figure; the grain then moves from its start to that rest by a smooth easing. Nothing is simulated, so any frame renders alone.","Each note: the plate is shaken (first 5 % of its time), a tenth of the sand is thrown to random places in the air (to 10 %) and runs to the lines (to 42 %); the rest fades out where it lay and fades in near the new lines; then everything rests until the next note.","A few grains stop short on the way and the bolt in the middle keeps the sand off."]},"reuse":["Ambient music backdrop: Brass plate, three figures.","Physics explainer on resonance: Salt on steel.","Sound or tech title: Glowing neon sand."],"integration":{"newProject":"Create a WebGLRenderer, createChladniPlate() and createBloomPass(renderer, { width, height }); call plate.setSize(width, height), then each frame plate.update(time, loopSeconds) and bloom.render(plate.scene, plate.camera).","existingProject":"Copy src/chladni-plate.js; render plate.scene with plate.camera into a render target (or through the bloom pass) as the backdrop of your scene."},"performance":{"notes":"One full-screen pass for the plate and 26 000 sand points, each walking 20 steps in its vertex shader, then a small bloom. About 7 ms a frame at 1080p on an integrated Intel GPU.","limits":"Software WebGL (no GPU) renders in a second or so a frame; more than about 100 000 grains costs more than it shows."},"limitations":["The figures are the ideal modes of a plate (cosines), not a simulation of a real clamped plate.","The sand is drawn as round points a few pixels wide, so very high intricacy with little sand looks sparse: raise the sand with the intricacy.","The transitions (sand in the air, lines forming) are the costly frames to encode: a loop with more figures or much more sand makes a much larger video."],"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/webgpu-chladni-plate and physics-simulation/chladni-patterns (MIT) and rebuilt for AI Pixel Wizard in October 2026 as an original scene: every grain's place a formula of the time (no particle simulation), figures chosen and sequenced by a seed, an exact loop, a bolted brushed-metal plate and the frame/time contract.","changelog":[{"version":"1.0.0","date":"2026-10-05","notes":"Initial release."}],"verification":{"testedOn":"2026-10-06","inputs":{"chladni-plate@1.0.0":"5fe5b44a93067851c05cea7b7ad07776c6cabc2d0e44169ae646f6d6f91bf51d","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":450,"renderSeconds":1031.3,"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/chladni-plate/1.0.0/poster.webp","preview":"/media/chladni-plate/1.0.0/preview.mp4","sample":"/media/chladni-plate/1.0.0/sample.mp4","sampleBytes":12034785}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/chladni-plate/1.0.0/LICENSE"},{"path":"asset.json","size":11479,"sha256":"d9ce56057ece7043e50ba0dfa9eb2bd2ecf6014a19963a7fc74b7b0cb14ccfaf","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/chladni-plate/1.0.0/asset.json"},{"path":"demo.js","size":1237,"sha256":"bd6ecbfa2726dc024e6a5eb30491da393538c41b1392b6e303d9c81dfc8154e9","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/chladni-plate/1.0.0/demo.js"},{"path":"index.html","size":527,"sha256":"0e724d5bf09a5fe98276b8273709f7bc2f905af9206cff72ea1184f485debd53","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/chladni-plate/1.0.0/index.html"},{"path":"src/chladni-plate.js","size":23274,"sha256":"bb562e5b6d8311ed12b8ef887abef261014fd73a825151c0d747f7564933e5c1","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/chladni-plate/1.0.0/src/chladni-plate.js"}],"warnings":[]}