Strudelify

Summer Holiday

Cliff Richard

KeyE majorTempo130 bpm
0:00/0:00
// Summer Holiday — Cliff Richard
// 130 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 68 bars on a 24-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 · "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 · piano
const piano = note("<~@60 A B C@2 D E ~@2>".pickRestart({
  A: "[a4,c5]@7 ~@5 [d4,f4,a4]@8 ~@4, f3 d3, f4@5 ~@7", B: "[g3,a#3,d4]@9 ~@3 [e4,g4]@10 ~@2, g2 c3, ~@3 c4@2 ~",
  C: "[[a4,c5]@7 ~@5 [f4,a4]@7 ~@5 [g3,a#3,d4]@9 ~@3 [c4,e4,g4]@9 ~@3, f3@12 d3@14 ~@10 c3@11 ~, f4@10 ~@2 d4@9 ~@3 g2@12 ~@12]/2", // Am F Gm C
  D: "[f3,f4]@11 ~ [d4,f4,a4]@8 ~@4, [a4,c5]@2 ~ d3@3", E: "[g3,a#3,d4]@9 ~@3 [c3,c4,e4,g4]@11 ~, g2@11 ~@13",
})).s("gm_piano").gain(0.25)

// chords · piano
const piano_2 = note("<~@6 A@2 ~@16 A@2 ~@26 B@2 ~@14>".pickRestart({
  A: "[~ b4, ~@11 [e4,g#4]@12 ~]/2", B: "[~ c5, ~@11 [f4,a4]@12 ~]/2",
})).s("gm_piano").gain(0.19)

// chords · piano
const piano_3 = note("<~@2 A B C B ~@8 D E F G@3 ~@12 H I A J A I ~@5 K L@4 ~@4 M N O P ~@12>".pickRestart({
  A: "~@6 [b5,d#6]@3 c#6 ~ [a5,c#6], ~@18 a5 ~@5", B: "[g#5,b5]@2 ~", C: "~@6 [b5,d#6]@3 [a5,c#6] ~ [a5,c#6]",
  D: "~ e3 ~ e4, ~@6 g#3@11 ~@7, ~@12 b3@11 ~", E: "[c#3,e3,a3,c#4]@11 ~ [d#3,f#3,b3,d#4]@11 ~",
  F: "e4@5 ~@13 [e4,b4]@6, g#3@23 ~, [e3,b3]@12 [b3,g#4]@11 ~, ~@6 e4@11 ~@7", // E5 E
  G: "[[c#4,a4,c#5]@11 ~ [d#4,f#4,d#5]@11 ~ e5@6 [b4,e5]@5 ~ [e5,g#5]@5 ~ [e5,b5]@6 [b4,d#5]@24, e4@9 ~@3 b4@17 ~@7 b4@10 ~@2 b5@22 ~@2, ~@12 g#4@11 ~@13, ~@24 e4@11 ~@7 g#5@28 ~@2]/3", // F#m D#m E5 E E5 B
  H: "~@6 [e4,g#4]@2 a4@2 b4@2 [a4,c#5] ~ [b4,d#5] ~ [c#5,e5] ~ [d#5,f#5] ~ [e5,g#5] ~ [f#5,a5] ~, ~@8 f#4 ~ g#4 ~@13", // E A B C#m D#m E F#m
  I: "[g#5,b5]@11 ~", J: "b5, g#5@11 ~", K: "[c#3,e3,a3,c#4]@11 ~ [d#3,f#3,b3,d#4]@12",
  L: "[e4@5 ~@7 b3@6 b4@5 ~ [c#4,a4,c#5]@11 ~ [d#4,f#4,d#5]@12 e5@6 [b4,e5]@5 ~ [b4,e5,g#5]@5 ~ [e5,b5]@6 [b4,d#5]@24, g#3@3 ~@5 e4@2 ~@6, [e3,b3]@11 ~ g#4@11 ~@13 b4@17 ~@13 g#5@28 ~@2, ~@6 e4@11 ~ e4@17 ~@13 g#4@18 g#4@4 ~@2 b5@22 ~@2]/4", // F#m D#m E5 E E5 B E5
  M: "~@12 [c5,e5,c6,e6]@6 [a#4,d5,d6] ~@3 [a#5,d6]@2, ~@18 a#5@2 ~@2 [a#4,d5] ~", N: "[a5,c6]@17 ~@7, [a4,c5]@5 ~@3",
  O: "~@12 [c5,e5,c6,e6]@6 [a#4,d5,a#5,d6] ~@3 [a#5,d6]@2, ~@22 [a#4,d5] ~", P: "[a5,c6]@3 ~, [a4,c5]@5 ~@3",
})).s("gm_piano").gain(0.14).pan(0.2)

// other · piano
const piano_4 = note("<~@12 A B ~@6 C D E ~@7 A B ~@7 F G H I ~@5 C D J K ~@6 L M ~@8>".pickRestart({
  A: "~@12 [d#4,g#4,b4]@5 ~ [d4,g4,a#4]@3 ~@3", B: "[c#4,f#4,a4]@7 ~@5", C: "~@6 [d#4,d#5] ~@2 [g#4,g#5] ~@2",
  D: "[f#4,f#5]@2 ~@4 [c#4,c#5]@2 ~@4 [a#3,a#4]@3 ~@3 [f#4,f#5]@2 ~@4", // F# C# A# F#
  E: "[d#4,d#5]@2 ~@4 [b3,b4]@2 ~@4 [a3,a4]@3 ~@3 f#4@2 ~@4, ~@18 f#3 ~@5", // D# B A
  F: "[c#4,c#5] ~@5 e5@2 ~@4 d#5@2 ~@4 f#4@2 ~@4, ~@6 e4 ~@5 d#4 ~@5 f#5 ~@5", // C#
  G: "e5@2 ~@10 [g#4,g#5] ~@5 [b3,b4]@2 ~@4, e4 ~@23", H: "[c#4,c#5] ~@5 [e4,e5]@2 ~@4 [d#4,d#5] ~@5 [f#4,f#5]@2 ~@4",
  I: "e5 ~@11, e4 ~@23", J: "[d#4,d#5] ~@2 [b3,b4] ~@2 c5 ~@2 g4 ~@2, ~@12 c4 ~@5 g5 ~@5", K: "[f4,f5] ~@11",
  L: "~@12 [e4,a4,c5]@5 ~ [d#4,g#4,b4]@3 ~@3", M: "[d4,g4,a#4]@7 ~@5",
})).s("gm_piano").gain(0.12)

// chords · piano
const piano_5 = note("<~@2 A B C B ~@8 D E F@4 ~@12 G H A I A H ~@5 J K@4 ~@4 L M N O ~@12>".pickRestart({
  A: "~@6 [b4,d#5]@3 c#5 ~ [a4,c#5], ~@18 a4 ~@5", B: "[g#4,b4]@2 ~", C: "~@6 [b4,d#5]@3 [a4,c#5] ~ [a4,c#5]",
  D: "~ e4 ~ e5, ~@6 g#4@11 ~@7, ~@12 b4@11 ~", E: "[c#4,e4,a4,c#5]@11 ~ [d#4,f#4,b4,d#5]@11 ~",
  F: "[e5@5 ~@13 b5@5 ~ [c#5,a5,c#6]@11 ~ [d#5,f#5,d#6]@11 ~ e6@6 [b5,e6]@5 ~ [e6,g#6]@5 ~ [e6,b6]@6 [b5,d#6]@24, g#4@23 ~@25 e5@11 ~@7 g#6@28 ~@2, [e4,b4]@12 [b4,g#5]@11 ~@25 g#5@22 ~@26, ~@6 e5@11 ~ e5@15 ~@3 b5@17 ~@7 b5@10 ~@2 b6@22 ~@2]/4", // F#m D#m E5 E E5 B E5 E
  G: "~@6 [e3,g#3]@2 a3@2 b3@2 [a3,c#4] ~ [b3,d#4] ~ [c#4,e4] ~ [d#4,f#4] ~ [e4,g#4] ~ [f#4,a4] ~, ~@8 f#3 ~ g#3 ~@13", // E A B C#m D#m E F#m
  H: "[g#4,b4]@11 ~", I: "b4, g#4@11 ~", J: "[c#4,e4,a4,c#5]@11 ~ [d#4,f#4,b4,d#5]@12",
  K: "[e5@5 ~@7 b4@6 b5@5 ~ [c#5,a5,c#6]@11 ~ [d#5,f#5,d#6]@12 e6@6 [b5,e6]@5 ~ [b5,e6,g#6]@5 ~ [e6,b6]@6 [b5,d#6]@24, g#4@3 ~@5 e5@2 ~@6, [e4,b4]@11 ~ g#5@11 ~@13 b5@17 ~@13 g#6@28 ~@2, ~@6 e5@11 ~ e5@17 ~@13 g#5@18 g#5@4 ~@2 b6@22 ~@2]/4", // F#m D#m E5 E E5 B E5
  L: "~@12 [c4,e4,c5,e5]@6 [a#3,d4,d5] ~@3 [a#4,d5]@2, ~@18 a#4@2 ~@2 [a#3,d4] ~", M: "[a4,c5]@17 ~@7, [a3,c4]@5 ~@3",
  N: "~@12 [c4,e4,c5,e5]@6 [a#3,d4,a#4,d5] ~@3 [a#4,d5]@2, ~@22 [a#3,d4] ~", O: "[a4,c5]@3 ~, [a3,c4]@5 ~@3",
})).s("gm_piano").gain(0.14).pan(0.8)

// other · piano
const piano_6 = note("<~@33 A B C D E F G H I J ~@25>".pickRestart({
  A: "b4@6 b5@3 ~@3 a5@3 ~ g#5@2 f#5@4 e5@2", B: "~@3 f#5@2 g#5 f#5@2 e5 c#5@2 b4",
  C: "~@6 b4@4 b5@2 a5@3 ~ g#5@2 f#5@4 e5@2", D: "~@2 g#5 a5@2 f#5@4 ~@3", E: "~ b4@5 b5@3 ~@3 a5@4 g#5@2 f#5@4 e5@2",
  F: "~@6 f#5@4 g#5@2 f#5@4 e5@2 c#5@3 ~@3", G: "f#5@3 ~@3 f#5@3 ~ g#5@2 f#5@4 e5@2 c#5@4 ~@2",
  H: "e5@3 g#5@3 b4@3 ~@2 b4", I: "f#5@3 ~@3 f#5@3 ~ g#5@2 f#5@4 e5@2 c#5@3 ~@3", J: "e5@11 ~@13",
})).s("gm_piano").gain(0.41)

// bass · piano
const bass = note(`<
  ~ A B C D A B C B A E@2 F E G E H E G I J K L A D A B A E M N O P A E Q R A E@2 S E T E U E V I W K X Y Z AA Z AB AC
  AD AE AF AA AF AG AH AB AI ~ AJ
>`.pickRestart({
  A: "e2@8 ~@2 e2 ~ c#2@8 ~@2 c#2@2", B: "f#2@8 ~@2 f#2 ~ b1@6 c#2@2 ~@2 d#2 ~", C: "e2@4 ~ e2 c#2@4 ~ c#2",
  D: "f#2@8 ~@2 f#2@2 b1@6 c#2@2 ~@2 d#2 ~", E: "f#2@8 ~@2 f#2 ~ b1@8 ~@2 b1@2", F: "e2@7 ~@3 e2@2 g#2@4 ~@2 g2@4 ~@2",
  G: "e2@8 ~@2 e2@2 b1@5 ~ e2@5 ~", H: "e2@9 ~ e2 ~ b1@5 ~ e2@5 ~", I: "g#2@8 ~@2 g#2@2 d#2@5 ~ d#2@5 ~",
  J: "g#2@10 d#2@6 ~@2 g#2@5 ~", K: "f#2@8 ~@2 f#2@2 c#2@4 ~@2 f#2@5 ~", L: "b2@8 ~@2 b2@2 f#2@5 ~ b2@4 ~@2",
  M: "f#2@8 ~@2 f#2 ~ b1@8 ~@2 b1 ~", N: "e2@8 ~@2 e2@2 g#2@5 ~ g2@4 ~@2", O: "f#2@9 ~ f#2 ~ b1@8 ~@2 b1@2",
  P: "e2@5 ~ b1@5 ~ c#2@5 ~ d#2@4 ~@2", Q: "e2@9 ~ e2@2 c#2@8 ~@2 c#2@2", R: "f#2@8 ~@2 f#2 ~ b1@5 ~ c#2@2 ~@2 d#2 ~",
  S: "e2@9 ~ e2@2 g#2@5 ~ g2@4 ~@2", T: "e2@4 ~ e2 b1@2 ~ e2@2 ~", U: "e2@8 ~@2 e2 ~ b1@5 ~ e2@5 ~",
  V: "e2@9 ~ e2@2 b1@5 ~ e2@5 ~", W: "g#2@9 ~ g#2@2 d#2@4 ~@2 g#2@5 ~", X: "b2@5 ~ f#2@5 ~ c3@5 ~ g2@5 ~",
  Y: "f2@7 ~@3 f2 ~ d2@8 ~@2 d2@2", Z: "g2@8 ~@2 g2 ~ c2@5 ~ d2@2 ~@2 e2 ~", AA: "f2@4 ~ f2 d2@4 ~ d2",
  AB: "f2@8 ~@2 f2 ~ d2@8 ~@2 d2@2", AC: "g2@8 ~@2 g2 ~ c2@8 ~@2 c2@2", AD: "g2@7 ~@3 g2 ~ c2@8 ~@2 c2@2",
  AE: "f2@8 ~@2 f2@2 a2@5 ~ g#2@4 ~@2", AF: "g2@8 ~@2 g2 ~ c2@5 ~ d2@4 e2 ~", AG: "f2@8 ~@2 f2 ~ d2@8 ~@2 d2 ~",
  AH: "g2@8 ~@2 g2 ~ c2@5 ~ d2@3 ~ e2 ~", AI: "g2@8 ~@2 g2@2 c2@5 ~ d2@3 ~ e2 ~", AJ: "~@3 c3@2 ~ f2@2 ~@4",
})).s("gm_piano").gain(0.25)

// drums · kick
const kick = s("bd").struct("<~ [x!2]!4 [x ~@4 x!2 ~@5]!28 [x!2]!10 [x ~@4 x!2 ~@5]!17 [x!2]!6 x [~@11 x ~@12]>")
  .gain(0.36)

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

// drums · hihat
const hihat = s("hh").struct("<~ A B@13 C B@17 A B@3 A B@3 A B C B@16 A B@3 A B@2 D>".pickRestart({
  A: "~@3 x ~ x!2 ~ x!2 ~ x", B: "x ~ x!2 ~ x!2 ~ x!2 ~ x", C: "~@2 x!2 ~ x!2 ~ x!2 ~ x", D: "x ~ x!2 ~ x ~@6",
})).gain(0.31)

// drums · low tom
const low_tom = s("lt").struct("<~@67 [~ x ~@2]>").gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@67 [~ x ~@4]>").gain(0.36)

// drums · crash
const crash = s("cr").struct("<~ A ~@13 A ~@17 A ~@3 A ~@3 A ~ A ~@16 A ~@3 A ~@3>".pickRestart({
  A: "x",
})).gain(0.41)

// drums · high tom
const high_tom = s("ht").struct("<~@66 [~@11 x] x>").gain(0.36)

stack(piano, piano_2, piano_3, piano_4, piano_5, piano_6, bass, kick, snare, hihat, low_tom, mid_tom, crash, high_tom)

More by Cliff Richard