Strudelify

Goodbye

Spice Girls

KeyE majorTempo68 bpm
0:00/0:00
// Goodbye — Spice Girls
// 68 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 75 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(68/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(`<
  ~ A B C D E F E F E F G H E F G I J K L K M N C D E F E F E F G H E F G I J K L K M N C D O F P F Q R S T E F G U ~@4
  M N C D C D C D C D C D V ~
>`.pickRestart({
  A: "a1@7 a1@3 a1@6", B: "b1@6 ~ b1@3 b1@3 ~ b1@2", C: "a1@6 ~ a1@3 a1@5 a1", D: "b1@6 ~ b1@3 b1@4 b1@2",
  E: "f#1@7 c#2 f#2@7 c#2", F: "b1@7 g#1 b1@2 g#1@2 b1@2 c#2@2", G: "f#1@7 ~ g#1@7 a1",
  H: "a1@7 e1 a1@2 a1@2 b1@2 c#2@2", I: "a1@7 e1 a1@2 a1@2 b1@4", J: "c#2 d#2", K: "e2@7 b1 e2 ~ e2@2 d#2@4",
  L: "c#2@7 c#2 d#2@6 ~ d#2", M: "c#2@7 c#2 d#2@8", N: "e2 d#2 c#2 b1", O: "f#1@6 ~ f#1@3 f#1@5 c#2",
  P: "f#1@7 f#1@3 f#1@5 c#2", Q: "f#1@6 ~ f#1 g#1 ~ g#1@6", R: "a1@6 ~ a1 b1 ~ b1@4 g#1 b1",
  S: "c#2@7 c#2 b1@2 b1@4 b1@2", T: "a1@8 a1@4 g#1@3 ~", U: "a1@7 e1 a1 ~ a1@2 b1@4", V: "a1@6 ~ a1@3 a1@5 ~",
})).s("gm_electric_bass_finger").gain(0.5)

// chords · shakuhachi
const shakuhachi = note(`<
  ~ A@4 ~@8 B C D@2 E@4 ~@2 A@2 ~@2 F@2 G ~@3 B C D@2 E@4 ~@2 A@2 ~@3 H I@2 J K B C D@2 E@4 ~@2 A@10 L ~
>`.pickRestart({
  A: "[b5@6 a5@4 g#5@4 [d#5,f#5]@17 ~, e5@7 ~@9]/2", B: "f#5 e5, c#5", C: "[b4,d#5]", D: "[a4,c#5,e5] [e5,g#5,b5]",
  E: "[~@2 [c#5,c#6] [b4,b5]@3 [c#5,c#6] [b4,b5]@7 ~@2]/2", F: "[~@4 c#5 d#5 e5 d#5@5 ~@4]/2",
  G: "~@2 g#5@2 f#5@2 e5 f#5@2 g#5@3 ~@4", H: "~@15 e5", I: "e5@2 g#5 g#5@2 a5@3 g#5@2 e5 e5@3 ~ e5",
  J: "e5@2 g#5 g#5@2 a5@3 g#5@2 e5 e5@2 b4@3", K: "e5 d#5@2 e5@9 ~@4", L: "b5@3 a5@2 g#5@2 ~, e5@7 ~",
})).s("gm_shakuhachi").gain(0.12)

// chords · epiano2
const epiano2 = note(`<
  ~ A@2 B@2 C D C D C D E F G H I J K L K M N O B@2 C D C D C D E F G H I J K L K M N O B@2 ~@4 P Q R S G H I J T U T V
  N O B@10 W ~
>`.pickRestart({
  A: "[[a2,e3,a3,b3,c#4,e4]@6 [a2,e3,a3,c#4]@3 ~ [a2,e3,a3,c#4,e4]@4 [b2,f#3,b3,d#4]@8 b3@6 g#3 a3 b3@2, ~@11 [b2,f#3,d#4]@5]/2", // A B
  B: "[[a2,e3,a3,c#4,e4]@5 ~ [a2,e3,a3,c#4]@4 [a2,e3,a3,c#4,e4]@4 [b2,f#3,b3,d#4]@8 [b2,f#3,b3,d#4]@10]/2", // A B
  C: "a3 e4 a3 e4 a3 e4 a3 e4", D: "g#3 d#4 g#3 d#4 f#3 d#4 f#3 d#4", E: "a3 e4 a3 e4 b3 e4 b3 e4",
  F: "b3 e4 b3 e4 b3 g#4 f#4 b3", G: "f#4 e4, [a3,c#4]", H: "g#3 f#3, [b3,d#4]", I: "[f#3,a3,c#4,e4] [g#3,b3,e4]",
  J: "[a3,b3,c#4,e4]@3 [b3,d#4,f#4]", K: "[g#3,c#4,e4] [f#3,b3,d#4]", L: "[g#3,b3,e4]@12 [f#3,b3,d#4]@3 ~",
  M: "[g#3,b3,e4]@3 [f#3,b3,d#4]", N: "[g#3,c#4,e4] [d#3,f#3,a3,d#4]", O: "[g#3,b3,e4,g#4] [d#4,f#4] [c#4,e4] [b3,d#4]",
  P: "[a3,c#4,f#4]@7 ~ [b3,e4]@7 ~", Q: "[a3,c#4,e4]@7 ~ [c#4,e4,g#4]@3 ~ [b3,d#4,f#4]@3 ~",
  R: "[b3,e4,g#4]@8 [b3,d#4,f#4]@7 ~", S: "[a3,c#4,e4]@13 ~@3",
  T: "[c#4,e4] g#3 [c#4,e4] g#3 [d#4,f#4] b3 [d#4,f#4] b3", U: "[e4,g#4] b3 [e4,g#4] b3 [e4,g#4] b3 [d#4,f#4] b3",
  V: "[e4,g#4]@2 b3@2 [e4,g#4]@2 b3@2 [e4,g#4]@2 b3@2 [d#4,f#4]@2 b3 ~", // E D#m
  W: "[a2,e3,a3,c#4,e4]@5 ~ [a2,e3,a3,c#4]@4 ~@6", // A
})).s("gm_epiano2").gain(0.48)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@13 A B C D E@2 F@2 G H@2 I ~@3 J K ~@3 L M C D E@2 F@2 G H@2 N O P Q R S T U@2 A B V W X@4 G Y@2 Z AA Z AA Z AA Z AA
  Z AA ~
>`.pickRestart({
  A: "f#5 e5", B: "b5", C: "[e5,g#5]@5 f#5 e5 d#5", D: "c#5@8 [b4,b5]@2 [a4,a5] [g#4,g#5] [f#4,f#5]@2 [e4,e5]@2",
  E: "[c#5 b4@3]/2", F: "[c#5@9 b4@23]/2", G: "c#5 d#5", H: "e5/2", I: "d#5", J: "~@12 [e2,e3]@3 [g#1,b1,g#2,b2]",
  K: "[f#1,f#2] ~", L: "b1 ~@3 e2 ~@2 b1 ~@2 b1 ~ e2 ~@2 b1, f#5 e5", M: "b1 ~@3 e2@2 ~ b1 ~@2 b1 ~ e2@2 b1 ~, b5",
  N: "d#5@14 [e4,e5] [f#4,f#5]", // E F#
  O: "[g#4,g#5] [e4,e5] [c#4,c#5] [f#4,f#5] [d#4,d#5] [b3,b4] [e4,e5] [d#4,d#5], [f#2,c#3,a3]", // G# E C# F# D# B E D# …
  P: "[g#3,c#4,g#4,c#5]@8 [d#4,d#5]@6 [e4,e5] [f#4,f#5], [b2,d#3], ~ [f#3,f#4]", // C#5 D# E F# B F#
  Q: "[g#4,g#5]@3 [a4,a5] [b4,b5]@2 [g#4,g#5]@2 [e4,e5]@3 [f#4,f#5] [g#4,g#5]@2 [e4,e5]@2, [f#2,c#3,a3]", // G# A B G# E F# G# E …
  R: "[g#3,c#4,c#5] [f#3,b3,b4], [b2,d#3]", S: "c#4@4 ~ a4 g#4 f#4, e4@15 ~, b4@5 ~@3, ~ g#3",
  T: "~@3 f#4 [a3,g#4]@2 [b3,d#4,f#4]@2, [a3,c#4,e4] ~", // Amaj7 B A
  U: "[c#4@8 ~@2 a4 g#4 f#4@2 ~@6 f#4@4 g#4@4 e4@4, e4@13 ~ e4@6 ~@12, b4@5 ~@11, ~ b3 [a3,c#4]@2]/2", // A
  V: "[e5,g#5,e6,g#6]@5 [f#5,f#6] [e5,e6] [d#5,d#6]", // E F# E D#
  W: "[c#5,c#6]@8 [e4,e5] [f#4,f#5] [g#4,g#5] ~ [e4,e5] [f#4,f#5] [g#4,g#5] ~", // C# E F# G# E F# G#
  X: "[[c#2,c#3,c#5,e5,g#5]@2 [d#2,d#3,d#5,f#5]@2 [e2,e3,e5,g#5]@3 [d#2,d#3,d#5,f#5], b5, ~ b4@3]/2", // C#m D#m E D#m
  Y: "[~ [a5,c#6,e6], e5]/2", Z: "[f#5,b5,d#6]", AA: "[a5,c#6,e6]",
})).s("gm_string_ensemble_1").gain(0.25)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~ A@4 B C D C B C E F G H I J K L K L M N A@2 B C D C B C E F G H I J K L K L M N A@2 ~@8 G H I J O P O P Q N A@10 R ~
>`.pickRestart({
  A: "[[a4,c#5]@7 [b4,d#5]@9]/2", B: "[a3,c#4]", C: "[b3,d#4]", D: "[a3,c#4,e4]", E: "[a3,c#4,e4] [g#3,b3,e4]",
  F: "[e3,a3,c#4]@3 [f#3,b3,d#4]", G: "f#4 e4, c#4@15 ~", H: "c#4 b3, d#4", I: "c#4 b3, e4", J: "[c#4,e4]@3 [d#4,f#4]",
  K: "[c#4,e4] [b3,d#4]", L: "[g#3,b3,e4]@3 [f#3,b3,d#4]", M: "[g#3,c#4,e4] [f#3,a3,d#4]",
  N: "[g#3,b3,e4] [f#3,b3,d#4] [g#3,c#4,e4] [f#3,b3,d#4]", O: "e4 d#4", P: "e4@3 d#4", Q: "[c#4,e4] [f#3,a3,d#4]",
  R: "[a4,c#5]@7 ~", // A
})).s("gm_synth_strings_1").gain(0.35)

// chords · glockenspiel · D#m C#5 Dm D C#maj7 Asus4 Gm7b5 Fmaj7 …
const glockenspiel = note(`<
  [~@4 c8 [e7,f#7,d#8,e8] [g#7,c#8] [a7,d8,e8,f8] [f#7,d8] [g#7,c8,c#8] [a7,d8,e8] [f7,g7,c#8] [c8,e8,f8] d8 [f7,c8,f8] [g7,d8,e8], ~@2 a7 ~@3 a7 ~, ~@13 [e7,c#8]@2 ~]
  [[g#7,c#8] ~@15, a7 ~@7]
  ~@73
>`).s("gm_glockenspiel").gain(0.46).pan(0.6)

// chords · glockenspiel · soft notes · F#7 G#sus4
const glockenspiel_soft = note(`<
  [~ f8 [f#7,e8] [g#7,c#8,d#8] ~@12, ~ e7@2 ~@13]
  [~ c8 [e7,f7,c#8,d8] g7 a7 ~@11, ~@3 c8@2 ~@11]
  ~@73
>`).s("gm_glockenspiel").gain(0.2).pan(0.6)

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

// drums · clap
const clap = s("cp").struct("<~@60 [~@3 x] ~@14>").gain(0.45)

// drums · snare
const snare = s("sd").struct("<~ [~ x ~ x]!56 ~@3 [~@3 x] [~ x ~ x]!13 ~>").gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@12 A ~@3 B ~@15 B ~@3 B ~@15 A ~@3 B ~@18>".pickRestart({
  A: "~@14 x!2", B: "~@7 x",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B@3 C D C D C D C D C D C D C D C D C D A B C D C D C D C D C D C D C D C D C D A B C D C D C D C D C D C D ~@4 C
  D A B A B E@7 ~
>`.pickRestart({
  A: "x ~ x ~ x ~ x ~ x ~ x!6", B: "x!5 ~ x!3 ~ x!6", C: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2",
  D: "x ~ x ~ x ~ x ~ x ~ x ~ x!4", E: "x",
})).gain(0.45)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ A B@3 ~@18 A B ~@18 A B ~@18 A B A B C ~@7>".pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~@6", B: "~@5 x ~@3 x ~@6", C: "~ x ~@14",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@12 A ~@3 B ~@15 A ~@3 B ~@15 A ~@3 B ~@18>".pickRestart({
  A: "~@13 x ~@2", B: "~@9 x ~ x!3 ~@2",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~@5
>`.pickRestart({
  A: "x",
})).gain(0.45)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~ A B@3 C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B ~@4 C
  D A B A B A B A B A B A ~
>`.pickRestart({
  A: "~ x!4 ~@4 x!4 ~@2 x", B: "~@2 x!2 ~@2 x ~@3 x!2 ~ x ~@2", C: "~@4 x ~@2 x ~@2 x!3 ~@3",
  D: "~ x!2 ~ x ~@2 x ~ x!3 ~@2 x ~",
})).gain(2.26)

// drums · shaker
const shaker = s("sh").struct("<~ [x!16]!56 ~@4 [x!16]!6 [x!2 ~@14] ~@7>").gain(0.45)

stack(
  bass, shakuhachi, epiano2, string_ensemble_1, synth_strings_1, glockenspiel, glockenspiel_soft, kick, clap, snare,
  low_tom, hihat, hihat_soft, mid_tom, crash, cabasa, shaker
)

More by Spice Girls