Strudelify

Justified and Ancient

The KLF

KeyC♯ minorTempo118 bpm
0:00/0:00
// Justified and Ancient — The KLF
// 118 bpm, 4/4, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: ch 6 "Ch  6" Deep Snare -> synth drum; ch 12 "Ch 12" Funny Vox -> lead 6 voice
// note: Full arrangement: all 98 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Ch 13.
setcpm(118/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 · "Ch  1"
const bass = note("<~@4 A B@7 C@8 ~@8 A B@11 C@8 ~@8 A B@7 D ~@7 A B@6 E A B@15 D ~>".pickRestart({
  A: "~@5 c#2@3 ~ c#2@3 ~ g#1@3 ~ b1@2 c#2@3 ~ c#2@2 c#2@3 ~ g#1@3",
  B: "~ b1@3 ~ c#2@3 ~ c#2@3 ~ g#1@3 ~ b1@2 c#2@3 ~ c#2@2 c#2@3 ~ g#1@3",
  C: "[~ b1@3 ~ e2@11 ~@3 e2 ~@5 e2@11 ~ g#1@11 ~@3 g#1 ~@5 g#1@11 ~ a1@11 ~@3 a1 ~@5 a1@11 ~ b1@11 ~@3 b1 ~@5 b1@11 ~ e2@11 ~@3 e2 ~@5 e2@11 ~ g#1@11 ~@3 g#1 ~@5 g#1@11 ~ a1@11 ~@3 a1 ~@5 a1@11 ~ b1@11 ~@3 b1 ~@5 b1@7]/8",
  D: "~ b1@3 ~@28", E: "~ b1@3 ~ c#2@3 ~@24",
})).s("gm_synth_bass_2").gain(0.58)

// chords · string ensemble 2 · "Ch  2"
const string_ensemble_2 = note("<A@8 B@3 ~ C@8 D@8 E@8 F@4 C@8 D@8 E@8 ~@8 G@8 E@8 H@8 I@2>".pickRestart({
  A: "[~@5 [b5,c#6,e6,g#6]@128 [c#5,e5,g#5,c#6]@64 [f#4,a4,c#5,f#5]@59]/8", B: "[~@5 [c#5,e5,g#5,c#6]@64 ~@27]/3",
  C: "[~@5 [e4,g#4,b4]@32 [d#4,g#4,b4]@32 [c#4,e4,a4]@32 [d#4,f#4,b4]@32 [e4,g#4,b4]@32 [d#4,g#4,b4]@32 [c#4,e4,a4]@32 [d#4,f#4,b4]@27, ~@5 e6@128 e6@123]/8", // E G#m A B E G#m A B
  D: "[~@5 [a4,c#5,e5]@32 [b4,e5,g#5]@32 [a4,c#5,e5]@32 [e5,g#5,b5]@32 [a4,c#5,e5]@32 [e5,g#5,b5]@32 [b4,d#5,f#5]@59]/8", // A E A E A E B
  E: "[~@5 [c#5,e5,g#5,c#6]@64 [f#4,a4,c#5,f#5]@64 [c#5,e5,g#5,c#6]@64 [f#4,a4,c#5,f#5]@59]/8", // C#m F#m C#m F#m
  F: "[~@5 [c#5,e5,g#5]@64 [f#4,a4,c#5]@59]/4", // C#m F#m
  G: "[~@5 [c#5,e5,g#5]@64 [f#5,a5,c#6]@64 [c#5,e5,g#5]@64 [f#5,a5,c#6]@32 ~@27]/8", // C#m F#m C#m F#m
  H: "[~@5 [c#5,e5,g#5]@64 [f#4,a4,c#5]@64 [c#5,e5,g#5]@64 [f#4,a4,c#5]@59]/8", I: "[~@5 [e5,g#5,b5,c#6]@32 ~@27]/2",
})).s("gm_string_ensemble_2").gain(0.19)

// other · tubular bells · "Ch  3"
const tubular_bells = note(`<
  ~@4 A B C D E ~ F D G H I@3 H J@3 K ~@4 L@2 A B C D M B C D M B C D G H I@3 H J@3 K ~@4 L@2 A B C D M B C D E ~@3 N
  O@3 P O@5 Q R A B C D M B C D M B C D M B C D S T
>`.pickRestart({
  A: "~@5 a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6",
  B: "~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6",
  C: "~ a#6@2 a#6 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5",
  D: "~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5",
  E: "~ f#5@2 f#5 ~@28", F: "~@5 f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5 ~ f#5@2 f#5",
  G: "~ f#5@2 f#5 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6",
  H: "~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6",
  I: "[~ c6@2 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6@2 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6 ~ c6@2 c6]/3",
  J: "[~ c6@2 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6 c6@2 ~ c6@2 ~ a5@2 a5 ~ a5@2 a5 ~ a5@2 a5 ~ a5@2 a5 ~ a5@2 a5 ~ a5@2 a5 ~ a5@2 a5]/3",
  K: "~ a5@2 a5 ~@28", L: "[~@5 [b3,b4,b5]@32 ~@27]/2",
  M: "~ f#5@2 f#5 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6 ~ a#6@2 a#6",
  N: "~@5 c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6",
  O: "~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6",
  P: "~ c#6@2 c#6@2 c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6 ~ c#6@2 c#6",
  Q: "~ c#6@2 c#6 ~ d6@2 d6 ~ d6@2 d6 ~ d6@2 d6 ~ d6@2 d6 ~ d6@2 d6 ~ d6@2 d6 ~ d6@2 d6", R: "~ d6@2 d6 ~ d6@2 ~@25",
  S: "~ f#5@2 f#5 ~ c#5!3 ~ c#5!3 ~ c#5!3 ~ c#5!3 ~ c#5!3 ~ c#5!3 ~ c#5!3", T: "~ c#5!3 ~@28",
})).s("gm_tubular_bells").gain(0.4)

// chords · piano · "Ch  4"
const piano = note(`<
  ~@4 A ~@2 B ~@12 C D@2 E@2 F@2 ~ A ~@2 B A ~@2 B A ~@2 B ~@8 C D@2 E@2 F@2 ~ A ~@2 B A ~@2 B ~@16 A ~@2 B A ~@2 B A
  ~@2 B A ~@2 B ~@2
>`.pickRestart({
  A: "~@5 [g#3,c#4,e4]@7 ~@20", B: "~@19 [a3,c#4,f#4] ~@5 [a3,c#4,f#4]@7", C: "~@5 [a3,c#4,e4]@7 ~@20",
  D: "[~@23 [g#3,b3,e4] ~@5 [g#3,b3,e4]@7 ~ [a3,c#4,e4]@11 ~@16]/2", // E A
  E: "[~@23 [g#3,b3,e4] ~@5 [g#3,b3,e4]@7 ~ [a3,c#4,e4]@9 ~@18]/2", F: "[~@22 [g#3,b3,e4] ~@6 [g#3,b3,e4]@5 ~@30]/2",
})).s("gm_piano").gain(0.52)

// chords · distortion guitar · "Ch  5"
const distortion_guitar = note(`<
  ~@4 A B ~@2 A B ~@17 C D B ~@2 A B ~@21 C D B ~@2 A B ~@2 E@3 F E@3 F E@3 F E@3 G A B ~@2 A B ~@11 H
>`.pickRestart({
  A: "~@5 c#4@5 ~@3 g#3@5 ~@3 e3@4 ~@4 f#3@2 ~", B: "~ c#3@3 ~ c#4@4 ~@4 g#3@5 ~@14, e3 ~@15", C: "~@25 g#3@3 ~ b3@3",
  D: "~ c4@3 ~ c#4@5 ~@3 g#3@5 ~@3 e3@4 ~@4 f#3@2 ~",
  E: "~@5 [c#2,c#3,g#3]@2 ~@12 [c#2,c#3,g#3]@2 ~@4 [c#2,c#3,g#3]@2 ~@5", // C#5
  F: "~@5 [c#2,c#3,g#3]@2 ~@12 [c#2,c#3,g#3]@2 ~@2 [c#2,c#3,g#3]@2 [c#2,c#3,g#3]@2 ~@5", G: "~@5 [c#2,c#3,g#3]@2 ~@25",
  H: "~@5 [c#2,c#3]@4 ~@23", // C#
})).s("gm_distortion_guitar").gain(0.49)

// chords · distortion guitar · "Ch  5" · soft notes
const distortion_guitar_soft = note(`<
  ~@5 A@2 ~@2 A@2 ~@18 A@2 ~@2 A@2 ~@22 A@2 ~@2 A@2 ~@18 A@2 ~@2 A@2 ~@11
>`.pickRestart({
  A: "[~@21 e3@5 ~@3 c#3@5 ~@30]/2",
})).s("gm_distortion_guitar").gain(0.33)

// other · synth drum · "Ch  6"
const synth_drum = note("<~@4 A B@15 C ~ D ~ D ~ D ~ A B@19 C ~ D ~ D ~ D ~ A B@7 C ~@15 A B@15 C ~>".pickRestart({
  A: "~@19 d3 ~@3 d3 ~ d3 ~@6", B: "~ d3 ~@17 d3 ~@3 d3 ~ d3 ~@6", C: "~ d3 ~@30", D: "e0 ~ e0@2 e0 ~ e0@16 ~@10",
})).s("gm_synth_drum").gain(0.8)

// other · french horn · "Ch  9"
const french_horn = note("<~@14 A@3 ~ B@5 C@8 ~@11 A@3 ~ D@8 E ~@43>".pickRestart({
  A: "[~@5 a3@32 b3@32 ~@27]/3", B: "[~@5 a3@32 b3@32 c#5@32 e5@12 d5@12 b4@8 c#5@27]/5",
  C: "[~@5 e5@32 c#5@32 ~@16 d#5@12 e5@4 b4@4 ~@151, ~@5 d5@251, ~@69 e5@20 ~@167]/8",
  D: "[~@5 a3@32 b3@32 c#5@32 e5@12 ~@12 b4@8 c#5@32 e5@32 c#5@32 ~@16 d#5@11, ~@113 d5@52 d5@6 ~@58 e5@20 ~@7]/8",
  E: "~ e5@4 b4@4 ~@23",
})).s("gm_french_horn").gain(0.26)

// drums · kick
const kick = s("bd").struct("<~@4 A@16 ~@6 B ~ A@20 ~@6 B ~ A@8 C@8 A@4 D@3 B A@16 ~@2>".pickRestart({
  A: "~@5 x ~@7 x ~@7 x ~@3 x ~@3 x ~@2", B: "~@5 x ~@26", C: "~@5 x ~@13 x ~@5 x ~@6",
  D: "~@5 x ~@7 x ~@7 x ~@7 x ~@2",
})).gain(0.8)

// drums · rim
const rim = s("rim").struct("<~@64 [~@13 x ~@15 x ~@2]!15 ~@19>").gain(0.64)

// drums · snare
const snare = s("sd").struct("<~@4 A@16 ~@8 A@20 ~@8 A@8 ~@12 A@3 ~ A@16 ~@2>".pickRestart({
  A: "~@13 x ~@15 x ~@2",
})).gain(0.56)

// drums · clap
const clap = s("cp").struct("<~@4 A@16 ~@8 A@20 ~@8 A@8 ~@12 A@3 ~ A@16 ~@2>".pickRestart({
  A: "~@13 x ~@15 x ~@2",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct("<~@97 [~@5 x ~@26]>").gain(0.8)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@4
  [~@5 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!74
  [~ x ~ x ~ x ~@26]
  [~@5 x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]
  [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!15
  [~ x ~ x ~@28]
  ~
>`).gain(0.72)

// drums · bongos
const bongos = s("bongo:18").struct("<~@80 [~ x ~@30] ~@17>").gain(1.68)

// drums · congas
const congas = s("conga:13").struct("<~@79 [~@23 x ~ x ~ x ~ x ~@2] ~@18>").gain(2.05)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@4
  [~@9 x ~@7 x ~@7 x ~@6]
  [~ x ~@7 x ~@7 x ~@7 x ~@6]!74
  [~ x ~@30]
  [~@9 x ~@7 x ~@7 x ~@6]
  [~ x ~@7 x ~@7 x ~@7 x ~@6]!15
  [~ x ~@30]
  ~
>`).gain(0.72)

// drums · guiro
const guiro = s("guiro:0").struct("<~@79 [~@31 x] ~@18>").gain(13.52)

stack(
  bass, string_ensemble_2, tubular_bells, piano, distortion_guitar, distortion_guitar_soft, synth_drum, french_horn,
  kick, rim, snare, clap, crash, tambourine, bongos, congas, shaker, guiro
)

More by The KLF