Strudelify

My Heart Stays With You

Backstreet Boys

KeyE♭ majorTempo90 bpm
0:00/0:00
// My Heart Stays With You — Backstreet Boys
// 90 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 82 bars on a 16-step grid, each part at one level. 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 · electric bass finger
const bass = note(`<
  ~@2 A B C D E F G H I J G K L M N O P Q R S R T U V W X Y Z AA ~ N O P AB@2 S R T U V W X Y Z AA AC AD AE AF AG AH AI
  AJ AK AL T U V W X Y Z AA T U V W X Y Z AA T U V W X Y AM@3
>`.pickRestart({
  A: "~@5 c1 eb1 c1", B: "ab1", C: "g1@5 ~ g1@2 g1@6 ab1 g1", D: "f1@5 ~ f1@2 f1@8", E: "g1@5 ~ g1 ~ g1@4 eb1@2 c1@2",
  F: "ab1@5 ~ ab1@2 ab1@3 bb1 c2@2 bb1 ab1", G: "g1@5 ~ g1 ~ g1@6 ab1 g1", H: "f1@6 c2@2 f1@7 ~",
  I: "g1@5 ~ g1@2 g1@2 c1@2 eb1@2 c1@2", J: "ab1@6 ab1@2 eb2@4 ab1@3 ~", K: "f1@3 ab1@3 f2@8 ~ f2, ~@7 eb2",
  L: "g2@3 eb2@3 bb1@3 c1 eb1 ~ eb1@2 c1@2", M: "ab1@2 ~ ab1 ~ ab1!2 ~ ab1@8", N: "g1@5 ~ g1 ~ g1@3 g1 ab1@2 g1 ~",
  O: "f1@15 c1", P: "g1@5 ~ g1 ~ g1@3 c1 eb1@2 c1@2", Q: "ab1@5 ~ ab1 ~ ab1@8", R: "g1@5 ~ g1 ~ g1@8",
  S: "f1@6 c2@2 f1@5 ~ f1 gb1", T: "ab1@2 ~ ab1 ~ eb1 ab1 ~ ab1@7 ~", U: "g1@5 ~ g1 ~ g1@4 eb1@2 g1@2",
  V: "f1@5 ~ f1@10", W: "g1@5 ~ g1@6 db2@4", X: "ab1@5 ~ ab1 ~ ab1@4 eb1@2 ab1@2", Y: "g1@5 ~ g1 ~ g1@4 e1@2 g1@2",
  Z: "f1@5 ~ f1@2 c2@4 f1@4", AA: "g1@4 ~@2 g1@2 g1@7 ~", AB: "[~@14 g1@7 ~ g1 ~ g1@8]/2",
  AC: "f1@2 ~ f1 ~@2 f1@7 ~ f1 gb1", AD: "g1@2 ~ g1 ~@2 g1@5 ~ g1@2 ab1@2", AE: "bb1@4 ~@2 bb1@9 ~",
  AF: "bb1@5 ~ bb1@4 g2@2 eb2 bb1 g1@2", AG: "f1@3 f1 ~@2 f1@3 ~ f1@2 eb2@2 f1 gb1", AH: "g1@2 ~ g1 ~@2 g1@6 ~@2 f1@2",
  AI: "bb1@2 ~ bb1 ~@2 bb1@6 f2@2 f1@2", AJ: "bb1@2 ~ bb1 ~@2 bb1@4 f2@2 bb2 c3 bb2@2", AK: "bb1@4 ~@2 bb1 ~ bb1@7 ~",
  AL: "bb1@6 c2 eb2", AM: "[f1@37 ~@11]/3",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note("<~@7 A B C@3 D E@2 ~@8 F@8 ~@8 F@8 ~@10 G H@16 I@7 ~>".pickRestart({
  A: "~@3 eb4@5, ~@3 ab3@13, ~@5 c4@11", B: "~@3 eb4@5, ~@3 g3@13, ~@5 bb3@11",
  C: "[~@6 eb4@9 ~ eb4@8 ~@4 bb3@3 ~ [c4,eb4]@14 ~@2, f3@5 g3@6 ~@5, ~@3 ab3@12 bb3@12 ~@4 ab3@15 ~@2, ~@3 f4 ~@2]/3", // Cm
  D: "~ eb4@12 ~@3, [g3,bb3]@3 ~", // Gm
  E: "[ab3@3 ~@9 ab3@3 ~@9 bb5@7 ~, bb3@12 ~@3 bb3@4 bb3@13, eb4@6 eb4@9 ~ eb4@6 eb4@10, ~@3 ab3@8 ~@4 g3@14 ~@3]/2",
  F: "[~@59 eb5@5, ~ ab4@8 ab4@10 eb5@8 eb5@16 ~@6 g4@2 eb5@8 ~@5, ~ bb4@4 bb4@4 bb4@4 bb4@4 bb4@4 bb4@4 bb4@4 bb4@3, ~@3 eb4@8 eb4@16 ~@6 ab4@2 eb4@8 eb4@16 ~@5, ~@17 g4@8 g4@16 ab4@16 g4@7]/8",
  G: "~@3 eb4@5, ~ ab4@7, ~ bb4@3",
  H: "[~@59 eb4@5, ~ ab4@10 eb5@8 eb5@16 ~@6 g4@2 eb5@8 eb5@13, ~ bb4@4 bb4@4 bb4@4 bb4@4 bb4@4 bb4@4 bb4@4 bb4@3, ~@3 eb4@16 ~@6 ab4@2 eb4@8 eb4@16 ~@6 ab4@7, ~@9 g4@8 g4@16 ab4@16 g4@15]/8",
  I: "[~@35 eb4@16 ~@5, ~ ab4@10 eb5@8 eb5@16 ~@21, ~ bb4@4 bb4@4 bb4@4 bb4@4 bb4@8 ~@3, ~@3 eb4@16 ~@6 ab4@2 eb4@8 ~@21, ~@9 g4@8 g4@16 ab4@16 ~@7]/7",
})).s("gm_acoustic_guitar_steel").gain(0.3).pan(0.2)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  ~@3 A B A B A B A B A B A B A B A B A B A B@9 ~ B A B ~ B A B@17 ~@2 B@22 ~@3
>`.pickRestart({
  A: "~@3 ab3 ~@7 ab3 ~@4", B: "~@3 g3 ~@7 g3 ~@4",
})).s("gm_electric_guitar_muted").gain(0.2).pan(0.6)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~@3 A@2 B C B C B C B C B C B C B C B C B C D E F E D E F E ~ G@2 H I C B C D E F E D E F E J@4 K E L@4 M@3 N D E F E
  D E F E D E F E D E F E D E O@3
>`.pickRestart({
  A: "[[c4,ab4] [bb3,g4], eb4]/2", B: "[c4,eb4,ab4]", C: "[bb3,eb4,g4]", D: "[ab3,bb3,eb4]", E: "[g3,bb3,eb4]",
  F: "[ab3,c4,eb4]", G: "[[eb4,g4] [c4,eb4,ab4], bb3]/2", H: "~@10 ab4@3 bb4@3, [bb3,eb4,g4]", I: "eb4 ~",
  J: "[ab3@2 g3@2 ab3@2 g3 [f3,d4], bb3, eb4@7 ~]/4", K: "[ab3,c4,f4]", L: "[eb4 d4 eb4 d4 eb4 d4 eb4@2, [f3,bb3]]/4",
  M: "[~@18 ab5@3 g5@3 f5@3 eb5@3 ~@4 c5@14, [ab3,bb3,eb4] [g3,bb3,eb4] [ab3,c4,eb4], ~@3 bb5@15 ~@12 f5@4 ~@14]/3", // Absus2 Eb Ab
  N: "[g3,bb3,eb4,bb4]", O: "[[ab3,c4,eb4]@37 ~@11]/3",
})).s("gm_string_ensemble_2").gain(0.2)

// other · soprano sax
const soprano_sax = note("<~@24 A B C D@2 E F ~@51>".pickRestart({
  A: "eb5@3 f5", B: "eb5@14 [c5,db5] c5", C: "bb4@15 ~", D: "[~@6 eb5@18 eb5@3 f5@5]/2",
  E: "g5@6 eb5@6 f5@3 e5, gb5 ~@15", F: "f5@3 eb5@5",
})).s("gm_soprano_sax").gain(0.08)

// chords · epiano2
const epiano2 = note(`<
  ~ A B A B C D C B E F@2 G@3 H I H I H J K L M N O P M Q R I ~ I H I S@2 K L M N O P M Q R I T J U V W X Y Z Y AA M N O
  P M Q R I M N O P M Q R I M N O P M Q AB@3
>`.pickRestart({
  A: "[c4,eb4,ab4]@15 ~", B: "[bb3,eb4,g4]@7 ~", C: "[c4,eb4,ab4]@7 ~", D: "bb3@3 bb3, [eb4,g4]@7 ~",
  E: "ab3@3 ~@3 eb4@9 ~, [f3,c4]@15 ~, eb4@3 ~@5, ~@3 ab3@12 ~", // F5
  F: "[~@16 eb4@15 ~, [g3,eb4]@14 ~ [ab3,c4]@15 ~@2, bb3@6 bb3@3 ~@7, ~@4 f4@5 ~@7]/2", // Cm Ab
  G: "[[g3,bb3,eb4]@13 ~@3 eb4@3 ~@9 ab3@3 ~@9 bb5@8, ~@15 ab3@3 ~ ab3@7 ~@5 g3@17, ~@16 bb3@15 ~ [bb3,eb4]@16, ~@22 eb4@9 ~@17]/3", // Eb Eb5
  H: "[ab3,c4,eb4]@13 ~@3", I: "[g3,bb3,eb4]@7 ~", J: "[g3,bb3,eb4]@13 ~@3", K: "[ab3,c4,eb4]@13 ~@3, g4@15 ~",
  L: "g3@3 g3, [bb3,eb4]@7 ~", M: "[ab3,c4,eb4]@7 ~", N: "[bb3,eb4]@3 g3, g3@5 ~@3", O: "[ab3,c4,eb4,g4]@15 ~",
  P: "g3@11 ~ g3@3 ~, [bb3,eb4]@15 ~", Q: "g3@5 ~ g3@2, [bb3,eb4]@15 ~", R: "[ab3,c4,eb4]@7 ~, g4",
  S: "[~@14 [g3,bb3,eb4]@17 ~]/2", T: "[ab3,bb3,eb4]@15 ~", U: "[ab3,c4,eb4]", V: "[ab3,c4,eb4,g4]@7 ~ [bb3,d4,f4]@8",
  W: "[ab3,c4,f4]@15 ~", X: "[g3,bb3,eb4]@15 ~", Y: "[f4,bb4,eb5]@7 ~ [f4,bb4,d5]@7 ~",
  Z: "[f4,bb4,eb5]@8 [f4,bb4,d5]@7 ~", AA: "[f4,bb4,eb5]@7 ~", AB: "[[ab3,c4,eb4]@19 ~@5, g4@5 ~]/3",
})).s("gm_epiano2").gain(0.3)

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

// drums · rim
const rim = s("rim").struct("<~ A@13 ~ A@7 ~@10 A@3 ~ A@2 ~@44>".pickRestart({
  A: "~@3 x",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@22 A B@8 C ~@3 D ~@2 A B@7 A E@3 F E@5 G E@7 H I E@6 J E@6 ~@3>".pickRestart({
  A: "~@5 x!2 ~", B: "~@3 x", C: "x", D: "x ~@2 x!2 ~@7 x ~@3", E: "~ x ~ x", F: "~@4 x ~ x ~@2 x ~@2 x ~@2 x",
  G: "x ~@2 x!5", H: "~@2 x ~ x ~@2 x ~ x ~@2 x ~@3", I: "~ x!2 ~@3 x ~", J: "~@2 x ~@2 x!2 ~",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@2 A ~@3 B ~@7 B ~@41 C ~@8 D ~@16>".pickRestart({
  A: "~@11 x!2 ~@3", B: "~@3 x", C: "~@7 x", D: "~@5 x!2 ~@9",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<A B C D B@10 E B@7 F B@8 G B@3 H B@2 F B@8 I J K L M N O P O ~ B@22 Q ~@2>".pickRestart({
  A: "~@14 x!2", B: "x ~ x!2 ~@2 x ~ x!2 ~@4 x!2", C: "x ~ x!2 ~@2 x ~ x!4 ~@2 x ~", D: "x ~ x!2 ~@4 x ~ x!2 ~@2 x!2",
  E: "x ~ x!2 ~ x ~@10", F: "x ~ x!2 ~@2 x ~ x!2 ~@2 x ~@3", G: "~ x ~@4 x!2 ~@4 x ~ x ~", H: "~@5 x!6 ~ x!4",
  I: "x ~ x ~ x ~ x!3 ~ x!3 ~@3", J: "x!3 ~ x ~ x!7 ~@3", K: "x!5 ~ x!7 ~@3", L: "x!5 ~@3 x ~ x ~ x ~ x ~",
  M: "x!4 ~@5 x!3 ~ x!2 ~", N: "x!3 ~@3 x ~ x!5 ~@3", O: "x!3 ~@3 x!7 ~@3", P: "x!4 ~@2 x!6 ~@4",
  Q: "x ~ x!2 ~@2 x ~@9",
})).gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@2 A ~@19 B ~@15 B ~@7 B ~@3 C ~@5 D ~@7 B E ~@6 B ~@9>".pickRestart({
  A: "~@11 x ~@4", B: "~@7 x", C: "~@14 x!2", D: "~@12 x!2 ~@2", E: "~ x!4 ~@11",
})).gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<~ A B@2 A@10 C A@16 D A@3 ~ A@11 E@3 F G E@4 ~ A@22 H ~@2>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x", C: "~@3 x ~@4", D: "~@2 x ~ x ~@3 x ~ x ~@4 x", E: "~@7 x", F: "~@6 x ~@8 x",
  G: "~@12 x ~@2 x", H: "~ x",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@22 A ~@15 A ~@11 B ~@5 C ~@7 D E ~@16>".pickRestart({
  A: "~@13 x ~@2", B: "~@12 x!2 ~@2", C: "~@5 x ~@2", D: "~@12 x!2 ~ x", E: "x",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@31 [~ x!2 ~ x ~@2 x!2 ~ x!3 ~ x!2] ~@24 [x!8] ~@25>").gain(0.2)

// drums · tambourine
const tambourine = s("tb").struct("<~ A ~ A@11 ~ A@7 ~@10 A@3 ~ A@2 ~@44>".pickRestart({
  A: "~@3 x",
})).gain(0.5)

// drums · splash
const splash = s("cr").struct(`<
  ~ A@15 ~@3 A ~@2 B A ~ A B A ~ A B@2 A@3 C ~ A D A ~ A B A ~ A B A@3 E F ~ A@3 G H ~ A B A ~ A B H ~ A B A ~ A B I ~ A
  B A ~ J ~@2
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@7 x", D: "x ~@2 x", E: "x ~@8 x ~@6", F: "~@3 x ~@2 x ~ x ~@7", G: "~@10 x!6",
  H: "x ~@2 x!2 ~@3", I: "x ~@2 x ~@2 x ~ x ~@7", J: "x ~ x!2 ~ x!2 ~ x!2 ~@6",
})).gain(0.3)

stack(
  bass, acoustic_guitar_steel, electric_guitar_muted, string_ensemble_2, soprano_sax, epiano2, kick, rim, snare,
  low_tom, hihat, mid_tom, open_hat, high_tom, ride, tambourine, splash
)

More by Backstreet Boys