Strudelify

Digging in the Dirt

Peter Gabriel

KeyE♭ minorTempo163 bpm
0:00/0:00
// Digging in the Dirt — Peter Gabriel
// 163 bpm, 4/4, key D# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 207 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(163/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 · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  A B@2 ~@31 C@2 D ~ C@2 E@2 F@4 G@2 H@2 I J K L I M N O I P Q R S T U R ~@20 V@2 ~ W@2 X Y Z AA@2 ~@10 C@2 D ~ C@2 E@2
  F@4 G@2 H@2 I J K L I M N O I P Q R S T U R ~@39 AB@2 AC AD ~@26
>`.pickRestart({
  A: "~@8 db4 ~ eb4@6", B: "[~@4 eb3@21 ~@7, db4@3 bb3@2 ~@27, ~ eb4@2 eb4@21 ~@8, ~ ab3 ~@14]/2",
  C: "[[eb1,eb2,eb3,bb3,eb4]@19 ~@13]/2", D: "[eb1,eb2,eb3,bb3,eb4]", E: "[[eb1,eb2,eb3,bb3,eb4]@21 ~@11]/2",
  F: "[[eb1,eb2,eb3,bb3,eb4]@21 ~@10 [eb1,eb2,eb3,bb3,eb4]@20 ~@13]/4", G: "[[eb1,eb2,eb3,bb3,eb4]@11 ~@5]/2",
  H: "[[eb1,eb2,eb3,bb3,eb4]@7 ~]/2", I: "~@8 [bb4,eb5,gb5] ~@5 [bb4,db5,gb5]@2",
  J: "~@2 [bb4,db5,gb5] ~ [bb4,eb5,gb5] ~@7 [bb4,db5,gb5]@2 [bb4,eb5]@2", // Gb Ebm Gb Eb5
  K: "~ bb4 ~@2 [gb4,c5] ~@3 [gb4,c5]@4 ~@2 [gb4,bb4,db5] ~", L: "~@2 [gb4,bb4,db5] ~ [gb4,bb4,db5] ~@11",
  M: "~@2 [bb4,db5,gb5] ~ [bb4,eb5,gb5] ~@7 [bb4,db5] ~ [bb4,eb5] ~, ~@6 gb5 ~", // Gb Ebm Bbm Eb5
  N: "~@4 [gb4,c5] ~@3 [gb4,c5]@3 ~ gb4 ~ [gb4,bb4,db5] ~", // Gbdim Gb
  O: "~@2 [gb4,bb4,db5] ~ [gb4,db5] ~@7 [gb4,c5]@2 [bb4,db5]@2", // Gb Gb5 Gbdim Bbm
  P: "~ db5 [bb4,gb5] ~ [bb4,eb5,gb5] ~@7 [bb4,gb5]@2 eb5 ~, ~@12 db5 ~@3", // Ebm
  Q: "~@4 [gb4,bb4,c5] ~@3 [gb4,bb4,c5]@3 ~ gb4 ~ [gb4,bb4,db5] ~", // Cm7b5 Gb
  R: "~@2 [gb4,bb4,db5] ~ [gb4,bb4,c5] ~@7 [gb4,bb4,db5] ~@3", S: "~@4 [bb4,eb5,gb5] ~@2 [bb4,db5,gb5]",
  T: "~@2 [bb4,db5,gb5] ~ [bb4,d5,eb5,gb5] ~@7 [bb4,gb5]@2 [bb4,eb5] ~, ~@12 db5 ~@3", // Gb Ebm Eb5
  U: "~@4 [gb4,bb4,c5] ~@3 [gb4,bb4,c5]@3 gb4 ~@2 [gb4,bb4,db5] ~", V: "[eb4@12 ~ eb4 bb4 eb5]/2",
  W: "[~@16 eb5@2 [bb4,eb5]@2 ~@2 [bb4,eb5]@2 [bb4,db5] ~ [bb4,db5]@2 ~@2 [bb4,db5] ~, ~@13 eb4@5 ~@14, ~@7 bb4 ~@8, ~@15 db5@2 ~@15]/2", // Eb5 Bbm
  X: "bb4 ~ bb4@2 ~@2 bb4 ~ ab4 ~ ab4 ~@3 ab4 ~", Y: "gb4 ~ gb4 ~@3 gb4 ~ eb4 ~ eb4@2 ~@2 eb4@2",
  Z: "db4 ~ db4 ~@3 db4 ~ bb3 ~ bb3 ~@3 ab3 ~", AA: "[~ eb1@31, eb2]/2", AB: "[eb4@30 ~ eb4]/2",
  AC: "~@8 eb5@2 db5 ~@3 [eb4,db5] ~, ~@6 eb4@5 ~@5", // Eb7
  AD: "~@2 eb4@2 [eb4,bb4,db5] ~@3 [eb4,bb4,db5] ~@3 [eb4,db5]@2 [eb4,bb4,eb5] ~", // Eb7 Eb5
})).s("gm_overdriven_guitar").gain(0.32)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@2 A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B C A@2 B D A@2 B ~ A@2 B ~ E F G H E I G J E
  I K L E F M@2 N O P Q N R S T U V W T U X Y Z A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B C A@2 B AA A@2 B ~
  A@2 B ~ E F G H E I G J E I K L E F M@2 N O P Q N R S T U V W T U X Y N O P Q N O P Q N R S T U V W T U X Y Z A@2 B ~
  A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~ A@2 B ~@3
>`.pickRestart({
  A: "eb1/2", B: "e1@4 eb1@3 ~@9", C: "~@11 eb2@5", D: "~@2 eb2@2 eb2@2 eb2@2 eb2 ~ eb2@2 eb2@2 bb1@2",
  E: "eb1@4 eb1@3 ~@9", F: "~@6 eb1 eb2", G: "c2@3 ~ c2@2 ~@8 c2@2", H: "db2@3 ~ db2@2 ~@6 eb2@4",
  I: "~@2 eb1 ~@3 eb1 eb2", J: "db2@3 ~ db2@2 ~@5 eb2@5", K: "c2@3 ~ c2@3 ~@7 c2@2", L: "db2@2 db2 ~@3 eb2@2",
  M: "[c2@3 ~ c2@2 ~@7 c2@2 db2@4 ~ db2@2 ~@6 eb2@4]/2", N: "ab1@3 ~ ab1@3 ~@7 ab1@2", O: "~ ab1 ~ ab1@2 ~@7 ab1@4",
  P: "c2@4 c2@3 ~@5 c2@2 db2@2", Q: "~ db2!2 ~@3 c2 db2", R: "~@2 ab1 ~ ab1@2 ~@6 ab1@3 ~",
  S: "c2@3 c2@3 ~@5 c2@3 db2@2", T: "~ db2 c2 ~@3 c2 db2", U: "ab1@3 ~ ab1@2 ~@8 ab1@2",
  V: "~@2 ab1@2 ab1@2 ~@6 ab1@2 ab1 ~", W: "c2@3 ~ c2@2 ~@6 c2@2 db2@2", X: "~@2 ab1 ab1@2 ~@7 ab1@2 db2@2",
  Y: "c2@3 ~ c2@2 ~@8 db2@2", Z: "~@2 db2@2 c2@2 ~@6 c2@2 db2 ~", AA: "~ eb2@2 ~ eb2@2 eb2@2 eb2 ~ eb2@2 eb2@2 bb1@2",
})).s("gm_fretless_bass").gain(0.71)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@2 A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 ~@9 Q R S@2 T U V ~@16 W@2 X@2 Y@2 Z@2 AA@2 AB@2
  AC@2 X@2 A@2 B@2 AD@2 B@2 AD@2 B@2 AD@2 B@2 M@4 O@2 P@2 ~@9 Q R S@2 T U V ~@16 W@2 X@2 Y@2 Z@2 AA@2 AB@2 AC@2 AE@3 X@2
  AF@2 X@2 Y@2 Z@2 AA@2 AB@2 AC@2 X@2 A@2 B@2 AD@2 B@2 AD@2 B@2 AD@2 B@2 AD@2 B@2 AD@2 B@2 AD@2 B@2 AD@2 B@2 AG@2
>`.pickRestart({
  A: "[~@14 db4@2 eb4@2 gb4@2 eb4@2 ~@6 gb3@2 ab3 ~, [eb2,eb3]@25 ~@7]/2", // Eb
  B: "[~@14 db4@2 eb4@2 gb4@2 eb4 ~@7 gb3@3 ~, eb3@3 ~, ~ eb2@5 ~@2]/2",
  C: "[~@14 db4@2 [db4,eb4]@2 gb4@2 eb4 ~@7 gb3@2 ab3 ~, eb3@3 ~, ~ eb2@5 ~@2]/2", // Dbsus2
  D: "[~@14 db4@2 eb4@2 gb4@2 eb4 ~@7 gb3@2 ~@2, eb3@23 ~@9, ~@4 eb2@19 ~@9]/2",
  E: "[~@14 db4@2 eb4@2 gb4@2 eb4@2 ~@6 gb3@2 ab3 ~, eb3@3 ~, ~ eb2@5 ~@2]/2",
  F: "[~@14 db4@2 eb4@2 gb4@2 eb4 ~@7 gb3@3 ~, eb3@23 ~@9, ~ eb2@5 ~@2]/2",
  G: "[~@14 db4@2 eb4@2 gb4@2 eb4 ~@7 gb3@2 ab3 ~, eb3@3 ~, ~@4 eb2@19 ~@9]/2",
  H: "[~@15 db4@2 eb4@2 ~ eb4 ~@7 gb3@3 ~, ~ eb3@24 ~@7, ~ eb2@5 ~@2, ~@19 gb4@2 ~@11]/2",
  I: "[~@8 [db4,bb4]@2 [db4,gb4]@2 ~@2 [eb4,ab4] ~@3 [eb4,ab4] ~ [eb4,gb4] ~@7 gb3@2 ab3 ~, eb3@25 ~@7, ~@4 eb2@21 ~@7]/2", // Gb Gb5 Ab5 Ebm
  J: "[~@9 db4@2 [db4,gb4] ~@2 [eb4,ab4] ~@3 [eb4,ab4] ~ [eb4,gb4] ~@7 gb3@3 ~, eb3@3 ~, ~ eb2@5 ~@2, ~@4 bb4 ~@11]/2", // Gb5 Ab5 Ebm
  K: "[~@8 [db4,bb4]@2 [db4,gb4] ~@3 [eb4,ab4] ~@3 [eb4,ab4] ~ [eb4,gb4] ~@7 gb3@2 ab3 ~, eb3@25 ~@7, ~ eb2@5 ~@2]/2", // Gb Gb5 Ab5 Ebm
  L: "[~@8 [db4,bb4]@2 [db4,gb4] ~@3 [eb4,ab4] ~@3 [eb4,ab4] ~ [eb4,gb4] ~@7 gb3@3 ~, eb3@3 ~, ~ eb2@5 ~@2]/2", // Gb Gb5 Ab5 Ebm
  M: "[~@8 [db4,bb4]@2 [db4,gb4] ~@3 [eb4,ab4] ~@3 [eb4,ab4] ~ [eb4,gb4] ~@7 gb3@2 ab3 ~, eb3@3 ~, ~ eb2@5 ~@2]/2", // Gb Gb5 Ab5 Ebm
  N: "[~@8 [db4,bb4]@2 gb4 db4 ~@2 [eb4,ab4] ~@3 [eb4,ab4] ~ [eb4,gb4] ~@7 gb3@2 ab3 ~, eb3@3 ~, ~ eb2@5 ~@2]/2", // Gb Ab5 Ebm
  O: "[~@8 [db4,bb4]@2 [db4,gb4]@2 ~@2 [eb4,ab4] ~@3 [eb4,ab4] ~ [eb4,gb4] ~@7 gb3@2 ab3 ~, eb3@25 ~@7, ~ eb2@5 ~@2]/2", // Gb Gb5 Ab5 Ebm
  P: "[~@8 [db4,bb4]@2 [db4,gb4] ~@3 [eb4,ab4] ~@3 [eb4,ab4] ~ [eb4,gb4] ~@11, eb3@27 ~@5, ~@4 eb2@23 ~@5]/2", // Gb Gb5 Ab5 Ebm
  Q: "[gb4,db5,gb5] ~@2 [gb4,db5] ~ [gb4,gb5] db5 ~ [gb4,db5,f5] ~@2 [gb4,db5,f5] ~@2 [gb4,f5] ~, ~ gb5 ~@6", // Gb5 Gb Gbmaj7
  R: "[gb4,db5,eb5] ~ gb4 [db5,eb5] ~@2 [gb4,db5,eb5] ~ [gb4,db5]@2 [gb4,db5] ~@3 [gb4,db5] [gb4,bb4]", // Ebm7 Dbsus2 Ebm7 Gb5 Gb
  S: "[db5 gb4 [bb4,db5] ~@2 [gb4,bb4,db5] ~ [gb4,ab4,db5] ~@2 [gb4,ab4,db5] ~@3 [gb4,ab4,db5] ~ [gb4,bb4] ~ [gb4,bb4,eb5] ~@3 [gb4,bb4,eb5] ~ [gb4,bb4,eb5] ~ [gb4,eb5] bb4 ~@2 [gb4,bb4,eb5] ~, ~@15 eb5@2 ~@15]/2", // Bbm Gb Gbsus2 Gb Ebm
  T: "[gb4,bb4,db5] ~ [gb4,bb4,db5] ~@3 [gb4,bb4,db5] ~ [gb4,bb4,db5] ~ [gb4,bb4,db5] ~@2 gb4 [bb4,db5] [gb4,bb4]", // Gb Bbm Gb
  U: "~@2 [gb4,bb4] ~@3 [gb4,bb4] ~ [gb4,bb4] ~ [gb4,bb4] ~@3 [gb4,bb4] ~", // Gb
  V: "[db4,gb4,bb4] ~ [db4,gb4,bb4] ~@3 [db4,gb4,bb4] ~ [db4,gb4,bb4] ~ [db4,gb4,bb4] ~@5", // Gb
  W: "[~@2 db4@21 ~ c4@8, ~ c4@2 ~@29, ~@2 ab3@19 ~@11]/2", X: "[c4@2 [ab3,db4]@19 ~@11]/2",
  Y: "[c4@2 [ab3,db4]@20 ~@2 c4@5 ~@3]/2", Z: "[c4@2 [ab3,db4]@12 [ab3,db4]@13 ~ c4@2 [ab3,db4]@2]/2",
  AA: "[c4 [ab3,db4]@9 ~@2 c4@4]/2", AB: "[c4@2 [ab3,db4]@17 ~@9 c4@2 db4 ~]/2", AC: "[c4 [ab3,db4]@10 ~@3 c4@2]/2",
  AD: "[~@14 db4@2 eb4@2 gb4@2 eb4@2 ~@6 gb3@2 ab3 ~, [eb2,eb3]@3 ~]/2", // Eb
  AE: "[c4@2 [ab3,db4]@15 ~ [ab3,db4]@17 ~@5 c4@8, ~@17 c4@2 ~@29]/3", // Db5
  AF: "[c4 ~ db4@21 ~ c4@8, ~ c4@2 ~@29, ~@2 ab3@19 ~@11]/2", AG: "[eb3@3 ~]/2",
})).s("gm_electric_guitar_clean").gain(0.32)

// drums · kick
const kick = s("bd").struct("<~@2 [x!8]!202 [x!7 ~] ~@2>").gain(0.32)

// drums · snare
const snare = s("sd").struct("<~@2 A@31 B A@7 C D A@62 B A@7 C D A@90 ~@2>".pickRestart({
  A: "~ x", B: "~@4 x!2 ~@2 x ~ x ~ x ~@3", C: "~@8 x!2 ~@2 x ~ x ~", D: "x!2",
})).gain(0.32)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@6 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
  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 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@2 B A B A B A B A B A B A B A B A B A@3 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 ~@2
>`.pickRestart({
  A: "x ~ x ~ x!3 ~", B: "x!2",
})).gain(0.32)

// drums · ride
const ride = s("rd").struct(`<
  ~@7 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~ x ~ x",
})).gain(0.32)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<~@2 [x!4]!203 ~@2>").gain(0.46)

stack(overdriven_guitar, bass, electric_guitar_clean, kick, snare, pedal_hat, ride, woodblocks)

More by Peter Gabriel