History Your programs
Library
Documentation
underscore

Music as software

Describe a musical idea. Underscore turns it into a live, controllable program you can hear, shape, remix, and embed anywhere.

We are building the runtime for music that has to react.

Music gets used under wildly different demands. A film cue has to stretch to the edit. A game has to react to what the player just did. A stream has to hold for six hours without repeating itself. A record has to sound identical every time. All of it ships as the same thing: a fixed file.

Today’s tools divide that work in the wrong place. A DAW gives you a session you can shape but only you can run. A text-to-audio model gives you a file anyone can play but nobody can change. Stems, plugins, and renders all end up in the same place — a recording, decided once, with the reasoning thrown away.

AI made this more visible, not new. Game audio has faked adaptivity with crossfaded stems for thirty years. Generative musicians have been writing their own runtimes because nothing shipped one.

We think the missing layer is the program: the piece as software that performs itself. Named controls you move while it plays. Source you can read. Lineage when you remix it. One address whether it runs in a browser, a game, or a room. It still renders a file when you need one — the file becomes an export, not the deliverable.

A rendered file

One performance, sealed at export. Nothing inside it to move.

The same piece as a program

Nothing is running yet. Start the deck at the top of the page.

Both sides are the same piece. Only one of them is still running.

What we’re building

Three commitments, in the order we have to earn them. The first one is live today.

  1. Build an instrument anyone can describe into existence.

    Say what you want to hear and get back a program that plays it, with controls already named and exposed. No patching, no session to reconstruct, nothing to install before you hear something.

  2. Make every program composable.

    A program’s controls are an interface, so software should drive them. Connect game state, sensor data, or a timeline to any named control and the sound responds while it plays. Remix in language and the lineage survives.

  3. Make programs durable.

    A piece should outlive the session that made it: shareable by link, embeddable in an app or a game, readable as source, and renderable to a file when a fixed asset is genuinely what you need.

Programs are software. Treat them like software.

Load a program in a web app, read its controls, and drive them from your own state.

Web SDK
const underscore = new Underscore({ apiKey: 'us_pub_...', wasmBaseUrl: '/supersonic/' });
await underscore.init(); // inside a user gesture (autoplay policy)

const program = await underscore.loadSynth('cmp_9xk2', 'held_breath');
await program.play();

// named controls are part of the program
program.params.map(p => p.name);
// => ['warmth', 'drift', 'bloom', 'tenderness', …]

// connect any application state
program.setParam('warmth', enemyCount / 20);
program.setParam('drift', scrollProgress);

The source is part of the program: every piece keeps the synthesis and performance code that makes it sound and move. Flip the player to its Code view to read what you’re hearing.

Install the Web SDK in Vite, Next.js, or a vanilla web project with npx @underscore-audio/wizard@latest.

Make a program of your own

Describe what you want to hear. Shape what comes back.

New program

Or start from an idea