1// TYPESAFE JEV — drill'n'bass for a well-typed agent
2// vox: real 22 Jump Street "my name is jeff" + a SAPI robot saying "type safe jev"
3setcps(170/60/4)
4await samples('github:tidalcycles/dirt-samples')
5// vox: the repo's samples/ folder, served with the site (see README)
6await samples('jev-samples/strudel.json')
7
8// 16-cycle form: intro | enter | drill | everything
9const intro = "<1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0>"
10const body  = "<0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0>"
11const drill = "<0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0>"
12const late  = "<0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1>"
13
14stack(
15  // detuned Avril-14th-ish pad, always there
16  note("<[c3,eb3,g3,bb3] [ab2,c3,eb3,g3] [f2,ab2,c3,eb3] [g2,b2,d3,f3]>")
17    .s("supersaw").detune(.35).attack(.6).release(2)
18    .lpf(sine.range(500,2200).slow(16)).room(.8).size(.9).gain(.28),
19
20  // music-box lead, wonky and slightly out of tune
21  n("<[0 2 4 ~ 7 ~ 4 2] [~ 0 3 ~ 5 3 ~ 2] [4 ~ 2 0 ~ -1 0 ~] [2 4 ~ 6 ~ 4 ~ 2]>")
22    .scale("C4:minor").s("triangle").decay(.25).sustain(0)
23    .detune(sine.range(-.15,.15).slow(7)).delay(.4).delaytime(.375).delayfeedback(.45)
24    .room(.5).gain(.35).degradeBy(.15),
25
26  // intro vox: huge washed-out "type safe jev"
27  s("<tsjev ~ tsjev ~>").speed(.8).room(.95).size(.95)
28    .delay(.6).delaytime(.5).delayfeedback(.55).gain(1.1).mask(intro),
29
30  // chopped amen, ratchets and reverse edits
31  n("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15")
32    .s("amencutup").sometimesBy(.3, x=>x.ply("<2 4 3>"))
33    .sometimesBy(.12, x=>x.speed(-1)).sometimesBy(.1, x=>x.speed(2))
34    .gain(.9).mask(body),
35
36  // drill kicks
37  s("bd:3").struct("x ~ ~ ~ ~ ~ x ~ ~ ~ x ~ ~ x ~ ~").gain(1.1).mask(body),
38
39  // acid squelch
40  note("c2 c3 c2 eb2 c2 g2 [c2 c2] bb1").fast(2).s("sawtooth")
41    .lpf(sine.range(250,3200).slow(4)).lpq(18).decay(.14).sustain(0)
42    .distort(1.5).gain(.35).mask(body),
43
44  // call-and-response: "my name is jeff" / "my name is jev" / "type safe ... jev"
45  s("<[jeff ~ ~ ~] [mnjev ~ ~ ~] [jeff ~ ~ ~] [~ ts ~ jev]>")
46    .gain(1.25).room(.25).mask(body),
47
48  // "my my my name is jeff" stutter
49  s("[jeff jeff jeff] jeff").end("<[.12 .12 .12] 1>").cut(1)
50    .speed("<1 1 .75 1.5>").gain(1.2).mask(drill).degradeBy(.2),
51
52  // glitch confetti: jev shredded to 16ths, flung around the stereo field
53  s("jev*16").end(.5).speed("<1 1.5 2 -1>").sometimesBy(.4, x=>x.speed(4))
54    .degradeBy(.45).pan(rand).hpf(600).gain(.7).mask(drill),
55
56  // finale: pitched-down TYPE SAFE JEV slamming every bar
57  s("tsjev ~").speed("<.6 .5>").distort(2).lpf(2500).gain(1).mask(late)
58)