Strudelify
Orient Express cover art

1982 · Orient Express

Orient Express

Jean Michel Jarre

KeyF majorTempo130 bpm
0:00/0:00
// Orient Express — Jean Michel Jarre
// 130 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 133 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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 · synth bass 1
const bass = note(`<
  A B@2 C B@3 C B@3 D E@4 B@3 D B C B D E@4 F@2 G@2 B@2 H@4 B@4 E@4 F@2 G@2 B@2 H I H@2 ~@7 J B@8 E@4 B@4 E@4 F@2 G@2
  B@2 H@4 K L M N O@4 F@2 G@2 B@2 H@4 L P L P O Q O Q F@2 G@2 B@2 H@4 R S ~
>`.pickRestart({
  A: "~@7 f2", B: "f1 f2 f1 f2 f1 f2 f1 f2", C: "f1 f2 f1 f2 [eb1,eb2] [d1,d2] [c1,c2] [a0,a1]",
  D: "f1 f2 f1 f2 [f1,f2]!2 [db1,db2]!2", E: "d1 d2 d1 d2 d1 d2 d1 d2", F: "a1 a2 a1 a2 a1 a2 a1 a2",
  G: "g1 g2 g1 g2 g1 g2 g1 g2", H: "c1 c2 c1 c2 c1 c2 c1 c2", I: "c1@2 c1 c2 c1 c2 c1 c2",
  J: "[a1,a2]@3 [g1,g2]@6 [f1,f2]@3 [eb1,eb2]@3 ~ [c1,c2]@2 ~ [a0,a1] ~ [g0,g1]@3, ~@15 [d1,d2]@2 ~ [bb0,bb1]@2 ~@4", // A G F Eb C A G D …
  K: "f1!6 ~@2", L: "f1!4 f1@2 ~@2", M: "f1!4 f1@2 ~ a0", N: "f1!5 ~@3", O: "d1!4 d1@2 ~@2", P: "f1!3 f1@3 ~@2",
  Q: "d1!3 d1@3 ~@2", R: "[c1,c2]!8", S: "[c1,c2]@4 [c1,c2]@4 [c1,c2]@5 [c1,c2]@4 ~ [c1,c2]@6",
})).s("gm_synth_bass_1").gain(0.42)

// chords · pad poly
const pad_poly = note(`<
  ~@4 A@2 B@2 C@2 D@2 E F G H I@2 J@2 K@2 L@2 E M N M O P Q R S@2 T U V W C@2 X Y Z M G M O P AA R AB AC AD U AE U ~@8
  K@2 B@2 C@2 AF@2 E F G F C@2 D@2 E M G M O P AG R AH AI AD U AJ U C@2 AF@2 AK M AL M O P AM R AN AO AP U AQ U AR@2
  AS@2 AT M AL AU O P AV R AN AW AX U AE U AY@2 ~
>`.pickRestart({
  A: "[[f4,a4,c5]@2 [f4,a4,c5]@2 [e4,g4,c5]@2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 [d4,f4,bb4]@2 [f4,a4,c5]!2 f4]/2", // F C Bb F
  B: "[~ [f4,a4,c5]@2 [f4,a4,c5] [e4,g4,c5]!2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5]@2 f4]/2", // F C Bb F
  C: "[~@2 [f4,a4,c5]@2 [e4,g4,c5]@2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5]@2 f4]/2", // F C Bb F
  D: "[~ [f4,a4,c5]@2 [f4,a4,c5] [e4,g4,c5]!2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5]@2 ~]/2", // F C Bb F
  E: "[d4,f4,a4]@2 [d4,f4,a4]@2 ~ [d4,g4,b4]@2 d4", F: "[d4,a4,c5] [d4,a4,c5]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 d4",
  G: "~ [d4,f4,a4]@2 d4 [d4,g4,b4] [d4,g4,b4]@2 d4", H: "[d4,a4,c5] [d4,a4,c5]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 [d4,g4,b4]",
  I: "[~ [f4,a4,c5]@2 [f4,a4,c5] [e4,g4,c5]@2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5]@2 f4]/2", // F C Bb F
  J: "[~@2 [f4,a4,c5]@2 [e4,g4,c5]@2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4 [f4,a4,c5]@2 ~@2]/2", // F C Bb F
  K: "[[f4,a4,c5]@2 [f4,a4,c5]@2 [e4,g4,c5]@2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5]@2 f4]/2", // F C Bb F
  L: "[~ [f4,a4,c5]@2 [f4,a4,c5] [e4,g4,c5]@2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5]@2 ~]/2", // F C Bb F
  M: "[d4,a4,c5] [d4,a4,c5]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 ~", // D7 G
  N: "~@3 [d4,f4,a4]@6 d4@3 [d4,g4,b4]@3 [g4,b4]@4 ~@2 d4@3, ~@5 d4@2 ~", // Dm G
  O: "[e4,a4,c5]@2 [e4,a4,c5]@2 ~ [f4,a4,d5]@2 [f4,a4,d5]", P: "[e4,a4,c5] [e4,a4,c5]@2 [f4,a4,d5]@2 [f4,a4,d5]@2 ~",
  Q: "~ [e4,g4,c5]@2 [e4,g4,c5] [d4,g4,b4]@2 ~@2", R: "[e4,g4,c5] [e4,g4,c5]@2 [d4,g4,b4]@2 [d4,g4,b4]@2 ~",
  S: "[~ [c4,g4,b4]@2 [c4,g4,b4] [c4,f4,a4] [c4,f4,a4]@2 ~ [g4,b4] [c4,g4,b4]@2 [c4,f4,a4]@2 [c4,f4,a4]@2 ~, ~@7 c4@2 ~@7]/2", // Cmaj7 F G Cmaj7 F
  T: "[c4,e4,g4]@3 [c4,e4,g4]@3 ~@6 [c4,f4,a4]@6 ~@5 gb4", U: "[c4,g4,bb4] [c4,g4,bb4]@2 [c4,f4,a4]@2 [c4,f4,a4]@2 ~",
  V: "~ [c4,e4,g4]!2 c4 [c4,f4,a4] [c4,f4,a4]@2 c4", W: "[c4,g4,bb4] [c4,g4,bb4]@2 [c4,f4,a4]@2 [c4,f4,a4]@2 c4",
  X: "~ [f4,a4,c5]@2 [f4,a4,c5] [e4,g4,c5]@2 ~@2", Y: "[f4,bb4,d5] [f4,bb4,d5]@2 [f4,a4,c5]@2 [f4,a4,c5]@2 ~",
  Z: "~@2 [d4,f4,a4]@2 [d4,g4,b4]@2 ~ d4", AA: "~ [e4,g4,c5]@2 ~ [d4,g4,b4]!2 ~@2",
  AB: "~ [c4,g4,b4]@2 [c4,g4,b4] [c4,f4,a4] [c4,f4,a4]@2 c4", AC: "[c4,g4,b4] [c4,g4,b4]@2 [c4,f4,a4]@2 [c4,f4,a4]@2 ~",
  AD: "[c4,e4,g4]@6 ~@6 [c4,f4,a4]@6 ~@5 gb4", // C F
  AE: "~@2 eb4 [c4,e4,g4]@3 [c4,e4,g4]@3 c4@3 [c4,f4,a4]@3 [c4,f4,a4]@6 c4@2 gb4", // C F
  AF: "[~@2 [f4,a4,c5]@2 [e4,g4,c5]@2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5]@2 ~]/2", // F C Bb F
  AG: "~ [e4,g4,c5]@2 [e4,g4,c5] [d4,g4,b4]!2 ~ d4", AH: "~ [c4,g4,b4] [c4,g4,b4]@2 [c4,f4,a4] [c4,f4,a4]@2 ~",
  AI: "[c4,g4,b4]@3 [c4,g4,b4]@6 [c4,f4,a4]@6 [c4,f4,a4]@6 ~@2 eb4", // Cmaj7 F
  AJ: "~@3 [c4,e4,g4]@3 [c4,e4,g4]@3 c4@3 [c4,f4,a4]@3 [c4,f4,a4]@6 c4@2 gb4", AK: "~@2 [d4,f4,a4]@2 [d4,g4,b4]!2 ~ d4",
  AL: "~ [d4,f4,a4]!2 d4 [d4,g4,b4] [d4,g4,b4]@2 d4", AM: "~ [e4,g4,c5]!2 ~ [d4,g4,b4]!2 ~ g4",
  AN: "~ [c4,g4,b4]@2 [c4,g4,b4] [c4,f4,a4] [c4,f4,a4]@2 ~", // Cmaj7 F
  AO: "[c4,g4,b4]@3 [c4,g4,b4]@6 [c4,f4,a4]@6 [c4,f4,a4]@6 c4@2 eb4", // Cmaj7 F
  AP: "[c4,e4,g4]@3 c4@3 ~@3 c4@3 [c4,f4,a4]@3 c4@3 ~@3 c4@2 gb4", // C F
  AQ: "~@2 eb4 [c4,e4,g4]@3 [c4,e4,g4]@3 [c4,e4,g4]@3 [c4,f4,a4]@3 [c4,f4,a4]@6 c4@2 gb4", // C F
  AR: "[~@2 [f4,a4,c5]@2 [e4,g4,c5]@2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5] [f4,a4,c5]@2]/2", // F C Bb F
  AS: "[~ [f4,a4,c5]!3 [e4,g4,c5]!2 ~ [f4,bb4,d5]@2 [f4,bb4,d5]@2 f4@2 [f4,a4,c5] [f4,a4,c5]@2]/2", // F C Bb F
  AT: "~@2 [d4,f4,a4]@2 ~ [d4,g4,b4]@2 d4", AU: "[d4,a4,c5] [d4,a4,c5]@2 [d4,g4]@2 [d4,g4]@2 ~",
  AV: "~ [e4,g4,c5] [e4,g4,c5]@2 [d4,g4,b4]!2 ~ d4", AW: "[c4,g4,b4]@3 [c4,g4,b4]@6 [c4,f4,a4]@6 [c4,f4,a4]@6 ~@2 gb4",
  AX: "[c4,e4,g4]@3 c4@3 ~@6 [c4,f4,a4]@3 c4@3 ~@5 gb4", AY: "[[c4,e4,g4]@7 ~]/2",
})).s("gm_pad_poly").gain(0.52)

// other · pad poly
const pad_poly_2 = note(`<
  ~@20 A@4 B@4 C@2 D@2 E@2 F@4 G@4 H@7 I@2 J@5 ~@20 G@4 K@2 L@8 M@3 N@8 O@2 P@5 Q R S@7 T@7 U@2 V@4 ~@3
>`.pickRestart({
  A: "[f3@31 c4]/4", B: "[d4@31 b3]/4", C: "[a3@15 b3]/2", D: "[c4@9 b3@3 g3@33 ~ b3@2, ~@45 a3@2 ~]/2",
  E: "[c4@3 b3 a3@10 g3@2]/2", F: "g3/4", G: "[f3@31 e3]/4", H: "[d3@13 a3 c4 d4@14 c4 b3 a3@14 a3 b3 c4@4 b3 g3@4]/7",
  I: "[g4@36 ~ g4 ~ a4@3 f4@3 e4@3, ~@18 f4 ~@5]/2", J: "[c4@45 c5@73 ~@2]/5", K: "d3/2",
  L: "[d4@13 c4 b3 a3@14 a3 b3 c4@3 b3 g3@10 g3 b3 c4@3 b3 a3@13]/8", M: "[g3@7 g4@5]/3",
  N: "[~@15 f4@3 e4@3 c4@92 ~ c4@3 d4@42 c4@3 b3@3 d4@27]/8", O: "[~@5 c4 b3 a3@9]/2",
  P: "[a4@5 a3 b3 c4@3 b3 g3@4 g4@6 g4 b4 c5@3 b4 ~@5 a5@8, ~@27 a4@13]/5", Q: "g3", R: "g5@6 f5 e5, g4",
  S: "[c4@12 g3 bb3 a3 f3@11 f4@20 c4 d4@9, c5 ~@6]/7", T: "[d5@6 c5 d5@14 c5 b4 a4@14 d5 b4 c5@3 b4 g4@11 b4 c5]/7",
  U: "[~@6 b4@3 a4@38 ~]/2", V: "[~ e3, g3]/4",
})).s("gm_pad_poly").gain(0.57)

// other · pad halo
const pad_halo = note("<~@56 A@7 ~@70>".pickRestart({
  A: "[c4@25 ~@3]/7",
})).s("gm_pad_halo").gain(0.57)

// other · pad sweep
const pad_sweep = note("<~@56 A@7 ~@70>".pickRestart({
  A: "[f1@25 ~@3]/7",
})).s("gm_pad_sweep").gain(0.5)

// chords · pad poly
const pad_poly_3 = note("<~@54 A@2 ~@37 A@2 ~@38>".pickRestart({
  A: "[g6@4 ~ bb6@4 ~@15 c8@10 ~@14, ~@5 f7@12 ~@7, ~@3 a6@4 ~@5]/2",
})).s("gm_pad_poly").gain(0.64).pan(0)

// drums · kick
const kick = s("bd").struct("<~ A@5 B A@5 C A@43 ~@8 A@3 D A@26 E A@35 F G ~>".pickRestart({
  A: "x!2", B: "~ x", C: "x ~@3 x!3 ~", D: "x ~ x!2", E: "x!6 ~@2", F: "x!8", G: "x ~@3 x ~@3 x ~@4 x ~@4 x ~@5",
})).gain(0.24)

// drums · snare
const snare = s("sd").struct(`<
  A B@4 C B@30 D B@3 E B@14 F ~@8 B@3 C B@7 G B@3 C B@4 G B G B@6 H ~ B@7 G B@8 I B@7 G B@7 J B@2 ~@3
>`.pickRestart({
  A: "~@7 x", B: "~ x ~ x", C: "~ x ~@2", D: "~@6 x ~@8 x!2 ~ x ~@5", E: "~@2 x ~@2 x!2 ~", F: "~@2 x ~@2 x!3",
  G: "~@2 x ~@3 x!2", H: "~@6 x ~@5 x!2 ~ x ~@2 x ~@2 x ~@2", I: "~@2 x!2 ~@2 x ~", J: "~@6 x ~@11 x ~@2 x!2 ~",
})).gain(0.28)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@6 A ~@9 A ~@2 B A C ~ D A C ~ D A C ~@5 E B F A G H A ~ I ~@3 J ~@8 K L K M K N K M ~ B A ~@2 O A ~ A ~@6 C ~ C ~@12
  C ~@2 C ~ P Q P ~@7 C ~ R A C ~ S T ~@4 C ~@7 B ~@3
>`.pickRestart({
  A: "x", B: "~@11 x", C: "~@6 x!2", D: "~@18 x!2 ~ x!2 ~", E: "~@5 x!3", F: "x ~@20 x!2 ~", G: "~@3 x",
  H: "~@21 x!2 ~", I: "~@5 x ~ x", J: "~@2 x!2 ~@4", K: "x ~@2 x ~@2 x ~", L: "~ x ~@2 x!3 ~", M: "~@3 x ~@11 x!4 ~@5",
  N: "~ x ~@3 x!2 ~", O: "~@19 x!5", P: "~@7 x", Q: "x ~@6 x", R: "~@19 x ~ x!2 ~", S: "~@18 x ~@2 x!2 ~",
  T: "x ~@5 x!2",
})).gain(0.28)

// drums · hihat
const hihat = s("hh").struct("<~ A B@10 C B@8 C B@34 ~@8 B@3 D B@62 ~@3>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!7 ~", D: "x!5 ~@3",
})).gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@5 A ~@9 A ~@3 B ~@3 C ~ D ~ E ~ F ~@6 D F ~ G H ~@2 I ~ J K L ~@8 K M K N K O K N ~ P ~@3 Q ~ R ~@7 S ~ E ~@4 G ~@7
  S ~@4 G K S ~@9 T ~@3 A U ~@4 V ~@7 W ~@3
>`.pickRestart({
  A: "~@21 x!2 ~", B: "~@19 x ~ x ~@2", C: "~@12 x!2 ~ x!2 ~@7", D: "~@7 x", E: "~@9 x!2 ~ x!2 ~ x!2 ~@7",
  F: "~@5 x!2 ~", G: "~@6 x!2", H: "~@18 x!2 ~@4", I: "~@5 x!3", J: "~@18 x!2 ~ x!2 ~", K: "x", L: "~@2 x!2 ~@4",
  M: "~ x ~@2", N: "~@9 x ~@2 x ~@2 x!3 ~@6", O: "~@2 x ~ x!2 ~@2", P: "~@16 x!3 ~@2 x ~@2", Q: "~@14 x!5 ~@5",
  R: "~@15 x!2 ~ x!2 ~ x!2 ~", S: "~@3 x", T: "~@12 x!2 ~ x!2 ~ x ~@5", U: "x ~@2 x", V: "~@5 x ~@2",
  W: "~@16 x ~ x!2 ~ x ~@2",
})).gain(0.28)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@65 [~@12 x!4 ~@8] ~@3 [~@12 x!2 ~@10] ~@30 [~@7 x] ~@32>").gain(0.16)

// drums · open hat
const open_hat = s("oh").struct("<[~@7 x] ~@11 [~@7 x] ~@8 [~@7 x] ~@111>").gain(0.32)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@5 A ~@5 B C ~@2 D ~@3 E ~@3 F ~@2 G H ~@7 I ~@9 J ~@13 K ~@3 K ~@7 L ~@37 M ~@5 I N ~@12 O ~@3
>`.pickRestart({
  A: "~@5 x!2 ~", B: "~@13 x!6 ~ x!4", C: "x", D: "~@15 x!5 ~@4", E: "~@12 x!4 ~@2 x ~@5", F: "~@6 x!2 ~ x!2 ~@13",
  G: "~@21 x!3", H: "x!2 ~ x!2 ~ x!2 ~@16", I: "~@3 x", J: "x!11 ~ x!2 ~ x!2 ~@7", K: "~@3 x ~@4",
  L: "x!8 ~ x!2 ~ x!2 ~@10", M: "~@6 x!2", N: "~@7 x", O: "~@6 x!8 ~ x ~@8",
})).gain(0.28)

// drums · high tom · soft notes
const high_tom_soft = s("ht").struct("<~@11 [~@12 x ~@6 x ~@4] ~@14 [~@18 x!3 ~@3] ~@106>").gain(0.16)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@10 A ~@3 A ~@3 A ~@3 A ~@3 A ~@8 A@2 ~@2 A ~@4 A ~@3 A ~@4 B ~@8 A ~@2 C A ~@3 A ~@3 A ~@8 A ~ A@2 ~@14 A ~@2 A
  ~@5 A ~@7 A ~ D ~@5 A ~ A E ~
>`.pickRestart({
  A: "x", B: "~@7 x", C: "~@5 x ~ x", D: "x ~@4 x ~ x", E: "~@3 x",
})).gain(0.4)

stack(
  bass, pad_poly, pad_poly_2, pad_halo, pad_sweep, pad_poly_3, kick, snare, low_tom, hihat, mid_tom, mid_tom_soft,
  open_hat, high_tom, high_tom_soft, crash
)

More by Jean Michel Jarre