Strudelify
Souvenir de Chine cover art

Souvenir de Chine

Souvenir de Chine

Jean Michel Jarre

KeyC minorTempo105 bpm
0:00/0:00
// Souvenir de Chine — 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 16-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, A@4 for four bars: edit a riff to change every repeat.

// chords · synth strings 2
const synth_strings_2 = note(`<
  ~@7 A@3 B C@3 D E@2 F G H@2 F I J@2 K L M@3 N O@2 P Q R@2 S@2 T@2 U V W@2 X Y Z@2 V ~@47
>`.pickRestart({
  A: "[c4,eb4,g4]/3", B: "[ab3,c4,f4]", C: "[[ab3,d4,f4]@2 [b3,d4,f4,ab4]]/3", D: "[b3,d4,f4,g4]", E: "[g3,c4,eb4]/2",
  F: "[g3,bb3,d4]", G: "[f3,bb3,d4]", H: "[ab3,bb3,d4]/2", I: "[g3,c4], bb3 ~@15", J: "[d3,a3,c4]/2", K: "[d3,f3,c4]",
  L: "[d3,f3,g3,b3]", M: "[eb4,g4,c5,eb5,g5]/3", N: "[c4,eb4,ab4,c5,f5]", O: "[d4,f4,ab4,c5,d5,f5]/2",
  P: "[d4,f4,ab4,d5,f5,ab5]", Q: "[d4,f4,g4,d5,g5]@3 [f4,f5]", R: "[c4,eb4,g4,c5,eb5]/2", S: "[bb3,d4,g4,bb4,d5]/2",
  T: "[d5 d5, [bb3,f4,ab4,bb4]]/2", U: "[bb3,d4,g4,bb4,d5]", V: "[g3,c4,eb4,g4,c5]", W: "[[a3,c4,a4,c5], d4 ~]/2",
  X: "[c4,d4,f4,c5]", Y: "[g3,d4,f4,g4,b4]", Z: "[c5@16 c5@15 ~, [g3,c4,eb4,g4]]/2",
})).s("gm_synth_strings_2").gain(0.15)

// bass · fretless bass
const bass = note(`<
  ~@7 A B C@2 B@2 D@2 A@2 B@2 C@2 E@2 F@2 C G A B C@2 B@2 H D A@2 B@2 C@2 E I J@2 C D A@5 B C@2 B@2 D@2 K L B C@3 E M
  N@2 C D A B C@2 B@2 D@2 A B@2 C@3 E O P F C D A Q@3 R@2
>`.pickRestart({
  A: "[c2,c3]", B: "[bb1,bb2]", C: "[ab1,ab2]", D: "[g1,g2]", E: "[eb2,eb3]", F: "gb2", G: "g1@3 g1, g2", H: "[b1,b2]",
  I: "~@4 gb2@2 g2@3 ~ bb2@2 eb3@4, eb3@9 ~@7, eb2@3 ~@5", J: "[gb1 gb1, gb2]/2", K: "[c2,c3], c1 ~@15",
  L: "[bb1,bb2], bb0 ~@15", M: "g2@4 f2@2 eb2 ~ g2@2 bb2 ~ eb3@4, eb2 ~@15", N: "[gb2 gb2, gb1]/2",
  O: "[eb2,eb3]@6 g2@3 ~ bb2 ~ eb3@4", P: "gb2, d3 ~", Q: "[c3@31 ~ c3@16, c2]/3", R: "[c2,c3]/2",
})).s("gm_fretless_bass").gain(0.41)

// chords · string ensemble 2 · "Slow Strings"
const string_ensemble_2 = note(`<
  ~@51 A@2 B C D@3 E F@2 G H I@2 G J K@2 L M A@2 B C D@3 E F@2 G H N@2 G O K@2 L M ~ P Q@4
>`.pickRestart({
  A: "[c4,eb4,g4]/2", B: "[c4,eb4,g4]", C: "[ab3,c4,f4]", D: "[[ab3,d4,f4]@2 [b3,d4,f4,ab4]]/3", E: "[b3,d4,f4,g4]",
  F: "[g3,c4,eb4]/2", G: "[g3,bb3,d4]", H: "[f3,bb3,d4]", I: "[ab3,bb3,d4]/2", J: "[g3,c4], bb3 ~@15",
  K: "[d3,a3,c4]/2", L: "[d3,f3,c4]", M: "[d3,f3,g3,b3]", N: "[bb3@16 bb3@15 ~, [ab3,d4]]/2", O: "[eb3,g3,c4]", P: "c3",
  Q: "[c3@29 ~@3]/4",
})).s("gm_string_ensemble_2").gain(0.26)

// chords · string ensemble 2 · "Slow Strings" · soft notes
const string_ensemble_2_soft = note("<~@91 A@2 B@4>".pickRestart({
  A: "[g3,c4,eb4,g4]/2", B: "[[g3,c4,eb4,g4,c5]@29 ~@3]/4",
})).s("gm_string_ensemble_2").gain(0.15)

// chords · pad bowed · "Bowed Pad"
const pad_bowed = note("<~@71 A@3 B@3 C@2 D@2 E@2 F@6 G@8>".pickRestart({
  A: "[c4,eb4,g4]/3", B: "[c4 d4@2, [ab3,f4]]/3", C: "[ab4 g4, [b3,d4,f4]]/2", D: "[g3,c4,eb4]/2",
  E: "[g3 f3, [bb3,d4]]/2", F: "[bb3 ~@2 eb3 [d3,a3]@2, d4 c4, ab3 g3 ~, ~ bb3@2 ~@3]/6",
  G: "[c4@8 b3@8 ~@16 [g3,c5]@29 ~@3, [d3,f3]@16 [eb4,g4]@45 ~@3, ~@16 g3@32 c3@73 ~@7, ~ c4@2 ~]/8", // C5 Dm Eb
})).s("gm_pad_bowed").gain(0.31)

// drums · kick
const kick = s("bd").struct(`<
  ~ A B A C A C 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 D A B D 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 A B A B A B A B A B A B A B A D A B D B A B A B A B A B C B
>`.pickRestart({
  A: "x ~@4 x ~@2", B: "x", C: "x ~@6 x", D: "x ~@4 x ~ x",
})).gain(0.41)

// 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)

// 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)

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

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

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

// 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)

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@96 [~@7 x!5 ~@4]>").gain(0.15)

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

// 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: "~@10 x!3 ~@3", C: "~@15 x",
})).gain(0.31)

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

// drums · ride
const ride = s("rd").struct("<~@4 A ~ B ~@35 C D ~@6 B ~@35 C D ~@8 D>".pickRestart({
  A: "~ x", B: "~@8 x!5 ~@3", C: "~@12 x!4", D: "x",
})).gain(0.31)

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

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

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

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

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

stack(
  synth_strings_2, bass, string_ensemble_2, string_ensemble_2_soft, pad_bowed, kick, kick_soft, rim, 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