- TypeScript 91.8%
- MDX 5.3%
- JavaScript 2.4%
- Shell 0.3%
- CSS 0.1%
| .forgejo/workflows | ||
| .github/workflows | ||
| bin | ||
| docs | ||
| examples | ||
| packages | ||
| reference | ||
| scripts | ||
| site | ||
| site-examples | ||
| .gitignore | ||
| .gitleaks.toml | ||
| agent.md | ||
| biome.json | ||
| CLAUDE.md | ||
| global.d.ts | ||
| lefthook.yml | ||
| LICENSE | ||
| package.json | ||
| PLAN.md | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| screenshot-example.png | ||
| screenshot-landing.png | ||
| tsconfig.json | ||
| tsconfig.package-build.json | ||
| tussel-reference-parity-backbone.md | ||
| tussel-v1-plan-local-daemon-structural-ts-and-example-driven-docs.md | ||
| vitest.config.ts | ||
Tussel
This project is experimental and under active development. APIs will change without notice. Do not use in production.
Tussel is a local-first TypeScript livecoding runtime for pattern-based music, inspired by TidalCycles and Strudel. It runs as a terminal daemon — no browser required.
Status
Work in progress. This is an early-stage experiment. Expect:
- Breaking changes on every commit
- Missing features and incomplete implementations
- Bugs, rough edges, and undocumented behavior
- No stability guarantees whatsoever
If you're looking for a production-ready livecoding environment, use Strudel or TidalCycles instead.
What it does
Tussel takes pattern expressions like:
s("bd sd [hh hh] cp").fast(2).gain(0.8)
and renders them to audio in real time from your terminal. It supports:
- Mini notation — Tidal-style pattern strings (
"bd [sd sd] hh") - Pattern transforms —
fast,slow,rev,jux,every,sometimes, and 80+ more - Signal modulation —
sine,saw,rand,perlinas continuous control signals - Effects — delay, reverb, filters, distortion, phaser, FM synthesis
- MIDI/OSC output — send patterns to external synths and software
- Hot reload — edit your scene file, hear changes immediately
- Offline rendering — export patterns to WAV files
Architecture
pnpm monorepo with 9 packages:
| Package | Purpose |
|---|---|
@tussel/core |
Pattern query engine and transforms |
@tussel/dsl |
PatternBuilder / SignalBuilder API |
@tussel/audio |
Web Audio rendering, samples, effects |
@tussel/ir |
Expression node types, structured logger |
@tussel/mini |
Mini notation parser |
@tussel/runtime |
Scene compilation, daemon, Tidal/Strudel adapters |
@tussel/cli |
CLI entry point |
@tussel/parity |
Audio comparison tests against Strudel reference |
@tussel/testkit |
Shared test utilities |
Getting started
Requires Node.js >= 20 and pnpm.
pnpm install
pnpm check # lint + typecheck + test
Run a scene:
./bin/tussel run examples/basic.scene.ts
Acknowledgments
Tussel is a clean-room reimplementation. It does not share code with Tidal or Strudel, but it would not exist without the ideas pioneered by Alex McLean and the TidalCycles/Strudel communities. The pattern language design, mini notation syntax, and many method names originate from their work.
- TidalCycles — GPL-3.0
- Strudel — AGPL-3.0