Strudelify
Holler cover art

Forever

Holler

Spice Girls

KeyB♭ minorTempo110 bpm
0:00/0:00
// Holler — Spice Girls
// 110 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 15 "COPIES!!!!!!!!!!!!!!!!!!" pan flute (copy of ch 11 piano); ch 6 "PLEASE!" fretless bass (copy of ch 12 "tout droits résrvées" slap bass 1); ch 7 "Staff-1" epiano1 (copy of ch 12 "tout droits résrvées" slap bass 1); ch 5 music box (copy of ch 3 voice oohs)
// note: Full arrangement: all 112 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · piano
const piano = note(`<
  ~@3 A B ~@2 C D ~ E F ~@7 G@2 ~@6 H I J K L M N O P ~@7 Q@2 ~@2 R@2 ~@2 H I J K L M N O P I J K L M N O P S H T U S H
  T V@2 ~@2 W@2 ~@2 H I J K L M N O P I J K L M X O P S Y Z AA ~@8
>`.pickRestart({
  A: "~@3 ab3 bb3 [bb3,db4]!2 [bb3,eb4]", B: "[bb3,f4]@3 [bb3,eb4] ~@12",
  C: "~@3 [ab3,db4,ab4] [bb3,db4,gb4] [bb3,db4,f4] [bb3,db4,eb4]!2", D: "[ab3,eb4,f4,ab4]@3 [ab3,eb4,ab4] ~@12",
  E: "~@7 [db4,f4]", F: "[eb4,ab4]@2 [db4,f4] [db4,f4]@3 [db4,f4]@2 [eb4,gb4]@2 [f4,ab4] [db4,f4]@4 ~",
  G: "[~@8 f4@2 ab4@2 bb4@2 c5@5 ~ ab4@2 ab4@9 ~]/2", H: "~@3 ab3 bb3 db4!2 eb4",
  I: "f4@3 eb4 ~@2 bb3@2 db4@2 bb3@2 db4@2 eb4@2", J: "f4@3 ~@3 bb3@2 db4@2 bb3@2 db4@2 eb4@2",
  K: "f4@3 eb4@3 bb3@2 db4@2 bb3@2 eb4@2 bb3@2",
  L: "bb3@3 ~@3 [ab3,db4,ab4]@2 [bb3,db4,gb4]@2 [db4,f4]@2 db4@2 [db4,eb4]@2", // Db5 Gb Db Dbsus2
  M: "[eb4,f4,ab4]@3 [eb4,ab4] ~@2 bb3@2 db4@2 bb3@2 db4@2 [eb4,ab4]@2", // Fm7 Ab5
  N: "[eb4,ab4]@3 ~@5 [f4,ab4]@2 [eb4,ab4]@2 [c4,ab4]@2 [bb3,f4,ab4]@2", // Ab5 Fm Ab5 Fm Bb7
  O: "~ [db4,ab4]@3 [eb4,ab4] bb4 ab4@2 db4@3 ~@3 f4@2", P: "ab4@2 f4 f4@3 f4@2 gb4@2 ab4 f4@4 ~",
  Q: "[~@8 f4@2 f4@2 f4@2 f4@5 ~ db4@2 db4@5 ~@5]/2",
  R: "[~@8 db4@2 db4@2 db4@2 eb4@5 ~ [bb3,ab4]@2 [db4,f4]@2 eb4@7 ~]/2", S: "f4@3 eb4 ~@12",
  T: "f4@3 eb4 ~@2 f4@2 ~ f4@3 ~@2 f4@2", U: "f4@3 eb4@3 ab3@2 bb3@2 db4@2 db4@2 eb4@2",
  V: "[f4@3 eb4@4 ~ f4@2 f4@2 f4@2 f4@5 ~ db4@2 db4@5 ~@5]/2",
  W: "[~@8 [db4,f4]@2 [db4,f4]@2 [db4,f4]@2 [eb4,f4]@5 ~ [bb3,ab4]@2 [db4,f4]@2 eb4@7 ~]/2", // Db Ebsus2 Bb7 Db
  X: "[eb4,ab4]@3 ~@5 f4@2 eb4@2 c4@2 [bb3,f4,ab4]@2", Y: "~@3 bb3 db4 bb3 db4 eb4", Z: "f4@3 eb4@4 ~@9",
  AA: "~@3 [ab3,db4,ab4] [bb3,db4,gb4] [db4,f4] db4 [db4,eb4]", // Db5 Gb Db Dbsus2
})).s("gm_piano").gain(0.8)

// chords · piano · soft notes
const piano_soft = note("<~@104 A B C D E F E ~>".pickRestart({
  A: "[eb4,f4,ab4]@3 [eb4,ab4] ~@2 bb3@2 db4@2 bb3@2 db4@2 [eb4,ab4]@2", // Fm7 Ab5
  B: "[eb4,ab4]@3 ~@5 [f4,ab4]@2 [eb4,ab4]@2 [c4,ab4]@2 [bb3,f4,ab4]@2", // Ab5 Fm Ab5 Fm Bb7
  C: "~ [db4,ab4]@3 [eb4,ab4] bb4 ab4@2 db4@3 ~@3 f4@2", D: "ab4@2 f4 f4@3 f4@2 gb4@2 ab4 f4@4 ~", E: "f4@3 eb4 ~@12",
  F: "~@3 ab3 bb3 db4!2 eb4",
})).s("gm_piano").gain(0.4)

// bass · slap bass 1 · "tout droits résrvées"
const bass = note(`<
  ~@4 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 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 C D E A B E
>`.pickRestart({
  A: "eb1@3 eb1@3 eb1@2 eb1@3 ~@3 db1@2", B: "eb1@3 eb1@3 eb1@2 ~@2 eb1@2 ab1@3 ~",
  C: "bb1@3 bb1@3 bb1@2 bb1@3 ~@3 ab1@2", D: "bb1@3 bb1@3 ab1@2 bb1@3 ~ ab1@3 ~", E: "eb1@3 ~@13",
})).s("gm_slap_bass_1").gain(0.72)

// other · epiano2
const epiano2 = note(`<
  A@2 B@2 A@2 B@2 A@2 B@2 ~@7 C A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@7 C A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2
  ~@15 C A@2 B@2 A@2 B@2 ~@6 B@2 A@2 B@2 A@2 B@2 D@2 E ~
>`.pickRestart({
  A: "[eb3 gb3 bb3 db4@8 ~ eb3 gb3 bb3 db4@12 ab3 c4 eb4@3]/2",
  B: "[~ bb3 db4 f4@8 ~@2 bb3 db4 f4@8 ~@2 bb3 db4 f4 ~ ab3 c4 eb4]/2", C: "~@9 bb3 db4 f4 ~ ab3 c4 eb4",
  D: "[eb3 gb3 bb3 db4@8 ~ eb3 gb3 bb3 db4@12 ~@5]/2", E: "~ bb3 db4 f4@8 ~@5",
})).s("gm_epiano2").gain(0.56)

// other · epiano2
const epiano2_2 = note(`<
  A@2 B@2 A@2 B@2 A@2 B@2 ~@7 C A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@7 C A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2
  ~@15 C A@2 B@2 A@2 B@2 ~@6 B@2 A@2 B@2 A@2 B@2 D@2 E ~
>`.pickRestart({
  A: "[eb2@11 ~ eb2@14 ab2@5 ~]/2", B: "[bb2@11 ~ bb2@11 ~ bb2@3 ~ ab2@3 ~]/2", C: "~@8 bb2@3 ~ ab2@3 ~",
  D: "[eb2@11 ~ eb2@15 ~@5]/2", E: "bb2@11 ~@5",
})).s("gm_epiano2").gain(0.56)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@4 A@2 B C A@2 B C A@2 B C A@2 B@2 A@2 B C A@2 B D A@2 B C A@2 B C E A B C A@2 B@2 A@2 B C A@2 B@2 A@2 B C A@2 B C E
  A B C A@2 B C E A B F A@2 B D A@2 B@2 A@2 B F A@2 B C A@2 B C A@2 B G A@2 D H A@2 B C A@2 B C A@2 B@2
>`.pickRestart({
  A: "[db3,gb3,bb3]@3 [db3,gb3,bb3] ~@2 [db3,gb3,bb3]@2 [db3,gb3,bb3]@3 ~@5", // Gb
  B: "[bb3,db4,f4]@3 [bb3,db4,f4] ~@2 [bb3,db4,f4]@2 [bb3,db4,f4]@3 ~@5", // Bbm
  C: "[bb3,db4,f4]@3 [bb3,db4,f4] ~@2 [bb3,db4,f4]@2 [bb3,db4,f4]@2 [f3,bb3,db4]@2 ~ [db3,f3,bb3]@3", // Bbm
  D: "[bb3,db4,f4]@3 ~@13", E: "[db3,gb3,bb3]@3 ~@13", F: "[bb3,db4,f4]@3 ~@7 [f3,bb3,db4]@2 ~ [db3,f3,bb3]@3",
  G: "[bb3,db4,f4]@3 [bb3,db4,f4] ~@2 [bb3,db4,f4]@2 ~@8", H: "~@10 [f3,bb3,db4]@2 ~ [db3,f3,bb3]@3",
})).s("gm_acoustic_guitar_nylon").gain(0.48)

// chords · epiano1
const epiano1 = note(`<
  ~@4 A@2 B@2 A@2 B@2 ~@16 A@2 B@2 A@2 B@2 ~@16 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@3 C A@2 D ~ A@2 B@2 A@2 B@2 A@2 B@2
  A@2 B@2 ~@6 B@2 A@2 B@2 A@2 B@2 ~@4
>`.pickRestart({
  A: "[[gb3,bb3,db4]@23 ~ [ab3,c4,eb4]@7 ~]/2", B: "[[f3,bb3,db4]@27 ~ [ab3,c4,eb4]@3 ~]/2", C: "~@12 [ab3,c4,eb4]@3 ~",
  D: "[f3,bb3,db4]@15 ~", // Bbm
})).s("gm_epiano1").gain(0.72)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A@3 B A@3 B A@3 B A@7 B A@3 C A@3 B A@3 B C A@2 B A@7 B A@7 B A@3 B C A@2 B A@3 B C A@2 D A@3 C A@7 C A@3 B A@3 B
  A@3 E A@2 C ~ A@3 B A@2 ~@6
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~ x ~@7", B: "x ~@2 x ~@2 x ~ x ~ x ~@2 x ~@2", C: "x", D: "x ~@9 x ~@2 x ~@2",
  E: "x ~@2 x ~@2 x ~@9",
})).gain(0.72)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@106
  [x ~@2 x ~@2 x ~ x ~@7]
  [x ~@2 x ~@2 x ~ x ~ x ~@2 x ~@2]
  [x ~@2 x ~@2 x ~ x ~@7]!4
>`).gain(0.16)

// drums · snare
const snare = s("sd").struct("<~@4 A B A C A B A C ~@25 B A C A B A D ~@7 D ~@33 E ~ E ~ E ~ C ~@20>".pickRestart({
  A: "~@3 x", B: "~@2 x!2", C: "~ x ~@2 x ~ x ~", D: "~ x ~@2 x ~@3", E: "~ x",
})).gain(0.72)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@108 [~@3 x] [~@2 x!2] [~@3 x] [~ x ~ x!2 ~@3]>").gain(0.08)

// drums · clap
const clap = s("cp").struct(`<
  ~@12 A B A B A B A C A B A B A B A ~ A B A B A B A B D ~@7 A B A B A B A ~ A B A B A B A B D B A B A B A B D B A D A B
  A ~ A B A E A B A F B A B A B A B ~ A B A G A B D H A B A B A B A B ~@3 D
>`.pickRestart({
  A: "~@2 x ~@2 x ~@6 x ~@3", B: "~@2 x ~@2 x ~@2 x ~@3 x ~@3", C: "~@2 x ~@2 x ~@2 x ~@7", D: "~@3 x",
  E: "~@2 x ~@2 x ~@2 x ~ x ~ x ~@3", F: "~ x", G: "~@2 x ~@2 x ~@4 x ~ x ~@3", H: "~@5 x!2 ~",
})).gain(0.72)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@4 A@15 B A@7 C A@8 D A@6 B A@7 B A@8 E A@7 E A@2 F A@3 C A@3 B A@3 G A@11 H A@2 D ~ A@8 ~@3 D
>`.pickRestart({
  A: "x!8", B: "x!5 ~@3", C: "x", D: "x ~@2 x", E: "x ~@5 x!2", F: "x ~@4 x!3", G: "x!2", H: "x!4 ~@4",
})).gain(0.72)

// drums · crash
const crash = s("cr").struct("<~@111 [~@3 x!2 ~@3]>").gain(0.08)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~@4 A B A C A B A C A B A C A B A D A B A C A B A ~ A B A C A B A C A B A C A B A D A B A C A B A D A B A C A B A C A
  B A C A B A C A B A E A B A E A B A D A B A F A B A C A B A C A B A G A B A@3 B A C A B ~@6
>`.pickRestart({
  A: "~@3 x", B: "~@2 x!2", C: "~ x ~@2 x!3 ~", D: "~ x ~@2 x ~@3", E: "~@5 x!2 ~", F: "~@4 x!3 ~", G: "~ x ~@6",
})).gain(1.89)

// drums · bongos · soft notes
const bongos_soft = s("bongo:4").struct("<~@106 [~@3 x] [~ x ~@2 x!3 ~] [~@3 x] [~@2 x!2] [~@3 x] [~ x ~ x!2 ~ x ~]>")
  .gain(0.21)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@68 [x!9 ~@7]!7 [x!16] ~@36>").gain(3.65)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@4 A@8 B@7 C B@7 D A@8 E B@6 C B@7 C A@8 F A@7 F A@2 G A@3 D B@3 C B@3 H A@8 B@3 I B@2 J ~ A@6 ~@6
>`.pickRestart({
  A: "x!2 ~ x!8 ~ x!4", B: "x!2 ~ x!8 ~ x ~ x!2", C: "x!2 ~ x!6 ~@7", D: "x", E: "x ~@2 x", F: "x ~@11 x ~ x!2",
  G: "x ~@9 x ~ x!4", H: "x ~@6 x!3 ~@6", I: "x!2 ~ x!4 ~@9", J: "x ~@9 x!3 ~@3",
})).gain(0.72)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@106 [x!2 ~ x!8 ~ x!4]!2 [x!2 ~ x!8 ~ x ~ x!2]!3 [x ~@2 x ~@2 x ~ x ~@3 x ~@3]>")
  .gain(0.16)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@91 [~@3 x ~@4] ~@20>").gain(1.04)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct("<~@91 [~@5 x ~@2] ~@20>").gain(1.04)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  ~@4 A@15 B A@7 ~ A@8 C A@6 B A@7 ~ A@8 C A@7 C A@2 C A@3 ~ A@3 B A@3 D A@11 E A@2 ~@2 A@8 ~@3 C
>`.pickRestart({
  A: "~ x ~@2 x ~@3 x ~@3 x ~@3", B: "~ x ~@2 x ~@3 x ~@7", C: "~@3 x", D: "~ x", E: "~ x ~@2 x ~@11",
})).gain(6.27)

stack(
  piano, piano_soft, bass, epiano2, epiano2_2, acoustic_guitar_nylon, epiano1, kick, kick_soft, snare, snare_soft, clap,
  pedal_hat, crash, bongos, bongos_soft, cabasa, shaker, shaker_soft, woodblocks, woodblocks_2, triangle
)

More by Spice Girls