Strudelify

Calypso (Part 3)

Jean Michel Jarre

KeyB♭ minorTempo70 bpm
0:00/0:00
// Calypso (Part 3) — Jean Michel Jarre
// 70 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 82 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(70/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.

// other · pad choir · "SYNTH 2"
const pad_choir = note("<~@35 A B A C D@2 A E ~@39>".pickRestart({
  A: "bb4 ~ bb4 ~ bb4 ~ bb4 ~", B: "bb4@3 ~", C: "b4 ~ b4 ~ b4@4", D: "c5 ~ c5 ~ c5 ~ c5 ~", E: "bb4@9 ~@7",
})).s("gm_pad_choir").gain(0.21).pan(0.7)

// chords · pad bowed · "SYNTH 3"
const pad_bowed = note("<~@13 A B C D E F G ~@8 H I J K E L M ~@6 N ~@40>".pickRestart({
  A: "[g3,bb3,eb4]!2 [g3,bb3] [g3,bb3,eb4]", B: "[ab3,eb4]!2 [ab3,d4] [ab3,eb4]", C: "[ab3,eb4]!2 [ab3,d4]!2",
  D: "[g3,d4]!2 [ab3,d4] [g3,d4]", E: "[g3,c4,eb4]!2 [g3,bb3,eb4]!2", F: "[a3,c4,eb4]!2 [c4,eb4,g4]!2",
  G: "bb3 f3 bb3 f4 bb4@4", H: "[g3,bb3,eb4]@2 [g3,bb3]@2 [g3,bb3] eb3@3", I: "~ [ab3,c4,eb4] [ab3,c4,d4] [ab3,c4,eb4]",
  J: "bb1@2 [bb3,d4]@2 [f3,bb3] bb2 [f3,bb3,d4]@2", K: "[g3,b3,d4]!2 [ab3,b3,d4]!2", L: "[f3,a3,eb4]!2 [a3,eb4,g4]!2",
  M: "[bb3,d4,f4]!3 ~", N: "~ ab3 d4 ab4 d5@4",
})).s("gm_pad_bowed").gain(0.14).pan(0.4)

// chords · epiano1 · "E.PIANO" · Bbm Bb Bbm
const epiano1 = note(`<
  ~@20
  [[bb3,db4,f4]!4]!6
  ~
  [[d4,f4,bb4]]
  ~@14
  [[bb3,db4,f4]!4]!38
  [[bb3,db4,f4] [bb3,db4,f4]@3]
  ~
>`).s("gm_epiano1").gain(0.16).pan(0.7)

// other · tremolo strings · "TREMOLOSTR"
const tremolo_strings = note(`<
  ~@44 A B@2 C D E F G H I J K L M N O P Q N R P E F G H I J K L M N O P Q N R P ~
>`.pickRestart({
  A: "ab5 bb5", B: "[bb5@5 c6 db6@6 eb6@4]/2", C: "f6@6 f6 gb6",
  D: "f6@8 [bb4,db5] [db5,eb5] [e5,f5] [ab5,a5] [bb5,db6] [db6,eb6] [e6,f6] [ab6,a6]", E: "bb6@10 ~ bb6 eb7 db7 c7 bb6",
  F: "ab6 f6 ~@2 eb6 db6@2 ~ db6@4 ~ ab5@2 f5, ~@3 e6@2 ~@2 bb5@2 ~@3 bb5@2 ~@2",
  G: "eb5@7 ~ f5@2 eb5@2 db5@2 bb4@2, ~@7 eb5@2 ~@7",
  H: "bb4@6 eb6 [e6,f6] ab6 [a6,bb6] e6 [eb6,f6] db6 ab5@3, ~@13 bb5 ~@2", // Fmaj7 Bbmaj7 Ebsus2
  I: "~@2 bb6 [f6,ab6] eb6@2 ~@4 bb5 [db6,eb6] f6 [e6,f6] f6 [eb6,e6]", J: "db6 ~@3 db6 bb5 db6 bb5",
  K: "db6@2 ~@4 db5 [eb5,e5] f5 [gb5,ab5] gb5 [ab5,bb5] c6 [bb5,c6] eb6 [e6,f6]", L: "db7 ~", M: "bb6@4 ab6@3 gb6",
  N: "f6@3 eb6 db6@2 c6@2", O: "bb5@4 c6@2 db6 eb6", P: "f6@3 ~", Q: "bb6@4 ab6@2 f6 gb6", R: "bb5@8 c6@3 db6@3 eb6@2",
})).s("gm_tremolo_strings").gain(0.09).pan(0.7)

// other · synth strings 1 · "SYN STRING"
const synth_strings_1 = note(`<
  ~@2 A B C A@2 B C D E F G@2 ~ C D E F C ~@3 H I J K ~ A B C D E F L@4 M N O P Q R P@2 Q S P H T J K H T U V W X Y V H
  T U V H T J K H T U V W X Y V H T U Z ~
>`.pickRestart({
  A: "eb4", B: "c4", C: "bb3", D: "b3", E: "g3 bb3", F: "a3", G: "[~ bb3@3]/2", H: "bb2@3 c3 db3 eb3 f3 gb3",
  I: "ab3@3 bb2 c3 db3 eb3 f3", J: "gb3@4 f3 db3 f3 db3", K: "bb2",
  L: "[~@4 eb2@4 ~ eb4 d4 ~@3 d4@2, ~@8 bb3@28 ~@8 eb4@13 ~@7, ~@2 f2 bb2]/4", M: "[b2,d4]", N: "eb4 bb3, c3",
  O: "[f2,a3]", P: "[bb2,bb3]", Q: "[ab2,ab3]", R: "[gb2,gb3]@7 [ab2,ab3]", S: "[gb2,gb3]",
  T: "ab3@3 bb2 c3 db3 f3 ab3", U: "gb3@4 f3 gb3 f3 db3", V: "bb2@10 db3 eb3 f3@2 db3 c3", W: "bb2@6 db3 c3",
  X: "ab2@12 db3 c3 bb2 ab2", Y: "gb2@7 ab2", Z: "bb2@5 ~@3",
})).s("gm_synth_strings_1").gain(0.1).pan(0.7)

// other · string ensemble 2 · "STRINGS"
const string_ensemble_2 = note(`<
  ~@2 A B C A@2 B C D E B C A B C F E B C G H I C G J C ~ K B C D E B C A L C M E L C G N C@2 G J I O G J P Q R S T U R
  S T Q R S T O G J P Q R S T U R S T Q R S V ~
>`.pickRestart({
  A: "eb2", B: "f2", C: "bb2", D: "b2", E: "c3", F: "b2@15 g2", G: "ab2@15 ab2", H: "gb2@15 ab2", I: "bb2@15 f2",
  J: "gb2", K: "eb2@15 c3", L: "f2@15 f2", M: "b2@15 b2", N: "gb2@15 gb2", O: "bb2@15 bb2", P: "bb2@14 db3 b2",
  Q: "bb2@12 db3@2 c3 bb2", R: "ab2@12 db3 c3 bb2 ab2", S: "gb2@7 ab2", T: "bb2@10 db3 eb3 f3@2 db3 c3",
  U: "bb2@6 db3 c3", V: "bb2@5 ~@3",
})).s("gm_string_ensemble_2").gain(0.2).pan(0.7)

// drums · kick
const kick = s("bd").struct(`<
  A B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C@2 B C B D E B@2 D E
  B F G E H B C B C B D E B@2 D E B F G E H B ~
>`.pickRestart({
  A: "~@15 x", B: "x", C: "x ~@14 x", D: "x ~@13 x!2", E: "x ~@11 x!4", F: "x ~@9 x!3 ~ x!2", G: "x ~@11 x ~ x!2",
  H: "x ~@6 x",
})).gain(0.29)

// drums · snare
const snare = s("sd").struct("<[~ x]!81 ~>").gain(0.21)

// drums · hihat
const hihat = s("hh").struct("<[~ x!3] [x!4]!80 ~>").gain(0.29)

// drums · mid tom
const mid_tom = s("mt").struct("<~@56 A B ~@6 C ~@7 A B ~@6 D ~>".pickRestart({
  A: "~@10 x!6", B: "x", C: "~@10 x!3 ~ x!2", D: "~@10 x!3 ~@3",
})).gain(0.29)

// drums · crash
const crash = s("cr").struct("<~@80 [~@3 x] ~>").gain(0.14)

stack(
  pad_choir, pad_bowed, epiano1, tremolo_strings, synth_strings_1, string_ensemble_2, kick, snare, hihat, mid_tom, crash
)

More by Jean Michel Jarre