Strudelify

Magnet and Steel

Walter Egan

KeyB majorTempo57 bpm
0:00/0:00
// Magnet and Steel — Walter Egan
// 57 bpm, 3/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 63 bars on a 24-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): Track 6.
setcpm(57/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass finger · "Track 2"
const bass = note("<~ A B@11 C D E F G D H B@11 C D E F G D H B@11 C D E F G D H D E F G I ~@2>".pickRestart({
  A: "b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1 ~ b1@2 f#1@2 g#1@2", B: "a1@4 g#1 f#1 b1@4 f#1 g#1",
  C: "a1@8 g#1@2 f#1@2 b1@5 ~ b1 ~ b1 ~ c2 ~", D: "c#2@9 ~ b1@2 a1@6 ~@2 g#1@2 f#1@2", E: "b1@4 ~ b1 a1@2 ~ a1 b1 c2",
  F: "c#2@5 b1 a1@3 ~ g#1 f#1", G: "b1@7 ~@3 b1@2 a1@4 ~@2 a1@2 b1@2 c2@2",
  H: "b1@7 ~@3 f#1@2 b1@4 ~@2 b1@2 f#1@2 g#1@2", I: "c#2@19 ~@5",
})).s("gm_electric_bass_finger").gain(0.69)

// other · electric guitar muted · "Track 3"
const electric_guitar_muted = note(`<
  ~ A B@12 C D E F E G B@11 H C D E F E G B@12 C D E F E G C D E F I ~@2
>`.pickRestart({
  A: "[b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,b4] ~ [b3,d#4,f#4,a#4,b4] ~@5", // B Bmaj7
  B: "b3 ~ c#4 ~ e4 ~ a4 ~ e4 ~ c#4 ~ b3 ~ d#4 ~ f#4 ~ b4 ~@5", C: "[c#4,e4,g#4,c#5]@5 ~ [c#4,e4,g#4,b4]@4 ~@2",
  D: "[b3,d#4,f#4,b4]@9 ~@3 [a3,c#4,e4,a4]@4 ~@2 [b3,d#4,f#4,b4]@4 ~@2", E: "[c#4,e4,g#4,c#5]@5 ~ [c#4,e4,g#4,b4]@5 ~",
  F: "[b3,d#4,f#4,b4]@5 ~ [a3,c#4,e4,a4]@2 ~ [b3,d#4,f#4,b4]@2 ~", // B A B
  G: "[b3,d#4,f#4,b4]@5 ~ [b3,d#4,f#4,b4]@2 ~ [b3,d#4,f#4,b4]@2 ~", // B
  H: "b3 ~ c#4 ~ e4 ~ a4 ~ e4 ~ c#4 ~ b3 ~ d#4 ~ f#4 ~@7", I: "[c#4,e4,g#4,c#5]@19 ~@5",
})).s("gm_electric_guitar_muted").gain(0.62)

// chords · electric guitar muted · "Track 4"
const electric_guitar_muted_2 = note("<~@2 A@11 B ~@6 A@11 B ~@6 A@11 B ~@13>".pickRestart({
  A: "~@6 [a3,c#4,e4] ~@11 [b3,d#4,f#4]@2 ~@2 [b3,d#4,f#4] ~", // A B
  B: "~@6 [a3,c#4,e4] ~@11 [e4,g#4,b4] ~ [e4,g#4,b4] ~ [e4,g#4,c5] ~", // A E Eaug
})).s("gm_electric_guitar_muted").gain(0.74)

// other · pad bowed · "Track 5"
const pad_bowed = note("<~@14 A B A C A D ~@12 A B A C A D ~@12 A B A C A D A B A C A D E>".pickRestart({
  A: "c#4@2 g#4@2 e4@2 c#4@2 g#4@2 e4@2 g#4@2 e5@2 c#5@2 g#4@2 e5@2 c#5 ~",
  B: "f#5@2 c#5@2 b4@2 f#4@2 b4@2 c#5 ~ c#5@2 b4@2 c#5 ~ c#5@2 b4@2 e4@2",
  C: "f#5@2 c#5@2 b4@2 f#4@2 b4@2 c#5 ~ c#5@2 b4@2 c#5 ~ c#5@2 b4@2 e4 ~",
  D: "f#5@2 c#5@2 b4@2 f#4@2 b4@2 c#5 ~ c#5@2 b4 ~ c#5 ~ c#5@2 b4@2 e4 ~", E: "c#4 ~@23",
})).s("gm_pad_bowed").gain(0.45)

// other · electric guitar clean · "Track 8"
const electric_guitar_clean = note("<~@40 A B ~ C B ~ D E F G H ~@12>".pickRestart({
  A: "~@6 b2@3 ~ b2 ~ b2@2 ~@2 b2@4 ~@2 b2 ~", B: "b2@8 a2 ~ g#2 ~ g#2@6 f#2@5 ~",
  C: "~@6 b2@3 ~ b2 ~ b2@2 ~@2 b2@5 ~ b2 ~", D: "~@6 b2@3 ~ e3@2 c#3@4 b2@5 ~ b2 ~",
  E: "b2@7 ~ a2 ~ g#2 ~ g#2@6 f#2@5 ~", F: "~@20 b2 ~ b2 ~", G: "c#3@2 ~ e3@2 ~ f#3@2 ~ g#3@2 ~", H: "c#3 ~",
})).s("gm_electric_guitar_clean").gain(0.72)

// chords · trombone · "Track 9"
const trombone = note(`<
  ~@2 A B ~@2 C ~@2 D ~@2 D ~ E F E G H I J ~@3 C ~@2 D ~@2 D ~ E F E G H I J ~@3 C ~@2 D ~@2 D ~ E F E G H I K I L I M
  ~@2
>`.pickRestart({
  A: "[a3,c#4,e4]@8 [b3,d#4,f#4] ~ [c#4,e4,g#4] ~ [b3,d#4,f#4]@9 ~@3", // A B C#m B
  B: "[a3,c#4,f#4]@6 [g#3,b3,e4]@3 ~@3 [g#3,b3,e4]@6 [f#3,a3,d#4]@4 ~@2", // F#m E D#dim
  C: "[a3,c#4,e4]@8 [b3,d#4,f#4]@2 [c#4,e4,g#4]@2 [b3,d#4,f#4]@9 ~@3", // A B C#m B
  D: "[a3,c#4,e4]@4 [b3,d#4,f#4] [c#4,e4,g#4] [b3,d#4,f#4]@4 ~@2", // A B C#m B
  E: "~@3 [g#4,b4]@2 ~ [g#4,b4]@2 [f#4,a4]@2 [e4,g#4]@2", F: "[d#4,f#4]@7 ~@17", G: "[d#4,f#4] ~@2",
  H: "~@6 [b4,e5]@2 a4@2 [g#4,b4] ~, ~@16 c#5@3 ~@5", I: "[g#4,b4]@2 [f#4,a4]@2 ~ [f#4,a4] [g#4,b4]@3 [f#4,b4]@3",
  J: "[e4,g#4]@8 [f#4,a4]@2 [e4,g#4]@2 [d#4,f#4]@7 ~@5", // E F#m E D#m
  K: "[e4,g#4]@7 ~@5 [b4,e5]@4 a4@4 [g#4,b4]@2 ~@2, ~@16 c#5@3 ~@5", // E E5 G#m
  L: "[e4,g#4]@3 ~@3 [b4,e5]@2 a4@2 [g#4,b4] ~, ~@16 c#5@3 ~@5", M: "[e4,g#4] ~",
})).s("gm_trombone").gain(0.36)

// drums · kick
const kick = s("bd").struct("<~@2 A@12 B@6 A@12 B@6 A@12 B@10 C ~@2>".pickRestart({
  A: "x ~@4 x!2 ~@5", B: "x ~@4 x!2 ~@4 x", C: "x",
})).gain(0.8)

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

// drums · hihat
const hihat = s("hh").struct("<A ~ B C@10 D B C@5 B C@10 D B C@5 B C@10 D B C@9 ~@3>".pickRestart({
  A: "x!6", B: "~ x!11", C: "x!12", D: "x!9 ~@3",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct("<~@2 A ~@11 A ~@5 A ~@11 A ~@5 A ~@11 A ~@9 A ~@2>".pickRestart({
  A: "x",
})).gain(0.8)

stack(
  bass, electric_guitar_muted, electric_guitar_muted_2, pad_bowed, electric_guitar_clean, trombone, kick, snare, hihat,
  crash
)