Strudelify

Heroes

David Bowie

KeyD majorTempo110 bpm
0:00/0:00
// Heroes — BOWIE DAVID
// 110 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 81 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Rhythm, Lead.
setcpm(110/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 · electric bass pick · "Bass"
const bass = note(`<
  ~ A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 D@2 C@2 E@2 C@2 E@2 C@2 A@2 B@2 C@2 B@2 A@2 B@2 C@2 B@2 D@2 C@2 E@2 C@2 E@2 C@2 A@2
  B@2 C@2 B@2 D@2 C@2 E@2 C@2 E@2 C@2 E@2 F@2
>`.pickRestart({
  A: "[d2@2 d2@2 d2 a1 b1 d2@2 d2 d2@2 d2!2 b1 a1]/2", B: "[g1@2 g1@2 g1 d1 e1 g1@2 g1 g1@2 g1!2 a1 b1]/2",
  C: "[d2@2 d2@2 d2 a1 b1 d2@2 d2 d2@2 d2!2 a1 b1]/2", D: "[c2@2 c2@2 c2!3 c2@2 c2 c2@2 c2!2 a1 b1]/2",
  E: "[c2@4 c2!3 g1@5 g1 g1@3]/2", F: "[d2, c2 ~@31]/2",
})).s("gm_electric_bass_pick").gain(0.26)

// chords · rock organ · "Organ"
const rock_organ = note(`<
  A@4 B@8 C@5 D@2 E@2 F@2 E@2 F@2 G@5 B@8 C@5 D@2 E@2 F@2 E@2 F@2 ~ A@4 C@5 D@2 E@2 F@2 E@2 F@2 ~@2 F@2 H@2
>`.pickRestart({
  A: "[~@8 a5@12 b5 a5@3 b5@2 a5@6, ~@3 d5@13]/4",
  B: "[~@8 a5@12 b5 a5@3 b5@2 a5@12 ~@2 a5@12 b5 a5@3 b5@2 a5@6, ~@3 d5@16 d5@13]/8",
  C: "[~@8 a5@12 b5 a5@3 b5@2 a5@12 [d5,g5]@2, ~@3 d5@16 ~]/5", D: "[c5,g5]/2", E: "[d5,f#5]/2",
  F: "[[c5,g5]@7 [d5,g5]@9]/2", G: "[d5@14 ~@2 a5@12 b5 a5@3 b5@2 a5@6, f#5@2 ~@3, ~@7 d5@13]/5",
  H: "[d4,f#4,a4,d5,f#5,a5]/2", // D
})).s("gm_rock_organ").gain(0.39)

// chords · acoustic guitar steel · "Acoustic"
const acoustic_guitar_steel = note(`<
  ~ A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 A@2 D@2 A@2 D@2 A@4 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C@2 A@2 D@2 A@2 D@2 A@4 B@2 A@2
  B@2 C@2 A@2 D@2 A@2 D@2 A@2 D@2 E@2
>`.pickRestart({
  A: "[[d3,f#3] d3 [d3,f#3,a3,d4] [d3,f#3]!2 [d3,f#3,g4] [d3,f#3,d4,f#4] ~ [d3,f#3] [d3,f#3,a3,d4,f#4] [d3,f#3,a3,d4] d3 [d3,f#3,a3,d4] [d3,f#3] [d3,f#3,a3,d4] [d3,f#3], [a3,d4]@2 ~@2 [a3,d4]@2 a3@3 ~@7, ~@7 e4@2 ~@7]/2", // D Gmaj7 D D5
  B: "[[g2,b2,b3,d4] g3 [g2,b2,d3,g3,b3,d4] [g2,d3] [g2,b2,d3,g3,b3,d4] [b2,d3,b3,d4,g4] [g2,b2,d3,g3,b3,d4,f#4] [g2,b2,d3,b3] [g2,b2,d3,g3,b3] [g2,b2,d3,f#4] [g2,b2,d3,g3] [g2,b2,d3] [g2,b2,d3,g3,b3,d4] [g2,b2,d3] ~ [b2,d3,g3], d3@2 ~@5 e4@2 ~ [b3,d4]@2 ~@2 [g2,b2,d3,g3,b3,d4] ~, ~@29 g2@2 ~]/2", // G G5 G Gmaj7 G Gmaj7 G Bm …
  C: "[[c3,e3] c3 [c3,e3,g3,c4] [c3,e3]!2 [c3,e3,g4] [c3,e3,c4,f#4] ~ [c3,e3] [c3,e3,g3,c4,f#4] [c3,e3,g3,c4] c3 [c3,e3,g3,c4] [c3,e3] [c3,e3,g3,c4] [c3,e3], [g3,c4]@2 ~@2 [g3,c4]@2 g3@3 ~@7, ~@7 e4@2 ~@7]/2", // C F#m7b5 C C5
  D: "[[c3,e3] c3 [c3,e3,g3,c4] [c3,e3]!2 [c3,e3,g4] [c3,e3,c4,f#4] ~ [g2,b2] [g2,b2,d3,g3,f#4] [g2,b2,d3,d4] g2 [g2,b2,d3,g3] [g2,b2] [g2,b2,d3,g3] [g2,b2], [g3,c4]@2 ~@2 [g3,c4]@2 g3@3 ~@7, ~@7 e4@2 ~@7]/2", // C F#m7b5 G Gmaj7 G C5
  E: "[[a3,d4], [d3,f#3]@15 ~]/2", // D5 D
})).s("gm_acoustic_guitar_steel").gain(0.29)

// chords · overdriven guitar · "Rhythm"
const overdriven_guitar = note("<~@21 A@2 ~@2 A@2 ~@22 A@2 ~@2 A@2 ~@14 A@2 ~@2 A@2 ~@2 A@2 ~@2>".pickRestart({
  A: "[~@7 [g2,d3,g3]@9]/2", // G5
})).s("gm_overdriven_guitar").gain(0.33)

// other · overdriven guitar · "Lead"
const overdriven_guitar_2 = note("<~@18 A@2 ~@26 A@2 ~@18 A@2 ~@13>".pickRestart({
  A: "[~@4 d4@23 ~@5]/2",
})).s("gm_overdriven_guitar").gain(0.33)

// other · overdriven guitar · "Lead 2"
const overdriven_guitar_3 = note("<~@29 A@4 B@4 C@2 ~@42>".pickRestart({
  A: "[[f#4,f#5]@11 ~ [f#4,f#5] [e4,e5] [d4,d5] [e4,e5]@2 [d4,d5]@10 ~ [d4,d5] [b3,b4] [d4,d5]@2]/4", // F# E D E D B D
  B: "[[b3,b4] [a3,a4]@11 [f#4,f#5] [e4,e5] [d4,d5] [e4,e5]@2 [d4,d5]@10 ~ [d4,d5] [b3,b4] [d4,d5]@2]/4", // B A F# E D E D B …
  C: "[[b3,b4] [a3,a4]@9 ~@6]/2", // B A
})).s("gm_overdriven_guitar").gain(0.59)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A C A B A C A B A B A B A B A B A B A B A B A B A B A B A C A B A C A B A B
  A B A B A B A B A B A C A B A C A B A C ~@2
>`.pickRestart({
  A: "x ~@3 x!2 ~ x", B: "~ x ~@2 x!2 ~@2", C: "x!6 ~ x",
})).gain(0.27)

// drums · snare
const snare = s("sd").struct("<~ A@21 B A@3 B A@23 B A@3 B A@15 B A@3 B A@3 B ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x ~@3 x!2 ~@2",
})).gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~ A@21 ~ A@3 ~ A@23 ~ A@3 ~ A@15 ~ A@3 ~ A@3 ~@3>".pickRestart({
  A: "x!7 ~",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~ A@21 B A@3 B A@23 B A@3 B A@15 B A@3 B A@3 B ~@2>".pickRestart({
  A: "~@7 x", B: "x!8",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~ 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 ~ B ~
>`.pickRestart({
  A: "x ~@6 x", B: "x",
})).gain(0.3)

// drums · ride
const ride = s("rd").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 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!6 ~", B: "x!8",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~@29 [x!16]!50 ~@2>").gain(0.3)

stack(
  bass, rock_organ, acoustic_guitar_steel, overdriven_guitar, overdriven_guitar_2, overdriven_guitar_3, kick, snare,
  hihat, open_hat, crash, ride, tambourine
)

More by David Bowie