Stop retyping your entire personality

join, render, play, and trigger load a small TOML-style preset:

./zig-out/bin/kujamba render --config myvoice.toml --out phrase.wav

Without --config, the optional kujamba.toml in your current directory is auto-loaded. An explicit missing file fails. An absent automatic file is normal. The parser is a supported subset, not a promise of every TOML feature.

Precedence

Built-in defaults → config file → command-line flags.

A flag wins wherever it appears. --voice replaces the whole voice table, not just the fields it mentions. A host override without a port retains the configured port. --phrases overrides a configured single phrase.

Instrument preset

phrase = "kujamba karibu"
pattern = "3+1"

[voice]
attack = 1.0
noise = 0.5
wobble = 1.0
intensity = 0.8
cents = -100

[map]
note60 = "habari yako"
note61 = "shuzi:3"
Field Meaning
phrase Default phrase text
pattern Bar pattern such as "3+1"
host Room address, including optional port
user, pass Join-only credentials
[voice] attack, noise, wobble, intensity, cents
[map] noteN bindings to phrase text or "shuzi:SEED"

Connection keys are ignored by offline rendering. The note map is used by trigger, not automatically converted into a NINJAM phrase bank.

Malformed input reports a file and line. Values use the same instrument parsers as the command line. Unknown keys are not an extension mechanism.

A room preset is private

Add host, user, and pass locally if you need them:

chmod 600 myroom.toml
./zig-out/bin/kujamba join --config myroom.toml

The file remains plaintext. Keep credentials out of commits, generated docs, screenshots, and issue reports. The checked-in example preset contains demonstration values, not a public room invitation.

Next: voice controls and the sampler.