Strudelify

No More "I Love You's"

Annie Lennox

KeyE♭ majorTempo90 bpm
0:00/0:00
// No More "I Love You's" — Annie Lennox
// 90 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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 · fretless bass · "FRETLESS"
const bass = note(`<
  ~@3 A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A C D@2 E F G H E F I H ~@4 J K@2 J@2 K@2 J ~@3 L M N O L M P O L M N O Q R
  N S T U V W X L Y Z O AA AB AC O L M N O ~@4 AA AD N O AA AB AE O L M N O AF K@2 J AG AH@2 AI AJ@2
>`.pickRestart({
  A: "eb1@5 ~ eb1@6 eb1@4", B: "eb1@3 eb1@3 eb1@2", C: "c2@3 c2 d2@4", D: "[[f1,f2]@31 ~]/2", E: "eb2", F: "d2",
  G: "c2", H: "bb1", I: "f2", J: "eb1@5 ~ eb2@6 eb2@4", K: "eb1@3 eb2@3 eb2@2", L: "eb2@5 ~ eb2@6 eb2@4",
  M: "d2@3 d2@3 d2@2", N: "c2@3 c2@3 c2@2", O: "bb1@5 ~ bb1@6 bb1@4", P: "f2@3 f2@3 f2@2", Q: "bb2@5 ~ bb2@6 bb2@4",
  R: "db2@5 ~ db2@6 db2@4", S: "bb1@3 bb2@3 bb1@2", T: "ab2@5 ~ ab1@6 ab1@4", U: "db2@5 ~ db2@6 db3@4",
  V: "c3@3 c3@3 c3@2", W: "bb2@3 bb2@3 bb1@2", X: "ab1@3 ab1@3 ab1@2", Y: "d2@3 ~@3 f3 g3, ~@3 d2@5",
  Z: "[c2,eb3]@3 c2@3 c2@2", AA: "eb2@5 ~@7 g3@4, ~@3 eb2@5", AB: "[d2,f3]@3 ~@3 f3@2, ~@3 d2@5",
  AC: "f2@3 f2@3 f2@2, eb3 ~", AD: "[d2,f3]@3 d2@3 d2@2", AE: "[f2,eb3]@3 f2@3 f2@2", AF: "~@3 eb2@3 eb2@2, eb1",
  AG: "~@3 eb2@5, eb1", AH: "eb1@3 eb2@5", AI: "eb1@5 ~ eb2@10", AJ: "eb1/2",
})).s("gm_fretless_bass").gain(0.49)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@3 A@8 B C D C B E D C F C D C G@3 H@8 I@4 J@4 K@7 L@8 M@8 N O@4 L@12 ~@4 L@20 P@2
>`.pickRestart({
  A: "[[eb4,g4]@16 [d4,f4]@16 [eb4,ab4]@16 [d4,f4]@16 [eb4,g4]@16 [d4,f4]@16 [eb4,ab4]@16 [d4,f4]@15 ~, [eb2,eb3,bb3]]/8", // Eb Dm Ab5 Dm Eb Dm Ab5 Dm …
  B: "[eb4,g4]", C: "[d4,f4]", D: "[eb4,ab4]", E: "[d4,f4]@15 ~", F: "[eb4,g4]@15 ~",
  G: "[[c2,c3,c4,eb4,bb4] [d2,d3,d4,a4] [f2,f3,bb4,c5]@4, ~ f4@5]/3", // Cm7 D5 Fsus4
  H: "[[g3,g4]@2 ~ d4 [ab3,ab4]@2 ~ d4, bb3@63 ~, eb4@3 ~ eb4@3 ~, ~ [f3,f4] ~ [f3,f4]]/4", // G Ab F
  I: "[[eb4,g4] [d4,f4] [c4,eb4,ab4] [d4,f4], bb4]/4", J: "[[eb4,g4]@16 [d4,f4]@15 ~ [eb4,ab4]@16 [d4,f4]@16, bb4]/4",
  K: "[[eb4,g4]@15 ~ [d4,f4]@16 [eb4,ab4]@16 d4@16 [c4,eb5]@8 [d4,d5]@8 [bb3,eb5]@32, bb4, ~@3 f4@4]/7", // Eb Dm Ab5 Cm D Eb5
  L: "[g4@2 ~ d4 ab4@2 ~ d4, [bb3,bb4], eb4@3 ~ eb4@3 ~, ~ f4 ~ f4]/4", // Bb
  M: "[g4@2 ~ d4 ab4@2 ~ d4 [ab3,eb4]@2 db4@2 c4@2 [db4,gb4]@2, bb4@5 ab4@3, bb3 ~, eb4@3 ~ eb4@3 ~@9, ~ f4 ~ f4@4 ~]/8", // Ab5 Gb5
  N: "[c4,eb4]", O: "[db4 c4 [db4,gb4] [c4,eb4], ab4, f4 ~]/4", P: "[bb3,eb4,g4,bb4]/2",
})).s("gm_synth_strings_1").gain(0.26)

// other · epiano2 · "E.PIANO 2"
const epiano2 = note("<~@35 A B@2 ~@32 C D E@2 F G ~@2 H I ~@28>".pickRestart({
  A: "~@13 c5 bb4 c5", B: "[eb5@2 eb5 bb4@2 bb4 g4@2 bb4@12 ~@12]/2", C: "~@10 bb4@3 ~ bb4@2", D: "bb4@2 ~ bb4@7 ~@6",
  E: "[~@4 g4 ab4 bb4 bb4@2 bb4 bb4@4 ~@2]/2", F: "~@4 eb5 bb4@2 bb4", G: "bb4@2 bb4@7 ~@7", H: "~@8 g4@3 ab4@2 bb4@3",
  I: "bb4@2 ~ bb4@9 ~@4",
})).s("gm_epiano2").gain(0.34)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@61 A B C D E F G H I J@2 ~@14 K L M N O N P Q@4 ~@11>".pickRestart({
  A: "[g3,g4] [ab3,ab4]", B: "[bb3,bb4] [c4,c5]", C: "[db4,db5] [eb4,eb5]", D: "[gb4,gb5] [ab4,ab5]",
  E: "[bb4,bb5] [c5,c6]", F: "[db5,db6] [eb5,eb6]", G: "[g5,g6] [ab5,ab6]", H: "[bb5,bb6] [c6,c7]",
  I: "[db6,db7] [eb6,eb7]", J: "[[g6,g7]@7 ~]/2", K: "[eb5,eb6]@3 [f5,f6]", L: "[d5,d6]",
  M: "[eb5,eb6]@2 [ab5,ab6] [g5,g6]", N: "[f5,f6]", O: "[eb5,eb6]@3 [g5,g6]", P: "[g5,g6]", Q: "[[bb5,bb6]@7 ~]/4",
})).s("gm_string_ensemble_1").gain(0.21).pan(0.6)

// chords · harpsichord · "HARPSICHRD" · Eb5 Ebsus2 Eb5 Db5 Eb5
const harpsichord = note(`<
  ~@34
  [~@2 [eb2,bb3]!3 ~@3 [eb2,bb3] ~ [eb2,bb3] ~@5]!13
  [~@2 [eb2,f3]!3 ~@3 [eb2,f3] ~ [eb2,f3] ~@5]!2
  [~@2 [eb2,bb3]!3 ~@3 [eb2,bb3] ~ [eb2,bb3] ~@5]!13
  [~@2 [db2,ab3]!3 ~@3 [db2,ab3] ~ [db2,ab3] ~@5]!8
  [~@2 [eb2,bb3]!3 ~@3 [eb2,bb3] ~ [eb2,bb3] ~@5]!28
  ~@10
>`).s("gm_harpsichord").gain(0.27).pan(0.7)

// other · flute
const flute = note(`<
  ~@47 A@2 B C D E B C D E B C D E ~@9 B C D E B C D E B C D E ~@4 B C D E B C D E B C ~@12
>`.pickRestart({
  A: "[~@12 bb5@19 ~]/2", B: "[eb4,eb5] [bb3,bb4] [eb4,eb5] [bb3,bb4] [eb4,eb5] [bb3,bb4] [eb4,eb5] [bb3,bb4]",
  C: "[d4,d5] [bb3,bb4] [d4,d5] [bb3,bb4] [d4,d5] [eb4,eb5] [f4,f5] [bb3,bb4]", // D Bb D Bb D Eb F Bb
  D: "[c4,c5] [bb3,bb4] [c4,c5] [bb3,bb4] [c4,c5] [bb3,bb4] [c4,c5] [f4,f5]", // C Bb C Bb C Bb C F
  E: "[d4,d5] [bb3,bb4] [d4,d5] [bb3,bb4] [d4,d5] [eb4,eb5] [d4,d5] [c4,c5]", // D Bb D Bb D Eb D C
})).s("gm_flute").gain(0.13).pan(0.4)

// chords · piano · "A.PIANO 2"
const piano = note("<~@3 A@7 B@8 C@6 ~@46 D E F G H I J K L M N O ~@4 D E F G H I J K L M ~@12>".pickRestart({
  A: "[~@51 eb2@5, eb1@15 ~ eb1@14 ~@2 eb1@14 ~@2 eb1@16 eb1@15 ~ eb1@14 ~@2 eb1@14 ~@2, ~@6 eb2@15 ~ eb2@15 ~ eb2@14 ~@2 eb2@15 ~ eb2@15 ~ eb2@15 ~@11]/7",
  B: "[~@59 eb2@5, eb1@16 eb1@15 ~ eb1@14 ~@2 eb1@14 ~@2 eb1@16 eb1@15 ~ eb1@14 ~@2 eb1@14 ~@2, ~@6 eb2@15 ~ eb2@15 ~ eb2@15 ~ eb2@14 ~@2 eb2@15 ~ eb2@15 ~ eb2@15 ~@11]/8",
  C: "[~@70 eb2@15 ~@11, eb1@16 eb1@15 ~ eb1@14 ~@2 eb1@14 ~@2 eb1@16 ~@16, ~@6 eb2@15 ~ eb2@15 ~ eb2@15 ~ eb2@14 ~@28]/6",
  D: "[bb4,f5]@2 ~ bb4@2 ~ [bb4,f5]@9 ~, ~@3 g5 ~@12", E: "~@4 [bb4,f5]@2 f5@3 ~ d5@5 ~, ~@6 bb4@9 ~",
  F: "[bb4,eb5]@2 ~ [bb4,eb5] ~@2 [bb4,eb5]@5 ~ [bb4,eb5]@2 ~@2", G: "[bb4,d5]@5 ~ eb5@5 ~ f5@3 ~, ~@6 bb4@9 ~",
  H: "f5@2 ~ g5@2 ~ f5@5 ~@5, bb4@13 ~@3", I: "~@3 [bb4,f5]@2 ~ f5@5 ~ f5@2 d5 ~, ~@6 bb4@9 ~",
  J: "[bb4,eb5]@3 ~ [bb4,eb5] ~ bb4@4 ~@2 bb4@3 ~, ~@6 eb5@3 ~ eb5@5 ~", K: "[bb4,d5]@5 ~ eb5@4 d5@5 ~, ~@6 bb4@9 ~",
  L: "f5@2 ~ g5@2 ~ bb4@9 ~, bb4@5 ~ f5@7 ~@3", M: "~@4 bb4@2 f5@4 d5@5 ~, ~@4 f5 ~ bb4@9 ~",
  N: "[bb4,eb5]@3 [bb4,eb5] ~@2 [bb4,eb5]@5 ~ [bb4,eb5]@2 ~@2", O: "[bb4,d5]@5 ~ [bb4,eb5]@5 ~ [bb4,f5]@3 ~",
})).s("gm_piano").gain(0.23).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@3 A@20 B A@10 C@15 D@47 C@2 A@8 E ~>".pickRestart({
  A: "x ~@2 x ~@4", B: "x ~@2 x!2 ~@3", C: "x ~@3 x!2 ~@2", D: "x ~@2 x!3 ~@2", E: "x",
})).gain(0.35)

// drums · snare
const snare = s("sd").struct("<~@34 [~ x ~ x]!27 [~@4 x ~ x ~ x ~ x ~ x!3 ~] [~ x ~ x]!36 ~@10>").gain(0.46)

// drums · low tom
const low_tom = s("lt").struct("<~@69 [~@12 x!3 ~] ~@15 [~@8 x ~ x ~ x!3 ~] ~@22>").gain(0.25)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@26 A@7 B C D E@2 C D E@2 C D E@2 C D E F D@2 E F D@2 E F D@2 E D C D E@2 C D E@2 F D@2 E F D@2 E F D@2 E F D@2 E C D
  E@2 C D E@2 C D E G A@4 ~@6
>`.pickRestart({
  A: "x!4", B: "x!3 ~", C: "x!5 ~ x!2", D: "x ~ x!3 ~ x!3 ~@3 x ~ x!2", E: "x ~ x ~ x ~ x!3 ~@3 x ~ x!2",
  F: "x ~ x!3 ~ x!3 ~@3 x ~ x ~", G: "x ~ x ~ x ~ x!3 ~@3 x ~@3",
})).gain(0.25)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@26 A B A B A B A B C ~ D ~ C ~ D ~ C ~ D ~ C ~ D ~@13 C ~ D ~ C ~ D ~@17 C ~ D ~ C ~ D ~ C ~ D ~ A B A B ~@6
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2", C: "~@3 x ~@3 x ~@8", D: "~@3 x ~@12",
})).gain(0.1)

// drums · mid tom
const mid_tom = s("mt").struct("<~@69 [~@6 x ~ x!4 ~@4] ~@15 [~@8 x ~ x ~ x!3 ~] ~@22>").gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@34 [~@5 x ~@2]!64 ~@10>").gain(0.3)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@27 A ~ A ~ A ~@67 A ~ A ~@6>".pickRestart({
  A: "~@7 x",
})).gain(0.15)

// drums · high tom
const high_tom = s("ht").struct("<~@69 [~@2 x ~ x!2 ~@10] ~@38>").gain(0.2)

// drums · crash
const crash = s("cr").struct("<~@49 A ~@7 A ~@4 A ~@3 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@13>".pickRestart({
  A: "x",
})).gain(0.3)

// drums · ride
const ride = s("rd").struct("<~@62 A B@3 A B@2 C ~@16 A B@3 A B@3 A B ~@12>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x",
})).gain(0.25)

// drums · tambourine
const tambourine = s("tb").struct("<~@26 [x!8]!7 [x!6 ~@2] [x!8]!63 [x!7 ~] [x!8]!4 ~@6>").gain(0.15)

// drums · rim
const rim = s("rim").struct(`<
  ~@3 A@22 ~ A@7 ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B@2 ~ B ~ B ~ B ~ B ~ B ~@2 B ~ B ~ B ~ B ~@29 A@8 ~@2
>`.pickRestart({
  A: "~@3 x", B: "~@7 x",
})).gain(0.3)

stack(
  bass, synth_strings_1, epiano2, string_ensemble_1, harpsichord, flute, piano, kick, snare, low_tom, hihat, hihat_soft,
  mid_tom, open_hat, open_hat_soft, high_tom, crash, ride, tambourine, rim
)

More by Annie Lennox