Strudelify
The Power of Love cover art

Jennifer Rush

The Power of Love

Jennifer Rush

KeyE♭ majorTempo80 bpm
0:00/0:00
// The Power of Love — Jennifer Rush
// 80 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 81 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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(`<
  ~@2 A@2 B@2 A@2 C@2 D@2 E D F D G@2 H I J K L M N O A@2 B@2 A@2 C@2 D@2 E D F D G@2 P I J K L M N O Q@2 R@2 S T Q U V
  W X Y Z AA AB AC Q@2 R@2 S T Q AD Q@2 R@2 S T AE
>`.pickRestart({
  A: "eb3/2", B: "c3/2", C: "bb2/2", D: "eb3", E: "c3", F: "ab2", G: "bb2", H: "eb3!2 ~@6 eb3@4 ~@2 eb3 ~",
  I: "eb3!2 ~@6 eb3@6 ~@2", J: "ab2!2 ~@6 ab2@4 ~@2 ab2 ~", K: "ab2!2 ~@6 ab2@6 ~@2", L: "f3!2 ~@6 f3@4 ~@2 f3 ~",
  M: "f3!2 ~@6 f3@6 ~@2", N: "bb2!2 ~@6 bb2@4 ~@2 bb2 ~", O: "bb2!2 ~@6 bb2@6 ~@2", P: "eb3!2 ~@6 eb3@4 ~@2 eb3@2",
  Q: "eb3@6 ~@2 eb3@4 ~@2 eb3 ~", R: "ab2@6 ~@2 ab2@4 ~@2 ab2 ~", S: "f3@6 ~@2 f3@4 ~@2 f3 ~",
  T: "bb3@6 ~@2 bb3@4 ~@2 bb3 ~", U: "ab3@3 ~ bb3@3 ~", V: "eb3@6 ~@2 eb4!8", W: "ab3@6 ~@2 bb3@4 ~@2 bb3 ~",
  X: "c3!4 c4@3 ~ c3!4 c4@3 ~", Y: "ab2!4 ab3@3 ~ bb2!4 bb3@3 ~", Z: "eb3@3 ~ d3@3 ~ c3@4 ~@4",
  AA: "ab2@6 ~@2 ab3@4 ~@2 ab3 ~", AB: "bb2!2 ~@4 bb2!2 bb3!2 ~@4 bb2!2", AC: "bb3!2 ~@4 bb2 ~ bb3@4 ~@2 bb3 ~",
  AD: "eb3@3 ~", AE: "eb3@15 ~",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · pad warm · "WARM PAD"
const pad_warm = note(`<
  ~@2 A@2 B@2 A@2 C@2 D@2 E@2 F G H@2 D@2 I@2 J@2 H@2 A@2 B@2 A@2 C@2 D@2 K G F G H@2 D@2 I@2 J@2 H@2 D@2 I@2 L@3 M N O
  P Q R F H@2 D@2 I@2 S T D@2 G@2 I@2 S T U
>`.pickRestart({
  A: "[[g4,bb4]@7 ~]/2", B: "[[g4,c5]@7 ~]/2", C: "[[f4,bb4]@7 ~]/2", D: "[[eb4,g4,bb4]@7 ~]/2",
  E: "[[g4,c5]@3 ~ [g4,bb4]@3 ~, eb4@13 ~@3]/2", F: "[c4,eb4,ab4]@3 ~", G: "[eb4,g4,bb4]@3 ~", H: "[[d4,f4,bb4]@7 ~]/2",
  I: "[[c4,eb4,ab4]@7 ~]/2", J: "[[c4,f4,ab4]@7 ~]/2", K: "[g4,c5]@3 ~, eb4",
  L: "[[c4,ab4]@4 d4@4 [eb4,g4]@3 ~, f4@2 ~, ~@4 bb4@7 ~]/3", M: "eb4@3 ~ [bb3,d4,f4]@3 ~, c4 ~@15",
  N: "[bb3,eb4,g4]@3 ~", O: "[c4,eb4]@3 ~ [bb3,d4,f4]@3 ~", P: "[c4,eb4,g4]@3 ~ [bb3,d4,f4]@3 ~",
  Q: "[c4,eb4,ab4]@3 ~ [d4,f4,bb4]@3 ~", R: "[g4,bb4,eb5]@3 ~ [f4,bb4,d5]@3 ~ [eb4,g4,c5]@6 ~@2", S: "[c4,f4,ab4]@3 ~",
  T: "[d4,f4,bb4]@3 ~", U: "[eb4,g4]@3 ~, bb4@15 ~",
})).s("gm_pad_warm").gain(0.25)

// bass · piano · "A.PIANO"
const bass_2 = note(`<
  ~@10 A ~ B A C A D@2 ~@16 A ~ B A C A D@2 ~@8 E@2 F@2 G H I J I J K J L M ~ N E@2 F@2 G H I@2 E@2 F@2 G H O
>`.pickRestart({
  A: "eb2", B: "c2", C: "ab1", D: "bb1", E: "[eb2@7 ~]/2", F: "[ab1@7 ~]/2", G: "f2@3 ~", H: "bb2@3 ~", I: "eb2@3 ~",
  J: "ab2@3 ~ bb2@3 ~", K: "c3@3 ~ bb2@3 ~", L: "eb2@3 ~ d2@3 ~ c2@4 ~@4", M: "ab1@6 ~@2 ab2@4 ~@2 ab2 ~",
  N: "~@6 bb1 ~ bb2@4 ~@2 bb2 ~", O: "eb2@15 ~",
})).s("gm_piano").gain(0.3)

// other · tremolo strings · "TREMOLOSTR"
const tremolo_strings = note(`<
  ~@11 A ~ B C D E ~@2 A ~ F ~ G ~ H ~@9 A ~ B C D E ~@2 A ~ F ~ G ~ I J@2 K L M N J O P Q R S T U V W J@2 K X M N J@4 Y
  Z M N AA
>`.pickRestart({
  A: "eb4 f4 bb4 g4@3 ~@2", B: "eb5 d5 g4@3 ~@3", C: "c5@2 ab4@3 ~ eb4@8 ~@2", D: "g4@3 ~", E: "f4",
  F: "c5@2 bb4@3 ~ ab4@4 ~@6", G: "f4 g4 c5 ab4@3 ~@2", H: "d5 c5 f4 bb4@3 ~@2", I: "d5@2 c5@2 f4@2 bb4@3 ~@7",
  J: "eb4 ~ bb3 ~ eb4 ~ bb3 ~ eb4 ~ bb3 ~ eb4 ~ bb3 ~", K: "eb4 ~ ab3 ~ eb4 ~ ab3 ~ eb4 ~ ab3 ~ eb4 ~ ab3 ~",
  L: "eb4@2 ab3 ~ eb4@2 ab3@6 ~@4", M: "f4 ~ c4 ~ f4 ~ c4 ~ f4 ~ c4 ~ f4 ~ c4 ~",
  N: "bb3 ~ bb3 ~ f4 ~ bb3 ~ f4 ~ bb3 ~ f4 ~ bb3 ~", O: "ab2@3 ~ bb2@3 ~", P: "eb3@3 ~", Q: "eb4@3 ~ f4@3 ~",
  R: "c5@3 ~ c5@3 ~ f4@3 ~ bb4@3 ~", S: "ab4@3 ~ bb4@3 ~", T: "g5@3 ~ f5@3 ~ eb5@4 ~@4", U: "ab3@3 ~ ab4@3 ~",
  V: "bb3!2 ~@4 bb3!2 bb4!2 ~@4 bb3!2", W: "bb4!2 ~@4 bb3 ~ bb4@6 ~@2", X: "eb4 ~ ab3@2 eb4@2 ab3@6 ~@4",
  Y: "~@4 eb4 ~ ab3 ~ eb4 ~ ab3 ~ eb4 ~ ab3 ~", Z: "eb4 ab3 eb4 ab3@3 ~@2", AA: "eb4@15 ~",
})).s("gm_tremolo_strings").gain(0.25)

// other · synth brass 2 · "SYNTHBRASS"
const synth_brass_2 = note(`<
  A@4 B@2 A@2 C@2 A@2 B A D A E@2 F G H I J K L M A@2 B@2 A@2 C@2 N A B A O A E@2 F G H I J K L M A@2 D@2 P C A Q A Q R
  Q S T U V A@2 D@2 P C A@4 D@2 P C W
>`.pickRestart({
  A: "eb3!16", B: "c3!16", C: "bb2!16", D: "ab2!16", E: "bb3!16", F: "[eb2,eb3]!2 eb3!12 [eb2,eb3] eb3, ~@2 eb2 ~",
  G: "[eb2,eb3]!2 eb3!14, ~@4 eb2@3 ~", H: "[ab1,ab2]!2 ab2!12 [ab1,ab2] ab2, ~@2 ab1 ~",
  I: "[ab1,ab2]!2 ab2!14, ~@4 ab1@3 ~", J: "[f2,f3]!2 f3!12 [f2,f3] f3, ~@2 f2 ~", K: "[f2,f3]!2 f3!14, ~@4 f2@3 ~",
  L: "[bb1,bb2]!2 bb2!12 [bb1,bb2] bb2, ~@2 bb1 ~", M: "[bb1,bb2]!2 bb2!14, ~@4 bb1@3 ~", N: "eb3!16, eb2", O: "ab3!16",
  P: "f3!16", Q: "ab2!8 bb2!8", R: "c3!8 bb2!8", S: "eb2!4 bb1!4 c2!8, ~@4 d2@3 ~@9", T: "ab2!16, ab1@3 ~@5",
  U: "[bb1,bb2]!2 bb2!4 [bb1,bb2]!2 bb2!6 [bb1,bb2]!2", V: "bb2!6 [bb1,bb2] bb2!9", W: "eb3@15 ~",
})).s("gm_synth_brass_2").gain(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@18 A B A B A B A B ~@15 C A B A B A B A B A B A B A B A B A B A B D A E F A B A B A B A B A B A B A B G
>`.pickRestart({
  A: "x!2 ~@2 x ~@3 x ~@3 x ~@3", B: "x!2 ~@2 x ~@3 x ~@5 x ~", C: "x ~ x ~ x ~@2 x", D: "x!3 ~",
  E: "x!2 ~@4 x!4 ~@4 x!2", F: "x!2 ~@4 x ~ x ~@5 x ~", G: "x",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@41 A B@7 C B@7 C B@3 C A B@2 D B@7 C B@5 C E>".pickRestart({
  A: "x ~@3 x ~@3 x ~@2 x!2 ~ x ~", B: "~ x ~ x", C: "~@4 x ~@3 x ~@2 x!2 ~ x ~", D: "x ~@2 x!3 ~@2 x ~@3 x ~@3",
  E: "x",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~@18 [x!8]!8 [x!5 ~@3 x!5 ~@3]!36 ~ [x!5 ~@3 x!5 ~@3] [x!8]!2 [x!5 ~@3 x!5 ~@3]!14 ~>")
  .gain(0.3)

stack(bass, pad_warm, bass_2, tremolo_strings, synth_brass_2, kick, snare, hihat)