Strudelify
Oxygene, Part 4 cover art

Oxygène

Oxygene, Part 4

Jean Michel Jarre

KeyC minorTempo123 bpm
0:00/0:00
// Oxygene, Part 4 — Jean Michel Jarre
// 123 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 116 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(123/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 · fretless bass · "FRETLESS"
const bass = note(`<
  ~@2 A B C B C B C B C B D E F G B H B C E D I@2 B C B C E D F J K L E D F G K L E D F J K L E D F J C B C B D E F G B
  H B C E D I@2 B C H C E D F J K L E D F G K L E D F J K L E D F G K L E D F J K L E D F G K L E D F J K L E D F J
>`.pickRestart({
  A: "~@11 g1", B: "c2@6 bb1@3 ~ c2@6 g1@2 bb1@4 g1@2", C: "c2@6 bb1@3 ~ c2@5 ~ c2@2 bb1@4 g1@2",
  D: "d2@6 c2@3 ~ d2@5 ~ d2@2 c2@4 a1@2", E: "d2@6 c2@4 d2@5 ~ d2@2 c2@4 a1@2", F: "f2@6 eb2@4 c2@5 ~ f2@2 eb2@4 c2@2",
  G: "~@6 eb2@4 c2@5 ~ c2@2 eb2@4 c2@2, ~ f2 ~@4", H: "c2@6 bb1@4 c2@5 ~ c2@2 bb1@2 g1@2 bb1@2",
  I: "[f2@6 eb2@4 c2@5 ~ f2@2 eb2@4 c2@5 ~ f2@2 eb2@2 c2@2 eb2@2 c2@2 bb1@2 g1@2 bb1 ~ g1@2 bb1@2]/2",
  J: "c2@3 ~ f2@2 eb2@2 c2@2 eb2@2 c2@2 bb1@2 g1@2 bb1 ~ g1@2 bb1@2", K: "c2@6 bb1@3 ~ c2@5 ~ g1@2 bb1@4 g1@2",
  L: "c2@6 bb1@4 c2@5 ~ c2@2 bb1@4 g1@2",
})).s("gm_fretless_bass").gain(0.3).pan(0.2)

// other · kalimba
const kalimba = note(`<
  A B ~ C@9 D@2 C@6 D@2 C@6 D@2 C@2 ~@6 C@2 D@2 C@4 D@2 C@6 D@2 C@6 D@2 C@6 D@2 C@2 ~@6 C@2 D@2 C@4 D@2 C@4 D@2 C@4 D@2
  C@4 D@2 C@4 D@2 C@2
>`.pickRestart({
  A: "~@8 c4@2 ~@2 c4 ~@3 c4 ~@3 c4@2 ~@2", B: "c4 ~@3 c4@2 ~@2 c4@2 ~@14",
  C: "~@4 c4 ~@3 c4@2 ~@2 c4@2 ~@4 c4 ~@3 c4@2", D: "~@4 d4 ~@3 d4@2 ~@2 d4@2 ~@4 d4 ~@3 d4@2",
})).s("gm_kalimba").gain(0.2).pan(0.8)

// other · synth brass 2 · "SYNBRASS 2"
const synth_brass_2 = note(`<
  ~@8 A@4 B@2 C D A@4 B@2 C D A@4 B@2 C D ~@18 A@4 B@2 C D A@4 B@2 C D A@4 B@2 C D ~@42
>`.pickRestart({
  A: "[c5@6 ~@4 g4 ~ eb4@3 ~ g4@5 ~ c4@14 ~@12]/2", B: "[bb4@6 ~@4 a4 ~ g4@3 ~ a4@5 ~ d4@14 ~@12]/2",
  C: "a4@3 ~ g4 ~ f4@3 ~ c4@12 ~@2", D: "a4@3 ~ g4 ~ f4@3 c4@11 ~@4",
})).s("gm_synth_brass_2").gain(0.25)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~@8 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@2 B@2 D@2 A@2 B@2 D@2 A@2 B@2 D@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@2
  B@2 D@2 A@2 B@2 D@2 A@2 B@2 D@2 A@2 B@2 D@2 A@2 B@2 D@2 A@2 B@2 D@2 A@2 B@2 E F
>`.pickRestart({
  A: "[c3,eb3,g3,c4]/2", B: "[d3,g3,bb3,d4]/2", C: "[c3,f3,a3,c4]/2", D: "[f3,a3,c4,f4]/2", E: "[f3,a3,c4,f4]",
  F: "[f3,a3,c4,f4]@7 ~", // F
})).s("gm_synth_strings_2").gain(0.15)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@8 A@8 B@8 A@8 C@2 D@2 E@2 ~@12 A@8 B@8 A@8 C@2 D@2 E@2 ~@36>".pickRestart({
  A: "[c5@10 g4@2 eb4@4 g4@6 c4@26 c5@10 g4@2 eb4@4 g4@6 ~@26 bb4@10 a4@2 g4@4 a4@6 d4@26 a4@4 g4@2 f4@4 ~@14 a4@4 g4@2 ~@3 c4@15, ~@70 c4@28 ~@56 c4@16 ~@4 f4@5 ~@13]/8",
  B: "[c5@10 g4@2 eb4@4 g4@6 c4@26 c5@10 g4@2 eb4@4 g4@6 c4@26 bb4@10 a4@2 g4@4 a4@6 d4@26 a4@4 g4@2 f4@4 ~@14 a4@4 g4@2 ~@3 c4@15, ~@154 c4@16 ~@4 f4@5 ~@13]/8",
  C: "c5@2 g5@2 c5@2 g5@2 c5@2 g5@13 ~", D: "d5@2 bb5@2 d5@2 bb5@2 d5@2 bb5@13 ~",
  E: "f5@2 c6@2 f5@2 c6@2 f5@2 c6@13 ~",
})).s("gm_string_ensemble_1").gain(0.15).pan(1)

// other · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note("<~@14 A B C@7 D C@7 D ~@24 A B C@7 D C@7 D ~@42>".pickRestart({
  A: "a4@2 g4 f4@2 c4@7", B: "a4@4 g4@2 ~@3 c4@15, ~@6 f4@5 ~@13",
  C: "[c5@5 g4 eb4@2 g4@3 c4@13 c5@5 g4 eb4@2 g4@3 c4@13 bb4@5 a4 g4@2 a4@3 d4@13 a4@2 g4 f4@2 c4@7]/7",
  D: "a4@4 g4@2 f4@3 c4@15",
})).s("gm_synth_strings_1").gain(0.25).pan(0)

// chords · pad bowed · "BOWEDGLASS"
const pad_bowed = note(`<
  ~@32 A@2 B@2 C@2 A@2 B@2 C@2 A@2 B@2 D@3 ~@23 A@2 B@2 C@2 A@2 B@2 C@2 A@2 B@2 C@2 A@2 B@2 C@2 A@2 B@2 C@2 A@2 B@2 C@2
  A@2 B@2 ~@2
>`.pickRestart({
  A: "[~ eb4@3, g3, ~ c4@7]/2", B: "[~ d4@3, g3, ~ bb3@7]/2", C: "[~ f4@3, a3, ~ c4@7]/2",
  D: "[~ f4@4 ~, a3@2 ~, ~ c4@8 ~@3]/3",
})).s("gm_pad_bowed").gain(0.15).pan(0.6)

// chords · pad bowed · "BOWEDGLASS" · soft notes
const pad_bowed_soft = note("<~@114 [~ f4, a3, ~ c4@3] [~@4 f4@3 ~, a3@7 ~, ~@2 c4@5 ~]>")
  .s("gm_pad_bowed").gain(0.1).pan(0.6)

// other · sitar
const sitar = note(`<
  ~@38 A@2 B@2 C D A@2 B@2 C E ~@30 A@2 B@2 C D F G H I J K L M N O P Q L R S T U V F W X Y Z AA L R S T U V
>`.pickRestart({
  A: "eb4 d4 eb4 c4@2 g3@7", B: "bb3 a3 bb3 g3@2 d3@7", C: "a3 g3 f3 f3@2 c4@7", D: "a3 g3 f3 a3 g3 f3 c4@6",
  E: "a3@4 g3@5 f3@3 c4@12", F: "eb4 d4 eb4 c4@2 g3@3 eb4@3 g3", G: "eb4 d4 eb4 c4@2 g3@3 eb4 d4@2 c4",
  H: "bb3@2 a3@2 g3@2 bb3@2 a3@2 g3@2 d4@4 g3@5 ~ g3@2", I: "bb3@2 a3@2 g3@2 bb3@4 d3@6 bb3@2 a3@3 ~ g3@2",
  J: "a3 f3 a3 c4 a3 c4", K: "f4 c4 f4 a4 f4@2", L: "eb5 d5 eb5 c5@2 g4@3 eb5@3 g4", M: "eb5@2 g4 d5@2 c5@3 g4@4",
  N: "bb4 a4 bb4 g4@2 d4@3 bb4@3 d4", O: "bb4 a4 g4 bb4 a4 g4 d5@2 g4@4", P: "a4@2 g4@2 f4@2 f4@4 c5@6 f4@5 ~ f4@2",
  Q: "a4@2 g4 f4@2 c5@3 f4@4", R: "eb5@4 g4@2 d5@4 c5@6 g4@6 g4 ~", S: "d5 c5 bb4 d5 c5 bb4 d5@2 g4@3 g4",
  T: "d5 c5 d5 bb4@2 g4@3 d5 c5@2 bb4", U: "a4@4 g4@2 f4@4 c5@6 f4@5 ~ f4@2", V: "a4 g4 a4 f4@2 c5@3 f4@4",
  W: "eb4 d4 c4 eb4 d4 c4 eb4@2 g3@3 g3", X: "bb3 a3 bb3 g3@2 d3@3 bb3@3 d3", Y: "d4 c4 bb3 d4 c4 bb3 d4@2 g3@4",
  Z: "a3 g3 f3 f3@2 c4@3 f3@3 f3", AA: "a3 g3 f3 a3 g3 f3 ~@2 f3@4, ~@2 c4 ~",
})).s("gm_sitar").gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@3 [~ x ~@4]!113>").gain(0.25)

// drums · tambourine
const tambourine = s("tb").struct("<~@3 [x!8 ~@2 x!2]!112 [x!6 ~@4 x ~]>").gain(0.15)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@3 [~@2 x]!112 [~@6 x!3 ~@2 x]>").gain(0.1)

// drums · guiro
const guiro = s("guiro:4").struct("<~@3 [~@3 x]!113>").gain(3.14)

// drums · rim
const rim = s("rim").struct("<~@3 [~ x ~ x]!113>").gain(0.2)

stack(
  bass, kalimba, synth_brass_2, synth_strings_2, string_ensemble_1, synth_strings_1, pad_bowed, pad_bowed_soft, sitar,
  open_hat, tambourine, tambourine_soft, guiro, rim
)

More by Jean Michel Jarre