Strudelify

Keep It Dark

Genesis

KeyC majorTempo130 bpm
0:00/0:00
// Keep It Dark — Genesis
// 130 bpm, 3/2, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (3/2 at bar 1, 6/4 at bar 36, 3/2 at bar 44, 6/4 at bar 65, ...) are rendered on a constant 3/2 grid of one bar per cycle
// note: ch 1 "Distortion" named as a guitar, played on distortion guitar (its lead 5 charang patch is not one)
// note: duplicate parts dropped: ch 1 "Distortion" distortion guitar (copy of ch 2 "Synth Guitar" lead 1 square); ch 4 "Synth Chiff B" lead 1 square (copy of ch 3 "Synth Chiff A" lead 4 chiff); ch 12 "Rec Pops (right)" ocarina (copy of ch 11 "Rec Pops (left)" flute)
// note: Full arrangement: all 102 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/6)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// other · lead 1 square · "Synth Guitar"
const lead_1_square = note("<A@8 B@24 C@8 D@5 ~ B@16 E@8 F@6 ~ B@16 G@8 ~>".pickRestart({
  A: "[~@5 g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3]/8",
  B: "[~@2 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3]/8",
  C: "[~@2 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ b2 ~ d3 ~ g3 ~ a3@3 g3 a3 ~ e3 ~ f3 ~ g3 ~ a3@3 g3 a3 ~ e3 ~ f3 ~ g3 ~ a3@3 g3 a3 ~ e3 ~ f3 ~ g3 ~ a3]/8",
  D: "[~@2 g3 a3 ~ g3 ~ a3 ~ b3 ~ c4@3 b3 c4 ~ a3 ~ c4 ~ f4 ~ a4@3 g4 a4 ~ e4 ~ f4 ~ c5 ~ e5@3 d5 e5 ~ b4 ~ d5 ~ f5 ~ a5@3 ~@10]/5",
  E: "[~@2 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ b2 ~ d3 ~ g3 ~ a3@3 g3 a3 ~ e3 ~ f3 ~ g3 ~ a3@3 g3 a3 ~ e3 ~ f3 ~ g3 ~ a3@3 g3 a3 ~ e3 ~ f3 ~ g3 ~ a3@3 g3 a3 ~ g3 ~ a3 ~ b3 ~ c4]/8",
  F: "[~@2 b3 c4 ~ a3 ~ c4 ~ f4 ~ a4@3 g4 a4 ~ e4 ~ f4 ~ g4 ~ a4@3 g4 a4 ~ e4 ~ g4 ~ b4 ~ c5@3 b4 c5 ~ b4 ~ c5 ~ d5 ~ e5@3 d5 e5 ~ b4 ~ d5 ~ f5 ~ a5@3 ~@10]/6",
  G: "[~@2 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~ g2 ~ a2 ~ b2 ~ c3@3 b2 c3 ~@8]/8",
})).s("gm_lead_1_square").gain(0.32).pan(0.6)

// other · lead 4 chiff · "Synth Chiff A"
const lead_4_chiff = note("<~@3 A B C ~@5 A ~@13 D ~@20 A B C ~@5 D ~@22 D ~@24>".pickRestart({
  A: "c5 ~ c4 ~@9", B: "b4 ~ b3 ~@9", C: "a4 ~ a3 ~ f4 e4 ~@6", D: "c5 ~@11",
})).s("gm_lead_4_chiff").gain(0.64)

// bass · synth bass 2 · "Bass Pedal"
const bass = note(`<
  ~@3 A@2 B C D E C@2 A D E C@2 F@4 G H I C@2 J D E C@8 K@8 ~@2 A@2 B C D E C@2 J D E C@8 K@10 ~@2 J C@22 L ~
>`.pickRestart({
  A: "~ c2 ~ c2!9", B: "~ c2 ~ c2 ~ c2!7", C: "c2!12", D: "f2!8 e2!4", E: "a2!8 g2!4", F: "a1!5 e2 g2 a2 b2 a2 g2 a2",
  G: "d2!8 e2!4", H: "f2!12", I: "g#2!3 f2!6 g2 d#2 e2", J: "~ c2!11", K: "d2!12", L: "c2!4 ~@8",
})).s("gm_synth_bass_2").gain(0.52)

// chords · tremolo strings · "Synth Strings (left)"
const tremolo_strings = note(`<
  ~@30 A B C D E F G H G H G H@2 I ~@15 A B C D E F G H G H G H G H@2 I ~@27
>`.pickRestart({
  A: "~ [e4,g4,b4]@5 ~@6", B: "~ [d4,f4,a4]@7 ~@4", C: "~ [e4,g4,b4,e5]@5 ~@6", D: "~ [d4,f4,a4]@4 ~@7",
  E: "~ [e4,f4,a4,c5]@7 ~@4", F: "~ [e4,g4,b4]@4 ~@7", G: "[f4,a4,c5,e5] [e4,g4,b4,d5]",
  H: "[d4,f4,a4,c5] [e4,g4,b4,d5]", I: "[g4,b4,d5,f5] [d4,f4,a4,c5]",
})).s("gm_tremolo_strings").gain(0.4).pan(0.1)

// chords · synth strings 2 · "Synth Strings (right)" · Em Dm Em Dm Fmaj7 Em
const synth_strings_2 = note(`<
  ~@30
  [~ [e4,g4,b4]@5 ~@6]
  [~ [d4,f4,a4]@7 ~@4]
  [~ [e4,g4,b4,e5]@5 ~@6]
  [~ [d4,f4,a4]@4 ~@7]
  [~ [e4,f4,a4,c5]@7 ~@4]
  [~ [e4,g4,b4]@4 ~@7]
  ~@66
>`).s("gm_synth_strings_2").gain(0.4).pan(0.9)

// chords · string ensemble 1 · "Synth Strings (right)"
const string_ensemble_1 = note("<~@36 A B A B A B@2 C ~@58>".pickRestart({
  A: "[f4,a4,c5,e5] [e4,g4,b4,d5]", B: "[d4,f4,a4,c5] [e4,g4,b4,d5]", C: "[g4,b4,d5,f5] [d4,f4,a4,c5]",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.9)

// chords · string ensemble 2 · "Synth Strings (right)"
const string_ensemble_2 = note("<~@59 A B C D E F G H G H G H G H@2 I ~@27>".pickRestart({
  A: "~ [e4,g4,b4]@5 ~@6", B: "~ [d4,f4,a4]@7 ~@4", C: "~ [e4,g4,b4,e5]@5 ~@6", D: "~ [d4,f4,a4]@4 ~@7",
  E: "~ [e4,f4,a4,c5]@7 ~@4", F: "~ [e4,g4,b4]@4 ~@7", G: "[f4,a4,c5,e5] [e4,g4,b4,d5]",
  H: "[d4,f4,a4,c5] [e4,g4,b4,d5]", I: "[g4,b4,d5,f5] [d4,f4,a4,c5]",
})).s("gm_string_ensemble_2").gain(0.4).pan(0.9)

// other · clavinet · "Synth 2"
const clavinet = note("<~@81 A B C D A B C D A B C D A B C D A B C E ~>".pickRestart({
  A: "a4@2 a4!2 ~ e4 ~ f4 ~ g4 ~@2", B: "g4@2 g4!2 ~ d4 ~@6", C: "f4@2 f4!2 ~ e4 ~ d4 ~ c4 ~@2",
  D: "d4@2 d4!2 ~ g3 ~@6", E: "d4@2 d4!2 ~@8",
})).s("gm_clavinet").gain(0.52)

// other · flute · "Rec Pops (left)"
const flute = note(`<
  ~@50
  [f5 ~ f5 ~ f5 ~ f5 ~ f5 ~ f5 ~ f5 ~ f5 ~ e5 ~ e5 ~ e5 ~ e5 ~]
  [a5 ~ a5 ~ a5 ~ a5 ~ a5 ~ a5 ~ a5 ~ a5 ~ g5 ~ g5 ~ g5 ~ g5 ~]
  [c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~]!3
  [f5 ~ f5 ~ f5 ~ f5 ~ f5 ~ f5 ~ f5 ~ f5 ~ e5 ~ e5 ~ e5 ~ e5 ~]
  [a5 ~ a5 ~ a5 ~ a5 ~ a5 ~ a5 ~ a5 ~ a5 ~ g5 ~ g5 ~ g5 ~ g5 ~]
  [c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~ c5 ~]!2
  ~@43
>`).s("gm_flute").gain(0.57).pan(0.1)

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

// drums · snare
const snare = s("sd").struct("<~@3 [~ x ~ x ~ x]!41 ~@2 [~ x ~ x ~ x]!29 ~@2 [~ x ~ x ~ x]!23 [~ x ~@4] ~>").gain(0.4)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@44
  [x ~@3 x!2 ~@2 x ~@3]
  [x!2 ~@2 x ~@3 x!2 ~@2]
  ~@29
  [x ~@3 x!2 ~@2 x ~@3]
  [x!2 ~@2 x ~@3 x!2 ~@2]
  ~@25
>`).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@3 [~ x!5] [x!6]!96 [x!2 ~@4] ~>").gain(0.4)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@3 [~ x ~ x ~ x ~ x ~ x ~ x]!97 [~ x ~ x ~@8] ~>").gain(0.15)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@44
  [x ~ x ~ x!2 ~@2 x ~ x ~]
  [x!2 ~@2 x ~ x ~ x!2 ~@2]
  ~@29
  [x ~ x ~ x!2 ~@2 x ~ x ~]
  [x!2 ~@2 x ~ x ~ x!2 ~@2]
  ~@25
>`).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@3 x ~@98>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@44 [x!2 ~@2 x!2] [~@2 x!2 ~@2] ~@29 [x!2 ~@2 x!2] [~@2 x!2 ~@2] ~@25>").gain(0.4)

// drums · ride bell
const ride_bell = s("rd").struct("<~@30 A@14 B C ~@13 A@16 B C ~@25>".pickRestart({
  A: "x!6", B: "~ x ~@3 x ~@3 x ~@2", C: "x!3",
})).gain(0.4)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct(`<
  ~@44
  [x ~@2 x ~@4 x ~@2 x]
  [~ x ~ x ~ x]
  ~@29
  [x ~@2 x ~@4 x ~@2 x]
  [~ x ~ x ~ x]
  ~@25
>`).gain(4.66)

// drums · congas
const congas = s("conga:13").struct("<~@22 [~@5 x ~ x ~ x ~ x] ~ [~@8 x!2 ~ x] [x!3 ~@9] ~@76>").gain(1.27)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@44 [~ x ~ x ~ x]!2 ~@29 [~ x ~ x ~ x]!2 ~@25>").gain(1.9)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<~@44 [x!3]!2 ~@29 [x!3]!2 ~@25>").gain(1.9)

// drums · guiro
const guiro = s("guiro:0").struct("<~@77 A ~@5 B ~@2 C D ~ C D ~ C D ~ C D ~ C D ~@2>".pickRestart({
  A: "~ x ~@6", B: "~@3 x!2 ~@19", C: "~@23 x", D: "x",
})).gain(8.38)

// drums · claves
const claves = s("clave:2").struct("<~@77 [~ x ~@10] ~@24>").gain(1.94)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@50 A B C ~@4 D E ~@18 F G H ~ I J K L M N O P N O P N O P N O P N O ~@2
>`.pickRestart({
  A: "x ~ x!2 ~@4 x!3 ~", B: "~@18 x!2 ~ x!2 ~", C: "~@16 x!8", D: "x!2 ~ x!7 ~@14", E: "~@17 x!4 ~@3",
  F: "~@12 x!6 ~@6", G: "~@9 x ~ x ~@12", H: "~@15 x!7 ~@2", I: "~@21 x ~ x", J: "x!2 ~@2 x ~@13 x ~ x!2 ~@2",
  K: "~@19 x ~ x ~ x", L: "~@12 x ~ x!2 ~ x ~ x ~@4", M: "~@17 x ~ x!3 ~@2", N: "x ~@13 x ~ x!2 ~@6",
  O: "~@15 x ~ x ~ x ~@4", P: "~@8 x ~ x!2 ~ x ~ x ~ x ~ x!3 ~@2",
})).gain(0.58)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct(`<
  ~@54 A ~@22 B ~@3 C D E F G H B I H B I H B I H B I H B ~@2
>`.pickRestart({
  A: "~@17 x!7", B: "~@3 x", C: "~@10 x!2", D: "~@17 x ~ x ~@2 x!2", E: "~@11 x", F: "~@13 x ~@2 x ~ x ~ x ~@3",
  G: "~@8 x!2 ~@2", H: "~@13 x ~ x ~@2 x!2 ~@4", I: "~@9 x ~@2 x ~ x ~ x ~ x ~@5",
})).gain(0.58)

// drums · shaker
const shaker = s("sh").struct("<~@80 A ~@3 B ~@3 C ~@2 C ~@2 C ~@2 C ~@2 C ~>".pickRestart({
  A: "~@21 x!2 ~", B: "~ x ~", C: "~ x ~@4",
})).gain(0.4)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<~@57 [~ x ~@3 x ~@6] [~@2 x] ~@19 [~ x ~@10] ~@23>").gain(1.71)

stack(
  lead_1_square, lead_4_chiff, bass, tremolo_strings, synth_strings_2, string_ensemble_1, string_ensemble_2, clavinet,
  flute, kick, snare, low_tom, hihat, hihat_soft, mid_tom, open_hat, high_tom, ride_bell, vibraslap, congas,
  agogo_bells, agogo_bells_2, guiro, claves, woodblocks, woodblocks_2, shaker, jingle_bells
)

More by Genesis