Strudelify
Abacab cover art

1982 · Abacab

Abacab

Genesis

KeyC minorTempo126 bpm
0:00/0:00
// Abacab — Genesis
// 126 bpm, 4/4, key C minor. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 134 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(126/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 · acoustic bass · "bass"
const bass = note(`<
  ~ A@8 B@2 C@3 D@2 A@18 E@2 C@6 F@2 A@14 E@2 C@7 G@10 H@2 I@4 J ~@2 K@2 A@18 E@2 C@7 L M@2 N@16
>`.pickRestart({
  A: "c2!8", B: "f1!8", C: "g1!8", D: "[g1!7 c2@3 c2!6]/2", E: "[c2!7 g1@3 g1!6]/2", F: "[g1!6 b1 c2@3 c2!6]/2",
  G: "a1!8", H: "[b1@3 a1@3 g1@3 b1@3 g1@2 g1@2]/2", I: "e1!4", J: "e1 ~@7", K: "[~@7 c2@3 c2!6]/2",
  L: "c2 ~ c2!2 ~@2 c2@2", M: "~@2 c2@2 ~ c2 c2@2", N: "~ c2 c2@2 ~ c2 c2@2",
})).s("gm_acoustic_bass").gain(0.32)

// chords · drawbar organ · "organ"
const drawbar_organ = note(`<
  ~@5 A@4 B@2 C@4 D@2 E@2 D@2 E@2 D@2 E@2 F@2 G@2 H I H I J K L M J N O P@3 E@2 D@2 E@2 Q@2 G@2 H I H I J K L M J N O R
  ~@16 S T U V D@2 E@2 D@2 E@2 Q@2 G@2 H I H I H I H I J K L M J N O W X@2 Y@3 ~@14
>`.pickRestart({
  A: "[~@7 [c4,f4]@25]/4", B: "[f3,ab3,c4,eb4]/2", C: "[[g3,c4,d4,f4]@15 ~]/4",
  D: "[~@7 [g3,c4,f4]@3 [g3,c4,e4] ~@5]/2", E: "[~@7 [f3,bb3,d4]@3 [f3,bb3,c4] ~@5]/2",
  F: "[~@7 [g3,c4,f4]@2 [g3,c4,e4]@2 [bb3,d4,a4]@2 ~@3]/2", // Csus4 C Bbmaj7
  G: "[~@7 [bb3,c4,e4]@2 [bb3,c4,d4]@2 [a3,c4,e4]@2 [a3,c4,d4]@2 ~]/2", H: "~@5 [eb4,g4,bb4]@3",
  I: "[eb4,g4,c5] ~ [d4,f4,bb4]@2 c5 [c4,f4,a4] ~@2", J: "~@3 eb4 bb4 g4 d4 bb4", K: "f4 c4 a4 f4 b4 g4 ~@2",
  L: "~@3 g4 eb5 bb4 f4 d5", M: "bb4 f4 c5 a4 b4 g4 ~@2", N: "f4 c4 a4 f4 b4 g4 c5 a4", O: "b4 g4 ~ g4 eb5 bb4 f4 d5",
  P: "[bb4 f4 c5 a4 b4 g4 b4 c5@3 ~@5 [g3,c4,f4]@3 [g3,c4,e4]@2 ~@4]/3", // Csus4 C
  Q: "[~@7 [g3,c4,f4]@3 [g3,c4,e4] [bb3,d4,a4]@2 ~@3]/2", R: "bb4 f4 c5 a4 b4 g4 b4 ~", S: "~ g5 d6 b5 db6 a5 e5@2",
  T: "g5 c6 g5 b5 g5 d5@3", U: "~ eb5 bb5 g5 d5 bb5 f5 c5", V: "a5 f5 b5 g5@5", W: "bb4 f4 c5 a4 b4 g4 b4@2",
  X: "[c5@3 g5@13]/2", Y: "[a5,bb5] ~@7 [a5,bb5] ~@7, b5 g5",
})).s("gm_drawbar_organ").gain(0.5)

// other · distortion guitar · "guitar sol"
const distortion_guitar = note("<~@2 A B C D@2 ~@70 E F ~@55>".pickRestart({
  A: "~@5 d3 d4@2", B: "a3 c4@2 a3 d3@2 c3 c4", C: "g3@2 bb3@4 g3@2 gb3 g3 c3@6",
  D: "[c3 bb2 g2 bb2 c3@2 eb3@2 f3@24]/2", E: "~@2 d4@2 g3 db4@2 e3", F: "b3@2 e3 b3 ~@4",
})).s("gm_distortion_guitar").gain(0.4)

// chords · lead 2 sawtooth · "fat synth"
const lead_2_sawtooth = note(`<
  ~@7 A B C D E F G H ~@54 I@2 J@2 I@2 K@2 L M N@4 ~@40 O P Q ~ R ~ S T U V@2
>`.pickRestart({
  A: "[c3,g3]@2 [c3,g3]!2 [eb3,bb3]@2 [c3,g3]@2", B: "~ [c3,g3] [eb3,bb3] [f3,c4] [f3,c4]@2 [eb3,g3]@2",
  C: "~ [c3,g3] [eb3,bb3] [f3,c4]@3 [eb3,bb3]@2", D: "[f3,c4]@2 [ab3,eb4] [f3,c4] ~ [eb3,bb3] ~@2",
  E: "~ [g3,d4]!3 [bb3,f4]@2 [g3,d4]@2", F: "~ [g3,d4]!2 [bb3,f4] ~ [c4,g4] ~@2", G: "~ [g3,d4]!3 ~ [g3,d4]!3",
  H: "~ [g3,d4] ~ [g3,d4] ~ [g3,d4] ~@2", // G5
  I: "[~ [d3,g3] [e3,a3] [g3,c4]@2 [e3,a3]@2 [a3,d4]@2 [g3,c4] [gb3,b3] [d3,g3]@2 [e3,a3] ~@2]/2", // G5 A5 C5 A5 D5 C5 B5 G5 …
  J: "[~ [d3,g3] [e3,a3] [g3,c4]@2 [e3,a3]@2 [a3,d4]@2 [a3,d4]@2 [a3,d4]@2 [g3,c4] [gb3,b3] ~]/2", // G5 A5 C5 A5 D5 C5 B5
  K: "[~ [d3,g3] [e3,a3] [g3,c4]@2 [e3,a3]@2 [a3,d4]@2 [b3,e4]@2 [b3,e4]@2 [b3,e4]@2 ~]/2", L: "~ g3 e3 g3 a3 g3 e3 g3",
  M: "~ b3 a3 g3 a3 g3 e3 g3", N: "~@2 a4 ab4 ~@2 a4 ab4 ~@2 a4 ab4 ~@2 a4 ab4", O: "[c3,g3] ~@2 [c3,g3] ~@2 [c3,g3] ~",
  P: "~ [c3,g3] ~@6", Q: "~@5 [eb3,bb3] [c3,g3] ~", R: "~ [bb3,f4] [g3,d4] ~ [g3,d4] [f3,c4] ~ [g3,d4]",
  S: "~ [f3,c4]!3 ~ [f3,c4] ~ [f3,c4]", T: "~ [eb3,bb3]@2 ~@2 [eb3,bb3]!3",
  U: "~ [eb3,bb3] ~ [eb3,bb3] ~ [db3,ab3]@2 ~", V: "[~ [db3,ab3]!3 [b2,gb3] [db3,ab3] [b2,gb3] [db3,ab3]@2 ~@7]/2",
})).s("gm_lead_2_sawtooth").gain(0.56)

// chords · overdriven guitar · "guitar crd"
const overdriven_guitar = note("<~@14 A@20 B@2 C@6 A@16 B@2 C@6 ~ D@10 ~@9 A@20 B@2 C@6 ~ E@4 F@3 ~@12>".pickRestart({
  A: "[~@7 [f3,bb3]@2 [g3,c4]!2 ~@5]/2", B: "[~@5 [c3,f3]!2 [c3,f3]@2 [d3,g3]!2 ~@5]/2",
  C: "[~@7 [c3,f3]@2 [d3,g3]!2 ~@5]/2", D: "a3 ~ e3 ~ a3 ~ e3 ~ a3 ~ e3 ~ a3 ~ e3 ~", E: "[~@3 [g2,bb2,eb3]@13]/2",
  F: "[~ [g2,bb2,eb3]@7]/3", // Eb
})).s("gm_overdriven_guitar").gain(0.4)

// other · pad poly · "synth"
const pad_poly = note(`<
  ~@81
  [~@3 d3 ~ c3 ~ d3]
  [~ e3 ~ d3 ~ c3 ~ d3]
  [~ g4 d5 b4 db5 a4 e4@2]
  [g4 c5 g4 b4 g4 d4@3]
  [~ eb4 bb4 g4 d4 bb4 f4 c4]
  [a4 f4 b4 g4@3 ~@2]
  ~@47
>`).s("gm_pad_poly").gain(0.51)

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

// drums · snare
const snare = s("sd").struct("<A B@13 ~ B@27 C B@43 C B@19 C B@8 D B@18>".pickRestart({
  A: "~@7 x", B: "~ x ~ x", C: "~ x ~@2", D: "~@3 x",
})).gain(0.4)

// drums · clap
const clap = s("cp").struct("<~@35 x ~@98>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct("<~ A@13 B C D@19 ~@8 C D@14 E ~@28 C D@11 F D F D A@4 ~@8 G H A@17>".pickRestart({
  A: "x!4", B: "~ x!6 ~", C: "~ x!7", D: "x!8", E: "x!7 ~", F: "x!5 ~@3", G: "~@5 x!3", H: "x!5 ~ x ~",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@14 A ~@27 B ~@23 C ~@11 C ~@7 B ~@19 D ~@8 E ~@18>".pickRestart({
  A: "~@3 x ~ x ~@2", B: "~@5 x!2 ~", C: "~@14 x!2", D: "~@3 x", E: "~ x!2 ~@5",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@99 [~@5 x!3] ~ [~@5 x!3] ~ [~ x ~ x ~ x ~ x]!4 ~@27>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@14 A ~@27 B ~@43 B ~@28 C ~@18>".pickRestart({
  A: "~ x ~@6", B: "~@3 x!2 ~@3", C: "x",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct(`<
  ~@14 A ~@20 B@7 C ~@15 D E B@10 F G H I J K L B@9 C ~@20 E C E C E@4 M ~@18
>`.pickRestart({
  A: "x ~@6 x", B: "x!4", C: "x ~ x ~ x ~ x!2", D: "~@7 x", E: "~ x!3", F: "x ~ x ~ x!3 ~", G: "x ~ x ~ x!4",
  H: "x!3 ~ x ~ x!2", I: "x!3 ~ x ~ x ~", J: "x!3 ~ x!3 ~", K: "x!3 ~ x!4", L: "x!5 ~ x ~", M: "~@3 x ~@4",
})).gain(0.3)

// drums · ride
const ride = s("rd").struct("<~@35 x ~@98>").gain(0.3)

stack(
  bass, drawbar_organ, distortion_guitar, lead_2_sawtooth, overdriven_guitar, pad_poly, kick, snare, clap, hihat,
  mid_tom, open_hat, high_tom, crash, ride
)

More by Genesis