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.
Walnut, aluminium
and forty-nine keys
860 × 490 × 395 mm of instrument that has never been manufactured, and never will be.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
Mixer
Levels and routing. Three switches decide what reaches the filter at all.
Ladder filter
Two cascaded poles, 24 dB per octave. Emphasis feeds it back into itself until it sings on its own.
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.
Drive
A soft-clipping waveshaper, oversampled twice, for when the mixer is pushed harder than it should be.
Output
Tone tilt, a stereo delay for space, a limiter — and the analyser that draws the trace on the fascia.
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.
model.py
Case, fascia, keybed and internals built from tables of numbers — and the separation vector each part flies along.
mats.py
Walnut, brushed anodising, crinkle paint and solder mask, authored as shader node trees rather than images.
bake.py
Multi-object smart unwrap into one shared atlas per material, then Cycles bakes colour, roughness, occlusion and normals.
export.py
Quantised vertex buffers, per-part metadata and the control bindings that tie every knob to a parameter.
app.js
three.js, a hand-rolled post chain, ten scroll-linked acts and two synthesis engines.
build.mjs
Inlines three.js, GSAP, the quantised geometry and all eighteen textures as base64 into a single document.
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.
One file,
no requests
The whole instrument — geometry, eighteen baked textures, three.js, GSAP and two synthesisers — inlined as base64 into a single document.
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.
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
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
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