Strudelify

Lili Was Here

CANDY DULFER

KeyE minorTempo107 bpm
0:00/0:00
// Lili Was Here — DULFER, CANDY
// 107 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 97 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(107/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once · [...]/2 spreads a riff over 2 bars.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~ A B C B D B C D E F G H B I B D E B J B C B K L E I M@2 B@2 N B O P Q R I B S T U P V R C W X D Y P Z AA AB H B Y E
  H AC AA C B C D E I AD AA C AE AF AG E C AH AI I AE C AJ AK AL AA AM K AN AO AP AQ H AO AN@2 AR ~@2
>`.pickRestart({
  A: "~@5 d1@2 d#1", B: "d1@2 e1 ~@3 e1 ~@3 e1@2 g1@2 e1@2", C: "d1@2 e1 ~@3 e1@2 ~@2 f#1@2 g1@2 a1@2",
  D: "d1@2 e1 ~@3 e1 ~@3 e1@2 f#1@2 e1@2", E: "d1@2 e1 ~@3 d1 ~@3 e1@2 d1@2 e1@2",
  F: "d1@2 e1 ~@3 e1 ~@3 e1@2 f#1@2 g1@2", G: "d1@2 e1 ~@3 e1@4 f#1@2 g1@2 a1@2",
  H: "d1@2 e1 ~@3 e1 ~@3 f#1@2 g1@2 f#1@2", I: "d1@2 e1 ~@3 e1 ~@3 f#1@2 g1@2 a1@2", J: "d1 e1 ~ f#1@2 g1 a1@2",
  K: "d1@2 e1 ~@3 e1@2 ~@2 e1@2 g1@2 e1@2", L: "d1@2 e1 ~@3 d1 ~@3 e1@2 f#1@2 e1@2",
  M: "[d1@2 e1 ~@3 f#1@2 g1@2 e1@2 b0@2 d1@4 e1 ~@3 e1 ~@3 e1@2 g1@2 e1@2]/2",
  N: "d1@2 e1 ~@3 f#1@2 ~@2 g1@2 f#1@2 e1@2", O: "d1 e1 ~ f#1 ~ g1 a1 g1", P: "d1@2 e1@2 ~@2 e1 ~@3 f#1@2 g1@2 f#1@2",
  Q: "d1@2 e1 ~@3 e1@2 g1@2 e1@2 b0@4", R: "d1@2 e1@2 ~@2 e1 ~@3 e1@2 g1@2 e1@2",
  S: "d1@2 e1@2 ~@2 f#1 ~@3 g1@2 f#1@2 e1@2", T: "d1@2 e1@2 ~@2 e1@2 ~@2 f#1@2 e1@2 d1 ~",
  U: "d1@2 e1 ~@3 f#1 ~@3 e1@2 d1@2 e1@2", V: "d1@2 e1 ~@3 f#1@4 g1@2 f#1@2 b0@2",
  W: "d1@2 e1 ~@3 e1@2 ~@2 e1@2 g1@2 e1@2, a1 ~@15", X: "d1 e1 ~ f#1@2 g1 a1 g1",
  Y: "d1@2 e1 ~@3 f#1 ~@3 e1@2 d1@2 e1 ~", Z: "d1@2 e1 ~@3 f#1@2 g1@2 f#1@2 b0@2 e1@2", AA: "d1 e1 ~ e1 ~ e1 g1 e1",
  AB: "d1@2 e1 ~@3 f#1@2 ~@2 g1@2 a1@2 g1@2", AC: "b0@2 d1@2 ~@2 e1@2 g1@2 f#1@2 b0@2 d1 ~",
  AD: "b0@2 d1 ~@3 e1@2 g1@2 f#1@2 b0@2 d1 ~", AE: "d1 e1 ~ e1 ~ f#1 g1 a1",
  AF: "d1@2 e1 ~@3 e1@2 ~@2 f#1@2 g1@2 f#1@2", AG: "d1@2 e1 ~@3 d1@2 ~@2 e1@2 f#1@2 e1@2",
  AH: "d1@2 e1 ~@3 f#1@4 g1@2 b0@2 d1@2", AI: "d#1@2 e1@2 ~@2 e1 ~@3 e1@2 g1@2 e1@2",
  AJ: "d1@2 e1 ~@3 e1@2 ~@2 d1@2 e1@2 g1@2", AK: "d1@2 e1@2 ~@2 f#1@2 ~@2 e1 ~@3 b0@2", AL: "d1 e1 ~ e1 ~ f#1 g1 f#1",
  AM: "d1 e1 ~ f#1 g1 a1 g1 f#1", AN: "d1 e1 ~ e1 ~ d1 e1 g1", AO: "d1@2 e1@2 ~@2 f#1@2 g1@2 f#1@2 e1@2 d1 ~",
  AP: "d1@2 e1@2 ~@2 d1 ~@3 e1@2 f#1@2 e1@2", AQ: "d1@2 e1 ~@3 d1@2 ~@2 b0@2 d1@2 b0@2", AR: "e1 ~",
})).s("gm_electric_bass_finger").gain(0.35)

// other · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@12 A@2 ~@2 B@3 ~ C@2 ~@2 D@3 ~ E@2 ~@2 F@2 ~@2 G@2 ~@2 H@4 ~@24 I@2 ~@2 J@3 ~ C@2 ~@2 K@3 ~ L@2 ~@2 M@2 ~@2 N@4 ~
>`.pickRestart({
  A: "[~@4 b4@2 g4@6 a4@2 e4@17 ~]/2", B: "[~@4 b4@2 g4@6 a4@2 f#4@12 g4@2 f#4@2 e4@15 ~@3, ~@14 e4 ~@33]/3",
  C: "[~@2 b4 g4@3 a4 e4@7 ~@2]/2", D: "[~@2 b4 ~@3 a4 f#4@6 g4 f#4 e4@7 ~@2, ~@6 g4@8 e4 ~@33]/3",
  E: "[~ [d4,e4] g4 d5@2 e4@2 g4@4 ~@5]/2", F: "[~@2 [d4,e4]@2 g4@2 d5@4 e4@4 a4@7 ~ b4@9 ~, ~@14 g4 ~@17]/2",
  G: "[~@2 b4@2 g5 ~ g5@4 f#5@4 b4@15 ~@3]/2",
  H: "[~@2 b4@2 g5 ~ g5@3 ~ f#5@3 ~ f#5@4 e5@3 ~ e5@4 d5@3 ~ e5@21 ~@13]/4", I: "[~@4 b4@2 g4@6 a4@2 e4@15 ~@3]/2",
  J: "[~@2 b4 g4@3 a4 f#4@6 g4 f#4 e4@8 ~, ~@14 e4 ~@33]/3",
  K: "[~@4 b4@2 g4@6 a4@2 f#4@11 ~ g4@2 f#4@2 e4@15 ~@3, ~@14 e4 ~@33]/3",
  L: "[~@2 [d4,e4]@2 g4@2 d5@4 e4@4 g4@13 ~@5]/2", M: "[~ e4 g4 d5@2 e4@2 a4@4 b4@5, ~@2 d4 ~@11 g4 ~@17]/2",
  N: "[~@2 b4 g4@2 a4@2 e4@7 ~@2 [b4,f#5]@12 ~@4, ~@31 g#4@25 ~@8]/4", // B5
})).s("gm_acoustic_guitar_steel").gain(0.71).pan(0.4)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@2 A@6 B@2 C@6 B@2 D@4 E@2 B@2 D@4 F@2 B@2 G@4 E@2 B@2 D@4 F@2 B@2 D@4 E@2 B@2 D@4 H@4 D@4 F@2 B@2 D@4 F@2 B@2 D@4
  H@4 I@2 J@2 K@3
>`.pickRestart({
  A: "[[g3,b3]@63 [a3,c4]@31 ~@2, e4@95 ~]/6", B: "[[a3,b3,d4,f#4]@31 ~]/2", C: "[[g3,b3]@64 [a3,c4]@31 ~, e4@95 ~]/6",
  D: "[[g3,b3,e4]@63 ~]/4", E: "[a3,c4,e4]/2", F: "[[a3,c4,e4]@31 ~]/2", G: "[[g3,b3,e4]@31 ~]/4",
  H: "[[a3,c4,e4]@31 ~ [a3,b3,d4]@31 ~, ~@31 f#4@31 ~@2]/4", I: "[[g3,b3,e4]@31 ~]/2",
  J: "[[c3,g3] a2, c4, e4@15 ~, ~@8 a3@7 ~]/2", K: "[[e2,g#3,b3,f#4]@35 ~@13]/3",
})).s("gm_synth_strings_1").gain(0.35).pan(0.6)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note("<~@44 A@4 B@2 C@6 B@2 C@6 B@2 D@8 E@8 F@8 G@4 H@2 ~>".pickRestart({
  A: "[[g3,b3]@32 [a3,c4]@31 ~, e4]/4", B: "[[a3,b3,d4,f#4]@31 ~]/2", C: "[[g3,b3]@64 [a3,c4]@31 ~, e4@95 ~]/6",
  D: "[[g3,b3]@64 c4@31 ~ [b3,d4,f#4]@31 ~, e4@95 ~@33, ~@32 a3@31 ~]/8", // G Bm
  E: "[[g3,b3]@64 c4@31 ~ [d4,f#4]@32, e4@95 ~ b3@25 ~@7, ~ a3]/8", // G D
  F: "[[g3,b3]@64 c4@32 [b3,d4,f#4]@31 ~, e4@3 ~, ~ a3]/8", // G Bm
  G: "[b3@16 ~@8 a3@7 ~, e4@63 ~, g3@47 ~@17, ~@16 c4@15 ~]/4", H: "[[e2,e3,g#3,b3,f#4]@29 ~@3]/2",
})).s("gm_synth_strings_2").gain(0.35).pan(0.4)

// drums · kick
const kick = s("bd").struct("<[x!2]!94 x ~@2>").gain(0.71)

// drums · rim
const rim = s("rim").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~ x ~@2 x ~@3",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!94 ~@3>").gain(0.71)

// drums · clap
const clap = s("cp").struct("<~@44 [~ x ~ x]!50 ~@3>").gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@44 [~ x ~ x]!50 ~@3>").gain(0.5)

// drums · ride
const ride = s("rd").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@6
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(0.57)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<[x!2]!94 x ~@2>").gain(2.53)

// drums · shaker
const shaker = s("sh").struct("<[~ x ~ x ~ x ~ x]!94 ~@3>").gain(0.5)

stack(
  bass, acoustic_guitar_steel, synth_strings_1, synth_strings_2, kick, rim, snare, clap, tambourine, ride, cabasa,
  shaker
)

More by CANDY DULFER