Strudelify

Droste, Horst Du Mich?

Mark 'Oh

KeyC minorTempo180 bpm
0:00/0:00
// Droste, Horst Du Mich? — Mark 'Oh
// 180 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 160 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(180/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 · lead 2 sawtooth · "SAW WAVE"
const bass = note(`<
  ~@19 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 C A C A C A C A C A C A C A C A C A C A C A C A C A C A
  C A C ~ 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 C A C A C A C A C A C A C A C A C A C A C A C
>`.pickRestart({
  A: "~ c2 ~ c2 ~ c2 ~ c2", B: "~@2 c2@2 ~@2 c2@2 ~@2 c2 ~ c2 ~ c2@2", C: "~@2 c2@2 ~@2 c2@2 ~@2 c2@2 bb1 ~ c2@2",
})).s("gm_lead_2_sawtooth").gain(0.35)

// other · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  ~@80 A B A B A B A B ~@12 C D C D E D C D C D C D F G F H G F@2 I A B A B A B A B A B A B A B A B ~@24
>`.pickRestart({
  A: "c4 g4 c4 g4 c4 g4 c4 ab4", B: "c4 g4 c4 g4 c4 g4 c4 bb4", C: "[g3,c4,eb4]", D: "[ab3,c4,f4]", E: "[g3,c4]",
  F: "g4@2 ~@2 g4@2 ~@2 g4@4 f4 ~ g4 ~", G: "g4@2 ~@2 g4@2 ~@2 g4@3 ~ f4 ~ g4 ~",
  H: "g4@2 ~@2 g4@2 ~@2 c4 ~ g4 ~ c4 ~@3", I: "g4@2 ~@2 g4@2 ~@2 c4@2 g4 ~ c4@2 ~@2",
})).s("gm_pad_poly").gain(0.35).pan(0.3)

// other · pad poly · "POLYSYNTH" · soft notes
const pad_poly_soft = note("<~@47 A@24 ~@17 B C D C D C D C B C D C ~@36 A@24>".pickRestart({
  A: "[[c2,g3,eb4]@32 [f1,ab4]@32 eb4@32 d4@31 ~, c4@64 [bb1,bb3]@63 ~, ~@32 f4@95 ~]/8", B: "[g3,c4]",
  C: "[ab3,c4,f4]", D: "[g3,c4,eb4]",
})).s("gm_pad_poly").gain(0.22).pan(0.3)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note("<~@47 A@32 ~@57 A@24>".pickRestart({
  A: "[[c2,g3,eb4]@32 [f1,ab4]@32 eb4@32 d4@31 ~, c4@64 [bb1,bb3]@63 ~, ~@32 f4@95 ~]/8", // Cm Fm Bb
})).s("gm_synth_strings_1").gain(0.1)

// other · lead 1 square · "SQUAREWAVE"
const lead_1_square = note(`<
  ~@19 A B A B A B A B A B A B A B A B A B A B C D C D C D C D ~@33 A B A B A B A B E F E G E H E G E F E G E H E G E F
  E G E H E G ~@8 C D C D C D C D C D C D C D C D ~@24
>`.pickRestart({
  A: "c4 g4 c4 g4 c4 g4 c4 ab4", B: "c4 g4 c4 g4 c4 g4 c4 bb4", C: "[c4,g4] g4 c4 g4 c4 g4 [c4,f4] ab4",
  D: "[c4,g4] g4 c4 g4 c4 g4 [c4,f4] bb4", E: "g4 ~ c4 ~ c4 ~ g4 ~ c4 ~ c4 ~ g4 ~ c4 ~",
  F: "ab4 ~ c4 ~ c4 ~ ab4 ~ c4 ~ c4 ~ bb4 ~ c5 ~", G: "ab4 ~ c4 ~ c4 ~ ab4 ~ c4 ~ c4 ~ eb4 ~ f4 ~",
  H: "ab4 ~ c4 ~ c4 ~ ab4 ~ c4 ~ c4@2 bb4 ~ c5 ~",
})).s("gm_lead_1_square").gain(0.21).pan(0.2)

// other · lead 1 square · "SQUAREWAVE"
const lead_1_square_2 = note("<~@9 A@3 ~@18 A@3 ~@46 A@3 ~@21 A@3 ~@13 A@3 ~@38>".pickRestart({
  A: "[g7 g4@4 ~]/3",
})).s("gm_lead_1_square").gain(0.35)

// other · lead 1 square · "SQUAREWAVE" · soft notes
const lead_1_square_soft = note("<~@8 A ~@20 A ~@48 A ~@23 A ~@15 A ~@41>".pickRestart({
  A: "~@7 g5 ~@8",
})).s("gm_lead_1_square").gain(0.04)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@112 [x ~ x ~@5 x ~@2 x ~@4]!3 ~ [x ~ x ~@5 x ~@2 x ~@4]!3 ~@41>").gain(0.28)

// drums · snare
const snare = s("sd").struct("<~@79 A ~@12 B C@11 ~@8 D@3 ~ D@3 ~@41>".pickRestart({
  A: "~@4 x!12", B: "~@10 x!6", C: "x!16", D: "~@4 x ~@2 x ~ x ~@2 x ~@2 x",
})).gain(0.19)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@79 [x!4 ~@12] ~@8 [x!16]!4 [x!10 ~@6] ~@67>").gain(0.09)

// drums · clap
const clap = s("cp").struct(`<
  ~@31 A B A@3 B A@3 B A@3 B A@2 ~@8 A@17 B A C A B A C ~ A B A C A B A C ~@16 A@8 ~@8 A B A C A B A C A B A C A B A C
  ~@8 A@16
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x ~@2 x ~@2 x ~", C: "~@2 x ~@2 x!2 ~",
})).gain(0.33)

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@11 A@3 B A@3 ~@13 A@3 B A@3 B A@3 B A@3 B ~@8 A@11 B A@3 B ~@9 A@3 B A@3 B ~@8 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B
  A@3 B A@3 B A@3 B A@3 B ~@8 A@11 B A@3 B
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x!3",
})).gain(0.23)

// drums · crash
const crash = s("cr").struct(`<
  ~@19 A ~@3 B ~ B ~ B ~ B C A ~@7 A ~@7 A ~@7 A ~@23 A ~@20 B ~ B C A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@15
>`.pickRestart({
  A: "x", B: "x!2 ~@2", C: "x!4",
})).gain(0.37)

stack(
  bass, pad_poly, pad_poly_soft, synth_strings_1, lead_1_square, lead_1_square_2, lead_1_square_soft, kick, kick_soft,
  snare, snare_soft, clap, pedal_hat, open_hat, crash
)

More by Mark 'Oh