Pronounced WARP-en-ter, like "wave carpenter", because carpenters make tables.
Warpenter is an open-source TypeScript wavetable tool inspired by the original Lambda Synthetics browser project.
The app renders a generator/effects table, drives a locally built WASM engine, previews the resulting tables with an AudioWorklet, plots 2D/3D canvases, and exports WAV or raw WT data.
If this project is useful to you, please support Lambda Synthetics and the wider wavetable community that inspired it. More wavetable resources are available at wavetabl.es.
npm install
npm run install:emsdk
npm run devOpen http://127.0.0.1:5173/.
npm run buildnpm run build rebuilds the ignored public/generator.js and
public/generator.wasm artifacts from the C++/Emscripten source in wasm-src/
before running the TypeScript/Vite build.
npm testThe test suite uses Vitest with jsdom for app-level behavior checks around keyboard workflow, undo, randomization locks, presets, and modal controls.
Warpenter supports a single-key workflow unless the file export name field is focused:
| Key | Action |
|---|---|
J / K |
Select next or previous generator |
N / P |
Select next or previous field in the selected generator |
E |
Focus the selected field for editing |
U / D |
Move the selected generator up or down |
M |
Mute or unmute the selected generator |
A |
Randomize all active unlocked generators |
G |
Randomize the selected generator |
R |
Randomize the selected row |
V |
Randomize the selected field |
? |
Open the keyboard help |
Lock icons on generators, rows, and fields exclude those scopes from randomization while keeping them editable.
Presets are lazy-loaded static JSON files under public/presets/. To contribute
one, use the in-app save button to copy starter JSON, create one new
public/presets/<preset-id>.json file in a fork, edit the generated name and
optional description, and open a pull request.
Contributors do not need to edit public/presets/index.json. The GitHub Actions
pipeline regenerates it from the preset files for deployment and commits the
updated index back to main after merges. Index entries include the preset path,
description, last modified date, author, and GitHub profile link when the preset
JSON includes author metadata.
Warpenter is licensed under the GNU Affero General Public License v3.0 only
(AGPL-3.0-only). See LICENSE.
Warpenter is a static Vite app and can be hosted by GitHub Pages. The included
workflow builds the WASM engine from wasm-src/, builds the Vite app with the
repository name as its base path, and deploys dist/ from pushes to main.
In the repository settings, set Pages to use GitHub Actions as the source. If the repository stays private, GitHub Pages requires a plan that supports Pages for private repositories; for open-source/public hosting, GitHub Free is enough.
For a fully hands-off first deploy, add a PAGES_ADMIN_TOKEN repository secret
with Pages write and Administration write access. Without that secret, enable
Pages once in the repository settings before the first successful deployment.
The workflow is skipped while the repository is private unless the repository
variable ENABLE_PRIVATE_PAGES is set to true.
The C++/Emscripten source for the generator lives in wasm-src/. The generated
public/generator.js and public/generator.wasm artifacts are intentionally
ignored; rebuild them from source when running or publishing the app.
To install the local Emscripten SDK:
npm run install:emsdkTo rebuild only the WASM engine:
npm run build:wasmsrc/wasm-engine.tsloads the generated WASM engine.src/synth.tsis a readable TypeScript reference implementation of the generator math.- Downloaded WAV files include a custom metadata chunk that lets this app restore the patch state on import.
