Strudelify
Equinox Part 4 cover art

1978 · Équinoxe

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 Ld" lead 2 sawtooth (copy of ch 5 "Saw Ld (echo)" lead 2 sawtooth, 0.427 beats early)
// note: Full arrangement: all 105 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, A@4 for four bars: edit a riff to change every repeat.

// chords · synth strings 2 · "SynString2"
const synth_strings_2 = 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
>`.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_2").gain(0.35)

// chords · synth strings 2 · "SynString2" · soft notes
const synth_strings_2_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
>`.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_2").gain(0.1)

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

// bass · acoustic bass · "Woodbase"
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
>`.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 · "Bottle"
const blown_bottle = note("<~@25 A B C ~@8 A B C ~@7 A B C ~@18 A B C ~@19 C ~@15>".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 · "Bottle" · soft notes
const blown_bottle_soft = note("<~@25 A ~ B ~@8 A ~ B ~@7 A ~ B ~@18 A ~ B ~@19 B ~@15>".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 · "PolySyn Pad"
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 ~@2
>`.pickRestart({
  A: "[g6@5 ~ a#6@6 ~@20 c8@13 ~@19, ~@13 f7@32 ~@19, ~@16 a6@21 ~@27]/2",
  B: "[c7@6 c7@5 ~@21 d#8@13 ~@19, ~@13 g#7@32 ~@19, ~@16 d7@21 ~@27]/2",
  C: "[c7@6 f#6@5 ~@21 g7@13 ~@19, ~@13 f#7@32 ~@19, ~@16 b6@21 ~@27]/2", D: "a7@5 ~ c8@6 ~@8 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@6 ~@11 f7@14 ~, ~@14 c8@17 ~",
  I: "[c8@5 ~ c7@6 ~ a#6@32 ~@19]/2", J: "[g6@5 ~ a#6@6 ~ 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@6 ~@20", N: "a7@6 c8@5 ~ d8@19 ~", O: "[~@13 f7@32 ~@19]/2",
  P: "~@2 a7@3 ~ c8@5 ~@21", Q: "f7@5 ~ a7@6 ~@4 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@6 d7@5 ~@21",
})).s("gm_pad_poly").gain(0.48)

// other · pad poly · "PolySyn Pad" · soft notes
const pad_poly_soft = note("<~@56 A ~@27 B@2 ~@4 C@2 ~@2 D ~@10>".pickRestart({
  A: "~@3 g6@3 ~@26", 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)

// other · pad choir · "Choir Pad"
const pad_choir = note("<~@50 A B C D ~@4 E F G H ~@2 A B C D ~@37>".pickRestart({
  A: "~@24 f6@2 ~@2 f6 ~@3", B: "f6@2 ~@2 f6@2 ~@2 f6@2 ~@3 f6@2 ~@3 f6@2 ~@4 f6 ~@4 f6@2 ~",
  C: "~@2 f6 ~@5 f6@2 ~@3 f6@2 ~@3 f6@2 ~@4 f6@2 ~@3 f6@2 ~", D: "~@3 f6@2 ~@4 f6@2 ~@4 f6@2 ~@5 f6@2 ~@8",
  E: "~@12 a6 ~ a6 ~", F: "a6@2 ~@2 a6 ~@3 a6@2 ~@3 a6 ~@4 a6@2 ~@4 a6@2 ~@3 a6@2 ~",
  G: "~@2 a6@2 ~@4 a6@2 ~@3 a6@2 ~@3 a6 ~@5 a6@2 ~@3 a6@2 ~", H: "~@3 a6@2 ~@4 a6@2 ~@4 a6 ~@6 a6@2 ~@8",
})).s("gm_pad_choir").gain(0.43).pan(0)

// other · pad poly · "PolySyn Pad"
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>".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").gain(0.25)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@80 [~@3 x ~@12]!25>").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]>").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>".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 ~@13
>`.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 ~@14>".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 ~@13>".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]>").gain(0.25)

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

More by Jean Michel Jarre