Strudelify

Siempre Hay Esperanza

Sade

KeyC minorTempo93 bpm
0:00/0:00
// Siempre Hay Esperanza — Sade
// 93 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 2 "Fretless Bass" named as a bass, played on fretless bass (its piano patch is not one); ch 3 "Vibraphone" named as a mallet, played on vibraphone (its harpsichord patch is not one); ch 4 "Jp.Strings" named as a string part, played on string ensemble 1 (its harmonica patch is not one); ch 5 "Saxophone" named as a reed, played on alto sax (its cello patch is not one); ch 12 "Ac.Guitar" named as a guitar, played on electric guitar clean (its piano patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 111 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(93/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
const bass = note("<~@3 [~@3 g3] [c3@2 ~ c3 ~ g2 bb2 c3 ~@8]!106 [c3@2 ~ c3 ~ g2 bb2 c3@7 ~@2]>")
  .s("gm_fretless_bass").gain(0.46)

// chords · string ensemble 1 · "Jp.Strings"
const string_ensemble_1 = note(`<
  ~@12 A B A C A B A C D@2 A C A B E@2 ~@10 A B A C A B F C ~@8 A B A C A B F G ~@16 A B A C A B F G ~@19 A B A G ~@2
>`.pickRestart({
  A: "[c4,eb4,g4]", B: "[c4,d4,f4]", C: "[g3,bb3,d4,f4]", D: "[[c4,eb4,g4]@15 [c4,d4,f4]@17]/2",
  E: "[[c4,eb4,g4]@15 ~ g3@16, ~@15 [bb3,d4,f4]@16 ~]/2", F: "[c4,eb4,g4]@13 ~@3", G: "[g3,bb3,d4,f4]@3 ~",
})).s("gm_string_ensemble_1").gain(0.26)

// other · alto sax · "Saxophone"
const alto_sax = note(`<
  ~@37 A B@3 C D@2 E F ~@7 G H I J@2 K L M N O P Q R@4 S T U V W@5 X Y Z AA@3 AB AC AD@2 AE ~@22
>`.pickRestart({
  A: "~@6 g5 eb5",
  B: "[d5@2 d5@4 c5@2 d5@2 c5 d5 eb5@3 d5@10 ~ g4@2 g5@3 ~ d5@2 d5@5 ~ eb5@3 d5 eb5 f5@2 ~, ~@31 eb5@2 ~@15]/3",
  C: "d5@5 ~@3", D: "[~@2 g4 ~ c5 ~ d5 f5@3 eb5 ~ d5 ~ c5 d5@12 ~ g5@4]/2", E: "c6@14 g5 gb5", F: "f5@3 ~",
  G: "~@10 g5 ab5 bb5 ~ ab5 g5", H: "~ g5 ~ ab5 bb5 ~ ab5 g5 ~ g5 ~ ab5 bb5 c6 ~ g5", I: "~ f5@9 f5 g5 ab5@2 bb5 g5",
  J: "[~ eb5@7 ~ c5 ~ eb5 c5 eb5 ~@2 g5@3 eb5@2 ~@5 g4@3 g5@3, ~@15 f5@2 ~@4 d5@7 ~@4]/2",
  K: "~ d5@6 ~ d5@3 c5 ~ [d5,eb5] f5@2, eb5@2 ~@5 c5@2 ~@7", L: "g5@10 g5@5 ~", M: "c6@10 d6@3 eb6@3, ~@10 db6 ~@5",
  N: "d6@13 ~ d6@2", O: "g5@6 eb6@2 d6@3 g5@3 c6@2", P: "bb5@3 eb5@3 ab5@2 g5@3 c5@3 g5@2", Q: "f5@14 c5 d5",
  R: "[c5 d5 c5@7 ~ g4@2 ~ c4@7 ~@2 c4 d4 eb4 f4 g4 c5 d5 eb5 d5@4 g4 ~@3 c4 d4 eb4 g4 c5 d5 eb5 f5 g5 eb5@2 d5 eb5 d5 ~ c5@2 ~@3 g5 ~@2 eb5 ~@2]/4",
  S: "c5 ~@2 c6 ~@6 g6@6", T: "~@2 c6 ~ g5 ~@2 g6 ~ c6 ~ g5 ~ bb5 ~@2", U: "d6@3 g5 ~@8 g5@2 d6 ~",
  V: "bb5@2 c6@10 ~@2 [f5,gb5] ~, ~@7 g5", // Gbmaj7
  W: "[~ f5@6 ~@3 c5 ~ gb5@3 f5@3 c5 ~ gb5@3 f5@3 c5 ~ bb5@3 a5@3 c5 ~ bb5@3 a5@3 c5 ~ a5@3 ab5@3 c5 ~ a5@3 ab5@3 c5 ~ ab5@3 g5@3 c5 ~@9 g5@2 eb5@2]/5",
  X: "d5@2 ~ d5@3 c5@2 d5@3 c5 d5 eb5@3", Y: "d5@10 g4@3 g5@2 eb5", Z: "~ d5@2 d5@3 c5@2 d5@3 c5 d5 eb5@2 ~",
  AA: "[d5@11 g4 ~ c5 d5 f5@4 eb5@2 d5@2 ~ c5@3 db5 d5@15 g5@3 bb5@2]/3", AB: "~ c6@11 d6@2 eb6@2",
  AC: "d6@10 ~ c6 ~ d6 ~@2", AD: "[eb6@2 d6@13 ~]/2", AE: "bb5 ~@2 eb5 ~@2 c5 ~@9",
})).s("gm_alto_sax").gain(0.51)

// other · piano · "2ST CLOSEDHIHAT"
const piano = note("<[b3!9 ~@5 b3!2]!110 [b3!8 ~@8]>").s("gm_piano").gain(0.41)

// other · electric guitar clean · "Ac.Guitar" · Ebmaj7
const electric_guitar_clean = note(`<
  ~@104
  [~@6 g3!2]
  [g4@2 g4@12 g3!2]
  [f4 ~ f4@12 g3!2]
  [~ eb4 ~ eb4@11 [d4,eb4]@2]
  [c4 g3@8 ~@7]
  ~@2
>`).s("gm_electric_guitar_clean").gain(0.31)

// drums · kick
const kick = s("bd").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 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B C
>`.pickRestart({
  A: "x ~@6 x ~@2 x ~@4 x", B: "x ~@6 x ~@6 x!2", C: "x ~@6 x ~@8",
})).gain(0.46)

// drums · snare
const snare = s("sd").struct("<A@9 B A@22 B A@8 B A@48 B A@19 C>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~@2 x", C: "~ x ~@2",
})).gain(0.46)

// drums · hihat
const hihat = s("hh").struct("<[~@9 x!5 ~@2]!110 ~>").gain(0.46)

// drums · open hat
const open_hat = s("oh").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
>`.pickRestart({
  A: "~ x ~ x ~@12",
})).gain(0.36)

// drums · crash
const crash = s("cr").struct("<~@110 [~@7 x ~@8]>").gain(0.26)

stack(bass, string_ensemble_1, alto_sax, piano, electric_guitar_clean, kick, snare, hihat, open_hat, crash)

More by Sade