Sabine
Sabine is built for architecture and acoustics practices around one idea: a room is an instrument before it is a space. A real WebGL2 FDTD wave solver propagates sound through an RGBA16F pressure field against genuine Schroeder diffuser geometry, and reverberation time is computed live with the actual Sabine and Eyring equations — the same math run server-side and in the browser. CSS scroll timelines pace the reveal, and the build ships with no third-party JS.
Open live preview ↗
Highlights
- The background is a sound field, not a picture of one. A single fixed WebGL2 canvas sits behind the WHOLE document — not a hero widget that exists on the front page and nowhere else — integrating the 2D acoustic wave equation <code>d²p/dt² = c²∇²p</code> by finite-difference time-domain leapfrog, with the Courant number held at 0.5 against the 1/√2 limit the scheme has in two dimensions. It is never torn down between sections
- The boundaries carry real absorption coefficients, so the physics is what you see: a rigid wall returns the wave inverted and standing waves build between parallel surfaces — the flutter echo that makes a bad room bad — while an anechoic boundary returns nothing and the field simply goes quiet. Five rooms: shoebox, fan plan with a curved rear wall, a quadratic-residue diffuser whose well depths are <code>n² mod 7</code> (the real Schroeder sequence, and genuinely why such a wall is built in that pattern), anechoic chamber, barrel vault
- What is drawn is the pressure GRADIENT rather than the pressure — a schlieren reading. That is both what a real photograph of sound in air images, which is why pictures of sound are thin bright wavefronts on a dark ground, and the reason the field stays dark enough almost everywhere to carry body text. An earlier pass drew the pressure directly at high gain: correct physics, unusable as a background
- Scrolling deforms the room instead of switching it. Sections declare <code>data-room</code> and <code>data-level</code>, and the two rooms currently on screen are blended by the fraction of the viewport each covers, so the boundary is always partway between them and the same wave carries across the join into the new shape — which is not something a per-section widget can do
- It refuses rather than degrades where degrading would lie. Pressure is signed, small and fed back into itself every step, so in eight bits it quantises and the Laplacian amplifies that into a fixed reticulated pattern within seconds; the solver therefore demands RGBA16F and falls back to a composed static ground without <code>EXT_color_buffer_float</code>. Capability tiers pick the grid, a live frame-time watchdog overrules them, and the loop stops when the tab is hidden
- The reverberation figures are computed, not quoted: published octave-band absorption coefficients run through Sabine’s own <code>RT60 = 0.161V/A</code> and through Eyring’s correction, by the same two equations in PHP on the server and live in the browser. BOTH are always shown, because Sabine over-predicts in an absorptive room — a known limitation of the equation the practice is named after — and the gap between the two is itself a reading of how dead the room has become
- On a project page the interactive bench is seeded from THAT building’s own recorded dimensions, brief and surface schedule, so a visitor is handed the actual room and invited to change it, rather than a generic hall that would be quietly describing a different building. Room modes and the Schroeder frequency come off the same numbers
- A layout archetype found nowhere else in the catalogue: the octave-band grid — eight columns with a persistent frequency tick rail, the measure the whole trade reads by. No section is allowed to paint over the field; every one is transparent and text sits on glass scrims. Newsreader over Space Grotesk, self-hosted, Latin subset
- Not one third-party JavaScript library — no Three.js, no GSAP, no jQuery dependency. Four scripts, all written for this theme. Entrances are native CSS scroll-driven animations declared only inside <code>@supports</code>, so the resting state of every element is visible with scripts blocked, without scroll timelines and under reduced motion
Overview
Sabine is built for the practice that decides how a building will sound before it exists: an architectural acoustics consultancy taking on concert halls, opera houses, studios, teaching rooms, places of worship, workplaces and transport buildings. It assumes what is being sold is a judgement about air in a room, not a photograph of the room.
The signature is not a shader that looks like sound. One fixed WebGL2 canvas sits behind the entire document — every page, not a hero — and integrates the 2D acoustic wave equation d²p/dt² = c²∇²p by finite-difference time-domain leapfrog. The Courant number is held at 0.5, comfortably inside the 1/√2 limit the scheme has in two dimensions, past which the field does not merely look wrong but diverges to infinity within a few dozen frames. The canvas is never torn down between sections.
Because the boundaries carry real absorption coefficients, the physics is what you see. A rigid wall returns the wave inverted and standing waves build between parallel surfaces — the flutter echo that makes a bad room bad. An anechoic boundary returns nothing and the field goes quiet. Five rooms are built into the solver: a shoebox hall, a fan plan with a curved rear wall, a quadratic-residue diffuser whose well depths follow n² mod 7 — the real Schroeder sequence, and genuinely why such a wall is built in that pattern rather than as decorative relief — an anechoic chamber, and a barrel vault.
What is drawn is the pressure gradient rather than the pressure. That is a schlieren reading: it is what a real photograph of sound in air images, which is why pictures of sound are thin bright wavefronts on a dark ground, and it is what leaves the field dark enough almost everywhere to carry body text.
Sections declare which room they want and how bright the field should be behind their particular copy, and the two rooms currently on screen are blended by the fraction of the viewport each covers. Scrolling therefore deforms the room the wave is already travelling in, rather than cutting from one scene to another — which is not something a per-section widget can do.
The numbers are computed rather than quoted, by the same two equations in PHP on the server and live in the browser, off the same table of published octave-band absorption coefficients. Sabine’s own RT60 = 0.161V/A and Eyring’s correction are both shown, always, because Sabine over-predicts in an absorptive room; that is a known limitation of the equation the practice is named after, and the gap between the two figures is itself a reading of how dead the room has become. Room modes and the Schroeder frequency come off the same measurements. On a project page the interactive bench is seeded from that building’s own recorded dimensions, brief and surface schedule, so the visitor is handed the actual room.
The layout archetype is the octave-band grid: eight columns with a persistent frequency tick rail, the measure the whole trade reads by. No section is allowed to paint over the field — every one is transparent and text sits on glass scrims. Newsreader over Space Grotesk, self-hosted. Not one third-party JavaScript library is bundled, and entrances are native CSS scroll-driven animations declared only inside @supports, so every element’s resting state is visible with scripts blocked and under reduced motion.
Content types cover projects, sectors and services, with the volume, surface area, dimensions, seat count, design target, measured RT60 and surface schedule recorded per commission — every field an input to the acoustics, none of it stored for decoration — plus a journal and a private enquiry inbox.
What's included
- Full theme source — every template, style sheet & script
- One-click demo importer (idempotent, no page builder)
- Live Customizer controls for copy, colours & content
- Translation-ready .pot file + RTL stylesheet
- HTML documentation + a CHANGELOG file
- Lifetime updates + 6 months support (renewable)
Specifications
| WordPress | 5.6 – 7.0 |
|---|---|
| PHP | 8.0 – 8.3 |
| Browsers | Chrome, Firefox, Safari, Edge (latest) |
| Layout | Fully responsive, mobile → desktop |
| Localization | Translation-ready · RTL included |
| Accessibility | Keyboard-navigable · prefers-reduced-motion |
| Page builder | Not required — native Customizer |
| License | GNU GPL v2 · single-site commercial |
Release
The complete, dated version history ships in the theme’s CHANGELOG file. Every purchase includes lifetime access to future updates.