dj-claude 0.1.16 → 0.1.17

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.
@@ -22,7 +22,7 @@ export function getPageHtml(wsPort) {
22
22
  <head>
23
23
  <meta charset="UTF-8">
24
24
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
25
- <title>DJ Claude | v 0.1.16</title>
25
+ <title>DJ Claude | v 0.1.17</title>
26
26
  <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔈</text></svg>">
27
27
  <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
28
28
  <style>
@@ -111,7 +111,7 @@ export function getPageHtml(wsPort) {
111
111
  <!-- Welcome box -->
112
112
  <div class="ascii-box">
113
113
  <pre>╔═════════════════════════════════════════════╗</pre>
114
- <div style="display:flex"><pre>║</pre><pre style="flex:1;text-align:center">Welcome to DJ Claude <span class="dim">v 0.1.16</span></pre><pre>║</pre></div>
114
+ <div style="display:flex"><pre>║</pre><pre style="flex:1;text-align:center">Welcome to DJ Claude <span class="dim">v 0.1.17</span></pre><pre>║</pre></div>
115
115
  <pre>╚═════════════════════════════════════════════╝</pre>
116
116
  </div>
117
117
 
@@ -27,6 +27,6 @@ export function Header({ isPlaying, isStreaming, audioInitialized }) {
27
27
  statusSymbol = '●';
28
28
  statusLabel = 'Playing';
29
29
  }
30
- return (_jsxs(Box, { flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "#E8704E", children: WELCOME_TOP }), _jsxs(Text, { color: "#E8704E", children: ['║ Welcome to DJ Claude ', _jsx(Text, { dimColor: true, children: "v 0.1.16" }), ' ║'] }), _jsx(Text, { color: "#E8704E", children: WELCOME_BTM }), _jsx(Text, { color: "#E8704E", children: BANNER }), _jsx(Text, { color: "#E8704E", dimColor: dim, children: `╔═════════════════════════╗\n║ ${statusSymbol} ${statusLabel.padEnd(14)} ║\n╚═════════════════════════╝` })] }));
30
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "#E8704E", children: WELCOME_TOP }), _jsxs(Text, { color: "#E8704E", children: ['║ Welcome to DJ Claude ', _jsx(Text, { dimColor: true, children: "v 0.1.17" }), ' ║'] }), _jsx(Text, { color: "#E8704E", children: WELCOME_BTM }), _jsx(Text, { color: "#E8704E", children: BANNER }), _jsx(Text, { color: "#E8704E", dimColor: dim, children: `╔═════════════════════════╗\n║ ${statusSymbol} ${statusLabel.padEnd(14)} ║\n╚═════════════════════════╝` })] }));
31
31
  }
32
32
  //# sourceMappingURL=Header.js.map
@@ -14,7 +14,7 @@ export function getApiKey() {
14
14
  if (!key) {
15
15
  console.error('\n' +
16
16
  ' \x1b[1m╔════════════════════════════════════════════════════╗\n' +
17
- ' ║ DJ Claude \x1b[0mv 0.1.16\x1b[1m — Live coding music for Agents ║\n' +
17
+ ' ║ DJ Claude \x1b[0mv 0.1.17\x1b[1m — Live coding music for Agents ║\n' +
18
18
  ' ╚════════════════════════════════════════════════════╝\x1b[0m\n' +
19
19
  '\n' +
20
20
  ' \x1b[1m─── About ─────────────────────────────────────────────\x1b[0m\n' +
@@ -0,0 +1,11 @@
1
+ export interface Preset {
2
+ name: string;
3
+ category: 'mood' | 'genre' | 'activity';
4
+ description: string;
5
+ code: string;
6
+ }
7
+ export declare const PRESETS: Preset[];
8
+ export declare const PRESET_MAP: Map<string, Preset>;
9
+ export declare const PRESET_NAMES: string[];
10
+ export declare function getPresetsByCategory(category?: Preset['category']): Preset[];
11
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/lib/presets.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,OAAO,EAAE,MAAM,EAgmB3B,CAAC;AAEF,eAAO,MAAM,UAAU,qBAA2C,CAAC;AACnE,eAAO,MAAM,YAAY,UAA6B,CAAC;AAEvD,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAG5E"}
@@ -0,0 +1,619 @@
1
+ // Curated preset pattern library — moods, genres, and activities.
2
+ // All presets use .cpm() (cycles per minute) with the convention that
3
+ // 2 beats per cycle is the norm. cpm * 2 = approximate BPM.
4
+ // Patterns use ~4 events per cycle (eighth-note resolution).
5
+ export const PRESETS = [
6
+ // -------------------------------------------------------------------------
7
+ // Moods — rich, layered, with modulation and movement
8
+ // -------------------------------------------------------------------------
9
+ {
10
+ name: 'chill',
11
+ category: 'mood',
12
+ description: 'Relaxing lo-fi vibes — soft pads, gentle rhythms, mellow atmosphere.',
13
+ code: `stack(
14
+ note("<[db3,f3,ab3,c4] [ab2,c3,eb3,gb3] [gb2,bb2,db3,f3] [ab2,c3,eb3,ab3]>/2")
15
+ .s("triangle")
16
+ .lpf(sine.range(400, 1200).slow(8))
17
+ .room(0.7).size(0.9)
18
+ .gain(0.3),
19
+ note("<db2 ab1 gb2 ab2>/2")
20
+ .s("sawtooth")
21
+ .lpf(250)
22
+ .gain(0.5),
23
+ note("<ab4 ~ [f4 gb4] ~> <~ db5 ~ [c5 bb4]>/4")
24
+ .s("sine")
25
+ .gain(0.12)
26
+ .delay(0.5).delaytime(0.375).delayfeedback(0.5)
27
+ .pan(sine.slow(5)),
28
+ s("bd ~ [~ bd] ~")
29
+ .gain(0.6)
30
+ .lpf(800),
31
+ s("~ ~ sd? ~")
32
+ .gain(0.25)
33
+ .room(0.5),
34
+ s("[~ hh]*2")
35
+ .gain(sine.range(0.08, 0.22).slow(4))
36
+ .lpf(3000)
37
+ .pan(sine.slow(3)),
38
+ s("rim(3,8)")
39
+ .gain(0.08)
40
+ .pan(0.7)
41
+ .delay(0.3).delayfeedback(0.4)
42
+ ).cpm(52)`,
43
+ },
44
+ {
45
+ name: 'dark',
46
+ category: 'mood',
47
+ description: 'Moody and brooding — minor keys, heavy bass, atmospheric textures.',
48
+ code: `stack(
49
+ note("<c1 c1 [c1 db1] c1>/2")
50
+ .s("sine")
51
+ .fmh(2).fmi(sine.range(1, 5).slow(4))
52
+ .lpf(sine.range(80, 400).slow(8))
53
+ .gain(0.65),
54
+ note("<[c3,eb3,gb3] [c3,eb3,gb3] [db3,f3,ab3] [bb2,db3,e3]>/2")
55
+ .s("sawtooth")
56
+ .lpf(600)
57
+ .attack(0.01).decay(0.3).sustain(0.1).release(0.4)
58
+ .room(0.8).size(0.95)
59
+ .gain(0.22),
60
+ note("<c4 ~ eb4 ~> <~ db4 ~ bb3>/4")
61
+ .s("sine")
62
+ .fmh(3).fmi(1.5)
63
+ .gain(0.12)
64
+ .delay(0.5).delaytime(0.333).delayfeedback(0.6)
65
+ .pan(sine.slow(5)),
66
+ s("bd ~ bd ~")
67
+ .gain(0.8),
68
+ s("~ ~ [~ cp] ~")
69
+ .gain(0.45)
70
+ .room(0.4)
71
+ .every(4, x => x.fast(2)),
72
+ s("hh*4")
73
+ .gain("<0.2 0.25 0.3 0.25>")
74
+ .lpf(2500)
75
+ .pan(sine.fast(2)),
76
+ s("cb(5,8)")
77
+ .gain(0.12)
78
+ .lpf(sine.range(800, 3000).slow(8))
79
+ .resonance(0.3)
80
+ ).cpm(67).hpf(30)`,
81
+ },
82
+ {
83
+ name: 'hype',
84
+ category: 'mood',
85
+ description: 'High energy — driving beats, punchy bass, adrenaline-pumping.',
86
+ code: `stack(
87
+ s("bd ~ bd ~")
88
+ .gain(0.8),
89
+ s("~ ~ sd ~")
90
+ .gain(0.6)
91
+ .room(0.15)
92
+ .every(4, x => x.fast(2)),
93
+ s("hh*8")
94
+ .gain(saw.range(0.15, 0.35).slow(2))
95
+ .lpf(5000),
96
+ s("~ cp ~ cp")
97
+ .gain(0.5),
98
+ note("<c2 c2 eb2 c2> <f2 c2 eb2 g2>/2")
99
+ .s("sawtooth")
100
+ .lpf(sine.range(400, 1800).slow(4))
101
+ .gain(0.55),
102
+ note("<[c3,eb3,g3] [f3,ab3,c4]>/2")
103
+ .s("square")
104
+ .lpf(2500)
105
+ .attack(0.005).decay(0.12).sustain(0.05).release(0.1)
106
+ .gain(0.3)
107
+ .superimpose(x => x.add(12).gain(0.15)),
108
+ note("<g4 ~ [eb4 f4] g4> <c5 bb4 ~ ab4>/4")
109
+ .s("square")
110
+ .lpf(3000)
111
+ .gain(0.18)
112
+ .delay(0.2).delaytime(0.125)
113
+ ).cpm(70)`,
114
+ },
115
+ {
116
+ name: 'focus',
117
+ category: 'mood',
118
+ description: 'Deep focus — minimal, repetitive, non-distracting ambient pulse.',
119
+ code: `stack(
120
+ note("<[c4,e4,g4,b4] [a3,c4,e4,g4] [f3,a3,c4,e4] [g3,b3,d4,f4]>/4")
121
+ .s("sine")
122
+ .lpf(sine.range(500, 1800).slow(16))
123
+ .room(0.8).size(0.95)
124
+ .gain(0.2),
125
+ note("<c2 a1 f1 g1>/4")
126
+ .s("sine")
127
+ .gain(0.2),
128
+ note("e5(3,8)")
129
+ .s("triangle")
130
+ .gain(0.05)
131
+ .delay(0.6).delayfeedback(0.6).delaytime(0.5)
132
+ .pan(sine.slow(7))
133
+ .room(0.8),
134
+ note("<g5 ~ ~ ~>/4")
135
+ .s("sine")
136
+ .gain(0.03)
137
+ .room(0.9).size(0.99)
138
+ .pan(perlin.range(0.2, 0.8)),
139
+ s("bd ~ ~ ~")
140
+ .gain(0.35)
141
+ .lpf(600)
142
+ .room(0.3)
143
+ ).cpm(48)`,
144
+ },
145
+ {
146
+ name: 'funky',
147
+ category: 'mood',
148
+ description: 'Groovy — syncopated rhythms, bouncy basslines, playful melodies.',
149
+ code: `stack(
150
+ n("0 ~ 0 ~ ~ 3 ~ 5")
151
+ .scale("D:dorian")
152
+ .s("sawtooth")
153
+ .lpf(900)
154
+ .gain(0.55),
155
+ n("<[0,2,4,6] ~ [3,5,7,9] [~ [4,6,8,10]]>/2")
156
+ .scale("D:dorian")
157
+ .s("square")
158
+ .lpf(1800)
159
+ .attack(0.005).decay(0.15).sustain(0.05).release(0.1)
160
+ .gain(0.28)
161
+ .room(0.2)
162
+ .superimpose(x => x.add(12).gain(0.15)),
163
+ n("<7 ~ 9 [8 7]> <~ 4 ~ 5>/4")
164
+ .scale("D:dorian")
165
+ .s("square")
166
+ .lpf(2500)
167
+ .gain(0.18)
168
+ .delay(0.2).delaytime(0.125),
169
+ s("bd ~ [bd ~] [~ bd]")
170
+ .gain(0.75),
171
+ s("~ sd ~ [sd ~ sd?]")
172
+ .gain(0.55)
173
+ .room(0.15),
174
+ s("[~ hh]*2")
175
+ .gain(0.3)
176
+ .lpf(4000),
177
+ s("cb(5,8)")
178
+ .gain(perlin.range(0.05, 0.18))
179
+ .pan(sine.slow(2))
180
+ .every(3, x => x.rev())
181
+ ).swing(0.6).cpm(62).hpf(40)`,
182
+ },
183
+ {
184
+ name: 'dreamy',
185
+ category: 'mood',
186
+ description: 'Ethereal and otherworldly — lush reverb, floating pads, gentle arpeggios.',
187
+ code: `stack(
188
+ note("<[f3,a3,c4,e4] [c3,e3,g3,b3] [a2,c3,e3,g3] [d3,f3,a3,c4]>/4")
189
+ .s("triangle")
190
+ .lpf(sine.range(500, 2000).slow(16))
191
+ .room(0.9).size(0.98)
192
+ .gain(0.25),
193
+ note("<f2 c2 a1 d2>/4")
194
+ .s("sine")
195
+ .gain(0.3),
196
+ note("[f3,a3,c4,e4]")
197
+ .arp("up")
198
+ .s("sine")
199
+ .lpf(2000)
200
+ .gain(0.1)
201
+ .delay(0.6).delaytime(0.5).delayfeedback(0.65)
202
+ .pan(sine.slow(7)),
203
+ note("c6(3,8)")
204
+ .s("triangle")
205
+ .gain(0.04)
206
+ .delay(0.7).delaytime(0.666).delayfeedback(0.5)
207
+ .pan(perlin.range(0, 1))
208
+ .room(0.9),
209
+ s("~ ~ hh? ~")
210
+ .gain(0.08)
211
+ .lpf(2000)
212
+ .delay(0.5).delayfeedback(0.4)
213
+ .room(0.6),
214
+ s("bd/2")
215
+ .gain(0.4)
216
+ .room(0.5)
217
+ .lpf(400)
218
+ ).cpm(45)`,
219
+ },
220
+ {
221
+ name: 'weird',
222
+ category: 'mood',
223
+ description: 'Experimental and glitchy — unusual sounds, unpredictable rhythms.',
224
+ code: `stack(
225
+ note("<c2 f#2 bb1 e2>/2")
226
+ .s("sine")
227
+ .fmh(3).fmi(sine.range(0.5, 6).slow(5))
228
+ .lpf(sine.range(100, 500).slow(7))
229
+ .gain(0.55),
230
+ note("<[c3,f#3,bb3] [e3,bb3,d4] [ab2,d3,g3] [f#3,c4,e4]>/2")
231
+ .s("square")
232
+ .lpf(sine.range(800, 3000).slow(6))
233
+ .vowel("<a e i o>")
234
+ .resonance(0.4)
235
+ .gain(0.2)
236
+ .jux(x => x.rev()),
237
+ note("<c4 f#4 ~ bb4> <~ e4 ab4 ~>/2")
238
+ .s("sine")
239
+ .fmh(5).fmi(2)
240
+ .gain(0.15)
241
+ .sometimes(x => x.speed(1.5))
242
+ .delay(0.4).delayfeedback(0.6),
243
+ s("bd(3,8)")
244
+ .gain(0.65)
245
+ .sometimes(x => x.speed(0.8)),
246
+ s("sd(5,8)?")
247
+ .gain(0.35)
248
+ .room(0.4)
249
+ .pan(rand),
250
+ s("hh(7,16)")
251
+ .gain(perlin.range(0.05, 0.25))
252
+ .pan(sine.fast(3))
253
+ .lpf(sine.range(1000, 5000).slow(3)),
254
+ s("rim(5,12)")
255
+ .gain(0.1)
256
+ .delay(0.5).delayfeedback(0.7)
257
+ .jux(x => x.fast(1.5))
258
+ .degradeBy(0.3)
259
+ ).cpm(58)`,
260
+ },
261
+ {
262
+ name: 'epic',
263
+ category: 'mood',
264
+ description: 'Cinematic and powerful — big builds, soaring melodies, legendary feel.',
265
+ code: `stack(
266
+ note("<bb1 bb1 gb1 ab1>/2")
267
+ .s("sawtooth")
268
+ .lpf(sine.range(100, 500).slow(8))
269
+ .gain(0.6),
270
+ note("<[bb2,d3,f3] [bb2,d3,f3] [gb2,bb2,db3] [ab2,c3,eb3]>/2")
271
+ .s("sawtooth")
272
+ .lpf(sine.range(600, 2500).slow(16))
273
+ .room(0.7).size(0.9)
274
+ .gain(0.3)
275
+ .superimpose(x => x.add(12).gain(0.15)),
276
+ note("<f4 ~ [d4 eb4] f4> <bb4 ab4 ~ gb4>/4")
277
+ .s("square")
278
+ .lpf(3000)
279
+ .gain(0.2)
280
+ .phaser(0.3)
281
+ .delay(0.3).delaytime(0.25),
282
+ s("bd ~ bd ~")
283
+ .gain(0.8),
284
+ s("~ ~ sd ~")
285
+ .gain(0.6)
286
+ .room(0.4).size(0.7),
287
+ s("hh*4")
288
+ .gain(sine.range(0.12, 0.3).slow(8))
289
+ .lpf(4000),
290
+ s("~ ~ ~ cp")
291
+ .gain(0.4)
292
+ .room(0.5)
293
+ .every(4, x => x.fast(2)),
294
+ s("cr/4")
295
+ .gain(0.1)
296
+ .room(0.9).size(0.99)
297
+ .speed(0.5)
298
+ ).cpm(64).jux(x => x.rev()).hpf(30)`,
299
+ },
300
+ // -------------------------------------------------------------------------
301
+ // Genres
302
+ // -------------------------------------------------------------------------
303
+ {
304
+ name: 'jazz',
305
+ category: 'genre',
306
+ description: 'Smooth jazz combo — extended chords, walking bass, brushed drums.',
307
+ code: `stack(
308
+ note("<[c3,e3,g3,bb3] [f3,a3,c4,eb4] [bb2,d3,f3,a3] [eb3,g3,bb3,d4]>/2")
309
+ .s("triangle").lpf(1800).gain(0.3).room(0.5),
310
+ note("<c2 f2 bb1 eb2>/2")
311
+ .s("sawtooth").lpf(400).gain(0.45),
312
+ note("<g4 ~ [e4 f4] ~> <~ bb4 ~ [a4 g4]>/4")
313
+ .s("sine").gain(0.12)
314
+ .delay(0.4).delaytime(0.375).delayfeedback(0.4)
315
+ .pan(sine.slow(5)),
316
+ s("bd ~ [~ bd] ~")
317
+ .gain(0.5),
318
+ s("~ ~ sd? ~")
319
+ .gain(0.3).room(0.4),
320
+ s("hh hh [~ hh] hh")
321
+ .gain(0.2).lpf(3500)
322
+ .degradeBy(0.15),
323
+ s("rim(3,8)")
324
+ .gain(0.1).pan(0.7)
325
+ .delay(0.2).delayfeedback(0.3)
326
+ ).cpm(55)`,
327
+ },
328
+ {
329
+ name: 'house',
330
+ category: 'genre',
331
+ description: 'Classic house — four-on-the-floor, off-beat hats, filtered chords.',
332
+ code: `stack(
333
+ s("bd ~ bd ~")
334
+ .gain(0.75),
335
+ s("~ ~ cp ~")
336
+ .gain(0.45).room(0.3),
337
+ s("~ hh ~ hh")
338
+ .gain(0.25).lpf(4500),
339
+ s("oh/2")
340
+ .gain(0.12).lpf(3000),
341
+ note("<[c3,eb3,g3] ~ [ab2,c3,eb3] ~>/2")
342
+ .s("sawtooth")
343
+ .lpf(sine.range(600, 2000).slow(8))
344
+ .gain(0.3),
345
+ note("c2 ~ ~ [c2 ~]")
346
+ .s("sawtooth").lpf(300).gain(0.5)
347
+ ).cpm(62)`,
348
+ },
349
+ {
350
+ name: 'techno',
351
+ category: 'genre',
352
+ description: 'Driving techno — industrial percussion, heavy filter automation.',
353
+ code: `stack(
354
+ s("bd ~ bd ~")
355
+ .gain(0.8),
356
+ s("~ ~ sd [~ sd]")
357
+ .gain(0.4).room(0.2),
358
+ s("hh*4")
359
+ .gain(sine.range(0.15, 0.3).slow(4))
360
+ .lpf(3000),
361
+ s("cb(5,8)")
362
+ .gain(0.15)
363
+ .lpf(sine.range(800, 4000).slow(8))
364
+ .resonance(0.3),
365
+ note("c1 ~ c1 ~")
366
+ .s("sawtooth")
367
+ .lpf(sine.range(100, 600).slow(16))
368
+ .gain(0.55),
369
+ s("oh/4")
370
+ .gain(0.12).room(0.5)
371
+ .delay(0.3).delayfeedback(0.3)
372
+ ).cpm(68)`,
373
+ },
374
+ {
375
+ name: 'ambient',
376
+ category: 'genre',
377
+ description: 'Atmospheric ambient — floating pads, deep reverb, slow evolution.',
378
+ code: `stack(
379
+ note("<[c4,e4,g4,b4] [a3,c4,e4,g4] [f3,a3,c4,e4] [g3,b3,d4,f4]>/4")
380
+ .s("sine").room(0.9).size(0.95).gain(0.2)
381
+ .lpf(sine.range(500, 2000).slow(16)),
382
+ note("<c2 a1 f1 g1>/4")
383
+ .s("sine").gain(0.25),
384
+ note("e5(3,8)")
385
+ .s("triangle").gain(0.06)
386
+ .delay(0.6).delayfeedback(0.6)
387
+ .pan(sine.slow(7)).room(0.8),
388
+ note("<g5 ~ ~ b5>/4")
389
+ .s("sine").gain(0.03)
390
+ .room(0.9).size(0.99)
391
+ .pan(perlin.range(0.2, 0.8)),
392
+ s("bd/2")
393
+ .gain(0.3).lpf(400).room(0.5)
394
+ ).slow(2).cpm(50)`,
395
+ },
396
+ {
397
+ name: 'dnb',
398
+ category: 'genre',
399
+ description: 'Drum and bass — fast breakbeats, deep sub bass, complex rhythms.',
400
+ code: `stack(
401
+ s("bd ~ [~ bd] ~")
402
+ .gain(0.7),
403
+ s("~ ~ sd ~")
404
+ .gain(0.55).room(0.3),
405
+ s("[hh [~ hh]]*2")
406
+ .gain(0.25).lpf(5000),
407
+ s("~ cp ~ ~")
408
+ .gain(0.4).room(0.3),
409
+ note("c1 ~ ~ c1")
410
+ .s("sine").gain(0.6).lpf(200),
411
+ note("<c4 ~ eb4 ~> <~ g4 ~ f4>/2")
412
+ .s("square").lpf(2500).gain(0.15)
413
+ .delay(0.3).delayfeedback(0.3)
414
+ ).cpm(88)`,
415
+ },
416
+ {
417
+ name: 'lo-fi',
418
+ category: 'genre',
419
+ description: 'Lo-fi hip-hop — muffled warmth, jazzy chords, tape-style beats.',
420
+ code: `stack(
421
+ note("<[c3,eb3,g3,bb3] [f3,ab3,c4,eb4] [ab2,c3,eb3,g3] [bb2,d3,f3,ab3]>/2")
422
+ .s("triangle").lpf(700).gain(0.3).room(0.5),
423
+ note("<c2 f2 ab1 bb1>/2")
424
+ .s("sawtooth").lpf(250).gain(0.4),
425
+ note("<eb4 ~ [c4 d4] ~> <~ g4 ~ f4>/4")
426
+ .s("sine").gain(0.1)
427
+ .delay(0.4).delayfeedback(0.5)
428
+ .lpf(1200).pan(sine.slow(5)),
429
+ s("bd ~ [~ bd] sd")
430
+ .gain(0.5).lpf(800),
431
+ s("[~ hh]*2")
432
+ .gain(0.15).lpf(2000),
433
+ s("~ ~ rim ~")
434
+ .gain(0.08).room(0.4)
435
+ .delay(0.3).delayfeedback(0.3)
436
+ ).cpm(52)`,
437
+ },
438
+ {
439
+ name: 'trap',
440
+ category: 'genre',
441
+ description: 'Trap beats — 808 bass, rolling hi-hats, half-time groove.',
442
+ code: `stack(
443
+ note("c1 ~ ~ ~")
444
+ .s("sawtooth").lpf(180).gain(0.6),
445
+ s("bd ~ ~ ~ [~ bd] ~ ~ ~")
446
+ .gain(0.7),
447
+ s("~ ~ ~ ~ sd ~ ~ ~")
448
+ .gain(0.55).room(0.3),
449
+ s("hh*8")
450
+ .gain(sine.range(0.1, 0.35).slow(2))
451
+ .lpf(4000),
452
+ s("~ ~ oh ~ ~ ~ ~ oh")
453
+ .gain(0.15).lpf(3000),
454
+ note("<[c3,eb3,g3] ~ ~ ~>/2")
455
+ .s("square").lpf(1500).gain(0.15)
456
+ .room(0.4)
457
+ ).cpm(70)`,
458
+ },
459
+ {
460
+ name: 'disco',
461
+ category: 'genre',
462
+ description: 'Disco groove — syncopated bass, open hats on off-beats, chord stabs.',
463
+ code: `stack(
464
+ s("bd ~ bd ~")
465
+ .gain(0.7),
466
+ s("~ oh ~ oh")
467
+ .gain(0.25).lpf(4000),
468
+ s("~ ~ cp ~")
469
+ .gain(0.45),
470
+ note("c3 ~ [c3 eb3] ~ f3 ~ [eb3 c3] ~")
471
+ .s("sawtooth").lpf(1500).gain(0.4),
472
+ note("<[c4,eb4,g4] ~ [f4,ab4,c5] ~>/2")
473
+ .s("square").lpf(2500).gain(0.2)
474
+ .attack(0.005).decay(0.15).sustain(0.05).release(0.1),
475
+ s("rim(3,8)")
476
+ .gain(0.1).pan(sine.slow(3))
477
+ ).cpm(60)`,
478
+ },
479
+ {
480
+ name: 'synthwave',
481
+ category: 'genre',
482
+ description: 'Retro synthwave — saw pads, arpeggiated sequences, 80s vibes.',
483
+ code: `stack(
484
+ note("<[c3,eb3,g3] [ab2,c3,eb3] [f2,ab2,c3] [g2,bb2,d3]>/2")
485
+ .s("sawtooth")
486
+ .lpf(sine.range(400, 1800).slow(8))
487
+ .gain(0.3).room(0.6).phaser(0.4),
488
+ note("[c4,eb4,g4,bb4]")
489
+ .arp("up").s("square")
490
+ .lpf(2000).gain(0.15)
491
+ .delay(0.3).delayfeedback(0.4),
492
+ note("<c2 ab1 f1 g1>/2")
493
+ .s("sawtooth").lpf(300).gain(0.45),
494
+ s("bd ~ bd ~")
495
+ .gain(0.6),
496
+ s("~ ~ sd ~")
497
+ .gain(0.4).room(0.3),
498
+ s("[~ hh]*2")
499
+ .gain(0.2).lpf(3500)
500
+ ).cpm(57)`,
501
+ },
502
+ {
503
+ name: 'breakbeat',
504
+ category: 'genre',
505
+ description: 'Breakbeat — syncopated drums, chopped breaks, heavy bass.',
506
+ code: `stack(
507
+ s("bd ~ [bd ~] [~ bd]")
508
+ .gain(0.7),
509
+ s("~ ~ sd [~ sd]")
510
+ .gain(0.55).room(0.2),
511
+ s("[hh [~ hh]] hh [hh [hh oh]] [hh ~]")
512
+ .gain(0.25).lpf(4500),
513
+ s("cp(3,8)")
514
+ .gain(0.3).room(0.3)
515
+ .every(4, x => x.fast(2)),
516
+ note("c2 ~ eb2 ~")
517
+ .s("sawtooth").lpf(500).gain(0.5),
518
+ note("<c4 eb4 ~ f4> <~ g4 bb4 ~>/2")
519
+ .s("square").lpf(2000).gain(0.2)
520
+ .delay(0.25).delayfeedback(0.3)
521
+ ).cpm(65)`,
522
+ },
523
+ // -------------------------------------------------------------------------
524
+ // Activities
525
+ // -------------------------------------------------------------------------
526
+ {
527
+ name: 'coding',
528
+ category: 'activity',
529
+ description: 'Music for coding — focused, minimal, non-distracting ambient pulse.',
530
+ code: `stack(
531
+ note("<[c4,e4,g4,b4] [a3,c4,e4,g4]>/4")
532
+ .s("triangle")
533
+ .lpf(sine.range(600, 1400).slow(16))
534
+ .gain(0.15).room(0.7)
535
+ .delay(0.4).delayfeedback(0.4),
536
+ note("<c2 ~ a1 ~>/4")
537
+ .s("sine").gain(0.2),
538
+ note("g5(3,8)")
539
+ .s("sine").gain(0.04)
540
+ .delay(0.5).delayfeedback(0.5)
541
+ .pan(sine.slow(5)).room(0.8),
542
+ s("~ ~ hh ~")
543
+ .gain(0.08).lpf(2000)
544
+ .delay(0.5).delayfeedback(0.3),
545
+ s("bd ~ ~ ~")
546
+ .gain(0.35).lpf(600)
547
+ ).cpm(48)`,
548
+ },
549
+ {
550
+ name: 'studying',
551
+ category: 'activity',
552
+ description: 'Study music — calm lo-fi with gentle movement, keeps focus without distraction.',
553
+ code: `stack(
554
+ note("<[c3,eb3,g3,bb3] [f3,ab3,c4] [ab2,c3,eb3] [bb2,d3,f3]>/2")
555
+ .s("triangle").lpf(700).gain(0.2).room(0.6),
556
+ note("<c2 f2 ab1 bb1>/2")
557
+ .s("sine").lpf(300).gain(0.25),
558
+ note("g4(3,8)")
559
+ .s("sine").gain(0.05)
560
+ .delay(0.5).delayfeedback(0.5)
561
+ .pan(sine.slow(5)),
562
+ s("bd ~ [~ bd] ~")
563
+ .gain(0.4).lpf(600),
564
+ s("[~ hh]*2")
565
+ .gain(0.1).lpf(1800),
566
+ s("~ ~ rim? ~")
567
+ .gain(0.06).room(0.4)
568
+ .delay(0.3).delayfeedback(0.3)
569
+ ).cpm(50)`,
570
+ },
571
+ {
572
+ name: 'workout',
573
+ category: 'activity',
574
+ description: 'Workout energy — driving beats, high BPM, motivating intensity.',
575
+ code: `stack(
576
+ s("bd ~ bd ~")
577
+ .gain(0.8),
578
+ s("~ ~ sd [sd sd]")
579
+ .gain(0.55).room(0.2),
580
+ s("hh*8")
581
+ .gain(sine.range(0.15, 0.35).slow(2))
582
+ .lpf(5000),
583
+ s("~ cp ~ cp")
584
+ .gain(0.4),
585
+ note("c2 c2 eb2 c2 f2 c2 eb2 g2")
586
+ .s("sawtooth").lpf(1200).gain(0.45),
587
+ note("<[c3,eb3,g3] [f3,ab3,c4]>/2")
588
+ .s("square").lpf(2500).gain(0.25)
589
+ ).cpm(70)`,
590
+ },
591
+ {
592
+ name: 'relaxing',
593
+ category: 'activity',
594
+ description: 'Deep relaxation — slow, warm, meditative ambient soundscape.',
595
+ code: `stack(
596
+ note("<[c4,e4,g4,b4] [a3,c4,e4] [f3,a3,c4,e4] [g3,b3,d4]>/4")
597
+ .s("sine").room(0.9).size(0.95).gain(0.15)
598
+ .lpf(sine.range(400, 1200).slow(16)),
599
+ note("<c2 a1 f1 g1>/4")
600
+ .s("sine").gain(0.2),
601
+ note("e5(3,8)")
602
+ .s("triangle").gain(0.04)
603
+ .delay(0.6).delayfeedback(0.5)
604
+ .pan(sine.slow(7)).room(0.8),
605
+ note("<b5 ~ g5 ~>/4")
606
+ .s("sine").gain(0.03)
607
+ .room(0.9).size(0.99)
608
+ .pan(perlin.range(0.2, 0.8))
609
+ ).slow(2).cpm(42)`,
610
+ },
611
+ ];
612
+ export const PRESET_MAP = new Map(PRESETS.map((p) => [p.name, p]));
613
+ export const PRESET_NAMES = PRESETS.map((p) => p.name);
614
+ export function getPresetsByCategory(category) {
615
+ if (!category)
616
+ return PRESETS;
617
+ return PRESETS.filter((p) => p.category === category);
618
+ }
619
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/lib/presets.ts"],"names":[],"mappings":"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"}