Strudelify
Souvenir of China cover art

Souvenir de Chine

Souvenir of China

Jean Michel Jarre

KeyC minorTempo105 bpm
0:00/0:00
// Souvenir of China — Jean Michel Jarre
// 105 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 97 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/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 2 · "SYN STR 2"
const synth_strings_2 = note("<~@7 A@7 B@8 C@3 D E@8 F@6 G@7 H@3 ~@47>".pickRestart({
  A: "[[c4,eb4,g4]@95 [ab3,c4,f4]@32 [ab3,d4,f4]@64 [b3,d4,f4,ab4]@32 ~]/7", // Cm Fm Ddim Bdim
  B: "[[b3,d4,f4,g4]@31 [g3,c4,eb4]@64 [g3,bb3,d4]@32 [f3,bb3,d4]@32 [ab3,bb3,d4]@64 [g3,bb3,d4]@32 [g3,bb3,c4]]/8", // G7 Cm Gm Bb Bb7 Gm C7
  C: "[~@31 [d3,a3,c4]@64 [d3,f3,c4]]/3", D: "~@31 [d3,f3,g3,b3]",
  E: "[~@31 [eb4,g4,c5,eb5,g5]@96 [c4,eb4,ab4,c5,f5]@32 [d4,f4,ab4,c5,d5,f5]@64 [d4,f4,ab4,d5,f5,ab5]@32 [d4,f4,g4,d5,g5]]/8", // Cm Fm7 Dm7b5 Ddim G7
  F: "[~@24 [f4,f5]@7 [c4,eb4,g4,c5,eb5]@64 [bb3,d4,g4,bb4,d5]@64 [bb3,f4,ab4,bb4,d5]@33]/6", // F Cm Gm Bb7
  G: "[d5@31 [bb3,d4,g4,bb4,d5]@32 [g3,c4,eb4,g4,c5]@32 [a3,c4,a4,c5]@64 [c4,d4,f4,c5]@32 [g3,d4,f4,g4,b4]@32 ~, ~@95 d4@32 ~@97]/7", // Gm Cm Am Dm7 G7
  H: "[c5@31 ~ c5@31 [g3,c4,eb4,g4,c5]@32 ~, [g3,c4,eb4,g4]@21 ~@11]/3", // Cm
})).s("gm_synth_strings_2").gain(0.15)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@6 A@2 B@5 C@5 D@5 E@8 F@2 G H@8 I@4 J K L K L K B@5 M@3 N@6 O@5 K B@5 P@8 ~ Q R@4 K S@5
>`.pickRestart({
  A: "[~@31 [c2,c3]@32 ~]/2", B: "[[bb1,bb2]@31 [ab1,ab2]@32 [ab1,ab2]@32 [bb1,bb2]@32 [bb1,bb2]@32 [g1,g2]]/5",
  C: "[~@31 [g1,g2]@32 [c2,c3]@32 [c2,c3]@32 [bb1,bb2]@32 [bb1,bb2]]/5", // G C Bb
  D: "[~@31 [ab1,ab2]@32 [ab1,ab2]@32 [eb2,eb3]@32 [eb2,eb3]@32 gb2]/5", // Ab Eb
  E: "[~@31 gb2@32 [ab1,ab2]@31 ~ g1@24 ~ g1@7 [c2,c3]@32 [bb1,bb2]@32 [ab1,ab2]@32 ~ ab1@32, ~@95 g2@32 ~@96 ab2@32 ~]/8", // Ab C Bb Ab
  F: "[[bb1,bb2]@31 [bb1,bb2]@32 ~]/2", G: "[b1,b2]",
  H: "[[g1,g2]@31 ~ c2@31 [c2,c3]@32 [bb1,bb2]@32 [bb1,bb2]@32 [ab1,ab2]@32 ~ ab2@31 [eb2,eb3]@31 ~ [eb2,eb3], ~@31 c3@32 ~@128 ab1@32 ~@33]/8", // G C Bb Ab Eb
  I: "[~@8 gb2@4 g2@5 ~@3 bb2@3 ~ eb3@7 gb1@32 ~ gb1@31 [ab1,ab2]@32 ~, ~@31 gb2@64 ~@33]/4", J: "[g1,g2]",
  K: "[c2,c3]", L: "[c2,c3]@31 ~", M: "[~@31 [g1,g2]@32 [c2,c3]@32 [bb0,bb1,bb2], ~@63 c1 ~@32]/3",
  N: "[~@31 [bb1,bb2]@32 [ab1,ab2]@32 [ab1,ab2]@32 [ab1,ab2]@32 [eb2,eb3]@32 [eb2,g2]]/6", // Bb Ab Eb
  O: "[~@8 f2@3 eb2@3 ~@2 g2@3 bb2@3 ~ eb3@8 gb2@31 ~ gb2@32 [ab1,ab2]@32 [g1,g2]@32 ~, ~@31 gb1@64 ~@65]/5", // Ab G
  P: "[~@31 [g1,g2]@32 [c2,c3]@32 [bb1,bb2]@32 [bb1,bb2]@32 [ab1,ab2]@32 [ab1,ab2]@32 [ab1,ab2]@32 [eb2,eb3]]/8", // G C Bb Ab Eb
  Q: "[eb2,eb3]@12 g2@5 ~@3 bb2@3 ~ eb3@7 ~", R: "[gb2@31 gb2@32 [ab1,ab2]@30 ~@2 [g1,g2]@32 ~, d3@15 ~@113]/4",
  S: "[c3@63 c3@31 ~ [c2,c3]@64 ~, c2@19 ~@13]/5", // C
})).s("gm_fretless_bass").gain(0.41)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@50 A@8 B@8 C@5 D@7 E@6 F@7 ~ G@5>".pickRestart({
  A: "[~@31 [c4,eb4,g4]@64 [c4,eb4,g4]@32 [ab3,c4,f4]@32 [ab3,d4,f4]@64 [b3,d4,f4,ab4]@33]/8", // Cm Fm Ddim Bdim
  B: "[[b3,d4,f4,g4]@31 [g3,c4,eb4]@64 [g3,bb3,d4]@32 [f3,bb3,d4]@32 [ab3,bb3,d4]@64 [g3,bb3,d4]@32 [g3,bb3,c4]]/8", // G7 Cm Gm Bb Bb7 Gm C7
  C: "[~@31 [d3,a3,c4]@64 [d3,f3,c4]@32 [d3,f3,g3,b3]@31 ~@2]/5", // D7 Dm7 G7
  D: "[[c4,eb4,g4]@63 [c4,eb4,g4]@32 [ab3,c4,f4]@32 [ab3,d4,f4]@64 [b3,d4,f4,ab4]@33]/7", // Cm Fm Ddim Bdim
  E: "[[b3,d4,f4,g4]@31 [g3,c4,eb4]@64 [g3,bb3,d4]@32 [f3,bb3,d4]@32 [ab3,bb3,d4]@33]/6", // G7 Cm Gm Bb Bb7
  F: "[bb3@31 [g3,bb3,d4]@32 ~ eb3@31 [d3,a3,c4]@64 [d3,f3,c4]@32 [d3,f3,g3,b3]@32 ~, ~@63 [g3,c4]@32 ~@129]/7", // Gm D7 Dm7 G7 C5
  G: "[c3@31 c3@116 ~@13]/5",
})).s("gm_string_ensemble_2").gain(0.26)

// chords · string ensemble 2 · "SLOWSTRING" · soft notes
const string_ensemble_2_soft = note("<~@90 A@7>".pickRestart({
  A: "[~@31 [g3,c4,eb4,g4]@63 ~ [g3,c4,eb4,g4,c5]@116 ~@13]/7", // Cm
})).s("gm_string_ensemble_2").gain(0.15)

// chords · pad bowed · "BOWEDGLASS"
const pad_bowed = note("<~@71 A@5 B@4 C@8 D@8 ~>".pickRestart({
  A: "[[c4,eb4,g4]@95 c4@32 d4@33, ~@19 [ab3,f4]@13]/5", // Cm Db
  B: "[~@31 ab4@32 ~ g4@31 [g3,c4,eb4]@33, ~@31 [b3,d4,f4]@65 ~@32]/4", // Cm Bdim
  C: "[~@31 g3@32 f3@32 bb3@32 ~@65 eb3@31 [d3,a3]@33, ~@31 [bb3,d4]@64 d4@96 c4@65, ~@95 ab3@64 g3@64 ~@33, ~@128 bb3@63 ~@65]/8", // D5 Bb
  D: "[~@31 c4@32 b3@32 ~@64 [g3,c5]@97, ~@31 [d3,f3]@64 [eb4,g4]@161, ~@63 g3@64 ~ c3@128, ~@95 c4@128 ~@33]/8", // C5 Dm Eb
})).s("gm_pad_bowed").gain(0.31)

// drums · rim
const rim = s("rim").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~ x ~@2 x ~@3",
})).gain(0.51).pan(0)

// drums · rim · soft notes
const rim_soft = s("rim").struct(`<
  ~@2 A ~ B ~@5 B ~@5 A ~@5 B ~@7 A ~@5 B ~@5 A ~@5 B ~@5 B ~@5 A ~@9 B ~@9 A ~@3 B ~@7 A ~ B ~@2
>`.pickRestart({
  A: "~@2 x!2 ~@4", B: "~@2 x!2 ~@2 x ~@2 x ~@3 x ~@18",
})).gain(0.31).pan(0)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A C A D A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A E A B E B A B A B A B A D A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A E A B E B A B A B A B A B D B
>`.pickRestart({
  A: "x ~@4 x ~@2", B: "x", C: "x ~@26 x ~@4", D: "x ~@6 x", E: "x ~@4 x ~ x",
})).gain(0.41).pan(0)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@7 x",
})).gain(0.26).pan(0)

// drums · snare
const snare = s("sd").struct(`<
  A B C ~ D ~ E ~ F ~ F ~ G ~ F ~ F ~ H ~ F ~ H ~ I ~ J ~ G ~ G ~ F ~ J ~ F ~ F ~ F ~ F@3 ~ H ~ F ~ E ~ F ~ F ~ G ~ F ~
  F ~ H ~ F ~ H ~ I ~ J ~ G ~ K ~ F ~ J ~ F ~ F ~ F ~ F@3 ~ H ~ F ~ F L B
>`.pickRestart({
  A: "~@22 x!2 ~ x!2 ~ x!2 ~ x", B: "x", C: "~@15 x ~@16", D: "~@15 x ~@3 x!5 ~@8", E: "~@4 x!5 ~@7 x!9 ~@7", F: "~ x",
  G: "~@4 x ~@2 x", H: "~@16 x ~@3 x!5 ~@7", I: "~@2 x!2", J: "~@16 x ~@3 x!5 ~@3 x ~@3", K: "~@2 x ~ x ~@2 x",
  L: "~@8 x ~ x ~ x ~ x!2",
})).gain(0.31).pan(0)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<[x!3 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~@11] ~@96>").gain(0.05).pan(0)

// drums · clap
const clap = s("cp").struct(`<
  A ~ B ~ B ~@3 C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ D ~ C ~ E ~ C ~ E ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~@3 C ~ C ~ C ~ C ~ C
  ~ C ~ C ~ C ~ D ~ C ~ E ~ F ~ E ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C ~ C G ~
>`.pickRestart({
  A: "~@31 x", B: "~@15 x ~@16", C: "~ x", D: "~@2 x!2", E: "~@4 x ~@2 x", F: "~ x!2 ~", G: "~@3 x",
})).gain(0.26).pan(0)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@7 A B A B A B A B A B A B A B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A ~ A B A B A B A B A B A B A
  B A B A B A B A B A B A B A C A B A B A B A B A B A B A B A B C ~
>`.pickRestart({
  A: "x!8", B: "x!4 ~ x!2 ~", C: "x!4 ~@4",
})).gain(0.26).pan(0)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A B ~ C D E ~ F ~ F ~ G ~ H ~ F ~ F ~ F ~ F ~ H ~ F ~ F ~ F ~ F ~ F ~ F ~ I ~ F ~ I D F ~ F ~ F ~ E ~ F ~ F ~ G ~ H
  ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ J ~ F ~ F ~ F ~ F ~ F ~ I D H ~ F ~ F ~ F K L
>`.pickRestart({
  A: "x", B: "~@15 x ~@16", C: "~@15 x ~@11 x ~@4", D: "x!2", E: "~@7 x", F: "~@4 x ~@2 x", G: "~ x!3",
  H: "~@4 x ~ x!2", I: "~ x", J: "~@2 x ~ x ~@2 x", K: "~@4 x!4", L: "x!13 ~@19",
})).gain(0.51).pan(0)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@96 [~@13 x!9 ~@10]>").gain(0.15).pan(0)

// drums · mid tom
const mid_tom = s("mt").struct("<~@50 [~@3 x] ~@46>").gain(0.26).pan(0)

// drums · high tom
const high_tom = s("ht").struct("<~@6 A ~@27 B ~@11 B ~@15 B ~@15 B ~@11 B ~@4 C ~>".pickRestart({
  A: "~@3 x", B: "~@20 x!5 ~@7", C: "~@15 x",
})).gain(0.31).pan(0)

// drums · crash
const crash = s("cr").struct("<~@4 A ~@7 B ~@19 B ~@5 B ~@17 B ~@19 B ~@19 C>".pickRestart({
  A: "~@11 x ~@20", B: "~@7 x", C: "x",
})).gain(0.51).pan(0)

// drums · ride
const ride = s("rd").struct("<~@4 A ~ B ~@35 C ~@7 B ~@35 C ~@9 D>".pickRestart({
  A: "~@15 x ~@16", B: "~@16 x!8 ~@8", C: "~@23 x!9", D: "x",
})).gain(0.31).pan(0)

// drums · bongos
const bongos = s("bongo:4").struct("<~@95 [~ x] ~>").gain(1.35).pan(0)

// drums · congas
const congas = s("conga:13").struct("<~@95 [~@5 x ~@2] ~>").gain(1.64).pan(0)

// drums · congas
const congas_2 = s("conga:18").struct("<~@95 [~@6 x!2] ~>").gain(1.64).pan(0)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@96 [x!14 ~@18]>").gain(2.6).pan(0)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@96 [~@14 x!8 ~@10]>").gain(1.04).pan(0)

stack(
  synth_strings_2, bass, string_ensemble_2, string_ensemble_2_soft, pad_bowed, rim, rim_soft, kick, kick_soft, snare,
  snare_soft, clap, hihat, open_hat, open_hat_soft, mid_tom, high_tom, crash, ride, bongos, congas, congas_2, cabasa,
  cabasa_soft
)

More by Jean Michel Jarre