@hraness/dawg 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/DAWG.md +454 -140
  3. package/README.md +30 -26
  4. package/core/autotune.ts +1119 -0
  5. package/core/chords.ts +271 -23
  6. package/core/clips.ts +499 -0
  7. package/core/diff.ts +184 -104
  8. package/core/expression.ts +15 -0
  9. package/core/fx.ts +99 -29
  10. package/core/ids.ts +52 -0
  11. package/core/instruments.ts +19 -0
  12. package/core/keys.ts +3 -3
  13. package/core/loop.ts +8 -0
  14. package/core/lyrics.ts +297 -0
  15. package/core/master.ts +3 -3
  16. package/core/range.ts +581 -0
  17. package/core/resonators.ts +16 -2
  18. package/core/routing.ts +165 -0
  19. package/core/score.ts +955 -14
  20. package/core/sdk/eval-child.ts +7 -2
  21. package/core/sdk/eval.ts +35 -6
  22. package/core/sdk/print.ts +287 -5
  23. package/core/sdk/sync-lyrics.ts +49 -0
  24. package/core/sdk/v1.ts +2132 -46
  25. package/core/sections.ts +480 -35
  26. package/core/sing.ts +815 -0
  27. package/core/style-provenance.ts +80 -0
  28. package/core/styles/africa-mena-southasia.ts +2893 -0
  29. package/core/styles/americas.ts +3810 -0
  30. package/core/styles/art.ts +4993 -0
  31. package/core/styles/base.ts +123 -0
  32. package/core/styles/cycles.ts +106 -0
  33. package/core/styles/electronic.ts +2723 -0
  34. package/core/styles/europe-asia-pacific.ts +2838 -0
  35. package/core/styles/excerpt.ts +29 -0
  36. package/core/styles/gamelan.ts +283 -0
  37. package/core/styles/generate.ts +2199 -0
  38. package/core/styles/index.ts +515 -0
  39. package/core/styles/parts.ts +106 -0
  40. package/core/styles/pop.ts +3189 -0
  41. package/core/styles/rock.ts +2993 -0
  42. package/core/styles/roots.ts +4175 -0
  43. package/core/styles/schema.ts +429 -0
  44. package/core/styles/taxonomy.ts +940 -0
  45. package/core/styles/validate.ts +528 -0
  46. package/core/tempo.ts +32 -2
  47. package/core/tuning.ts +19 -3
  48. package/core/vocoder.ts +524 -0
  49. package/guides/agent.md +29 -0
  50. package/guides/arrange.md +31 -0
  51. package/guides/audio.md +31 -0
  52. package/guides/audition.md +20 -14
  53. package/guides/automation.md +12 -7
  54. package/guides/chords.md +15 -15
  55. package/guides/effects.md +17 -16
  56. package/guides/faders.md +20 -16
  57. package/guides/files.md +13 -9
  58. package/guides/getting-started.md +15 -11
  59. package/guides/keys.md +19 -15
  60. package/guides/media.md +17 -12
  61. package/guides/mix.md +15 -7
  62. package/guides/music.md +23 -8
  63. package/guides/notes.md +15 -9
  64. package/guides/panes.md +32 -0
  65. package/guides/performance.md +15 -13
  66. package/guides/play.md +21 -13
  67. package/guides/project.md +26 -8
  68. package/guides/providers.md +20 -14
  69. package/guides/resample.md +15 -9
  70. package/guides/rhythm.md +18 -13
  71. package/guides/sessions.md +17 -7
  72. package/guides/show-me.md +31 -0
  73. package/guides/sound.md +25 -9
  74. package/guides/sounds.md +15 -13
  75. package/guides/styles.md +31 -0
  76. package/guides/tape.md +32 -0
  77. package/guides/tempo.md +15 -10
  78. package/guides/tracks.md +15 -10
  79. package/guides/tuning.md +32 -0
  80. package/guides/voice.md +31 -0
  81. package/guides/web-search.md +18 -8
  82. package/native/prebuilt/darwin-arm64/libdawg_sink.dylib +0 -0
  83. package/native/prebuilt/darwin-x64/libdawg_sink.dylib +0 -0
  84. package/native/prebuilt/linux-arm64/libdawg_sink.so +0 -0
  85. package/native/prebuilt/linux-x64/libdawg_sink.so +0 -0
  86. package/native/prebuilt/manifest.json +21 -0
  87. package/package.json +6 -2
  88. package/src/agent/agent.ts +130 -18
  89. package/src/agent/calibration-tools.ts +53 -0
  90. package/src/agent/clip-tools.ts +453 -0
  91. package/src/agent/command-agent.ts +378 -0
  92. package/src/agent/drum-tools.ts +2 -2
  93. package/src/agent/expression-tools.ts +1 -1
  94. package/src/agent/gateway.ts +246 -60
  95. package/src/agent/models.ts +53 -12
  96. package/src/agent/ops.ts +27 -1
  97. package/src/agent/pack-tools.ts +1 -1
  98. package/src/agent/planner.ts +25 -0
  99. package/src/agent/portable-schema.ts +80 -0
  100. package/src/agent/preview-tool.ts +4 -1
  101. package/src/agent/provider.ts +22 -8
  102. package/src/agent/range-tools.ts +216 -0
  103. package/src/agent/rhythm-tools.ts +1 -1
  104. package/src/agent/section-tools.ts +1 -1
  105. package/src/agent/show-me.ts +497 -0
  106. package/src/agent/steer.ts +15 -0
  107. package/src/agent/style-tools.ts +217 -0
  108. package/src/agent/tool-error.ts +12 -0
  109. package/src/agent/tools.ts +110 -23
  110. package/src/agent/usage.ts +2 -2
  111. package/src/agent/voice-tools.ts +925 -0
  112. package/src/agent/xcb-agent.ts +13 -10
  113. package/src/argv.ts +38 -0
  114. package/src/audio/analysis.ts +253 -0
  115. package/src/audio/arrange.ts +49 -5
  116. package/src/audio/audio-command.ts +218 -0
  117. package/src/audio/autotune-engine.ts +101 -0
  118. package/src/audio/autotune.ts +640 -0
  119. package/src/audio/clips.ts +240 -0
  120. package/src/audio/devices.ts +264 -0
  121. package/src/audio/doctor.ts +157 -0
  122. package/src/audio/dsp/bandbank.ts +138 -0
  123. package/src/audio/dsp/envelope.ts +10 -0
  124. package/src/audio/dsp/follow.ts +120 -0
  125. package/src/audio/dsp/formant.ts +427 -0
  126. package/src/audio/dsp/glottal.ts +243 -0
  127. package/src/audio/dsp/interp.ts +7 -2
  128. package/src/audio/dsp/lpc.ts +50 -0
  129. package/src/audio/dsp/periodicity.ts +59 -0
  130. package/src/audio/dsp/pitch.ts +995 -0
  131. package/src/audio/dsp/psola.ts +199 -0
  132. package/src/audio/effects/chain.ts +3 -1
  133. package/src/audio/effects/common.ts +43 -0
  134. package/src/audio/effects/convolution.ts +7 -4
  135. package/src/audio/effects/filter.ts +48 -69
  136. package/src/audio/effects/formant.ts +263 -0
  137. package/src/audio/engine.ts +360 -40
  138. package/src/audio/fit.ts +35 -3
  139. package/src/audio/instrument-check.ts +59 -43
  140. package/src/audio/instruments.ts +4 -0
  141. package/src/audio/keys/calibration.ts +56 -0
  142. package/src/audio/keys/electric.ts +8 -1
  143. package/src/audio/keys/engine.ts +13 -1
  144. package/src/audio/keys/piano.ts +22 -2
  145. package/src/audio/kits.ts +135 -6
  146. package/src/audio/live.ts +114 -20
  147. package/src/audio/native.ts +615 -0
  148. package/src/audio/preview.ts +30 -2
  149. package/src/audio/render-worker.ts +2 -0
  150. package/src/audio/renderer.ts +2 -0
  151. package/src/audio/resample.ts +2 -1
  152. package/src/audio/sampler.ts +85 -4
  153. package/src/audio/samples.ts +20 -2
  154. package/src/audio/sing/analysis.ts +193 -0
  155. package/src/audio/sing/engine.ts +949 -0
  156. package/src/audio/strings/bow.ts +48 -5
  157. package/src/audio/strings/engine.ts +8 -2
  158. package/src/audio/synth/oscillators.ts +31 -21
  159. package/src/audio/synth/voice.ts +34 -1
  160. package/src/audio/vocoder/bank.ts +314 -0
  161. package/src/audio/vocoder/carrier.ts +165 -0
  162. package/src/audio/vocoder/control.ts +68 -0
  163. package/src/audio/vocoder/detect.ts +50 -0
  164. package/src/audio/vocoder/index.ts +304 -0
  165. package/src/audio/vocoder/talkbox.ts +143 -0
  166. package/src/audio/wav.ts +500 -77
  167. package/src/audio/winds/engine.ts +5 -1
  168. package/src/audio/winds/trim.ts +28 -4
  169. package/src/audio/winds/trims1.ts +297 -0
  170. package/src/audio/winds/voice.ts +15 -2
  171. package/src/auth/cli.ts +38 -36
  172. package/src/auth/credentials.ts +30 -1
  173. package/src/auth/login.ts +15 -9
  174. package/src/auth/tui.ts +19 -10
  175. package/src/commands/arrange.ts +82 -32
  176. package/src/commands/autotune.ts +421 -0
  177. package/src/commands/calibration.ts +74 -0
  178. package/src/commands/clips.ts +887 -0
  179. package/src/commands/drums.ts +3 -2
  180. package/src/commands/edit.ts +11 -4
  181. package/src/commands/expression.ts +1 -1
  182. package/src/commands/formant.ts +221 -0
  183. package/src/commands/fx.ts +101 -32
  184. package/src/commands/grammar.ts +560 -0
  185. package/src/commands/help.ts +774 -366
  186. package/src/commands/history.ts +139 -10
  187. package/src/commands/keys.ts +25 -8
  188. package/src/commands/modal.ts +1 -1
  189. package/src/commands/music.ts +1 -1
  190. package/src/commands/nearest.ts +53 -0
  191. package/src/commands/pack.ts +9 -2
  192. package/src/commands/param-range.ts +56 -0
  193. package/src/commands/parses.ts +135 -0
  194. package/src/commands/progression.ts +170 -0
  195. package/src/commands/range.ts +763 -0
  196. package/src/commands/resample.ts +13 -10
  197. package/src/commands/rhythm.ts +3 -0
  198. package/src/commands/rig.ts +3 -24
  199. package/src/commands/sample.ts +11 -1
  200. package/src/commands/sing.ts +474 -0
  201. package/src/commands/strum.ts +13 -1
  202. package/src/commands/style.ts +415 -0
  203. package/src/commands/time.ts +6 -3
  204. package/src/commands/tuning.ts +3 -3
  205. package/src/commands/vocal-pitch.ts +617 -0
  206. package/src/commands/vocal.ts +147 -0
  207. package/src/commands/vocoder.ts +627 -0
  208. package/src/commands/wind.ts +2 -2
  209. package/src/fs/durable.ts +50 -0
  210. package/src/identity/actor.ts +127 -0
  211. package/src/lang/glossary.ts +511 -0
  212. package/src/launch-args.ts +267 -0
  213. package/src/main.ts +2508 -308
  214. package/src/media/cli.ts +20 -3
  215. package/src/media/import.ts +3 -1
  216. package/src/project/check.ts +21 -2
  217. package/src/project/clip-pins.ts +72 -0
  218. package/src/project/init.ts +23 -8
  219. package/src/project/sync.ts +418 -86
  220. package/src/render.ts +20 -1
  221. package/src/session/client.ts +107 -3
  222. package/src/session/clipboard.ts +79 -0
  223. package/src/session/daemon.ts +199 -5
  224. package/src/session/live-host.ts +232 -0
  225. package/src/session/meta.ts +14 -0
  226. package/src/session/origin.ts +174 -0
  227. package/src/session/port.ts +109 -14
  228. package/src/session/presence.ts +34 -4
  229. package/src/session/protocol.ts +365 -7
  230. package/src/session/rebase.ts +63 -12
  231. package/src/session/receipt.ts +265 -0
  232. package/src/session/shared-live.ts +131 -0
  233. package/src/session/store.ts +126 -45
  234. package/src/tui/arrange-menu.ts +225 -23
  235. package/src/tui/audition.ts +1 -1
  236. package/src/tui/euclid.ts +113 -27
  237. package/src/tui/fader.ts +282 -42
  238. package/src/tui/granular-menu.ts +2 -4
  239. package/src/tui/knob-fields.ts +107 -0
  240. package/src/tui/knob-map.ts +198 -0
  241. package/src/tui/menu-clips.ts +297 -0
  242. package/src/tui/menu-time.ts +20 -13
  243. package/src/tui/menu-voice.ts +405 -0
  244. package/src/tui/menu.ts +987 -179
  245. package/src/tui/modal-menu.ts +6 -6
  246. package/src/tui/performance-menu.ts +5 -2
  247. package/src/tui/play-chords.ts +4 -2
  248. package/src/tui/play-mode.ts +15 -1
  249. package/src/tui/play-session.ts +243 -28
  250. package/src/tui/sing-menu.ts +278 -0
  251. package/src/tui/style-menu.ts +104 -0
  252. package/src/tui/tape-mode.ts +580 -0
  253. package/src/tui/tape-view.ts +263 -0
  254. package/src/tui/vocoder-menu.ts +244 -0
  255. package/src/tui/wind-menu.ts +3 -3
  256. package/src/version.ts +8 -0
  257. package/src/web/fetch.ts +115 -29
  258. package/tui/activity.ts +180 -9
  259. package/tui/app.ts +491 -84
  260. package/tui/clip-row.ts +132 -0
  261. package/tui/delight.ts +193 -0
  262. package/tui/drawer.ts +233 -27
  263. package/tui/frame-gate.ts +76 -0
  264. package/tui/grammar.ts +143 -65
  265. package/tui/guide.ts +50 -5
  266. package/tui/highway.ts +309 -30
  267. package/tui/hints.ts +197 -0
  268. package/tui/hits.ts +7 -1
  269. package/tui/input.ts +60 -9
  270. package/tui/keys.ts +1 -1
  271. package/tui/knobs.ts +268 -0
  272. package/tui/play-strip.ts +80 -14
  273. package/tui/prompt.ts +1 -1
  274. package/tui/screen.ts +151 -18
  275. package/tui/tape.ts +439 -0
  276. package/tui/text.ts +35 -2
  277. package/tui/theme.ts +46 -1
@@ -0,0 +1,2993 @@
1
+ /**
2
+ * Rock, punk and metal (quality-08 family `rock`): the root, six branch
3
+ * cards and every leaf. Branch cards carry the shared patterns; a leaf
4
+ * carries only its deltas and names its defining concepts in `summary`
5
+ * (the theory note, searchable by /style search).
6
+ *
7
+ * Grids follow the card's subdivision: the root and most branches count in
8
+ * eighths (8 steps a 4/4 bar), metal in sixteenths (16 steps), shuffle and
9
+ * 12/8 styles in triplets (12 steps). `x` is a defining hit, digits are
10
+ * optional ghosts (`5` = half the bars).
11
+ *
12
+ * References (theory, not material):
13
+ * - Walter Everett, "The Foundations of Rock" (2009): backbeat, the
14
+ * mixolydian bVII, power-chord voicing, the 12-bar and its boogie bass.
15
+ * - Ken Stephenson, "What to Listen For in Rock" (2002): rock harmonic
16
+ * grammar (plagal and double-plagal motion, bVI-bVII-I, modal loops).
17
+ * - Dylan Hicks / Mark Spicer: accumulative form, quiet-loud dynamics.
18
+ * - Dietmar Elflein, "Schwermetallanalysen" (2010) and Esa Lilja, "Theory
19
+ * and Analysis of Classic Heavy Metal Harmony" (2009): aeolian and
20
+ * phrygian riffing, the bII, pedal-point riffs, gallops, blast beats.
21
+ */
22
+
23
+ import { grid, intervals, kit, maybe, role } from "./parts.ts";
24
+ import { card, type RoleTexture, type StyleCard } from "./schema.ts";
25
+
26
+ // Eighth-note grids (8 steps per 4/4 bar).
27
+ const BACKBEAT = grid("..x...x.");
28
+ const EIGHTHS = grid("xxxxxxxx");
29
+ const QUARTERS = grid("x.x.x.x.");
30
+ // Sixteenth grids (16 steps per 4/4 bar).
31
+ const BACKBEAT16 = grid("....x.......x...");
32
+ const EIGHTHS16 = grid("x.x.x.x.x.x.x.x.");
33
+ const SIXTEENTHS = grid("xxxxxxxxxxxxxxxx");
34
+ const QUARTERS16 = grid("x...x...x...x...");
35
+ // Triplet grids (12 steps per 4/4 bar): the shuffle's long-short pairs.
36
+ const SHUFFLE_HAT = grid("x.xx.xx.xx.x");
37
+ const SHUFFLE_SNARE = grid("...x.....x..");
38
+ const SHUFFLE_KICK = grid("x.....x.....");
39
+
40
+ /** The drum machine kits (coldwave, synth punk, industrial). */
41
+ const MACHINE: RoleTexture = Object.freeze({
42
+ required: true,
43
+ voices: Object.freeze([kit("electro"), kit("syn808", 0.5)]),
44
+ });
45
+ const MACHINE_KIT = { kick: MACHINE, snare: MACHINE, hat: MACHINE };
46
+ const LOFI_KIT: RoleTexture = Object.freeze({
47
+ required: true,
48
+ voices: Object.freeze([kit("lofi")]),
49
+ });
50
+ const KIT_TOM: RoleTexture = Object.freeze({
51
+ required: true,
52
+ voices: Object.freeze([kit("acoustic")]),
53
+ });
54
+ const KIT_TOM_OPT: RoleTexture = Object.freeze({
55
+ required: false,
56
+ voices: Object.freeze([kit("acoustic")]),
57
+ });
58
+ const KIT_CLAP: RoleTexture = Object.freeze({
59
+ required: true,
60
+ voices: Object.freeze([kit("acoustic")]),
61
+ });
62
+ const SHAKER: RoleTexture = Object.freeze({
63
+ required: false,
64
+ voices: Object.freeze([kit("acoustic")]),
65
+ });
66
+
67
+ const TWELVE_BAR = [
68
+ "I7",
69
+ "I7",
70
+ "I7",
71
+ "I7",
72
+ "IV7",
73
+ "IV7",
74
+ "I7",
75
+ "I7",
76
+ "V7",
77
+ "IV7",
78
+ "I7",
79
+ "V7",
80
+ ] as const;
81
+ /** Quick-change 12-bar: IV in bar 2. */
82
+ const QUICK_CHANGE = [
83
+ "I7",
84
+ "IV7",
85
+ "I7",
86
+ "I7",
87
+ "IV7",
88
+ "IV7",
89
+ "I7",
90
+ "I7",
91
+ "V7",
92
+ "IV7",
93
+ "I7",
94
+ "V7",
95
+ ] as const;
96
+ /** Pentatonic riff melodies: steps and thirds, few leaps. */
97
+ const RIFF = intervals(1, 1.4, 0.5, 0.6);
98
+ /** Wide, vocal-anthem lines with fourth and fifth leaps. */
99
+ const ANTHEM = intervals(1, 0.9, 0.7, 0.4, 1.1);
100
+ /** Chromatic, half-step-heavy metal lines (semitone weight added after). */
101
+ const CHROMATIC = intervals(1.4, 0.6, 0.3, 0.5);
102
+ /** Shred: scalar runs, step-dominated, fast. */
103
+ const SHRED = intervals(2, 0.6, 0.2, 0.1);
104
+
105
+ export const ROCK_CARDS: readonly StyleCard[] = Object.freeze([
106
+ // -------------------------------------------------------------------
107
+ // Root: backbeat (snare on 2 and 4), driving eighth hats, the power
108
+ // chord (root and fifth), the mixolydian bVII and pentatonic riffs,
109
+ // root-note eighth bass locked to the kick, verse-chorus form.
110
+ card({
111
+ id: "rock-family",
112
+ abstract: true,
113
+ summary:
114
+ "backbeat on 2 and 4, eighth-note drive, power chords, mixolydian bVII, pentatonic riffs, verse-chorus",
115
+ tempo: { bpm: [90, 160], typical: 120 },
116
+ groove: { subdivision: 2, velocity: [1, 0.75] },
117
+ rhythm: {
118
+ onsets: {
119
+ kick: grid("x...x.1."),
120
+ snare: BACKBEAT,
121
+ hat: EIGHTHS,
122
+ },
123
+ fills: { every: 4, density: [0.4, 0.7] },
124
+ },
125
+ pitch: {
126
+ scales: [
127
+ ["mixolydian", 0.3],
128
+ ["minor-pentatonic", 0.3],
129
+ ["major", 0.2],
130
+ ["minor", 0.2],
131
+ ],
132
+ },
133
+ harmony: {
134
+ presets: [
135
+ ["mixolydian-rock", 0.4],
136
+ ["axis", 0.3],
137
+ ["aeolian", 0.3],
138
+ ],
139
+ cadences: [
140
+ ["bVII-I", 0.35],
141
+ ["IV-I", 0.35],
142
+ ["V-I", 0.3],
143
+ ],
144
+ sevenths: 0,
145
+ voicing: {
146
+ types: [
147
+ ["power", 0.6],
148
+ ["close", 0.4],
149
+ ],
150
+ range: [40, 64],
151
+ notes: [2, 3],
152
+ },
153
+ },
154
+ melody: {
155
+ range: [57, 79],
156
+ chordToneRate: 0.7,
157
+ repetition: 0.6,
158
+ intervals: RIFF,
159
+ },
160
+ bass: {
161
+ behaviour: [
162
+ ["root", 0.7],
163
+ ["octave", 0.3],
164
+ ],
165
+ range: [28, 48],
166
+ onsets: grid("x.x.x.x."),
167
+ kickLock: 0.8,
168
+ },
169
+ form: {
170
+ plans: [
171
+ [
172
+ ["intro", "verse", "chorus", "verse", "chorus", "bridge", "chorus"],
173
+ 1,
174
+ ],
175
+ ],
176
+ },
177
+ texture: {
178
+ roles: {
179
+ bass: role("ebass"),
180
+ chords: role("electric@crunch", "electric:0.5"),
181
+ lead: role("gtr-lead", "sing:0.6"),
182
+ counter: maybe("electric"),
183
+ },
184
+ },
185
+ mix: {
186
+ levels: { kick: -1, snare: -2, hat: -9, bass: -3, chords: -5, lead: -1 },
187
+ space: 0.25,
188
+ },
189
+ }),
190
+
191
+ // -------------------------------------------------------------------
192
+ // Early rock: the 12-bar blues as fixed changes, a 12-bar hypermeter,
193
+ // shuffle (swung eighths) or straight eights, the boogie bass (root,
194
+ // third, fifth, sixth arpeggio), dominant sevenths on every degree.
195
+ card({
196
+ id: "early-rock",
197
+ abstract: true,
198
+ summary:
199
+ "rock and roll: 12-bar blues changes, shuffle or straight eights, boogie bass on 1-3-5-6, dominant sevenths",
200
+ tempo: { bpm: [120, 180], typical: 150 },
201
+ meter: { hypermeter: [[12, 1]] },
202
+ groove: { swingRatio: [1, 1.8] },
203
+ pitch: {
204
+ scales: [
205
+ ["major-blues", 0.4],
206
+ ["mixolydian", 0.4],
207
+ ["major-pentatonic", 0.2],
208
+ ],
209
+ },
210
+ harmony: {
211
+ forms: [
212
+ [TWELVE_BAR, 0.7],
213
+ [QUICK_CHANGE, 0.3],
214
+ ],
215
+ presets: [["fifties", 1]],
216
+ sources: { forms: 2, presets: 1 },
217
+ cadences: [
218
+ ["V-I", 0.6],
219
+ ["IV-I", 0.4],
220
+ ],
221
+ voicing: {
222
+ types: [
223
+ ["close", 0.6],
224
+ ["power", 0.4],
225
+ ],
226
+ },
227
+ },
228
+ bass: { behaviour: [["arpeggio", 1]] },
229
+ form: {
230
+ plans: [[["intro", "verse", "verse", "bridge", "verse", "outro"], 1]],
231
+ archetype: "12-bar",
232
+ },
233
+ texture: {
234
+ roles: {
235
+ chords: role("piano", "electric:0.7"),
236
+ bass: role("contrabass", "ebass:0.5"),
237
+ },
238
+ },
239
+ }),
240
+ card({
241
+ id: "rock-and-roll",
242
+ summary:
243
+ "rock and roll: hard shuffle, 12-bar blues, boogie-woogie bass and piano triplets, backbeat snare",
244
+ tempo: { bpm: [140, 185], typical: 165 },
245
+ groove: { swingRatio: [1.6, 2] },
246
+ texture: {
247
+ roles: {
248
+ chords: role("piano", "honkytonk:0.5"),
249
+ lead: role("tenorsax", "gtr-lead:0.7", "sing:0.6"),
250
+ },
251
+ },
252
+ }),
253
+ card({
254
+ id: "rockabilly",
255
+ summary:
256
+ "rockabilly: slap upright on 1 and 3 with the click on 2 and 4, slapback echo, twangy clean lead, light shuffle",
257
+ tempo: { bpm: [150, 200], typical: 175 },
258
+ groove: { swingRatio: [1.4, 1.8] },
259
+ rhythm: { onsets: { kick: grid("x...x..."), hat: QUARTERS } },
260
+ bass: {
261
+ behaviour: [["root-fifth", 1]],
262
+ onsets: grid("x.x.x.x."),
263
+ kickLock: 0.5,
264
+ },
265
+ texture: {
266
+ roles: {
267
+ bass: role("slap"),
268
+ chords: role("electric@clean", "acoustic:0.5"),
269
+ lead: role("electric@clean", "sing:0.6"),
270
+ },
271
+ },
272
+ }),
273
+ card({
274
+ id: "skiffle",
275
+ summary:
276
+ "skiffle: strummed acoustic and banjo, washboard shuffle, tea-chest bass on root-fifth, three-chord I-IV-V",
277
+ tempo: { bpm: [130, 180], typical: 150 },
278
+ groove: { swingRatio: [1.4, 1.8] },
279
+ rhythm: {
280
+ onsets: { kick: grid("x...x..."), shaker: EIGHTHS, hat: null },
281
+ },
282
+ harmony: {
283
+ forms: [[["I", "I", "IV", "I", "V", "IV", "I", "V"], 1]],
284
+ presets: [["fifties", 1]],
285
+ voicing: { types: [["close", 1]], strokes: [["folk", 1]] },
286
+ },
287
+ bass: { behaviour: [["root-fifth", 1]], onsets: QUARTERS, kickLock: 0.4 },
288
+ form: { plans: [[["intro", "verse", "chorus", "verse", "chorus"], 1]] },
289
+ texture: {
290
+ roles: {
291
+ hat: null,
292
+ shaker: SHAKER,
293
+ bass: role("doublebass"),
294
+ chords: role("acoustic", "banjo:0.6"),
295
+ lead: role("sing", "banjo:0.4"),
296
+ },
297
+ },
298
+ }),
299
+ card({
300
+ id: "surf",
301
+ summary:
302
+ "surf rock: spring-reverb twang, tremolo-picked sixteenth lead, phrygian-dominant and andalusian i-bVII-bVI-V, floor-tom surf beat",
303
+ tempo: { bpm: [150, 180], typical: 165 },
304
+ groove: { subdivision: 4, swingRatio: [1, 1] },
305
+ rhythm: {
306
+ onsets: {
307
+ kick: grid("x.....x.x......."),
308
+ snare: BACKBEAT16,
309
+ hat: EIGHTHS16,
310
+ tom: grid("x.x.x.x.x.x.x.x."),
311
+ },
312
+ },
313
+ pitch: {
314
+ scales: [
315
+ ["phrygian-dominant", 0.4],
316
+ ["harmonic-minor", 0.3],
317
+ ["minor", 0.3],
318
+ ],
319
+ },
320
+ harmony: {
321
+ forms: [],
322
+ presets: [
323
+ ["andalusian", 0.6],
324
+ ["aeolian", 0.4],
325
+ ],
326
+ sources: {},
327
+ cadences: [["V-I", 1]],
328
+ },
329
+ melody: { density: [3, 4], intervals: SHRED },
330
+ bass: { behaviour: [["root", 1]], onsets: QUARTERS16, kickLock: 0.4 },
331
+ form: { archetype: "verse-chorus" },
332
+ texture: {
333
+ roles: {
334
+ tom: KIT_TOM_OPT,
335
+ chords: role("electric@spring"),
336
+ lead: role("electric@spring"),
337
+ bass: role("ebass"),
338
+ },
339
+ },
340
+ mix: { space: 0.5 },
341
+ }),
342
+ card({
343
+ id: "twist",
344
+ summary:
345
+ "twist and dance crazes: straight eights, I-vi-IV-V doo-wop changes, tenor sax hook, handclaps on the backbeat",
346
+ tempo: { bpm: [145, 170], typical: 156 },
347
+ groove: { swingRatio: [1, 1.15] },
348
+ rhythm: { onsets: { clap: BACKBEAT } },
349
+ harmony: {
350
+ forms: [],
351
+ presets: [["fifties", 1]],
352
+ sources: {},
353
+ cadences: [["V-I", 1]],
354
+ },
355
+ texture: {
356
+ roles: {
357
+ clap: KIT_CLAP,
358
+ lead: role("sing", "tenorsax:0.7"),
359
+ counter: maybe("tenorsax"),
360
+ },
361
+ },
362
+ }),
363
+ card({
364
+ id: "beat",
365
+ summary:
366
+ "beat and British invasion: jangly Rickenbacker chords, borrowed bVI and bVII, close harmony vocals, straight eights",
367
+ tempo: { bpm: [120, 146], typical: 132 },
368
+ meter: { hypermeter: [[4, 1]] },
369
+ groove: { swingRatio: [1, 1.1] },
370
+ pitch: {
371
+ scales: [
372
+ ["major", 0.6],
373
+ ["mixolydian", 0.4],
374
+ ],
375
+ },
376
+ harmony: {
377
+ forms: [],
378
+ presets: [
379
+ ["fifties", 0.4],
380
+ ["mixolydian-rock", 0.3],
381
+ ["axis", 0.3],
382
+ ],
383
+ chain: {
384
+ I: [
385
+ ["IV", 2],
386
+ ["bVI", 1],
387
+ ["vi", 1],
388
+ ],
389
+ IV: [
390
+ ["V", 2],
391
+ ["bVII", 1],
392
+ ],
393
+ bVI: [["bVII", 1]],
394
+ bVII: [["I", 1]],
395
+ vi: [["IV", 1]],
396
+ V: [["I", 1]],
397
+ },
398
+ sources: { presets: 2, chain: 1 },
399
+ voicing: { types: [["close", 1]], strokes: [["jangle", 1]] },
400
+ },
401
+ bass: {
402
+ behaviour: [
403
+ ["root-fifth", 0.6],
404
+ ["root", 0.4],
405
+ ],
406
+ },
407
+ form: {
408
+ plans: [
409
+ [
410
+ ["intro", "verse", "chorus", "verse", "chorus", "bridge", "chorus"],
411
+ 1,
412
+ ],
413
+ ],
414
+ archetype: "verse-chorus",
415
+ },
416
+ texture: {
417
+ roles: {
418
+ chords: role("jangle", "electric@clean:0.5"),
419
+ bass: role("ebass"),
420
+ lead: role("sing"),
421
+ counter: maybe("choir"),
422
+ },
423
+ },
424
+ }),
425
+ card({
426
+ id: "garage-rock",
427
+ summary:
428
+ "garage rock: fuzz guitar and combo organ, two- and three-chord I-bVII-IV riffs, raw straight eights",
429
+ tempo: { bpm: [130, 170], typical: 148 },
430
+ groove: { swingRatio: [1, 1.1] },
431
+ pitch: {
432
+ scales: [
433
+ ["mixolydian", 0.5],
434
+ ["minor-pentatonic", 0.5],
435
+ ],
436
+ },
437
+ harmony: {
438
+ forms: [[["I", "bVII", "IV", "I"], 1]],
439
+ presets: [["mixolydian-rock", 1]],
440
+ cadences: [["bVII-I", 1]],
441
+ voicing: { types: [["power", 1]] },
442
+ },
443
+ bass: { behaviour: [["root", 1]] },
444
+ texture: {
445
+ roles: {
446
+ chords: role("electric@fuzz"),
447
+ counter: maybe("farfisa", "vox:0.6"),
448
+ bass: role("ebass"),
449
+ lead: role("sing", "electric@fuzz:0.4"),
450
+ },
451
+ },
452
+ }),
453
+ card({
454
+ id: "instrumental-rock",
455
+ summary:
456
+ "instrumental rock: the twangy clean guitar carries the tune, I-IV-V and fifties changes, no vocal",
457
+ tempo: { bpm: [138, 160], typical: 150 },
458
+ groove: { swingRatio: [1, 1.3] },
459
+ harmony: {
460
+ forms: [[TWELVE_BAR, 1]],
461
+ presets: [["fifties", 1]],
462
+ sources: { forms: 1, presets: 1 },
463
+ },
464
+ melody: { repetition: 0.7, intervals: ANTHEM },
465
+ texture: {
466
+ roles: {
467
+ lead: role("electric@clean", "gtr-lead:0.6"),
468
+ chords: role("electric@crunch", "piano:0.4"),
469
+ },
470
+ },
471
+ mix: { space: 0.35 },
472
+ }),
473
+
474
+ // -------------------------------------------------------------------
475
+ // Classic and hard rock: riff-driven, the double-plagal bVII-IV-I,
476
+ // minor-pentatonic riffs over major chords, loud backbeat, plexi crunch.
477
+ card({
478
+ id: "classic-rock",
479
+ abstract: true,
480
+ summary:
481
+ "classic and hard rock: riff-driven, double-plagal bVII-IV-I, minor pentatonic over major chords, loud backbeat",
482
+ harmony: {
483
+ presets: [
484
+ ["mixolydian-rock", 0.6],
485
+ ["aeolian", 0.4],
486
+ ],
487
+ cadences: [
488
+ ["bVII-I", 0.5],
489
+ ["IV-I", 0.5],
490
+ ],
491
+ },
492
+ texture: {
493
+ roles: {
494
+ chords: role("electric@crunch", "electric@lead:0.4"),
495
+ counter: maybe("hammond", "electric:0.6"),
496
+ },
497
+ },
498
+ }),
499
+ card({
500
+ id: "psychedelic-rock",
501
+ summary:
502
+ "psychedelic rock: modal mixolydian and dorian vamps, tonic pedal point and drone, fuzz and phaser, slow-to-mid tempo",
503
+ tempo: { bpm: [80, 130], typical: 104 },
504
+ rhythm: { onsets: { kick: grid("x......x") } },
505
+ pitch: {
506
+ scales: [
507
+ ["mixolydian", 0.4],
508
+ ["dorian", 0.4],
509
+ ["phrygian-dominant", 0.2],
510
+ ],
511
+ },
512
+ harmony: { model: "modal", rhythm: [[0.5, 1]] },
513
+ bass: {
514
+ behaviour: [
515
+ ["pedal", 0.5],
516
+ ["root", 0.5],
517
+ ],
518
+ },
519
+ texture: {
520
+ roles: {
521
+ chords: role("electric@fuzz", "hammond:0.6"),
522
+ drone: maybe("tanpura", "organ:0.5"),
523
+ lead: role("sing", "electric@fuzz:0.5", "sitar:0.4"),
524
+ },
525
+ },
526
+ mix: { fx: { chords: { phaser: "slow" } }, space: 0.45 },
527
+ }),
528
+ card({
529
+ id: "blues-rock",
530
+ summary:
531
+ "blues rock: 12-bar shuffle, blues scale over dominant-seventh changes, call-and-response lead, triplet feel",
532
+ tempo: { bpm: [70, 130], typical: 96 },
533
+ meter: { hypermeter: [[12, 1]] },
534
+ groove: { subdivision: 3, swingRatio: [1, 1] },
535
+ rhythm: {
536
+ onsets: { kick: SHUFFLE_KICK, snare: SHUFFLE_SNARE, hat: SHUFFLE_HAT },
537
+ },
538
+ pitch: {
539
+ scales: [
540
+ ["blues", 0.6],
541
+ ["minor-pentatonic", 0.4],
542
+ ],
543
+ },
544
+ harmony: {
545
+ forms: [
546
+ [TWELVE_BAR, 0.6],
547
+ [QUICK_CHANGE, 0.4],
548
+ ],
549
+ sources: { forms: 1 },
550
+ presets: [],
551
+ cadences: [
552
+ ["V-I", 0.5],
553
+ ["IV-I", 0.5],
554
+ ],
555
+ sevenths: 1,
556
+ },
557
+ bass: {
558
+ behaviour: [
559
+ ["arpeggio", 0.6],
560
+ ["root-fifth", 0.4],
561
+ ],
562
+ onsets: grid("x..x..x..x.."),
563
+ kickLock: 0.4,
564
+ },
565
+ form: { archetype: "12-bar" },
566
+ }),
567
+ card({
568
+ id: "hard-rock",
569
+ summary:
570
+ "hard rock: minor-pentatonic riffs on power chords, plexi crunch, kick on 1 and the and of 3, arena chorus",
571
+ tempo: { bpm: [100, 150], typical: 124 },
572
+ rhythm: { onsets: { kick: grid("x...xx..") } },
573
+ pitch: {
574
+ scales: [
575
+ ["minor-pentatonic", 0.5],
576
+ ["mixolydian", 0.3],
577
+ ["minor", 0.2],
578
+ ],
579
+ },
580
+ harmony: { voicing: { types: [["power", 1]] } },
581
+ texture: {
582
+ roles: { chords: role("electric@lead", "electric@crunch:0.5") },
583
+ },
584
+ }),
585
+ card({
586
+ id: "southern-rock",
587
+ summary:
588
+ "southern rock: mixolydian I-bVII-IV, twin harmonised lead guitars in thirds, light shuffle, honky-tonk piano",
589
+ tempo: { bpm: [90, 140], typical: 112 },
590
+ rhythm: { onsets: { kick: grid("x..x..x.") } },
591
+ groove: { swingRatio: [1.1, 1.4] },
592
+ pitch: {
593
+ scales: [
594
+ ["mixolydian", 0.5],
595
+ ["major-pentatonic", 0.3],
596
+ ["major-blues", 0.2],
597
+ ],
598
+ },
599
+ harmony: {
600
+ presets: [
601
+ ["mixolydian-rock", 0.7],
602
+ ["fifties", 0.3],
603
+ ],
604
+ },
605
+ texture: {
606
+ roles: {
607
+ counter: role("gtr-lead"),
608
+ chords: role("electric@crunch", "honkytonk:0.5"),
609
+ },
610
+ },
611
+ }),
612
+ card({
613
+ id: "glam-rock",
614
+ summary:
615
+ "glam rock: stomping quarter-note kick, handclaps on 2 and 4, boogie riffs, sing-along chorus",
616
+ tempo: { bpm: [110, 140], typical: 124 },
617
+ rhythm: { onsets: { kick: grid("x.x.x.x."), clap: BACKBEAT } },
618
+ harmony: {
619
+ presets: [
620
+ ["mixolydian-rock", 0.5],
621
+ ["fifties", 0.5],
622
+ ],
623
+ },
624
+ bass: { onsets: QUARTERS },
625
+ texture: { roles: { clap: KIT_CLAP, counter: maybe("piano", "saw:0.5") } },
626
+ }),
627
+ card({
628
+ id: "pub-rock",
629
+ summary:
630
+ "pub rock: back-to-basics R&B, boogie piano, light shuffle 12-bar and I-IV-V, small-room sound",
631
+ tempo: { bpm: [130, 165], typical: 145 },
632
+ rhythm: { onsets: { kick: grid("x.xx..x.") } },
633
+ groove: { swingRatio: [1.2, 1.5] },
634
+ harmony: {
635
+ forms: [[TWELVE_BAR, 1]],
636
+ presets: [["fifties", 1]],
637
+ sources: { forms: 1, presets: 1 },
638
+ cadences: [
639
+ ["V-I", 0.5],
640
+ ["IV-I", 0.5],
641
+ ],
642
+ },
643
+ bass: {
644
+ behaviour: [
645
+ ["arpeggio", 0.6],
646
+ ["root", 0.4],
647
+ ],
648
+ },
649
+ texture: { roles: { chords: role("piano", "electric@crunch:0.7") } },
650
+ mix: { space: 0.15 },
651
+ }),
652
+ card({
653
+ id: "soft-rock",
654
+ summary:
655
+ "soft and yacht rock: major-seventh and ninth chords, ii-V turnarounds, electric piano, smooth laid-back backbeat",
656
+ tempo: { bpm: [70, 105], typical: 88 },
657
+ groove: { subdivision: 4, swingRatio: [1, 1.1] },
658
+ rhythm: {
659
+ onsets: {
660
+ kick: grid("x.....3.x.3....."),
661
+ snare: BACKBEAT16,
662
+ hat: EIGHTHS16,
663
+ },
664
+ },
665
+ pitch: {
666
+ scales: [
667
+ ["major", 0.7],
668
+ ["dorian", 0.3],
669
+ ],
670
+ },
671
+ harmony: {
672
+ presets: [
673
+ ["turnaround", 0.4],
674
+ ["ii-v-i", 0.3],
675
+ ["axis", 0.3],
676
+ ],
677
+ cadences: [
678
+ ["V-I", 0.6],
679
+ ["IV-I", 0.4],
680
+ ],
681
+ sevenths: 0.7,
682
+ voicing: {
683
+ types: [
684
+ ["open", 0.6],
685
+ ["close", 0.4],
686
+ ],
687
+ notes: [3, 4],
688
+ },
689
+ },
690
+ melody: { intervals: intervals(1.2, 1, 0.4, 0.4) },
691
+ bass: { onsets: grid("x.....x.x......."), kickLock: 0.6 },
692
+ expression: { dynamics: [0.35, 0.8] },
693
+ texture: {
694
+ roles: {
695
+ chords: role("rhodes", "epiano:0.6", "acoustic:0.4"),
696
+ lead: role("sing"),
697
+ counter: maybe("altosax", "electric@clean:0.6"),
698
+ },
699
+ },
700
+ }),
701
+ card({
702
+ id: "heartland-rock",
703
+ summary:
704
+ "heartland rock: I-V-vi-IV anthems, driving straight eighths, organ pad and open-chord acoustic, plain-spoken melody",
705
+ tempo: { bpm: [110, 145], typical: 124 },
706
+ rhythm: { onsets: { kick: grid("x.x.x.x.") } },
707
+ pitch: {
708
+ scales: [
709
+ ["major", 0.7],
710
+ ["mixolydian", 0.3],
711
+ ],
712
+ },
713
+ harmony: {
714
+ presets: [
715
+ ["axis", 0.5],
716
+ ["mixolydian-rock", 0.3],
717
+ ["fifties", 0.2],
718
+ ],
719
+ cadences: [
720
+ ["IV-I", 0.5],
721
+ ["V-I", 0.5],
722
+ ],
723
+ voicing: {
724
+ types: [
725
+ ["open", 0.5],
726
+ ["power", 0.5],
727
+ ],
728
+ },
729
+ },
730
+ melody: { intervals: ANTHEM },
731
+ texture: {
732
+ roles: {
733
+ pad: maybe("hammond", "organ:0.5"),
734
+ chords: role("electric@crunch", "acoustic:0.6"),
735
+ },
736
+ },
737
+ }),
738
+ card({
739
+ id: "stoner-rock",
740
+ summary:
741
+ "stoner and desert rock: down-tuned fuzz riffs, dorian and minor-pentatonic, tonic pedal bass, heavy mid-tempo groove",
742
+ tempo: { bpm: [70, 115], typical: 92 },
743
+ rhythm: { onsets: { kick: grid("x.x..xx.") } },
744
+ pitch: {
745
+ scales: [
746
+ ["minor-pentatonic", 0.4],
747
+ ["dorian", 0.3],
748
+ ["blues", 0.3],
749
+ ],
750
+ },
751
+ harmony: {
752
+ presets: [
753
+ ["aeolian", 0.5],
754
+ ["dorian-vamp", 0.5],
755
+ ],
756
+ cadences: [["bVII-I", 1]],
757
+ voicing: { types: [["power", 1]], range: [36, 58] },
758
+ },
759
+ bass: {
760
+ behaviour: [
761
+ ["pedal", 0.5],
762
+ ["root", 0.5],
763
+ ],
764
+ range: [26, 45],
765
+ },
766
+ texture: { roles: { chords: role("electric@fuzz"), bass: role("ebass") } },
767
+ }),
768
+ card({
769
+ id: "folk-rock",
770
+ summary:
771
+ "folk rock: chiming 12-string jangle on folk strum patterns, I-IV-V and modal mixolydian, harmony vocals",
772
+ tempo: { bpm: [95, 130], typical: 112 },
773
+ rhythm: { onsets: { kick: grid("x.....x."), hat: QUARTERS } },
774
+ pitch: {
775
+ scales: [
776
+ ["major", 0.6],
777
+ ["mixolydian", 0.4],
778
+ ],
779
+ },
780
+ harmony: {
781
+ presets: [
782
+ ["fifties", 0.4],
783
+ ["mixolydian-rock", 0.3],
784
+ ["axis", 0.3],
785
+ ],
786
+ cadences: [
787
+ ["IV-I", 0.5],
788
+ ["V-I", 0.5],
789
+ ],
790
+ voicing: {
791
+ types: [["open", 1]],
792
+ strokes: [
793
+ ["folk", 0.6],
794
+ ["jangle", 0.4],
795
+ ],
796
+ },
797
+ },
798
+ texture: {
799
+ roles: {
800
+ chords: role("jangle", "acoustic:0.7"),
801
+ counter: maybe("choir", "electric@clean:0.5"),
802
+ },
803
+ },
804
+ }),
805
+ card({
806
+ id: "pop-rock",
807
+ summary:
808
+ "pop rock: diatonic I-V-vi-IV and I-vi-IV-V, guitar-led verse-pre-chorus-chorus, hook repetition",
809
+ tempo: { bpm: [100, 140], typical: 120 },
810
+ rhythm: { onsets: { kick: grid("x..xx...") } },
811
+ pitch: {
812
+ scales: [
813
+ ["major", 0.8],
814
+ ["mixolydian", 0.2],
815
+ ],
816
+ },
817
+ harmony: {
818
+ presets: [
819
+ ["axis", 0.5],
820
+ ["fifties", 0.25],
821
+ ["sad-pop", 0.25],
822
+ ],
823
+ cadences: [
824
+ ["V-I", 0.6],
825
+ ["IV-I", 0.4],
826
+ ],
827
+ },
828
+ melody: { repetition: 0.75, intervals: ANTHEM },
829
+ form: {
830
+ plans: [
831
+ [
832
+ [
833
+ "intro",
834
+ "verse",
835
+ "pre",
836
+ "chorus",
837
+ "verse",
838
+ "pre",
839
+ "chorus",
840
+ "bridge",
841
+ "chorus",
842
+ ],
843
+ 1,
844
+ ],
845
+ ],
846
+ },
847
+ texture: {
848
+ roles: { chords: role("electric@clean", "electric@crunch:0.7") },
849
+ },
850
+ }),
851
+ card({
852
+ id: "roots-rock",
853
+ summary:
854
+ "roots and swamp rock: mixolydian I-IV-V and 12-bar, light shuffle, acoustic and clean electric, plainspoken grooves",
855
+ tempo: { bpm: [90, 130], typical: 108 },
856
+ rhythm: { onsets: { kick: grid("x...x...") } },
857
+ groove: { swingRatio: [1.1, 1.4] },
858
+ pitch: {
859
+ scales: [
860
+ ["mixolydian", 0.5],
861
+ ["major-pentatonic", 0.3],
862
+ ["major-blues", 0.2],
863
+ ],
864
+ },
865
+ harmony: {
866
+ forms: [[TWELVE_BAR, 1]],
867
+ presets: [
868
+ ["mixolydian-rock", 0.6],
869
+ ["fifties", 0.4],
870
+ ],
871
+ sources: { forms: 1, presets: 2 },
872
+ cadences: [
873
+ ["IV-I", 0.5],
874
+ ["V-I", 0.5],
875
+ ],
876
+ },
877
+ texture: { roles: { chords: role("electric@clean", "acoustic:0.7") } },
878
+ }),
879
+
880
+ card({
881
+ id: "latin-rock",
882
+ summary:
883
+ "Latin rock: Afro-Cuban percussion (timbale bell, congas) over a rock kit, minor i-IV montuno vamps, sustained-guitar lead, organ comping",
884
+ tempo: { bpm: [95, 135], typical: 116 },
885
+ groove: { subdivision: 4 },
886
+ rhythm: {
887
+ onsets: {
888
+ kick: grid("x..x..x.x..x..x."),
889
+ snare: BACKBEAT16,
890
+ hat: EIGHTHS16,
891
+ bell: grid("x.x.xx.x.x.xx.x."),
892
+ perc: grid("..x..xx...x..xx."),
893
+ },
894
+ },
895
+ pitch: {
896
+ scales: [
897
+ ["dorian", 0.6],
898
+ ["minor", 0.4],
899
+ ],
900
+ },
901
+ harmony: {
902
+ forms: [
903
+ [["i", "IV"], 0.6],
904
+ [["i", "bVII", "bVI", "V"], 0.4],
905
+ ],
906
+ presets: [["dorian-vamp", 1]],
907
+ sources: { forms: 2, presets: 1 },
908
+ rhythm: [[1, 1]],
909
+ cadences: [["IV-I", 1]],
910
+ },
911
+ bass: {
912
+ behaviour: [["root-fifth", 1]],
913
+ onsets: grid("x..x..x.x..x..x."),
914
+ kickLock: 0.8,
915
+ },
916
+ melody: { intervals: ANTHEM, density: [1, 3] },
917
+ texture: {
918
+ roles: {
919
+ bell: role("drums"),
920
+ perc: role("drums"),
921
+ chords: role("hammond", "electric@crunch:0.5"),
922
+ lead: role("gtr-lead", "electric@lead:0.5"),
923
+ },
924
+ },
925
+ }),
926
+
927
+ // -------------------------------------------------------------------
928
+ // Progressive and art rock: additive odd meters (7/8 as 2+2+3, 5/4),
929
+ // modal interchange, extended tertian chords, keyboard textures, long
930
+ // multi-section forms.
931
+ card({
932
+ id: "prog",
933
+ abstract: true,
934
+ summary:
935
+ "progressive: additive odd meters (7/8 as 2+2+3, 5/4), modal interchange, sevenths, organ and mellotron, long forms",
936
+ meter: {
937
+ signatures: [
938
+ ["4/4", 0.4],
939
+ ["7/8", 0.25],
940
+ ["5/4", 0.2],
941
+ ["6/8", 0.15],
942
+ ],
943
+ grouping: [
944
+ [[2, 2, 3], 0.5],
945
+ [[3, 2, 2], 0.5],
946
+ ],
947
+ },
948
+ harmony: {
949
+ sevenths: 0.3,
950
+ chain: {
951
+ I: [
952
+ ["bVII", 1],
953
+ ["IV", 1],
954
+ ["vi", 1],
955
+ ["iv", 0.5],
956
+ ],
957
+ bVII: [
958
+ ["IV", 1],
959
+ ["bVI", 0.5],
960
+ ],
961
+ IV: [
962
+ ["I", 1],
963
+ ["V", 1],
964
+ ["iv", 0.5],
965
+ ],
966
+ iv: [["I", 1]],
967
+ bVI: [["bVII", 1]],
968
+ vi: [
969
+ ["IV", 1],
970
+ ["ii", 0.5],
971
+ ],
972
+ ii: [["V", 1]],
973
+ V: [
974
+ ["I", 1],
975
+ ["vi", 0.5],
976
+ ],
977
+ },
978
+ sources: { presets: 1, chain: 1 },
979
+ voicing: {
980
+ types: [
981
+ ["open", 0.5],
982
+ ["close", 0.3],
983
+ ["power", 0.2],
984
+ ],
985
+ },
986
+ },
987
+ form: {
988
+ plans: [
989
+ [
990
+ [
991
+ "intro",
992
+ "verse",
993
+ "chorus",
994
+ "bridge",
995
+ "breakdown",
996
+ "verse",
997
+ "chorus",
998
+ "outro",
999
+ ],
1000
+ 1,
1001
+ ],
1002
+ ],
1003
+ archetype: "multi-section",
1004
+ },
1005
+ texture: {
1006
+ roles: {
1007
+ chords: role("hammond", "keys:0.6", "electric:0.5"),
1008
+ pad: maybe("strings", "organ:0.4"),
1009
+ },
1010
+ },
1011
+ }),
1012
+ card({
1013
+ id: "prog-rock",
1014
+ summary:
1015
+ "symphonic prog: mellotron strings and organ, 7/8 and 5/4 sections, modal interchange iv and bVI, extended suites",
1016
+ tempo: { bpm: [80, 140], typical: 108 },
1017
+ meter: {
1018
+ signatures: [
1019
+ ["7/8", 0.4],
1020
+ ["5/4", 0.3],
1021
+ ["4/4", 0.3],
1022
+ ],
1023
+ },
1024
+ pitch: {
1025
+ scales: [
1026
+ ["minor", 0.4],
1027
+ ["dorian", 0.3],
1028
+ ["major", 0.3],
1029
+ ],
1030
+ },
1031
+ texture: {
1032
+ roles: {
1033
+ pad: role("strings", "choir:0.4"),
1034
+ lead: role("saw", "gtr-lead:0.7", "sing:0.6"),
1035
+ },
1036
+ },
1037
+ }),
1038
+ card({
1039
+ id: "art-rock",
1040
+ summary:
1041
+ "art rock: sevenths and modal interchange, piano-led arrangement, theatrical dynamics, 4/4 and 6/8",
1042
+ meter: {
1043
+ signatures: [
1044
+ ["4/4", 0.7],
1045
+ ["6/8", 0.3],
1046
+ ],
1047
+ },
1048
+ rhythm: { onsets: { kick: grid("x..x.xx.") } },
1049
+ harmony: { sevenths: 0.5 },
1050
+ expression: { dynamics: [0.3, 0.95] },
1051
+ texture: { roles: { chords: role("piano", "grand:0.5", "electric:0.4") } },
1052
+ }),
1053
+ card({
1054
+ id: "canterbury",
1055
+ summary:
1056
+ "Canterbury: jazz-tinged sevenths and ninths, 7/8 and 9/8 meters, fuzz organ and electric piano leads, whimsy",
1057
+ tempo: { bpm: [100, 150], typical: 120 },
1058
+ meter: {
1059
+ signatures: [
1060
+ ["7/8", 0.4],
1061
+ ["9/8", 0.3],
1062
+ ["4/4", 0.3],
1063
+ ],
1064
+ grouping: [
1065
+ [[2, 2, 3], 0.4],
1066
+ [[2, 2, 2, 3], 0.3],
1067
+ [[3, 2, 2], 0.3],
1068
+ ],
1069
+ },
1070
+ pitch: {
1071
+ scales: [
1072
+ ["dorian", 0.5],
1073
+ ["mixolydian", 0.3],
1074
+ ["major", 0.2],
1075
+ ],
1076
+ },
1077
+ harmony: {
1078
+ presets: [
1079
+ ["ii-v-i", 0.5],
1080
+ ["dorian-vamp", 0.5],
1081
+ ],
1082
+ sevenths: 0.8,
1083
+ cadences: [["V-I", 1]],
1084
+ },
1085
+ rhythm: { onsets: { kick: grid("x.....x."), hat: grid("x.xxx.xx") } },
1086
+ texture: {
1087
+ roles: {
1088
+ chords: role("epiano", "hammond:0.6"),
1089
+ lead: role("organ", "sax:0.5", "sing:0.4"),
1090
+ },
1091
+ },
1092
+ }),
1093
+ card({
1094
+ id: "krautrock",
1095
+ summary:
1096
+ "krautrock: motorik beat (steady kick and eighth hats, no fills), one-chord modal drone, bass ostinato, hypnotic repetition",
1097
+ tempo: { bpm: [120, 160], typical: 138 },
1098
+ meter: { signatures: [["4/4", 1]], hypermeter: [[8, 1]] },
1099
+ rhythm: {
1100
+ onsets: {
1101
+ kick: grid("x.x.x.xx"),
1102
+ snare: BACKBEAT,
1103
+ hat: EIGHTHS,
1104
+ },
1105
+ fills: { every: 16, density: [0, 0.1] },
1106
+ },
1107
+ pitch: {
1108
+ scales: [
1109
+ ["dorian", 0.5],
1110
+ ["mixolydian", 0.5],
1111
+ ],
1112
+ },
1113
+ harmony: { model: "modal", rhythm: [[0.25, 1]] },
1114
+ melody: { repetition: 0.9, density: [1, 2] },
1115
+ bass: { behaviour: [["ostinato", 1]], onsets: EIGHTHS, kickLock: 0 },
1116
+ form: {
1117
+ plans: [[["intro", "verse", "verse", "breakdown", "verse", "outro"], 1]],
1118
+ archetype: "strophic",
1119
+ },
1120
+ texture: {
1121
+ roles: {
1122
+ chords: role("electric@clean", "organ:0.6"),
1123
+ pad: maybe("saw", "strings:0.4"),
1124
+ lead: role("saw", "electric@clean:0.5"),
1125
+ },
1126
+ },
1127
+ }),
1128
+ card({
1129
+ id: "space-rock",
1130
+ summary:
1131
+ "space rock: droning one-chord modal jams, synth pads and oscillator leads, phased wash, tonic pedal",
1132
+ tempo: { bpm: [90, 135], typical: 112 },
1133
+ meter: { signatures: [["4/4", 1]], hypermeter: [[8, 1]] },
1134
+ pitch: {
1135
+ scales: [
1136
+ ["dorian", 0.4],
1137
+ ["mixolydian", 0.3],
1138
+ ["minor", 0.3],
1139
+ ],
1140
+ },
1141
+ harmony: { model: "drone", rhythm: [[0.25, 1]] },
1142
+ bass: {
1143
+ behaviour: [
1144
+ ["pedal", 0.6],
1145
+ ["ostinato", 0.4],
1146
+ ],
1147
+ kickLock: 0,
1148
+ },
1149
+ texture: {
1150
+ roles: {
1151
+ chords: role("electric@fuzz"),
1152
+ pad: role("strings", "saw:0.6"),
1153
+ lead: role("saw", "square:0.6"),
1154
+ },
1155
+ },
1156
+ mix: { fx: { lead: { phaser: "slow" } }, space: 0.6 },
1157
+ }),
1158
+ card({
1159
+ id: "zeuhl",
1160
+ summary:
1161
+ "zeuhl and RIO: hammering bass ostinato, phrygian and minor pedal points, choral chant, martial 7/8 and 4/4",
1162
+ tempo: { bpm: [90, 150], typical: 120 },
1163
+ meter: {
1164
+ signatures: [
1165
+ ["7/8", 0.5],
1166
+ ["4/4", 0.5],
1167
+ ],
1168
+ },
1169
+ pitch: {
1170
+ scales: [
1171
+ ["phrygian", 0.5],
1172
+ ["minor", 0.3],
1173
+ ["locrian", 0.2],
1174
+ ],
1175
+ },
1176
+ harmony: { model: "modal", rhythm: [[0.5, 1]] },
1177
+ bass: { behaviour: [["ostinato", 1]], onsets: EIGHTHS, kickLock: 0 },
1178
+ texture: {
1179
+ roles: {
1180
+ chords: role("piano", "epiano:0.6"),
1181
+ lead: role("choir"),
1182
+ bass: role("ebass"),
1183
+ },
1184
+ },
1185
+ }),
1186
+ card({
1187
+ id: "jam-band",
1188
+ summary:
1189
+ "jam band: long mixolydian and dorian vamps, improvised lead over light swing, open-ended forms",
1190
+ tempo: { bpm: [95, 130], typical: 110 },
1191
+ meter: { signatures: [["4/4", 1]], hypermeter: [[8, 1]] },
1192
+ groove: { swingRatio: [1, 1.3] },
1193
+ pitch: {
1194
+ scales: [
1195
+ ["mixolydian", 0.5],
1196
+ ["dorian", 0.5],
1197
+ ],
1198
+ },
1199
+ harmony: { model: "modal", rhythm: [[0.5, 1]] },
1200
+ melody: { density: [2, 3], repetition: 0.3 },
1201
+ texture: {
1202
+ roles: {
1203
+ chords: role("electric@clean", "hammond:0.6"),
1204
+ lead: role("gtr-lead"),
1205
+ counter: maybe("rhodes", "piano:0.5"),
1206
+ },
1207
+ },
1208
+ }),
1209
+
1210
+ // -------------------------------------------------------------------
1211
+ // Alternative and indie: jangle or fuzz guitars, the I-V-vi-IV axis and
1212
+ // its relative-minor rotation vi-IV-I-V, modal loops, quiet-loud.
1213
+ card({
1214
+ id: "alt-indie",
1215
+ abstract: true,
1216
+ summary:
1217
+ "alternative and indie: jangle or fuzz, I-V-vi-IV axis and vi-IV-I-V rotation, modal loops, quiet-loud",
1218
+ harmony: {
1219
+ presets: [
1220
+ ["axis", 0.5],
1221
+ ["sad-pop", 0.5],
1222
+ ],
1223
+ cadences: [
1224
+ ["IV-I", 0.5],
1225
+ ["V-vi", 0.2],
1226
+ ["V-I", 0.3],
1227
+ ],
1228
+ },
1229
+ pitch: {
1230
+ scales: [
1231
+ ["major", 0.5],
1232
+ ["minor", 0.3],
1233
+ ["mixolydian", 0.2],
1234
+ ],
1235
+ },
1236
+ form: { energy: { verse: 0.5, chorus: 0.95 } },
1237
+ texture: { roles: { chords: role("jangle", "electric:0.5") } },
1238
+ }),
1239
+ card({
1240
+ id: "indie-rock",
1241
+ summary:
1242
+ "indie and college rock: angular clean and crunch guitars, axis loops and modal mixolydian, straight eights",
1243
+ tempo: { bpm: [110, 150], typical: 128 },
1244
+ rhythm: { onsets: { kick: grid("x..x...x") } },
1245
+ texture: { roles: { chords: role("electric@alt", "electric@crunch:0.6") } },
1246
+ }),
1247
+ card({
1248
+ id: "jangle-pop",
1249
+ summary:
1250
+ "jangle pop: chiming arpeggiated major chords on jangle strum patterns, I-IV-V and fifties changes, bright tempo",
1251
+ tempo: { bpm: [120, 155], typical: 136 },
1252
+ pitch: {
1253
+ scales: [
1254
+ ["major", 0.8],
1255
+ ["mixolydian", 0.2],
1256
+ ],
1257
+ },
1258
+ harmony: {
1259
+ presets: [
1260
+ ["fifties", 0.5],
1261
+ ["axis", 0.5],
1262
+ ],
1263
+ voicing: { types: [["open", 1]], strokes: [["jangle", 1]] },
1264
+ },
1265
+ texture: {
1266
+ roles: { chords: role("jangle"), arp: maybe("electric@jangle") },
1267
+ },
1268
+ }),
1269
+ card({
1270
+ id: "shoegaze",
1271
+ summary:
1272
+ "shoegaze: wall of reverse-reverb guitar wash, sustained open chords, buried vocal, lydian and major colors, tonic drone",
1273
+ tempo: { bpm: [80, 130], typical: 104 },
1274
+ pitch: {
1275
+ scales: [
1276
+ ["major", 0.5],
1277
+ ["lydian", 0.3],
1278
+ ["mixolydian", 0.2],
1279
+ ],
1280
+ },
1281
+ harmony: {
1282
+ presets: [
1283
+ ["axis", 0.4],
1284
+ ["sad-pop", 0.3],
1285
+ ["mixolydian-rock", 0.3],
1286
+ ],
1287
+ rhythm: [[0.5, 1]],
1288
+ sevenths: 0.4,
1289
+ voicing: { types: [["open", 1]], notes: [3, 4] },
1290
+ },
1291
+ melody: { density: [0.5, 1], intervals: intervals(1.4, 0.8, 0.3, 0.8) },
1292
+ texture: {
1293
+ roles: {
1294
+ chords: role("shoegaze"),
1295
+ pad: role("shoegaze", "granular:0.5"),
1296
+ lead: role("sing", "ebow:0.5"),
1297
+ },
1298
+ },
1299
+ mix: { levels: { lead: -4, pad: -6 }, space: 0.7 },
1300
+ }),
1301
+ card({
1302
+ id: "dream-pop",
1303
+ summary:
1304
+ "dream pop: reverb-washed major-seventh chords, slow arpeggios, breathy vocal, drum machine or soft kit",
1305
+ tempo: { bpm: [70, 110], typical: 88 },
1306
+ pitch: {
1307
+ scales: [
1308
+ ["major", 0.6],
1309
+ ["lydian", 0.4],
1310
+ ],
1311
+ },
1312
+ harmony: {
1313
+ presets: [
1314
+ ["axis", 0.5],
1315
+ ["canon", 0.5],
1316
+ ],
1317
+ rhythm: [[0.5, 1]],
1318
+ sevenths: 0.7,
1319
+ voicing: { types: [["open", 1]], notes: [3, 4] },
1320
+ },
1321
+ rhythm: { onsets: { kick: grid("x...x...") } },
1322
+ melody: { density: [0.5, 1.5] },
1323
+ expression: { dynamics: [0.3, 0.75] },
1324
+ texture: {
1325
+ roles: {
1326
+ chords: role("dreampop"),
1327
+ arp: maybe("dreampop", "celesta:0.4"),
1328
+ lead: role("sing", "aah:0.5"),
1329
+ },
1330
+ },
1331
+ mix: { space: 0.65 },
1332
+ }),
1333
+ card({
1334
+ id: "noise-rock",
1335
+ summary:
1336
+ "noise rock: dissonant locrian and phrygian riffs, ragged distortion, pounding toms, abrasive repetition",
1337
+ tempo: { bpm: [100, 160], typical: 126 },
1338
+ pitch: {
1339
+ scales: [
1340
+ ["phrygian", 0.4],
1341
+ ["locrian", 0.3],
1342
+ ["minor", 0.3],
1343
+ ],
1344
+ },
1345
+ harmony: {
1346
+ model: "modal",
1347
+ rhythm: [[1, 1]],
1348
+ voicing: { types: [["power", 1]] },
1349
+ },
1350
+ rhythm: { onsets: { tom: grid("x..x..x.") } },
1351
+ melody: { intervals: CHROMATIC },
1352
+ texture: {
1353
+ roles: {
1354
+ tom: KIT_TOM_OPT,
1355
+ chords: role("ragged", "electric@fuzz:0.6"),
1356
+ },
1357
+ },
1358
+ }),
1359
+ card({
1360
+ id: "grunge",
1361
+ summary:
1362
+ "grunge: quiet-loud dynamics, drop-D power chords, aeolian with chromatic i-bIII-bVI-IV moves, sludgy mid-tempo",
1363
+ tempo: { bpm: [85, 130], typical: 104 },
1364
+ pitch: {
1365
+ scales: [
1366
+ ["minor", 0.5],
1367
+ ["minor-pentatonic", 0.3],
1368
+ ["dorian", 0.2],
1369
+ ],
1370
+ },
1371
+ harmony: {
1372
+ presets: [["aeolian", 0.5]],
1373
+ chain: {
1374
+ i: [
1375
+ ["bIII", 1],
1376
+ ["bVI", 1],
1377
+ ["IV", 0.5],
1378
+ ],
1379
+ bIII: [
1380
+ ["bVI", 1],
1381
+ ["IV", 0.5],
1382
+ ],
1383
+ bVI: [
1384
+ ["bVII", 1],
1385
+ ["IV", 0.5],
1386
+ ],
1387
+ IV: [["i", 1]],
1388
+ bVII: [["i", 1]],
1389
+ },
1390
+ sources: { presets: 1, chain: 1 },
1391
+ cadences: [
1392
+ ["bVII-I", 0.6],
1393
+ ["IV-I", 0.4],
1394
+ ],
1395
+ voicing: { types: [["power", 1]], range: [38, 60] },
1396
+ },
1397
+ form: {
1398
+ energy: { intro: 0.3, verse: 0.35, pre: 0.6, chorus: 1, bridge: 0.5 },
1399
+ archetype: "quiet-loud",
1400
+ },
1401
+ texture: {
1402
+ roles: { chords: role("electric@fuzz", "electric@alt:0.5") },
1403
+ },
1404
+ }),
1405
+ card({
1406
+ id: "britpop",
1407
+ summary:
1408
+ "britpop: mixolydian swagger, I-V-vi-IV and I-bVII-IV, tambourine on the backbeat, terrace sing-along chorus",
1409
+ tempo: { bpm: [100, 130], typical: 112 },
1410
+ pitch: {
1411
+ scales: [
1412
+ ["major", 0.6],
1413
+ ["mixolydian", 0.4],
1414
+ ],
1415
+ },
1416
+ harmony: {
1417
+ presets: [
1418
+ ["axis", 0.4],
1419
+ ["mixolydian-rock", 0.4],
1420
+ ["canon", 0.2],
1421
+ ],
1422
+ },
1423
+ rhythm: { onsets: { shaker: BACKBEAT } },
1424
+ melody: { intervals: ANTHEM },
1425
+ texture: {
1426
+ roles: {
1427
+ shaker: SHAKER,
1428
+ chords: role("electric@crunch", "jangle:0.5"),
1429
+ counter: maybe("strings", "hammond:0.5"),
1430
+ },
1431
+ },
1432
+ }),
1433
+ card({
1434
+ id: "math-rock",
1435
+ summary:
1436
+ "math rock: odd and shifting meters (7/8, 5/4, 9/8), tapped clean arpeggios, syncopated stop-start accents",
1437
+ tempo: { bpm: [120, 165], typical: 140 },
1438
+ meter: {
1439
+ signatures: [
1440
+ ["7/8", 0.35],
1441
+ ["5/4", 0.25],
1442
+ ["9/8", 0.2],
1443
+ ["4/4", 0.2],
1444
+ ],
1445
+ grouping: [
1446
+ [[2, 2, 3], 0.4],
1447
+ [[3, 3, 3], 0.2],
1448
+ [[3, 2, 2], 0.4],
1449
+ ],
1450
+ },
1451
+ groove: { subdivision: 4 },
1452
+ rhythm: {
1453
+ onsets: {
1454
+ kick: grid("x..x..x...x..x.."),
1455
+ snare: grid("....x.......x..3"),
1456
+ hat: EIGHTHS16,
1457
+ },
1458
+ },
1459
+ pitch: {
1460
+ scales: [
1461
+ ["major", 0.4],
1462
+ ["lydian", 0.3],
1463
+ ["dorian", 0.3],
1464
+ ],
1465
+ },
1466
+ harmony: { sevenths: 0.5, voicing: { types: [["open", 1]] } },
1467
+ bass: { onsets: grid("x..x..x...x..x.."), kickLock: 0.5 },
1468
+ texture: {
1469
+ roles: {
1470
+ chords: role("electric@clean"),
1471
+ arp: role("electric@clean"),
1472
+ lead: role("electric@clean", "sing:0.4"),
1473
+ },
1474
+ },
1475
+ }),
1476
+ card({
1477
+ id: "post-rock",
1478
+ summary:
1479
+ "post-rock: instrumental crescendo form, tremolo-picked arpeggios over pedal bass, reverb-washed guitars, slow build",
1480
+ tempo: { bpm: [70, 125], typical: 96 },
1481
+ meter: { hypermeter: [[8, 1]] },
1482
+ pitch: {
1483
+ scales: [
1484
+ ["major", 0.4],
1485
+ ["minor", 0.4],
1486
+ ["lydian", 0.2],
1487
+ ],
1488
+ },
1489
+ harmony: {
1490
+ presets: [
1491
+ ["axis", 0.3],
1492
+ ["sad-pop", 0.4],
1493
+ ["aeolian", 0.3],
1494
+ ],
1495
+ rhythm: [[0.5, 1]],
1496
+ voicing: { types: [["open", 1]] },
1497
+ },
1498
+ melody: { density: [0.5, 1] },
1499
+ bass: {
1500
+ behaviour: [
1501
+ ["pedal", 0.5],
1502
+ ["root", 0.5],
1503
+ ],
1504
+ },
1505
+ form: {
1506
+ plans: [
1507
+ [
1508
+ [
1509
+ "intro",
1510
+ "build",
1511
+ "build",
1512
+ "drop",
1513
+ "breakdown",
1514
+ "build",
1515
+ "drop",
1516
+ "outro",
1517
+ ],
1518
+ 1,
1519
+ ],
1520
+ ],
1521
+ energy: { intro: 0.2, build: 0.55, drop: 1, breakdown: 0.25, outro: 0.3 },
1522
+ archetype: "crescendo",
1523
+ },
1524
+ texture: {
1525
+ roles: {
1526
+ chords: role("electric@clean", "shoegaze:0.5"),
1527
+ arp: role("electric@clean", "glock:0.4"),
1528
+ lead: role("ebow", "strings:0.5"),
1529
+ },
1530
+ },
1531
+ mix: { fx: { lead: { swell: "slow" } }, space: 0.6 },
1532
+ }),
1533
+ card({
1534
+ id: "slowcore",
1535
+ summary:
1536
+ "slowcore and sadcore: very slow tempo, sparse kit, clean guitars, minor loops, long sustained notes",
1537
+ tempo: { bpm: [50, 80], typical: 64 },
1538
+ rhythm: {
1539
+ onsets: {
1540
+ kick: grid("x......."),
1541
+ snare: grid("....x..."),
1542
+ hat: QUARTERS,
1543
+ },
1544
+ fills: { every: 8, density: [0.1, 0.2] },
1545
+ },
1546
+ pitch: {
1547
+ scales: [
1548
+ ["minor", 0.6],
1549
+ ["major", 0.4],
1550
+ ],
1551
+ },
1552
+ harmony: {
1553
+ presets: [
1554
+ ["sad-pop", 0.5],
1555
+ ["aeolian", 0.5],
1556
+ ],
1557
+ rhythm: [[0.5, 1]],
1558
+ },
1559
+ melody: { density: [0.5, 1] },
1560
+ bass: { onsets: grid("x...x..."), kickLock: 0.4 },
1561
+ expression: { dynamics: [0.25, 0.6] },
1562
+ texture: {
1563
+ roles: { chords: role("electric@clean"), lead: role("sing") },
1564
+ },
1565
+ mix: { space: 0.5 },
1566
+ }),
1567
+ card({
1568
+ id: "lo-fi-indie",
1569
+ summary:
1570
+ "lo-fi indie: home-recorded lofi kit, steel-string strums, plain I-IV-V and axis loops, tape-worn sound",
1571
+ tempo: { bpm: [85, 130], typical: 104 },
1572
+ harmony: {
1573
+ presets: [
1574
+ ["axis", 0.4],
1575
+ ["fifties", 0.3],
1576
+ ["sad-pop", 0.3],
1577
+ ],
1578
+ voicing: { types: [["close", 1]], strokes: [["folk", 1]] },
1579
+ },
1580
+ texture: {
1581
+ roles: {
1582
+ kick: LOFI_KIT,
1583
+ snare: LOFI_KIT,
1584
+ hat: LOFI_KIT,
1585
+ chords: role("steel", "lofi:0.5"),
1586
+ lead: role("sing"),
1587
+ },
1588
+ },
1589
+ }),
1590
+ card({
1591
+ id: "garage-revival",
1592
+ summary:
1593
+ "garage and post-punk revival: disco-tinged four-on-the-floor or driving eighths, fuzz and wiry clean guitars, minor loops",
1594
+ tempo: { bpm: [115, 160], typical: 130 },
1595
+ rhythm: { onsets: { kick: QUARTERS, hat: EIGHTHS } },
1596
+ pitch: {
1597
+ scales: [
1598
+ ["minor", 0.5],
1599
+ ["mixolydian", 0.5],
1600
+ ],
1601
+ },
1602
+ harmony: {
1603
+ presets: [
1604
+ ["aeolian", 0.5],
1605
+ ["mixolydian-rock", 0.5],
1606
+ ],
1607
+ },
1608
+ bass: {
1609
+ onsets: EIGHTHS,
1610
+ behaviour: [
1611
+ ["octave", 0.5],
1612
+ ["root", 0.5],
1613
+ ],
1614
+ },
1615
+ texture: { roles: { chords: role("electric@fuzz", "electric@clean:0.7") } },
1616
+ }),
1617
+ card({
1618
+ id: "midwest-emo",
1619
+ summary:
1620
+ "midwest emo: twinkly open-tuned arpeggios, major-seventh and add9 colors, odd-meter turns, earnest vocal",
1621
+ tempo: { bpm: [120, 160], typical: 138 },
1622
+ meter: {
1623
+ signatures: [
1624
+ ["4/4", 0.7],
1625
+ ["7/8", 0.15],
1626
+ ["6/8", 0.15],
1627
+ ],
1628
+ },
1629
+ pitch: {
1630
+ scales: [
1631
+ ["major", 0.6],
1632
+ ["lydian", 0.4],
1633
+ ],
1634
+ },
1635
+ harmony: { sevenths: 0.6, voicing: { types: [["open", 1]] } },
1636
+ texture: {
1637
+ roles: {
1638
+ chords: role("electric@clean"),
1639
+ arp: role("electric@clean"),
1640
+ lead: role("sing"),
1641
+ },
1642
+ },
1643
+ }),
1644
+ card({
1645
+ id: "emo",
1646
+ summary:
1647
+ "emo and emo pop: vi-IV-I-V rotation, palm-muted verses into open choruses, quiet-loud, fast backbeat",
1648
+ tempo: { bpm: [140, 185], typical: 160 },
1649
+ harmony: {
1650
+ presets: [
1651
+ ["sad-pop", 0.6],
1652
+ ["axis", 0.4],
1653
+ ],
1654
+ voicing: { types: [["power", 1]] },
1655
+ },
1656
+ form: { energy: { verse: 0.45, chorus: 1 }, archetype: "quiet-loud" },
1657
+ texture: { roles: { chords: role("electric@alt", "punk:0.5") } },
1658
+ }),
1659
+ card({
1660
+ id: "indie-songwriter",
1661
+ summary:
1662
+ "indie songwriter rock: confessional melody over steel-string strums, sad-pop and axis loops, sparse kit",
1663
+ tempo: { bpm: [80, 125], typical: 100 },
1664
+ rhythm: { onsets: { kick: grid("x...5...") } },
1665
+ harmony: {
1666
+ presets: [
1667
+ ["sad-pop", 0.5],
1668
+ ["axis", 0.5],
1669
+ ],
1670
+ voicing: { types: [["open", 1]], strokes: [["folk", 1]] },
1671
+ },
1672
+ melody: { repetition: 0.5 },
1673
+ texture: {
1674
+ roles: {
1675
+ chords: role("steel", "electric@clean:0.6"),
1676
+ lead: role("sing"),
1677
+ },
1678
+ },
1679
+ }),
1680
+ card({
1681
+ id: "j-rock",
1682
+ summary:
1683
+ "J-rock and visual kei: royal-road IVmaj7-V7-iii7-vi progression, fast melodic lead, tight sixteenth drive",
1684
+ tempo: { bpm: [140, 190], typical: 165 },
1685
+ groove: { subdivision: 4 },
1686
+ rhythm: {
1687
+ onsets: {
1688
+ kick: grid("x.x...x.x.x....."),
1689
+ snare: BACKBEAT16,
1690
+ hat: EIGHTHS16,
1691
+ },
1692
+ },
1693
+ pitch: {
1694
+ scales: [
1695
+ ["major", 0.6],
1696
+ ["minor", 0.4],
1697
+ ],
1698
+ },
1699
+ harmony: {
1700
+ forms: [[["IVmaj7", "V7", "iii7", "vi"], 1]],
1701
+ presets: [["sad-pop", 1]],
1702
+ sources: { forms: 2, presets: 1 },
1703
+ cadences: [
1704
+ ["V-I", 0.5],
1705
+ ["V-vi", 0.5],
1706
+ ],
1707
+ voicing: {
1708
+ types: [
1709
+ ["close", 0.6],
1710
+ ["power", 0.4],
1711
+ ],
1712
+ },
1713
+ },
1714
+ melody: { density: [2, 3], intervals: ANTHEM },
1715
+ bass: { onsets: EIGHTHS16, kickLock: 0.4 },
1716
+ texture: {
1717
+ roles: { chords: role("electric@crunch", "electric@lead:0.5") },
1718
+ },
1719
+ }),
1720
+ card({
1721
+ id: "k-rock",
1722
+ summary:
1723
+ "K-rock: band-sound anthems, sad-pop vi-IV-I-V and canon changes, big unison chorus, straight eighths",
1724
+ tempo: { bpm: [130, 175], typical: 150 },
1725
+ rhythm: { onsets: { kick: grid("x.x.x.x.") } },
1726
+ harmony: {
1727
+ presets: [
1728
+ ["sad-pop", 0.4],
1729
+ ["canon", 0.3],
1730
+ ["axis", 0.3],
1731
+ ],
1732
+ },
1733
+ melody: { intervals: ANTHEM, repetition: 0.7 },
1734
+ texture: { roles: { chords: role("electric@crunch") } },
1735
+ }),
1736
+ card({
1737
+ id: "anatolian-rock",
1738
+ summary:
1739
+ "Anatolian rock: makam hijaz and kurd colors on fuzz guitar and saz-like setar, aksak 9/8 as 2+2+2+3, tonic drone",
1740
+ tempo: { bpm: [100, 140], typical: 118 },
1741
+ meter: {
1742
+ signatures: [
1743
+ ["9/8", 0.6],
1744
+ ["4/4", 0.4],
1745
+ ],
1746
+ grouping: [[[2, 2, 2, 3], 1]],
1747
+ },
1748
+ rhythm: { onsets: { kick: grid("x..x.x..") } },
1749
+ pitch: {
1750
+ scales: [
1751
+ ["phrygian-dominant", 0.5],
1752
+ ["phrygian", 0.3],
1753
+ ["harmonic-minor", 0.2],
1754
+ ],
1755
+ },
1756
+ harmony: { model: "modal", rhythm: [[1, 1]] },
1757
+ texture: {
1758
+ roles: {
1759
+ chords: role("electric@fuzz"),
1760
+ counter: role("setar", "oud:0.5"),
1761
+ drone: maybe("organ"),
1762
+ },
1763
+ },
1764
+ }),
1765
+
1766
+ // -------------------------------------------------------------------
1767
+ // Punk: fast down-strummed eighths, three-chord I-IV-V, power chords,
1768
+ // the "skank" alternating kick-snare beat, short songs.
1769
+ card({
1770
+ id: "punk",
1771
+ abstract: true,
1772
+ summary:
1773
+ "punk: fast down-picked eighths, three-chord I-IV-V, power chords, kick on every beat, short songs",
1774
+ tempo: { bpm: [150, 200], typical: 175 },
1775
+ rhythm: { onsets: { kick: grid("x.x.x.x."), hat: EIGHTHS } },
1776
+ harmony: {
1777
+ presets: [
1778
+ ["axis", 0.5],
1779
+ ["fifties", 0.5],
1780
+ ],
1781
+ voicing: { types: [["power", 1]], strokes: [["punk", 1]] },
1782
+ },
1783
+ form: {
1784
+ plans: [[["intro", "verse", "chorus", "verse", "chorus", "outro"], 1]],
1785
+ },
1786
+ texture: { roles: { chords: role("punk") } },
1787
+ }),
1788
+ card({
1789
+ id: "proto-punk",
1790
+ summary:
1791
+ "proto-punk: raw two-chord drones, fuzz guitar, mid-tempo straight eighths, minimal I-bVII changes",
1792
+ tempo: { bpm: [115, 160], typical: 136 },
1793
+ pitch: {
1794
+ scales: [
1795
+ ["mixolydian", 0.5],
1796
+ ["minor-pentatonic", 0.5],
1797
+ ],
1798
+ },
1799
+ harmony: {
1800
+ forms: [[["I", "bVII"], 1]],
1801
+ presets: [["mixolydian-rock", 1]],
1802
+ sources: { forms: 2, presets: 1 },
1803
+ cadences: [["bVII-I", 1]],
1804
+ },
1805
+ texture: { roles: { chords: role("electric@fuzz", "ragged:0.5") } },
1806
+ }),
1807
+ card({
1808
+ id: "punk-rock",
1809
+ summary:
1810
+ "first-wave punk: down-stroked eighth power chords, I-IV-V, kick on every beat, shouted unison chorus",
1811
+ tempo: { bpm: [165, 210], typical: 185 },
1812
+ rhythm: { onsets: { kick: QUARTERS, hat: EIGHTHS } },
1813
+ pitch: {
1814
+ scales: [
1815
+ ["major", 0.6],
1816
+ ["mixolydian", 0.4],
1817
+ ],
1818
+ },
1819
+ harmony: {
1820
+ forms: [
1821
+ [["I", "IV", "V", "IV"], 0.5],
1822
+ [["I", "I", "IV", "V"], 0.3],
1823
+ [["I", "bVII", "IV", "I"], 0.2],
1824
+ ],
1825
+ presets: [["fifties", 1]],
1826
+ sources: { forms: 3, presets: 1 },
1827
+ cadences: [
1828
+ ["V-I", 0.6],
1829
+ ["IV-I", 0.4],
1830
+ ],
1831
+ },
1832
+ bass: { behaviour: [["root", 1]], onsets: EIGHTHS, kickLock: 0 },
1833
+ melody: { repetition: 0.8, density: [1, 2] },
1834
+ }),
1835
+ card({
1836
+ id: "oi",
1837
+ summary:
1838
+ "Oi! and street punk: mid-tempo stomp, terrace gang-vocal chorus, I-IV-V power chords, quarter-note kick",
1839
+ tempo: { bpm: [125, 160], typical: 140 },
1840
+ melody: { intervals: ANTHEM, repetition: 0.8 },
1841
+ texture: { roles: { counter: role("choir") } },
1842
+ }),
1843
+ card({
1844
+ id: "hardcore-punk",
1845
+ summary:
1846
+ "hardcore punk: skank beat (kick on the beat, snare on every off-beat eighth), 180-240 bpm, breakdowns, short songs",
1847
+ tempo: { bpm: [180, 240], typical: 205 },
1848
+ rhythm: { onsets: { kick: grid("x.x.x.x."), snare: grid(".x.x.x.x") } },
1849
+ pitch: {
1850
+ scales: [
1851
+ ["minor", 0.5],
1852
+ ["phrygian", 0.3],
1853
+ ["minor-pentatonic", 0.2],
1854
+ ],
1855
+ },
1856
+ harmony: {
1857
+ forms: [
1858
+ [["i", "bVII", "bVI", "bVII"], 0.5],
1859
+ [["i", "bIII", "bVII", "i"], 0.5],
1860
+ ],
1861
+ presets: [["aeolian", 1]],
1862
+ sources: { forms: 2, presets: 1 },
1863
+ cadences: [["bVII-I", 1]],
1864
+ },
1865
+ melody: { intervals: CHROMATIC, density: [1, 2] },
1866
+ bass: { kickLock: 0.5 },
1867
+ form: {
1868
+ plans: [[["intro", "verse", "chorus", "breakdown", "chorus"], 1]],
1869
+ energy: { breakdown: 0.8 },
1870
+ },
1871
+ }),
1872
+ card({
1873
+ id: "crust",
1874
+ summary:
1875
+ "crust and d-beat: the d-beat (kick on 1, the and of 2 and 3, snare on 2 and 4), aeolian power chords, ragged tone",
1876
+ tempo: { bpm: [150, 200], typical: 172 },
1877
+ rhythm: { onsets: { kick: grid("x..xx..."), snare: BACKBEAT } },
1878
+ pitch: {
1879
+ scales: [
1880
+ ["minor", 0.6],
1881
+ ["phrygian", 0.4],
1882
+ ],
1883
+ },
1884
+ harmony: { presets: [["aeolian", 1]], cadences: [["bVII-I", 1]] },
1885
+ texture: { roles: { chords: role("ragged", "gtr-metal:0.5") } },
1886
+ }),
1887
+ card({
1888
+ id: "anarcho-punk",
1889
+ summary:
1890
+ "anarcho-punk: tribal floor-tom beats, minor drones, chanted choir vocals, stark mid-fast tempo",
1891
+ tempo: { bpm: [140, 180], typical: 158 },
1892
+ rhythm: { onsets: { tom: grid("x.xx.x.x"), kick: QUARTERS } },
1893
+ pitch: {
1894
+ scales: [
1895
+ ["minor", 0.6],
1896
+ ["dorian", 0.4],
1897
+ ],
1898
+ },
1899
+ harmony: { presets: [["aeolian", 1]], cadences: [["bVII-I", 1]] },
1900
+ texture: { roles: { tom: KIT_TOM, counter: maybe("choir") } },
1901
+ }),
1902
+ card({
1903
+ id: "pop-punk",
1904
+ summary:
1905
+ "pop punk: I-V-vi-IV power chords, palm-muted verse eighths into open choruses, hooky major melody",
1906
+ tempo: { bpm: [145, 185], typical: 165 },
1907
+ rhythm: { onsets: { kick: grid("x..xx.x.") } },
1908
+ pitch: { scales: [["major", 1]] },
1909
+ harmony: {
1910
+ forms: [],
1911
+ presets: [
1912
+ ["axis", 0.6],
1913
+ ["sad-pop", 0.4],
1914
+ ],
1915
+ sources: { presets: 1 },
1916
+ },
1917
+ melody: { repetition: 0.75, intervals: ANTHEM },
1918
+ form: {
1919
+ plans: [
1920
+ [
1921
+ [
1922
+ "intro",
1923
+ "verse",
1924
+ "pre",
1925
+ "chorus",
1926
+ "verse",
1927
+ "pre",
1928
+ "chorus",
1929
+ "bridge",
1930
+ "chorus",
1931
+ ],
1932
+ 1,
1933
+ ],
1934
+ ],
1935
+ energy: { verse: 0.6, chorus: 1 },
1936
+ },
1937
+ }),
1938
+ card({
1939
+ id: "skate-punk",
1940
+ summary:
1941
+ "skate punk: melodic hardcore at 180-230 bpm, skank beat, fast major melodies with harmony leads",
1942
+ tempo: { bpm: [180, 230], typical: 200 },
1943
+ rhythm: { onsets: { snare: grid(".x.x.x.x") } },
1944
+ pitch: { scales: [["major", 1]] },
1945
+ harmony: {
1946
+ forms: [],
1947
+ sources: { presets: 1 },
1948
+ presets: [
1949
+ ["axis", 0.5],
1950
+ ["sad-pop", 0.5],
1951
+ ],
1952
+ },
1953
+ bass: { kickLock: 0.5 },
1954
+ melody: { density: [2, 3] },
1955
+ }),
1956
+ card({
1957
+ id: "post-punk",
1958
+ summary:
1959
+ "post-punk: melodic bass ostinato carries the tune, chorus-washed wiry guitar, dorian and minor vamps, motorik hats",
1960
+ tempo: { bpm: [115, 150], typical: 132 },
1961
+ groove: { subdivision: 4 },
1962
+ rhythm: {
1963
+ onsets: {
1964
+ kick: grid("x.....x.x......."),
1965
+ snare: BACKBEAT16,
1966
+ hat: SIXTEENTHS,
1967
+ },
1968
+ },
1969
+ pitch: {
1970
+ scales: [
1971
+ ["minor", 0.5],
1972
+ ["dorian", 0.5],
1973
+ ],
1974
+ },
1975
+ harmony: {
1976
+ model: "modal",
1977
+ rhythm: [[0.5, 1]],
1978
+ voicing: { types: [["close", 1]], strokes: [] },
1979
+ },
1980
+ bass: {
1981
+ behaviour: [["ostinato", 1]],
1982
+ range: [33, 55],
1983
+ onsets: EIGHTHS16,
1984
+ kickLock: 0,
1985
+ },
1986
+ texture: { roles: { chords: role("electric@clean"), lead: role("sing") } },
1987
+ mix: { fx: { chords: { chorus: "wide" } }, levels: { bass: 0 } },
1988
+ }),
1989
+ card({
1990
+ id: "no-wave",
1991
+ summary:
1992
+ "no wave: atonal locrian clusters, skronking alto sax, ragged guitar, disjunct jagged rhythm",
1993
+ tempo: { bpm: [100, 160], typical: 128 },
1994
+ pitch: {
1995
+ scales: [
1996
+ ["locrian", 0.5],
1997
+ ["phrygian", 0.5],
1998
+ ],
1999
+ },
2000
+ harmony: {
2001
+ model: "modal",
2002
+ voicing: { types: [["close", 1]], strokes: [] },
2003
+ },
2004
+ melody: { intervals: intervals(0.8, 0.8, 1, 0.3) },
2005
+ texture: { roles: { chords: role("ragged"), lead: role("altosax") } },
2006
+ }),
2007
+ card({
2008
+ id: "deathrock",
2009
+ summary:
2010
+ "deathrock: tom-heavy tribal beat, minor and phrygian riffs, flanged chorus guitar, horror-tinged mood",
2011
+ tempo: { bpm: [120, 160], typical: 138 },
2012
+ rhythm: { onsets: { tom: grid("x..x..x."), kick: grid("x...x...") } },
2013
+ pitch: {
2014
+ scales: [
2015
+ ["phrygian", 0.5],
2016
+ ["minor", 0.5],
2017
+ ],
2018
+ },
2019
+ harmony: {
2020
+ model: "modal",
2021
+ voicing: { types: [["power", 1]], strokes: [] },
2022
+ },
2023
+ texture: { roles: { tom: KIT_TOM, chords: role("electric@clean") } },
2024
+ mix: { fx: { chords: { chorus: "seasick" } } },
2025
+ }),
2026
+ card({
2027
+ id: "goth-rock",
2028
+ summary:
2029
+ "gothic rock: drum-machine pulse, aeolian and phrygian, chorus-drenched guitar, deep melodic bass, baritone vocal",
2030
+ tempo: { bpm: [110, 150], typical: 126 },
2031
+ rhythm: { onsets: { kick: QUARTERS } },
2032
+ pitch: {
2033
+ scales: [
2034
+ ["minor", 0.5],
2035
+ ["phrygian", 0.5],
2036
+ ],
2037
+ },
2038
+ harmony: {
2039
+ presets: [
2040
+ ["aeolian", 0.6],
2041
+ ["andalusian", 0.4],
2042
+ ],
2043
+ cadences: [
2044
+ ["bVII-I", 0.6],
2045
+ ["V-I", 0.4],
2046
+ ],
2047
+ voicing: { types: [["close", 1]], strokes: [] },
2048
+ },
2049
+ bass: {
2050
+ behaviour: [
2051
+ ["ostinato", 0.5],
2052
+ ["root", 0.5],
2053
+ ],
2054
+ kickLock: 0,
2055
+ },
2056
+ texture: { roles: { ...MACHINE_KIT, chords: role("electric@clean") } },
2057
+ mix: { fx: { chords: { chorus: "wide" } }, space: 0.5 },
2058
+ }),
2059
+ card({
2060
+ id: "coldwave",
2061
+ summary:
2062
+ "coldwave: cheap drum machine, minor synth ostinatos, detached vocal, sparse cold arrangement",
2063
+ tempo: { bpm: [105, 140], typical: 122 },
2064
+ rhythm: { onsets: { kick: QUARTERS } },
2065
+ pitch: {
2066
+ scales: [
2067
+ ["minor", 0.7],
2068
+ ["dorian", 0.3],
2069
+ ],
2070
+ },
2071
+ harmony: {
2072
+ presets: [["aeolian", 1]],
2073
+ cadences: [["bVII-I", 1]],
2074
+ voicing: { types: [["close", 1]], strokes: [] },
2075
+ },
2076
+ bass: { behaviour: [["ostinato", 1]], kickLock: 0 },
2077
+ texture: {
2078
+ roles: {
2079
+ ...MACHINE_KIT,
2080
+ chords: role("saw", "square:0.5"),
2081
+ bass: role("saw", "bass:0.5"),
2082
+ lead: role("sing", "square:0.5"),
2083
+ },
2084
+ },
2085
+ }),
2086
+ card({
2087
+ id: "psychobilly",
2088
+ summary:
2089
+ "psychobilly: slap upright at punk speed, rockabilly root-fifth bass, harmonic-minor horror riffs, light shuffle",
2090
+ tempo: { bpm: [170, 230], typical: 195 },
2091
+ groove: { swingRatio: [1.2, 1.5] },
2092
+ pitch: {
2093
+ scales: [
2094
+ ["harmonic-minor", 0.5],
2095
+ ["minor", 0.5],
2096
+ ],
2097
+ },
2098
+ harmony: {
2099
+ presets: [
2100
+ ["andalusian", 0.5],
2101
+ ["aeolian", 0.5],
2102
+ ],
2103
+ cadences: [["V-I", 1]],
2104
+ },
2105
+ bass: { behaviour: [["root-fifth", 1]], kickLock: 0.4 },
2106
+ texture: { roles: { bass: role("slap"), chords: role("electric@crunch") } },
2107
+ }),
2108
+ card({
2109
+ id: "post-hardcore",
2110
+ summary:
2111
+ "post-hardcore: dynamic quiet-loud sections, angular dissonant riffs, displaced accents, sung-to-screamed vocal",
2112
+ tempo: { bpm: [130, 180], typical: 150 },
2113
+ groove: { subdivision: 4 },
2114
+ rhythm: {
2115
+ onsets: {
2116
+ kick: grid("x..x..x...x.x..."),
2117
+ snare: BACKBEAT16,
2118
+ hat: EIGHTHS16,
2119
+ },
2120
+ },
2121
+ pitch: {
2122
+ scales: [
2123
+ ["minor", 0.5],
2124
+ ["dorian", 0.3],
2125
+ ["phrygian", 0.2],
2126
+ ],
2127
+ },
2128
+ harmony: {
2129
+ presets: [
2130
+ ["aeolian", 0.5],
2131
+ ["sad-pop", 0.5],
2132
+ ],
2133
+ },
2134
+ bass: { onsets: grid("x..x..x...x.x..."), kickLock: 0.6 },
2135
+ form: { energy: { verse: 0.45, chorus: 1 }, archetype: "quiet-loud" },
2136
+ }),
2137
+ card({
2138
+ id: "screamo",
2139
+ summary:
2140
+ "screamo: tremolo-picked minor arpeggios, blast-to-halftime swings, quiet-loud, dissonant open chords",
2141
+ tempo: { bpm: [150, 200], typical: 172 },
2142
+ groove: { subdivision: 4 },
2143
+ rhythm: {
2144
+ onsets: { kick: EIGHTHS16, snare: BACKBEAT16, hat: EIGHTHS16 },
2145
+ },
2146
+ pitch: {
2147
+ scales: [
2148
+ ["minor", 0.6],
2149
+ ["dorian", 0.4],
2150
+ ],
2151
+ },
2152
+ harmony: {
2153
+ presets: [
2154
+ ["sad-pop", 0.5],
2155
+ ["aeolian", 0.5],
2156
+ ],
2157
+ voicing: { types: [["open", 1]], strokes: [] },
2158
+ },
2159
+ bass: { onsets: EIGHTHS16, kickLock: 0.6 },
2160
+ form: { energy: { verse: 0.5, chorus: 1 }, archetype: "quiet-loud" },
2161
+ texture: {
2162
+ roles: { chords: role("ragged"), arp: maybe("electric@clean") },
2163
+ },
2164
+ }),
2165
+ card({
2166
+ id: "powerviolence",
2167
+ summary:
2168
+ "powerviolence: blast beats (kick and snare alternating every sixteenth) cut against slow sludge, very fast, very short",
2169
+ tempo: { bpm: [200, 280], typical: 240 },
2170
+ groove: { subdivision: 4, velocity: [1, 0.85, 0.95, 0.85] },
2171
+ rhythm: {
2172
+ onsets: {
2173
+ kick: grid("x.x.x.x.x.x.x.x."),
2174
+ snare: grid(".x.x.x.x.x.x.x.x"),
2175
+ hat: EIGHTHS16,
2176
+ },
2177
+ },
2178
+ pitch: {
2179
+ scales: [
2180
+ ["minor", 0.5],
2181
+ ["phrygian", 0.3],
2182
+ ["locrian", 0.2],
2183
+ ],
2184
+ },
2185
+ harmony: { presets: [["aeolian", 1]], cadences: [["bVII-I", 1]] },
2186
+ melody: { intervals: CHROMATIC },
2187
+ bass: { onsets: EIGHTHS16, kickLock: 0.8 },
2188
+ form: {
2189
+ plans: [[["intro", "verse", "breakdown", "verse"], 1]],
2190
+ energy: { breakdown: 0.7 },
2191
+ },
2192
+ texture: { roles: { chords: role("gtr-metal", "ragged:0.5") } },
2193
+ }),
2194
+ card({
2195
+ id: "folk-punk",
2196
+ summary:
2197
+ "folk and celtic punk: strummed acoustic and banjo at punk speed, fiddle and whistle reels, mixolydian I-bVII-IV",
2198
+ tempo: { bpm: [150, 195], typical: 172 },
2199
+ pitch: {
2200
+ scales: [
2201
+ ["mixolydian", 0.5],
2202
+ ["major", 0.5],
2203
+ ],
2204
+ },
2205
+ harmony: {
2206
+ presets: [
2207
+ ["mixolydian-rock", 0.5],
2208
+ ["fifties", 0.5],
2209
+ ],
2210
+ voicing: {
2211
+ types: [["close", 1]],
2212
+ strokes: [
2213
+ ["punk", 0.5],
2214
+ ["folk", 0.5],
2215
+ ],
2216
+ },
2217
+ },
2218
+ melody: { density: [2, 3] },
2219
+ texture: {
2220
+ roles: {
2221
+ chords: role("acoustic", "banjo:0.6"),
2222
+ counter: role("fiddle", "tinwhistle:0.6"),
2223
+ lead: role("sing"),
2224
+ },
2225
+ },
2226
+ }),
2227
+ card({
2228
+ id: "synthpunk",
2229
+ summary:
2230
+ "synth punk: buzzing saw and square synths over a drum machine at punk speed, minimal two-chord riffs",
2231
+ tempo: { bpm: [150, 195], typical: 170 },
2232
+ pitch: {
2233
+ scales: [
2234
+ ["minor", 0.5],
2235
+ ["mixolydian", 0.5],
2236
+ ],
2237
+ },
2238
+ harmony: {
2239
+ forms: [[["I", "bVII"], 1]],
2240
+ presets: [["aeolian", 1]],
2241
+ sources: { forms: 1, presets: 1 },
2242
+ cadences: [["bVII-I", 1]],
2243
+ voicing: { types: [["power", 1]], strokes: [] },
2244
+ },
2245
+ texture: {
2246
+ roles: {
2247
+ ...MACHINE_KIT,
2248
+ chords: role("saw", "square:0.6"),
2249
+ bass: role("square", "saw:0.5"),
2250
+ lead: role("sing", "square:0.5"),
2251
+ },
2252
+ },
2253
+ }),
2254
+
2255
+ // -------------------------------------------------------------------
2256
+ // Metal: aeolian and phrygian riffing (the bII), palm-muted pedal-point
2257
+ // riffs on the tonic, power chords only, sixteenth subdivision, double
2258
+ // kick, dark modal cadences bVI-bVII-i.
2259
+ card({
2260
+ id: "metal",
2261
+ abstract: true,
2262
+ summary:
2263
+ "metal: aeolian and phrygian riffs with the bII, palm-muted tonic pedal point, power chords, double kick, bVI-bVII-i",
2264
+ tempo: { bpm: [100, 180], typical: 140 },
2265
+ pitch: {
2266
+ scales: [
2267
+ ["minor", 0.5],
2268
+ ["phrygian", 0.3],
2269
+ ["harmonic-minor", 0.2],
2270
+ ],
2271
+ },
2272
+ harmony: {
2273
+ presets: [
2274
+ ["aeolian", 0.6],
2275
+ ["andalusian", 0.4],
2276
+ ],
2277
+ cadences: [
2278
+ ["bVI-bVII-I", 0.5],
2279
+ ["bVII-I", 0.3],
2280
+ ["bII-I", 0.2],
2281
+ ],
2282
+ voicing: { types: [["power", 1]], range: [36, 60] },
2283
+ },
2284
+ groove: { subdivision: 4, velocity: [1, 0.8, 0.9, 0.8] },
2285
+ rhythm: {
2286
+ onsets: {
2287
+ kick: SIXTEENTHS,
2288
+ snare: BACKBEAT16,
2289
+ hat: EIGHTHS16,
2290
+ },
2291
+ },
2292
+ melody: { intervals: CHROMATIC },
2293
+ bass: {
2294
+ behaviour: [
2295
+ ["pedal", 0.5],
2296
+ ["root", 0.5],
2297
+ ],
2298
+ range: [24, 45],
2299
+ onsets: SIXTEENTHS,
2300
+ },
2301
+ texture: { roles: { chords: role("gtr-metal") } },
2302
+ mix: { loudness: "loud" },
2303
+ }),
2304
+ card({
2305
+ id: "heavy-metal",
2306
+ summary:
2307
+ "heavy and NWOBHM metal: the gallop (eighth plus two sixteenths), aeolian bVI-bVII-i, twin harmony leads, plexi lead tone",
2308
+ tempo: { bpm: [110, 170], typical: 140 },
2309
+ rhythm: {
2310
+ onsets: { kick: grid("x.xxx.xxx.xxx.xx"), hat: EIGHTHS16 },
2311
+ },
2312
+ bass: { onsets: grid("x.xxx.xxx.xxx.xx") },
2313
+ pitch: {
2314
+ scales: [
2315
+ ["minor", 0.7],
2316
+ ["harmonic-minor", 0.3],
2317
+ ],
2318
+ },
2319
+ melody: { intervals: ANTHEM },
2320
+ texture: {
2321
+ roles: {
2322
+ chords: role("electric@lead", "gtr-metal:0.5"),
2323
+ counter: role("gtr-lead"),
2324
+ },
2325
+ },
2326
+ }),
2327
+ card({
2328
+ id: "speed-metal",
2329
+ summary:
2330
+ "speed metal: driving sixteenth palm-mutes at 160-220 bpm, gallops, harmonic-minor runs, high vocal",
2331
+ tempo: { bpm: [160, 220], typical: 185 },
2332
+ rhythm: { onsets: { kick: EIGHTHS16 } },
2333
+ pitch: {
2334
+ scales: [
2335
+ ["minor", 0.7],
2336
+ ["phrygian", 0.3],
2337
+ ],
2338
+ },
2339
+ melody: { intervals: SHRED, density: [2, 4] },
2340
+ }),
2341
+ card({
2342
+ id: "thrash",
2343
+ summary:
2344
+ "thrash: skank beat at 180-240 bpm, chromatic phrygian riffs on the low tonic pedal, tritone accents",
2345
+ tempo: { bpm: [170, 240], typical: 200 },
2346
+ rhythm: { onsets: { kick: QUARTERS16, snare: grid("..x...x...x...x.") } },
2347
+ pitch: {
2348
+ scales: [
2349
+ ["phrygian", 0.6],
2350
+ ["locrian", 0.2],
2351
+ ["minor", 0.2],
2352
+ ],
2353
+ },
2354
+ bass: { onsets: SIXTEENTHS, kickLock: 0.5 },
2355
+ }),
2356
+ card({
2357
+ id: "power-metal",
2358
+ summary:
2359
+ "power metal: double-kick sixteenths, major and harmonic-minor anthems, i-bVI-bVII and I-V-vi-IV, choir and keys",
2360
+ tempo: { bpm: [140, 200], typical: 170 },
2361
+ pitch: {
2362
+ scales: [
2363
+ ["major", 0.6],
2364
+ ["minor", 0.4],
2365
+ ],
2366
+ },
2367
+ harmony: {
2368
+ presets: [
2369
+ ["axis", 0.4],
2370
+ ["aeolian", 0.4],
2371
+ ["canon", 0.2],
2372
+ ],
2373
+ cadences: [
2374
+ ["V-I", 0.5],
2375
+ ["bVI-bVII-I", 0.5],
2376
+ ],
2377
+ },
2378
+ melody: { intervals: ANTHEM, repetition: 0.7 },
2379
+ texture: {
2380
+ roles: {
2381
+ pad: role("choir", "strings:0.6"),
2382
+ lead: role("sing", "gtr-lead:0.5"),
2383
+ counter: maybe("saw"),
2384
+ },
2385
+ },
2386
+ }),
2387
+ card({
2388
+ id: "glam-metal",
2389
+ summary:
2390
+ "glam metal: mid-tempo rock backbeat, mixolydian I-bVII-IV and axis anthems, gang-vocal choruses, shred solo",
2391
+ tempo: { bpm: [100, 145], typical: 120 },
2392
+ groove: { subdivision: 2, velocity: [1, 0.75] },
2393
+ rhythm: {
2394
+ onsets: { kick: grid("x...x.x."), snare: BACKBEAT, hat: EIGHTHS },
2395
+ },
2396
+ pitch: {
2397
+ scales: [
2398
+ ["mixolydian", 0.5],
2399
+ ["major", 0.3],
2400
+ ["minor-pentatonic", 0.2],
2401
+ ],
2402
+ },
2403
+ harmony: {
2404
+ presets: [
2405
+ ["mixolydian-rock", 0.5],
2406
+ ["axis", 0.5],
2407
+ ],
2408
+ cadences: [
2409
+ ["bVII-I", 0.5],
2410
+ ["IV-I", 0.5],
2411
+ ],
2412
+ },
2413
+ melody: { intervals: ANTHEM },
2414
+ bass: { behaviour: [["root", 1]], onsets: EIGHTHS, kickLock: 0.5 },
2415
+ texture: {
2416
+ roles: { chords: role("electric@lead"), counter: maybe("choir") },
2417
+ },
2418
+ }),
2419
+ card({
2420
+ id: "doom-metal",
2421
+ summary:
2422
+ "doom metal: very slow half-time, aeolian and phrygian riffs on the tonic and bII, sustained power chords, tritone color",
2423
+ tempo: { bpm: [50, 80], typical: 64 },
2424
+ rhythm: {
2425
+ onsets: {
2426
+ kick: grid("x.......x......."),
2427
+ snare: grid("........x......."),
2428
+ hat: QUARTERS16,
2429
+ },
2430
+ fills: { every: 4, density: [0.2, 0.4] },
2431
+ },
2432
+ harmony: { rhythm: [[0.5, 1]] },
2433
+ melody: { density: [0.5, 1] },
2434
+ bass: { onsets: grid("x.......x......."), kickLock: 0.6 },
2435
+ texture: { roles: { chords: role("electric@fuzz", "gtr-metal:0.5") } },
2436
+ }),
2437
+ card({
2438
+ id: "funeral-doom",
2439
+ summary:
2440
+ "funeral doom: glacial 30-50 bpm, sustained minor chords one per two bars, organ pad, sparse kit, dirge",
2441
+ tempo: { bpm: [30, 50], typical: 40 },
2442
+ rhythm: {
2443
+ onsets: {
2444
+ kick: grid("x..............."),
2445
+ snare: grid("........x......."),
2446
+ hat: QUARTERS16,
2447
+ },
2448
+ fills: { every: 8, density: [0.1, 0.2] },
2449
+ },
2450
+ harmony: { rhythm: [[0.5, 1]] },
2451
+ melody: { density: [0.25, 0.5] },
2452
+ bass: { onsets: grid("x..............."), kickLock: 0.6 },
2453
+ texture: { roles: { pad: role("organ", "churchorgan:0.5") } },
2454
+ mix: { space: 0.6 },
2455
+ }),
2456
+ card({
2457
+ id: "sludge",
2458
+ summary:
2459
+ "sludge: slow down-tuned fuzz, blues-scale riffs, feedback-heavy, hardcore half-time breakdowns",
2460
+ tempo: { bpm: [60, 100], typical: 76 },
2461
+ rhythm: { onsets: { kick: grid("x.....x.x......."), hat: QUARTERS16 } },
2462
+ pitch: {
2463
+ scales: [
2464
+ ["blues", 0.4],
2465
+ ["minor", 0.4],
2466
+ ["phrygian", 0.2],
2467
+ ],
2468
+ },
2469
+ bass: { onsets: grid("x.....x.x......."), kickLock: 0.6 },
2470
+ texture: { roles: { chords: role("electric@fuzz") } },
2471
+ }),
2472
+ card({
2473
+ id: "stoner-metal",
2474
+ summary:
2475
+ "stoner metal: fuzz riffs in minor pentatonic and dorian, groove-laden mid-tempo, tonic pedal, swung sixteenths",
2476
+ tempo: { bpm: [70, 115], typical: 90 },
2477
+ groove: { swingRatio: [1, 1.3] },
2478
+ rhythm: { onsets: { kick: grid("x.....x...x....."), hat: EIGHTHS16 } },
2479
+ pitch: {
2480
+ scales: [
2481
+ ["minor-pentatonic", 0.5],
2482
+ ["dorian", 0.3],
2483
+ ["blues", 0.2],
2484
+ ],
2485
+ },
2486
+ bass: { onsets: grid("x.....x...x....."), kickLock: 0.6 },
2487
+ texture: { roles: { chords: role("electric@fuzz") } },
2488
+ }),
2489
+ card({
2490
+ id: "death-metal",
2491
+ summary:
2492
+ "death metal: chromatic phrygian and locrian riffs, blast beats and double kick, tritone and bII, guttural low register",
2493
+ tempo: { bpm: [160, 240], typical: 190 },
2494
+ rhythm: {
2495
+ onsets: {
2496
+ kick: SIXTEENTHS,
2497
+ snare: grid("..x...x...x...x."),
2498
+ hat: EIGHTHS16,
2499
+ },
2500
+ },
2501
+ pitch: {
2502
+ scales: [
2503
+ ["phrygian", 0.5],
2504
+ ["locrian", 0.3],
2505
+ ["harmonic-minor", 0.2],
2506
+ ],
2507
+ },
2508
+ harmony: { voicing: { range: [33, 55] } },
2509
+ melody: { range: [45, 67] },
2510
+ }),
2511
+ card({
2512
+ id: "brutal-death",
2513
+ summary:
2514
+ "brutal and technical death metal: constant blasts, slam half-time grooves, chromatic low riffs, very low tuning",
2515
+ tempo: { bpm: [180, 260], typical: 210 },
2516
+ rhythm: {
2517
+ onsets: {
2518
+ kick: SIXTEENTHS,
2519
+ snare: grid(".x.x.x.x.x.x.x.x"),
2520
+ hat: EIGHTHS16,
2521
+ },
2522
+ },
2523
+ pitch: {
2524
+ scales: [
2525
+ ["phrygian", 0.4],
2526
+ ["locrian", 0.4],
2527
+ ["harmonic-minor", 0.2],
2528
+ ],
2529
+ },
2530
+ harmony: { voicing: { range: [30, 52] } },
2531
+ melody: { range: [40, 62], intervals: CHROMATIC },
2532
+ bass: { range: [22, 40] },
2533
+ }),
2534
+ card({
2535
+ id: "melodic-death",
2536
+ summary:
2537
+ "melodic death metal: Gothenburg harmonised twin leads in thirds, aeolian and harmonic-minor, double kick gallops",
2538
+ tempo: { bpm: [140, 200], typical: 165 },
2539
+ pitch: {
2540
+ scales: [
2541
+ ["minor", 0.5],
2542
+ ["harmonic-minor", 0.5],
2543
+ ],
2544
+ },
2545
+ melody: { intervals: ANTHEM, repetition: 0.7 },
2546
+ texture: { roles: { counter: role("gtr-lead") } },
2547
+ }),
2548
+ card({
2549
+ id: "black-metal",
2550
+ summary:
2551
+ "black metal: tremolo-picked minor chords, blast beats, aeolian and phrygian drones, cold reverb, long chord holds",
2552
+ tempo: { bpm: [160, 230], typical: 190 },
2553
+ rhythm: {
2554
+ onsets: {
2555
+ kick: SIXTEENTHS,
2556
+ snare: grid(".x.x.x.x.x.x.x.x"),
2557
+ hat: EIGHTHS16,
2558
+ },
2559
+ },
2560
+ pitch: {
2561
+ scales: [
2562
+ ["minor", 0.5],
2563
+ ["phrygian", 0.3],
2564
+ ["harmonic-minor", 0.2],
2565
+ ],
2566
+ },
2567
+ harmony: {
2568
+ rhythm: [[0.5, 1]],
2569
+ voicing: {
2570
+ types: [
2571
+ ["power", 0.6],
2572
+ ["close", 0.4],
2573
+ ],
2574
+ },
2575
+ },
2576
+ melody: { density: [3, 4], intervals: SHRED },
2577
+ texture: { roles: { pad: maybe("strings", "organ:0.5") } },
2578
+ mix: { space: 0.5 },
2579
+ }),
2580
+ card({
2581
+ id: "blackgaze",
2582
+ summary:
2583
+ "blackgaze: blast beats under major-key shoegaze wash, tremolo-picked open chords, lydian and major lift",
2584
+ tempo: { bpm: [150, 210], typical: 175 },
2585
+ rhythm: {
2586
+ onsets: {
2587
+ kick: SIXTEENTHS,
2588
+ snare: grid(".x.x.x.x.x.x.x.x"),
2589
+ hat: EIGHTHS16,
2590
+ },
2591
+ },
2592
+ pitch: {
2593
+ scales: [
2594
+ ["major", 0.5],
2595
+ ["lydian", 0.3],
2596
+ ["minor", 0.2],
2597
+ ],
2598
+ },
2599
+ harmony: {
2600
+ presets: [
2601
+ ["axis", 0.5],
2602
+ ["sad-pop", 0.5],
2603
+ ],
2604
+ cadences: [
2605
+ ["IV-I", 0.5],
2606
+ ["V-I", 0.5],
2607
+ ],
2608
+ rhythm: [[0.5, 1]],
2609
+ voicing: { types: [["open", 1]] },
2610
+ },
2611
+ texture: {
2612
+ roles: {
2613
+ chords: role("shoegaze", "gtr-metal:0.5"),
2614
+ pad: maybe("shoegaze"),
2615
+ },
2616
+ },
2617
+ mix: { space: 0.6 },
2618
+ }),
2619
+ card({
2620
+ id: "viking-metal",
2621
+ summary:
2622
+ "viking and folk metal: dorian and aeolian folk modes, 6/8 and 4/4 marches, choir chant, fiddle and whistle melody",
2623
+ tempo: { bpm: [100, 160], typical: 128 },
2624
+ meter: {
2625
+ signatures: [
2626
+ ["4/4", 0.6],
2627
+ ["6/8", 0.4],
2628
+ ],
2629
+ },
2630
+ pitch: {
2631
+ scales: [
2632
+ ["dorian", 0.5],
2633
+ ["minor", 0.5],
2634
+ ],
2635
+ },
2636
+ harmony: {
2637
+ presets: [
2638
+ ["aeolian", 0.5],
2639
+ ["dorian-vamp", 0.5],
2640
+ ],
2641
+ },
2642
+ melody: { intervals: ANTHEM },
2643
+ texture: {
2644
+ roles: {
2645
+ counter: role("fiddle", "tinwhistle:0.6", "choir:0.6"),
2646
+ pad: maybe("choir"),
2647
+ },
2648
+ },
2649
+ }),
2650
+ card({
2651
+ id: "grindcore",
2652
+ summary:
2653
+ "grindcore: relentless blast beats at 200-300 bpm, chromatic noise riffs, songs under a minute, crust breakdowns",
2654
+ tempo: { bpm: [200, 300], typical: 250 },
2655
+ rhythm: {
2656
+ onsets: {
2657
+ kick: grid("x.x.x.x.x.x.x.x."),
2658
+ snare: grid(".x.x.x.x.x.x.x.x"),
2659
+ hat: EIGHTHS16,
2660
+ },
2661
+ },
2662
+ pitch: {
2663
+ scales: [
2664
+ ["locrian", 0.4],
2665
+ ["phrygian", 0.4],
2666
+ ["minor", 0.2],
2667
+ ],
2668
+ },
2669
+ bass: { onsets: EIGHTHS16, kickLock: 0.8 },
2670
+ form: { plans: [[["intro", "verse", "breakdown", "verse"], 1]] },
2671
+ texture: { roles: { chords: role("gtr-metal", "ragged:0.5") } },
2672
+ }),
2673
+ card({
2674
+ id: "groove-metal",
2675
+ summary:
2676
+ "groove metal: syncopated mid-tempo palm-mute riffs locked to the kick, half-time feel, blues-scale bends",
2677
+ tempo: { bpm: [90, 140], typical: 112 },
2678
+ rhythm: {
2679
+ onsets: {
2680
+ kick: grid("x..x..x...x.x..."),
2681
+ snare: grid("........x......."),
2682
+ hat: EIGHTHS16,
2683
+ },
2684
+ },
2685
+ pitch: {
2686
+ scales: [
2687
+ ["minor", 0.4],
2688
+ ["blues", 0.3],
2689
+ ["phrygian", 0.3],
2690
+ ],
2691
+ },
2692
+ bass: { onsets: grid("x..x..x...x.x..."), kickLock: 0.9 },
2693
+ }),
2694
+ card({
2695
+ id: "nu-metal",
2696
+ summary:
2697
+ "nu metal and alt metal: drop-tuned syncopated chugs, hip-hop swung sixteenths, minor two-chord riffs, turntable-era loops",
2698
+ tempo: { bpm: [85, 115], typical: 100 },
2699
+ groove: { swingRatio: [1, 1.25] },
2700
+ rhythm: {
2701
+ onsets: {
2702
+ kick: grid("x..x..x...x....."),
2703
+ snare: BACKBEAT16,
2704
+ hat: EIGHTHS16,
2705
+ },
2706
+ },
2707
+ pitch: {
2708
+ scales: [
2709
+ ["minor", 0.5],
2710
+ ["phrygian", 0.5],
2711
+ ],
2712
+ },
2713
+ harmony: {
2714
+ forms: [
2715
+ [["i", "bII"], 0.5],
2716
+ [["i", "bVI"], 0.5],
2717
+ ],
2718
+ sources: { forms: 1, presets: 1 },
2719
+ },
2720
+ bass: { onsets: grid("x..x..x...x....."), kickLock: 0.9 },
2721
+ melody: { intervals: RIFF },
2722
+ }),
2723
+ card({
2724
+ id: "industrial-metal",
2725
+ summary:
2726
+ "industrial metal: drum-machine quantised four-on-the-floor, chugging riffs, synth stabs, machine-tight grid",
2727
+ tempo: { bpm: [100, 140], typical: 120 },
2728
+ groove: { humanize: { timingMs: 0, velocity: 0.02 } },
2729
+ rhythm: { onsets: { kick: QUARTERS16, snare: BACKBEAT16, hat: EIGHTHS16 } },
2730
+ bass: { onsets: EIGHTHS16, kickLock: 0.5 },
2731
+ texture: { roles: { ...MACHINE_KIT, counter: maybe("saw", "square:0.5") } },
2732
+ }),
2733
+ card({
2734
+ id: "gothic-metal",
2735
+ summary:
2736
+ "gothic and symphonic metal: orchestral strings and choir over aeolian and harmonic-minor riffs, andalusian cadence",
2737
+ tempo: { bpm: [90, 150], typical: 118 },
2738
+ pitch: {
2739
+ scales: [
2740
+ ["minor", 0.5],
2741
+ ["harmonic-minor", 0.5],
2742
+ ],
2743
+ },
2744
+ harmony: {
2745
+ presets: [
2746
+ ["andalusian", 0.5],
2747
+ ["aeolian", 0.5],
2748
+ ],
2749
+ },
2750
+ melody: { intervals: ANTHEM },
2751
+ texture: {
2752
+ roles: {
2753
+ pad: role("strings", "choir:0.7"),
2754
+ lead: role("sing", "choir:0.4"),
2755
+ },
2756
+ },
2757
+ mix: { space: 0.45 },
2758
+ }),
2759
+ card({
2760
+ id: "neo-classical-metal",
2761
+ summary:
2762
+ "neoclassical metal: harmonic-minor shred arpeggios, V-i and diminished leading-tone motion, baroque sequences",
2763
+ tempo: { bpm: [110, 150], typical: 130 },
2764
+ rhythm: { onsets: { kick: grid("x.x...x.x.x...x.") } },
2765
+ pitch: {
2766
+ scales: [
2767
+ ["harmonic-minor", 0.7],
2768
+ ["phrygian-dominant", 0.3],
2769
+ ],
2770
+ },
2771
+ harmony: {
2772
+ presets: [
2773
+ ["andalusian", 0.5],
2774
+ ["minor-ii-v", 0.5],
2775
+ ],
2776
+ cadences: [["V-I", 1]],
2777
+ },
2778
+ melody: { density: [3, 4], intervals: SHRED },
2779
+ texture: { roles: { counter: role("harpsichord", "strings:0.6") } },
2780
+ }),
2781
+ card({
2782
+ id: "prog-metal",
2783
+ summary:
2784
+ "progressive metal and djent: odd groupings over 4/4 (polymetric 3+3+3+3+4 chugs), 7/8 and 5/4, extended-range low tonic pedal",
2785
+ tempo: { bpm: [100, 160], typical: 128 },
2786
+ meter: {
2787
+ signatures: [
2788
+ ["4/4", 0.5],
2789
+ ["7/8", 0.25],
2790
+ ["5/4", 0.25],
2791
+ ],
2792
+ grouping: [
2793
+ [[2, 2, 3], 0.5],
2794
+ [[3, 2, 2], 0.5],
2795
+ ],
2796
+ },
2797
+ rhythm: {
2798
+ onsets: {
2799
+ kick: grid("x..x..x..x..x..."),
2800
+ snare: BACKBEAT16,
2801
+ hat: EIGHTHS16,
2802
+ },
2803
+ },
2804
+ bass: { onsets: grid("x..x..x..x..x..."), kickLock: 0.9 },
2805
+ harmony: { sevenths: 0.2 },
2806
+ texture: { roles: { pad: maybe("strings", "saw:0.5") } },
2807
+ }),
2808
+ card({
2809
+ id: "metalcore",
2810
+ summary:
2811
+ "metalcore: melodic-death riffs plus hardcore breakdowns in half time, sung chorus on axis loops, double kick",
2812
+ tempo: { bpm: [130, 190], typical: 155 },
2813
+ rhythm: { onsets: { kick: grid("xxxx..x.xxxx..x.") } },
2814
+ bass: { onsets: grid("x..x..x.x..x..x.") },
2815
+ pitch: {
2816
+ scales: [
2817
+ ["minor", 0.8],
2818
+ ["phrygian", 0.2],
2819
+ ],
2820
+ },
2821
+ harmony: {
2822
+ presets: [
2823
+ ["aeolian", 0.5],
2824
+ ["sad-pop", 0.5],
2825
+ ],
2826
+ },
2827
+ form: {
2828
+ plans: [
2829
+ [
2830
+ [
2831
+ "intro",
2832
+ "verse",
2833
+ "chorus",
2834
+ "verse",
2835
+ "chorus",
2836
+ "breakdown",
2837
+ "chorus",
2838
+ ],
2839
+ 1,
2840
+ ],
2841
+ ],
2842
+ energy: { breakdown: 0.85 },
2843
+ },
2844
+ melody: { intervals: ANTHEM },
2845
+ }),
2846
+ card({
2847
+ id: "deathcore",
2848
+ summary:
2849
+ "deathcore: death-metal blasts and half-time breakdowns on a very low tonic pedal, chromatic phrygian chugs",
2850
+ tempo: { bpm: [120, 200], typical: 150 },
2851
+ rhythm: {
2852
+ onsets: {
2853
+ kick: grid("x..x..x.x..x..x."),
2854
+ snare: grid("........x......."),
2855
+ hat: QUARTERS16,
2856
+ },
2857
+ },
2858
+ pitch: {
2859
+ scales: [
2860
+ ["phrygian", 0.6],
2861
+ ["locrian", 0.2],
2862
+ ["harmonic-minor", 0.2],
2863
+ ],
2864
+ },
2865
+ harmony: { voicing: { range: [30, 52] } },
2866
+ bass: { onsets: grid("x..x..x.x..x..x."), kickLock: 0.9, range: [22, 40] },
2867
+ melody: { range: [45, 67] },
2868
+ form: {
2869
+ plans: [
2870
+ [["intro", "verse", "breakdown", "verse", "breakdown", "outro"], 1],
2871
+ ],
2872
+ energy: { breakdown: 0.9 },
2873
+ },
2874
+ }),
2875
+ card({
2876
+ id: "mathcore",
2877
+ summary:
2878
+ "mathcore: jagged odd meters (7/8, 5/8, 9/8), stop-start dissonant chromatic riffs, abrupt tempo-feel shifts",
2879
+ tempo: { bpm: [130, 200], typical: 160 },
2880
+ meter: {
2881
+ signatures: [
2882
+ ["7/8", 0.35],
2883
+ ["5/8", 0.25],
2884
+ ["9/8", 0.2],
2885
+ ["4/4", 0.2],
2886
+ ],
2887
+ grouping: [
2888
+ [[2, 2, 3], 0.4],
2889
+ [[3, 2], 0.2],
2890
+ [[2, 3, 2, 2], 0.4],
2891
+ ],
2892
+ },
2893
+ pitch: {
2894
+ scales: [
2895
+ ["locrian", 0.4],
2896
+ ["phrygian", 0.4],
2897
+ ["minor", 0.2],
2898
+ ],
2899
+ },
2900
+ rhythm: {
2901
+ onsets: {
2902
+ kick: grid("x..x.x..x.x..x.."),
2903
+ snare: grid("...x....x..x...x"),
2904
+ hat: EIGHTHS16,
2905
+ },
2906
+ },
2907
+ bass: { onsets: grid("x..x.x..x.x..x.."), kickLock: 0.9 },
2908
+ melody: { intervals: intervals(0.9, 0.7, 0.9, 0.3) },
2909
+ }),
2910
+ card({
2911
+ id: "post-metal",
2912
+ summary:
2913
+ "post-metal: slow crescendo forms, sludge riffs alternating with clean ambient passages, layered drones",
2914
+ tempo: { bpm: [60, 110], typical: 84 },
2915
+ meter: { hypermeter: [[8, 1]] },
2916
+ rhythm: {
2917
+ onsets: {
2918
+ kick: grid("x.......x.x....."),
2919
+ snare: grid("........x......."),
2920
+ hat: EIGHTHS16,
2921
+ },
2922
+ },
2923
+ harmony: { rhythm: [[0.5, 1]] },
2924
+ melody: { density: [0.5, 1] },
2925
+ bass: { onsets: grid("x.......x.x....."), kickLock: 0.6 },
2926
+ form: {
2927
+ plans: [
2928
+ [["intro", "build", "drop", "breakdown", "build", "drop", "outro"], 1],
2929
+ ],
2930
+ energy: { intro: 0.2, build: 0.55, drop: 1, breakdown: 0.25 },
2931
+ archetype: "crescendo",
2932
+ },
2933
+ texture: { roles: { pad: role("shoegaze", "strings:0.5") } },
2934
+ mix: { space: 0.55 },
2935
+ }),
2936
+ card({
2937
+ id: "drone-metal",
2938
+ summary:
2939
+ "drone metal: one sustained power chord over tonic drone, beatless or near-beatless, extreme length and volume",
2940
+ tempo: { bpm: [30, 60], typical: 42 },
2941
+ rhythm: {
2942
+ onsets: {
2943
+ kick: grid("x..............."),
2944
+ snare: grid("................"),
2945
+ hat: grid("................"),
2946
+ },
2947
+ fills: { every: 16, density: [0, 0.05] },
2948
+ },
2949
+ harmony: { model: "drone", rhythm: [[0.25, 1]] },
2950
+ melody: { density: [0.25, 0.5] },
2951
+ bass: {
2952
+ behaviour: [["pedal", 1]],
2953
+ onsets: grid("x..............."),
2954
+ kickLock: 0,
2955
+ },
2956
+ texture: {
2957
+ roles: {
2958
+ snare: null,
2959
+ hat: null,
2960
+ drone: role("organ", "electric@fuzz:0.6"),
2961
+ chords: role("electric@fuzz"),
2962
+ lead: maybe("ebow", "electric@fuzz:0.5"),
2963
+ },
2964
+ },
2965
+ mix: { space: 0.6 },
2966
+ }),
2967
+ card({
2968
+ id: "nintendocore",
2969
+ summary:
2970
+ "nintendocore: square and triangle chiptune leads over metalcore riffs, major and minor arpeggio runs, blast and breakdown",
2971
+ tempo: { bpm: [150, 210], typical: 175 },
2972
+ pitch: {
2973
+ scales: [
2974
+ ["minor", 0.5],
2975
+ ["major", 0.5],
2976
+ ],
2977
+ },
2978
+ harmony: {
2979
+ presets: [
2980
+ ["axis", 0.4],
2981
+ ["aeolian", 0.4],
2982
+ ["sad-pop", 0.2],
2983
+ ],
2984
+ },
2985
+ melody: { density: [2, 4], intervals: SHRED },
2986
+ texture: {
2987
+ roles: {
2988
+ lead: role("square", "triangle:0.5"),
2989
+ arp: maybe("square"),
2990
+ },
2991
+ },
2992
+ }),
2993
+ ]);