Strudelify

Gimme Hope Jo'Anna

Eddy Grant

KeyF♯ majorTempo130 bpm
0:00/0:00
// Gimme Hope Jo'Anna — Eddy Grant
// 130 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/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 · "Gesang"
const piano = note(`<
  ~@5 A B C B A B C B ~ D@2 E ~ F@2 E G H I@2 B C B A B C B ~ D@2 E ~ F@2 E G H J@2 K C B A B C B ~ D@2 E ~ F@2 E G H
  I@2 B C B A B C B A B C B A B C B L M
>`.pickRestart({
  A: "~@3 [c#5,e5]", B: "[b4,d#5]@3 ~@13", C: "~@6 [c#5,e5]@3 ~ [c#5,e5] ~ [c#5,e5]@3 ~",
  D: "[~@2 a#5 ~ a#5@2 f#5@2 a#5@3 ~ f#5 ~ a#5@4 f#5@2 a#5@3 ~@9]/2", E: "~@2 a#5 ~ a#5@2 f#5@2 a#5@4 f#5@2 a#5@2",
  F: "[~@2 a#5 ~ a#5@2 f#5 ~ a#5@4 f#5 ~ a#5@4 f#5@2 a#5@3 ~ a#5@3 ~@5]/2", G: "~@7 [a#5,c#6]",
  H: "~@2 [f#5,a#5]@3 ~@9 [c#6,e6]@2", I: "[~@2 [a#5,c#6]@2 ~@10 [a#5,f#6]@11 ~@3 [c#5,e5]@4]/2",
  J: "[~@2 [a#5,c#6]@2 ~@10 [a#5,f#6]@11 ~@3 [c#5,e5,e6]@4]/2", K: "[b4,d#5,d#6]@3 ~@13", L: "~@12 [c#6,e6]@3 ~",
  M: "[b5,d#6] ~@7", // B
})).s("gm_piano").gain(0.56)

// chords · electric guitar muted · "R-Gitarr"
const electric_guitar_muted = note(`<
  ~@2 A B A B A B A B A B A B C D C D C D C D C D C A B A B A B A B C D C D C D C D C D C A B A B A B A B C D C D C D C
  D C D C A B A B A B A B A B A B A B A B E
>`.pickRestart({
  A: "[b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~ [b2,f#3,b3] ~", // B5
  B: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~", // F#5
  C: "[f#2,c#3,f#3] ~@3 [f#2,c#3,f#3]@2 ~@2 [f#2,c#3,f#3]@2 ~@2 [f#2,c#3,f#3]@2 ~@2", // F#5
  D: "[f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~ [f#2,c#3,f#3] ~", E: "[b2,f#3,b3] ~@3",
})).s("gm_electric_guitar_muted").gain(0.35).pan(0.6)

// bass · acoustic bass · "Bass"
const bass = note(`<
  ~@2 A B C D A B C D A B C D E@11 A B C D A B C D E@11 A B C D A B C D E@11 A B C D A B C D A B C D A B C D F
>`.pickRestart({
  A: "b1@2 ~@2 b1@3 ~ b1@3 ~ b1@2 e2@2", B: "f#2 ~ f#2 ~ f#2 ~ f#2@2", C: "b1@3 ~ b1@3 ~ b1@2 ~@2 b1@2 e2@2",
  D: "f#2 ~ f#2 ~ f#2 ~ f#2 ~", E: "f#1 ~ f#1 ~ f#1 ~ f#1 ~", F: "b1@3 ~@13",
})).s("gm_acoustic_bass").gain(0.56).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@2 [x!4]!77 x>").gain(0.46)

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

// drums · low tom
const low_tom = s("lt").struct("<~@79 x>").gain(0.46)

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

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

stack(piano, electric_guitar_muted, bass, kick, snare, low_tom, hihat, crash)

More by Eddy Grant