Split kit and keys; KEYS GEN with MOTIF, 303, TURING, ARP
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:
2026-10-11 21:50:41 +03:00
parent c2c8a55642
commit 346c820b10
26 changed files with 64270 additions and 42622 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
{
"note": "mix(a,b) hash, xorshift32 Rng (next, below(n), chance(p)) and genome(seed). genome keys are the JS field names.",
"note": "mix(a,b) hash, xorshift32 Rng (next, below(n), chance(p)) and genome(seed, salts). genome keys are the JS field names.",
"mix": [
{
"a": "0x00000000",
@@ -270,6 +270,10 @@
"genomes": [
{
"seed": "0x5EEDB0C5",
"salts": [
0,
0
],
"genome": {
"steps": 14,
"form": [
@@ -279,36 +283,40 @@
1
],
"formName": "ABAB",
"scale": 18,
"root": 6,
"fillP": 110,
"rot": 1,
"swing": 35,
"arc": 0,
"layback": 0,
"dens": [
81,
37
59,
77
],
"fillP": 47,
"monoLen": 1,
"monoRange": 2,
"rot": 0,
"hocket": 85,
"accentCycle": 3,
"frame": 7,
"freeK": 4,
"freeRot": 3,
"scale": 0,
"root": 5,
"monoLen": 0,
"monoRange": 1,
"hocket": 180,
"bassDeg": 2,
"prog": [
0,
3,
0,
6,
5,
4
],
"swing": 35,
"arc": 1,
"motifLen": 5,
"accentCycle": 3,
"layback": 0,
"frame": 2,
"freeK": 3,
"freeRot": 5
"motifLen": 5
}
},
{
"seed": "0x00000001",
"salts": [
0,
0
],
"genome": {
"steps": 16,
"form": [
@@ -318,36 +326,40 @@
0
],
"formName": "AABA",
"scale": 16,
"root": 2,
"dens": [
80,
95
],
"fillP": 110,
"monoLen": 1,
"monoRange": 2,
"fillP": 102,
"rot": 0,
"swing": 35,
"arc": 2,
"layback": 1,
"dens": [
53,
68
],
"accentCycle": 7,
"frame": 3,
"freeK": 2,
"freeRot": 15,
"scale": 19,
"root": 0,
"monoLen": 2,
"monoRange": 1,
"hocket": 90,
"bassDeg": 3,
"bassDeg": 2,
"prog": [
0,
2,
5,
0,
5
4
],
"swing": 21,
"arc": 1,
"motifLen": 3,
"accentCycle": 3,
"layback": 0,
"frame": 0,
"freeK": 2,
"freeRot": 1
"motifLen": 3
}
},
{
"seed": "0xDEADBEEF",
"salts": [
0,
0
],
"genome": {
"steps": 12,
"form": [
@@ -357,36 +369,169 @@
0
],
"formName": "AAAA",
"scale": 10,
"root": 0,
"fillP": 80,
"rot": 0,
"swing": 50,
"arc": 1,
"layback": 0,
"dens": [
91,
66
78,
78
],
"fillP": 40,
"accentCycle": 5,
"frame": 0,
"freeK": 3,
"freeRot": 14,
"scale": 5,
"root": 1,
"monoLen": 0,
"monoRange": 2,
"rot": 1,
"hocket": 170,
"bassDeg": 4,
"prog": [
0,
1,
0,
3,
5,
6
],
"swing": 50,
"arc": 2,
"motifLen": 4,
"accentCycle": 5,
"motifLen": 5
}
},
{
"seed": "0x00009AAB",
"salts": [
0,
0
],
"genome": {
"steps": 20,
"form": [
0,
1,
0,
1
],
"formName": "ABAB",
"fillP": 60,
"rot": 1,
"swing": 0,
"arc": 0,
"layback": 1,
"dens": [
66,
42
],
"accentCycle": 7,
"frame": 6,
"freeK": 2,
"freeRot": 12,
"scale": 5,
"root": 3,
"monoLen": 0,
"monoRange": 2,
"hocket": 165,
"bassDeg": 2,
"prog": [
0,
6,
5,
4
],
"motifLen": 3
}
},
{
"seed": "0x5EEDB0C5",
"salts": [
3,
0
],
"genome": {
"steps": 14,
"form": [
0,
1,
0,
1
],
"formName": "ABAB",
"fillP": 110,
"rot": 1,
"swing": 35,
"arc": 0,
"layback": 0,
"dens": [
89,
77
],
"accentCycle": 0,
"frame": 1,
"freeK": 3,
"freeRot": 12,
"scale": 0,
"root": 5,
"monoLen": 0,
"monoRange": 1,
"hocket": 180,
"bassDeg": 2,
"prog": [
0,
6,
5,
4
],
"motifLen": 5
}
},
{
"seed": "0x5EEDB0C5",
"salts": [
0,
5
],
"genome": {
"steps": 14,
"form": [
0,
1,
0,
1
],
"formName": "ABAB",
"fillP": 110,
"rot": 1,
"swing": 35,
"arc": 0,
"layback": 0,
"dens": [
59,
33
],
"accentCycle": 3,
"frame": 7,
"freeK": 4,
"freeRot": 3
"freeRot": 3,
"scale": 12,
"root": 11,
"monoLen": 2,
"monoRange": 1,
"hocket": 170,
"bassDeg": 3,
"prog": [
0,
4,
5,
3
],
"motifLen": 5
}
},
{
"seed": "0x12345678",
"salts": [
0,
0
],
"genome": {
"steps": 16,
"form": [
@@ -396,36 +541,40 @@
1
],
"formName": "ABAB",
"scale": 0,
"root": 5,
"fillP": 43,
"rot": 1,
"swing": 0,
"arc": 2,
"layback": 1,
"dens": [
50,
83
49,
72
],
"fillP": 111,
"accentCycle": 5,
"frame": 4,
"freeK": 2,
"freeRot": 5,
"scale": 10,
"root": 2,
"monoLen": 1,
"monoRange": 1,
"rot": 2,
"hocket": 170,
"bassDeg": 3,
"monoRange": 2,
"hocket": 165,
"bassDeg": 2,
"prog": [
0,
0,
6,
5,
4
],
"swing": 0,
"arc": 1,
"motifLen": 5,
"accentCycle": 3,
"layback": 0,
"frame": 1,
"freeK": 3,
"freeRot": 9
"motifLen": 5
}
},
{
"seed": "0xC0FFEE00",
"salts": [
0,
0
],
"genome": {
"steps": 16,
"form": [
@@ -435,71 +584,32 @@
0
],
"formName": "AABA",
"scale": 19,
"root": 0,
"dens": [
42,
74
],
"fillP": 78,
"monoLen": 1,
"monoRange": 2,
"rot": 2,
"hocket": 210,
"bassDeg": 2,
"prog": [
0,
0,
3,
3
],
"swing": 21,
"fillP": 115,
"rot": 0,
"swing": 0,
"arc": 1,
"motifLen": 3,
"accentCycle": 5,
"layback": 0,
"frame": 3,
"freeK": 3,
"freeRot": 12
}
},
{
"seed": "0x0BADF00D",
"genome": {
"steps": 16,
"form": [
0,
0,
1,
0
],
"formName": "AABA",
"scale": 9,
"root": 6,
"dens": [
46,
85
49,
47
],
"fillP": 92,
"monoLen": 1,
"accentCycle": 3,
"frame": 3,
"freeK": 4,
"freeRot": 9,
"scale": 12,
"root": 3,
"monoLen": 0,
"monoRange": 1,
"rot": 1,
"hocket": 90,
"bassDeg": 2,
"hocket": 180,
"bassDeg": 4,
"prog": [
0,
3,
0,
6,
5,
4
],
"swing": 35,
"arc": 2,
"motifLen": 3,
"accentCycle": 3,
"layback": 0,
"frame": 3,
"freeK": 2,
"freeRot": 9
"motifLen": 5
}
}
]