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

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
}
}
]