Strudelify
Walk Through the Fire cover art

Rated PG

Walk Through the Fire

Peter Gabriel

KeyD♭ majorTempo102 bpm
0:00/0:00
// Walk Through the Fire — Peter Gabriel
// 102 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 93 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(102/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 · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  A B C B@5 D B E D F B D B G H I J K H K L M@7 N M K H I O K H I P Q R S P Q R T U Q V W ~@6 X Y G H I J K H K L G H I
  J K H K L K H K L K H K Z AA@3 AB ~@5
>`.pickRestart({
  A: "[db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2] ~@2 [db2,ab2] ~ [db2,ab2]@2 [db3,ab3] ab2@2 ~, ~@13 db2 ~@2", // Db5
  B: "[db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2] ~@2 [db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2] ~@2", // Db5
  C: "[db2,ab2] ~ [db2,ab2]@2 [db3,ab3] ab2@2 ~ [db2,ab2] ~ [db2,ab2]@2 [db3,ab3] ab2@2 ~, ~@5 db2 ~@7 db2 ~@2", // Db5
  D: "[db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2] ~@2 [db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2]@2 ~", // Db5
  E: "[db2,ab2] ~ [db2,ab2]@2 [db3,ab3] ab2@2 ~ [db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2]@2 ~, ~@5 db2 ~@10", // Db5
  F: "[db2,ab2] ~ [db2,ab2]@2 [db3,ab3] db2@2 ~ [db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2] ~@2, ~@5 ab2 ~@10", // Db5
  G: "db2@4 eb2 ~@5 eb2 f2 ~ gb2 ~@2", H: "e2@4 gb2 ~@5 b2 bb2 ~ gb2@3", I: "db2@4 eb2 ~@5 eb2@2 e2 gb2@3",
  J: "ab2@4 db3 ~@5 bb2@2 [eb3,e3] bb2 ~@2", K: "db2@4 eb2 ~@5 eb2 e2 ~ gb2@3",
  L: "ab2@2 ~@2 db3 ~@5 bb2 ~ eb3 bb2@2 ~",
  M: "[db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2]@2 ~ [db2,ab2] ~ [db2,ab2]@2 [db3,ab3] [db2,ab2]@2 ~", // Db5
  N: "[db2,ab2] ~ [db2,ab2]@2 ab3 [db2,ab2]@2 ~ [db2,ab2] ~ [db2,ab2]@2 ~ [db2,ab2]@2 ~, ~@4 db3@2 ~@6 [db3,ab3]@3 ~", // Db5
  O: "ab2@4 db3 ~@5 bb2 ~ eb3 bb2@2 ~", P: "d3@13 ~ d3@2", Q: "eb3@13 ~ eb3@2", R: "f3@13 ~ f3@2", S: "gb3",
  T: "gb3@13 ~ gb3@2", U: "d3@7 d3", V: "f3@13 ~@3", W: "gb3@11 ~@5", X: "~@15 db2",
  Y: "ab2@4 db3 ~@5 db2 ab2 bb2 eb3@2 ~", Z: "ab2", AA: "db2@15 ~", AB: "db2@7 ~",
})).s("gm_synth_bass_2").gain(0.6).pan(0.2)

// chords · banjo
const banjo = note(`<
  ~@16 A B C D E F G H ~@9 A B C D E F G ~@20 A B C D E F G H A B C D E F G H E F G H E F G H A@8 I
>`.pickRestart({
  A: "[db3,ab3,db4] [db3,ab3] [db3,ab3,db4]!3 [ab3,db4] db3 [ab3,db4] [db3,db4] [db3,ab3] db4 [db3,ab3,db4] ab3 [db3,ab3,db4] [ab3,db4] [e3,bb3,eb4]", // Db5 Db Db5 Eb
  B: "[bb3,eb4] [e3,bb3,eb4] e3 [bb3,eb4] [e3,bb3,eb4]!2 e3 [e3,bb3,eb4] [e3,bb3] [e3,bb3,eb4] e3 [e3,bb3,eb4] [e3,eb4] [e3,bb3,eb4] e3 [e3,bb3,eb4]", // Eb5 Eb Eb5 Eb Edim Eb Emaj7 Eb
  C: "[db3,ab3,db4] ab3 [db3,ab3,db4]!7 [ab3,db4] [db3,ab3,db4]!6", // Db5
  D: "[ab2,ab3,eb4]!3 [ab2,ab3] [ab2,ab3,eb4] ab3 [ab2,ab3,eb4]!4 [bb2,ab3,eb4]!6", // Ab5 Ab Ab5 Ebsus4
  E: "[db3,ab3,db4] [db3,ab3] [db3,ab3,db4]!6 [db3,db4] [db3,ab3,db4]!6 [ab3,db4]", F: "[e3,bb3,eb4]!15 [bb3,eb4]",
  G: "[db3,ab3] [db3,ab3,db4]!2 [ab3,db4] [db3,ab3,db4] [db3,ab3] [db3,ab3,db4]!10", H: "[ab2,ab3,eb4]!16",
  I: "[db3,ab3,db4] ~@15", // Db5
})).s("gm_banjo").gain(0.42)

// chords · banjo · soft notes
const banjo_soft = note(`<
  ~@16 A B C D E ~ F ~@10 A B C D E ~ F ~@20 A B C D E ~ F ~ A B C D E ~ F ~ E ~ F ~ E ~ F ~ A@8 ~
>`.pickRestart({
  A: "~ db4 ~@3 db3 ~ db3 ~@2 db3 ~ db3 ~ db3 ~", B: "e3 ~@15", C: "~ db3 ~@7 db3 ~@6", D: "~@3 eb4 ~ ab2 ~@10",
  E: "~ db4 ~@13 db3", F: "db4 ~@2 db3 ~ db4 ~@10",
})).s("gm_banjo").gain(0.24)

// bass · slap bass 1 · "SLAPBASS 1"
const bass_2 = note("<~@58 [~@15 db2] [ab2@4 db3 ~@5 db2 ab2 bb2 eb3@2 ~] ~@33>").s("gm_slap_bass_1").gain(0.48)

// chords · pad warm · "WARM PAD"
const pad_warm = note("<~@7 A@8 B ~@8 C@8 ~@8 D@2 E@5 F@3 G@2 ~@41>".pickRestart({
  A: "[db4@15 eb4@16 e4@4 eb4@4 ~ eb4@3 db4@9 b3@4 [db4,db5]@16 [eb4,eb5]@15 ~ e4@3 eb4@4 ~ eb4@4 [db4,db5]@3 [db4,db5]@3 ~ [b3,b4]@3 ~ [db4,db5]@16 ~, ~@7 ab4@9, ~@87 e5@3 ~ eb5@9 ~@28]/8", // Db Eb Db B Db
  B: "[eb4,ab4,eb5]", // Ab5
  C: "[[db4,db5]@16 [eb4,eb5]@16 [e4,e5]@3 eb4@4 ~ eb4@4 ab4@4 ~@4 [b3,b4]@4 [db4,db5]@16 [eb4,eb5]@15 [e4,e5]@4 [eb4,eb5]@9 db4@4 db4@4 [b3,b4]@4 [db4,db5]@11 ~@5, ab4@11 [db4,db5]@2 ~@12 db5@2 ~@5, ~@35 eb5@9 ~@4 ab4@23 ~ ab4@52 ~@4]/8", // Db Eb E B Db Eb E Eb …
  D: "[d5@15 ~@5 db6@7 ~@5, a4, ~@15 eb5@17]/2",
  E: "[f5@15 gb5@16 ~@9 db6@6 ~@2 eb5@15 db5@9 ~@8, db5@7 ~@24 a4@32 ~@17, ~@31 d5@17 ~@32]/5",
  F: "[~@31 eb5@16 ~, ~@15 d5@16 ~@17, ~ a4@2]/3", G: "[f5@15 gb5@14 ~@3, db5 ~@3]/2",
})).s("gm_pad_warm").gain(0.42)

// chords · pad warm · "WARM PAD" · soft notes
const pad_warm_soft = note("<~@40 A B C D E F@4 G H I ~@41>".pickRestart({
  A: "~@2 [db5,db6]@3 ~@3", B: "~ db5@3", C: "~@7 [db5,db6]@8 ~", D: "~ db6, ~@4 db5@3 ~", E: "~@8 db5@7 ~",
  F: "[~@8 [db5,db6]@7 ~@9 db6@7 ~@9 db5@16 [db5,db6]@7 ~, ~@15 f5@16 gb5@16 ~@17, ~@3 db5@2 db6 ~@2]/4", // Db
  G: "~ [db5,db6]", H: "~@8 db6@7 ~, ~@8 db5@3 ~@5", I: "~@4 db6@3 ~, ~@8 db5@3 ~@5",
})).s("gm_pad_warm").gain(0.18)

// bass · fretless bass · "FRETLESS"
const bass_3 = note("<~@40 A B C D E F G H I J K F ~@31 L M@3 N ~@5>".pickRestart({
  A: "d2@14 gb2 a2", B: "eb3@14 db3 eb3", C: "[db3,eb3] ~@13 b2 db3", D: "[b2,db3] ~@15", E: "d2 gb2 a2 db3@5",
  F: "eb3", G: "f3@14 eb3 f3", H: "db3, eb3 ~@15", I: "g2 [ab2,b2] ~@12 g2 ab2, ~ a2@13 ~@2", J: "b2@14 g2 ab2",
  K: "db3@14 g2 ab2", L: "ab2", M: "db2@15 ~", N: "db2@7 ~",
})).s("gm_fretless_bass").gain(0.36).pan(0.9)

// other · brass section · "BRASS 1"
const brass_section = note("<~@68 A B C D A B E F G B C F A B H I ~@9>".pickRestart({
  A: "[db4,db5]@4 [eb4,eb5] ~@5 [eb4,eb5] [e4,e5] ~ [gb4,gb5] ~@2", // Db Eb E Gb
  B: "[e4,e5]@4 [gb4,gb5] ~@5 [b4,b5] [bb4,bb5] ~ [gb4,gb5] ~@2", // E Gb B Bb Gb
  C: "[db4,db5]@4 [eb4,eb5] ~@5 [eb4,eb5] ~ [e4,e5] [gb4,gb5]@2 ~", // Db Eb E Gb
  D: "[ab4,ab5]@4 [db5,db6] ~@5 [bb4,bb5] ~ [bb4,bb5] [eb5,eb6] ~@2", // Ab Db Bb Eb
  E: "[db4,db5]@4 [eb4,eb5] ~@5 [eb4,eb5] ~ [e4,e5] gb4@2 ~, ~@13 gb5 ~@2", // Db Eb E
  F: "[ab4,ab5]@4 [db5,db6] ~@5 [bb4,bb5] ~ [eb5,eb6] [bb4,bb5] ~@2", // Ab Db Bb Eb Bb
  G: "[db4,db5]@4 [eb4,eb5] ~@5 [eb4,eb5] [e4,e5] ~ gb5@2 ~, ~@13 gb4 ~@2", // Db Eb E
  H: "[db4,db5]@4 [eb4,eb5] ~@5 [eb4,eb5] ~ [e4,e5] [gb4,gb5] ~@2", I: "[ab4,ab5]@15 ~",
})).s("gm_brass_section").gain(0.48).pan(0.7)

// drums · kick
const kick = s("bd").struct("<A@7 B A@3 C A@3 D E@8 A@2 F E@4 G@2 E@7 A@12 ~@5 H@3 E@28 ~@5>".pickRestart({
  A: "x ~ x ~@2 x ~@2 x ~ x ~@2 x ~@2", B: "x ~ x ~@2 x ~@3 x!2 ~@2 x ~@2", C: "x ~ x ~ x ~@3 x ~ x ~@2 x ~@2",
  D: "x ~ x ~@2 x ~@2 x ~ x ~@5", E: "x ~ x ~@2 x ~@4 x ~@2 x ~@2", F: "x ~@4 x ~@4 x ~@2 x ~@2",
  G: "x ~ x ~@2 x ~@4 x ~@5", H: "x!4",
})).gain(0.6).pan(0.8)

// drums · snare
const snare = s("sd").struct("<~@11 A B@3 C B@16 C B@7 ~@19 D B@28 ~@5>".pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@7 x!4", D: "~@10 x!6",
})).gain(0.6).pan(0.8)

// drums · low tom
const low_tom = s("lt").struct("<~@55 [~ x ~@6] ~@2 [~ x ~@6] ~@34>").gain(0.48).pan(0.8)

// drums · mid tom
const mid_tom = s("mt").struct("<~@52 A@2 B C D B C D ~@33>".pickRestart({
  A: "~@11 x ~@4", B: "~@9 x ~ x ~@4", C: "~@8 x ~@2 x ~@2 x ~", D: "~@11 x ~ x ~@2",
})).gain(0.36).pan(0.8)

// drums · high tom
const high_tom = s("ht").struct("<~@52 A B C D E C D E ~@7 F ~@7 F ~@3 F ~@3 F@5 ~@5>".pickRestart({
  A: "~@6 x!5 ~@5", B: "~@6 x!2 ~ x!3 ~@4", C: "~@6 x!3 ~@7", D: "~@7 x ~@8", E: "~@6 x ~ x ~ x!2 ~@4", F: "~@15 x",
})).gain(0.42).pan(0.8)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@56 [~@7 x ~ x ~@6] ~@2 [~@7 x ~ x ~@6] ~@33>").gain(0.3).pan(0.8)

// drums · china
const china = s("cr").struct("<~@16 A ~@7 A ~@8 A ~@26 A ~@7 A ~@24>".pickRestart({
  A: "x",
})).gain(0.6).pan(0.8)

// drums · bongos
const bongos = s("bongo:18").struct(`<
  A B@3 C D E F G C H I H J K H@25 A B A B A B A B A B A B A B A B L A B L H@7 M H@7 M H@3 M H@3 M@9 N
>`.pickRestart({
  A: "x ~ x ~@4 x ~@2 x ~@2 x ~@2", B: "~@2 x ~@4 x ~@2 x ~@2 x ~@2", C: "x ~ x ~@4 x ~@2 x ~@3 x ~",
  D: "~@2 x ~@4 x ~@2 x ~@5", E: "x!2 ~@2 x!2 ~ x", F: "~ x ~@2 x ~@3 x ~ x ~@4 x", G: "~ x ~@2 x!2 ~@2",
  H: "x!2 ~@2 x!2 ~@2", I: "x ~ x ~@2 x ~@2 x ~ x ~@4 x", J: "x!2 ~ x!3 ~@2", K: "x ~ x ~@4 x!2 ~ x ~@5",
  L: "x ~ x ~@4 x ~@2 x!2 ~ x ~@2", M: "x ~ x ~@5 x!5 ~@3", N: "x",
})).gain(1.58).pan(0.8)

// drums · congas
const congas = s("conga:13").struct(`<
  A@2 B@3 C D@2 C E C F G C@2 H G@24 A@17 I A@2 G@7 J G@7 J G@3 J G@3 J@9 ~
>`.pickRestart({
  A: "~@8 x ~@6 x", B: "~@15 x", C: "~@7 x", D: "~@3 x ~@4", E: "~@13 x ~@2", F: "~@7 x ~@8", G: "~@3 x ~@3 x",
  H: "~@6 x ~@8 x", I: "x ~@7 x ~@6 x", J: "~@6 x ~@2 x!2 ~@3 x ~",
})).gain(1.92).pan(0.8)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  A@2 B@2 C@2 D E@2 F C G C E C A C@24 A@20 C@7 H C@7 H C@3 H C@3 H@9 ~
>`.pickRestart({
  A: "~@5 x ~@8 x ~", B: "~@5 x ~@5 x ~@4", C: "~@5 x ~@7 x ~@2", D: "~@5 x ~@9 x", E: "~@13 x ~@2", F: "~@5 x ~@10",
  G: "~@6 x ~@6 x ~@2", H: "~@5 x ~@7 x!3",
})).gain(1.92).pan(0.8)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  A@2 B@2 C D E F G E@2 H E I E@26 A@16 J A@2 J E@7 K E@7 K E@3 K E@3 K@9 ~
>`.pickRestart({
  A: "~@4 x ~@6 x ~@4", B: "~@2 x ~ x ~@2 x", C: "~@4 x ~@3 x ~@2 x ~@4", D: "~ x!3", E: "~ x ~ x", F: "~ x ~@4 x ~",
  G: "x ~@2 x", H: "~@3 x ~@8 x ~@3", I: "~@3 x", J: "~@4 x ~@6 x ~@3 x", K: "~@4 x ~@7 x!3 ~",
})).gain(1.92).pan(0.8)

// drums · shaker
const shaker = s("sh").struct("<A@56 B A@2 B A@7 C A@7 C A@3 C A@3 C@9 D>".pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x ~ x!6", C: "x ~ x ~ x ~ x ~ x!8", D: "x",
})).gain(0.6).pan(0.8)

// drums · guiro
const guiro = s("guiro:0").struct(`<
  A B A@14 ~ C D E F@4 B A@6 G@2 H F@6 A B A B A B A B A B A B A B A B A I B A ~ C D E F@3 J ~ C D E F@3 J F@3 J F@3 J@9
  ~
>`.pickRestart({
  A: "~@5 x ~@7 x ~@2", B: "~@13 x ~@2", C: "~@5 x ~@2", D: "~@3 x ~@4", E: "~@2 x ~@10 x ~@2", F: "~@4 x ~@8 x ~@2",
  G: "~@5 x ~@6 x ~@3", H: "~ x ~ x", I: "x ~@4 x ~@7 x ~@2", J: "~@4 x ~@8 x!3",
})).gain(12.68).pan(0.8)

// drums · guiro
const guiro_2 = s("guiro:4").struct(`<
  ~@40 A B ~@3 C ~ C A ~ A ~ A ~ A ~ D A ~ D ~@7 E ~@7 E ~@3 E ~@3 E@8 F ~
>`.pickRestart({
  A: "~ x ~@2", B: "~@3 x ~@12", C: "~@3 x", D: "~@4 x ~@10 x", E: "~@13 x!2 ~", F: "~@13 x ~@2",
})).gain(12.68).pan(0.8)

// drums · guiro · soft notes
const guiro_soft = s("guiro:4").struct(`<
  ~@40 A@2 B C@2 D C D A C A C E C E C F E C F ~@7 G ~@7 G ~@3 G ~@3 G@2 H G@6 ~
>`.pickRestart({
  A: "~@3 x", B: "~@4 x ~@8 x ~@2", C: "~ x ~ x", D: "~ x ~@2", E: "x ~@2 x", F: "x ~@10 x!2 ~@3", G: "~@9 x!2 ~@5",
  H: "x ~@8 x!2 ~@5",
})).gain(7.61).pan(0.8)

// drums · bell tree
const bell_tree = s("marktrees:0").struct("<~@52 x ~@40>").gain(2.5).pan(0.8)

stack(
  bass, banjo, banjo_soft, bass_2, pad_warm, pad_warm_soft, bass_3, brass_section, kick, snare, low_tom, mid_tom,
  high_tom, high_tom_soft, china, bongos, congas, congas_2, congas_3, shaker, guiro, guiro_2, guiro_soft, bell_tree
)

More by Peter Gabriel