Strudelify

Walking on Sunshine

Eddy Grant

KeyB♭ majorTempo200 bpm
0:00/0:00
// Walking on Sunshine — Eddy Grant
// 200 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 8 trumpet (copy of ch 7 brass section)
// note: Full arrangement: all 197 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 29.
setcpm(200/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.

// other · piano
const piano = note(`<
  ~@110 A B ~@2 C B ~@2 C D ~@42 C E ~@2 C F ~@2 C F ~@2 C F ~@6 C F ~@2 C F ~@2 C F ~@2 C F ~
>`.pickRestart({
  A: "~@3 d4", B: "f4@4 d4@2 f4@5 ~ f4@4", C: "~@12 d4@3 ~", D: "f4@4 d4@2 f4@5 ~ d4@4", E: "f4@3 ~ d4@2 f4@4 ~@2 f4@4",
  F: "f4@3 ~ d4@2 f4@5 ~ f4@2 ~@2",
})).s("gm_piano").gain(0.5)

// bass · electric bass finger
const bass = note(`<
  ~@8 A B C D A B C E A B C B A B C B A B C B A B C B A B C B A B C B A B C B A B C B F G H I F G H I J K H L A B C D A
  B C E A B C B A B C B A B C B A B C B A B C B A B C B A B C B A B C B F G H I F G H I J K H L A B C D A B C E A B C B
  A B C B A B C B A B C B A B C B A B C B A B C B A B C B F G H I F G H I J K H L A B C D A B C E A B C D A B C E A B C
  D A B C E A B C D A B C E M
>`.pickRestart({
  A: "bb1@2 ~@2 bb1@2 ~@2 bb1@3 ~@3 eb2@2", B: "~@2 eb2@2 ~@2 eb2 ~ eb2@7 ~", C: "f2 ~@3 f2 ~@3 f2@4 ~@2 eb2@2",
  D: "~@2 eb2@2 ~@2 eb2 ~ eb2@4 f2@3 ~", E: "~@2 eb2@2 ~@2 eb2 ~ eb2@8", F: "f2 ~@3 f2 ~@3 f2@3 ~@3 f2@2",
  G: "~@2 f2@2 ~@2 f2 ~ f2@7 ~", H: "eb2 ~@3 eb2 ~@3 eb2@4 ~@2 eb2 ~", I: "~@2 eb2 ~@3 eb2 ~ eb2@6 ~@2",
  J: "f2 ~@3 f2 ~@3 f2@4 ~@2 f2 ~", K: "~@2 f2 ~@3 f2 ~ f2@2 ~@2 f2@2 ~@2",
  L: "~@2 bb2 ~ g2@2 f2 ~ bb2@2 g2@2 f2@2 g2 ~", M: "bb1@2 ~@2 bb1@3 ~@9",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · epiano2
const epiano2 = note(`<
  ~@8 A@2 B@2 A@2 B@2 ~@32 C@2 D@2 C@2 D@2 C@2 D@2 A@2 B@2 A@2 B@2 ~@32 C@2 D@2 C@2 D@2 C@2 D@2 A@2 B@2 A@2 B@2 A@2 B@2
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 D@2 C@2 D@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2
  B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~
>`.pickRestart({
  A: "[[f3,bb3,d4]@7 [g3,bb3,eb4]@9]/2", B: "[[a3,c4,f4]@7 [g3,bb3,eb4]@9]/2", C: "[a3,c4,f4]/2", D: "[g3,bb3,eb4]/2",
})).s("gm_epiano2").gain(0.4).pan(0.4)

// chords · percussive organ
const percussive_organ = note(`<
  ~@32 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 E@2 C@2 F@2 G@4 H@4 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2
  A@2 B@2 A@2 B@2 C@2 D@2 C@2 E@2 C@2 F@2 H@8 ~@16 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 D@2 C@2 E@2 C@2 F@2 A@2 B@2 A@2
  B@2 A@2 B@2 A@2 B@2 I@2 J@2 I@2 J@2 I@2 J@2 I@2 J@2 K
>`.pickRestart({
  A: "[[f4,bb4,d5]@7 [g4,bb4,eb5]@9]/2", B: "[[a4,c5,f5]@7 [g4,bb4,eb5]@9]/2", C: "[c5,f5,a5,d6]/2",
  D: "[~@2 f6 d6, [bb4,eb5,g5,c6]]/2", E: "[~@4 g6@2 f6 eb6, [bb4,eb5,g5,c6]]/2", F: "[bb4,eb5,g5,c6]/2",
  G: "[[f4,bb4,d5]@7 [g4,bb4,eb5]@9 [a4,c5,f5]@7 [g4,bb4,eb5,eb6]@9, bb6]/4", // Bb Eb F Eb
  H: "[[f4,bb4,d5]@7 [g4,bb4,eb5]@9 [a4,c5,f5]@7 [g4,bb4,eb5]@9, bb6]/4", I: "[[f5,bb5,d6]@7 [g5,bb5,eb6]@9]/2",
  J: "[[a5,c6,f6]@7 [g5,bb5,eb6]@9]/2", K: "[d6,f6,bb6]@2 ~@2 [d6,f6,bb6]@3 ~@9",
})).s("gm_percussive_organ").gain(0.3).pan(0.6)

// chords · overdriven guitar
const overdriven_guitar = note("<~@124 A ~@2 B A ~@2 B A ~@2 B ~@59 C ~>".pickRestart({
  A: "~@2 [f4,f5] ~@3 [f4,f5] ~@3 [f4,f5] ~ [f4,f5] ~@3", B: "~@14 [f4,f5] ~", C: "~@12 [g4,bb4]@3 ~",
})).s("gm_overdriven_guitar").gain(0.3).pan(0.3)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@8 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 F G H E F G H E F G H I J K H I
  J K H 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 F G H E F G H E F G H 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 F G H E F G H E F G H 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 L M
>`.pickRestart({
  A: "[f4,bb4,d5,f5] ~@3 [f4,bb4,d5,f5] ~@3 [f4,bb4,d5,f5]@4 ~@2 [g4,bb4,f5] ~", // Bb Gm7
  B: "~@2 [g4,bb4,f5] ~@3 [g4,bb4,f5] ~ [g4,bb4,f5] ~ [g4,bb4,f5] ~ [g4,bb4,f5] ~ [g4,bb4,f5] ~", // Gm7
  C: "[a4,c5,f5] ~@3 [a4,c5,f5] ~@3 [a4,c5,f5]@4 ~@2 [g4,bb4,f5] ~", // F Gm7
  D: "~@2 [g4,bb4,f5] ~@3 [g4,bb4,f5] ~ [g4,bb4,f5] ~ [g4,bb4,f5] ~ [g4,bb4,f5]@3 ~", // Gm7
  E: "[a4,c5,d5,f5] ~@3 [a4,c5,d5,f5] ~@3 [a4,c5,d5,f5]@4 ~@2 [a4,c5,d5,f5] ~", // Dm7
  F: "~@2 [a4,c5,d5,f5] ~@3 [a4,c5,d5,f5] ~ [a4,c5,d5,f5] ~ [a4,c5,d5,f5] ~ [a4,c5,d5,f5] ~ [a4,c5,d5,f5] ~", // Dm7
  G: "[g4,bb4,c5,eb5] ~@3 [g4,bb4,c5,eb5] ~@3 [g4,bb4,c5,eb5]@4 ~@2 [g4,bb4,c5,eb5] ~", // Cm7
  H: "~@2 [g4,bb4,c5,eb5] ~@3 [g4,bb4,c5,eb5] ~ [g4,bb4,c5,eb5] ~ [g4,bb4,c5,eb5] ~ [g4,bb4,c5,eb5]@3 ~", // Cm7
  I: "[f4,g4,bb4,d5] ~@3 [f4,g4,bb4,d5] ~@3 [f4,g4,bb4,d5]@4 ~@2 [g4,bb4,c5,eb5] ~", // Gm7 Cm7
  J: "~@2 [g4,bb4,c5,eb5] ~@3 [g4,bb4,c5,eb5] ~ [g4,bb4,c5,eb5] ~ [g4,bb4,c5,eb5] ~ [g4,bb4,c5,eb5] ~ [g4,bb4,c5,eb5] ~", // Cm7
  K: "[a4,c5,d5,f5] ~@3 [a4,c5,d5,f5] ~@3 [a4,c5,d5,f5]@4 ~@2 [g4,bb4,c5,eb5] ~", // Dm7 Cm7
  L: "~@2 [g4,bb4,f5] ~@3 [g4,bb4,f5] ~ [g4,bb4,f5] ~ [g4,bb4,f5] ~ [a4,c5,f5]@3 ~", // Gm7 F
  M: "[f4,bb4,f5] ~@3 [f4,bb4,f5]@3 ~@9", // Bb5
})).s("gm_electric_guitar_clean").gain(0.3).pan(0.7)

// other · brass section
const brass_section = note(`<
  ~@8 A B C@2 A B C@2 ~@44 A B C@2 D B C@2 ~@44 A B C@2 D B C@2 ~@44 A B C@2 A B C@2 A B C@2 D B C@2 A B C@2 D B C@2 A B
  C@2 D B C@2 E
>`.pickRestart({
  A: "~@2 [bb4,bb5] ~", B: "~@4 [g4,g5]@2 ~ [g4,g5] [g4,g5]@2 ~ [g4,g5] ~@3 [a4,a5]",
  C: "[~@3 [a4,a5]@2 ~@2 [a4,a5] [a4,a5]@4 [ab4,ab5] ~@2 [g4,g5]@2 ~@15]/2", D: "~@8 [bb4,bb5]@3 ~@5",
  E: "[bb4,bb5]@4 [bb4,bb5]@3 ~@9", // Bb
})).s("gm_brass_section").gain(0.45).pan(0.4)

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

// drums · snare
const snare = s("sd").struct("<A@7 B A@7 B A@43 C A@7 B A@43 C A@7 B A@43 C A@7 B A@7 B A@7 B A@7 B D>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "~@2 x!6", D: "x!2 ~@2",
})).gain(0.45)

// drums · clap
const clap = s("cp").struct("<~@120 [~ x ~ x]!32 ~@12 [~ x ~ x]!32 ~>").gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!196 x>").gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  A ~@7 A ~@3 A ~@35 A ~@3 A ~@3 A ~@3 A ~@3 A ~@35 A ~@3 A ~@3 A ~@3 A ~@3 A ~@35 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A
  ~@3 A ~@3 A ~@3 A ~@3 A ~@3 B
>`.pickRestart({
  A: "x", B: "x!2 ~@2",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<[x!4]!196 ~>").gain(0.35)

stack(
  piano, bass, epiano2, percussive_organ, overdriven_guitar, electric_guitar_clean, brass_section, kick, snare, clap,
  hihat, crash, tambourine
)

More by Eddy Grant