Strudelify
KeyA♭ majorTempo112 bpm
0:00/0:00
// Steam — Peter Gabriel
// 112 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 163 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(112/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 · percussive organ
const percussive_organ = note(`<
  ~@9 A B A B A B A B C D C D A B A B E F ~@2 E F ~@2 G H G H I J G K G H G H I J G K E F L@2 E F L@2 A B A B A B A B C
  D C D A B A B E F ~@2 E F ~@2 G H G H I J G K G H G H I J G K E F L@2 E F L@2 ~@8 M N M N M N M N O P O P M N M N E F
  ~@2 E F ~@2 A B A B A B A B A B A B A B A B A B A B A B A B Q ~
>`.pickRestart({
  A: "[ab4,bb4,db5] ~@3", B: "[ab4,bb4,db5]@3 ~ [ab4,bb4,db5]@3 ~ [eb4,ab4,c5]@3 ~ [eb4,ab4,c5]@3 ~",
  C: "[ab4,bb4,db5]@8 [eb4,ab4] ~@7, ~@4 c5 ~@3", D: "[eb4,ab4,c5]@3 ~ [eb4,ab4,c5]@3 ~ [eb4,ab4,c5]@3 ~@5",
  E: "[b4,eb5,gb5]", F: "[bb4,db5,gb5] [db5,f5,ab5]", G: "bb5@6 ab5 bb5, eb5", H: "[eb5,bb5] ~@7", I: "[f5,bb5,db6]",
  J: "[eb5,ab5,b5]", K: "[eb5,bb5] ~@15", L: "[eb4,bb4,db5]/2", M: "[ab5,bb5,db6] ~@3",
  N: "[ab5,bb5,db6]@3 ~ [ab5,bb5,db6]@3 ~ [eb5,ab5,c6]@3 ~ [eb5,ab5,c6]@3 ~", // Bbm7 Ab
  O: "[ab5,bb5,db6]@8 [eb5,ab5] ~@7, ~@4 c6 ~@3", P: "[eb5,ab5,c6]@3 ~ [eb5,ab5,c6]@3 ~ [eb5,ab5,c6]@3 ~@5",
  Q: "[bb4,eb5]", // Eb5
})).s("gm_percussive_organ").gain(0.08)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~@9 A B A B A B A B C D C D E B E B ~@8 F ~ F ~ G H F ~ F ~ F ~ G H F ~ I J ~@2 I J ~@2 A B A B A B A B C D C D E B E
  B ~@24 I J ~@2 I J ~@34 A B A B A B A B A B A B A B A B A B A B A B A B K ~
>`.pickRestart({
  A: "[bb5,db6]@3 ~@5", B: "[bb5,db6] ~ [bb5,db6] ~ [ab5,c6] ~ [ab5,c6] ~", C: "[bb5,db6]@8 [ab5,c6] ~@7",
  D: "[ab5,c6] ~ [ab5,c6] ~ [ab5,c6] ~@3", E: "[bb5,db6] ~", F: "[eb6,bb6]", G: "[eb6,db7]", H: "[eb6,b6]", I: "b6",
  J: "bb6 ab6", K: "[eb3,eb4]",
})).s("gm_string_ensemble_1").gain(0.06)

// chords · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@81 A ~ A ~ B C A ~ A ~ A ~ B C A ~@67>".pickRestart({
  A: "[eb6,bb6]", B: "[eb6,db7]", C: "[eb6,b6]",
})).s("gm_string_ensemble_1").gain(0.04)

// chords · brass section
const brass_section = note(`<
  ~@9 A@8 B C B D A@4 E F G ~ E F H I ~@24 A@8 B C B D A@4 J F G ~ E F H I ~@32 A@8 B C B D A@4 J F ~@2 E F G ~ A@24 K ~
>`.pickRestart({
  A: "[db4@6 c4@2 db4 ~@5 db4@4 c4@2 db4 ~@11]/2", B: "[ab4,db5]@8 [ab4,c5] ~@7",
  C: "[ab4,c5] ~@3 [ab4,c5] ~@3 [ab4,db5] [ab4,c5] ~@6", // Ab Db5 Ab
  D: "[ab4,c5] ~@3 [ab4,c5] ~@3 [ab4,db5] [ab4,c5] ~ [gb4,bb4] ~@4", E: "[b4,eb5]", F: "[gb4,db5] [ab4,eb5]",
  G: "[bb4,eb5] ~@15", H: "[bb4,eb5] ~@13 eb3@2", I: "eb3 ~@15", J: "[b4,eb5], db4 ~@15", K: "[eb2,eb3]",
})).s("gm_brass_section").gain(0.08)

// chords · brass section · soft notes
const brass_section_soft = note("<~@49 A B C ~ A B C ~@41 A B C ~ A B C ~@59>".pickRestart({
  A: "[b4,eb5]", B: "[gb4,db5] [ab4,eb5]", C: "[bb4,eb5] ~@15",
})).s("gm_brass_section").gain(0.05)

// bass · synth bass 2
const bass = note(`<
  A B C B C B D B D E C E C E D E D F G F H E D E I J K E I J L M N O P Q R S T P@2 O U Q R S T P V J K E I J L E C E D
  E D E C E W X G X H E C E I Y Z E I AA L M N O P Q R S T P@2 O U Q R S T P V J K E I J L E D AB AC AB AC AB AC AB AC
  AB AC AB AC AB AC AB AD AE AF AE AF AB AC AB AG AH AI AB AG AH AI AB AJ E C E C E D E C E C E D E D E C E C E D E D E
  C AK ~
>`.pickRestart({
  A: "eb2 ~ eb2!2 ~ eb2 eb2@8 ~@2", B: "eb1@2 ~@2 eb1@3 ~ gb1@2 ab1@2 bb1@3 ~", C: "eb1 ~ eb1@2 gb1 ab1 gb1 db1",
  D: "eb1@2 ~@2 eb1@3 ~ gb1@2 ab1@2 gb1@2 db1@2", E: "eb1 ~ eb1!2 gb1 ab1 bb1 db1",
  F: "ab1@2 ~@2 ab1@3 ab1!2 ~ ab1@2 gb1@2 ab1@2", G: "ab1@2 ~@2 ab1@3 ab1 ab1@2 eb1@2 gb1@2 eb1@2",
  H: "ab1@2 ~@2 ab1@3 ab1 ab1@2 ab1@2 gb1@2 db1@2", I: "eb1@2 ~@2 eb1@3 db1 eb1@2 gb1@2 ab1@2 bb1@2",
  J: "b1@3 ~ b1@3 b1!2 ~ b1@4 b1 ~", K: "bb1@3 ~ bb1@2 ~ bb1 db2 ~ db2@6", L: "bb1!4 db2!4",
  M: "eb1@2 ~@2 eb1@2 eb1@2 gb1@2 ab1@2 bb1@2 db1!2", N: "eb1@3 ~@13", O: "eb1@4 ~@3 eb1!2 ~ eb1@2 ~@4",
  P: "eb1@4 ~@3 eb1!2 ~ eb1@4 db1@2", Q: "eb1@4 ~@3 eb1 eb1@2 eb1@2 ~@4", R: "eb1@4 ~@3 eb1 eb1@2 eb1@3 ~ ab1@2",
  S: "bb1@4 ~@3 bb1!2 ~ bb1@4 bb1@2", T: "ab1@4 ~@3 ab1!2 ~ ab1@6", U: "eb1@4 ~@3 eb1!2 ~ eb1@3 ~@3",
  V: "eb1@4 ~@3 eb1!2 ~ eb1@4 bb1@2", W: "eb1 ~ eb1@2 gb1 ab1!2 gb1", X: "ab1@2 ~@2 ab1@3 ab1 eb1@2 gb1@2 ab1@2 gb1@2",
  Y: "b1@3 ~ b1@3 b1!2 ~ b1@2 b1@2 b1 ~", Z: "bb1@2 bb1@2 bb1@3 bb1 db2 ~ db2@6",
  AA: "b1@3 ~ b1@3 b1!2 ~ gb1@2 b1@2 gb1@2", AB: "eb1@2 ~@6 gb1@2 ab1 bb1 ~@2 db1@2",
  AC: "eb1@2 ~@4 eb1!2 gb1@2 f1 eb1 ~@2 db1@2", AD: "eb1@2 ~@4 eb1!2 gb1@2 f1 eb1 ~@2 gb1@2",
  AE: "ab1@2 ~@6 eb1@2 eb1 gb1 ~@2 ab1@2", AF: "ab1@2 ~@4 eb1!2 gb1@2 gb1 eb1 ~@2 ab1@2",
  AG: "eb1@2 ~@4 eb1!2 gb1@2 f1 eb1 ~@2 bb1@2", AH: "b1@2 ~@6 b1@2 ab1 gb1 ~@2 b1@2",
  AI: "bb1@2 ~@4 db1!2 db2@2 db2!2 ~@2 db1@2", AJ: "eb1@2 ~@4 eb1!2 gb1@2 ab1 bb1 ~@2 db1@2", AK: "eb1 ~",
})).s("gm_synth_bass_2").gain(0.25)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  A B@23 C ~ A B C ~ A D E B@3 F G H B@5 F G H B C ~ A B C ~ A I J ~@23 A B@3 F G H B@5 F G H B C ~ A B C ~ A D K ~@39 A
  B@16 ~@2
>`.pickRestart({
  A: "~@14 db3!2", B: "eb3!2 db3 ~ eb3 ~ db3 ~ eb3 ~@5 db3!2", C: "eb3!2 db3 ~ eb3 ~ db3 ~ eb3 ~@7",
  D: "eb3!2 db3 ~ eb3 ~ db3 ~ eb3 ~@5 eb2@2", E: "eb2@2 ~@12 db3!2", F: "eb3!2 db3 ~ eb3 ~ db3 ~ eb3 ~@5 ab2!2",
  G: "bb2!2 ab2 ~ bb2 ~ ab2 ~ bb2 ~@5 bb2!2", H: "ab2!3 ~ ab2 ~ ab2 ~ ab2 ~@5 db3!2",
  I: "eb3!2 db3 ~ eb3 ~ db3 ~ eb3 ~@5 [eb2,db3] db3", J: "eb3!2 db3 ~ eb3 ~ db3 ~ eb3 ~@5 eb2 ~", K: "eb2 ~@7",
})).s("gm_electric_guitar_muted").gain(0.11).pan(0.8)

// chords · distortion guitar
const distortion_guitar = note(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B C B C A D A D E F A ~ E F G H ~@7 I J K J K L M J N E O J N E O J N A ~ A ~ A ~ A
  ~ B C B C A D A D E F A ~ E F G P J K J K L M J K J K J K L M J K E O J N E O J Q ~@32 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "[bb3,db4]!9 ~@7", B: "[ab3,db4]!9 ~@7", C: "[ab3,c4]!9 ~@7", D: "[bb3,db4]!8 [ab3,c4]!8", E: "[gb3,b3]",
  F: "[gb3,bb3] [f3,ab3]", G: "[bb3,db4]!9 ~@5 eb2@2", H: "eb2 ~@7", I: "~@14 [ab3,c4]!2",
  J: "[bb3,db4] ~ [ab3,c4] ~ [bb3,db4] ~ [ab3,c4] ~ [bb3,db4] ~@5 [ab3,c4]!2", // Bbm Ab Bbm Ab Bbm Ab
  K: "[bb3,db4]!2 [ab3,c4] ~ [bb3,db4] ~ [ab3,c4] ~ [bb3,db4] ~@5 [ab3,c4]!2", // Bbm Ab Bbm Ab Bbm Ab
  L: "[bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~", // Eb5
  M: "[bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [bb3,eb4] ~ [ab3,c4]!2", // Eb5 Ab
  N: "[bb3,db4]!2 [ab3,c4] ~ [bb3,db4] ~ [ab3,c4] ~ [bb3,db4] ~@7", O: "[gb3,bb3]@8 [f3,ab3]@6 [ab3,c4]!2",
  P: "eb2@2 ~@12 [ab3,c4]!2", Q: "[bb3,db4] ~@15",
})).s("gm_distortion_guitar").gain(0.09).pan(0.3)

// chords · electric guitar jazz
const electric_guitar_jazz = note("<~@129 A@2 B C A@2 B C ~@26>".pickRestart({
  A: "[gb4@6 ~@2 gb4@3 ~ ab4@4, f4 ~@13 db4@8 db4@10]/2", B: "~@4 [bb3,db4,eb4]@3 [bb3,db4,eb4]!2 ~ [bb3,db4,eb4] ~@5",
  C: "[bb3,db4,eb4]@3 [bb3,db4,eb4]!2 ~ [bb3,db4,eb4] ~@9", // Eb7
})).s("gm_electric_guitar_jazz").gain(0.07).pan(0.8)

// other · clavinet
const clavinet = note(`<
  ~ A@24 ~@2 A@2 ~@2 B C ~@18 A@2 ~@2 A@18 ~@2 A@2 ~@2 B C A@4 D E A@6 D E A@2 ~@2 A@2 ~@2 B C ~@32 A@8 ~@2 A@2 ~@2 B C
  A@8 ~@2
>`.pickRestart({
  A: "~@2 eb3!2 ~@2 eb3!2 ~@2 eb3 ~@5", B: "~@2 eb3!2 ~@2 eb3!2 ~@2 eb3 ~@3 eb2@2", C: "eb2 ~@15",
  D: "~@2 bb2!2 ~@2 bb2!2 ~@2 bb2 ~@5", E: "~@2 ab2!2 ~@2 ab2!2 ~@2 ab2 ~@5",
})).s("gm_clavinet").gain(0.06)

// other · overdriven guitar
const overdriven_guitar = note("<~@57 A B@22 C ~@40 D E D E D E D E ~@8 A B@22 F@2 ~>".pickRestart({
  A: "~@4 eb5@5 ~@3 ab5@2 ~@2", B: "[eb5@4 ~@4 bb4@2 db5@2 eb5 ~ eb5@10 ~@4 ab5@3 ~]/2", C: "eb5 ~@7",
  D: "~@4 eb3@2 db3@2 eb3@2 eb3 ~@5", E: "~@2 db3 ~ eb3@2 db3@2 eb3@2 ~@6",
  F: "[eb5@4 ~@4 bb4@2 db5@2 eb5 ~ eb5@16 ~@2]/2",
})).s("gm_overdriven_guitar").gain(0.11)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@8 A ~@3 B ~@7 B ~@19 C ~@5 B ~ C ~@6 A ~@8 D ~@3 B ~@3 D ~@5 E ~@9 C ~@5 B ~ C ~@6 A ~@32 F ~@5 G H D ~@7 D ~@7 D
  ~@2
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@5 x ~ x", C: "~@7 x", D: "~@9 x!2 ~@3 x ~", E: "~@14 x!2", F: "~@10 x ~@4 x", G: "~@7 x!9",
  H: "x",
})).gain(0.18)

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@21 B ~@19 B ~@23 B ~@3 B ~@19 B ~@39 B ~@3 B ~@20>".pickRestart({
  A: "~@7 x", B: "x!8",
})).gain(0.12)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@8 B C B D B D B D B E F D B E F E F B@2 E F G B H A@7 H A@8 F B@2 D B I B E J@7 K J@7 K J@7 H A@7 H A@8 F B@2 D B
  I B E A L A L A L A M A N A N A N A M A N A N A N A M A L A L A L A M J@7 K J@7 K J@4 O P Q R ~@2
>`.pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x!2", C: "x ~ x ~ x ~ x!3 ~ x ~@5", D: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~",
  E: "x ~ x ~ x ~ x!3 ~ x ~ x ~@3", F: "~@2 x ~ x ~ x!3 ~ x ~ x ~ x!2", G: "x ~ x ~ x ~ x!3 ~@3 x ~@3", H: "x",
  I: "x ~@3 x ~ x!3 ~@3 x ~@3", J: "~@2 x ~ x ~ x!3 ~ x ~ x ~@3", K: "~@2 x ~ x ~ x!3 ~ x ~ x ~ x ~",
  L: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", M: "x!5 ~ x ~", N: "x ~ x ~ x ~ x ~ x ~@3 x ~ x!2",
  O: "~@2 x ~@3 x!2 ~@4 x ~ x!2", P: "~ x ~@2 x!2 ~@2", Q: "x ~ x ~@3 x!2 ~@2 x ~@3 x!2",
  R: "~@2 x ~@3 x!2 ~@2 x ~@3 x!2",
})).gain(0.18)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@10 A ~@7 B C ~@2 B C B C ~@2 B C D ~@23 E ~ B@2 F@6 C F@7 C B F@6 ~@22 E ~ B ~@7 D ~ G ~ G ~ G ~ D ~ G ~ G ~ G ~ D
  ~@7 D B F@6 C B F@6 C B F@3 H I J@2 C ~
>`.pickRestart({
  A: "~@3 x", B: "~@7 x", C: "x", D: "~@5 x ~ x", E: "~ x ~@3 x ~ x", F: "x ~@6 x", G: "~@5 x ~@2",
  H: "x ~ x ~ x!2 ~@2", I: "x ~ x!2 ~@2 x ~", J: "~ x!3",
})).gain(0.18)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 [~@3 x] ~@111 [~@5 x!2 ~] ~@42>").gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@49 A ~@7 A ~@15 A ~@23 A ~@39 A ~@7 A ~@7 A ~@6 A ~@2>".pickRestart({
  A: "x",
})).gain(0.12)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~ 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 C@23
  D E F E F E F E F E F E F E F E F E F E F E F E F D@32 C@8 G H G H G H G H G H G H G H G H ~@2
>`.pickRestart({
  A: "x", B: "~@7 x", C: "~@4 x ~@6 x!2 ~@3", D: "~ x ~ x", E: "x!2 ~ x", F: "~@2 x ~@3 x!2", G: "x ~@3 x ~@6 x!2 ~@3",
  H: "~@4 x ~@6 x!2 ~ x ~",
})).gain(0.36)

// … 28 more lines

More by Peter Gabriel