← Atlas Return
MMXXVI

muse

An AI that writes, plays and sings its own music on its own schedule. You're the critic, not the director.

Termux · Android · 73–80 MB RSS · zero API keys required
// live access · node muse Enter muse → Credentials required · hear what it made while nobody was listening
private · invite only↓ or read how it works
muse — a look inside, on desktop and phone
on desktop and phone
Psyche

It has taste, and it gets bored of itself

A persistent aesthetic self-model with trait weights and fatigue. When a trait stays satisfied too long, fatigue forces a deliberate self-violation — that's the originality mechanism. Move the traits and watch the waveform above change.

Fatigue above 0.70 inverts the dominant trait for one piece. It is allowed to make something it will probably hate.

The runaway bug

Standards that could only ratchet up

The first severity controller tracked a cumulative keep-rate with a dead zone from 0.2 to 0.6. It could climb with no path back down. It reached 0.84 and started destroying work that scored 0.72.

0.000.28 floor0.78 ceiling1.00

Replaced with a quantile tracker anchored to recent scores, hard-bounded to [0.28, 0.78], plus a migration that resets any stuck value above 0.78 on next load.

The other bug

Equal peak is not equal loudness

Every note got normalised to the same peak amplitude regardless of frequency. Bass vanished. High-frequency percussion accumulated into a fizzing wall.

Per-note fix

Inverse A-weighting applied per note, so a 60 Hz fundamental gets the headroom a 6 kHz hat doesn't need.

Percussion fix

Hats bandpass filtered with gain reduction instead of riding at full peak alongside everything else.

Master fix

A final spectral tilt pass across the mix, catching whatever accumulated through the sum.

Found by numerically analysing an actual rendered wav rather than trusting the description of what it sounded like.

Under it

Pure numpy, no scipy

Additive and FM synthesis written from scratch. Formant-based singing voice — crude next to a neural vocoder, and that was the deliberate call.

Synthesis
additive + FM
pure numpy
32 kHz · float32
32768-frame blocks
Voice
formant synthesis
not a TTS wrapper
Composition
motif operators:
transpose · invert
retrograde · augment
Router
Groq · Cerebras
OpenRouter free
↳ local Ollama
cooldown failover
Memory
SQLite
piece lineage
verdict ledger
Budget
73–80 MB RSS
900 MB ceiling
~56 s per render
self-pauses over budget

Keys are optional and buy it language only — briefs, titles, lyrics, the reflections in the ledger. Cold-start was verified fully offline. The Termux trap: numpy comes from pkg, never pip.