Strudelify

A Fifth Of Beethoven

Walter Murphy

KeyC minorTempo105 bpm
0:00/0:00
// A Fifth Of Beethoven — Walter Murphy
// 105 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 82 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(105/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 · contrabass
const bass = note("<A@2 B@2 ~@2 C D ~@74>".pickRestart({
  A: "[g2!3 ~ eb2@24 ~@4]/2", B: "[f2!3 ~ d2@24 ~@4]/2", C: "~@13 eb2!3", D: "c2 ~@15",
})).s("gm_contrabass").gain(0.5)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@5 A@4 ~ A B C A ~@45 A@4 ~ A B C A ~@14>".pickRestart({
  A: "~@9 [eb4,g4,c5]!3 ~ [eb4,g4,c5]!2 ~", B: "~@9 [eb4,g4,c5]!2 [d4,g4,b4] ~ [d4,g4,b4]!2 ~",
  C: "~@9 [d4,g4,b4]!3 ~ [d4,g4,b4]!2 ~", // G
})).s("gm_electric_guitar_clean").gain(0.24)

// bass · fretless bass
const bass_2 = note(`<
  ~@5 A B A B A@2 C D E F G H I J K L M N A O A O P Q P Q P Q P Q P Q P Q P Q P Q P Q P Q ~@8 P Q P Q A B A B A@2 C D E
  F G H I J K L M N A O A O ~
>`.pickRestart({
  A: "c2 ~@6 c2!2 ~@7", B: "f2 ~@6 f1!2 ~@7", C: "b1 ~@6 b1!2 ~@7", D: "g1 ~@6 g1!2 ~@7",
  E: "c2 ~@3 bb1 ~@3 c2 ~@3 bb1 ~@3", F: "c2 ~@3 ab1 ~@3 b1@3 c2@3 db2@2", G: "~ d2@6 ~ b1@3 c2@3 db2@2",
  H: "~ d2@6 ~ d2@2 ~@5 d2", I: "d2 ~@7 d2 ~@6 d2", J: "d2 ~@7 d2 ~@7", K: "~ [g1,d2] ~ g1!2 c2 ~@2 d2 ~@7",
  L: "~ g1!3 ~ c2!3 c2@4 ~ c2!3", M: "c2@4 ~ c2!4 ~@3 c2 ~@3", N: "c2 ~@3 c2 ~@3 c2@2 ~@2 c2@2 ~@2",
  O: "f2 ~@6 f2!2 ~@7", P: "c3 ~@6 bb2 c3 ~@5 [c2,eb2] ~", Q: "f2 ~@6 eb2 f2 ~@7",
})).s("gm_fretless_bass").gain(0.71)

// chords · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~@5 A B A B C A B@2 D E ~ F G H I J ~@6 K L K L K L K L K L K L K L K L K L K L ~@8 K L K L A B A B C A B@2 D E ~ F G
  H I J ~@7
>`.pickRestart({
  A: "eb4 ~ d4 ~ eb4 ~ d4 ~ eb4 ~ d4 eb4 ~ d4 eb4 c4", B: "d4 ~ c4 ~ d4 ~ c4 ~ d4 ~ c4 d4 ~ c4 d4 c4",
  C: "eb4 ~ d4 ~ eb4 ~ d4 ~ eb4 ~ d4 eb4 ~ d4 eb4 d4", D: "eb4 ~@3 d4 ~@3 eb4 ~@3 d4 ~@3", E: "eb4 ~@3 c4 ~@11",
  F: "~@8 [d4,ab4] ~@3 [d4,ab4] ~@3", G: "[d4,ab4] ~@3 [d4,ab4] ~ [d4,g4] ~ [d4,ab4] ~@3 [d4,ab4] ~@3",
  H: "[d4,ab4] ~@3 [d4,ab4] ~ [d4,g4]@2 [d4,ab4] ~@3 [d4,ab4] ~@3", // Ddim G5 Ddim
  I: "[d4,ab4] ~@3 [d4,ab4]@2 [d4,g4] ~ [d4,ab4] ~@3 [d4,ab4] ~@3", J: "[d4,ab4] ~@3 [d4,ab4] ~@11",
  K: "[c4,g4] ~ [g4,c5] ~ [g4,bb4] [g4,c5] ~@2 [g4,bb4,eb5] ~ [g4,bb4,eb5] [g4,c5] ~ [g4,bb4] [g4,c5] ~", // C5 Gm C5 Eb C5 Gm C5
  L: "~@2 [d4,f4] ~ eb4 f4 d4 ~ [eb4,g4] ~ [eb4,g4] [d4,f4] ~ eb4 c4 ~", // Dm Eb Dm
})).s("gm_electric_guitar_jazz").gain(0.4)

// chords · brass section
const brass_section = note(`<
  ~@23 A B A B ~@4 C D C D C D C D C D C D C D C D E F G H E F G H ~@22 A B A B ~
>`.pickRestart({
  A: "c4", B: "d4", C: "~@2 c4 ~@5 [g4,c5]!2 ~@6", D: "~@2 f4 ~@5 [c5,f5]!2 ~@6", E: "[f4,ab4]@3 [g4,bb4]@4 ~",
  F: "[ab4,c5]@6 [g4,bb4]@7 ~@3", G: "[ab4,c5]@6 [bb4,d5]@7 ~@3", H: "[c5,e5]!2 ~ [c5,g5] ~ [c5,d5] [c5,e5] ~@9",
})).s("gm_brass_section").gain(0.5)

// other · percussive organ
const percussive_organ = note("<~@31 A B A B A B A B A B A B A B A B ~@35>".pickRestart({
  A: "~ g4@3 bb4 ~ c5 ~ eb5 c5 bb4 eb5 ~ bb4 ~ eb5, ~@7 c5", B: "f5 c5 eb5 f5 ~ c5 eb5@2 f5 c5 eb5 f5 ~@4",
})).s("gm_percussive_organ").gain(0.8)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@17 A ~@11 A ~@23 A ~@19>".pickRestart({
  A: "~@12 x!3 ~",
})).gain(0.4)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@3 A B C@9 D C@52 D C@13 ~>".pickRestart({
  A: "~@15 x", B: "x!2 ~@6", C: "x!8", D: "x ~ x ~ x!4",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@17 A ~@11 A ~@23 A ~@19>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@4 A ~@3 B ~@17 B ~@11 B ~@23 B ~@19>".pickRestart({
  A: "~ x ~@2", B: "~@3 x",
})).gain(0.4)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@28 A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~@9 A ~ A ~@23>".pickRestart({
  A: "~ x ~@6",
})).gain(4.72)

stack(
  bass, electric_guitar_clean, bass_2, electric_guitar_jazz, brass_section, percussive_organ, kick, snare, low_tom,
  pedal_hat, mid_tom, open_hat, vibraslap
)