Strudelify

Etude (From 'Killing Fields')

Mike Oldfield

KeyA majorTempo75 bpm
0:00/0:00
// Etude (From 'Killing Fields') — Oldfield, Mike
// 75 bpm, 3/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 5 "MELO TOM 1" (melodic tom patch on one pitch) is played as the kit's tom
// note: duplicate parts dropped: ch 9 "CELESTA" celesta (copy of ch 8 "CELESTA" celesta, 0.25 beats late)
// note: Full arrangement: all 72 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(75/3)

// 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.

// other · shakuhachi
const shakuhachi = note(`<
  A B C D E F G H I J K ~ L M N ~ O B P ~ A Q C R S T U V W X U ~ Y Z AA AB A Q C R S T U V W X U ~ Y Z AA ~ AC AD C AB
  AE AF AG AB AC AD C AB AE AF AG ~@3 AH ~
>`.pickRestart({
  A: "e5@3 ~@5 d5@3 ~", B: "c5@3 ~@5 d5@3 ~", C: "e5 ~@3", D: "~@8 f5@3 ~", E: "g5@3 ~@5 f5@3 ~", F: "e5@3 ~@5 f5@3 ~",
  G: "g5 ~@3", H: "~@8 c5@3 ~", I: "c6@3 ~@5 b5@3 ~", J: "a5@3 ~@5 b5@3 ~", K: "a5@3 ~ g#5@3 ~@5",
  L: "a#5@7 ~@9 a5@6 ~@2", M: "g5@7 ~@9 a5@6 ~@2", N: "g5@6 ~@2 f5@7 ~@9", O: "e5@7 ~@9 d5@7 ~",
  P: "c5@6 ~ b5 b4@6 ~@10", Q: "c#5@3 ~@5 d5@3 ~", R: "~@8 a4@3 ~", S: "f#5@3 ~@5 f#5@3 ~", T: "d6@3 ~@5 f#5@3 ~",
  U: "f#5@3 ~ e5@3 ~@5", V: "~@8 c#5@3 ~", W: "a5@3 ~@5 a5@3 ~", X: "g#5@3 ~@5 d#5@3 ~", Y: "d5@7 ~@17",
  Z: "c#5@7 ~@9 b4@6 ~@2", AA: "b4@6 ~@2 a4@7 ~@9", AB: "~@8 e4@3 ~", AC: "a4 ~@3", AD: "b4@3 ~ c5@3 ~ d5@3 ~",
  AE: "[e5,g#5] ~@3", AF: "[d5,f#5]@3 ~ [c#5,e5]@3 ~ [b4,d5]@3 ~", AG: "[a4,c#5] ~@3", AH: "a3 ~@2",
})).s("gm_shakuhachi").gain(0.64)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~@20 A@4 B C A@2 D E F@2 G H I@2 A@4 B C A@2 D E F@2 G H J@2 K@2 I@2 L@2 A@2 M@2 N@2 O@2 P@4 Q ~
>`.pickRestart({
  A: "[a4,c#5,e5]/2", B: "[a4,d5,f#5]", C: "[b4,d5,f#5]", D: "[a4,c#5,f#5]", E: "[g#4,c5,d#5]", F: "[g#4,c#5,e5]/2",
  G: "[f4,a4,d5]", H: "[e4,a4,c#5]@2 [e4,g#4,b4]", I: "[e4,a4,c#5]/2", J: "[[e4,a4,c#5]@47 ~]/2",
  K: "[[c4,f4,a4,c5]@47 ~]/2", L: "[[g#4,b4,e5]@47 ~]/2", M: "[[c4,f4,a4]@23 ~]/2", N: "[[e4,a4,c#5]@23 ~]/2",
  O: "[[e4,g#4,b4]@47 ~]/2", P: "[a4,c#5,e5]/4", Q: "[a3,c#4]",
})).s("gm_synth_strings_2").gain(0.48)

// chords · synth strings 2 · "SYN STR 2" · soft notes
const synth_strings_2_soft = note("<~@8 A@2 B@2 C@2 D@2 E F B@2 ~@52>".pickRestart({
  A: "[[a4,c5,f5]@40 [a4,d5,f5]@7 ~]/2", B: "[~ d5, [g#4,b4,e5]]/2", C: "[e5@5 f5, [g4,a4,c#5]]/2", D: "[a4,d5,f5]/2",
  E: "[a4,e5]", F: "[a4,c5,f5]",
})).s("gm_synth_strings_2").gain(0.24)

// other · taiko drum · "TAIKO"
const taiko_drum = note("<[d3 ~@4 d3]!70 [d3 ~@2]!2>").s("gm_taiko_drum").gain(0.72)

// other · shakuhachi
const shakuhachi_2 = note(`<
  A B C D E F G H I J K ~ L M N ~ O@2 P ~ A Q C R S T U V W X U ~ Y Z AA AB A Q C R S T U V W X U ~ Y Z AA ~ AC AD AE AF
  AG AH AI AF AC AD AE AF AG AH AI ~@3 AJ ~
>`.pickRestart({
  A: "~@2 e5@3 ~@5 d5@2", B: "~@2 c5@3 ~@5 d5@2", C: "~@2 e5@3 ~@7", D: "~@5 f5", E: "~@2 g5@3 ~@5 f5@2",
  F: "~@2 e5@3 ~@5 f5@2", G: "~@2 g5@3 ~@7", H: "~@5 c5", I: "~@2 c6@3 ~@5 b5@2", J: "~@2 a5@3 ~@5 b5@2",
  K: "~@2 a5@3 ~ g#5@3 ~@3", L: "~@4 a#5@7 ~@9 a5@4", M: "~@4 g5@7 ~@9 a5@4", N: "~@4 g5@6 ~@2 f5@7 ~@5",
  O: "[~@4 e5@7 ~@9 d5@7 ~ c5@6 ~@10 d5@4]/2", P: "~@4 c5@6 ~ b5 b4@6 ~@6", Q: "~@2 c#5@3 ~@5 d5@2", R: "~@5 a4",
  S: "~@2 f#5@3 ~@5 f#5@2", T: "~@2 d6@3 ~@5 f#5@2", U: "~@2 f#5@3 ~ e5@3 ~@3", V: "~@5 c#5", W: "~@2 a5@3 ~@5 a5@2",
  X: "~@2 g#5@3 ~@5 d#5@2", Y: "~@4 d5@7 ~@13", Z: "~@4 c#5@7 ~@9 b4@4", AA: "~@4 b4@6 ~@2 a4@7 ~@5", AB: "~@5 e4",
  AC: "~ a4@3 ~@8", AD: "~ b4@3 ~ c5@3 ~ d5@3", AE: "~ e5@3 ~@8", AF: "~@3 e4", AG: "~ [e5,g#5]@3 ~@8",
  AH: "~ [d5,f#5]@3 ~ [c#5,e5]@3 ~ [b4,d5]@3", AI: "~ [a4,c#5]@3 ~@8", AJ: "~ a3@4 ~@7",
})).s("gm_shakuhachi").gain(0.36).pan(0.8)

// other · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
  ~@35 A B C D E F G H I J K L ~ M N O@2 P Q R A S T U A P Q R A S T U ~@3 V ~
>`.pickRestart({
  A: "~@2 e4", B: "e5@8 d5@3 ~", C: "c#5@2 d5", D: "e5", E: "~@2 a4", F: "f#5@8 f#5@3 ~", G: "d6@8 f#5@3 ~",
  H: "f#5 e5@2", I: "~@2 c#5", J: "a5@8 a5@3 ~", K: "g#5@3 ~@5 d#5@3 ~", L: "f#5@3 ~ e5@3 ~@5", M: "d5@7 ~@17",
  N: "c#5@7 ~@9 b4@6 ~@2", O: "[b4@3 ~ a4@20]/2", P: "a4", Q: "b4 c5 d5", R: "e5@2 ~", S: "e5@2 e4",
  T: "d5@3 ~ c#5@3 ~ b4@3 ~", U: "a4 ~@3", V: "a3 ~@2",
})).s("gm_electric_guitar_jazz").gain(0.72)

// other · celesta
const celesta = note("<~@36 A@4 B@2 A@2 C D E F G H I@2 J@2 K@2 L@2 M@2 J@2 K@2 L@2 M@4 N O>".pickRestart({
  A: "e5 a5 c#5 a5 f#5 a5 e5 a5 f#5 a5 e5 a5", B: "a5 d6 f#5 d6 b5 d6 a5 d6 b5 d6 a5 d6",
  C: "f#5 a5 c#5 a5 f#5 a5 c#5 a5 f#5 a5 c#5 a5", D: "g#5 c6 d#5 c6 g#5 c6 d#5 c6 g#5 c6 d#5 c6",
  E: "g#5 c#6 e5 c#6 g#5 c#6 e5 c#6!2 e6 g#5 e6", F: "c#6 e6 g#5 e6!2 g#6 c#6 g#6 e6 g#6 c#6 g#6",
  G: "a5 d6 f5 d6 a5 d6 f5 d6 a5 d6 f5 d6", H: "a5 c#6 e5 c#6 a5 c#6 e5 c#6 g#5 b5 e5 b5",
  I: "a5 c#6 e5 c#6 f#5 c#6 e5 c#6 f#5 c#6 e5 c#6", J: "f5 c6 c5 c6 a5 c6 f5 c6 a5 c6 f5 c6",
  K: "a5 e6 e5 e6 b5 e6 a5 e6 b5 e6 a5 e6", L: "g#5 e6 e5 e6 b5 e6 g#5 e6 b5 e6 g#5 e6",
  M: "a5 e6 e5 e6 c#6 e6 a5 e6 c#6 e6 a5 e6", N: "[a4,a5] ~ [a4,a5] ~ [a4,a5] ~ [a4,a5] ~@5", O: "[a4,a5] ~@11",
})).s("gm_celesta").gain(0.4).pan(0.6)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@35 A B C D@2 E F G@2 H I J@2 K L@3 M N ~@6 M N ~@10>".pickRestart({
  A: "~@2 e4", B: "e5@2 d5", C: "c#5@2 d5", D: "[e5@5 a4]/2", E: "f#5@2 f#5", F: "d6@2 f#5", G: "[f#5 e5@4 c#5]/2",
  H: "[a5,a6]", I: "g#5@2 d#5, g#6", J: "[f#5 e5@5, e6]/2", K: "[d5,d6]", L: "[[c#5,c#6]@2 [b4,b5]@2 [a4,a5]@5]/3",
  M: "f4", N: "g4 a4 b4",
})).s("gm_string_ensemble_1").gain(0.32)

// bass · acoustic bass · "ACOU BASS"
const bass = note("<~@36 A@4 B C A@2 D E F@2 G H A@2 I@2 A@2 H@2 A@2 I@2 A@2 H@2 A@4 ~ J>".pickRestart({
  A: "a1", B: "d2", C: "b1", D: "f#1", E: "g#1", F: "c#2", G: "d1", H: "e1", I: "f2", J: "[a1,a2] ~@2",
})).s("gm_acoustic_bass").gain(0.48)

// drums · rim
const rim = s("rim").struct("<[~@5 x ~@3 x ~@2]!70 ~@2>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@20 [~ x ~]!50 ~@2>").gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@20 [~@3 x]!16 [x ~@2 x]!34 x ~>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<[~ x]!70 x!2>").gain(0.5)

// drums · crash
const crash = s("cr").struct("<~@34 A B@3 C ~@11 A B D B E ~@6 B F ~@9>".pickRestart({
  A: "~@22 x!2", B: "x!24", C: "x!22 ~@2", D: "x!15 ~@7 x!2", E: "x", F: "x!23 ~",
})).gain(0.15)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@34 A ~@3 B ~@11 A ~ C ~@7 D ~ E ~@9>".pickRestart({
  A: "x!22 ~@2", B: "~@22 x!2", C: "~@15 x!7 ~@2", D: "x!24", E: "~@23 x",
})).gain(0.05)

stack(
  shakuhachi, synth_strings_2, synth_strings_2_soft, taiko_drum, shakuhachi_2, electric_guitar_jazz, celesta,
  string_ensemble_1, bass, rim, snare, open_hat, mid_tom, crash, crash_soft
)

More by Mike Oldfield