feat(presets): hand-authored pattern families

Add explicit 6-colour style families to the pattern bank so genre presets
feel musically distinct (merged SP-C2). All colours hand-written following
the role convention (base/busier/broken/double/sparse/fill), velocity-
humanized; existing families and every default stay untouched.

Changes:
- MEL: dub (reese/pad/chord/bells/melody), psy (sub/reese/arp/lead/stab),
  house (pad/chord/stab/bells/lead/melody), ambient (pad/bells/melody/
  sub/reese) - 21 families x 6 motifs.
- DRUMS: percu-voice + style-completion families for ride/shaker/crash/
  rim/fx/sweep/perc (techno/house/breaks/dnb/trance/ambient).

Impact: vocabulary for the genre presets; wired per preset in a later
task. test_families.py PASS (validity + >=4 distinct + coverage).
This commit is contained in:
L'électron rare
2026-06-30 00:06:08 +02:00
parent 38d79f8510
commit fc73be4851
@@ -341,6 +341,222 @@ MEL = {
},
}
# === SP-C2 hand-authored style families (6 colours each, following the colour-role
# convention base/busier/broken/double/sparse/fill, velocity-humanized). Existing
# families and every `default` stay untouched; these are pure additions. ===
# -- dub mel: deep, sparse, off-beat skank stabs, long rests (A-minor degrees) --
MEL["reese"]["dub"] = [
_mel([(0,.85),N,N,N,(0,.5),N,N,N,(3,.6),N,N,N,(0,.5),N,N,N]),
_mel([(0,.85),N,(0,.4),N,(0,.6),N,(3,.45),N,(3,.6),N,(0,.4),N,(0,.55),N,(3,.45),N]),
_mel([N,N,(0,.7),N,N,(0,.5),N,N,(3,.6),N,N,(0,.45),N,N,(5,.55),N]),
_mel([(0,.8),N,(0,.5),N,(3,.6),N,(3,.5),N,(5,.6),N,(5,.5),N,(3,.6),N,(0,.5),N]),
_mel([(0,.7),N,N,N,N,N,N,N,(3,.5),N,N,N,N,N,N,N]),
_mel([(0,.8),N,(0,.5),(3,.5),(3,.6),(5,.5),(5,.6),(7,.6),(7,.7),N,(5,.5),N,(3,.6),(3,.5),(0,.7),(0,.6)]),
]
MEL["pad"]["dub"] = [
_mel([(0,.55),N,N,N,N,N,N,N,(3,.5),N,N,N,N,N,N,N]),
_mel([(0,.55),N,N,N,(7,.45),N,N,N,(3,.5),N,N,N,(7,.45),N,N,N]),
_mel([N,N,N,(0,.55),N,N,N,(7,.45),N,N,N,(5,.5),N,N,N,(3,.45)]),
_mel([(0,.55),N,(7,.4),N,(3,.5),N,(10,.4),N,(5,.5),N,(12,.4),N,(7,.5),N,(3,.4),N]),
_mel([(0,.5),N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]),
_mel([(0,.55),N,N,N,(3,.5),N,N,N,(5,.55),N,N,N,(7,.6),N,(10,.5),(12,.6)]),
]
MEL["chord"]["dub"] = [
_mel([N,N,(0,.6),N,N,N,(0,.5),N,N,N,(3,.55),N,N,N,(0,.5),N]),
_mel([N,N,(0,.6),N,N,(3,.45),(0,.5),N,N,N,(3,.55),N,N,(5,.45),(0,.5),N]),
_mel([N,(0,.6),N,N,(3,.5),N,N,(5,.45),N,(3,.55),N,N,(7,.5),N,N,(0,.45)]),
_mel([(0,.6),N,(0,.4),(3,.5),N,(0,.4),(5,.55),N,(0,.4),(7,.5),N,(0,.4),(3,.55),N,(0,.4),(5,.5)]),
_mel([N,N,(0,.55),N,N,N,N,N,N,N,(3,.5),N,N,N,N,N]),
_mel([N,N,(0,.6),N,(3,.5),N,(5,.55),N,(7,.6),N,(5,.5),(3,.55),(0,.6),(3,.5),(5,.55),(7,.6)]),
]
MEL["bells"]["dub"] = [
_mel([(12,.6),N,N,N,N,N,N,N,N,N,(7,.45),N,N,N,N,N]),
_mel([(12,.6),N,N,N,(7,.4),N,N,N,(10,.5),N,N,N,(7,.4),N,N,N]),
_mel([N,N,N,(12,.55),N,N,(7,.4),N,N,N,(10,.5),N,N,(5,.4),N,N]),
_mel([(12,.6),N,(7,.4),N,(10,.5),N,(5,.4),N,(12,.55),N,(7,.4),N,(8,.5),N,(3,.4),N]),
_mel([(12,.55),N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]),
_mel([(12,.6),N,(10,.5),N,(7,.5),N,(5,.5),N,(7,.55),N,(10,.5),N,(12,.6),(10,.5),(7,.5),(12,.65)]),
]
MEL["melody"]["dub"] = [
_mel([N,N,N,N,(7,.6),N,N,N,N,N,N,N,(5,.5),N,N,N]),
_mel([N,N,(7,.5),N,(7,.6),N,N,(5,.45),N,N,(3,.5),N,(5,.55),N,N,N]),
_mel([N,(7,.55),N,N,(5,.5),N,N,(3,.45),N,(7,.5),N,N,(10,.5),N,N,(5,.45)]),
_mel([(7,.6),N,(5,.45),N,(3,.5),N,(5,.45),N,(7,.55),N,(10,.45),N,(7,.5),N,(5,.45),N]),
_mel([N,N,N,N,(7,.5),N,N,N,N,N,N,N,N,N,N,N]),
_mel([(7,.6),N,(10,.5),N,(12,.55),N,(10,.5),(7,.5),(5,.55),N,(7,.5),N,(10,.55),(7,.5),(5,.55),(3,.6)]),
]
# -- psy mel: rolling 16th basslines, fast tight arps, minor --
MEL["sub"]["psy"] = [
_mel([_bass(0,.9),N,N,_bass(0,.5),N,N,_bass(0,.55),N,N,_bass(3,.6),N,N,_bass(0,.55),N,N,_bass(2,.5)]),
_mel([_bass(0,.9),N,_bass(0,.45),_bass(0,.55),N,_bass(0,.45),_bass(3,.6),N,_bass(0,.45),_bass(0,.55),N,_bass(0,.45),_bass(5,.6),N,_bass(0,.45),_bass(2,.5)]),
_mel([_bass(0,.85),N,N,_bass(7,.5),N,_bass(0,.45),N,N,_bass(3,.6),N,_bass(0,.45),N,_bass(5,.55),N,N,_bass(2,.5)]),
_mel([_bass(0,.9),_bass(0,.5),_bass(0,.6),_bass(0,.5)]*4),
_mel([_bass(0,.85),N,N,N,N,N,_bass(0,.55),N,N,N,N,N,_bass(3,.55),N,N,N]),
_mel([_bass(0,.9),_bass(0,.5),_bass(3,.6),_bass(0,.5),_bass(5,.6),_bass(0,.5),_bass(7,.6),_bass(0,.5),_bass(8,.6),_bass(0,.5),_bass(7,.6),_bass(5,.55),_bass(3,.6),_bass(2,.55),_bass(0,.7),_bass(0,.55)]),
]
MEL["reese"]["psy"] = [
_mel([(0,.85),N,N,(0,.5),N,N,(3,.55),N,N,(0,.5),N,N,(5,.55),N,N,(0,.5)]),
_mel([(0,.85),(0,.45),N,(0,.5),(3,.55),N,(0,.45),(3,.5),N,(0,.45),(5,.55),N,(0,.45),(5,.5),N,(0,.5)]),
_mel([(0,.8),N,(7,.5),N,(0,.45),N,(3,.55),(0,.45),N,(5,.55),N,(0,.45),(7,.5),N,(0,.45),(2,.5)]),
_mel([(0,.85),(0,.5),(3,.55),(0,.5),(5,.55),(0,.5),(7,.55),(0,.5),(8,.55),(0,.5),(7,.55),(0,.5),(5,.55),(0,.5),(3,.55),(0,.5)]),
_mel([(0,.8),N,N,N,(0,.5),N,N,N,(3,.55),N,N,N,(0,.5),N,N,N]),
_mel([(0,.85),(0,.5),(3,.6),(5,.55),(7,.6),(5,.55),(3,.6),(0,.5),(2,.55),(3,.6),(5,.55),(7,.6),(8,.6),(7,.55),(3,.6),(0,.7)]),
]
MEL["arp"]["psy"] = [
_mel([(0,.7),N,(7,.6),N,(12,.65),N,(7,.6),N,(0,.7),N,(7,.6),N,(12,.65),N,(7,.6),N]),
_mel([(0,.7),(3,.55),(7,.6),(10,.55),(12,.65),(10,.55),(7,.6),(3,.55),(0,.7),(3,.55),(7,.6),(10,.55),(12,.65),(10,.55),(7,.6),(3,.55)]),
_mel([(0,.7),N,(12,.6),(7,.55),N,(10,.6),(3,.55),N,(0,.65),(7,.6),N,(12,.6),(5,.55),N,(7,.6),(3,.55)]),
_mel([(0,.7),(12,.6),(7,.6),(12,.6),(3,.65),(12,.6),(7,.6),(12,.6),(5,.65),(12,.6),(7,.6),(12,.6),(8,.65),(12,.6),(7,.6),(12,.6)]),
_mel([(0,.65),N,N,N,(7,.6),N,N,N,(12,.6),N,N,N,(7,.6),N,N,N]),
_mel([(0,.7),(7,.6),(12,.65),(14,.6),(15,.7),(14,.6),(12,.65),(7,.6),(10,.65),(12,.6),(14,.65),(15,.6),(17,.7),(15,.6),(12,.65),(0,.75)]),
]
MEL["lead"]["psy"] = [
_mel([(0,.75),N,N,N,(3,.6),N,N,N,(7,.65),N,N,N,(5,.6),N,N,N]),
_mel([(0,.75),N,(3,.55),N,(7,.6),N,(5,.55),N,(8,.6),N,(7,.55),N,(5,.6),N,(3,.55),N]),
_mel([N,(0,.7),N,(7,.55),N,N,(3,.6),N,(5,.55),N,N,(7,.6),N,(8,.55),N,(5,.6)]),
_mel([(0,.7),(7,.55),(3,.6),(7,.55),(5,.6),(7,.55),(8,.6),(7,.55),(10,.6),(7,.55),(8,.6),(7,.55),(5,.6),(3,.55),(2,.6),(0,.6)]),
_mel([(0,.7),N,N,N,N,N,N,N,(7,.6),N,N,N,N,N,N,N]),
_mel([(0,.75),(3,.6),(5,.6),(7,.65),(8,.6),(10,.65),(12,.7),(10,.6),(8,.65),(7,.6),(5,.65),(3,.6),(2,.6),(0,.65),(0,.55),(12,.75)]),
]
MEL["stab"]["psy"] = [
_mel([(0,.7),N,N,N,N,N,(0,.6),N,N,N,(3,.6),N,N,N,(0,.55),N]),
_mel([(0,.7),N,(0,.5),N,N,(3,.55),(0,.5),N,N,N,(3,.6),N,(5,.55),N,(0,.55),N]),
_mel([N,N,(0,.65),N,(3,.55),N,N,(5,.5),N,(0,.55),N,N,(7,.55),N,(0,.5),N]),
_mel([(0,.65),(0,.45),N,(3,.55),(0,.45),N,(5,.55),(0,.45),N,(7,.55),(0,.45),N,(3,.55),(0,.45),(0,.55),N]),
_mel([N,N,N,N,N,N,(0,.6),N,N,N,N,N,N,N,(3,.55),N]),
_mel([(0,.7),N,(3,.55),N,(5,.6),N,(7,.55),N,(8,.6),(7,.55),(5,.6),(3,.55),(0,.6),(3,.55),(5,.6),(7,.65)]),
]
# -- house mel: chord stabs on off-beats, syncopated, soulful --
MEL["pad"]["house"] = [
_mel([N,N,(0,.55),N,N,N,(3,.5),N,N,N,(5,.55),N,N,N,(3,.5),N]),
_mel([N,N,(0,.55),N,(7,.45),N,(3,.5),N,(10,.45),N,(5,.55),N,(7,.45),N,(3,.5),N]),
_mel([N,(0,.55),N,N,(3,.5),N,(5,.45),N,N,(7,.5),N,(5,.45),N,(3,.5),N,(0,.45)]),
_mel([(0,.55),(7,.4),(3,.5),(10,.4),(5,.55),(12,.4),(3,.5),(10,.4),(5,.55),(12,.4),(7,.5),(14,.4),(5,.55),(12,.4),(3,.5),(10,.4)]),
_mel([N,N,(0,.5),N,N,N,N,N,N,N,(5,.5),N,N,N,N,N]),
_mel([N,N,(0,.55),N,(3,.5),N,(5,.55),N,(7,.5),N,(5,.55),(3,.5),(0,.55),(3,.5),(5,.55),(7,.6)]),
]
MEL["chord"]["house"] = [
_mel([N,N,(0,.6),N,(0,.55),N,N,N,(5,.6),N,(5,.55),N,N,N,(3,.55),N]),
_mel([N,(0,.45),(0,.6),N,(0,.55),N,(3,.5),N,(5,.55),(5,.45),(5,.6),N,(3,.55),N,(0,.5),N]),
_mel([N,N,(0,.6),(3,.5),N,(5,.55),N,N,(7,.55),N,(5,.5),N,(3,.55),N,(0,.5),N]),
_mel([(0,.6),N,(0,.45),(3,.55),N,(0,.45),(5,.6),N,(0,.45),(7,.55),N,(0,.45),(5,.6),N,(0,.45),(3,.55)]),
_mel([N,N,(0,.55),N,N,N,N,N,(5,.55),N,N,N,N,N,N,N]),
_mel([N,N,(0,.6),N,(3,.55),N,(5,.6),N,(7,.6),(5,.55),(3,.6),N,(0,.6),(3,.55),(5,.6),(7,.65)]),
]
MEL["stab"]["house"] = [
_mel([N,N,(0,.65),N,N,N,(0,.6),N,N,N,(5,.65),N,N,N,(3,.6),N]),
_mel([N,(0,.5),(0,.65),N,(3,.55),N,(0,.6),N,(5,.55),N,(5,.65),N,(3,.6),N,(0,.55),N]),
_mel([N,N,(0,.65),(3,.5),N,(5,.6),N,N,(7,.6),N,(5,.5),N,(3,.6),N,(0,.55),(0,.5)]),
_mel([(0,.6),N,(3,.55),(5,.6),N,(3,.55),(7,.6),N,(5,.55),(8,.6),N,(5,.55),(7,.6),N,(3,.55),(0,.6)]),
_mel([N,N,(0,.6),N,N,N,N,N,N,N,(5,.6),N,N,N,N,N]),
_mel([N,N,(0,.65),N,(3,.6),N,(5,.65),N,(7,.65),(8,.6),(7,.65),(5,.6),(3,.65),(2,.6),(0,.65),(7,.7)]),
]
MEL["bells"]["house"] = [
_mel([(12,.6),N,N,N,(7,.55),N,N,N,(10,.6),N,N,N,(12,.6),N,N,N]),
_mel([(12,.6),N,(7,.5),N,(7,.55),N,(10,.5),N,(10,.6),N,(12,.5),N,(12,.6),N,(15,.55),N]),
_mel([N,(12,.6),N,(7,.5),N,N,(10,.55),N,(12,.6),N,N,(15,.5),N,(12,.55),N,(10,.5)]),
_mel([(12,.6),(7,.45),(10,.55),(12,.45),(15,.6),(12,.45),(10,.55),(7,.45),(12,.6),(15,.45),(17,.55),(15,.45),(12,.6),(10,.45),(7,.55),(12,.5)]),
_mel([(12,.55),N,N,N,N,N,N,N,(10,.55),N,N,N,N,N,N,N]),
_mel([(12,.6),N,(10,.55),N,(7,.55),N,(10,.6),N,(12,.6),(15,.55),(12,.6),(10,.55),(7,.6),(10,.55),(12,.6),(17,.65)]),
]
MEL["lead"]["house"] = [
_mel([N,N,(7,.65),N,N,N,(5,.6),N,N,N,(3,.6),N,N,N,(5,.6),N]),
_mel([N,(7,.5),(7,.65),N,(10,.55),N,(5,.6),N,(8,.55),N,(3,.6),N,(5,.55),N,(7,.6),N]),
_mel([N,N,(7,.65),(10,.5),N,(12,.6),N,N,(10,.6),N,(7,.5),N,(5,.6),N,(3,.55),N]),
_mel([(7,.6),(5,.5),(3,.6),(5,.5),(7,.6),(10,.5),(12,.6),(10,.5),(8,.6),(7,.5),(5,.6),(3,.5),(2,.6),(0,.5),(3,.6),(5,.5)]),
_mel([N,N,(7,.6),N,N,N,N,N,N,N,(5,.6),N,N,N,N,N]),
_mel([(7,.65),N,(10,.6),N,(12,.65),N,(10,.6),(8,.6),(7,.65),(5,.6),(3,.65),(5,.6),(7,.65),(10,.6),(12,.65),(15,.7)]),
]
MEL["melody"]["house"] = [
_mel([(7,.6),N,N,N,(10,.55),N,N,N,(7,.6),N,N,N,(5,.55),N,N,N]),
_mel([(7,.6),N,(10,.5),N,(10,.6),N,(12,.5),N,(7,.6),N,(5,.5),N,(5,.6),N,(3,.5),N]),
_mel([N,(7,.6),N,(10,.5),N,N,(12,.55),N,(10,.6),N,N,(7,.5),N,(5,.55),N,(3,.5)]),
_mel([(7,.6),(10,.5),(12,.6),(10,.5),(7,.6),(5,.5),(3,.6),(5,.5),(7,.6),(10,.5),(12,.6),(14,.5),(15,.6),(14,.5),(12,.6),(10,.5)]),
_mel([(7,.55),N,N,N,N,N,N,N,(10,.55),N,N,N,N,N,N,N]),
_mel([(7,.6),N,(10,.55),N,(12,.6),N,(15,.6),N,(12,.6),(10,.55),(7,.6),(5,.55),(3,.6),(5,.55),(7,.6),(12,.65)]),
]
# -- ambient mel: very sparse, long-feel, few notes, wide --
MEL["pad"]["ambient"] = [
_mel([(0,.45),N,N,N,N,N,N,N,(7,.4),N,N,N,N,N,N,N]),
_mel([(0,.45),N,N,N,(7,.4),N,N,N,(3,.45),N,N,N,(10,.4),N,N,N]),
_mel([N,N,N,N,(0,.45),N,N,N,N,N,N,N,(5,.4),N,N,N]),
_mel([(0,.45),N,N,N,(3,.42),N,N,N,(5,.44),N,N,N,(7,.42),N,N,N]),
_mel([(0,.4),N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]),
_mel([(0,.45),N,N,N,(3,.42),N,N,N,(7,.45),N,N,N,(10,.42),N,(12,.45),N]),
]
MEL["bells"]["ambient"] = [
_mel([(12,.5),N,N,N,N,N,N,N,N,N,N,N,(7,.4),N,N,N]),
_mel([(12,.5),N,N,N,N,N,(7,.4),N,N,N,N,N,(10,.45),N,N,N]),
_mel([N,N,N,N,(12,.5),N,N,N,N,N,N,(7,.4),N,N,N,N]),
_mel([(12,.5),N,N,(7,.4),N,N,(10,.45),N,N,(5,.4),N,N,(12,.45),N,N,N]),
_mel([(12,.45),N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]),
_mel([(12,.5),N,N,N,(10,.4),N,N,N,(7,.45),N,N,N,(10,.4),N,(12,.5),N]),
]
MEL["melody"]["ambient"] = [
_mel([N,N,N,N,(7,.45),N,N,N,N,N,N,N,N,N,N,N]),
_mel([(7,.45),N,N,N,N,N,(5,.4),N,N,N,N,N,(3,.42),N,N,N]),
_mel([N,N,N,(7,.45),N,N,N,N,(10,.4),N,N,N,N,N,(5,.4),N]),
_mel([(7,.45),N,N,(10,.4),N,N,(12,.42),N,N,(10,.4),N,N,(7,.42),N,N,N]),
_mel([N,N,N,N,N,N,N,N,(7,.42),N,N,N,N,N,N,N]),
_mel([(7,.45),N,N,N,(10,.4),N,N,N,(12,.45),N,N,N,(10,.4),N,(7,.45),N]),
]
MEL["sub"]["ambient"] = [
_mel([_bass(0,.55),N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]),
_mel([_bass(0,.55),N,N,N,N,N,N,N,_bass(3,.5),N,N,N,N,N,N,N]),
_mel([N,N,N,N,_bass(0,.55),N,N,N,N,N,N,N,N,N,N,N]),
_mel([_bass(0,.55),N,N,N,N,N,N,N,_bass(5,.5),N,N,N,_bass(3,.5),N,N,N]),
_mel([_bass(0,.5),N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]),
_mel([_bass(0,.55),N,N,N,_bass(3,.5),N,N,N,_bass(5,.5),N,N,N,_bass(7,.55),N,N,N]),
]
MEL["reese"]["ambient"] = [
_mel([(0,.5),N,N,N,N,N,N,N,(7,.42),N,N,N,N,N,N,N]),
_mel([(0,.5),N,N,N,(7,.4),N,N,N,(3,.45),N,N,N,(5,.4),N,N,N]),
_mel([N,N,N,N,(0,.5),N,N,N,N,N,N,N,(7,.4),N,N,N]),
_mel([(0,.5),N,N,(3,.4),N,N,(5,.42),N,N,(7,.4),N,N,(5,.42),N,N,N]),
_mel([(0,.45),N,N,N,N,N,N,N,N,N,N,N,N,N,N,N]),
_mel([(0,.5),N,N,N,(3,.42),N,N,N,(5,.45),N,N,N,(7,.42),N,(10,.45),N]),
]
# -- drum style families for the percu voices + style completions --
DRUMS["ride"]["techno"] = ["x.x.x.x.x.x.x.x.", "xXx.xXx.xXx.xXx.", "x..x.x.x..x.x.x.",
"xxxxxxxxxxxxxxxx", "x...x...x...x...", "x.x.x.x.x.x.xXXX"]
DRUMS["ride"]["house"] = ["..x...x...x...x.", "..X.o.X.o.X.o.X.", "..x...x.x...x..x",
".x.x.x.x.x.x.x.x", "..x.......x.....", "..x...x...x.xXXX"]
DRUMS["ride"]["dnb"] = ["x.x.x.xxx.x.x.xx", "xXxxxXxxxXxxxXxx", "x.xx.x.xx.xx.x.x",
"xxxxxxxxxxxxxxxx", "x...x...x...x...", "x.xxx.xxx.xxxXXX"]
DRUMS["shaker"]["techno"] = ["oxoxoxoxoxoxoxox", "oXoxoXoxoXoxoXox", "ox.xoxo.ox.xoxo.",
"xxxxxxxxxxxxxxxx", "o.o.o.o.o.o.o.o.", "oxoxoxoxoxoxoXXX"]
DRUMS["shaker"]["house"] = ["o-x-o-x-o-x-o-x-", "o-X-o-x-o-X-o-x-", "o.x-o.x-o.x-o.x-",
"oxxxoxxxoxxxoxxx", "o---o---o---o---", "o-x-o-x-o-x-oXXX"]
DRUMS["shaker"]["breaks"] = ["x.o.xxo.x.o.xxo.", "xXo.xxo.xXo.xxo.", "x.oxx.o.x.oxx.o.",
"xoxoxoxoxoxoxoxo", "x...x...x...x...", "x.o.xxo.x.o.xXXX"]
DRUMS["shaker"]["dnb"] = ["xoxoxoxoxoxoxoxo", "xXxoxXxoxXxoxXxo", "xo.xxoxo.xoxxo.x",
"xxxxxxxxxxxxxxxx", "x...x...x...x...", "xoxoxoxoxoxoXXXX"]
DRUMS["crash"]["techno"] = ["X.......X.......", "X...o...X...o...", "..X.......X.....",
"X...X...X...X...", "X...............", "X.......X...xXXX"]
DRUMS["crash"]["breaks"] = ["X.......-.......", "X...-...X...-...", "..X...-...X.....",
"X...X...X...X...", "X...............", "X.......-...xXXX"]
DRUMS["rim"]["techno"] = ["....x.......x...", "..o.x...o.o.x...", "...x..x...x.x...",
"x.x.x.x.x.x.x.x.", "....x...........", "....x.......xoXX"]
DRUMS["rim"]["dnb"] = ["....x......x.x..", "..o.x..o.ox.x.o.", ".x..x.x..x.x..x.",
"oxoxoxoxoxoxoxox", "....x...........", "....x..x.x.oxXXX"]
DRUMS["fx"]["techno"] = ["X.......o.......", "X...o...o...o...", "....X.......o...",
"X...X...X...X...", "X...............", "o.o.o.o.oxoxoXXX"]
DRUMS["fx"]["ambient"] = ["X...............", "X.............o.", "........X.......",
"X.......o.......", "o...............", "o...o...o..oo.XX"]
DRUMS["sweep"]["trance"] = ["o.....-.....x...", "o...-...-...x...", "..o.....-...x...",
"o.-.x.o.-.x.o.-.", "o...............", "o...-...x..xXXXX"]
DRUMS["sweep"]["ambient"] = ["o...............", "o.......-.......", "....o...........",
"o.......o.......", "o...............", "o...-...x..-.oXX"]
DRUMS["perc"]["breaks"] = ["..x...x...x.x...", "..X.o.x...X.x.o.", ".x..x..x.x..x.x.",
"x.x.x.x.x.x.x.x.", "..x..........x..", "..x...x...x.xXXX"]
DRUMS["perc"]["dnb"] = ["..x...x.x.x...x.", "..X.o.x.x.X.o.x.", ".x.x..x.x..x.x.x",
"xoxoxoxoxoxoxoxo", "..x..........x..", "..x...x.x.xoxXXX"]
# preset name -> (drum family, melodic family)
PRESET_FAMILY = {
"techno_drive": ("techno", "default"), "detroit_soul": ("house", "default"),