Strudelify

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 48-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
const synth_strings_2 = note("<~@7 A@7 B@8 C@2 D E F@8 G@6 H@7 I@3 ~@47>".pickRestart({
  A: "[[c4,eb4,g4]@143 [ab3,c4,f4]@48 [ab3,d4,f4]@96 [b3,d4,f4,ab4]@49]/7", // Cm Fm Ddim Bdim
  B: "[[b3,d4,f4,g4]@46 ~ [g3,eb4]@95 [g3,bb3,d4]@48 ~ f3@48 [ab3,bb3,d4]@95 ~ [bb3,d4]@48 [g3,bb3,c4], ~@23 c4@48 ~@24 [bb3,d4]@24 ~@48 g3@24 ~]/8", // G7 Cm Gm Bb7 Bb C7 Bb
  C: "[~@47 [d3,a3,c4]@49]/2", D: "~@47 [d3,f3,c4]", E: "~@47 [d3,f3,g3,b3]",
  F: "[~@47 [c5,eb5,g5]@144 [c4,eb4,ab4,c5,f5]@48 [d4,f4,ab4,c5,d5,f5]@96 [d4,f4,ab4,d5,f5,ab5]@48 [d4,f4,g4,d5,g5], ~@46 [eb4,g4]@145 ~@193]/8", // Cm Fm7 Dm7b5 Ddim G7 Eb
  G: "[~@36 [f4,f5]@11 [c4,eb4,g4,c5,eb5]@96 [bb3,d4,g4,bb4,d5]@96 [bb3,f4,ab4,bb4,d5]@49]/6", // F Cm Gm Bb7
  H: "[d5@47 [bb3,d4,g4,bb4,d5]@48 [g3,c4,eb4,g4,c5]@48 [a3,c4,a4,c5]@96 [c4,d4,f4,c5]@48 [g3,d4,f4,g4,b4]@49, ~@143 d4@49 ~@144]/7", // Gm Cm Am Dm7 G7
  I: "[c5@47 ~ c5@46 ~ [g3,c4,eb4,g4,c5]@49, [g3,c4,eb4,g4]@95 ~@49]/3", // Cm
})).s("gm_synth_strings_2").gain(0.15)

// bass · fretless bass
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: "[~@47 [c2,c3]@49]/2", B: "[[bb1,bb2]@47 [ab1,ab2]@48 [ab1,ab2]@48 [bb1,bb2]@48 [bb1,bb2]@48 [g1,g2]]/5",
  C: "[~@47 [g1,g2]@48 [c2,c3]@48 [c2,c3]@48 [bb1,bb2]@48 [bb1,bb2]]/5", // G C Bb
  D: "[~@47 [ab1,ab2]@48 [ab1,ab2]@48 [eb2,eb3]@48 [eb2,eb3]@48 gb2]/5", // Ab Eb
  E: "[~@47 gb2@48 [ab1,ab2]@47 ~ g1@36 ~ g1@11 [c2,c3]@48 [bb1,bb2]@48 [ab1,ab2]@48 ~ ab1@48, ~@143 g2@48 ~@144 ab2@48 ~]/8", // Ab C Bb Ab
  F: "[[bb1,bb2]@47 [bb1,bb2]@48 ~]/2", G: "[b1,b2]",
  H: "[[g1,g2]@47 ~ c2@47 [c2,c3]@48 [bb1,bb2]@48 [bb1,bb2]@48 [ab1,ab2]@48 ~@2 ab2@46 [eb2,eb3]@47 ~ [eb2,eb3], ~@47 c3@48 ~@192 ab1@48 ~@49]/8", // G C Bb Ab Eb
  I: "[~@12 gb2@6 g2@8 ~@4 bb2@5 ~ eb3@11 gb1@48 ~ gb1@47 [ab1,ab2]@48 ~, ~@47 gb2@97 ~@48]/4", J: "[g1,g2]",
  K: "[c2,c3]", L: "[c2,c3]@47 ~", M: "[~@47 [g1,g2]@48 [c2,c3]@48 [bb0,bb1,bb2], ~@95 c1 ~@48]/3",
  N: "[~@47 [bb1,bb2]@48 [ab1,ab2]@48 [ab1,ab2]@48 [ab1,ab2]@48 [eb2,eb3]@48 [eb2,g2]]/6", // Bb Ab Eb
  O: "[~@12 f2@5 eb2@4 ~@3 g2@5 bb2@4 ~@2 eb3@12 gb2@47 ~ gb2@48 [ab1,ab2]@48 [g1,g2]@49, ~@47 gb1@96 ~@97]/5", // Ab G
  P: "[~@47 [g1,g2]@48 [c2,c3]@48 [bb1,bb2]@48 [bb1,bb2]@48 [ab1,ab2]@48 [ab1,ab2]@48 [ab1,ab2]@48 [eb2,eb3]]/8", // G C Bb Ab Eb
  Q: "[eb2,eb3]@18 g2@8 ~@4 bb2@4 ~@2 eb3@11 ~", R: "[gb2@47 gb2@48 [ab1,ab2]@45 ~@3 [g1,g2]@49, d3@23 ~@169]/4",
  S: "[c3@94 ~ c3@47 ~ [c2,c3]@96 ~, c2@143 ~@97]/5", // C
})).s("gm_fretless_bass").gain(0.41)

// chords · string ensemble 2 · "Slow Strings"
const string_ensemble_2 = note("<~@50 A@8 B@8 C@5 D@7 E@6 F@7 ~ G@5>".pickRestart({
  A: "[~@47 [c4,eb4,g4]@96 [c4,eb4,g4]@48 [ab3,c4,f4]@48 [ab3,d4,f4]@95 ~ [b3,ab4]@49, ~@334 [d4,f4]@49 ~]/8", // Cm Fm Ddim E Dm
  B: "[[b3,d4,f4,g4]@46 ~ [g3,eb4]@95 [g3,bb3,d4]@48 [f3,bb3,d4]@49 [ab3,bb3,d4]@95 ~ [bb3,d4]@48 [g3,bb3,c4], ~@23 c4@48 ~@96 g3@24 ~]/8", // G7 Cm Gm Bb Bb7 Bb C7
  C: "[~@47 [d3,a3,c4]@96 [d3,f3,c4]@48 [d3,f3,g3,b3]@47 ~@2]/5", // D7 Dm7 G7
  D: "[[c4,eb4,g4]@94 ~ [c4,eb4,g4]@48 [ab3,c4,f4]@48 [ab3,d4,f4]@95 [b3,d4,f4,ab4]@49 ~]/7", // Cm Fm Ddim Bdim
  E: "[[b3,d4,f4,g4]@46 ~ [g3,eb4]@95 [g3,bb3,d4]@48 [f3,bb3,d4]@49 [ab3,bb3,d4]@49, ~@23 c4@48 ~@73]/6", // G7 Cm Gm Bb Bb7
  F: "[bb3@46 ~ [bb3,d4]@48 ~ eb3@47 [d3,a3,c4]@96 [d3,f3,c4]@48 [d3,f3,g3,b3]@49, ~@46 g3@48 ~ [g3,c4]@48 ~@193]/7", // Bb D7 Dm7 G7 C5
  G: "[c3@47 c3@174 ~@19]/5",
})).s("gm_string_ensemble_2").gain(0.26)

// chords · string ensemble 2 · "Slow Strings" · soft notes
const string_ensemble_2_soft = note("<~@90 A@7>".pickRestart({
  A: "[~@47 [g3,c4,eb4,g4]@95 ~ [g3,c4,eb4,g4,c5]@174 ~@19]/7", // Cm
})).s("gm_string_ensemble_2").gain(0.15)

// chords · pad bowed · "Bowed Pad"
const pad_bowed = note("<~@71 A@5 B@4 C@8 D@8 ~>".pickRestart({
  A: "[[c4,eb4,g4]@143 c4@48 d4@49, ~@143 [ab3,f4]@97]/5", // Cm Db
  B: "[~@96 g4@47 [g3,c4,eb4]@49, ~@46 b3@97 ~@49, ~@46 ab4@49 ~@97, ~@47 [d4,f4]@96 ~@49]/4", // Cm Dm
  C: "[~@46 g3@48 f3@49 bb3@48 ~@97 eb3@47 [d3,a3]@49, ~@46 [bb3,d4]@96 ~ d4@144 c4@97, ~@143 ab3@95 g3@97 ~@49, ~@192 bb3@95 ~@97]/8", // D5 Bb
  D: "[~@47 c4@48 b3@48 ~@96 [g3,c5]@145, ~@47 [d3,f3]@96 [eb4,g4]@241, ~@95 g3@96 ~ c3@192, ~@143 c4@192 ~@49]/8", // C5 Dm Eb
})).s("gm_pad_bowed").gain(0.31)

// 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 ~@40 x ~@6", D: "x ~@6 x", E: "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 ~ 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: "~@33 x ~ x ~ x ~@2 x ~ x ~ x ~ x ~", B: "x", C: "~@23 x ~@24", D: "~@23 x ~@5 x ~ x!2 ~ x!2 ~@12",
  E: "~@6 x!2 ~ x!2 ~ x ~@11 x!2 ~ x!2 ~ x!2 ~ x!2 ~ x ~@11", F: "~ x", G: "~@4 x ~@2 x",
  H: "~@24 x ~@5 x!2 ~ x!2 ~ x ~@11", I: "~@2 x!2", J: "~@24 x ~@5 x!2 ~ x!2 ~ x ~@5 x ~@5", K: "~@2 x ~ x ~@2 x",
  L: "~@12 x ~@2 x ~@2 x ~@2 x ~ x",
})).gain(0.31)

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

// 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: "~@47 x", B: "~@23 x ~@24", C: "~ x", D: "~@2 x!2", E: "~@4 x ~@2 x", F: "~ x!2 ~", G: "~@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 ~ 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: "~@23 x ~@24", C: "~@23 x ~@17 x ~@6", 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!3 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x ~@28",
})).gain(0.51)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@96 [~@20 x ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~@15]>").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: "~@30 x!2 ~ x!2 ~ x ~@11", C: "~@23 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: "~@17 x ~@30", B: "~@7 x", C: "x",
})).gain(0.51)

// drums · ride
const ride = s("rd").struct("<~@4 A ~ B ~@35 C ~@7 B ~@35 C ~@9 D>".pickRestart({
  A: "~@23 x ~@24", B: "~@24 x!2 ~ x!2 ~ x!2 ~ x!2 ~@13", C: "~@35 x ~ x!2 ~ x!2 ~ x!2 ~ x!2", 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!3 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~ x!2 ~@27]>").gain(2.6)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@96 [~@22 x!2 ~ x!2 ~ x!2 ~ x!2 ~@15]>").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