Split kit and keys; KEYS GEN with MOTIF, 303, TURING, ARP
Some checks failed
check / check (push) Has been cancelled
Some checks failed
check / check (push) Has been cancelled
- genome(seed, salts) now has three parts with their own RNG streams: shared (steps, form, swing, arc, layback, fill odds, phase offset), kit (density, frame, accent cycle, free snare) and keys (scale/root, progression, motif, hocket, bass tone, note lengths, range). ROLL KEYS now renews the harmony too; ROLL KIT leaves the keys alone. - Keys generators share one signature and can fix note lengths: MOTIF (the old line), 303 (acid bass, answers in the rests, drone or silent pad), TURING (8/16-bit shift register, DRIFT flips bits, 16-bar window), ARP (triad/7th arpeggio, roots on kicks). - Pages: KIT GEN, KEYS GEN; ROLL shows KIT / KEYS; slots keep both gens. - Flash record v3 (old settings ignored). Bring-up golden checksums updated. - C port matches; host test and ASan/UBSan pass. Intended music change: every seed sounds different (genome split, new generators). Vectors regenerated with npm run vectors; the case grid now crosses all kit and keys generators, with TURING runs past its window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
enum { SB_T_KICK, SB_T_KICK2, SB_T_SNARE, SB_T_GHOST, SB_T_HAT, SB_T_HAT16, SB_T_PERC,
|
||||
SB_T_BASS, SB_T_MELA, SB_T_MELB, SB_T_PAD };
|
||||
enum { SB_GEN_EUCLID, SB_GEN_SKELETON, SB_GEN_SUBDIV, SB_GEN_AUTOMATA, SB_GEN_AMENIZER, SB_NGEN };
|
||||
enum { SB_KEYS_MOTIF, SB_KEYS_303, SB_KEYS_TURING, SB_KEYS_ARP, SB_NKEYS };
|
||||
|
||||
/* hash and RNG */
|
||||
uint32_t sb_mix(uint32_t a, uint32_t b);
|
||||
@@ -38,11 +39,12 @@ typedef struct {
|
||||
int prog[4];
|
||||
int swing, arc, motifLen, accentCycle, layback, frame, freeK, freeRot;
|
||||
} sb_genome;
|
||||
void sb_genome_make(uint32_t seed, sb_genome *g);
|
||||
typedef struct { uint32_t seed; uint32_t salts[2]; } sb_state;
|
||||
/* shared part from the seed; kit and keys parts also take their salt (ROLL KIT / ROLL KEYS) */
|
||||
void sb_genome_make(const sb_state *st, sb_genome *g);
|
||||
const char *sb_form_name(int form_idx);
|
||||
|
||||
typedef struct { uint32_t seed; uint32_t salts[2]; } sb_state;
|
||||
typedef struct { int gen, energy, drift, fill, scale, root; } sb_params; /* scale, root: -1 = AUTO (the seed picks) */
|
||||
typedef struct { int gen, keys, energy, drift, fill, scale, root; } sb_params; /* scale, root: -1 = AUTO (the seed picks) */
|
||||
|
||||
/* one output row: [t, lane, v, vel, len, tr] */
|
||||
typedef struct { int16_t t, len; uint8_t lane, v, vel, tr; } sb_event;
|
||||
@@ -56,7 +58,8 @@ typedef struct {
|
||||
|
||||
/* ROOT / SCALE pages: overrides the genome's scale and root when they're >= 0 (app.js applyKey). */
|
||||
void sb_apply_key(sb_genome *g, const sb_params *p);
|
||||
const char *sb_scale_name(int scale); /* screen name, at most 10 characters */
|
||||
const char *sb_scale_name(int scale);
|
||||
const char *sb_keys_name(int keys); /* MOTIF, 303, TURING, ARP */ /* screen name, at most 10 characters */
|
||||
|
||||
void sb_render_bar(const sb_state *st, const sb_params *p, int bar, sb_bar *out);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user