Strudelify
Lili Was Here cover art

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, A@4 for four bars: 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 C B D E B I B C B@2 J E K L@2 B@2 M B N H O B C B P Q R H S B C T U D V H W B N H B V E H
  X Y C B C D E C X B C@2 H J E C Z AA C AB C AC AD AE Y AF Y AC AG J AH H AG AC@2 AI ~@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 e1 ~ f#1@2 g1 a1@2", J: "d1@2 e1 ~@3 d1 ~@3 e1@2 f#1@2 e1@2",
  K: "d1@2 e1 ~@3 e1 ~@3 f#1@2 g1@2 a1@2", L: "[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",
  M: "d1@2 e1 ~@3 f#1@2 ~@2 g1@2 f#1@2 e1@2", N: "d1 e1 ~ f#1 ~ g1 a1 g1", O: "d1@2 e1 ~@3 e1@2 g1@2 e1@2 b0@4",
  P: "d1@2 e1@2 ~@2 f#1 ~@3 g1@2 f#1@2 e1@2", Q: "d1@2 e1@2 ~@2 e1@2 ~@2 f#1@2 e1@2 d1 ~",
  R: "d1@2 e1 ~@3 f#1 ~@3 e1@2 d1@2 e1@2", S: "d1@2 e1 ~@3 f#1@4 g1@2 f#1@2 b0@2",
  T: "d1@2 e1 ~@3 e1@2 ~@2 e1@2 g1@2 e1@2, a1 ~@15", U: "d1 e1 ~ f#1@2 g1 a1 g1",
  V: "d1@2 e1 ~@3 f#1 ~@3 e1@2 d1@2 e1 ~", W: "d1@2 e1 ~@3 f#1@2 g1@2 f#1@2 b0@2 e1@2",
  X: "b0@2 d1@2 ~@2 e1@2 g1@2 f#1@2 b0@2 d1 ~", Y: "d1 e1 ~ e1 ~ e1 g1 e1", Z: "d1@2 e1 ~@3 f#1@4 g1@2 b0@2 d1@2",
  AA: "d#1@2 e1@2 ~@2 e1 ~@3 e1@2 g1@2 e1@2", AB: "d1 e1 ~ e1 ~ f#1 g1 a1", AC: "d1 e1 ~ e1 ~ d1 e1 g1",
  AD: "d1@2 e1@2 ~@2 f#1@2 ~@2 e1 ~@3 b0@2", AE: "d1@2 e1 ~@3 e1@2 ~@2 f#1@2 g1@2 f#1@2",
  AF: "d1 e1 ~ f#1 g1 a1 g1 f#1", AG: "d1@2 e1@2 ~@2 f#1@2 g1@2 f#1@2 e1@2 d1 ~",
  AH: "d1@2 e1 ~@3 d1@2 ~@2 b0@2 d1@2 b0@2", AI: "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 C@2 ~@2 B@3 ~ C@2 ~@2 B@3 ~ I@2 ~@2 J@2 ~@2 K@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: "[~@4 b4@2 ~@6 a4@2 f#4@12 g4@2 f#4@2 e4@15 ~@3, ~@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: "[~@2 [d4,e4]@2 g4@2 d5@4 e4@4 g4@13 ~@5]/2", J: "[~@2 e4@2 g4@2 d5@4 e4@4 a4@8 b4@9 ~, ~@2 d4 ~@11 g4 ~@17]/2",
  K: "[~@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 E@2 B@2 D@4 E@2 B@2 D@4 E@2 B@2 D@4 E@2 B@2 D@4 F@4 D@4 E@2 B@2 D@4 E@2 B@2 D@4
  F@4 G@2 H@2 I@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]@31 ~]/2", F: "[[a3,c4,e4]@31 ~ [a3,b3,d4]@31 ~, ~@31 f#4@31 ~@2]/4",
  G: "[[g3,b3,e4]@31 ~]/2", H: "[[c3,g3] a2, c4, e4@15 ~, ~@8 a3@7 ~]/2", I: "[[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@95 ~@33, ~ 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