Strudelify
Listen to Your Heart cover art

1988 · Look Sharp!

Listen to Your Heart

Roxette

KeyB majorTempo86 bpm
0:00/0:00
// Listen to Your Heart — Roxette
// 86.4 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 6 "Piano-Solo" named as a piano, played on piano (its distortion guitar patch is not one)
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(86.4/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 · piano · "Piano-Solo"
const piano = note("<~@31 A@3 ~@10 B C@2 D E F G H@2 I J K L ~ M N ~@57>".pickRestart({
  A: "[~@8 a3 b3 d4@2 d4@2 a3@24 ~@10]/3", B: "b4",
  C: "[a#4 [g#4,a4] [f#4,g4] [e4,f4] [d4,d#4] [c4,c#4] b3@4 b3@10 ~@6 c#4@4 ~@2]/2", D: "~ e4 a4 f#4@5",
  E: "f#5@4 e5 f#5 e5@5 d5 b4@3 a4", F: "f#4@2 d4 d4@4 c#5", G: "d5 c#5 b4 b4@2 a4 g4 f#4",
  H: "[e4@2 d4 e4@2 d4 c#4 b3@4 ~@5]/2", I: "~@4 e3 d#3 b2 c3", J: "c#3@3 ~@5", K: "~@4 e3 d#3 c#3 c3", L: "b2@3 ~@5",
  M: "~@14 b2!2", N: "c#3@3 ~",
})).s("gm_piano").gain(0.56)

// other · piano · "Piano-Solo" · soft notes · Dmaj7
const piano_soft = note("<~@46 [~@14 [a3,a#3,b3,c4] [d#3,e3,f3,f#3,g3,g#3]] [[c#3,d3] ~@15] ~@69>")
  .s("gm_piano").gain(0.32)

// chords · piano · "Piano-Melodie"
const piano_2 = note(`<
  A B C D E F G H I J I J K J L M N O P Q@2 R S T U V W X I Y I J K J K Z AA AB AC Q@2 R AD AE AD AF AD AF AD AF AD AG
  AH AI AJ@2 AK AL AK AJ AM AN AM AN@2 AO AM AP AM AN AM AN@2 AO AM AQ@2 AR AS AT AU AV AW AX AY AZ BA AZ BA AZ BA AZ BA
  AZ BA AZ BA BB BC BD BE BB BC BD BE BB BC BD BE ~@8
>`.pickRestart({
  A: "~@2 b3@2 d4@2 a4 ~@3 g4@4 f#4@2, [b2,f#3]@3 [g2,d3]@5", B: "e4 ~@3 d4@2 [b2,f#3]@10, [a2,e3]@6 f#4 ~@9",
  C: "c#4 d4 a4 f#4 e4 d4 b3 ~@7 a3 b3, [b2,f#3]@3 [g2,d3]@5", D: "c#4 ~@3 e4@2 d4 ~@2 c#4 b3@6, [a2,e3]@3 [b2,f#3]@5",
  E: "~@2 [f#3,b4]@2 [b3,d5]@2 a5 ~@3 g5@4 f#5@2, b2@3 [g2,d3,g3]@5", // B5 Bm G5
  F: "e5 ~ e3@2 [a3,d5]@2 [b2,f#3,b3]@10, g2@6 f#5 ~@9", G: "c#5 d5 a5 f#5 e5 d5 b4 ~@7 b4 d5, [b2,f#3]@3 [g2,d3]@5",
  H: "[e2,b2,e3], e5 ~@15", I: "[b2,d3,f#3,b3,d4]@3 [g2,d3,g3,b3]@5", J: "[a2,e3,a3,c#4]@3 [b2,d3,f#3,b3]@5",
  K: "[b2,d3,f#3,b3]@3 [g2,d3,g3,b3]@5", L: "[b2,d3,f#3,b3]@6 g3@8 g3 a3, ~@3 [g2,d3,b3]@5",
  M: "[e3,g3,b3,e4,g4]@12 e3 f#3 e3 d3", N: "e3 ~@5 [g2,g3]@10, [b2,b3]@3 ~@5, ~ d3@11 ~@4",
  O: "[d3,d4]@6 ~@6 e3 f#3 e3 d3, ~@3 [a2,a3]@5", P: "e3 ~@5 [g2,g3]@10, [b2,b3]@3 ~@5, ~ d3@10 ~@5",
  Q: "[d3,d4]@3 [a2,a3]@5", R: "[g2,g3]@3 [d3,d4]@5", S: "[b2,b3]@6 ~@8 a3 b3, ~@3 [g2,g3]@5", T: "[a2,a3], c#4@3 ~@5",
  U: "~ b4 d5 a5@2 g5@2 f#5, [b2,b3]@3 [g2,g3]@5", V: "e5@2 d5 [b2,b3,f#5]@5, [a2,a3]@3 ~@5",
  W: "c#5 d5 a5 f#5 e5 d5 b4@8 a4 b4, [b2,b3]@3 [g2,g3]@5", X: "c#5@4 e5@2 d5@3 c#5 b4@4 f#4 e4, [a2,a3]@3 [b2,b3]@5",
  Y: "[a2,e3,a3,c#4]@6 ~@8 f#4 e4, ~@3 [b2,d3,f#3,b3]@5", Z: "[e3,g3,b3,e4,g4]@12 e4 f#4 e4 d4",
  AA: "e4 ~@5 [g2,g3]@10, [b2,b3]@3 ~@5, ~ d4@11 ~@4", AB: "[d3,d4]@6 ~@6 e4 f#4 e4 d4, ~@3 [a2,a3]@5",
  AC: "e4 ~@5 [g2,g3]@10, [b2,b3]@3 ~@5, ~ d4@10 ~@5", AD: "[b2,b3]@3 [g2,g3]@5", AE: "[a2,a3]",
  AF: "[a2,a3]@3 [b2,b3]@5", // A B
  AG: "[a2,a3]@6 b3@2 [b3,c4] [c#4,d4,d#4] [e4,f4,f#4] [g4,g#4,a4] [a#4,b4,c5] [c#5,d5,d#5] [e5,f5,f#5] [g5,g#5,a5], ~@3 b2@5", // A Cmaj7
  AH: "[a#5,b5] ~@5 e3@6 e3@4, e4, e3@3 ~@5", AI: "e3@3 e3@3 e3@2, e4", AJ: "c#3@3 c#3@3 c#3@2, c#4",
  AK: "b2@3 b2@3 b2@2, b3", AL: "a2@3 a2@3 a2@2, a3", AM: "[d#3,d#4]@3 [b2,b3]@5", AN: "[f#2,f#3]@3 [c#3,c#4]@5",
  AO: "[b2,b3]@3 [f#2,f#3]@5", AP: "[c#3,c#4]@3 [c#3,c#4]@5", AQ: "[c#3@3 c#3@5 c#3@3 c#3@5, c#4]/2",
  AR: "[d#3,f#3,a#3]@3 [b2,d#3,f#3,b3]@5", AS: "[c#3,f3,g#3]@3 [d#3,f#3,a#3]@5",
  AT: "[d#3,f#3,a#3,d#4,f#4,a#4]@3 [b2,d#3,f#3,b3,d#4,f#4,b4]@5", // D#m B
  AU: "[c#3,f3,g#3,c#4,f4,g#4]@3 [d#3,f#3,a#3,d#4,f#4]@5", // C# D#m
  AV: "~ d#4 f#4 c#5@2 b4@2 a#4, [d#3,f#3,a#3]@3 [b2,d#3,f#3,b3]@5", // D#m B
  AW: "g#4@2 f#4 [d#3,f#3,a#3,d#4,a#4]@5, [c#3,f3,g#3,c#4]@3 ~@5", // D#m C#
  AX: "f4 f#4 c#5 a#4 g#4 f#4 d#4@8 d#4 f#4, [d#3,f#3,a#3,d#4]@3 [b2,d#3,f#3,b3]@5", AY: "[g#2,d#3,g#3,b3,d#4,g#4]",
  AZ: "[d#2,d#3]@3 [b1,b2]@5", BA: "[c#2,c#3]@3 [d#2,d#3]@5", BB: "~ d#4 f#4 c#5@2 b4@2 a#4, [d#2,d#3]@3 [b1,b2]@5",
  BC: "g#4@2 f#4 [d#2,d#3,a#4]@5, [c#2,c#3]@3 ~@5", BD: "f4 f#4 c#5 a#4 g#4 f#4 d#4@8 c#4 d#4, [d#2,d#3]@3 [b1,b2]@5",
  BE: "f4@4 g#4@2 f#4@3 f4 d#4@6, [c#2,c#3]@3 [d#2,d#3]@5", // C# D#
})).s("gm_piano").gain(0.47)

// chords · overdriven guitar · "Guitare-Mi"
const overdriven_guitar = note(`<
  ~@16 A B A B@2 C A D A E A E ~@8 A B A B@2 C A D A E A E A E A D F@2 G@2 H D H G I J I J@2 K I G I J I J@2 K I L@2 ~@8
  I M I M I M I M I M I M I M I M I M I M I M I M ~@8
>`.pickRestart({
  A: "[b2,b3,f#4]@3 [g3,g4]@5", B: "[a3,f#4]@3 [a2,a3,e4]@5", C: "[b2,g3,g4]@3 [a3,f#4]@5", D: "[a2,a3,e4]",
  E: "[a2,a3,e4]@3 [b2,b3,f#4]@5", F: "[b2,g#3,e4]", G: "[c#3,c#4,g#4]", H: "[b2,b3,f#4]",
  I: "[d#3,d#4,a#4]@3 [b2,b3,f#4]@5", J: "[c#3,a#3,f#4]@3 [c#3,c#4,g#4]@5", K: "[b2,b3,f#4]@3 [c#3,a#3,f#4]@5",
  L: "[c#3,c#4,g#4]/2", M: "[c#3,c#4,g#4]@3 [d#3,d#4,a#4]@5",
})).s("gm_overdriven_guitar").gain(0.49).pan(0)

// chords · overdriven guitar · "Guitare-Si"
const overdriven_guitar_2 = note(`<
  ~@16 A B A B@2 C A D A E A E ~@8 A B A B@2 C A D A E A E A E A D F@2 G@2 H D H I J K J K@2 L J I J K J K@2 L J M@2 ~@8
  J N J N J N J N J N J N J N J N J N J N J N J N ~@8
>`.pickRestart({
  A: "[f#3,d4]@3 [g2,d3,b3]@5", B: "[d3,d4]@3 [e3,c#4]@5", C: "[g2,d3,b3]@3 [d3,d4]@5", D: "[e3,c#4]",
  E: "[e3,c#4]@3 [f#3,d4]@5", F: "[e2,e3,b3]", G: "[g#3,e4]", H: "[f#3,d#4]", I: "[g#3,f4]",
  J: "[a#3,f#4]@3 [f#3,d#4]@5", K: "[f#2,f#3,c#4]@3 [g#3,f4]@5", L: "[f#2,f#3,d#4]@3 [f#3,c#4]@5", M: "[g#3,f4]/2",
  N: "[g#3,f4]@3 [a#3,f#4]@5", // C# D#m
})).s("gm_overdriven_guitar").gain(0.48).pan(1)

// bass · electric bass finger · "Guitare-Basse"
const bass = note(`<
  ~@16 A B A B@2 C A D A E A E A E A F A F A G A B A B@2 C A D A E A E A E A D H@2 I@2 J K J I L M L M@2 N L O L M L M@2
  N L O@2 ~@8 L P L P L P L P L P L P L P L P L P L P L P L P ~@8
>`.pickRestart({
  A: "b2@3 g2@5", B: "d3@3 a2@5", C: "g2@3 a2@5", D: "a2", E: "a2@3 b2@5", F: "a2@3 b2@4 b2", G: "e3",
  H: "e3@3 e3@3 e3@2", I: "c#3@3 c#3@3 c#3@2", J: "b2@3 b2@3 b2@2", K: "a2@3 a2@3 a2@2", L: "d#3@3 b2@5",
  M: "f#2@3 c#3@5", N: "b2@3 f#2@5", O: "c#3@3 c#3@5", P: "c#3@3 d#3@5",
})).s("gm_electric_bass_finger").gain(0.54)

// other · koto · "Cy&Ko&EH"
const koto = note("<~@8 A B C A@2 D A ~@13 A B C A@2 D A ~@82>".pickRestart({
  A: "~@2 b3 ~ b4 ~ b3 ~@3 b3 ~ b4 ~ b3 ~", B: "~@2 b3 ~ b4 ~ b3 ~@5 b3 d4 f#4 a4",
  C: "b4 ~ b3 ~ b4 ~ b3 ~@3 b3 ~ b4 ~ b3 ~", D: "~@2 b3 ~ b4 ~ b3 ~@7 e4 b4",
})).s("gm_koto").gain(0.32)

// other · distortion guitar · "Cy&Ko&EH"
const distortion_guitar = note("<~@45 A@2 ~@70>".pickRestart({
  A: "[~@7 e4@2 e4@2 e4@2 ~@3]/2",
})).s("gm_distortion_guitar").gain(0.32)

// other · pad metallic · "Pad 6 (metallic)"
const pad_metallic = note("<~@15 A ~@4 B@2 ~@13 A ~@4 B@2 ~@10 C@2 D@2 E@4 ~@57>".pickRestart({
  A: "b4", B: "d6/2", C: "[e5@7 ~]/2", D: "[c#5@7 ~]/2", E: "[b4@7 ~]/2",
})).s("gm_pad_metallic").gain(0.42).pan(0.6)

// other · taiko drum
const taiko_drum = note(`<
  ~@4 A B A C A B A D A D A C ~@61 E F E F E F E G H I H I H I H I H I H I H I H I H I H I H I H I ~@8
>`.pickRestart({
  A: "b3 ~", B: "a3 ~", C: "e3 ~", D: "g#3 ~", E: "d#4 ~@3", F: "c#4 ~@3", G: "g#3 ~@3", H: "d#4@3 b3@5",
  I: "c#4@3 d#4@5",
})).s("gm_taiko_drum").gain(0.36)

// other · contrabass · "Contrebass"
const contrabass = note(`<
  ~@52 A@2 B@2 C D C B E F E F G H I J E F E F G H I K@2 ~@8 E L M L E L M L E L M L N O P O N O P O N O P O N O P O N O
  P O
>`.pickRestart({
  A: "e3@3 e3@3 e3@2", B: "c#3@3 c#3@3 c#3@2", C: "b2@3 b2@3 b2@2", D: "a2@3 a2@3 a2@2", E: "d#3@3 b2@5",
  F: "f#2@3 c#3@5", G: "f#2 c#3 f#3 c#3@5", H: "b2 d#3 f#3 f#2@5", I: "d#3@2 d#3 b2@5", J: "c#3!3 c#3@5",
  K: "c#3@3 c#3@5", L: "c#3@3 d#3@5", M: "d#3@2 c#3 b2@5", N: "d#4!3 b3!5, d#3@3 b2@5", O: "c#4!3 d#4!5, c#3@3 d#3@5",
  P: "d#4!2 [c#3,d#4] b3!5, d#3@2 ~ b2@5", // C#sus2
})).s("gm_contrabass").gain(0.32).pan(0.7)

// chords · string ensemble 1
const string_ensemble_1 = note("<~@97 A B C D A B C D A B C D A B C D A B C D>".pickRestart({
  A: "d#4 [d#4,d#5] [d#4,f#5] b3!4 [b3,a#5], ~@3 c#6@2 b5@2 ~", B: "c#4!2 [c#4,f#5] d#4!5, g#5@2 ~ a#5@5",
  C: "f5 f#5 c#6 a#5 g#5 f#5 b3@2 b3@2 b3@2 b3@2 c#5 d#5, d#4!3 d#5@4 b3",
  D: "c#4@2 c#4@2 [c#4,g#5]@2 [d#4,f#5]@2 ~ f5 d#4@2 d#4@2 d#4@2, f5@2 ~@2 d#4 d#5@3", // C#5 D#m
})).s("gm_string_ensemble_1").gain(0.36).pan(0.3)

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

// drums · rim
const rim = s("rim").struct("<~@8 [~@3 x ~@2 x ~]!7 ~@62 [x!4]!7 x ~@32>").gain(0.54)

// drums · rim · soft notes
const rim_soft = s("rim").struct("<[x ~@2 x ~@4]!4 [~@3 x ~@4] ~ [~@3 x ~@4] ~@110>").gain(0.23)

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

// drums · hihat
const hihat = s("hh").struct(`<
  ~@8 A@7 B C D@2 E F D G ~ D@3 E C D@6 H C D@2 G F D G ~@32 F G I J I J I ~@35
>`.pickRestart({
  A: "x!8", B: "~ x ~ x ~ x ~@2", C: "~@3 x!3 ~ x", D: "x!2 ~ x!3 ~ x", E: "x!2 ~ x!2 ~@3", F: "~ x ~ x!3 ~ x",
  G: "x!2 ~ x!3 ~@2", H: "x!2 ~@6", I: "~ x ~ x", J: "~ x ~@2",
})).gain(0.54)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 A ~@15 B C ~@6 D C ~@6 E C ~@6 E C ~@48>".pickRestart({
  A: "~@10 x ~@3 x!2", B: "~@7 x!2 ~ x ~ x!4", C: "x", D: "~@8 x ~ x ~ x!4", E: "~@12 x!4",
})).gain(0.54)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@15 A B@3 C B@3 ~ B@3 D B@5 E B C B@7 ~ F G@6 H ~@23 B@2 ~ I ~ I ~ B@2 ~ F G@2 J F K G K F G@2 L G@12 ~@8
>`.pickRestart({
  A: "x!3 ~", B: "~ x ~ x", C: "~ x ~@2", D: "~@2 x ~@4 x", E: "~ x!2 ~@3 x ~", F: "~ x!7", G: "x!8", H: "x!4 ~@4",
  I: "~@3 x", J: "x!7 ~", K: "x!6 ~@2", L: "x!6 ~ x",
})).gain(0.7)

// drums · crash
const crash = s("cr").struct(`<
  ~@16 A ~@3 A ~@3 A ~@11 A ~@3 A ~@2 A@2 ~@3 A ~@3 A ~ A ~ A ~ A@3 ~@7 A ~@3 A ~@2 A ~@9 A ~@3 A B A B A ~@3 A ~@3 A
  ~@3 A ~@11
>`.pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.78)

// drums · ride
const ride = s("rd").struct("<~@52 A B C B A B C D A B@6 E A B@2 F A B F ~@42>".pickRestart({
  A: "~ x!7", B: "x!8", C: "~@2 x ~ x ~ x ~ x ~ x ~ x ~ x!2", D: "x!5 ~@3", E: "x ~@2 x!2 ~@3", F: "x!7 ~",
})).gain(0.7)

// drums · tambourine
const tambourine = s("tb").struct("<~@36 A@6 B ~ C@7 ~@24 C@2 ~ C ~ C ~ C ~@34>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2", C: "~@3 x",
})).gain(0.54)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@8 A ~ A ~ A ~ A ~@102>".pickRestart({
  A: "~@3 x ~@4",
})).gain(1.96)

// … 15 more lines

More by Roxette