Press play. It never repeats.
Rossi is a generative mood radio. Pick a station and the music is composed and synthesized live in your browser. No recordings, no loops, no backend.
Live: https://osgk.com/rossi/
- Seven stations: Zen, Piano, Piano for writing, Slooow rock, Jazzy, Electro, Soft 70s disco
- One shared engine. A station is a block of data: keys, tempo, chord progressions, layers
- A mixer per station: level, on/off and activity for every layer
- Milkdrop style visuals that react to the music, with fullscreen
- A player inspired by late 90s desktop players, sized for touch
- Green or amber display, keyboard shortcuts, settings remembered in the browser
- Fully static: runs on any plain web host
- Node.js 20 or newer (to build)
- Any static web host (to serve)
- A current browser. Visuals need WebGL 2; without it Rossi shows a simple spectrum
git clone https://github.com/lor3nzo/rossi.git
cd rossi
npm install
npm run dev
npm run build
Upload everything inside dist/, including the hidden .htaccess, to a folder on
your host. The build uses relative paths, so it runs from any folder, for example
public_html/rossi/. Serve it over HTTPS: browsers restrict audio on insecure pages.
Add a config to src/stations.ts. It picks voices from src/engine/voices.ts
and sets the keys, tempo range, swing and progressions.
| File | What it holds |
|---|---|
src/stations.ts |
Station configs |
src/engine/harmony.ts |
Keys, scales, sections (the conductor) |
src/engine/voices.ts |
The synthesized instruments |
src/engine/engine.ts |
Mixing, reverb, limiter, station switching |
src/visualizer.ts |
Butterchurn visuals and the fallback |
src/main.ts |
The interface |
Open the page with ?debug to get the engine as window.rossi in the console.
No accounts, no tracking, no network calls after the page loads. See SECURITY.md.
Apache License 2.0. See LICENSE. Copyright belongs to the rights holder named in
NOTICE, which also lists the third party libraries.
