Strudelify
Heart cover art

Actually

Heart

Pet Shop Boys

KeyA minorTempo126 bpm
0:00/0:00
// Heart — Pet Shop Boys
// 126 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 130 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(126/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.

// other · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@17 A ~@3 A ~@15 A ~@3 B C@2 D E F@2 G H ~@3 A ~@10 I J@3 K ~@3 A ~@3 A@5 ~@3 B C@2 D E F@2 G L ~@3 A ~@12 A ~@3 A@2
  ~ A ~ A@2 ~ A ~ A ~ A@4 ~
>`.pickRestart({
  A: "~@10 [e5,e6]@2 [e5,g5,e6,g6] [b5,d6,b6,d7] [e6,e7]@2", B: "~@6 a5@4 a5@2 g5@3 ~", C: "[e5@7 c5]/2", D: "d5",
  E: "e5@6 a5@4 a5@2 g5@3 ~", F: "[a5@21 ~ a5@4 a5@2 g5@3 ~]/2", G: "a5@10 ~@2 c6@3 ~", H: "d6@13 ~@3",
  I: "~@3 [e5,e6] ~ [d5,d6] ~ [g5,g6]", J: "[a5,a6] ~@6 [g5,g6]", K: "[a5,a6] ~@7",
  L: "d6@6 ~@4 [e5,e6]@2 [e5,g5,e6,g6] [b5,d6,b6,d7] [e6,e7]@2", // E Em Bm E
})).s("gm_synth_strings_1").gain(0.42)

// bass · slap bass 2 · "SLAPBASS 2"
const bass = note(`<
  ~@2 A B C D A E C F G H I J A K A K A K A K L B C M L B C M G H I J A K A K N@2 O P N@2 O P G H I J A K A K A K Q R S
  Q ~@4 T U@4 A K A K A K A K@5 L B C M A V C W G H I J A K A K Q R X Q Y Z AA AB AC A K A K A K A K@2 B K B K B ~ K B K
  B K B K B ~
>`.pickRestart({
  A: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ g1@2", B: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1@2",
  C: "d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1@2", D: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ g1@2",
  E: "a1 a2 a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a2@2", F: "e1 e2 e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ g1@2",
  G: "d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~ d1 ~", H: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~",
  I: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~", J: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~",
  K: "d1 ~ d1 ~ d1 ~ d1 ~ e1 ~ e1 ~ e1 ~ e1@2", L: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~",
  M: "e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1@2", N: "a1!8", O: "d1!8", P: "e1!8", Q: "f1@13 ~@3", R: "e1@13 ~@3",
  S: "f#1@13 ~@3", T: "~@6 e1 g1", U: "a1@2 a1 a2 a1@2 a1@2 a1@2 a1@2 a1@2 a2@2",
  V: "a1 a2 a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1@2", W: "e1 e2 e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1 ~ e1@2", X: "f#1@5 c#2 f#2 c#2",
  Y: "a1@3 ~ a2@3 ~ a2@3 ~ a2@3 ~", Z: "d2@3 ~ d2@3 ~ e2@3 ~ e2@3 ~", AA: "a2@3 ~ a2@3 ~ a2@3 ~ a2@3 ~",
  AB: "d2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~", AC: "e2@3 ~ e2@3 ~ e2@3 ~ e1@2 g1@2",
})).s("gm_slap_bass_2").gain(0.42)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@10 A B C D ~@3 E ~@3 E ~@15 E ~@15 E ~@4 F G H I H A J ~@7 E ~@3 E@5 ~@11 E ~@3 E H K F G H I H A J ~@3 E ~@3 E@2 ~
  E ~ E@2 ~ E ~ E ~ E@4 ~
>`.pickRestart({
  A: "~@2 [f4,a4,d5]!4 ~@2 [f4,a4,d5] ~@2 [f4,a4,d5] ~@2 [f4,a4,d5]@2", // Dm
  B: "~@2 [g4,b4,e5]!4 ~@2 [g4,b4,e5] ~@2 [g4,b4,e5] ~@2 [g4,b4,e5]@2", // Em
  C: "~@2 [a4,c5,f5]!4 ~@2 [a4,c5,f5] ~@2 [a4,c5,f5] ~@2 [a4,c5,f5]@2", // F
  D: "[c5,d5,g5]!4 ~@3 [c5,d5,g5] [b4,d5,g5]!4 ~@4", E: "~@5 [e4,e5]!2 [e5,e6]",
  F: "~@2 [f#4,a4,c#5]!4 ~@2 [f#4,a4,c#5] ~@2 [f#4,a4,c#5] ~@2 [f#4,a4,c#5]!2", // F#m
  G: "~@2 [f4,a4,c5]!4 ~@2 [f4,a4,c5] ~@2 [f4,a4,c5] ~@2 [f4,a4,c5]@2", // F
  H: "~@2 [e4,a4,c5]!4 ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5]@2", // Am
  I: "~@2 [f4,a4,d5]!4 ~@2 [e4,b4,d5] ~@2 [e4,b4,d5] ~@2 [e4,b4,d5]@2", // Dm E7
  J: "~@2 [e4,b4,d5]!4 ~@2 [e4,b4,d5] ~@2 [e4,b4,d5] ~@2 [e4,b4,d5]@2", // E7
  K: "~@2 [e4,g4,b4]!4 ~@2 [e4,g4,b4] ~@2 [e4,g4,b4] ~@2 [e4,g4,b4]@2", // Em
})).s("gm_acoustic_guitar_steel").gain(0.29)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1_2 = note(`<
  ~@10 A B A C D E D E D E D E F@2 G H F@2 G H A B A C D E D E F@2 G H F@2 G H A B A C D E D E D E I J K L M N M O P ~@8
  D E D E@5 F@2 G H F@2 G H A B A C D E D E I J K L M N M O P D E D E D E D E@2 D E D E D ~ E D E D E D E D ~
>`.pickRestart({
  A: "[f3,a3,c4]@2 f3 [f3,a3,c4], d3@13 ~@3", B: "[g3,b3,d4]@2 g3 [g3,b3,d4], e3@13 ~@3",
  C: "c4 b3, [g3,d4], g2@13 ~@3", D: "[a2,e3,g3,c4]@15 ~", E: "[d3,f3,a3,c4] [e3,g3,b3,d4]",
  F: "[[a2,g3,c4,e4]@31 ~]/2", G: "[d3,a3,d4,f4]@15 ~", H: "[e3,b3,e4,g4]@15 ~", I: "[f2,c3,a3,e4]@15 ~",
  J: "[e2,b2,g3,d4]@15 ~", K: "f#2@5 c#3 f#3 c#3, [a3,e4]@13 ~@3", L: "[f2,c3,a3,d4]@15 ~",
  M: "a2@3 ~ a2@3 ~ a2@3 ~ a2@3 ~, [e3,a3,c4]@15 ~", N: "d2@3 ~ d2@3 ~ e2@3 ~ e2@3 ~, [a3,d4,f4] [b3,e4,g4]",
  O: "d2@3 ~ d2@3 ~ d2@3 ~ d2@3 ~, [a3,d4,f4]@15 ~", P: "e2@3 ~ e2@3 ~ e2@3 ~ e2@2 g2@2, [d4,e4,g4]@15 ~",
})).s("gm_synth_strings_1").gain(0.29)

// other · orchestra hit · "ORCH.HIT"
const orchestra_hit = note(`<
  ~@17 A ~@3 A ~@15 A ~@15 A ~@18 A ~@3 A@5 ~@11 A ~@3 A ~@12 A ~@3 A@2 ~ A ~ A@2 ~ A ~ A ~ A@4 ~
>`.pickRestart({
  A: "~@5 [e3,e4]!2 [e4,e5]", // E
})).s("gm_orchestra_hit").gain(0.42)

// drums · kick
const kick = s("bd").struct("<A@64 B A@40 B A@11 C A C ~ A@3 C A@3 C ~>".pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x ~ x!2",
})).gain(0.49)

// drums · snare
const snare = s("sd").struct(`<
  ~@10 A@3 B A@7 B A@11 C A@15 C A@14 D A@7 E A@19 C A@12 D A@7 E@2 F E A E G ~ E F E A E F E H ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x ~@2 x ~@2 x ~", C: "~@4 x ~@2 x ~@2 x ~ x!3 ~", D: "~@4 x ~@2 x ~@4 x ~ x ~",
  E: "~@2 x!4 ~@2 x ~@2 x ~@2 x ~", F: "~@4 x ~@7 x ~@2 x", G: "~@2 x!4 ~@2 x ~@2 x!2 ~ x ~",
  H: "~@2 x ~ x ~@3 x ~@2 x ~@2 x ~",
})).gain(0.49)

// drums · clap
const clap = s("cp").struct("<~@2 [~@7 x]!12 ~@116>").gain(0.42)

// drums · low tom
const low_tom = s("lt").struct("<~@117 A ~ A ~@4 A ~@3 B ~>".pickRestart({
  A: "~@11 x ~@2 x ~", B: "~@11 x!2 ~ x ~",
})).gain(0.42)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@55 A ~@61 B ~ B ~@4 B ~@3 B ~>".pickRestart({
  A: "~@3 x", B: "~@5 x ~@2 x ~@7",
})).gain(0.42)

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

// drums · high tom
const high_tom = s("ht").struct("<~@55 A ~@61 B ~ B ~@4 B ~@3 B ~>".pickRestart({
  A: "~@5 x ~@2", B: "~@2 x!3 ~@11",
})).gain(0.42)

// drums · crash
const crash = s("cr").struct(`<
  ~@14 A ~@3 A ~@15 A ~@15 A ~@3 A ~ A ~@8 A ~@3 A ~@3 A ~@3 A ~@15 A ~@3 A ~@8 A ~@3 A ~@18 A
>`.pickRestart({
  A: "x",
})).gain(0.42)

// drums · tambourine
const tambourine = s("tb").struct("<~@114 [~ x ~ x ~ x ~ x]!6 ~ [~ x ~ x ~ x ~ x]!8 ~>").gain(0.42)

// drums · cowbell
const cowbell = s("cb").struct("<~@14 A@8 ~@12 A@4 ~@12 A@6 ~@9 A@16 ~@12 A@4 ~@9 A@14 ~ A@8 ~>".pickRestart({
  A: "~@4 x ~@2 x ~@2 x ~@5",
})).gain(0.42)

// drums · bongos
const bongos = s("bongo:18").struct("<[x!16]!120 ~ [x!16]!8 ~>").gain(0.92)

// drums · congas
const congas = s("conga:33").struct("<~@2 [~@2 x ~ x!2 ~@10]!12 ~@116>").gain(1.12)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@22 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@34 A ~@3 A ~@3 A ~@39 A>".pickRestart({
  A: "x!12 ~@4",
})).gain(1.42)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@22 A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@34 A ~@3 A ~@3 A ~@39 A
>`.pickRestart({
  A: "~@12 x!4",
})).gain(0.71)

stack(
  synth_strings_1, bass, acoustic_guitar_steel, synth_strings_1_2, orchestra_hit, kick, snare, clap, low_tom, hihat,
  mid_tom, open_hat, high_tom, crash, tambourine, cowbell, bongos, congas, cabasa, cabasa_soft
)

More by Pet Shop Boys