Strudelify

When You Come Back to Me

Jason Donovan

KeyF♯ majorTempo126 bpm
0:00/0:00
// When You Come Back to Me — Jason Donovan
// 126 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: ch 4 "Ch  4" Vibe 1 -> vibraphone; ch 3 "Ch  3" Brs Sect 2 -> brass section
// note: Full arrangement: all 98 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(126/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.

// chords · vibraphone · "Ch  4" · B A#m B C# D#m C# Fm F# …
const vibraphone = note(`<
  [[b3,d#4] [a#3,c#4] [b3,d#4] [c#4,f4] [d#4,f#4] [c#4,f4] d#4 [f4,g#4] [f#4,a#4] [f4,g#4] [f#4,a#4] [g#4,b4] [a#4,c#5] [g#4,b4] [b4,d5] [c#5,e5]]
  [[d5,f#5] ~@15]
  ~@22
  [[b3,d#4] [a#3,c#4] [b3,d#4] [c#4,f4] [d#4,f#4] [c#4,f4] d#4 [f4,g#4] [f#4,a#4] [f4,g#4] [f#4,a#4] [g#4,b4] [a#4,c#5] [g#4,b4] [b4,d5] [c#5,e5]]
  [[d5,f#5] ~@15]
  ~@72
>`).s("gm_vibraphone").gain(0.4)

// chords · vibraphone · "Ch  4" · soft notes
const vibraphone_soft = note("<[~@6 f#4 ~@8 b4] ~@23 [~@6 f#4 ~@8 b4] ~@73>").s("gm_vibraphone").gain(0.24)

// chords · synth brass 1 · "Ch  2"
const synth_brass_1 = note(`<
  ~@9 A B C@2 D@2 E@2 F@2 G H I A J@3 ~@7 K@4 L M N@2 O@2 I P@2 A Q@2 ~@16 R@4 S@3 M I A I T U A Q@2 ~@17
>`.pickRestart({
  A: "[c#4,f#4,a#4]", B: "[b3,d#4,f#4,a#4]", C: "[[c#4,a#4]@16 [b3,d#4,a#4]@15 ~, f#4@15 ~]/2",
  D: "[[f4,c#5]@15 ~ [d#4,f#4]@15 ~, a#4]/2", E: "[[f4,c#5]@15 ~ [d#4,f#4]@16, a#4@31 ~]/2",
  F: "[[e4,f4] ~ f4@14 [f#4,a#4]@16, c#4, g#4@15 ~@17]/2", G: "[c#4,f4,g#4]@15 ~",
  H: "[b3,d#4,f#4]@3 ~ [c#4,f#4,a#4]@12", I: "[c#4,f4,g#4]", J: "[c#4,f4,g#4]/3",
  K: "[[c#4,f#4]@16 [b3,d#4,f#4]@16 c#4@15 ~ [b3,d#4]@15 ~, a#4@63 ~, ~@32 f#4@31 ~]/4", L: "[f4,a#4,c#5]",
  M: "[d#4,f#4,a#4]", N: "[[f4,c#5] [d#4,f#4], a#4@31 ~]/2", O: "[[f4,g#4] [f#4,a#4], c#4@31 ~]/2",
  P: "[[b3,d#4,f#4]@3 ~ [f#4,a#4]@12 [f4,g#4]@16, ~@4 c#4@27 ~]/2", Q: "[c#4,f4,g#4]/2",
  R: "[[c#4,a#4]@15 ~ [b3,d#4,a#4]@16 c#4@15 ~ d#4@16, f#4@31 ~, ~@32 a#4@31 ~, ~@24 b3@7 ~]/4", // F# Bmaj7
  S: "[[f4,c#5] [d#4,f#4] [f4,c#5], a#4]/3", T: "[b3,d#4,f#4]@3 ~ [a#3,c#4,f#4]@11 ~", U: "[c#4,f4,g#4]@15 ~, a4 ~@15",
})).s("gm_synth_brass_1").gain(0.24)

// bass · synth bass 2 · "Ch  5"
const bass = note(`<
  ~ A B C D E F G D@2 H D H I J I J K D K L K D K@2 A B C D E F G D@2 H D H I J I J K D K L K D K@2 A M C D E F G D A B
  C D E F G D@2 H D H I J I N O D K L K D K@2 A B C D E F P D A B Q D E R P D ~
>`.pickRestart({
  A: "d2!5 ~ e2!2 ~ e2 ~ e2!4 ~", B: "a1!5 ~ d2!2 ~ d2 ~ d2!4 ~", C: "a1!5 ~ c#2!2 ~ c#2 ~ c#2!4 ~",
  D: "f#2!5 ~ f#2!2 ~ f#2 ~ f#2!4 ~", E: "b1!5 ~ c#2!2 ~ c#2 ~ c#2!4 ~", F: "f#2!5 ~ b1!2 ~ b1 ~ b1!4 ~",
  G: "f#2!5 ~ c#2!2 ~ c#2 ~ c#2!4 ~", H: "b1!5 ~ b1!2 ~ b1 ~ b1!4 ~", I: "a#1!5 ~ a#1!2 ~ a#1 ~ a#1!4 ~",
  J: "d#2!5 ~ d#2!2 ~ d#2 ~ d#2!4 ~", K: "c#2!5 ~ c#2!2 ~ c#2 ~ c#2!4 ~", L: "b1!3 ~ f#2 ~ f#2!2 ~ f#2 ~ f#2!4 ~",
  M: "a1!5 ~ d2!2 ~ d2 ~ d2!3 [d2,e2] ~", N: "d#2!5 ~ d#2!2 ~ d#2 ~ d#2!5",
  O: "[c#2,d#2] c#2!4 ~ c#2!2 ~ c#2 ~ c#2!4 ~", P: "f#2!5 ~ f#2 c#2 ~ c#2 ~ c#2!4 ~", Q: "a1!5 ~ c#2!3 ~@2 c#2!4 ~",
  R: "f#2!5 ~ f#2 b1 ~ b1 ~ b1!4 ~",
})).s("gm_synth_bass_2").gain(0.56)

// other · piano · "Ch  6"
const piano = note("<~@65 A B C D E F E G H ~@24>".pickRestart({
  A: "g#4 c#4 a#3 g#4 c#4 a#3 ~@2 a#3 f#4 c#4 a#3 f#4 c#4 a#3 c#4, ~@3 g#4 ~@4, ~@7 c#4@2 ~@7",
  B: "a#4 d#4 b3 a#4 d#4 b3 a#4 d#4 b3 g#4 d#4 b3 g#4 d#4 b3 d#4",
  C: "g#4 c#4 a#3 g#4 c#4 a#3 ~@2 a#3 f#4 c#4 a#3 f#4 c#4 ~ c#4, ~@3 g#4 ~@4, ~@7 c#4@2 ~@5 a#3@2",
  D: "a#4 d#4 b3 a#4 d#4 b3 a#4 d#4 b3 g#4 d#4 g#4 a#4@2 b4@2",
  E: "c#5 a#4 f4 c#5 a#4 f4 c#5 a#4 f4 b4 g#4 d#4 b4 g#4 d#4 g#4",
  F: "b4 g#4 d#4 a#4 f#4 d#4 a#4 f#4 d#4 a#4 f#4 d#4 a#4 d#4 b4 d#4",
  G: "b4 g#4 d#4 a#4 f#4 d#4 a#4 f#4 d#4 c#5 b4 a#4 g#4 f#4 f4 d#4", H: "c#4@7 ~@9",
})).s("gm_piano").gain(0.56)

// chords · synth strings 1 · "Ch  7"
const synth_strings_1 = note(`<
  ~ A B C@2 D@2 E F@2 G H I J K L K M@2 N ~ H J O@2 P@5 Q@4 R H I J K L K S@2 T U H V ~ W X@4 Y@4 Z@7 AA@2 R AB I J K L
  K AC@2 T AD H AE@2 AF AG@7 AH AI@7 AJ ~
>`.pickRestart({
  A: "[a3,d4,f#4,a4,d5,f#5]@6 [e4,g#4,b4,e5,g#5]@9 ~", B: "[a3,c#4,e4,a4,c#5,e5]@6 [a3,d4,f#4,a4,d5,f#5]@9 ~",
  C: "[[a4,c#5,e5]@8 [c#4,g#4]@6 ~@2 [c#4,f#4,a#4,f#5]@15 ~, [a3,c#4,e4]@6 ~@2 c#5@23 ~, ~ g#5 ~@2]/2", // A C#5 F# A
  D: "[[b3,d#4,f#4,b4,d#5,f#5]@6 [f4,g#4,c#5,f5,g#5]@9 ~ [c#4,a#4,c#5,f#5]@6 [b3,d#4,f#4,b4,d#5,f#5]@9 ~, ~@15 a#3@6 ~@11]/2", // B C# F# B
  E: "[a#3,f#4,a#4,c#5,f#5] [c#4,f4,g#4,c#5,f5,g#5]", F: "[[c#4,f#4,a#4,c#5,f#5,a#5]@31 ~]/2",
  G: "~@8 f6@2 f#6 ~ c#6@2 a#5@2", H: "c#6", I: "~@4 f6 f#6 c#6 b5", J: "a#5", K: "f#5", L: "f5", M: "[c#6@31 ~]/2",
  N: "~@7 c#5@8 ~", O: "[~@16 b5@2 a#5@2 b5@2 c#6@9 ~, g#5@23 ~@9]/2",
  P: "[[a3,d4,f#4,a4,d5,f#5]@6 [b3,e4,g#4,b4,g#5]@9 ~ [c#4,e4,c#5]@6 [d4,f#4,d5,f#5]@10 [c#4,e4,a4,c#5,e5]@8 [f4,g#4,g#5]@7 ~ [a#4,a#5]@16 [f#4,b4,d#5]@6 ~ g#4@8 ~, ~@6 e5@16 ~@26 f#5@23 ~@9, ~@16 a3@23 ~@25 b3@5 ~@11, ~@16 a4@15 ~@16 f#4@16 ~@17, ~@16 b3 ~@23 [c#4,c#5]@24 ~@6 [c#4,f4,c#5,f5,g#5]@10]/5", // D E C#m D A Fm A# B …
  Q: "[[a#3,a#4]@5 ~ [b3,d#4,b4,d#5]@10 [a#3,c#4,a#4,c#5]@8 [f4,g#4,g#5]@8 [f#4,a#4,f#5,a#5]@31 ~, [f#4,f#5]@3 ~@5, c#4 ~@23 [c#4,c#5]@39 ~]/4", // A# B A#m Fm F# C#
  R: "~@4 f6 f#6 c#6 a#5", S: "[c#6@9 f#5@7]/2", T: "c#5", U: "b5@3 ~ c#6@11 ~", V: "f#5@15 ~", W: "b5 a#5 b5 c#6@5",
  X: "[[a3,d4,f#4,a4,d5,f#5]@6 ~ g#4@8 ~ [c#4,e4,c#5]@6 [d4,f#4,d5,f#5]@10 [c#4,e4,c#5,e5]@8 [f4,g#4,g#5]@8 [f#4,a#4,a#5]@16, ~@3 e5@8 ~@21, ~@6 [b3,e4,b4,g#5]@9 ~ [a3,a4]@23 ~ [c#4,c#5]@24]/4", // D C#m D C#m Fm F# E A …
  Y: "[[b3,d#4,f#4,b4]@6 ~ g#4@8 ~ c4 c#4@4 ~ [b3,d#4,b4,d#5]@10 [a#3,c#4,a#4]@7 ~ [f4,g#4,g#5]@7 ~ [f#5,a#5]@15 ~, ~@6 [c#4,f4,f5,g#5]@9 ~ [f#4,f#5]@24 ~@8 [f#4,a#4]@13 ~@3, ~@7 c#5@16 ~@17 c#5@23 ~, ~@16 a#3@5 ~@43]/4", // B A#m Fm F# C# F#
  Z: "[[a3,d4,f#4,a4,d5,f#5]@6 ~ g#4@8 ~ [c#4,e4,c#5]@6 [d4,f#4,d5,f#5]@10 [c#4,e4,c#5,e5]@8 [f4,g#4,g#5]@7 ~ [f#4,a#4,a#5]@16 ~ b3@5 ~@10 c4 c#4@5 [d#4,b4]@9 ~ c#4@7 ~ [f4,g#4,c#5]@8, ~@6 e5@16 ~@26 f#5@23 c#5@15 ~@26, ~@6 [b3,e4,b4,g#5]@10 [a3,a4]@23 ~ [c#4,c#5]@23 ~ [d#4,f#4,b4]@5 ~ [c#4,f4,g#4,f5,g#5]@9 ~ [f#4,f#5]@24 ~@8, ~@80 a#3@6 ~@9 a#3@7 ~@10]/7", // D C#m D C#m Fm F# G#m C# …
  AA: "[[a#3,c#4,f#4,a#4,c#5,f#5]@31 ~]/2", AB: "c#6@15 ~", AC: "[c#5@19 ~@13]/2", AD: "b4 ~ c#5@6",
  AE: "[a#5@11 ~@5 c#6@16, ~@11 a#5@7 ~@14]/2", AF: "b5@2 a#5@2 b5@2 c#6@9 ~",
  AG: "[[a3,d4,f#4,a4,d5,f#5]@7 ~ [e4,g#4,g#5]@8 [c#4,e4,c#5]@8 [d4,f#4,d5,f#5]@8 [c#4,e4,c#5,e5]@7 ~ [c#4,g#4]@6 ~@2 c#4@15 ~ [b3,d#4,b4,d#5]@8 [f4,g#4,g#5]@7 ~ [a#3,c#4]@7 ~ [b3,d#4,b4,d#5]@8 [a#3,a#4,c#5]@7 ~ [c#4,f4,g#4]@8, ~@7 e5@17 ~@15 f5@8 f#5@24 ~ c#5@16 ~@24, ~@7 b3@8 ~ [a3,a4]@23 ~@9 f#4@24 ~@8 [f#4,f#5]@24 ~@8]/7", // D E C#m D C#m C#5 B Fm …
  AH: "[f#5,a#5]@15 ~, [f#4,a#4]@13 ~@3", // F#
  AI: "[[a3,d4,f#4,a4,d5,f#5]@8 [b3,e4,g#4,b4,g#5]@8 [a3,c#4,e4,a4]@8 [d4,f#4,d5,f#5]@8 [c#4,e4,c#5,e5]@7 ~ [g#4,c#5,g#5]@7 ~ [f#4,a#4,a#5]@16 [b3,f#4,b4]@7 ~ [c#4,f4,g#4,g#5]@8 a#3@7 ~ [b3,d#4,b4]@7 ~ [c#4,a#4]@7 ~ [c#4,f4,g#4,g#5]@7 ~, ~@8 e5@16 [a3,a4]@15 c#4@24 ~@17 f#4@23 ~@9, ~@47 f#5@24 ~ c#5@16 ~@24, ~@80 f#5@15 ~@17, ~@80 c4 ~@14 a#3@7 ~@10]/7", // D E A D C#m C#5 F# B5 …
  AJ: "[c#4,f#4,a#4] ~@7, [c#5,f#5] ~", // F# F#5
})).s("gm_synth_strings_1").gain(0.2)

// chords · synth strings 1 · "Ch  7" · soft notes
const synth_strings_1_soft = note(`<
  ~ A ~ B C D E F ~@19 G H@2 I G ~@19 G J@2 K L@2 ~@2 M ~ N O P ~@17 Q ~ R@2 S T U@2 ~ V W@2 X Y Z ~@2
>`.pickRestart({
  A: "~@6 b3@9 ~", B: "~ f5, ~@4 f4@3 ~", C: "a#3@15 ~", D: "~@7 c#4@8 ~", E: "f#4@3 ~@5", F: "c#4@3 ~@5",
  G: "~@7 f5@8 ~", H: "[~@15 d#4@7 ~@10]/2", I: "~ c#4@5 ~@10", J: "[~@16 d#5@7 ~@9, f#5@23 ~@9]/2", K: "a#4@5 ~@11",
  L: "[c#5@8 c#4@21 ~@3, ~ f5 ~@2]/2", M: "~ f5", N: "d#5@7 ~@9", O: "a#4@5 ~ [b3,d#5]@10",
  P: "[a#4,c#5]@7 ~ [c#4,g#5]@7 ~, ~@7 f5@8 ~", Q: "~@7 b4@9",
  R: "[~@8 f4 ~ f4@4 ~ c4 a#4@15 ~, ~ c#5@3, ~@8 g#5@7 a#3@16 ~]/2", S: "~@8 [c#4,f5]@7 ~", T: "a#4@7 ~@9",
  U: "[c#4@6 ~@2 f5@8 c#4@13 ~@3, ~@8 c#5@23 ~, ~@4 g#5@3 ~@9]/2", V: "c#5 ~",
  W: "[~@9 f4@6 c#5@16 ~, ~@8 f5@7 ~@17]/2", X: "[d#4,d#5] f5", Y: "[c#4,a#4]@7 d#5@8 ~", Z: "[c#5,f#5]@7 ~ [c#5,f5]@8",
})).s("gm_synth_strings_1").gain(0.1)

// drums · kick
const kick = s("bd").struct("<~ [x!4]!96 x>").gain(0.8)

// drums · snare
const snare = s("sd").struct("<[~@14 x!2] [~ x ~ x]!96 ~>").gain(0.8)

// drums · hihat
const hihat = s("hh").struct("<[~@14 x!2] [x ~@5 x!3 ~@5 x!2]!96 ~>").gain(0.64)

// drums · open hat
const open_hat = s("oh").struct("<~ [~ x ~@3 x ~@2]!96 ~>").gain(0.64)

// drums · crash
const crash = s("cr").struct("<~@97 x>").gain(0.8)

stack(
  vibraphone, vibraphone_soft, synth_brass_1, bass, piano, synth_strings_1, synth_strings_1_soft, kick, snare, hihat,
  open_hat, crash
)

More by Jason Donovan