Strudelify

The Power of Love

Frankie Goes to Hollywood

KeyF minorTempo62 bpm
0:00/0:00
// The Power of Love — Frankie Goes to Hollywood
// 62 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 83 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(62/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(`<
  ~@16 A B C D E F G H I J K L A B C D M B C N O B C P A B C D Q F G R S@3 ~ T U V W A B X Y@2 A B C D Q F G R A Z A AA
  A@9 ~
>`.pickRestart({
  A: "f1@47 ~", B: "db2", C: "c2@47 ~", D: "db2@23 ~ db2@11 ~ db2@12", E: "eb2@47 ~", F: "db2@38 ~ db2@8 ~", G: "eb2",
  H: "db2@5 ~ db2@11 ~ db2@21 db2@8 ~", I: "f1@17 ~ f1@5 ~ f1@24", J: "eb1@17 ~ eb1@5 ~ eb1@11 ~ eb1@11 ~",
  K: "f1@17 ~ f1@5 ~ f1@23 ~", L: "eb1@17 ~ eb1@5 ~ eb1@11 ~ bb1@10 ~@2", M: "f2@17 ~ bb1@3 c2@3 f1@24",
  N: "db2@35 ~ eb2@12", O: "f2@47 ~", P: "db2@41 ~ eb2@6", Q: "eb2@35 ~ c2@12", R: "db2@5 ~ db2@11 ~ db2@6 db2@24",
  S: "[f1@71 ~]/3", T: "db3@14 ab3 bb3", U: "c3", V: "bb2", W: "c3@23 ~", X: "c2@23 ~ c2@5 ~ c2@9 ~@3 c2@5 ~",
  Y: "[db2@95 ~]/2", Z: "db2@5 ~ db2@9 ~@3 db2@30", AA: "db2@5 ~ db2@42",
})).s("gm_fretless_bass").gain(0.57)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@4 A B A B A C D C A C D E A B F B G C H I A J A J A B F B A B F E A B F K A B F B G C H I ~@8 A B F L ~ A B F B G C
  H I A B A B A@8 ~@2
>`.pickRestart({
  A: "~@13 f4@5 ~ f3@6 ~@5 [f3,ab3] ~@6 f3@3 ~@3 f4@5, ~@12 [f3,ab3,c4]@4 ~@2 [ab3,c4,f4]@6 ~@12 [ab3,c4,f4]@5 ~ [f3,ab3,c4]@5 ~", // Fm
  B: "~@13 f4@5 ~ f3@6 ~@5 f3 ~@6 f3@3 ~@3 f4@5, ~@12 [f3,ab3,db4]@4 ~@2 [ab3,db4,f4]@6 ~@12 [ab3,db4,f4]@4 ~@2 [f3,ab3,db4]@5 ~", // Db
  C: "~@13 f4@5 ~ db3@6 ~@5 db3 ~@6 db3@3 ~@3 f4@5, ~@12 [db3,ab3,c4]@4 ~@2 [ab3,c4,f4]@6 ~@12 [ab3,c4,f4]@4 ~@2 [db3,ab3,c4]@5 ~", // Dbmaj7 Fm Dbmaj7
  D: "~@13 eb4@5 ~ c3@6 ~@5 [c3,g3] ~@6 c3@3 ~@3 eb4@5, ~@12 [c3,g3,c4]@4 ~@2 [g3,c4,eb4]@6 ~@12 [g3,c4,eb4]@5 ~ [c3,g3,c4]@5 ~", // C5 Cm C5
  E: "~@13 f4@5 ~ db3@6 ~@5 db3 ~@6 eb3@3 ~@3 g4@5, ~@12 [db3,ab3,c4]@4 ~@2 [ab3,c4,f4]@6 ~@12 [bb3,eb4,g4]@4 ~@2 [eb3,bb3,eb4]@5 ~", // Dbmaj7 Fm Eb Eb5
  F: "~@13 g4@5 ~ eb3@6 ~@5 [eb3,g3] ~@6 eb3@3 ~@3 g4@5, ~@12 [eb3,g3,c4]@4 ~@2 [g3,c4,g4]@6 ~@12 [g3,c4,g4]@5 ~ [eb3,g3,c4]@5 ~", // Eb Cm C5 Cm
  G: "~@13 eb4@5 ~ eb3@6 ~@5 [eb3,g3] ~@6 eb3@3 ~@3 eb4@5, ~@12 [eb3,g3,bb3]@4 ~@2 [g3,bb3,eb4]@6 ~@12 [g3,bb3,eb4]@5 ~ [eb3,g3,bb3]@5 ~", // Eb
  H: "~@13 eb4@5 ~ bb2@6 ~@5 [bb2,g3] ~@6 bb2@3 ~@3 eb4@5, ~@12 [bb2,g3,bb3]@4 ~@2 [g3,bb3,eb4]@6 ~@12 [g3,bb3,eb4]@5 ~ [bb2,g3,bb3]@5 ~", // Eb
  I: "~@7 f4@5 ~@13 db3@6 ~@6 db3@3 ~@3 f4@5, ~@6 [db3,ab3,db4]@4 ~@14 [ab3,db4,f4]@6 ~@6 [ab3,db4,f4]@4 ~@2 [db3,ab3,db4]@5 ~", // Db5 Db Db5
  J: "~@13 g4@5 ~ g3@6 ~@5 g3 ~@6 g3@3 ~@3 g4@5, ~@12 [g3,bb3,eb4]@4 ~@2 [bb3,eb4,g4]@6 ~@12 [bb3,eb4,g4]@4 ~@2 [g3,bb3,eb4]@5 ~", // Eb
  K: "~@13 f4@5 ~ db3@6 ~@5 db3 ~@6 db3@3 ~@3 g4@5, ~@12 [db3,ab3,db4]@4 ~@2 [ab3,db4,f4]@6 ~@12 [ab3,db4,f4]@4 ~@2 [eb3,bb3,eb4]@5 ~", // Db5 Db Eb5
  L: "~ f4@5 ~@42, [f3,ab3,db4] ~@11", // Db
})).s("gm_acoustic_guitar_steel").gain(0.32).pan(0.4)

// other · piano · "A.PIANO 1"
const piano = note(`<
  A B@3 C@2 D E F@2 G F@3 G H ~@8 I J K L M ~@6 N ~@3 H ~@12 O P Q ~ M R S T ~@14 U V W X Y Z AA AB ~
>`.pickRestart({
  A: "~ ab5@10 ~, [f2,f3,f4], ~ c5@43 ~@4, ~@3 f5@41 ~@4", // F
  B: "[~@4 g5@37 ~@9 f5@41 ~@41 c4@12, [f2,f3] [f2,f3] [f2,f3], f4@42 ~@5 f4@46 ~@2 f4@43 ~@6, ~@2 [bb4,eb5]@40 ~@6 ab4@43 ~@6 [bb4,eb5,g5]@42 ~@5, ~@49 c5@42 ~@53]/3", // F Eb5 Eb
  C: "[[f4,f5]@21 ~@3 db4@23 ~, ~@47 db5@46 ~@3]/2", D: "~ [f4,f5]@45 ~@2", E: "[db4,db5]@11 ~", F: "[f4,f5]@11 ~",
  G: "[g4,g5]@11 ~", H: "[f4,f5]@32 ~@4 [eb4,eb5]@11 ~", I: "~@15 f4@3 ab4@3 c5@17 ~ bb4@6 ab4@3",
  J: "bb4@22 ~@5 c4@3 eb4@2 ~ g4@2 ~ bb4@12", K: "ab4@27 ab5 ~@2 ab5 ~@2 ab5@3 bb5@9 ab5@2 ~",
  L: "bb5@3 ab5@2 ~ bb5@16 ~@5 c5@3 f5@3 ab5@3 bb5@8 ~ ab5@3", M: "[f4,f5]@5 ~@3", N: "[f4,f5]@32 ~@10 [eb4,eb5]@5 ~",
  O: "~@30 eb5@3 f5 ~@2 bb4@6 c5@3 eb5@3, [db3,db4,f4,ab4]@23 ~, c5@7 ~", // Db
  P: "eb4@4 ~@17 [eb5,g5] ~@2 [f5,ab5] ~@2 [g5,bb5]@7 ~@14", Q: "~@15 f4@3 ab4@3 bb4@17 ~@10",
  R: "~@15 eb5@3 f5@2 ~ ab5 ~@2 eb5@6 f5@10 ~@8",
  S: "[c5,eb5,g5,c6]@6 ~@2 [c5,eb5,g5,c6] ~ [c5,eb5,g5,c6]@3 ~ [c5,eb5,g5,c6] ~", T: "[db5,f5,ab5]@17 ~@31",
  U: "~@21 eb5@2 ~ bb5 ~@2 bb5@2 ~ eb5 ~@2 eb5@2 ~ f5@2 ~ eb5@9", V: "~@40 c6@2 ~ f5@2 ab5@2 bb5", W: "~@2 bb5@21 ~@25",
  X: "~@18 eb5@4 ~@5 eb5@5 ~@7 eb5@7 ~@2", Y: "~@9 eb4@4 eb5@2 eb5@3 ~@4 eb5@5 eb4@3 eb5@2 ~ eb5@2 ~@13",
  Z: "~@15 [eb4,eb5] ~@8 [eb4,eb5] ~@2 [eb4,eb5]@4 ~@14 eb5 ~@2", // Eb
  AA: "~ eb5 ~ eb5@2 ~@19 [eb4,eb5]@3 f5 ~@20, eb4 ~@11", AB: "eb5 ~@47",
})).s("gm_piano").gain(0.45).pan(0.3)

// other · piano · "A.PIANO 1" · soft notes
const piano_soft = note("<~@26 A ~@50 B ~ C D E ~>".pickRestart({
  A: "~@33 ab4 ~@14", B: "~@16 eb5 ~@16 eb5@2 ~ eb5 ~@11", C: "~@22 [eb4,eb5] ~@10 eb5 eb4 ~@10 eb4 ~@2",
  D: "~@21 eb4 ~@26", E: "eb4 ~@47",
})).s("gm_piano").gain(0.26).pan(0.3)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  A B@2 A ~@10 C D E F G H I J K L M N O P Q@2 R S T U G V E F G W E F G H I J K L X@5 Y Z AA Q@2 AB AC@2 E F G H I J K
  L AD AE AD AF AG AH AI AJ AD AK AL AM AN@2
>`.pickRestart({
  A: "f1", B: "f1/2", C: "~@24 [c2,g2,eb3,c4]@4 ~@2 [c2,g2,c4]@7 ~@5 [c2,g2,c4]@6, ~@15 eb3@8 ~",
  D: "[db2,ab2,db3,f3,ab3]@3 [eb2,eb3,g3,bb3]", E: "[f2,ab3,c4,f4]", F: "[db2,ab3,db4,f4]", G: "[c2,eb3,c4,g4]",
  H: "[db2,db4,f4,ab4]", I: "[eb2,bb3,eb4,g4]", J: "[db2,f3,db4,f4]", K: "[eb2,g3,bb3,eb4]",
  L: "[db2,f3,ab3,db4]@6 [db2,f3,ab3,db4]@9 ~@3 [db2,f3,ab3,db4]@6 [db2,f3,ab3,db4]@23 ~", // Db
  M: "~@12 bb5@3 ab5, [f2,ab4,f5]", N: "bb5@6 ab5 c6, [eb2,g4,eb5]", O: "f5@12 bb5@3 ab5, [f2,ab4,c5]",
  P: "bb5@4 f6 c6 bb5 ab5, [eb2,g4,eb5]", Q: "[[f2,ab3,c4,f4] [db2,ab3,db4,f4], f5]/2", R: "[c2,eb3,g4,eb5]",
  S: "[db2,db4,f4,db5]", T: "[f2,ab3,f4,c5]", U: "[db2,ab3,f4,ab4]", V: "[db2,db3,f3,f4]@3 [eb2,g3,g4]",
  W: "[db2,db3,ab3,f4]@7 [eb2,eb3,bb3,g4]", // Db Eb
  X: "[f3@48 eb3@8 ~@17 f1@107 ~@12 [db2,ab3,f4,c5]@48, f2@227 ~@13, f1@71 ~@169, ~@56 c3@171 ~@13]/5", // Dbmaj7
  Y: "bb4@6 bb5 ab5, [c2,eb4,g4]", Z: "[bb2,ab3,db5,f5]", AA: "[c3,c4,eb4,c5]",
  AB: "[eb3,g4,eb5]@4 [eb3,g4,eb5] [eb3,g4,eb5]@2 [eb3,g4,eb5], c2", AC: "[~@2 ab5 [eb5,db6], [db2,db4,f4,db5]]/2",
  AD: "[f2,c5,ab5,f6]", AE: "[db2,db5,ab5,f6]", AF: "[db2,c5,f6,ab6]", AG: "[f2,ab4,c6,ab6]", AH: "[f2,ab4,c6,g6]",
  AI: "[f2,c5,ab5,c6]", AJ: "bb5 eb6, [f2,g4,f5]", AK: "[ab5,f6]@3 [g5,eb6], [f2,eb4]", AL: "[f2,ab5,c6,g6]",
  AM: "[f2,eb5,c6,ab6]", AN: "[[f2,c5,ab5,eb6]@7 ~]/2",
})).s("gm_string_ensemble_2").gain(0.39).pan(0.6)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~@4 A B C D E F G B E F G H A B I D J F K B A L C M A B I D A B I H A B I N A B I D J F K B ~@8 A B I D ~ A B I D J F
  K B A B A B A@9 ~
>`.pickRestart({
  A: "~ [c4,f4]@44 ~@3, ab3@15 ~", B: "~ [db4,f4]@45 ~@2, ab3@23 ~", C: "~ [c4,f4]@46 ~, ab3@11 ~",
  D: "~ [db4,f4]@44 ~@3, ab3@15 ~", E: "~ f4@23 eb4@21 ~@3, ab3@23 ~, ~ c4@45 ~@2", F: "~ [db4,f4]@45 ~@2, ab3@43 ~@5",
  G: "~ eb4@47, g3@43 ~@5, ~ c4@42 ~@5", H: "~ [db4,f4]@35 ~ [eb4,g4]@11, ab3@17 ~ bb3@5 ~",
  I: "~ [c4,eb4]@46 ~, g3@11 ~", J: "~ eb4@45 ~@2, bb3@23 ~, ~ g4@36 ~@11", K: "~ eb4@47, g3@43 ~@5, ~ bb3@42 ~@5",
  L: "~ [eb4,g4]@45 ~@2, bb3@23 ~", M: "~ [eb4,g4]@44 ~@3, bb3@15 ~",
  N: "~ [db4,f4]@41 ~ [eb4,g4]@5, ab3@40 ~@2 bb3@5 ~", // Db Eb
})).s("gm_acoustic_guitar_nylon").gain(0.45).pan(0.6)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@48 A@4 ~@4 B@2 C D ~@23>".pickRestart({
  A: "[f2,c3]/4", B: "[c5@23 ~ g5@15 f5@13 ab4@30 ~@14]/2", C: "ab5@12 ~ g5@5 eb5@17 c5@3 db5@3 ~ c5@6", D: "ab4@47 ~",
})).s("gm_overdriven_guitar").gain(0.57).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@16 A@3 B A C A D E@24 F@8 E@3 A ~ E@9 G E G E@8 A ~>".pickRestart({
  A: "x", B: "x ~ x!2", C: "x ~@12 x ~@2", D: "x ~ x ~@3 x ~ x ~@4 x ~@2", E: "x ~@2 x!2 ~@3", F: "x!2",
  G: "x!2 ~ x ~@4",
})).gain(0.57)

// drums · rim
const rim = s("rim").struct("<~@52 [~ x ~ x]!4 ~@27>").gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@24 A@28 ~@4 A@3 ~ B A@9 C A C A@8 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@8 x!8", C: "~@3 x",
})).gain(0.5)

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

// drums · low tom
const low_tom = s("lt").struct("<A@4 ~@19 B ~@23 C ~@12 B ~@7 C ~ D ~ E ~@10>".pickRestart({
  A: "x", B: "~@15 x", C: "~@9 x ~ x!2 ~@3", D: "~@3 x ~@4", E: "~@6 x ~@8 x",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@25 A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 ~@3 A@2 B ~ A@2 B ~ C ~ D ~@10
>`.pickRestart({
  A: "~@15 x", B: "~@7 x ~@8", C: "x ~@14 x", D: "x",
})).gain(0.29)

// drums · mid tom
const mid_tom = s("mt").struct("<~@23 A ~@36 B ~@9 C ~ D ~@10>".pickRestart({
  A: "~@7 x", B: "~@13 x!2 ~", C: "~ x ~@6", D: "~ x ~@5 x",
})).gain(0.43)

// drums · crash
const crash = s("cr").struct("<~@23 A B ~@3 B ~@11 B ~@7 B ~@7 B ~@4 B ~@7 B C ~ C B ~@9>".pickRestart({
  A: "x!2 ~@6", B: "x", C: "~ x ~ x ~@4",
})).gain(0.36)

// drums · high tom
const high_tom = s("ht").struct("<~@60 [~@3 x] ~@9 x ~ x ~@10>").gain(0.5)

// drums · ride
const ride = s("rd").struct(`<
  ~@24 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C ~@2 A B C D A B C D A ~ A ~ A@8 ~@2
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@12", C: "~@7 x ~@8", D: "~ x ~@3 x ~@2",
})).gain(0.36)

// drums · tambourine
const tambourine = s("tb").struct("<~@24 A@28 ~@4 A@3 ~@2 A@9 B A B A@8 ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@3 x",
})).gain(0.36)

stack(
  bass, acoustic_guitar_steel, piano, piano_soft, string_ensemble_2, acoustic_guitar_nylon, overdriven_guitar, kick,
  rim, snare, hihat, low_tom, open_hat, mid_tom, crash, high_tom, ride, tambourine
)

More by Frankie Goes to Hollywood