Strudelify
Ganz in weiss cover art

1973 · Portrait of Roy Black

Ganz in weiss

Roy Black

KeyA♭ majorTempo118 bpm
0:00/0:00
// Ganz in weiss — Roy Black
// 118 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 91 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(118/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B C D E F G H E G I J K L M N I O P Q E F G H R S T U V@2 W X Y Z P@2 V@2 W X Y Z P@2 E F G H E G I J K L M N I O
  P Q E F G H R S T U V@2 W X Y Z P@2 V@2 W X Y Z P X Y AA@5
>`.pickRestart({
  A: "eb2@7 ~@3 eb2@2 bb1@7 ~@3 bb1@2", B: "eb2@4 ~@2 eb2@5 ~ f2@4 ~@2 g2@4 ~@2", C: "ab2@8 ~@2 ab2@2 eb2@7 ~@3 eb2@2",
  D: "ab2@5 ~ g2@4 ~@2 f2@4 ~@2 eb2@4 ~@2", E: "ab2@3 ~@2 ab2 eb2@3 ~@3", F: "ab2@6 ~@4 ab2@2 eb2@7 ~@5",
  G: "ab2@7 ~@3 ab2@2 eb2@7 ~@5", H: "ab2@5 ~ g2@4 ~@2 f2@5 ~ eb2@5 ~", I: "bb2@6 ~@4 bb2@2 eb2@7 ~@5",
  J: "bb2@5 ~ g2@6 f2@6 eb2@6", K: "bb2@8 ~@2 bb2@2 eb2@7 ~@5", L: "bb2@4 ~ bb2 eb2@3 ~@3",
  M: "bb2@7 ~@3 bb2@2 eb2@7 ~@3 eb2@2", N: "bb2 g2 f2 eb2", O: "bb2@7 ~@3 bb2@2 eb2@7 ~@5",
  P: "ab2@6 ~@4 ab2@2 eb2@7 ~@3 eb2 ~", Q: "ab2@6 g2@6 f2@5 ~ eb2@4 ~@2", R: "ab2@6 ~@4 ab2@2 eb2@6 ~@4 eb2 ~",
  S: "ab1@5 ~ ab1@5 ~ bb1@5 ~ c2@4 ~@2", T: "db2@6 ~@4 db2@2 ab2@7 ~@3 ab2 ~", U: "db2@5 ~@5 db2@2 ab1@7 ~@5",
  V: "db2@8 ~@2 db2@2 db2@7 ~@5", W: "c2@8 ~@2 c2@2 c2@7 ~@5", X: "b1@8 ~@2 b1@2 b1@7 ~@5",
  Y: "bb1@6 ~@4 bb1@2 eb2@7 ~@5", Z: "bb1@3 ~@2 bb1 eb2@2 ~ eb2@2 ~",
  AA: "[~ bb1@7 eb2@4 ~@2 f2@5 ~@2 g2@5 ~@3 ab2@9 ~@9 eb2@11 ~@4 eb2@2 ~ ab1@34 ~@21]/5",
})).s("gm_acoustic_bass").gain(0.36)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  A B@2 C@2 D@5 E@2 ~ F G@2 H@4 I D@5 J@2 K L M N@6 O@2 P@5 Q R@3 S@6 T@3 U@2 V@2 D@5 J@2 K L M N@6 O@2 W@7 X@5
>`.pickRestart({
  A: "~@2 db6 c6", B: "[bb5@17 ab5@6 g5@7 db6@6 c6@6 bb5@6]/2", C: "[ab5@5 ~]/2",
  D: "[~@5 ab5@7 eb5@48 ~@11 c6@47 ~@2, ~@60 ab5@13 ~@47]/5", E: "[db6@5 c6@6 bb5@6 ab5@6 g5@13 ~@12]/2",
  F: "bb5@20 ~ db5@3", G: "[eb5@5 db5@6 c5@6 bb4@6 db5@13 f5@12]/2",
  H: "[bb5@41 bb5@6 c6@8 ~ bb5@4 g5@6 f5@5 eb5@12 eb6@5 d6@4 db6@4]/4", I: "c6@5 ~",
  J: "[db6@5 c6@6 bb5@6 ab5@6 f5@13 f6@4 e6@4 eb6@4]/2", K: "db6@7 ~", L: "f6", M: "e6",
  N: "[ab5@12 bb5@6 ~@18 bb5@6 ab5@5 g5@18 f5@6 eb5@6 f5@5 eb5@6 d5@6 ~@13 eb6@5 d6@4 db6@3 ~@12 e5@6 f5@6 ~, eb6@25 ~@119, ~@18 ab5@18 ~@58 eb5@33 ~@17, ~@23 d6@24 db6@20 ~@52 c6@17 ~@8]/6",
  O: "[f6@23 ~@12 c6@7 bb5@6, bb5@3 ~, ~@23 e6@25]/2",
  P: "[eb6@23 d6@13 bb5@6 ab5@5 g5@18 f5@6 eb5@6 db6@5 c6@7 bb5@6 ab5@9 ~@5 bb5@2 ~ eb5@2 ~ bb4@2 ~ eb4@2, ab5@36 ~@72 c6@2 ~ ab5@2 ~ c5@2 ~ ab4@2 ~]/5",
  Q: "e4@5 f4@6 ~ [ab4,c5]@6 [bb4,db5]@4 ~@2", // Ab Bbm
  R: "[[c5,eb5]@16 ~ [c5,eb5]@5 ~ f5@9 [c5,eb5]@3 [bb4,db5]@6 ab4@6 eb5@25, ~@22 db5@9 ~@10 c5@31]/3", // Cm Bbm
  S: "[~@11 [c5,ab5]@6 [db5,bb5]@6 [eb5,c6]@7 ~@3 [eb5,c6]@2 [eb5,c6]@5 ~ [eb5,c6]@6 [f5,db6]@6 ~@3 [eb5,c6]@3 ~ db5@5 [c5,ab5]@6 [bb4,g5]@33 ~@4 [bb4,g5]@5 [c5,ab5]@6 [db5,bb5]@18 ~ [db5,bb5]@6, ~@59 bb5@6 ~@79]/6", // Fm Gb Cm Db Cm Fm Eb Fm …
  T: "[[eb5,c6]@9 [db5,bb5]@3 [c5,ab5]@5 [bb4,g5]@6 ~ bb5@31 ~@5 g5@6 [c5,ab5]@6, ~@23 db5@30 ~@6 bb4@6 ~@7]/3", // Cm Gb Fm Eb Fm
  U: "[[db5,bb5]@17 ~ [db5,bb5]@5 [eb5,c6]@6 [db5,bb5]@7 [bb4,g5]@5 [b4,f5]@7]/2", V: "[[c5,eb5]@5 ~@3]/2",
  W: "[eb6@23 d6@13 bb5@6 ab5@5 g5@18 f5@6 eb5@6 db6@5 c6@7 bb5@6 ~ c6@24 ~@18 ab5@5 g5@18 ~ ab5@6, ab5@36 ~@59 ab5@37 bb5@7 ~@4 bb5@17 ~ f5@6 ~, ~@120 d6@19 ~@29, ~@137 c6@7 ~@24]/7",
  X: "[[eb5,g5]@6 ~@8 eb6@6 ~ db6@7 ~@37 ab4@35 ~@20, ~@6 db6@7 c6@8 ~@7 ab5@71 ~@21, ~@7 f6@8 ~@5 bb5@9 c6@71 ~@20]/5", // Eb
})).s("gm_string_ensemble_2").gain(0.15)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~ A@2 B C D E F@2 E D G H G I@4 J F K F@3 E F D L@3 M F N O P F@2 L M F N O P F@2 D E F@2 E D G H G I@4 J F K F@3 E F
  D L@3 M F N O P F@2 L M F N O P F N O Q ~@4
>`.pickRestart({
  A: "~@2 [g3,bb3,eb4] ~@3 [g3,bb3,eb4] ~", B: "~@2 [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~",
  C: "~@6 [ab3,c4,eb4]@3 ~@9 [ab3,db4,f4]@2 ~@4", D: "~@2 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~",
  E: "~@6 [c4,eb4,ab4]@2 ~@10 [c4,eb4,ab4]@3 ~@3", F: "~@3 [c4,eb4,ab4] ~@5 [c4,eb4,ab4] ~@2",
  G: "~@6 [eb4,g4,bb4]@2 ~@10 [eb4,g4,bb4]@3 ~@3", H: "~@3 [eb4,g4,bb4] ~@5 [eb4,g4,bb4] ~@2",
  I: "~@2 [eb4,g4,bb4] ~@3 [eb4,g4,bb4] ~", J: "~@6 [eb4,g4,bb4]@3 ~@9 [eb4,g4,bb4]@2 ~@4",
  K: "~@2 [c4,eb4,ab4] ~@3 [db4,f4,bb4] ~", L: "~@3 [db4,f4,ab4] ~@5 [db4,f4,ab4] ~@2",
  M: "~@3 [db4,e4,ab4] ~@5 [db4,e4,ab4] ~@2", N: "~@3 [b3,d4,f4,ab4] ~@5 [b3,d4,f4,ab4] ~@2",
  O: "~@3 [bb3,db4,eb4,g4] ~@5 [bb3,eb4,g4] ~@2", P: "~@3 [bb3,eb4,g4] ~@5 [bb3,eb4,g4] ~@2",
  Q: "~@8 [bb3,eb4,g4]@2 ~@11 [bb3,eb4,g4]@3", // Eb
})).s("gm_electric_guitar_clean").gain(0.17)

// drums · kick
const kick = s("bd").struct("<~ x!85 [~ x ~@22] [~@5 x ~@18] [~@17 x ~@6] ~@2>").gain(0.16)

// drums · snare
const snare = s("sd").struct(`<
  ~
  [x ~@2 x ~ x!2 ~@2 x ~ x]!84
  [x ~@5 x ~@3 x ~ x ~@5 x ~@4 x]
  [~ x ~@6 x ~@3 x ~ x ~@6 x ~@2]
  [~@3 x ~ x ~@17 x]
  [~@8 x ~@8 x ~@6]
  ~@2
>`).gain(0.16)

// drums · clap
const clap = s("cp").struct("<~@88 [~@3 x ~ x ~@5 x ~@2 x ~@9] ~@2>").gain(0.22)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~ [~ x ~ x]!85 [~@8 x ~@12 x ~@2] ~ [~ x ~] ~@2>").gain(0.49)

// drums · open hat
const open_hat = s("oh").struct("<~@87 [~@5 x ~@17 x] [~@17 x ~@6] ~@2>").gain(0.16)

stack(bass, string_ensemble_2, electric_guitar_clean, kick, snare, clap, pedal_hat, open_hat)

More by Roy Black