Strudelify

Industrial Revolution: Overture

Jean Michel Jarre

KeyG♯ minorTempo97 bpm
0:00/0:00
// Industrial Revolution: Overture — Jean Michel Jarre
// 97 bpm, 4/4, key G# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 2 "STRINGS" string ensemble 1 (copy of ch 3 "SYN STR 2" synth strings 2); ch 7 "SYN STR 2" synth strings 2 (copy of ch 6 "STRINGS" string ensemble 1)
// note: Full arrangement: all 120 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(97/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.

// other · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~@4 A@2 B@2 C@2 A@2 B@2 C@2 D@2 E F G H@2 E F G E@2 F G E I G J@2 E K L M E K L N E I C@2 A@2 E F G H@2 E F G H@2 E F
  G E I G J@2 E K L M E K L M E K L N E I C@2 A@2 O@2 C@2 H@2 A@26 P@2 ~
>`.pickRestart({
  A: "[g#1,g#2]/2", B: "[f#1,f#2]/2", C: "[c#1,c#2]/2", D: "[[g#1,g#2]@31 ~]/2", E: "[g#1,g#2]", F: "[f#1,f#2]",
  G: "[c#1,c#2]", H: "[[g#1,g#2]@63 ~]/2", I: "[f#1,f#2]@31 ~", J: "[[d#1,d#2]@63 ~]/2", K: "[g1,g2]@16 [f#1,f#2]@15 ~",
  L: "[b1,b2]", M: "[a#1,a#2]", N: "[a#1,a#2]@16 [f#1,f#2]@15 ~", O: "[[f#1,f#2]@63 ~]/2", P: "[g#1 g#1, g#2]/2",
})).s("gm_synth_strings_2").gain(0.32).pan(0.6)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@10 A@2 B@2 C@4 D E F G@2 H I J K H I J L M N O@2 P Q R S P Q T U V W X@2 Y@2 D Z AA@3 D E AA@3 AB AC AD AE AF AG O@2
  P Q R S P Q R S P Q T U AH AI X@2 AJ@2 AK@2 AL@2 AM@2 AN@2 AO@2 AP@2 AQ@2 AR@2 AS@2 AT@2 AU@2 AV@2 AW@2 AX@2 AY@2 AZ@2
  BA@2 ~
>`.pickRestart({
  A: "[g#4@63 ~]/2", B: "[f#4@63 ~]/2", C: "[f4@54 ~ d#4@3 ~ c#4@3 ~ d#4@63 ~@2]/4", D: "g#4@31 ~", E: "f#4@31 ~",
  F: "f4@22 ~ d#4@3 ~ c#4@4 ~", G: "[d#4@63 ~]/2", H: "g#4@23 ~ a#4@7 ~", I: "b4@23 a#4@3 ~ b4@4 ~", J: "c#5@2 b4 c#5",
  K: "d#5@15 ~", L: "d#5@3 f5", M: "f#5@31 ~", N: "f5@15 ~ d#5@7 ~ c#5@7 ~", O: "[d#5@63 ~]/2",
  P: "[g#4,b4]@16 [a#4,c#5]@8 [b4,d#5]@7 ~, d#4@31 ~", Q: "[g4,b4,d#5] [f#4,a#4,c#5]",
  R: "[b4,d#5]@2 [c#5,e5] [d#5,f#5], f#4@31 ~", S: "[d#5,f#5]@16 [c#5,e5]@8 [b4,d#5]@7 ~, a#4@3 ~",
  T: "[b4,d#5]@16 [c#5,e5]@8 [d#5,f#5]@7 ~, f#4@31 ~", U: "[a#4,d#5,f#5]@2 [e5,g#5] [f#5,a#5], ~ f#4",
  V: "[d#5,g#5,b5]@31 ~", W: "[c#5,f#5,a#5]@31 ~", X: "[c#5,f5,g#5]/2", Y: "g#3/2", Z: "f#4",
  AA: "[f4@22 ~ d#4@4 c#4@3 ~ d#4@63 ~@2]/3", AB: "g#4@22 ~@2 a#4@7 ~", AC: "b4@23 a#4@3 ~ b4@3 ~@2",
  AD: "c#5@16 b4@8 c#5@7 ~", AE: "d#5@23 ~ f5@7 ~", AF: "f#5@23 f5@4 f#5@4 ~", AG: "f5@15 ~ d#5@8 c#5@7 ~",
  AH: "[d#5,g#5,b5]", AI: "[c#5,f#5,a#5]", AJ: "[g#4@31 ~]/2", AK: "[f#4@31 ~]/2", AL: "[f4@54 ~ d#4@4 c#4@3 ~@2]/2",
  AM: "[d#4@31 ~]/2", AN: "[[e4,g#4]@63 ~]/2", AO: "[[d#4,g4]@63 ~]/2", AP: "[[d4,f#4]@63 ~]/2",
  AQ: "[[c#4,f4]@63 ~]/2", AR: "[[c4,e4]@63 ~]/2", AS: "[[b3,d#4]@63 ~]/2", AT: "[[a#3,d4]@63 ~]/2",
  AU: "[[a3,c#4]@63 ~]/2", AV: "[[g#3,c4]@63 ~]/2", AW: "[[g#3,c4,e4]@63 ~]/2", AX: "[[g#3,b3,d#4]@63 ~]/2",
  AY: "[[g#3,a#3,d4]@63 ~]/2", AZ: "[[c#3,a3,c#4]@63 ~]/2", BA: "[d#3,g#3,c4]",
})).s("gm_string_ensemble_1").gain(0.25).pan(0.2)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@10 A@2 B@2 C@4 D E F G@2 H I J K H I J L M N O@2 P Q R S P Q T U V W X@2 Y@2 D Z AA@3 D E AA@3 AB AC AD AE AF AG
  AH@2 ~@16 AI@2 AJ@2 AK@2 AL@2 A@2 AM@2 B@2 AN@2 AO@2 G@2 AP@2 AQ@2 AR@2 AO@2 G@2 AP@2 AQ@2 AS@2 ~
>`.pickRestart({
  A: "[g#4@63 ~]/2", B: "[f#4@63 ~]/2", C: "[f4@54 ~ d#4@3 ~ c#4@3 ~ d#4@63 ~@2]/4", D: "g#4@31 ~", E: "f#4@31 ~",
  F: "f4@22 ~ d#4@3 ~ c#4@4 ~", G: "[d#4@63 ~]/2", H: "g#4@23 ~ a#4@7 ~", I: "b4@23 a#4@3 ~ b4@4 ~", J: "c#5@2 b4 c#5",
  K: "d#5@15 ~", L: "d#5@3 f5", M: "f#5@31 ~", N: "f5@15 ~ d#5@7 ~ c#5@7 ~", O: "[d#5@63 ~]/2",
  P: "[g#4,b4]@16 [a#4,c#5]@8 [b4,d#5]@7 ~, d#4@31 ~", Q: "[g4,b4,d#5] [f#4,a#4,c#5]",
  R: "[b4,d#5]@2 [c#5,e5] [d#5,f#5], f#4@31 ~", S: "[d#5,f#5]@16 [c#5,e5]@8 [b4,d#5]@7 ~, a#4@3 ~",
  T: "[b4,d#5]@16 [c#5,e5]@8 [d#5,f#5]@7 ~, f#4@31 ~", U: "[a#4,d#5,f#5]@2 [e5,g#5] [f#5,a#5], ~ f#4",
  V: "[d#5,g#5,b5]@31 ~", W: "[c#5,f#5,a#5]@31 ~", X: "[c#5,f5,g#5]/2", Y: "g#3/2", Z: "f#4",
  AA: "[f4@22 ~ d#4@4 c#4@3 ~ d#4@63 ~@2]/3", AB: "g#4@22 ~@2 a#4@7 ~", AC: "b4@23 a#4@3 ~ b4@3 ~@2",
  AD: "c#5@16 b4@8 c#5@7 ~", AE: "d#5@23 ~ f5@7 ~", AF: "f#5@23 f5@4 f#5@4 ~", AG: "f5@15 ~ d#5@8 c#5@7 ~",
  AH: "[d#5@31 ~]/2", AI: "[g#4@31 ~]/2", AJ: "[f#4@31 ~]/2", AK: "[f4@54 ~ d#4@4 c#4@3 ~@2]/2", AL: "[d#4@31 ~]/2",
  AM: "[g4@63 ~]/2", AN: "[f4@63 ~]/2", AO: "[e4@63 ~]/2", AP: "[d4@63 ~]/2", AQ: "[c#4@63 ~]/2", AR: "[c4@63 ~]/2",
  AS: "[d#3,g#3,c4]", // G#
})).s("gm_string_ensemble_2").gain(0.48).pan(0.8)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note("<~@66 A B C D E F G H I J K L M N O@3 P ~@36>".pickRestart({
  A: "~@4 d#3@5 ~@7", B: "g#3 ~ d#3 ~ g#3 ~ b3 ~ d#4 ~ g#3 ~ b3 ~ d#4 ~ g#4 ~ d#4 ~ g#4 ~ a#4 ~ b4 ~ d#5 ~ g5 ~ g#5 ~",
  C: "a#5@22 ~ b5@3 ~@2 a#5 ~ g#5 ~", D: "f#5@10 ~ f#5@2 ~ g#5@2 f#5@7 ~ f#5@3 g#5@4 ~",
  E: "f#5@3 ~ e5 ~ d#5 ~ c#5@7 ~@9 d#4 ~ g#4 ~ a#4 ~ b4 ~", F: "d#5@7 ~ c#5@3 ~ b4@3 ~ a#4@7 ~ g#4@7 ~", G: "a#4 ~@3",
  H: "b4@15 ~ f#5@15 ~", I: "c#6@23 ~ a#5@7 ~", J: "b5@19 ~ b4@3 ~ d#5@3 ~ g#5@3 ~", K: "a#5@7 ~ g#5@4 a#5@18 ~@2",
  L: "b5@19 ~ f#5 ~ d#5 ~ b4 ~ f#4 ~ d#5 ~ b4 ~",
  M: "c#5@7 ~ f#5 d#5 ~ f#4 ~@4 f#4 ~ d#4 ~ f#4 ~ d4 ~ d#4 ~ f#4@3 ~ f#4 ~",
  N: "d#4@16 ~@4 d#5 ~ d5 ~ d#5@3 ~ d5@2 ~@2",
  O: "[d#5@6 ~ d5@4 ~ d#5@10 ~@2 b5@3 ~ a#5 ~ g#5@5 ~ b5@4 ~ a#5@2 ~ g#5@7 ~ b5@4 a#5@2 ~ g#5@8 ~ f#5 ~ f5 ~ d#5@6 ~ c#5@12 ~ b4 ~ a#4 ~]/3",
  P: "g#4@3 ~",
})).s("gm_string_ensemble_1").gain(0.8).pan(0)

// other · synth drum
const synth_drum = note(`<
  ~@47 A B C D A B C D A B C D A B C D A B C D E F G H I J G F G H I K L F G M N B C D A B C D A B C D A B C D A B C D A
  B C D A B ~@11
>`.pickRestart({
  A: "~@2 f2 ~ f2 ~@3 b2 ~ b2 ~ b2 ~ b2 ~@3 f2 ~ f2 ~ [c5,e6]@2 ~@8", B: "~@2 c#2 ~ c#2 ~@11 g2 ~@3 g2 ~@7 c3 ~ c3 ~",
  C: "e5 ~ e5 ~ e5 ~ c2 ~ c2 ~@7 c2 ~ c2 ~ e2 ~ e2 ~ a1 ~ a1 ~ a1 ~@3",
  D: "c6 ~ c6 ~ c6 ~ c6 ~@9 g2 ~@3 g2 ~@5 g2 ~ a#1 ~ a#1 ~", E: "f1 ~@11 f1 ~@3 e2 ~@11 f1 ~@3",
  F: "f1 ~@5 f1 ~@5 f1 ~@3 f2 ~@15", G: "f1 ~@11 f1 ~@3 f2 ~@11 f1 ~@3", H: "f1 ~@5 f1 ~@5 f1 ~@3 f2 ~@11 f1 ~@3",
  I: "f1 ~@5 f1 ~@9 f2 ~@11 f1 ~@3", J: "[f1,f2] ~@5 [f1,f2] ~@9 f2 ~@5 f1 ~ f1 ~ f1 ~@5",
  K: "f1 ~@5 f1 ~@9 f2 ~@5 f1 ~ f1 ~ f1 ~@5", L: "f1 ~@11 f1 ~@3 f2 ~@11 e1 ~@3",
  M: "f1 ~@5 f1 ~@5 f1 ~@3 f2 ~@11 f1 ~ f1 ~", N: "f2 ~ f2 ~ f2 ~@3 b2 ~ b2 ~ b2 ~ b2 ~@3 f2 ~ f2 ~ [c5,e6]@2 ~@8",
})).s("gm_synth_drum").gain(0.32)

// other · music box
const music_box = note("<A@101 B ~@7 C D E C F G H F I ~@2>".pickRestart({
  A: "d#6 ~@3 g#5 ~@3 c#6 ~@3 b5 ~@3", B: "d#6 ~@3 g#5 ~@3 c#6 ~@7", C: "~@16 [d#5,d#6]@5 ~@3 [a4,a5]@5 ~@3",
  D: "[f#4,f#5] ~@7", E: "[d#4,d#5]@5 ~@27", F: "[f4,f5] ~@7", G: "[d4,d5]@5 ~@27",
  H: "~@16 [d#5,d#6]@5 ~@3 [g#4,g#5]@5 ~@3", I: "[d#4,g#4,d#5]@5 ~@27",
})).s("gm_music_box").gain(0.3)

// other · music box · soft notes
const music_box_soft = note("<[~ c#6 ~ b5 ~@28]!102 ~@18>").s("gm_music_box").gain(0.1)

// other · ocarina
const ocarina = note("<A B@102 ~@6 C D ~ C D ~ C D ~ E F>".pickRestart({
  A: "g#2 ~@3 g#3 ~@3 g#2@3 ~@21", B: "~@4 g#3 ~@3 g#2@3 ~@21", C: "~@3 g#2", D: "g#1 ~@3", E: "~ g#1@30 ~",
  F: "g#1@5 ~@27",
})).s("gm_ocarina").gain(0.24).pan(0.6)

// other · ocarina · soft notes
const ocarina_soft = note("<[~@2 d#3 ~@29]!103 ~@17>").s("gm_ocarina").gain(0.08).pan(0.6)

// other · tubular bells · "TUBULARBEL"
const tubular_bells = note("<[g#4 ~@7 g4 ~@7 g#4 ~@15]!102 ~@18>").s("gm_tubular_bells").gain(0.1).pan(0.3)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1_3 = note("<[~@14 g#1 ~]!119 ~>").s("gm_string_ensemble_1").gain(0.3).pan(0.3)

// drums · rim
const rim = s("rim").struct(`<
  A@48 B C D A B C D A B C D A B C D A B C D A@17 B C D A B C D A B C D A B C D A B C D A E F G ~ H ~@11
>`.pickRestart({
  A: "x!2 ~@3 x ~@2", B: "x ~ x ~@7 x ~@3 x!2", C: "x ~ x ~@7 x ~ x!3 ~", D: "x ~ x ~@7 x ~@2 x!3",
  E: "~@2 x ~@7 x ~@3 x!2", F: "~@12 x!3 ~", G: "~@13 x!3", H: "~@14 x!2",
})).gain(0.25)

// drums · kick
const kick = s("bd").struct(`<
  A@47 B A C A B A C A B A C A B A C A B A C A@17 B A C A B A C A B A C A D ~ E ~ D ~ E ~ D ~ E ~ D ~@11 F
>`.pickRestart({
  A: "~@7 x ~@6 x!2", B: "x!3 ~@4 x ~ x!2 ~@3 x!2", C: "~@3 x!2 ~@2 x!3 ~@4 x!2", D: "x!3 ~@6 x!2 ~@5",
  E: "~@3 x!2 ~@3 x!2 ~@6", F: "x",
})).gain(0.25)

// drums · snare
const snare = s("sd").struct("<~@67 [~ x]!16 ~@37>").gain(0.5)

// drums · clap
const clap = s("cp").struct("<~@109 [~ x] ~@2 [~ x] ~@2 [~ x] ~@4>").gain(0.5)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@47 A B ~ B A B ~ B A B ~ B A B ~ B A B ~ B C D C E F G C D C E F G C D C H A B ~ B A B ~ B A B ~ B A B ~ B A B ~ B A
  B ~ B A B ~ I ~@2 I ~@2 I ~@3
>`.pickRestart({
  A: "~@5 x!3 ~@8", B: "~@4 x!2 ~@2", C: "x ~@2 x ~@3 x", D: "x ~@2 x ~@2 x ~@9", E: "x ~@2 x ~@2 x ~@7 x ~",
  F: "x ~@2 x ~@10 x ~", G: "x ~@2 x ~@7 x!3 ~@2", H: "x ~@2 x ~@2 x ~@7 x!2", I: "~@3 x",
})).gain(0.4)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct(`<
  ~@47 A ~@3 A ~@3 A ~@3 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@12
>`.pickRestart({
  A: "~ x ~@2",
})).gain(0.2)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@47 A ~@3 A ~@3 A ~@3 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@12
>`.pickRestart({
  A: "~@11 x ~@4",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct("<A@67 B@16 A@21 C ~@4 D@2 E D@2 E D@2 E@3>".pickRestart({
  A: "~@2 x!2 ~@2 x!2", B: "~@2 x!3 ~ x!2", C: "~@3 x ~@2 x!2", D: "~ x", E: "x",
})).gain(0.25)

// drums · ride
const ride = s("rd").struct(`<
  A@50 B A@3 B A@3 B A@3 B A@3 B A@19 B A@3 B A@3 B A@3 B A@3 B A@2 ~ C ~@3 D ~@2 D ~@2 D ~@3
>`.pickRestart({
  A: "~ x ~@3 x ~@2", B: "~@2 x ~@7 x ~@2 x!3", C: "~@13 x!3", D: "~@3 x",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@49 A ~@3 A ~@3 A ~@3 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4 B ~@2 B ~@2 B ~@3
>`.pickRestart({
  A: "~@3 x", B: "x",
})).gain(0.5)

// drums · cowbell
const cowbell = s("cb").struct("<~@109 [~@5 x ~@2] ~@2 [~@5 x ~@2] ~@2 [~@5 x ~@2] ~@4>").gain(0.5)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@110 [x!2] ~@2 [x!2] ~@2 [x!2] ~@3>").gain(5.83)

// drums · mt
const mt = s("mt").struct(`<
  ~@48 A ~@3 A ~@3 A ~@3 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@11
>`.pickRestart({
  A: "~ x!2 ~@13",
})).gain(0.25)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@48 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ A ~ C ~@2 C ~@2 C ~ D
  ~
>`.pickRestart({
  A: "x ~@2 x ~ x ~ x ~@4 x ~@3", B: "x!4 ~ x ~ x ~@4 x ~@3", C: "~@2 x!2", D: "x!20 ~@12",
})).gain(2.51)

// drums · cabasa · soft notes
// … 18 more lines

More by Jean Michel Jarre