Strudelify

Duke's End

Genesis

KeyB minorTempo140 bpm
0:00/0:00
// Duke's End — Genesis
// 140 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 2/4 at bar 33, 3/4 at bar 33, 4/4 at bar 36, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: ch 1 "Panpipes" named as a pipe, played on pan flute (its lead 1 square patch is not one)
// note: duplicate parts dropped: ch 5 "Pipe Organ" church organ (copy of ch 4 "Syn Brass" synth brass 2)
// note: Full arrangement: all 86 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(140/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 · pan flute · "Panpipes"
const pan_flute = note("<A B C D E F G H I ~@77>".pickRestart({
  A: "~@2 [g4,c5,d#5] ~", B: "[g4,c5,d#5] ~ [f4,c5,d5] ~", C: "[f4,c5,d5] ~ [f4,a#4,d5] g4",
  D: "[f4,a#4,d5] [g#4,c5]@3", E: "d#4 ~ [g4,a#4,d#5] ~", F: "[g4,a#4,d#5] ~ [f4,a#4,d5] g4",
  G: "[f4,a#4,d5] ~ [d#4,g#4,c5] f4", H: "[d#4,g#4,c5] g4 [f4,a#4,d5] g4", I: "[f4,a#4,d5] d4 ~@2",
})).s("gm_pan_flute").gain(0.26)

// bass · synth bass 2 · "Bass Pedals"
const bass = note("<~@8 A@8 B@8 C@3 ~@37 D@4 E@2 F@2 G@4 H I@5 J@4>".pickRestart({
  A: "[~ c1@8 c1@4 c1@3]/8", B: "[~ c1@4 c1@4 c1@4 c1@3]/8", C: "[~ c1@4 ~]/3", D: "b1/2", E: "a1/2", F: "g1/2",
  G: "f#1", H: "g1", I: "[g1@3 c2@4 a1@4 a1@3 b1@4 g1@2]/5", J: "[~@2 e1@11 ~ b1@50]/4",
})).s("gm_synth_bass_2").gain(0.51)

// bass · fretless bass · "Bass Guitar"
const bass_2 = note(`<
  ~@8 A@3 B C B C B C B C B C B C B C B D@2 E F@2 G H I J K L M N@26 O@4 P@2 Q@2 ~@2 R@2 S T U@8
>`.pickRestart({
  A: "[~@4 c2@2 c2@3 c2 c2@2 c2!2 c2@3 c2 c2@2 c2!4]/3", B: "c2 c2@6 c2", C: "c2 f1 g1 a#1 c2!4",
  D: "[c2 f1 g1 g#1 a1@3 a1@2 a1 a1@4 a1@2]/2", E: "a1!4", F: "[a1@2 a1@2 g1@3 g1@2 g1 g1@4 g1@2]/2", G: "g1!4",
  H: "g1!2 a1!2", I: "b1!3 e1", J: "e1!2 f#1!2", K: "f#1 g1!3", L: "b1!4", M: "b1!2 ~ b1 b1@2 b1@2",
  N: "b1@2 b1 b1@2 b1!3", O: "b1/2", P: "a1/2", Q: "g1/2", R: "f#1@2 f#1 f#1@2 f#1 f#1@2", S: "g1@3 g1@5",
  T: "g1@3 g1@3 c2@2", U: "[g1@4 c2@4 g1@4 a1@6 a1@10 a1@6 a1@6 b1@16 g1@5 g1@5 e1@5 ~ e1@6 b1@50]/8",
})).s("gm_fretless_bass").gain(0.51)

// chords · synth brass 2 · "Syn Brass"
const synth_brass_2 = note(`<
  ~@11 A@2 B@2 C@2 A@4 B@2 C@2 D@3 E@3 F G H I@2 J@2 ~@12 K L M N O P K L M N O@4 Q@8 R@4 S T@2 U V W@5
>`.pickRestart({
  A: "[~ [c4,e4,g4]@3 [c4,d4,f4]@2 [c4,e4,g4]@6 ~@4]/2", // C Dm7 C
  B: "[~ [a#3,d4,f4,a4]@3 [a#3,d4,f4,g4]@2 [a#3,d4,f4,a4]@6 ~@4]/2", // A#maj7 Gm7 A#maj7
  C: "[~ [c4,f4,a4]@3 [c4,e4,g4]@2 [c4,f4,a4]@6 ~@4]/2", // F C F
  D: "[~ [c4,f4,a4]@3 [c4,e4,g4]@2 [c4,d4,f4]@6 [c#4,d4,a4]@2 g4 [c#4,d4,f#4,a4]@5 [g2,b2,d3]@2 [a2,c#3,e3]@2]/3", // F C Dm7 Dmaj7 G A
  E: "[[b2,d3,f#3]@4 [b2,d3,g3]@4 [c#3,e3,a3]@13 e4 f#4 g4 [b3,d4,e4,f#4,a4]@4 g4@2 [b3,d4,e4,f#4,a4]@10 ~@2 c#3@2 d3@4]/3", // Bm G A Bm7
  F: "e3@3 d4@2 c#4@3 [b2,d3]@4 [a2,e3]@4, ~ a3", G: "[b2,d3,g3]@2 [a2,d3,f#3] [a2,c#3,e3]",
  H: "[f#2,b2,d3]@2 [f#2,b2,d3] [f#2,b2,d3]@3 [g2,b2,e3]@2", // Bm Em
  I: "[[g2,b2,e3] [g2,b2,e3]@3 [a2,c#3,f#3]@2 [a2,c#3,f#3] [a2,c#3,f#3]@3 [a2,b2,d3,g3]@2 [a2,b2,d3,g3] g3@3]/2", // Em F#m G
  J: "[d#3,b3]/2", K: "[e3,g#3,b3]@3 [e3,a3,c#4]@3 [e3,g#3,b3]@2", L: "[f#3,b3,d#4]@3 [f#3,b3,d#4]@3 ~@2",
  M: "[f#3,a#3,c#4]@3 [f#3,a#3,c#4]@3 ~@2", N: "[g3,b3,d4]@3 [a3,c#4,e4]@3 [g3,b3,d4]@2",
  O: "[a3,d4,f#4]@3 [a3,d4,f#4]@3 ~@2", P: "[a3,c#4,e4]@3 [a3,c#4,e4]@3 [g3,b3,d4]@2",
  Q: "[a3,b3,d4,f#4]@3 [a3,b3,d4,f#4]@3 ~@2", R: "[g#3,b3,e4]@3 [g#3,b3,e4]@3 ~@2",
  S: "~@2 d3@2 e3@2 f3@2 g3@2 a3@2 b3@2 c4 d4, ~@3 c3@5",
  T: "[[f3,a3,c4,e4]@2 d4 [a3,c4,f4]@2 d4 [e4,g4]@2 [d4,f4]@2 [e4,g4]@4 ~ e3, ~@3 b3@4 ~]/2", // Fmaj7 F Em Dm Em
  U: "f#3@2 g3@2 a3@2 b3@2 c#4@2 d4 e4 [g3,b3,d4,f#4]@4, ~ d3@5 ~@2", V: "e4 [b3,d4,g4]@2 e4 [a3,c#4,a4]@4",
  W: "[[g3,g4]@4 f#4@4 f#4@10 e4@11 ~ [f#3,d#4,f#4]@50]/5", // G D#m
})).s("gm_synth_brass_2").gain(0.26)

// chords · overdriven guitar · "Rhythm Guitar"
const overdriven_guitar = note("<~@38 A B C D E F A B C D E F A B C D E F A B C D E@4 G@8 H@4 ~@10>".pickRestart({
  A: "[e3,g#3,b3]@3 [e3,a3,c#4] ~@2 [e3,g#3,b3] ~", B: "[f#3,b3,d#4]@3 [f#3,b3,d#4] ~@4",
  C: "[f#3,a#3,c#4]@3 [f#3,a#3,c#4] ~@4", D: "[g3,b3,d4]@3 [a3,c#4,e4] ~@2 [g3,b3,d4] ~",
  E: "[a3,d4,f#4]@3 [a3,d4,f#4] ~@4", F: "[a3,c#4,e4]@3 [a3,c#4,e4] ~@2 [g3,b3,d4]@2",
  G: "[a3,b3,d4,f#4]@3 [a3,b3,d4,f#4] ~@4", H: "[g#3,b3,e4]@3 [g#3,b3,e4] ~@4",
})).s("gm_overdriven_guitar").gain(0.31)

// other · piano · "Key Stabs" · B
const piano = note("<~@56 [~@4 [b4,b5] ~ [b4,b5] ~@5 [b4,b5] ~@3]!8 ~@22>").s("gm_piano").gain(0.41)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A B C D E@2 B F G H I E J K L M N O P Q R B S E T U V W E@2 X@13 Y X@2 Y Z X Y@2 AA AB@4 AC@5 AD AC AE AF AG AH C
  AI E AJ Z AK AL AM ~@3
>`.pickRestart({
  A: "~@2 x!2", B: "x ~ x ~ x ~ x!2", C: "x ~ x!3 ~ x!2", D: "x!2 ~@2 x ~ x ~", E: "x!4", F: "~ x!4 ~ x!2",
  G: "~ x ~ x!3 ~ x", H: "x!2 ~@2 x ~@3", I: "x ~ x ~ x ~@2 x", J: "x ~@3 x!4", K: "x!2 ~ x!2 ~ x ~", L: "~@4 x!2 ~ x",
  M: "~ x ~ x ~ x ~@2", N: "x ~ x ~ x!3 ~", O: "x ~ x!3 ~@2 x", P: "x ~ x!6", Q: "~@2 x!3 ~ x ~", R: "x ~ x!3 ~ x ~",
  S: "~ x ~ x ~ x ~ x", T: "x ~ x ~ x!2 ~ x", U: "x ~ x!2 ~ x!2 ~", V: "x!2 ~@2 x ~@2 x", W: "~ x!3",
  X: "x ~@2 x ~ x!3", Y: "x ~@2 x ~ x!2 ~", Z: "x!2 ~ x ~ x!3", AA: "x ~@2 x!3 ~@2", AB: "x ~@2 x ~ x ~ x",
  AC: "x ~@2 x ~ x ~@2", AD: "x ~@2 x!2 ~@3", AE: "x ~@2 x ~@4", AF: "x!4 ~ x!3", AG: "x ~ x!2 ~@4", AH: "x!4 ~ x!2 ~",
  AI: "x ~ x!2 ~ x!3", AJ: "x ~ x ~@2 x!2 ~", AK: "~ x!2 ~ x ~@3", AL: "x ~@3 x ~@3 x ~@4 x ~@2",
  AM: "~@2 x ~@5 x ~@2 x ~@2 x ~",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A B C D E F G H I J K L M N O ~ P Q R S T U V C W X Y Z T AA AB@5 AC AB@8 AD@2 AE AB AF AG AH M AG AF@2 AG AI@5 AJ
  AK AL AM AN AO AE AP AQ AM AR P AS ~@4
>`.pickRestart({
  A: "~@5 x ~@2", B: "x ~@3 x ~@5 x!2 ~@4", C: "~@4 x!2 ~@2", D: "~@6 x!2", E: "~ x ~@4 x ~",
  F: "x ~ x!2 ~@2 x ~@3 x ~@3 x ~", G: "~@3 x ~ x ~@2", H: "x ~@3 x ~@5 x!2 ~@2 x ~", I: "x ~ x!2 ~@12",
  J: "x!2 ~@3 x!2 ~", K: "x ~ x!2 ~@4", L: "~@14 x!2", M: "~@2 x!2 ~@4", N: "~ x ~ x!2 ~ x ~", O: "x!2 ~@4 x ~",
  P: "~ x", Q: "x!2 ~ x ~@2 x!2", R: "~ x ~@2 x ~ x!2", S: "~@3 x!2 ~ x ~", T: "x ~ x ~ x ~ x!2", U: "~ x ~ x!3 ~ x",
  V: "~ x ~ x ~@2 x!2", W: "~ x!3 ~@2 x ~", X: "x ~ x!2 ~@2 x ~", Y: "x ~ x!2 ~ x!2 ~", Z: "x!3 ~ x ~@2 x",
  AA: "~ x!4 ~@3 x ~@7", AB: "~ x ~ x", AC: "~@2 x ~@2 x!3", AD: "~@2 x ~@3 x!2", AE: "~@2 x ~@2 x!2 ~",
  AF: "~@2 x!2 ~@2 x ~", AG: "~@2 x!2 ~ x!3", AH: "~@2 x!2 ~@2 x!2", AI: "~@2 x!2 ~ x!2 ~", AJ: "~ x ~ x ~@4",
  AK: "x!2 ~ x ~@4", AL: "~@2 x!3 ~@3 x!2 ~@2 x ~@3", AM: "x ~@2 x ~@4", AN: "~ x ~@3 x ~ x", AO: "~@2 x!2 ~@12",
  AP: "~@2 x ~ x ~ x!2", AQ: "~ x ~ x ~ x!2 ~", AR: "~ x!2 ~", AS: "~@3 x ~@4",
})).gain(0.41)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@8 A B C D E F G H ~ I F J ~ E ~ K L ~ M N O N M P ~@3 Q R ~@17 A ~@4 A ~@3 S ~@5 A T U ~@2 V ~ W ~@2 X Q ~ Y ~@3
>`.pickRestart({
  A: "~@7 x", B: "~@3 x ~@2 x ~@7 x ~", C: "x ~@2 x ~@4 x ~@7", D: "x!2 ~@5 x", E: "x ~@6 x", F: "~@5 x!2 ~", G: "x",
  H: "~@3 x ~@2 x ~", I: "~@2 x!2 ~@3 x", J: "~@8 x!3 ~@5", K: "x!4", L: "~@11 x ~@3 x", M: "~@2 x!2 ~@4", N: "~ x ~@2",
  O: "~@2 x ~@3 x ~@8 x", P: "~ x!3 ~@4", Q: "~@3 x", R: "~@8 x ~ x!2 ~@4", S: "~@2 x!3 ~ x ~@6 x ~ x", T: "~@6 x!2",
  U: "~@10 x!2 ~@4", V: "~@12 x!2 ~ x", W: "~ x!2 ~@5", X: "~@5 x ~@2", Y: "~@2 x ~@2 x ~@2 x ~ x ~@5",
})).gain(0.41)

// drums · hihat
const hihat = s("hh").struct("<~@38 A@8 B C A@3 B A B A D A@2 B E F@5 G@2 F@2 ~@17>".pickRestart({
  A: "x!4", B: "x ~ x ~ x ~@2 x", C: "~ x!3", D: "x ~ x ~@2 x!2 ~", E: "~@5 x ~ x", F: "~ x ~ x", G: "~@2 x ~@3 x!2",
})).gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@8 A B C D E F@2 G H ~ I J K L M N O P Q R S T G ~ G ~ S L U V ~@11 W ~@12 X Y ~@4 W Z AA Q A AB AC AD AE S AF AG AH
  AI AJ ~@3
>`.pickRestart({
  A: "~@3 x", B: "x ~@8 x ~@2 x ~@2 x", C: "~ x!2 ~@3 x!2", D: "~@3 x ~ x ~@2", E: "x ~ x ~ x!2 ~@2", F: "~ x ~@2",
  G: "x!2 ~@6", H: "x ~ x!3 ~ x!2", I: "~@4 x!3 ~@7 x ~", J: "x ~@5 x!2 ~@8", K: "~@3 x ~@2 x!2", L: "~@5 x ~@2",
  M: "~@2 x!2 ~@4", N: "~@4 x ~@9 x!2", O: "~@4 x!3 ~@5 x!2 ~@2", P: "~@5 x!2 ~", Q: "~@3 x ~@4", R: "~ x ~@5 x",
  S: "~@7 x", T: "x", U: "~@4 x ~ x!2 ~@8", V: "~@6 x!3 ~@5 x ~", W: "~@6 x!2", X: "~@10 x!2 ~@2 x!2",
  Y: "~@5 x!3 ~@3 x!2 ~ x ~", Z: "~ x ~ x", AA: "~ x!3 ~ x ~@2", AB: "~@13 x ~@2", AC: "~@6 x!2 ~@2 x!2 ~@4",
  AD: "~@6 x ~@5 x ~ x!2", AE: "~@3 x!2 ~@2 x", AF: "~@4 x!2 ~@2", AG: "x!2 ~ x ~@4", AH: "~@2 x!3 ~ x ~@9",
  AI: "x ~@3 x ~@3 x ~@2 x ~@4", AJ: "~@11 x ~@4",
})).gain(0.41)

// drums · open hat
const open_hat = s("oh").struct("<~@28 A ~@8 B ~@8 C ~@4 C ~ C ~ D ~@2 C D ~@26>".pickRestart({
  A: "x!2 ~@2", B: "~@7 x", C: "~@3 x", D: "~ x",
})).gain(0.41)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@8 A B C D E F G H I ~ J K L E M N M ~ H O D E ~ P ~ Q ~ E R S ~@11 T ~@9 U V W V X ~@3 Y O L Z AA AB U AC AD AE ~ AF
  AG AH AI AJ ~@3
>`.pickRestart({
  A: "~@11 x ~@4", B: "~@2 x ~ x!2 ~@10", C: "~ x ~@6 x ~ x ~@5", D: "~@2 x!2", E: "~@3 x ~@4", F: "x ~@2 x ~@4",
  G: "~ x ~ x ~@3 x", H: "~ x ~@2", I: "~@2 x ~@8 x ~@4", J: "x!4 ~@2 x ~@9", K: "~@2 x!2 ~@12", L: "~@4 x!2 ~@2",
  M: "x!2 ~@6", N: "x", O: "~@5 x ~@2", P: "~@4 x ~@2 x ~@4 x ~ x ~", Q: "~ x ~@3 x ~@2", R: "x ~ x!2 ~@12",
  S: "~@4 x!3 ~", T: "~@10 x!2 ~@4", U: "~@3 x", V: "~ x ~@6", W: "~@2 x ~@7 x!2 ~@2 x ~", X: "~@2 x ~@5 x!3 ~@5",
  Y: "~@12 x ~ x!2", Z: "x ~@7 x!2 ~@6", AA: "~@13 x!3", AB: "~@5 x ~ x", AC: "~@4 x!2 ~@2 x!2 ~@6",
  AD: "x!2 ~@3 x ~@2", AE: "~@5 x!2 ~", AF: "~@2 x!2 ~@8 x ~ x ~", AG: "~@12 x!2 ~@2", AH: "x ~@2 x", AI: "~@13 x ~@2",
  AJ: "x ~@4 x ~@2",
})).gain(0.41)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A B C D E ~ F G H I J ~ K D L M ~ L N O A L P A Q@2 D ~ F ~@13 R ~@5 R ~@2 S ~ R@3 T@5 U S C T Q C T I Q V W X Y Z
  ~@3
>`.pickRestart({
  A: "~ x", B: "~@3 x ~ x ~@2", C: "~@3 x ~@4", D: "~ x ~@6", E: "~@3 x ~@3 x", F: "x!2 ~ x", G: "~@5 x!2 ~",
  H: "x ~@3 x ~@2 x", I: "~ x ~@2 x ~ x ~", J: "~@5 x ~@2", K: "~ x ~ x ~@4", L: "~@4 x ~@2 x", M: "~ x ~@2",
  N: "~@8 x ~@4 x ~@2", O: "~@2 x!2", P: "~@3 x", Q: "x ~@2 x ~@2 x ~", R: "x", S: "x ~@2 x", T: "x ~@2 x ~@4",
  U: "x ~@4 x ~@4 x ~@5", V: "x ~ x ~@4 x", W: "~ x!3", X: "~ x ~@2 x ~@3", Y: "x!3 ~", Z: "~@7 x",
})).gain(0.41)

// drums · ride
const ride = s("rd").struct("<~@9 [x!2 ~ x] [~ x ~@2] ~@75>").gain(0.41)

stack(
  pan_flute, bass, bass_2, synth_brass_2, overdriven_guitar, piano, kick, snare, low_tom, hihat, mid_tom, open_hat,
  high_tom, crash, ride
)

More by Genesis