Forte
Keyboard instruments built from physics. Play them at
https://forte.jthaler.net. Vibe coded by Jesse Thaler.
Every sound in Forte is computed live in the browser from the equations of
motion of its instrument: stiff strings and felt hammers, gear-driven
tonewheels, steel tines in a magnetic field, neon lamps that pull each
other into tune, black holes ringing down. There are no samples. You play
with the computer keyboard, a touch screen or a MIDI keyboard, and you can turn the knobs
that real instruments hide: the shape of the string, where the hammer
lands, the pickup's offset, how fast the black hole spins.
Instruments
The front page sorts them into five kinds, as here, and finds them by a search
(name, origins, tagline or physics) and by filters: what sounds (strings, bars and
bells, air, circuits, space, particles) and whether the notes ring out or sustain.
Traditional instruments
| Instrument | after | the physics |
|---|
| ✅ | Ribbon Piano | the concert grand | modal stiff strings, nonlinear felt hammers, a shared bridge; strings swappable for square/triangular bars and twisting ribbons |
| ✅ | Harpsichord | Flemish double-manual (Ruckers); also their muselar and spinett virginals and a gut-strung lute-harpsichord | plectra as tapered cantilevers that catch, bend and slip off stiff strings (implicit contacts with friction); three choirs, coupler, buff and lute stops, a modal soundboard; virginals with both bridges on the board and a buzzing arpichordium; gut's bending losses |
| ✅ | Pipe Organ | Baroque organ | flue pipes as tubes in modal form driven by a delayed, amplified jet that splits on the labium (jet drive with vortex shedding; speaking windows from a linear analysis): chiff with the pallet's speed, overblowing with hysteresis; Principal, Octave, stopped Gedackt and Mixture; a wind chest that sags and breathes, tremulant |
| ✅ | Free-Reed Organ | harmonium and accordion | brass reeds driven through their slots by the inertia of the air that feeds them (implicit reed–air coupling, thresholds from a linear analysis); musette, 16′ and 4′ ranks, reservoir and expression stop, cassotto |
| ✅ | Vibraphone | Deagan vibraharp (1927) | undercut bars tuned 1 : 4 : 10 by finite elements, each coupled to a stopped tube; motor-driven discs open and close the tubes (tremolo) |
| ✅ | Carillon | Flemish carillon (Hemony) | bronze bells solved by axisymmetric finite elements and tuned by their profile (minor- or major-third), struck by a Hertzian clapper; doublets that warble with asymmetry and strike angle; air absorption over distance; the strike note found by subharmonic summation |
| ✅ | Celesta | Mustel celesta (1886) | plain steel bars solved as Timoshenko beams, each coupled through the air in the gap to a stopped wooden box tuned to it; felt hammers (Hertzian, implicit), felt dampers and a damper pedal |
| ✅ | Kalimba | Hugh Tracey's kalimba and the mbira | spring-steel tines as clamped–supported–free beams (the length behind the bridge sets the overtones), plucked from their static deflection by a thumb that lets go slowly or fast; a box whose top and sound-hole air are two coupled oscillators (cover the hole for a wah); bottle caps that rattle once the top outruns gravity |
| ✅ | Steel Pan | Trinidad steelpan (1940s) | note areas as plates tuned by hammering to octave and twelfth, whose domes couple their modes (a 1 : 2 : 3 internal resonance: the octave blooms on hard strokes); neighbours coupled through the steel in a fourths-and-fifths layout; the skirt's radiation; rolls |
| ✅ | Hydraulis | Ctesibius's water organ (3rd century BC), the organs of Dion and Aquincum | hand pumps push air through their valves into a bowl standing in water: the hydrostatic head is the wind, capped at the rim where it bubbles out (Minnaert bubbles), the water bouncing on the air shut in the bowl; slides whose holes open as overlapping circles, sprung back; the Pipe Organ's flue pipes on an ancient, nearly constant bore in four ranks, one open and three stopped |
| ✅ | Regal | the Renaissance reed organ (Praetorius, 1619; Monteverdi's Orfeo) | brass tongues as curved cantilevers that roll shut on their shallots (Bernoulli jets, a penalty contact), each reed in its own boot, shallot and short resonator (Kelly–Lochbaum tubes: cylinders, funnels, capped balls); two weighted wedge bellows raised in turn, a tremulant; every reed retuned for its voicing |
| ✅ | Clavichord | the German clavichord of C. P. E. Bach's day (18th century) | a brass tangent strikes the strings and stays on them as the end of the speaking length (a moving boundary driving every partial), held up by the finger's force against the strings' pull: pressure tuning and the Bebung from the stretch, the tangent's give tuned for; the listing damps the afterlengths and stops the string at key-up; double-fretted pairs where the higher tangent wins, 4′ strings in the bass, a modal soundboard |
| ✅ | Brass | the tenor trombone, the B♭ trumpet and the flugelhorn | an outward-striking lip (a mass on a spring) blowing Bernoulli flow into the mouthpiece's cup; the bore as travelling waves (Kelly–Lochbaum, fractional delays, wall losses) and a radiating bell; loud waves steepening into shocks in the narrow tubing (a delay read where the pressure carries each sample); a player who picks the partial and moves the slide or valves and the lips by ear; a plunger |
| ✅ | Timpani and Tabla | orchestral pedal timpani and the tabla's dayan and bayan | circular membranes solved per azimuthal order (Rayleigh–Ritz on the Bessel modes) with the air on them as a mass and its radiation as their loss, the kettle's air as a spring (Christian et al.), the dayan's loaded syahi that puts nine modes on five harmonics (Raman); felt, wood and fingertip strokes, a resting finger, the heel pressing the bayan's head sharp, the pedal on the pitch-bend wheel |
| ✅ | Marimba and Xylophone | the five-octave concert marimba (Yamaha, Keiko Abe, 1984) and the orchestral xylophone (Deagan) | rosewood bars solved as Timoshenko beams and undercut by finite elements to 1 : 4 : 10 (marimba) or 1 : 3 (xylophone); a stopped tube under each bar whose two resonances share the gap's air with bar modes 1 and 2 (the twelfth speaks through an off-centre tube); wood, cord and radiation losses; yarn to plastic mallets (power-law contact), rolls |
| ✅ | Gamelan | the gamelan of Java and Bali: gangsa, saron, bonang, kempul and gong ageng | thick bronze bars as Timoshenko beams that bend and twist (Huang's frequency equation), a gangsa's bar and its bamboo tube as two coupled oscillators; bossed gongs ringing the modes measured by laser vibrometry (Perrin et al.; Krueger et al.), whose curved face makes the note's second harmonic beat with the second round mode (a gong ageng's ombak); pélog and sléndro on the white and black keys; Balinese pairs tuned a few hertz apart that beat (ombak); the player's damping hand |
| ✅ | Cimbalom | Schunda's concert cimbalom (Budapest, 1874) and the hammered dulcimer | hand-held hammers thrown at the strings, a light head on a flexible stick (Hunt–Crossley contact with cotton, leather or bare wood faces); courses of stiff strings slightly out of tune, coupled at the bridge (Weinreich's two-stage decay and beats); the dulcimer's strings divided 2 : 3 by its treble bridge, both sides ringing; a damper bar and sympathetic strings; a hand tremolo; a modal soundboard |
| ✅ | Musical Saw | the singing saw of vaudeville and folk players (Mussehl's, 1920s) | a tapered steel blade bent into an S, as a thin shallow shell (Donnell): bending a curved sheet stretches it, so the curvature raises the band edge on either side of the inflection and traps a mode there (Shankar, Bryde and Mahadevan, 2022), solved across the width and along it; the trap tunnels to the hands (WKB, Gamow's rate) when the bend is loose, and a J with no inflection traps nothing; the player slides the S along the taper for each note, bowed on the edge (implicit stick–slip, its threshold from the trapped mode) or struck with felt; the knee's vibrato, and one saw sliding from note to note |
| ✅ | Tubular Bells | orchestral chimes | brass tubes as free Timoshenko beams with the cap at the struck end as a mass, each cut so that modes 4, 5 and 6 sound the strike note, a virtual pitch no mode plays; a Hertzian mallet, the air taking the high modes (a line of dipoles above coincidence), heard at two microphones in front of the frame; the damper bar and its pedal |
Electric instruments
| Instrument | after | the physics |
|---|
| ✅ | Electric Grand | Yamaha CP-70 | short stiff strings in two polarisations, a piezo under the bridge (or a soundboard, for comparison) |
| ✅ | Tonewheel Organ | Hammond B-3 + Leslie 122 | gear ratios and shared wheels, contact bounce, LC-ladder scanner vibrato, rotating Doppler horn and drum |
| ✅ | Tine Piano | Fender Rhodes | finite-element tine + tone bar as an asymmetric tuning fork, nonlinear electromagnetic pickup |
| ✅ | Reed Piano | Wurlitzer 200A | solder-tuned steel reeds, an electrostatic pickup whose capacitance comes from Laplace's equation, photocell tremolo |
| ✅ | Tangent Clavier | Hohner Clavinet D6 | tangent strikes and clamps the string on an anvil (Hertzian contacts), pressure bends the pitch, four pickup combinations, tone tabs, mute bar |
| ✅ | Sticky-Pad Piano | Hohner Pianet | reeds plucked by rate-dependent adhesion (fracture mechanics of the pad), magnetic or electrostatic pickup |
| ✅ | Trautonium | Trautwein's Trautonium (1930), Sala's Mixtur-Trautonium (1952) | a neon lamp's relaxation sawtooth, its capacitor charged through a resistance wire (exact firing times, polyBLEP); four dividers, lamps ganged to the wire and fired by the master's sync pulse on every n-th flash, whose capture window gives where they divide true, slip or fire a flash early; four fixed resonant circuits rung by every flash (formants); one wire that slides between keys or a manual per key; finger pressure, a volume pedal, pitch bend and MPE |
Experiments from history
| Instrument | after | the physics |
|---|
| ✅ | Viola Organista | Leonardo da Vinci (1488) | strings bowed by a rosined wheel: implicit stick–slip friction, Helmholtz motion, live Schelleng diagram, sympathetic strings on a shared soundboard |
| ✅ | Glass Armonica | Benjamin Franklin (1761) | wet-finger stick–slip on Rayleigh shell modes; split doublets warble as the bowls turn (Bryan effect); water loading |
| ✅ | Clavicylinder | Ernst Chladni (1800) | iron free–free bars pressed by their keys against a turning wet glass cylinder, from Chladni's own account (1821): implicit stick–slip of a cloth pad on the glass, posts and bent ends rubbed along the lowest mode, keys regulated to the threshold linear stability gives, soaked cloth silencing the treble, cords off the nodes freeing an overtone |
| ✅ | Hurdy-Gurdy | the French vielle à roue (18th century) | a cranked, rosined wheel bowing every string (implicit stick–slip, as the Viola Organista's): two chanterelles stopped by tangents tuned as the bowed notes sound, four drones on bridges of their own; the trompette's chien, a mass on a one-sided contact with the soundboard lifted by the string once the wheel's drag beats the tirant: a buzz from a threshold worked out from the string, set off by coups of the wrist on the crank |
| ✅ | Pyrophone | Frédéric Kastner (1873) | flame-driven Rijke tubes on a subcritical Hopf bifurcation: slow self-excited onsets, hysteresis, warm-up drift |
| ✅ | Singing Arc | William Duddell (1900) | Ayrton's falling arc characteristic with a Mayr-type thermal column driving Duddell's tuned circuit: each note grows at the rate a linear analysis gives and sounds about 1 % below Kelvin's formula; a floor from the hot carbons holds the first kind, a higher re-strike voltage the second; capacitors in parallel on one arc, several lamps, hiss, Simon's talking arc; the arc radiates as a thermophone, ∝ dP/dt |
Physical phenomena
| Instrument | the physics |
|---|
| ✅ | Huygens Keyboard | pulse-coupled relaxation oscillators that lock chords into just intonation (Arnold tongues) |
| ✅ | Gong Keyboard | von Kármán plates and shallow shells in modal form (energy-stable SAV scheme): bell → shimmer → crash with how hard you strike, pitch glides down (flat) or up (domed) |
| ✅ | Black-Hole Keyboard | Kerr quasinormal modes from the Teukolsky equation, h₊ and h× in stereo |
| ✅ | Quantum Keyboard | exact wavepackets in square, Morse, hydrogen-Rydberg, gravitational and harmonic wells: collapse, fractional and full revivals, decoherence |
| ✅ | Bubble Organ | Minnaert bubbles with heat flow, radiation and viscosity; the free surface above raises the pitch; depth, pressure, gas and liquid retune the keyboard |
| ✅ | Spring Keyboard | struck helical springs in modal form, from Wittrick's helical-rod dispersion: each key's spring cut so its heard pitch lands on the note, every echo a chirp rising to the transition frequency F_C; one to three springs a key, magnetic beads in rotation or along the axis, oil and mount damping, and a Slinky whose whistles fall |
| ✅ | Star Keyboard | asteroseismology on an evolutionary track (dwarfs to red giants, sped up 510,800 times): p modes driven at random by convection, each a Lorentzian of its own linewidth, from the asymptotic relation and the scaling relations; mixed modes in red giants, rotational splitting, inclination, a flare kick, and self-excited δ Scuti stars |
|
Devices built to study physics
| Instrument | the physics |
|---|
| ✅ | Storage Ring | a particle accelerator's storage ring heard through a beam pickup: a Gaussian bunch's pulse train at the revolution frequency, betatron sidebands at (n ± Q)·f_rev after an injection kick, decoherence by chromaticity that recoheres every synchrotron period and by octupole amplitude detuning that never does (Meller et al.'s closed forms, checked against tracked particles); RF voltage under key pressure, adiabatic bunch shortening, radiation damping, two-button or difference pickups |
| ✅ | RF Cavity Bells | superconducting accelerator cavities rung by a passing bunch: nine coupled pillbox cells whose passband beats (Nagle, Knapp & Knapp's circuit model), higher-order modes at Bessel-zero ratios for a bell's partials, kicks from the transit-time integral, offset and bunch-length form factors; input and HOM couplers, BCS surface resistance against the helium bath, beam loading from a bunch train, Lorentz-force detuning through the walls' mechanical mode, quench and recovery |
| ✅ | Collider Showers | a collider calorimeter's lead tungstate crystals (CMS's) rung by the heat of the particle showers they catch, the thermo-acoustic effect: PDG's electromagnetic shower profiles, photon conversion, charged pions' hadronic showers that differ every time, the Molière-radius spread into neighbouring crystals; stretching modes (Love's rod theory) rung by where along the crystal the shower peaks, so TeV showers ring the odd harmonics; bending modes from an off-axis impact; pile-up; piezo or accelerometer readout |
| ✅ | Project 8 | an electron in a magnetic trap heard by its cyclotron radiation, as the Project 8 neutrino-mass experiment hears it (CRES): every key a trap, its note the electron's starting frequency; Larmor's power and the radiation reaction in Landau and Lifshitz's closed form make it chirp sharp as it cools until its pitch angle leaves the bottle; the bounce as a waveguide's Doppler vibrato or an antenna ring's Schott harmonics; collisions with the gas on the mod wheel, each a jump or the end; krypton-83m's line, tritium's β spectrum or any energy to 300 keV; Phase II's field, trap, waveguide and noise |
✅ playable · 🛠 in the workshop (build briefs). Each instrument's README has its equations,
numbers, sources, and a list of what is simplified. The same notes open on
the instrument's page under How it works, next to its name.
Playing
The bottom two letter rows are the keyboard: Z–/ for the white keys
from C, with the black keys on the row above. Q–] continues an octave
up. ←/→ shift the octave, and ↑/↓ adjust each instrument's main
control (usually velocity). Space is the sustain pedal or that
instrument's equivalent (hold, mute bar, Leslie speed), on every
instrument except the black hole, where there is nothing to hold.
Enable MIDI connects a MIDI keyboard (Chrome, Edge and Firefox;
Safari, and every browser on iPhone or iPad, has no Web MIDI, so the button
is hidden there),
including velocity (with a Soft, Normal or Hard curve), the sustain,
sostenuto and soft pedals, aftertouch and, where it means something, the
mod wheel and pitch bend. Once MIDI is on, every other instrument page
turns it on by itself.
The MIDI menu: once MIDI is on, its status opens a menu with the
velocity curve (Touch), MPE (below), Octave and Transpose. Octave and
Transpose move the MIDI keys up to four octaves and twelve semitones either
way, so a 25-key controller reaches all 88 keys, or a piece fingered in C
sounds in D. Every page keeps what you set there, and while the keys are
moved the status says so, in the instrument's colour. A note held while you change them ends where it
began. The keys on the screen and the computer keys play what they show
(←/→ move the computer keys). The plugins have the same two as their
Transpose and Octave parameters, which the Forte app keeps when you change
instrument.
MPE: a controller that gives each note a channel of its own (a ROLI
Seaboard, a LinnStrument, an Expressive E Osmose) bends, slides and presses
each note alone, wherever the instrument can: a reed, a pipe, a string or a
bow bends; a struck bar or bell keeps its pitch, but its slide (CC74) still
moves what the mod wheel moves, for that note. MPE in the MIDI menu is on
Auto, which turns MPE on when the controller announces it (its
MPE Configuration Message) and leaves any other keyboard as it was; On
reads channels 2–16 as MPE without the announcement, and Off never does.
The plugins have the same choice as their MPE parameter, and also take
CLAP's per-note expressions. A Seaboard plays as MPE from the moment MIDI
connects it, since it may not announce itself.
Faders and an XY pad: a ROLI Seaboard RISE's three touch faders and its
XY pad (CC 107, 109 and 111, and 113 and 114 for X and Y, as it sends them
in its MIDI mode: press its mode button until the faders' lights are white;
in cyan they set the Seaboard's own Glide, Slide and Press sensitivity)
move five of each instrument's controls, on the pages, in the plugins and
in the Forte app, and any controller sending those CCs does the same. Each
moves its control across the slider's whole range; a fader on a stop pulls
it at halfway up. The first touch of each shows which control it moves. Pad Y
is the mod wheel's control wherever the instrument has one.
| Instrument | Faders 1 · 2 · 3 | Pad X | Pad Y |
|---|
| Ribbon Piano | Damper strength · Sympathetic resonance · Soundboard body | Felt hardness | Strike position |
| Harpsichord | Front 8′ · Back 8′ · 4′ | Front 8′ from the nut | Back 8′ from the nut |
| Pipe Organ | Principal 8′ · Octave 4′ · Mixture III | Wind: steady … flexible | Wind pressure |
| Free-Reed Organ | 16′ · 8′ · 4′ | Pumping | Bellows pressure |
| Vibraphone | Mallet hardness · Bar–tube gap · Damper felt | Strike point | Shaft speed |
| Carillon | Clapper face · Strike height · Clapper mass | Listener round the bell | Distance from the tower |
| Celesta | Off the centre line · Damper felt · Box tuning | Strike point | Hammer felt |
| Kalimba | Buzzers · Sound hole · Release | Pluck point | Hole covered |
| Steel Pan | Roll speed · Hand mute · Off the long axis | Strike point | Roll |
| Hydraulis | Open rank · Stopped rank · Stopped rank, octave above | Gurgle | Pumping effort |
| Regal | Tremulant rate · Curve: tip off the shallot · Tongue Q (mechanical) | Resonator length | Wind pressure |
| Clavichord | Bebung rate · Listing cloth · Unison spread | Finger pressure on the key | Bebung |
| Brass | Air nonlinearity (shock waves) · Lip tension · Tonguing | Breath | Plunger mute |
| Timpani and Tabla | Air on the head · Listening angle · Heel push | Resting finger | Strike point |
| Marimba and Xylophone | Mallet hardness · Bar–tube gap · Roll speed | Strike point | Roll |
| Gamelan | Mallet softness · Strike point (bars) · Strike point (gongs) | Off the long axis | Paired tuning (ombak) |
| Cimbalom | Hammer mass · Sympathetic strings · Unison spread | Tremolo | Strike point |
A foot controller: a Roland FC-300 works as it comes from the factory
(Standard mode, channel 1), and so does any pedal board sending the same
messages, on the pages, in the plugins and in the Forte app:
| On the FC-300 | It sends | In Forte |
|---|
| EXP 1 | CC7, volume | turns the instrument down (heel down: silent); full until it moves |
| EXP 2 | CC1, the mod wheel | whatever the mod wheel moves (on the Electric Grand, Tine and Reed Pianos, the tremolo) |
| CTL 1 | CC80 | the sustain pedal (or what Space is: hold, the Leslie) |
| CTL 2 | CC81 | the sostenuto pedal |
| EXP 1's toe switch | CC82 | the soft pedal (the Ribbon Piano's una corda, the Regal's tremulant) |
| Number pedals 1–5 (▲, then 1–5, for 6–10) | program change | the instrument's presets in the menu's order (pedal 1 the first), then, on the pages, your own |
An expression pedal set to CC11 does what EXP 1 does, except on the
instruments with a swell of their own (the tonewheel organ, the
Telharmonium, the Trautonium), where CC11 is the swell. EXP 2's toe
switch (CC83) is left free. The FC-300's
switches come set to latch: a press puts the pedal down, the next lifts it
(set a switch's Mode to Momentary on the FC-300 to hold it down instead,
which the Leslie's switch wants). The FC-300 has only a 5-pin MIDI OUT, so
it reaches a computer through a USB MIDI interface (or a keyboard's MIDI
IN that passes it on). In a DAW, the host may take program changes for
itself (MainStage switches patches with them).
Latency: play through wired headphones or speakers. Bluetooth ones
delay every note by 100–200 ms, enough to make any instrument feel
sluggish; a page warns you once when the browser reports that much (Safari
doesn't report it). The browser's own audio buffer adds about 10–30 ms, and
a computer keyboard a few more than a MIDI keyboard. For the least delay,
play the plugins in a DAW with a small buffer.
Each instrument page reads top to bottom. At the top, the instrument's
name opens the menu of every instrument (and Forte's home page), next to
How it works. In the middle are the views, pictures of the physics as
it plays, and below them the rest of the controls, grouped. Each has a
bar on top: the views' turns each view on or off and holds the mode, the
controls' turns each group of controls on or off and holds the presets.
The main views and every group are on at first, and the page remembers
your choice. Drag the handle on the controls' bar to share the height
between the two, all the way to either end, or fold either away with the
chevron at the end of its bar. The few you reach for mid-phrase (the
volume, the computer keys' velocity, a pedal) sit in the keyboard's own
bar, right above the keys, each with its name and its value.
Explanations wait behind ⓘ buttons.
Your own presets live in the same menu. Save these settings… keeps
the page's settings under a name in your browser, and Copy a link to
these settings makes a link that opens the page playing them, to send
to someone. Your presets and files… lists yours, and saves them to a
file or opens one: the plugins read and write the same files.
Morph, the last group of controls, slides from one preset to another:
pick From and To (Default settings, the instrument's presets or your
own) and move the slider. Every setting the two give goes part of the way,
a number smoothly and a choice or a switch halfway across; volume, the room
and the tuning stay as you have them. Choosing a preset from the Presets
menu makes it the one you morph from.
Tuning, among the controls, is the same on every instrument: the
pitch standard (A = 440 Hz, or 415 for baroque pitch, 392, 422.5, 430,
435, 442, 443 or 466), the temperament (equal, ¼- and ⅙-comma
meantone, Werckmeister III, Kirnberger III, Vallotti, Young, Pythagorean
or just intonation) and the root it is built on (meantone on D is
purest in D). Custom sets each note's cents from equal temperament
by hand, or from a Scala file (.scl, twelve notes to the octave):
Load a Scala file opens one. The instrument is retuned, not
resampled: at 415 Hz the strings are slacker, the bars and bells cut for
their new notes. Presets keep your tuning; your own presets and links
carry it.
Quality, beside the CPU readout at the top of the page (the share of the
time the audio takes; hover over it for the worst moment and the voices
sounding), is for phones and older computers. High plays all the physics, as the instruments always have;
Medium and Low play less of what costs the most and is heard the
least (fewer voices sounding at once, fewer partials, the sympathetic
strings lighter or off), and each instrument's notes say what. It belongs
to the device, not the sound: one choice for every instrument in this
browser, which presets and links leave alone. If the sound starts to
crackle, the page suggests a lower setting.
There are two modes. Discover shows it all. Perform shows just
the views you turned on, filling the screen, with no toggles and no text
in them: for playing,
or for a projector (Full screen fills it). The controls in the
keyboard's bar stay where they are, the presets join them, and the
chevron beside the presets (More controls) brings back the rest.
Once the audio is on, Perform keeps the screen from dimming and locking
(where the browser can: Chrome, Edge, and Safari from iOS 16.4).
Tour, in the header beside How it works, is a guided tour of the
instrument's physics: a card that walks through it a step at a time,
each step showing the views that make it visible, setting the
instrument up and playing a short phrase while it says what to listen
for, and why. ▶ plays a step again; ✕ (or Esc) ends the tour and puts
back your views and settings.
The keys fill the width at the key size you choose (− +), like
GarageBand's: a phone shows an octave or so, a laptop most of the range.
◀ ▶ move an octave, and the overview of the whole range above them drags
anywhere. On a tablet or phone, play with as many fingers as you like:
slide across the keys for a glissando, and strike lower on a key, or
press harder with an Apple Pencil, to play louder. On the nine with
aftertouch (Viola Organista, Tangent Clavier, Free-Reed Organ, Glass
Armonica, Pyrophone, Gong Keyboard, Bubble Organ, Star Keyboard and Wind
Harp), lean on a held key: slide the finger along it, either way, to
press harder. The pedal button stands in for Space, and ⌨ lists the
computer keys. On a
phone the page scrolls between the header and the keys, which stay put, with the
controls' bar and its presets just above the keys; turn it sideways
for wider keys. Use
Share → Add to Home Screen to run Forte as a full-screen app.
Forte works offline. On the first visit the browser keeps a copy of the
whole site in the background (about 5 MB to download), so from then on
every instrument opens and plays without a network: on a plane, say, or
from the home-screen app. Only the front page's demos need a connection. A
new release downloads in the background too, just the files that changed,
and takes over the next time you move from one page to another.
Plugins
Every instrument (all 25) also comes as a plugin for a DAW: AU,
VST3 and CLAP, and a standalone app, for macOS, Windows and Linux. Download every instrument
together from All Plugins on the front page, or one instrument from ↓ Plugin next to
How it works on its page, in every format or one format alone (just the AU, say); both are also in the
latest release. Then follow
native/INSTALL.md: on macOS and Linux, make install and make verify in
the unpacked folder do it all. They are unsigned, so a Mac needs one Terminal command (xattr,
which make install runs) before it loads them. The download with every instrument also has the
Forte app, one standalone that plays any of them from its Instrument menu, or two at once:
+ beside the menu layers a second instrument with the first, or splits the keyboard between
them.
A plugin's window also shows the instrument's views from its page: press Views, beside
the pedal, and they draw what the plugin plays, whether the notes come from the DAW, a MIDI
keyboard or the window's keys.
In a plugin's window the Presets menu has your own presets too: Save these settings… writes
one as a file in a presets folder for that instrument (~/Library/Audio/Presets/Forte/<id> on a
Mac, %APPDATA%\Forte\Presets\<id> on Windows, ~/.local/share/forte/presets/<id> on
Linux), and Open the presets folder shows it, so a file saved on the site can go there too.
Scala files for the custom temperament go in the Tunings folder beside the instruments' (on a
Mac, ~/Library/Audio/Presets/Forte/Tunings): the menu under Temperament lists them and opens the
folder.
Morph is in every plugin too, as three parameters kept with the project: Morph from and
Morph to (the instrument's presets) and Morph, the slider, which a DAW can automate to sweep
from one preset to the other.
Quality (in the CPU group) is in every plugin too, kept with the project and in no preset.
A VST3 or CLAP host that bounces or freezes a track offline gets High whatever it says; the AU
isn't told, so set it back to High before a bounce in Logic.
Releases publish themselves: the site goes live first, and after the green native run on
live (the branch the site is published from) that follows, the release-plugins workflow releases that run's plugins if an instrument's
version or anything under native/ changed since the latest release (tagged plugins-v<Forte version>, with -2, -3… when
Forte's version didn't change). It can also be started by hand from the Actions tab. Until it
has, the downloads are the latest release's, and they say which release that is and when an
instrument's newer version is still to come.
Running locally
There is no build step. Serve the folder over HTTP, since AudioWorklets
need it:
python3 -m http.server 8765
Then open http://localhost:8765/.
Tests
Each instrument has a physics test suite: Node ≥ 18, no dependencies.
npm test
It runs the suites in parallel and reports every failure. It includes a
site check (registry, versions, presets) and a level check: every
instrument is trimmed to about the same loudness at its defaults
(tools/loudness.mjs).
You can also run one suite, e.g. node test/blackhole-tests.mjs. The
suites compare the models with independent results: Euler–Bernoulli
cantilever ratios, Hammond gear tables, published Kerr quasinormal
frequencies, Adler's locking range, and more. They then check that each
engine plays what its model predicts.
Layout
index.html, landing.* the landing page
<instrument>/ one folder per instrument: page, src/, README
shared/ shell, generic AudioWorklet, DSP and linear algebra, nav, notes, registry, styles
test/<instrument>-tests.mjs physics and engine tests
tools/ demo renderers, data generators, scaffolding
native/ the instruments' physics in C++: plugins and WebAssembly (docs/PLUGINS.md)
examples/<instrument>/ rendered demos (.m4a)
docs/INSTRUMENT_GUIDE.md how to build a new instrument
docs/WORKSHOP.md briefs for the instruments in the workshop
docs/ROADMAP.md the road to 1.0, and the feature wishlist
docs/template/ the starting point (struck bars)
To add an instrument, run
node tools/new-instrument.mjs <slug> <EngineName> "<Name>" and follow
docs/INSTRUMENT_GUIDE.md.
Versions
Forte and each instrument carry their own
semantic version, shown on each page and on the
landing page. They are listed in shared/registry.js (and in
package.json for Forte) and logged in CHANGELOG.md;
releases are not tagged. Everything is pre-release (0.x) for now
(docs/ROADMAP.md says what 1.0 will take):
- MINOR (0.x.0) for new features, or for changes to an
instrument's sound or parameters.
- PATCH (0.x.y) for fixes that leave the intended sound alone.
From 1.0 on, an instrument's MAJOR version will change only when saved
settings or the sound of existing presets break.
Credits
Forte builds on decades of musical acoustics and physical-modelling
synthesis: the inventors of the instruments it models, the physicists who
worked out how they vibrate, and the researchers and companies who built
physical-modelling instruments first. docs/PRIOR_ART.md,
also at https://forte.jthaler.net/credits/, credits the field. Each
instrument's README (its How it works notes) ends with its own prior
art and references.
License
MIT © 2026 Jesse Thaler. The WebAssembly and the plugins compile in open-source
libraries (Eigen, fdlibm, CLAP, clap-wrapper, the VST 3 and Audio Unit SDKs, RtAudio, RtMidi,
CHOC and others), whose licences and notices are in
THIRD-PARTY-NOTICES.md; the plugin downloads include it. Instrument names such as Hammond,
Leslie, Rhodes, Wurlitzer, Clavinet, Pianet and Yamaha are trademarks of
their owners. Forte's instruments are physical models inspired by them and
are not affiliated with or endorsed by those companies.