Strudelify

Oxygene, Part 1

Jean Michel Jarre

KeyG majorTempo64 bpm
0:00/0:00
// Oxygene, Part 1 — Jean Michel Jarre
// 64 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// 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(64/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 · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<A@2 B@2 C D@4 E@8 F@5 ~@41 G@6 H@8 I@3 ~@21 J K L M N@2 K L M O P ~>".pickRestart({
  A: "[[d4,g5]@6 [d4,g5]@6 [d4,g5]@6 [d4,g5]@6 [d4,g4]@5 g4@6 d4@6 [d4,g4]@6 [d5,g5]@6 [d5,g5]@5 [d5,g5]@6]/2", // G5
  B: "[[d5,g5]@6 [d4,g4]@6 g4@6 d4@6 [d4,g4]@5 [d4,g5]@6 [d4,g5]@6 [d4,g5]@6 [d4,g5]@6 [d4,g4]@5 g4@6]/2", // G5
  C: "d4@6 [d4,g4]@6 [d5,g5]@6 [d5,g5]@6 [d5,g5]@5 [d5,g5]@3", // G5
  D: "[~@3 [d4,g4]@6 g4@6 d4@6 [d4,g4]@5 [g4,a#4]@64 [f4,a4]@38]/4", // G5 Gm F
  E: "[~@26 [c4,d#4,g4]@64 ~ f#4@63 [g4,a#4]@64 [f4,a4]@38, ~@90 [c4,a4]@65 ~@101]/8", // Cm Gm F
  F: "[~@26 [c4,d#4,g4]@64 ~ f#4@64 ~@5, ~@18 [c4,a4]@13 ~]/5", G: "[[g4,a#4] [f4,a4] [c4,d#4,g4]]/6",
  H: "[[c4,f#4,a4] [g4,a#4] [f4,a4] [c4,d#4,g4]]/8", I: "[[c4,f#4,a4]@65 ~@31]/3", J: "g4 f4, d2", K: "d#4 d4",
  L: "c4 a#3", M: "a3 g3", N: "[f3 ~ g4 f4, ~@16 d#3@19 ~@29, ~ d2]/2", O: "f3 d#3", P: "[d2,g2,d3]",
})).s("gm_string_ensemble_1").gain(0.21).pan(0.6)

// chords · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note("<A@2 B C D E ~@107>".pickRestart({
  A: "[~@29 d4@6 g4@6 ~@23]/2", B: "~@6 d4@3 g4@3 ~@4", C: "~@13 d4@3", D: "g4@3 ~@13", E: "~@9 d4@6 g4@6 ~@11",
})).s("gm_string_ensemble_1").gain(0.07).pan(0.6)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<A@7 B@2 C@8 D@5 ~@43 E@2 F@8 G@5 ~@21 H@3 I@5 J@3 ~>".pickRestart({
  A: "[g2,d3,g3]/7", B: "[~@27 c3@37, ~@13 [f2,f3]@19]/2",
  C: "[~@26 [c2,g2,c3]@64 [d2,a2]@64 ~@65 c3@37, ~@90 d3@131 ~@35, ~@154 [g2,g3]@67 ~@35, ~@109 [f2,f3]@19]/8", // C5 D5 G F
  D: "[~@26 [c2,g2,c3]@64 [d2,a2,d3]@65 ~@5]/5", E: "[f2,c3,f3]/2",
  F: "[[c2,g2,c3] ~ g3 [f2,c3,f3], ~@64 d3@131 ~@61, ~@32 [d2,a2]@33 ~@63, ~@127 g2@67 ~@62]/8", // C5 F5 D5
  G: "[[c2,g2,c3]@64 [d2,a2,d3]@65 ~@31]/5", H: "[g2,d3,g3]/3", I: "[[d2,g2,d3]@2 [g2,d3,g3]@3]/5",
  J: "[[d2,g2,d3]@65 ~@31]/3", // G5
})).s("gm_string_ensemble_2").gain(0.2).pan(0.2)

// chords · cello
const cello = note("<~@21 A@7 B@4 C@7 D@6 ~@34 E@5 F@6 E@5 G@7 ~@11>".pickRestart({
  A: "[~@13 g3@8 f3@8 d#3@8 d3@8 ~@16 a#2@8 a2@8 g2@8 [g2,d3]@8 c3@8 a#2@8 a2@3, ~@26 g2@80 c2@81 ~@37, ~@45 c3@17 ~@31 g2@19]/7", // G5
  B: "[~@5 a3@8 g3@16 e3@16 d#3@8 f#3@8 c3@3, ~@5 a2@59]/4",
  C: "[~@5 d3@8 g3@8 f3@8 d#3@8 d3@8 ~@16 a#2@8 a2@8 g2@8 [g2,d3]@8 c3@8 a#2@8 a2@3, ~@26 g2@80 c2@81 ~@37, ~@45 c3@17 ~@31 g2@19]/7", // G5
  D: "[~@10 a3@16 g3@32 e3@32 d#3@16 f#3@16 c3@16 d3@16 g2@17 ~@21, ~@10 a2@145 ~@37]/6",
  E: "[g3 f3 d#3 d3 ~@2 a#2 a2 g2 [g2,d3], g2 c2, ~@32 c3@17 ~@31]/5", // G5
  F: "[c3 a#2 a2 a3 g3@2 e3@2 d#3 f#3 c3 d3, g2 a2@3]/6",
  G: "[c3@8 a#2@8 a2@8 a3@8 g3@16 e3@16 d#3@8 f#3@8 c3@8 d3@9 ~@15, g2@48 a2@145 ~@31]/7",
})).s("gm_cello").gain(0.17).pan(0.4)

// chords · pad warm · "WARM PAD"
const pad_warm = note("<~@43 A@6 B@7 C@8 ~@49>".pickRestart({
  A: "[~@30 d4@52 c5@24 a#4@6 a4@17 c5@11 b4@11 [f#4,a4]@36 [d4,g4,b4]@5, ~@13 d5@28 ~@15 f4@14 ~@26, ~@28 g4@54 [e4,g4]@30 c4@75 ~@5]/6", // F#m G Em
  B: "[~@7 [d#4,g4,a#4]@38 [d4,g4,b4]@45 ~@3 d4@21 c5@24 a#4@5 ~ a4@17 c5@11 b4@11 [f#4,a4]@35 [d4,g4,b4]@6, ~@90 d5@25 ~@28 f4@28 ~@53, ~@91 g4@23 [e4,g4]@30 c4@75 ~@5]/7", // D# G F#m G Em
  C: "[~@6 [d4,g4,b4]@39 ~@3 d4@21 c5@24 a#4@5 ~ a4@17 c5@11 b4@11 [f#4,a4]@35 [d4,g4,b4]@52 ~@31, ~@45 d5@25 ~@28 f4@28 ~@130, ~@46 g4@23 [e4,g4]@30 c4@75 ~@82]/8", // G F#m G Em
})).s("gm_pad_warm").gain(0.23).pan(0.9)

// bass · synth bass 2 · "SYNTH BASS"
const bass = note("<~@45 A B C D E@2 F G H I J K@6 L ~@50>".pickRestart({
  A: "~@5 d3 d3@3 d3@3 g2@3 g2@3 c3@11 g2 g2@2", B: "~ e2@3 e2@3 c2@3 c2@10 f2@2 f2@3 f2@2 g2@3 g2@2",
  C: "~ a2@17 ~@14", D: "~@2 f#2 f#2@3 f#2@3 g2@3 g2@3 a2@3 a2@3 d2@11",
  E: "[~@7 d#2@2 d#2@3 g2@2 g2@2 a#2@3 a#2@2 d#3@3 a#2@2 g2@2 ~ g2@2 d#2@10 ~@14 g2@2 g2@2 g2@3 d2@2]/2",
  F: "~ d2@3 g1@23 ~@5", G: "~@4 d3@2 d3@3 d3@3 g2@3 g2@3 c3@10 g2@2 g2@2",
  H: "~ e2@3 e2@3 c2@3 c2@10 f2 f2@3 f2@3 g2@3 g2@2", I: "a2@17 ~@15",
  J: "~ f#2@2 f#2@3 f#2@3 g2@3 g2@3 a2@3 a2@2 d2@12",
  K: "[~@15 b2 b2@2 b2@3 g2@2 g2@3 d2@15 ~@14 d3@2 d3@3 d3@3 g2@3 g2@3 c3@10 g2@2 g2@3 e2@3 e2@3 c2@3 c2@10 f2 f2@3 f2@3 g2@3 g2@2 a2@17 ~@16 f#2@2 f#2@3 f#2@3 g2@3 g2@3 a2@3 a2@2 d2@13 ~@12]/6",
  L: "~@2 b2 b2@2 b2@3 g2@2 g2@3 d2@10 ~@9",
})).s("gm_synth_bass_2").gain(0.24).pan(0.1)

stack(string_ensemble_1, string_ensemble_1_soft, string_ensemble_2, cello, pad_warm, bass)

More by Jean Michel Jarre