OSCILLA
warming the oscillators
scroll
cut-off freq. 50

OscillaM-1

A monophonic synthesiser that never existed — modelled, unwrapped and PBR-baked entirely from the Blender command line, then packed into one HTML file that assembles it, takes it apart, and plays it.

45,241triangles
208parts
18baked maps
0http requests
01 — The instrument

Walnut, aluminium
and forty-nine keys

860 × 490 × 395 mm of instrument that has never been manufactured, and never will be.

CaseAmerican walnut, mitred cheeks Fasciablack anodised aluminium, brushed Voicestruck string · or 3 × VCO through a ladder
02 — Exploded

Every part
knows where
it belongs

Each object carries its own separation vector, written by the script that placed it.

This is not an animation baked into a file. It is 208 vectors, evaluated live — the fascia lifts along its own normal, the keys travel with the keybed, and the pots stay behind the knobs they turn.

Separationper-part vector, authored in Blender Callouts3D positions projected to HTML each frame
03 — Inside

A clean cut
through the
whole thing

A clipping plane sweeps the outer shell away. Everything behind it was modelled too.

A 620 mm main board carrying a hundred and ninety components, the mains transformer, the keybed contact rail, six wiring looms swept along Bézier paths — and twenty-seven potentiometers, one for every knob you can turn.

Boardprocedurally routed copper on solder mask Loomtube-swept splines, three insulation colours
04 — Topology

Forty-five
thousand
triangles

Bevelled edges everywhere, because the highlight along a 1 mm chamfer is what makes a render read as a real object.

Nothing is smooth-shaded past 34°; the script marks its own sharp edges at export. Positions ship as float32, normals as int16, UVs as uint16.

Meshes76 unique · 208 placements Quantisedpos f32 · nrm i16 · uv u16
05 — Unwrap

Watch it come apart
in two dimensions

Every vertex knows two positions — where it sits in the world, and where it sits on its texture sheet. Nineteen sheets, exactly as Blender packed them.

06 — The bake

Clay, then rough,
then colour

Occlusion, then roughness, then base colour, then the tangent-space normals that carry the knurl — arriving in the order the renderer needs them.

07 — The fascia

The silkscreen
is not a
texture

Every label, every rule, all 297 tick marks are font curves converted to mesh and floated 0.35 mm above the aluminium.

The brushing is anisotropic roughness rather than a normal map — which is what brushed metal physically is. The occlusion pass includes the knobs, so each one sits in its own baked contact shadow.

Fascia2048² colour + AO/roughness pack TypeDIN Condensed, curve → mesh
08 — The keybed

Forty-nine
keys, cut
to fit

The white keys are not boxes. Each is a polygon solved against the black keys beside it.

The notch differs from C to D to E exactly as it does under your hands on a real keyboard. Every key pivots on its own rear edge.

Keys29 white · 20 black · per-key profile Dip2.4° about the rear edge
09 — Now play it

It actually makes a sound

drag any knob · click any key · flick the wheels · drag the background to orbit
space sustains · z / x shifts octave

10 — Patch cards

Five sounds,
one panel

Pick a card. Twenty-seven knobs turn themselves to the settings printed on the back of it, the panel is rewritten under your cursor, and the instrument plays what it just became.

Cut-off0
Emphasis0
Contour0
Attack0
Decay0
Space0
11 — Signal path

What happens
to a note

Press a key and it travels this chain, left to right, in about four milliseconds. Every stage is a knob you can reach on the fascia — the panel is not decoration, it is the diagram.

01

Oscillators

Three, each with range, waveform and detune, plus a noise source. Set them a few cents apart and the beating between them is the whole character.

02

Mixer

Levels and routing. Three switches decide what reaches the filter at all.

03

Ladder filter

Two cascaded poles, 24 dB per octave. Emphasis feeds it back into itself until it sings on its own.

04

Contour

Attack, decay, sustain, release — one envelope on the filter, one on the amplifier, and an amount knob deciding how much of it the filter hears.

05

Drive

A soft-clipping waveshaper, oversampled twice, for when the mixer is pushed harder than it should be.

06

Output

Tone tilt, a stereo delay for space, a limiter — and the analyser that draws the trace on the fascia.

12 — How it was made

Blender wrote
the instrument

No modelling. No sculpting. No texture painting. No .blend file anywhere in the repository — five Python files and blender -b -P main.py produce every triangle and every texel you have just scrolled through.

01

model.py

Case, fascia, keybed and internals built from tables of numbers — and the separation vector each part flies along.

02

mats.py

Walnut, brushed anodising, crinkle paint and solder mask, authored as shader node trees rather than images.

03

bake.py

Multi-object smart unwrap into one shared atlas per material, then Cycles bakes colour, roughness, occlusion and normals.

04

export.py

Quantised vertex buffers, per-part metadata and the control bindings that tie every knob to a parameter.

05

app.js

three.js, a hand-rolled post chain, ten scroll-linked acts and two synthesis engines.

06

build.mjs

Inlines three.js, GSAP, the quantised geometry and all eighteen textures as base64 into a single document.

13 — Specification

What is
actually here

Everything is generated. Nothing is downloaded. The page runs from a file:// URL on an aeroplane exactly as it runs from a server.

Geometry76 unique meshes · 208 placements · 45,241 triangles · 58,533 vertices, quantised to float32 positions and int16 normals
Textures18 maps baked in Cycles — 2048² fascia, 1536² walnut, 1024² knurl normal from a 20,000-triangle high-poly twin
Internals620 mm main board, 190 components, 27 potentiometers, mains transformer, keybed contact rail, six wiring looms
Renderingthree.js r170, procedural studio environment through PMREMGenerator, HDR pass → threshold bloom → ACES, chromatic aberration, vignette and grain in one composite shader
Piano voicepolyphonic · hammer transient, detuned string pair on a piano partial series, brightness envelope, two-stage decay, working dampers and a sustain pedal
Analogue voicemonophonic · three oscillators, noise, 24 dB/oct ladder, two contours, drive, stereo delay, glide and an LFO
Interaction27 knobs, 9 switches, 2 wheels and 49 keys, all raycast against the real geometry
14 — The numbers

One file,
no requests

The whole instrument — geometry, eighteen baked textures, three.js, GSAP and two synthesisers — inlined as base64 into a single document.

15 — Editions

If it were
ever built

It never was. These are the three it would have shipped as. The specification is real — every dimension, every component on that board exists in the model you have been scrolling through. The instrument is not, and neither are the prices.

Studio
£1,890

The instrument as drawn. Walnut cheeks, anodised fascia, forty-nine keys.

  • 3 × VCO · noise · ladder filter
  • Monophonic, 49 keys
  • American walnut, oiled
  • 2048² anodised fascia
Signature
£2,640

Adds the polyphonic struck-string voice and the flight case it should have come in.

  • Everything in Studio
  • Polyphonic struck-string engine
  • Sustain pedal and dampers
  • Fitted flight case
Collector
£4,200

Hand-numbered, brass fascia, and a service contract for an instrument that cannot break.

  • Everything in Signature
  • Brass fascia, hand-numbered
  • Matched oscillator set
  • Lifetime service

No instrument is for sale · no order can be placed · this is a rendering exercise