Strudelify

Cherry Pie

Sade

KeyF♯ majorTempo103 bpm
0:00/0:00
// Cherry Pie — Sade
// 103 bpm, 4/4, key F# major. 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 "Jp.Strings" named as a string part, played on string ensemble 1 (its harmonica patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 134 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(103/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(`<
  ~@2 A@22 B C B C B C B C D E F G D H I J B C B C B C B C K@8 D E F G D H I J B C B C B C B C K@20 L@3 M@4 ~ B C B C B
  C B C B C B C B C B C K@16 N ~
>`.pickRestart({
  A: "[g#2!2 f#2!2 g#2!2 ~@2 d#3!3 f#3 ~ g#3 ~ g#2@2 g#2 f#2!2 g#2!2 ~@2 d#3!3 f#3 ~ g#3 ~@2]/2",
  B: "g#2@2 f#2@2 g#2 ~@2 f#2 ~@2 f#2 ~ f#2 g#2 ~@2", C: "g#2@2 f#2@2 g#2@2 ~@2 g#2 b2 ~@2 c#3 d#3 ~@2",
  D: "g#2!2 ~@4 g#2 ~ g#2!2 ~@4 g#2@2", E: "f#2!2 ~@4 f#2@2 f#2!2 ~@4 f#2 ~", F: "e3!2 ~@4 e3@2 e3!2 ~@4 e3@2",
  G: "d#3!2 ~@4 d#3 ~ d#3!2 ~@2 d#3@4", H: "f#2!2 ~@4 f#2 ~ f#2!2 ~@4 f#2 ~", I: "e3!2 ~@4 e3 ~ e3!2 ~@4 e3 ~",
  J: "d#3!2 ~@4 d#3 ~ d#3!2 ~@6",
  K: "[g#2@2 f#2@2 g#2@2 ~ f#2@2 ~ f#2 ~ f#2 g#2 ~ g#2@3 f#2@2 g#2@2 ~@2 f#2 ~ f#2 ~ f#2 g#2 ~ c#3@3 b2@2 c#3@2 ~@2 b2 ~ b2 ~ b2 c#3 ~ d#3@3 c#3@2 d#3@2 ~@2 d#3 f#3 ~@2 g#3 b3 ~@2]/4",
  L: "[g#2@29 f#3 g#3 g#2@15 ~@2]/3", M: "[~@13 f#3 g#3 g#2@20 ~@10 f#3 g#3 g#2@15 ~@2]/4", N: "[g#2,g#3]",
})).s("gm_fretless_bass").gain(0.46)

// chords · string ensemble 1 · "Jp.Strings"
const string_ensemble_1 = note(`<
  ~@48 A B C@3 B D E A B D B A B F G@2 H@2 B I@2 J B A B D B A B D B K@2 L@4 D M N@3 M ~@8 O@4 I@2 P@2 A Q@5 R@2 A B D B
  A B D B A B D B S@2 T@3 ~
>`.pickRestart({
  A: "[d#4,f#4,b4]", B: "[c#4,f#4,a#4]", C: "[[b3,e4,g#4]@15 ~ [c#4,a#4]@15 [d#4,f#4,b4]@17, ~@15 f#4@16 ~@17]/3",
  D: "[b3,e4,g#4]", E: "[c#4,f#4,a#4]@15 ~", F: "[b3,d#4,g#4]", G: "[[c#4,f#4,a#4]@15 ~ [d#4,b4]@16, ~@15 f#4@16 ~]/2",
  H: "[[c#4,f#4,a#4]@15 ~ [b3,e4]@16, ~@15 g#4@16 ~]/2", I: "[[d#4,f#4,b4]@15 [c#4,f#4,a#4]@17]/2",
  J: "[b3,e4,g#4], d#4 ~@15", K: "[[d#4,f#4,b4]@15 [c#4,f#4,a#4]@16 ~]/2",
  L: "[[b3,e4,g#4]@15 ~ c#4@15 [d#4,f#4,b4]@16 [c#4,f#4,a#4]@16 ~, ~@15 [f#4,a#4]@16 ~@33]/4", // E B F#
  M: "[c#4,f#4,a#4]@13 ~@3", N: "[[d#4,f#4,b4]@15 [c#4,f#4,a#4]@16 ~ b3@16, ~@31 [e4,g#4]@16 ~]/3",
  O: "[[d#4,f#4,b4]@15 [c#4,f#4,a#4]@16 [b3,e4,g#4]@16 ~ a#4@16, ~@47 [c#4,f#4]@17]/4", // B F# E F#5
  P: "[[b3,e4,g#4]@15 [a#3,c#4,f#4]@17]/2", // E F#
  Q: "[[c#4,f#4,a#4]@15 [b3,e4,g#4]@16 ~ a#4@15 [d#4,f#4,b4]@16 ~ [c#4,a#4]@16, ~@31 [c#4,f#4]@16 ~@16 f#4@16 ~]/5", // F# E B F# F#5
  R: "[[b3,e4,g#4]@15 [a#3,c#4,f#4]@16 ~]/2", S: "[[d#4,f#4,b4]@15 ~ [c#4,a#4]@16, ~@15 f#4@16 ~]/2",
  T: "[[b3,e4,g#4]@15 ~ c#4@15 ~ b4@16, ~@15 [f#4,a#4]@16 [d#4,f#4]@16 ~]/3", // E F# D#m
})).s("gm_string_ensemble_1").gain(0.2)

// chords · electric guitar muted · "E.Guitar"
const electric_guitar_muted = note(`<
  ~@23 A B C D C B C E@2 ~@35 F ~@3 G ~@3 A H ~@23 B C D C B C E@2 ~@19 A I A J ~@3
>`.pickRestart({
  A: "~@12 [d#5,g#5,d#6]!4", B: "[d#5,g#5,d#6]@7 ~", C: "~@10 [d#5,g#5,d#6]!6", D: "[d#5,g#5,d#6]@13 ~@3",
  E: "[[d#5,g#5,d#6]@21 ~@11]/2", F: "~@3 [d#5,g#5,d#6]!2 ~ [d#5,g#5,d#6]!6 [d#5,g#5,d#6]@4",
  G: "~@4 [d#5,g#5,d#6]!8 [d#5,g#5,d#6]@4", H: "[d#5,g#5,d#6]@7 ~@9", I: "[d#5,g#5,d#6]!5 ~ [d#5,g#5,d#6]@8 ~@2",
  J: "[d#5,g#5,d#6]@11 ~@5", // G#5
})).s("gm_electric_guitar_muted").gain(0.41)

// chords · piano · "E.Piano"
const piano = note(`<
  ~@8 A@2 B@2 C@2 D@2 E@2 F@2 G@2 D@2 H I J I K I L M N O J O N O J P H I J I K I L M Q R S T U V W X N O J O N O J P H
  I J I K I L M Q R S Y U V W X Q R S Y U V W X Z V W X ~@5 AA@3 H I J I K I L M H I J I K I L M Q R S Y U V W X Q R S Y
  U V W X AB ~
>`.pickRestart({
  A: "[g#3,b3,d#4,g#4]/2", B: "[g#3,c#4,f#4]/2", C: "[b3,e4,g#4]/2", D: "[b3,c#4,f4,g#4]/2", E: "[d#4,g#4,b4]/2",
  F: "[c#4,f#4,a#4]/2", G: "[[b3,e4,g#4]@31 ~]/2", H: "[b3,d#4,g#4]@12 [b3,d#4,g#4] ~@3", I: "[a#3,c#4,f#4]",
  J: "[b3,e4,g#4]", K: "[b3,d#4,g#4]@3 [b3,d#4,g#4]", L: "[b3,e4,g#4]@12 [b3,e4,g#4] ~@3", M: "[a#3,c#4,f#4]@7 ~",
  N: "[d#4,f#4,b4]", O: "[c#4,f#4,a#4]", P: "[c#4,f#4,a#4]@13 ~@3",
  Q: "[d#4,f#4,b4]@2 ~ [c#4,f#4,a#4] ~@2 [d#4,f#4,b4] ~@3 [d#4,f#4,b4] ~@2 [g#4,c#5] ~@2", // B F# B C#5
  R: "[c#4,f#4,a#4]@3 [c#4,f#4,a#4] ~@2 [c#4,f#4,a#4] ~@2 [c#4,f#4,a#4] ~@2 [c#4,f#4,a#4]@2 ~@2", // F#
  S: "[b3,e4,g#4]@3 [b3,e4,g#4] ~@2 [b3,e4,g#4]@3 [b3,e4,g#4] ~@2 [b3,e4,g#4] ~@3", // E
  T: "[a#3,c#4,f#4]@3 [a#3,c#4,f#4] ~@2 [a#3,c#4,f#4]@2 ~ [a#3,c#4,f#4] ~@2 [a#3,c#4,f#4] ~@3", // F#
  U: "[d#4,f#4,b4]@3 [c#4,f#4,a#4] ~@2 [d#4,f#4,b4] ~@5 [g#4,c#5] ~@3", // B F# B C#5
  V: "[c#4,f#4,a#4]@3 [c#4,f#4,a#4] ~@2 [c#4,f#4,a#4] ~@5 [c#4,f#4,a#4]@2 ~@2", // F#
  W: "[b3,e4,g#4]@3 [b3,e4,g#4] ~@2 [b3,e4,g#4] ~@9", X: "[c#4,f#4]@3 [a#3,f#4] ~@2 [a#3,c#4,f#4] ~@9, a#4 ~@15",
  Y: "[a#3,c#4,f#4]@3 [a#3,c#4,f#4] ~@2 [a#3,c#4,f#4]@3 [a#3,c#4,f#4] ~@2 [a#3,c#4,f#4] ~@3", // F#
  Z: "~@3 [c#4,f#4,a#4] ~@2 [d#4,f#4,b4] ~@5 [g#4,c#5] ~@3", AA: "[~@15 [c#4,f4,g#4]@28 ~@5]/3",
  AB: "[g#2,g#3,b3,d#4,g#4]", // G#m
})).s("gm_piano").gain(0.36)

// drums · kick
const kick = s("bd").struct("<~@15 A B@6 C D E@60 F E@7 ~@8 E@32 C ~>".pickRestart({
  A: "~@15 x", B: "x ~@14 x", C: "x", D: "~@7 x", E: "x!2 ~@2 x ~@3", F: "x!2 ~ x!2 ~@3",
})).gain(0.46)

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

// drums · hihat
const hihat = s("hh").struct("<[x!7 ~ x!8]!132 x ~>").gain(0.1)

// drums · open hat
const open_hat = s("oh").struct("<[~@7 x ~@8]!132 ~@2>").gain(0.41)

// drums · crash
const crash = s("cr").struct("<~@24 A ~@15 A ~@6 B ~@23 B ~@4 C ~@7 D ~@14 B ~@27 B ~@4 A ~>".pickRestart({
  A: "x", B: "~@7 x", C: "~ x ~@2", D: "~@3 x ~@4",
})).gain(0.51)

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

More by Sade