Strudelify

Homburg

Procol Harum

KeyF majorTempo75 bpm
0:00/0:00
// Homburg — Procol Harum
// 75 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 65 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(75/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 · fretless bass
const bass = note(`<
  A B C D E@2 F@2 E@2 F G H I J K E@2 F L M N O P A B C D E@2 F@2 E@2 F G H I J K E@2 F L M N O P A B C D M N O P A P A
  P A B C Q R
>`.pickRestart({
  A: "f2@5 ~ f2@2 f2@4 f2@2 f2@2", B: "eb2@5 ~ eb2 ~ eb2@4 eb2@2 eb2@2", C: "d2@5 ~ d2@2 b1@5 ~ b1@2",
  D: "c2@4 b1@4 bb1 ~ c2@2 d2@2 e2 ~", E: "f2@5 ~ f2 ~ f2@4 c2@2 e2@2", F: "f2@5 ~ f2 ~ f2@3 ~ c2@2 e2@2",
  G: "f2@5 ~ f2 ~ f2@3 ~ f2@2 e2@2", H: "d2@5 ~ d2 ~ d2@5 ~ d2@2", I: "g2@5 ~ g2 ~ g2@3 ~ e2@2 d2@2",
  J: "c2@5 ~ c2 ~ c2@6 c2@2", K: "c2@5 ~ c2 ~ c2@2 ~ c2 d2@2 e2@2", L: "f2@5 ~ f2 ~ f2@2 c2@2 d2@2 e2@2",
  M: "f2@5 ~ f2@2 bb2@4 bb2@3 ~", N: "g2@5 ~ g2@2 c2@4 e2@2 g2@2", O: "a2@5 ~ a2@2 d2@4 d2@2 c2@2",
  P: "bb1@6 bb1 ~ bb1@3 bb1 bb1@2 c2@2", Q: "c2@4 b1@4 bb1@4 c2 d2 ~ e2", R: "f2",
})).s("gm_fretless_bass").gain(0.36)

// chords · rock organ
const rock_organ = note(`<
  A@3 B C D E F C D G F H@2 I@3 J G F K L M N O@3 P C D E F C D G F H@2 I@3 J G F K L M N O@3 P K L M N Q N Q N O@3 P R
>`.pickRestart({
  A: "[f4@2 eb4@2 [d4,f4,c5] [b3,d4,f4,a4], a4@13 ~@3, c5@31 ~@17]/3", B: "c4 b3 [bb3,e5]@2, [g4,c5], e4 ~",
  C: "[f4,a4,c5]", D: "[d4,g4,b4]", E: "[d4,f4,bb4]", F: "[c4,f4,a4]", G: "[d4,f4,bb4]@15 ~",
  H: "[[f4,a4] [g4,bb4], [d4,d5]@31 ~]/2", I: "[[c4,f4,a4]@15 ~ [e4,g4]@16 [f4,a4]@16, c5@47 ~, ~ c4@2]/3",
  J: "[d4,f4,g4,b4]", K: "~@2 eb5@2 bb4 c5 bb4 ab4, f4, [a4,c5] d5", L: "d5@2 f5@2 c5 d5 c5 bb4, g4, b4@7 ~ e5@8",
  M: "e5 g5 [d5,f5]@2, a4, db5 ~", N: "d5@3 e5, [f4,bb4]",
  O: "[f5@2 [eb4,eb5]@2 d5 [b3,f4,a4], [f4,a4]@13 ~@3, c5@2 d4]/3", P: "c4@4 b3@4 [bb3,c5]@7 ~, g4@15 ~, e4 ~",
  Q: "[f4,a4,c5,f5]", R: "[f3,f4,a4,c5]",
})).s("gm_rock_organ").gain(0.18).pan(0.3)

// chords · piano
const piano = note(`<
  A B C D E F G H I J K L@4 M N O P Q R S T U@2 B C D E F G H I J K L@4 M N O P Q R S T U@2 B C D R S T U@6 B C V W
>`.pickRestart({
  A: "bb4@2 a4 g4 a4@10 ~@2", B: "bb4@2 a4 g4 a4@6 c5@4 f4 g4", C: "f4@4 g4@2 a4 ~ a4@4 g4@2 f4@2",
  D: "[c4,e4]@4 [d4,f4]@4 e4@4 bb4@3 ~, ~@8 g4@7 ~", E: "[c4,f4,a4]@5 ~@2 a4, ~@5 c4@3, ~@3 f4",
  F: "[d4,g4]@4 g4 f4 ~ d4, b4@7 ~, ~@3 e4", G: "d4@4 ~@2 d4!2, [f4,bb4]@11 bb3@5, ~@5 d4 [f4,bb4]@2",
  H: "c4@10 c4@2 bb4@2 a4 g4, [f4,a4]@3 ~", I: "~@3 c4@2 c4@2 [c4,a4], a4@7 ~, ~ f4@7",
  J: "d4 d4@2 d4@2 ~@2 e4, [g4,b4]@3 g4@5, ~@3 b4@3 [f4,b4]@2, ~@5 d4@3", // G Fdim
  K: "[d4,f4,bb4]@4 [d4,f4,bb4]@2 d4!2, ~@3 [f4,bb4]", // Bb Bb5
  L: "[f4@5 f4 [f4,a4]@2 f4 ~@15 f4 ~@5 g4 f4, [c4,a4]@6 [c5,f5]@12 g4 bb4 d5 g4@3 [a4,c5] f4 a4 c5 g4 a4@2 ~, ~@8 d5@3 d5@2 d5@3 [g4,bb4,d5] d4@14 ~, ~@8 a4@2 a4@2 a4@3 a4@7 bb4@9 ~, ~@9 f4@5 f4@9 d5@8 ~]/4", // F F5 Am Gm
  M: "e4 ~ e4@2 g4@2 c5@2 bb4@3 c5 a4@2 g4@2, [g4,c5]@5 ~@11", // C5
  N: "[c4,f4,a4]@4 a3 ~@7 f4@4, f3!2, ~ f4@2 ~, ~@2 c4@3 c4@3, ~@3 a3@5", // F
  O: "[d4,f4]@2 ~ [d4,f4] [b3,d4,f4]@3 [d4,f4] [d4,f4]@3 [d4,f4] f4@2 e4@2, g3, b3 ~@11 d4@4", // Dm Bdim Dm
  P: "bb3 ~@13 d4@2, f4@3 f4@3 f4@2, d4@2 d4@3 d4@2 ~, ~ bb3@3 bb3@4",
  Q: "a3 ~@5 f4@2 [f3,f4]@2 [c3,c4]@2 [d3,d4]@2 [e3,e4] ~, f4@3 ~@5, c4@2 c4@3 ~@3, ~ a3@4 ~@3", // F C D E
  R: "a3@2 a3@2 a3@2 a3@2 bb3 ~@5 f4@2, f3 bb2, [c4,f4]@2 [c4,f4]@2 f4@3 ~, ~@2 d4 [f3,d4], ~@5 bb3@3", // F5 Dm
  S: "b3 ~@5 g4@2 c4 ~@5 e4@2, g3 c3, g4@6 ~@2 g4@3 g3@5, d4!2 e4 g4, ~ b3@3 ~ c4@3",
  T: "a3 ~ a3@2 a3@2 a3@2 a3@2 ~@4 f4@2, a2@4 f4@3 ~, [db4,e4] [e3,db4,e4,a4] d3@2, ~@2 d4!2, ~@5 a3@3", // Dbm A
  U: "[bb3@2 bb3@2 [bb3,d4,f4]@4 bb3@2 ~@2 bb3@2 ~@2 [a3,c4,f4]@2 ~ e4 ~@2 f3@2 ~@3 e4 f4@2 f3 ~, bb2@18 [a3,c4]@8 [a3,c4]@5 ~, [d4,f4]@4 ~@4 [d4,f4]@3 f3@3 bb3@4 f4@2 f4@6 f4@2 ~@4, ~@5 bb3 d4@4 ~@6, ~@12 f4@4 f3@5 ~@3 f3@5 ~@3]/2", // Bb F Am Dm
  V: "[c4,e4]@4 [d4,f4]@4 e4@4 [c3,c4] [d3,d4] ~ [e3,e4], ~@8 g4@7 ~", W: "[f3,a3,c4,f4] ~",
})).s("gm_piano").gain(0.49)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@3 A ~@11 A ~@3 A ~@7 A ~@11 A ~@3 A ~@7 A ~@13>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.32)

// drums · open hat
const open_hat = s("oh").struct("<~@28 x ~@23 x ~@10 [~@3 x] x>").gain(0.26)

// drums · mid tom
const mid_tom = s("mt").struct("<~@11 [~@12 x!4] ~@23 [~@12 x!4] ~@29>").gain(0.39)

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

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

stack(bass, rock_organ, piano, kick, snare, snare_soft, open_hat, mid_tom, crash, ride)

More by Procol Harum