Bassalt
A lava lamp, hour-long warm-up included, for Resolume

What it does
An FFGL effect for Resolume Arena and Avenue. The frame is a lava lamp and nothing in it is animated. The wax, its heat and the flow are fields on a grid measured in metres, with all their constants out in the open. A bulb in the base heats wax that's a little denser than the water above it when cold. Wax expands with heat about three times faster than water, so above a crossover temperature it's the lighter of the two and it rises. At the cap it cools, gets denser again and sinks.
The wax is a Cahn–Hilliard phase field, and its interface carries surface tension. The heat is advected and conducted, fed in by the bulb through the base and lost through the glass and, even more, through the metal cap. The flow is Darcy's law in a Hele-Shaw cell (which is what a thin, flat lamp the shape of the frame is), solved every step by multigrid as a streamfunction, so it's divergence-free by construction.
What comes out of that is what a lamp does. A hot layer under cold water is Rayleigh–Taylor unstable, and surface tension picks the one wavelength that grows fastest, so the wax leaves the base as pillars all the same size, which neck and pinch off. A cold lamp is a slab that has to melt from the coil up. At 1× that takes an hour, same as a real one, which is why there's a Speed control. Too much bulb and all the wax pools at the cap; too little and it never leaves the base. Salt moves the crossover 11.3 K per per cent.
The name is the lamp's two controls. Bass drives the bulb, through the bulb's own thermal lag, so a heavy bass section warms the lamp and a breakdown lets it settle, and kicks put a pulse of heat into the base. Salt is what lamp makers dissolve in the water to set its density against the wax.
Your clip can go through it two ways. Behind puts the world behind the lamp: wax (n = 1.44) in water (1.34) is a lens, so every round blob shows a little upside-down picture, and a Cylinder glass magnifies across its middle by Snell's law. Dyed makes the clip the wax itself, carried, stretched and pinched by the flow. Pour turns the clip's bright parts into wax, and Clip Heat lets its bright regions melt.
- A heat engine, not an animation: Cahn–Hilliard wax, advected heat and Hele-Shaw flow solved by multigrid
- Bulb, bulb lag and coil; salt, wax amount, surface tension, wax viscosity and melting point
- Warm-up from a cold slab at real speed, or Warm to jump to the hot lamp; Speed to 300×
- Audio: bass drives the bulb through its lag, kicks put heat into the base
- Behind: every blob a lens, through a flat panel or a cylinder. Dyed: the clip as the wax
- Pour the clip's bright parts in as wax; Clip Heat lets bright regions melt
- Temperature, Wax, Velocity and Density views, for the model on its own
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.1, and early days. It fixes v0.1.0's boiling portrait lamp and its wax dissolving into the water. The lamp is measured against the physics by tools/verify.sh: a level lamp at rest stays at rest to the bit, a neutral blob's spurious currents stay small and die away, the wax is conserved to 6e-7 through minutes of convection, a blob stops at the crossover to 4e-6 K and salt moves it 11.3 K per per cent, the GPU's flow solve matches an exact CPU solve, a blob rises at the Hele-Shaw speed, Rayleigh–Taylor fingers grow at the rates the law gives, every joule the bulb puts in is accounted for, and the cylinder glass bends the world by Snell's law. It catches fourteen models that are wrong on purpose and a one-character change to the shipped shaders, and all 30 controls change the picture. It costs about 2 ms a frame at 1080p on macOS at the default Speed. It hasn't been loaded into Resolume on either platform yet, and the Windows DLL is built by MSVC in CI and nothing has ever run it. It's a flat lamp (a thin Hele-Shaw gap), not a round one, surface tension stops at 10 mN/m, Speed's 300× is really about 70× once the lamp is convecting, and there's no latent heat. No real audio has reached it in a host, so how it reads Resolume's 64-bin FFT is still an assumption. There's a browser demo, which is a port rather than the plugin, but no OpenFX port and no user guide. Try it in your own rig before you trust it in a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead