Strudelify

Can't Stay Away From You

Gloria Estefan

KeyD majorTempo72 bpm
0:00/0:00
// Can't Stay Away From You — Estefan Gloria
// 72 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 77 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(72/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@8 A B A C A B A C D C A C E B F C G H I J G K L M K M N O P Q R@2 A B A C A B A C D C A C E B F C G H I J G K L M K
  M N O P Q R@2 P Q S T@2
>`.pickRestart({
  A: "f#2@4 ~@11 f#2", B: "g2 ~@3", C: "a2 ~@3", D: "g2@4 ~@11 g2", E: "g2@4 ~@11 d2", F: "a2@4 ~@11 e2",
  G: "g2 ~@2 g2 ~@2 g2@7 ~@3", H: "a2 ~@2 a2 ~@2 a2@7 ~@3", I: "d2 ~@2 d2 ~@2 d2@6 a1@4",
  J: "d2 ~@2 d2 ~@2 d2@7 ~ d2 e2", K: "g2 ~@2 g2 ~@2 g2@9 ~", L: "a2@2 ~ a2 ~@2 a2@8 ~@2", M: "a2 ~@2 a2 ~@2 a2@10",
  N: "b2@2 a2 d3", O: "g2", P: "d2", Q: "a2", R: "d2/2", S: "d3", T: "[~ d3@7]/2",
})).s("gm_acoustic_bass").gain(0.56)

// other · piano · "A.PIANO 1"
const piano = note(`<
  ~@24 A B C D@2 B E F@2 G@2 H I J K L ~@8 M N@2 ~ M O ~ P A B C D@2 B E F@2 G@2 H I J K@2 I Q R@2 ~
>`.pickRestart({
  A: "d5@2 a3 b3 ~ d4 ~ f#4@2 g4 f#4 d4 a3@4, ~@6 d5 ~", B: "d5@2 a3 b3@2 d4@2 f#4@2 f#4@2 g4 a4 g4 f#4@2",
  C: "d5@2 a3 b3@2 d4@2 f#4@2 g4 f#4 d4 a3@4, ~@6 d5 ~",
  D: "[d5@2 a3 b3@2 d4@2 f#4 ~ f#4 ~ d4 b3 f#4 d4 ~ d5@2 a3 b3@2 d4@2 f#4@2 g4 f#4 d4 a3@4, ~@15 b3@2 ~@11 d5@2 ~@2]/2",
  E: "d5@2 a3 b3@2 d4@2 f#4@2 g4 f#4 d4 b3@4, ~@6 d5 ~",
  F: "[d5@2 a3 b3@2 d4@2 f#4 ~ f#4 ~ d4 b3 f#4 d4 ~ d5@2 a3 b3@2 d4@2 f#4@2 g4 f#4 d4 b3@4, ~@15 b3@2 ~@11 d5@2 ~@2]/2",
  G: "[d5@2 a3 b3@2 d4@2 f#4 ~ f#4@2 g4 a4 g4 f#4@4 a3 b3@2 d4@2 f#4@2 g4 f#4 d4 b3@4]/2",
  H: "a3@3 b3@3 f#3@3 a3@3 e3@2 f#3@2", I: "d3@2 a3 d4@2 e4@2 f#4@2 a4@2 b4 d5@4",
  J: "a3@2 e4 a4@2 g4@2 b4@2 d5@2 a4 c#5@4", K: "d4@2 e4 f#4@2 a4@2 d5@5 b4@2 a4@2", L: "d4@2 e4 f#4@2 a4@2 d5@9",
  M: "[a4,a5]@13 [a4,a5]@3", N: "[a4,a5]", O: "[a4,a5]@13 ~@3", P: "~ [a4,a5]!3",
  Q: "a3@2 e4 a4@2 g4@2 b4@2 d5@2 g4 c#5@4",
  R: "[d4@2 e4 ~@2 f#4@2 a4@2 ~ d5@2 f#4@2 ~ b4@2 a4@2 ~ [f#4,a4,d5]@4 ~@8]/2", // D
})).s("gm_piano").gain(0.41)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~@5 A@2 B ~@2 C@2 ~@2 D@2 E@6 F@2 ~@8 G@2 H ~@7 I@2 ~@2 D@2 J@2 E@2 K@2 L@2 M@2 N@2 O P Q R S@2 T@2 ~@9
>`.pickRestart({
  A: "[~@4 d5@5 ~@7, ~@5 f#4@13 ~@14, ~@3 g4@6 ~@7, ~@7 b4@11 ~@14]/2", B: "~@3 a4@5, a3, ~ e4@7, ~@3 c#5@13",
  C: "[~@15 c#5@17, ~@5 a3@11, ~@11 e4@21, ~@13 a4@19]/2",
  D: "[~@18 a4@13 ~, ~@10 e4@21 ~, ~@11 a4@7 ~@14, ~@13 b4@18 ~, ~@15 c#5@16 ~]/2",
  E: "[~@7 a4@7 ~@2, ~@3 a5@11 ~@2, ~@2 f#5@5 ~, ~@11 d5@17 ~@4]/2",
  F: "[~@7 a4@3 ~@6, ~@3 a5@7 ~@6, ~@2 g5@3 ~@3, ~@11 e5@9 ~@12]/2",
  G: "[~@6 a5 ~ f#5 ~@5 a4@10 f#5 ~@2 d5 ~@2 f#5 ~, ~@11 d5@14 ~@7]/2", H: "a4 ~@15",
  I: "[~@15 c#5@16 ~, ~@10 a3@21 ~, ~@11 e4@20 ~, ~@13 a4@18 ~]/2",
  J: "[~@7 a4@5 ~@4, ~@3 a5@9 ~@4, ~ f#5@2 ~, ~@11 d5@13 ~@8]/2",
  K: "[~@7 a4@4 ~@5, ~@3 a5@8 ~@5, ~@4 f#5@7 ~@5, ~@11 d5@11 ~@10]/2",
  L: "[~@7 a4@4 ~@5, ~@3 a5@8 ~@5, ~@4 g5@7 ~@5, ~@11 e5@11 ~@10]/2",
  M: "[~@6 a5 ~@7 a4@9 ~ f#5 ~@2 d5 ~@2 a4 ~, ~@8 f#5@15 ~@9, ~@11 d5@12 ~@9]/2",
  N: "[~@14 a4@8 ~@2 f#5 ~@2 d5 ~@2 b4 ~, ~@3 a5@8 ~@5, ~@4 f#5@7 ~@5, ~@11 d5@11 ~@10]/2",
  O: "~@11 d5@3 a4 ~, a4@7 ~, ~@6 a5@9 ~, ~@8 f#5@7 ~", P: "~@8 f#5 ~@2 d5 ~@2 a4 ~",
  Q: "~@11 d5@3 a4 ~, ~@6 a5@9 ~, ~@8 f#5@7 ~", R: "~@6 a5 ~ g5 ~@2 e5 ~@2 a4 ~",
  S: "[~@14 a4@10 f#5 ~@2 d5 ~@2 f#5 ~, ~@3 a5@9 ~@4, ~ f#5@2 ~, ~@11 d5@13 ~@8]/2", T: "a4/2",
})).s("gm_acoustic_guitar_nylon").gain(0.53)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@4 A B A C A B A C A B A C B@2 A C B@2 D E F G H@2 F@2 I J B@3 K L M N ~ A B A C A B A C B@2 A C B@2 D E F G H@2 F@2
  I J B@3 K L M N O P Q R S ~
>`.pickRestart({
  A: "[a4,c#5,f#5] ~ [a4,c#5,f#5] ~ [a4,c#5,f#5] ~ [a4,c#5,f#5] ~", // F#m
  B: "[b4,d5,f#5] ~ [b4,d5,f#5] ~ [b4,d5,f#5] ~ [b4,d5,f#5] ~", // Bm
  C: "[a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~ [a4,c#5,e5] ~", // A
  D: "[b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~ [b4,d5,g5] ~", // G
  E: "[c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~", F: "[b4,d5,f#5] ~@3 [a4,d5,e5] ~@3",
  G: "[g4,b4,d5] ~@3 [a4,c#5,e5] ~@3", H: "[a4,d5,f#5] ~@3 [a4,d5,e5] ~@3", I: "[g4,b4,d5] ~@3 [g4,b4,d5] ~@3",
  J: "[a4,c#5,e5] ~@3 [a4,c#5,e5] ~@3", K: "[b4,d5,f#5] ~@7", L: "[a4,d5,f#5] ~@7", M: "[a4,d5,e5] ~@3 [g4,a4,c#5] ~@3",
  N: "[f#4,a4,d5] ~@7", O: "[d5,e5,f#5,a5] ~@3", P: "[a4,d5,f#5] ~", Q: "[a4,d5,e5] ~ [g4,a4,c#5] ~",
  R: "[f#4,a4,d5] ~@3", S: "~ [f#4,a4,d5] ~@2",
})).s("gm_rock_organ").gain(0.39)

// chords · string ensemble 2 · "SLOWSTRIN"
const string_ensemble_2 = note(`<
  ~@16 A@4 B@3 C D@2 E@2 F@2 G@2 H@4 I@2 J@2 ~@8 A@4 B@3 C D@2 E@2 F@2 G@2 H@4 I@2 K@2 L@5
>`.pickRestart({
  A: "[[b4,d5]@2 ~ e5, f#5@3 ~, ~ c#5, ~@16 a4@15 ~]/4", B: "[f#5@2 g4, [b4,d5]]/3", C: "[a4,c#5,e5]",
  D: "[[b4,d5,f#5], g4@15 ~]/2", E: "[a4,d5,f#5]/2", F: "[g4,b4,d5,f#5]/2", G: "[[g4,b4,d5] [a4,c#5], e5]/2",
  H: "[[d5,f#5], b4@31 ~]/4", I: "[f#4@2 ~ [g4,c#5], [a4,d5]@3 ~, ~ [b4,e5]]/2", J: "[[f#4,a4,d5]@13 ~@3]/2",
  K: "[f#4,a4,d5]/2", L: "[f#4@2 b4 c#5 [f#4,d5]@5 ~, a4@9 ~, d5@11 ~ g4@3 ~@25, ~ e5 ~@3]/5",
})).s("gm_string_ensemble_2").gain(0.21)

// other · orchestral harp · "HARP" · D A7 Em7 F#m7 C#m7 Gmaj7 Dmaj7 A7 …
const orchestral_harp = note(`<
  ~@31
  [~@8 [d3,e3,f#3] [g3,a3,b3,c#4] [d4,e4,f#4,g4] [e2,f#2,g2,a2] [b2,c#3,d3,e3] [f#3,g3,a3,b3] [c#4,d4,e4,f#4] [g4,a4,b4,c#5]]
  [d5 ~@15]
  ~@30
  [~@8 [d3,e3] [f#3,g3,a3,b3] [c#4,d4,e4,f#4] [e2,f#2,g2,g4] [a2,b2,c#3,d3] [e3,f#3,g3,a3] [b3,c#4,d4,e4] [f#4,g4,a4,b4]]
  [[c#5,d5] ~@15]
  ~@12
>`).s("gm_orchestral_harp").gain(0.48)

// drums · kick
const kick = s("bd").struct("<~@8 A@16 B C B C B C B C B C B ~ A ~@3 A@16 B C B C B C B C B C B ~ A ~@8>".pickRestart({
  A: "x", B: "x ~@2 x ~@2 x ~@9", C: "x ~@2 x ~@2 x ~@3 x ~@5",
})).gain(0.62)

// drums · rim
const rim = s("rim").struct("<~@9 A ~ A ~ A ~ A@9 ~@17 A ~ A ~ A ~ A@9 ~@21>".pickRestart({
  A: "~@3 x",
})).gain(0.7)

// drums · snare
const snare = s("sd").struct("<~@24 A@3 B A@3 B A@2 B ~@21 A@3 B A@3 B A@2 B ~@10>".pickRestart({
  A: "~@3 x", B: "~@9 x ~@2 x ~@3",
})).gain(0.7)

// drums · low tom
const low_tom = s("lt").struct("<~@19 A ~@3 B ~@7 C ~@2 C ~@16 A ~@3 B ~@7 C ~@2 C ~@10>".pickRestart({
  A: "~ x", B: "~@4 x ~@2 x", C: "~@7 x",
})).gain(0.62)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C D A B C D E B C F A B C D A B C G A B C F H I J K H I J K H I J ~@5 A B C F A B C D A B C G A B C F H I J K H I
  J K H I J ~@10
>`.pickRestart({
  A: "~ x!2 ~ x!2 ~ x!3 ~ x ~ x!2 ~", B: "~@2 x ~@2 x ~ x ~@4 x!3 ~", C: "~ x!2 ~ x ~@4 x!2 ~ x ~ x ~",
  D: "~@2 x!3 ~ x ~ x ~@2 x ~ x ~@2", E: "~ x!2 ~ x!2 ~ x!3 ~ x!4 ~", F: "~@2 x!3 ~ x ~ x ~@2 x ~ x ~ x",
  G: "~@2 x!3 ~ x ~ x ~@2 x ~@3 x", H: "x!5 ~ x!10", I: "x!16", J: "x!3 ~ x!12", K: "x!4 ~ x!9 ~@2",
})).gain(0.16)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  A B C D A B C D E B C D A B C D A B C D A B C D F ~ G H F ~ G H F ~ G ~@5 A B C D A B C D A B C D A B C D F ~ G H F ~
  G H F ~ G ~@10
>`.pickRestart({
  A: "x ~@2 x", B: "~ x ~@2 x ~@4 x!3 ~@4", C: "~@5 x!3 ~@8", D: "~ x ~@5 x ~ x!2 ~@5", E: "x", F: "~@5 x ~@10",
  G: "~@3 x ~@12", H: "~ x ~@2",
})).gain(0.08)

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 A ~@2 B ~@28 A ~@2 B ~@10>".pickRestart({
  A: "~@13 x ~@2", B: "~@11 x ~@4",
})).gain(0.62)

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

// drums · high tom
const high_tom = s("ht").struct("<~@23 [~@11 x ~@4] ~@31 [~@11 x ~@4] ~@21>").gain(0.62)

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

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@63 [~ x] ~@13>").gain(0.23)

// drums · ride
const ride = s("rd").struct("<~@36 x ~@31 x!7 [~ x ~@2] ~>").gain(0.31)

// drums · tambourine
const tambourine = s("tb").struct("<~@8 A ~ A ~ A ~ A ~ B@8 ~@16 A ~ A ~ A ~ A ~ B@8 ~@21>".pickRestart({
  A: "~@3 x", B: "~ x ~@2",
})).gain(0.7)

// drums · congas
const congas = s("conga:13").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B ~@16 A B A B A B A B A B A B A B A B ~@21
>`.pickRestart({
  A: "~@7 x ~@6 x ~", B: "~ x ~@14",
})).gain(1.49)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  A B C ~ A B C ~ A B C ~ A B C ~ A B C ~ A B C ~@17 A B C ~ A B C ~ A B C ~ A B C ~@22
>`.pickRestart({
  A: "~@15 x", B: "~@6 x ~@8 x", C: "~@13 x ~ x",
})).gain(1.96)

stack(
  bass, piano, acoustic_guitar_nylon, rock_organ, string_ensemble_2, orchestral_harp, kick, rim, snare, low_tom, hihat,
  hihat_soft, mid_tom, open_hat, high_tom, crash, crash_soft, ride, tambourine, congas, cabasa
)

More by Gloria Estefan