Strudelify

Equinox Part 4

Jean Michel Jarre

KeyA minorTempo113 bpm
0:00/0:00
// Equinox Part 4 — Jean Michel Jarre
// 113 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 4 "SAW WAVE" lead 2 sawtooth (copy of ch 5 "SAW WAVE" lead 2 sawtooth, 0.427 beats early)
// note: Full arrangement: all 113 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(113/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.

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A@5 B C B D@2 B C@2 E@2 B C B D@2 B C F@2 G H@2 ~@6 I@4 J ~@6 I@4 J B C B K B C@2 E@2 B C B K B C F@2 G H@2 ~@6 I@4 J
  ~@6 I@4 J ~@6 I@7 L ~@8
>`.pickRestart({
  A: "[a4,c5,a5]/5", B: "[a4,c5]@3 [g4,b4]", C: "[a4,c5]@3 [b4,d5]", D: "[[f4,a4]@63 ~]/2", E: "[[c5,e5]@63 ~]/2",
  F: "[[a4,c5]@3 e4 [e4,a4]@4, ~@3 c4@2 ~@3]/2", G: "[e4,a4,c5]", H: "[[g4,a#4,c#5]@63 ~]/2",
  I: "a3@11 ~ a4@4 a3@11 ~ a4@4", J: "a3", K: "[f4,a4]", L: "a3@11 ~ a4@4 ~@16",
})).s("gm_synth_strings_1").gain(0.35)

// chords · synth strings 1 · "SYN STR 1" · soft notes
const synth_strings_1_soft = note(`<
  ~@27 A@2 B@2 C@2 D@5 A@2 B@2 C@2 D@5 ~@20 A@2 B@2 C@2 D@5 A@2 B@2 C@2 D@5 A@2 B@2 C@2 E@4 F@4 ~@8
>`.pickRestart({
  A: "[[d4,f4,a4]@63 ~]/2", B: "[[a#3,d4,f4]@63 ~]/2", C: "[g3,a#3,d4]/2", D: "[c#4,e4]/5", E: "[c#4,e4]/4",
  F: "[~@112 a3@11 ~@5, [c#4,e4]]/4", // C#m
})).s("gm_synth_strings_1").gain(0.1)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@27 A B C D E F G H I J ~ A B C D E F G H I K ~@21 A B C D E F G H I J ~ A B C D E F G H I K ~ A B C D E F G H L K M
  H I K ~@8
>`.pickRestart({
  A: "~@3 [d6,f6] ~@2 [d6,f6] ~ [d6,f6] ~@2 [d6,f6] ~@4 [e6,g6] ~@2 [f6,a6] ~@5 [d6,f6] ~@5 [d6,f6]", // Dm Em F Dm
  B: "~@3 [g6,a#6] ~@5 [f6,a6] ~@5 [e6,g6] ~@3 [f6,a6] ~@5 [e6,g6] ~@5 [d6,f6]", // Gm F Em F Em Dm
  C: "~@3 [a#5,d6] ~@2 [a#5,d6] ~ [a#5,d6] ~@2 [a#5,d6] ~@4 [c6,e6] ~@2 [d6,f6] ~@5 [a#5,d6] ~@5 [a#5,d6]", // A# C Dm A#
  D: "~@3 [e6,g6] ~@5 [d6,f6] ~@5 [c6,e6] ~@3 [d6,f6] ~@5 [c6,e6] ~@5 [a#5,d6]", // Em Dm C Dm C A#
  E: "~@3 [g5,a#5] ~@2 [g5,a#5] ~ [g5,a#5] ~@2 [g5,a#5] ~@4 [a5,c6] ~@2 [a#5,d6] ~@5 [g5,a#5] ~@6", // Gm Am A# Gm
  F: "~@3 [g5,a#5] ~@5 [g5,a#5] ~@5 [a5,c6] ~@3 [a#5,d6] ~@12", // Gm Am A#
  G: "~@3 [g5,a#5] ~@5 [g5,a#5] ~@5 [g5,a#5] ~@3 [f5,a5] ~@5 [f5,a5] ~@5 [f5,a5]", // Gm F
  H: "~@3 [e5,g5] ~@5 [e5,g5] ~@5 [e5,g5] ~@3 [d5,f5] ~@5 [d5,f5] ~@5 [d5,f5]", // Em Dm
  I: "~@3 [f5,a5] ~@5 [f5,a5] ~@5 [f5,a5] ~@3 [e5,g5] ~@5 [e5,g5] ~@5 [e5,g5]", // F Em
  J: "~@3 [d5,f5] ~@5 [d5,f5] ~@5 [d5,f5] ~@3 [c#5,e5] ~@12", // Dm C#m
  K: "~@3 [d5,f5] ~@5 [e5,g5] ~@5 [d5,f5] ~@3 [c#5,e5] ~@12", // Dm Em Dm C#m
  L: "~@3 [f5,a5] ~@2 [f5,a5] ~ [f5,a5] ~@2 [f5,a5] ~ [f5,a5] ~@2 [f5,a5] ~@2 [e5,g5] ~@5 [e5,g5] ~@5 [e5,g5]", // F Em
  M: "~@3 [g5,a#5] ~@2 [g5,a#5] ~ [g5,a#5] ~@2 [g5,a#5] ~ [g5,a#5] ~@2 [g5,a#5] ~@2 [f5,a5] ~@5 [f5,a5] ~@5 [f5,a5]", // Gm F
})).s("gm_lead_2_sawtooth").gain(0.3).pan(1)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@5 A B@11 C@10 D@2 E@2 F@2 G@5 D@2 E@2 F@2 G@5 A B@10 C@9 D@2 E@2 F@2 G@5 D@2 E@2 F@2 G@5 D@2 E@2 F@2 G@7 H ~@8
>`.pickRestart({
  A: "a1@3 ~ a1@10 ~@2 a1@7 ~@9", B: "a1@3 ~ a1@3 ~@9 a1@7 ~@9", C: "a1@3 ~ a1@3 ~@9 a1@3 ~ a1@3 ~@9",
  D: "[d2,d3] ~@3 [d2,d3] ~@3 [d2,d3] ~@3 [d2,d3] ~@3 [d2,d3] ~@3 [d2,d3] ~@3 [d2,d3] ~@3 [d2,d3] ~@3", // D
  E: "[a#1,a#2] ~@3 [a#1,a#2] ~@3 [a#1,a#2] ~@3 [a#1,a#2] ~@3 [a#1,a#2] ~@3 [a#1,a#2] ~@3 [a#1,a#2] ~@3 [a#1,a#2] ~@3", // A#
  F: "[g1,g2] ~@3 [g1,g2] ~@3 [g1,g2] ~@3 [g1,g2] ~@3 [g1,g2] ~@3 [g1,g2] ~@3 [g1,g2] ~@3 [g1,g2] ~@3", // G
  G: "[a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@2 a2 a3 ~@3", // A
  H: "[a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@3 [a2,a3] ~@2 a2 ~@4", // A
})).s("gm_acoustic_bass").gain(0.3).pan(0.6)

// other · blown bottle · "BOTTLEBLOW"
const blown_bottle = note("<~@25 A B C ~@8 A B C ~@7 A B C ~@18 A B C ~@19 C ~@23>".pickRestart({
  A: "~@25 g7!7", B: "g7!32", C: "g7 f#7 f7 e7 d#7 d7 c#7 c7 b6 a#6 a6 g#6 ~ g6 f#6 ~ f6 e6 ~ d#6 d6 ~ c#6 ~@9",
})).s("gm_blown_bottle").gain(0.43)

// other · blown bottle · "BOTTLEBLOW" · soft notes
const blown_bottle_soft = note("<~@25 A ~ B ~@8 A ~ B ~@7 A ~ B ~@18 A ~ B ~@19 B ~@23>".pickRestart({
  A: "~@8 g7!17 ~@7", B: "~@23 c6 ~ b5 a#5 ~ a5 g#5 ~ g5",
})).s("gm_blown_bottle").gain(0.14)

// other · pad poly · "POLYSYNTH"
const pad_poly = note(`<
  ~@27 A@2 ~@9 B@2 ~@8 C@2 ~@2 D ~@2 E F ~ G ~@2 H ~@2 I@2 ~@3 J@2 ~@2 K@2 ~ L@2 ~ M ~ N ~@2 O@2 P ~@2 Q R@2 ~@2 S@2 K@2
  T ~@2 I@2 ~@10
>`.pickRestart({
  A: "[g6@5 ~ a#6@5 ~@21 c8@13 ~@19, ~@13 f7@32 ~@19, ~@16 a6@21 ~@27]/2",
  B: "[c7@5 ~ c7@5 ~@21 d#8@13 ~@19, ~@13 g#7@32 ~@19, ~@16 d7@21 ~@27]/2",
  C: "[c7@5 ~ f#6@5 ~@21 g7@13 ~@19, ~@13 f#7@32 ~@19, ~@16 b6@21 ~@27]/2", D: "a7@5 ~ c8@5 ~@9 d#7@11 ~, ~@13 g7@19",
  E: "a7@5 ~@4 g7@3 ~@20, ~@6 c8@5 ~@21", F: "~@6 a#6@5 ~@21", G: "~@13 d#6@18 ~", H: "f8@5 ~@12 f7@14 ~, ~@14 c8@17 ~",
  I: "[c8@5 ~ c7@5 ~@2 a#6@32 ~@19]/2", J: "[g6@5 ~ a#6@5 ~@2 f7@32 ~@19]/2", K: "[~@2 g6@3 ~ a#6@5 ~@2 f7@32 ~@19]/2",
  L: "[~@16 e6@29 ~@19, ~@3 g6@8 ~@5]/2", M: "c8@5 ~ e7@5 ~@21", N: "a7@5 ~ c8@5 ~ d8@19 ~", O: "[~@13 f7@32 ~@19]/2",
  P: "~@2 a7@3 ~ c8@5 ~@21", Q: "f7@5 ~ a7@5 ~@5 c8@14 ~@2, ~@13 g7@19",
  R: "[~@6 a#6@5 ~@21 c8@13 ~@19, ~@13 f7@32 ~@19]/2", S: "[~@6 a#6@5 ~@2 f7@32 ~@19]/2", T: "d#8@5 ~ d7@5 ~@21",
})).s("gm_pad_poly").gain(0.48).pan(0)

// other · pad poly · "POLYSYNTH" · soft notes
const pad_poly_soft = note("<~@56 A ~@27 B@2 ~@4 C@2 ~@2 D ~@18>".pickRestart({
  A: "~@3 g6@2 ~@27", B: "[g6@5 ~@11 a6@29 ~@19]/2", C: "[~@2 g6@3 ~@11 a6@21 ~@27]/2", D: "g6@5 ~@27",
})).s("gm_pad_poly").gain(0.32).pan(0)

// other · pad poly · "POLYSYNTH"
const pad_poly_2 = note("<~@76 A B C D E ~@10 A B C D F G H I J A B C D K ~@8>".pickRestart({
  A: "c3 c#3 d3 d#3 e3 f3 f#3 g3 g#3 a3 a#3 b3 c4 c#4 d4 d#4 e4 f4 f#4 g4 g#4 a4 a#4 b4 c5 c#5 d5 d#5 e5 f5 f#5 g5",
  B: "g#5 a5 a#5 b5 c6 b5 a#5 a5 g#5 g5 f#5 f5 e5 d#5 d5 c#5 c5 b4 a#4 a4 g#4 g4 f#4 f4 e4 d#4 d4 c#4 c4 b3 a#3 a3",
  C: "g#3 g3 f#3 f3 e3 d#3 d3 c#3 c3 c#3 d3 d#3 e3 f3 f#3 g3 g#3 a3 a#3 b3 c4 c#4 d4 d#4 e4 f4 f#4 g4 g#4 a4 a#4 b4",
  D: "c5 c#5 d5 d#5 e5 f5 f#5 g5 g#5 a5 a#5 b5 c6 b5 a#5 a5 g#5 g5 f#5 f5 e5 d#5 d5 c#5 c5 b4 a#4 a4 g#4 g4 f#4 f4",
  E: "e4 d#4 d4 c#4 c4 b3 a#3 a3 g#3 g3 f#3 f3 e3 d#3 d3 c#3 c3 ~@15",
  F: "e4 d#4 d4 c#4 c4 b3 a#3 a3 g#3 g3 f#3 f3 e3 d#3 d3 c#3 c3 c#3 d3 d#3 e3 f3 f#3 g3 g#3 a3 a#3 b3 c4 c#4 d4 d#4",
  G: "e4 f4 f#4 g4 g#4 a4 a#4 b4 c5 c#5 d5 d#5 e5 f5 f#5 g5 g#5 a5 a#5 b5 c6 b5 a#5 a5 g#5 g5 f#5 f5 e5 d#5 d5 c#5",
  H: "c5 b4 a#4 a4 g#4 g4 f#4 f4 e4 d#4 d4 c#4 c4 b3 a#3 a3 g#3 g3 f#3 f3 e3 d#3 d3 c#3 c3 c#3 d3 d#3 e3 f3 f#3 g3",
  I: "g#3 a3 a#3 b3 c4 c#4 d4 d#4 e4 f4 f#4 g4 g#4 a4 a#4 b4 c5 c#5 d5 d#5 e5 f5 f#5 g5 g#5 a5 a#5 b5 c6 b5 a#5 a5",
  J: "g#5 g5 f#5 f5 e5 d#5 d5 c#5 c5 b4 a#4 a4 g#4 g4 f#4 f4 e4 d#4 d4 c#4 c4 b3 a#3 a3 g#3 g3 f#3 f3 e3 d#3 d3 c#3",
  K: "e4 d#4 d4 c#4 c4 b3 a#3 a3 g#3 g3 f#3 f3 e3 d#3 d3 c#3 c3 c#3 d3 d#3 e3 f3 f#3 g3 g#3 a3 a#3 b3 ~@4",
})).s("gm_pad_poly").gain(0.15)

// drums · kick
const kick = s("bd").struct("<[x!4]!14 [x ~@7 x ~@7 x ~@6 x ~@8] [x!4]!42 [x ~@7 x ~@7 x ~@6 x ~@8] [x!4]!47 ~@8>")
  .gain(0.25)

// drums · snare
const snare = s("sd").struct("<~@15 [~ x ~@6]!34 ~@9 [~ x ~@6]!22 [~ x!2 ~@2 x!2 ~]!25 ~@8>").gain(0.25)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@80 [~@3 x ~@12]!25 ~@8>").gain(0.1)

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

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@26 A B C@7 D E@2 F C@6 D E@2 F ~@19 A B C@17 D E@2 F C@14 ~@8>".pickRestart({
  A: "~@12 x!20", B: "x!17 ~@3 x ~@11", C: "~@5 x ~@2", D: "~@20 x ~@3 x!8", E: "x!32", F: "x!12 ~@8 x ~@11",
})).gain(1.26)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@26 A B ~@7 C ~@2 D E ~@5 C ~@2 D E ~@18 A B ~@17 C ~@2 D E ~@21
>`.pickRestart({
  A: "~@3 x!9 ~@20", B: "~@17 x!3 ~ x!5 ~@6", C: "~@2 x!18 ~ x!3 ~@8", D: "~@12 x!8 ~ x!11", E: "x!2 ~@30",
})).gain(0.5)

// drums · shaker
const shaker = s("sh").struct("<~@26 A B ~@7 C D@2 B ~@6 C D@2 B ~@19 A B ~@17 C D@2 B ~@22>".pickRestart({
  A: "~@14 x!18", B: "x!17 ~@15", C: "~@25 x!7", D: "x!32",
})).gain(0.25)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@26 A B ~@7 C ~@2 D E ~@5 C ~@2 D E ~@18 A B ~@17 C ~@2 D E ~@21>".pickRestart({
  A: "~@4 x!10 ~@18", B: "~@17 x!9 ~@6", C: "~@4 x!21 ~@7", D: "~@17 x!15", E: "x!5 ~@27",
})).gain(0.1)

// drums · rim
const rim = s("rim").struct("<[~@6 x!3 ~@5 x!2] [x ~@5 x!3 ~@5 x!2]!103 [x ~@5 x!3 ~@7] ~@8>").gain(0.25)

stack(
  synth_strings_1, synth_strings_1_soft, lead_2_sawtooth, bass, blown_bottle, blown_bottle_soft, pad_poly,
  pad_poly_soft, pad_poly_2, kick, snare, snare_soft, hihat, cabasa, cabasa_soft, shaker, shaker_soft, rim
)

More by Jean Michel Jarre