Strudelify
KeyF majorTempo145 bpm
0:00/0:00
// Fantastic Planet — Soil & Pimp Sessionsarr. Jude Grant
// 145 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 7/8 at bar 42, 4/4 at bar 49, 6/8 at bar 65, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5868027; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 121 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(145/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 · tenor sax · "Tenor Saxophone"
const tenor_sax = note(`<
  A@2 B C D@2 E@16 B@2 F@2 G@2 H@2 I@2 J@2 G@2 H@2 I@2 K@2 ~@7 L@2 M N@3 M O P@2 M N@3 M O ~@15 Q R@8 S@24 T U@6 V
>`.pickRestart({
  A: "[bb3@4 d4 f4 ~ e4@25]/2", B: "bb3@4 d4 f4 ~ e4@9",
  C: "e4 [f4,gb4] [g4,ab4] [a4,bb4] [b4,c5] [db5,d5] [eb5,e5] [f5,gb5] [g5,a5] g5@3 ~@4", // Gbmaj7 Abmaj7 Bbmaj7 Cmaj7 Dmaj7 Emaj7 Gbmaj7 Gsus2
  D: "[bb3@4 d4 f4 ~ e4@5 d4 c4 ~ d4@3 ~@14]/2",
  E: "[d4@4 g4 bb4 ~ a4@5 a4 c4 ~ d4@5 bb4 g4 ~ a4@5 a4 c4 ~ d4@5 g4 bb4 ~ d5@5 bb4 g4 ~ a4@5 g4 a4 ~ gb4@5 ~@4]/4",
  F: "[bb3@4 d4 f4 ~ e4@5 d4 c4 ~ d4@3 ~@6 bb3@4 d4@4]/2", G: "[f4@8 e4@4 d4@3 bb3@9 bb3@4 d4@4]/2",
  H: "[f4@8 c4@4 bb4@3 f4@9 bb3@4 d4@4]/2", I: "[f4@8 e4@4 d4@3 bb3@9 a3@8]/2", J: "[b3@5 ~ bb3 d4]/2",
  K: "[b3@5 ~@3]/2", L: "[bb4@4 ~@7 g4 bb4 g4 ~ a4@3 ~@7 c4 d4 f4 a4 g4@3]/2", M: "~ bb4 ~@2",
  N: "[~@8 a3 bb3 c4 d4 c4@2 d4 bb3@3 ~@2 bb4@4 ~@3 g4 bb4 g4 ~ a4@3 ~@7 c4 d4 f4 a4 g4@3]/3",
  O: "~@8 c5!3 bb4 ~ bb4@3", P: "[~@4 bb4@4 ~@3 g4 bb4 g4 ~ a4@3 ~@7 c4 d4 f4 a4 g4@3]/2", Q: "~@7 bb3@9",
  R: "[~@2 d4@10 f4@8 e4@4 d4@3 bb3@9 bb3@4 d4@4 f4@8 c4@4 bb4@3 f4@9 bb3@4 d4@4 f4@8 e4@4 d4@3 bb3@9 a3@8 b3@20]/8",
  S: "[~@4 bb3@4 d4@4 f4@8 e4@4 d4@3 bb3@9 bb3@4 d4@4 f4@8 c4@4 bb4@3 f4@9 bb3@4 d4@4 f4@8 e4@4 d4@3 bb3@9 a3@8 b3@20]/8",
  T: "~@3 bb3", U: "d4 f4 ~ e4@9 bb3@4", V: "d4 f4 ~ e4@5 d4 c4 ~ d4@3 ~@2",
})).s("gm_tenor_sax").gain(0.25)

// chords · piano
const piano = note(`<
  A@2 B@2 C ~ D@16 E@2 C ~ F G H I F G J I F G H I F G J I K L M N@3 O P@16 Q@8 R@5 S T@2 U@8 V@24 W@8
>`.pickRestart({
  A: "[[g2,d3,bb4,f5]@6 ~ [bb4,e5]@9 [bb4,e5]@3 [bb4,e5]@3 [bb4,e5]@2 [bb4,e5]@3 [bb4,e5]@3 [bb4,e5]@2, ~@7 [c3,g3]@24 ~]/2", // Gm7 Bbdim C5
  B: "[[g2,d3,bb4,f5]@6 ~ [bb4,e5]@9 [bb4,e5]@2 [bb4,e5]@2 [bb4,e5]@2 [bb4,e5]@2 [bb4,e5]@2 [bb4,e5]@2 [bb4,e5]@2 [bb4,e5]@2, ~@7 [c3,g3]@24 ~]/2", // Gm7 Bbdim C5
  C: "[g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@7 ~ [g2,d3,bb4,f5]", // Gm7 C7 Gm7
  D: "[[g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@7 ~ [g2,d3,bb4,f5]@7 ~ [c3,g3,bb4,e5]@7 ~ [g2,d3,bb4,f5]@7 ~ [d3,a3,f4,c5]@7 ~ [f2,c3,a4,f5]@7 ~ [d3,a3,gb4,c5]@9]/4", // Gm7 C7 Gm7 C7 Gm7 Dm7 F D7
  E: "[g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@9", // Gm7 C7
  F: "g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 f5@2 g5@2, [g3,bb3,d4,f4] [f3,a3,c4,e4]", // Gm7 Fmaj7
  G: "g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 g5@2 gb5@2, [eb3,g3,bb3,d4] [d3,gb3,a3]", // Ebmaj7 D
  H: "g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 f5@2 g5@2, [c3,e3,g3,bb3]!2", // C7
  I: "[d5,bb5]@3 [d5,bb5]@3 [d5,bb5]@2 [d5,bb5]@3 [d5,bb5]@3 [d5,bb5]@2, [bb2,eb3,g3]!2", // Gm Eb
  J: "[b4,g5]@3 [b4,g5]@3 [b4,g5]@2 [b4,g5]@3 [b4,g5]@3 [b4,g5]@2, [c3,e3,g3]!2", // Em C
  K: "g2@2 bb2@2 c3@2 g2 bb2@2 c3@2 db3 d3@2 g2@2", L: "bb2@2 c3@2 g2 bb2@2 c3@2 db3 d3@2 g2@2 bb2@2",
  M: "c3@2 g2 bb2@2 c3@2 db3 d3@2 g2@2 bb2@2 c3@2",
  N: "[[f2,eb4,g5]@8 g2@2 bb2@2 c3@2 g2 bb2@2 c3@2 db3 d3@2 g2@2 bb2@2 c3@2 g2 bb2@2 c3@2 db3 d3@2 g2@2 bb2@2 c3@2 g2 bb2@2 c3@2 db3]/3", // Cm
  O: "d3 g2 bb2 c3 [f2,eb4,g5]@4", // Cm
  P: "[[g4,g5]@4 bb4 d5 ~ c5@5 a4 f4 ~ g4@5 d5 bb4 ~ c5@5 a4 f4 ~ g4@5 bb4 d5 ~ f5@5 d5 bb4 ~ c5@5 bb4 c5 ~ [d3,a3]@9, [g2,d3]@6 ~ [c3,g3]@7 ~ [g2,d3]@7 ~ [c3,g3]@7 ~ [g2,d3]@7 ~ [d3,a3]@7 ~ [f2,c3]@7 ~ a4@5 ~@4]/4", // G D5 G5 C5 G5 C5 G5 D5 …
  Q: "[g4@2 ~ bb4@2 d5@2 ~ c5@2 a4@2 ~ f4@2 g4@2 ~ d5@2 ~ bb4@2 c5@2 ~ a4@2 f4@2 ~ g4@2 ~ bb4@2 d5@2 ~ f5@2 d5@2 ~ bb4@2 c5@2 ~ g4@2 ~ bb4@2 [gb3,a4]@7 ~ g4@2 bb4@2 ~ d5@2 ~ c5@2 a4@2 ~ f4@2 g4@2 ~ d5@2 bb4@2 ~ c5@2 ~ a4@2 f4@2 ~ g4@2 bb4@2 ~ d5@2 ~ f5@2 d5@2 ~ bb4@2 c5@2 ~ g4@2 bb4@2 ~ [gb3,a4]@7 ~ g4@2 d5@2, g2@7 ~ c3@7 f3@7 ~ c3@7 ~ g2@7 ~ f3@7 e3@7 ~@9 g2@7 ~ c3@7 f3@7 ~ c3@7 ~ g2@7 ~ f3@7 e3@7 ~@9 g3@4]/8", // Gbm
  R: "[~ bb4@2 c5@2 ~ a4@2 ~ f4@2 g4@4 d6@4 c6@2 ~ a5@2 f5@2 ~ [eb3,bb3,eb5,g5]@4 [eb3,bb3,eb5,g5]@3 [f3,bb3,a4]@4 [f3,bb3,f4]@4 g4@2 ~ bb4@2 eb5@2 ~ d5@4 c5@4 bb4@2 a4@2 ~ bb4@2 c6@4 a5 f5@2 ~ g5@4 eb5@3, ~@3 f3@7 ~ eb3@7 ~ d3@7 ~@16 f3@7 ~ [gb3,bb3]@7 ~ [a3,d4]@7 [g3,c4]@7 ~ bb3@7]/5", // Eb Bbmaj7 Bb5 Gb D5 C5
  S: "~ c5@4 a4@4 g4@3 d5@4, ~ a3@7 ~ bb3@7", T: "[c5@4 a4 f4@2 ~ [g3,a3,d4,g4]@15 ~@9, c4@7 ~@25]/2",
  U: "[~@12 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 f5@2 g5@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 g5@2 gb5@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 f5@2 g5@2 [d5,bb5]@3 [d5,bb5]@3 [d5,bb5]@2 [d5,bb5]@3 [d5,bb5]@3 [d5,bb5]@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 f5@2 g5@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 g5@2 gb5@2 [b4,g5]@3 [b4,g5]@3 [b4,g5]@2 [b4,g5]@3 [b4,g5]@3 [b4,g5]@2 [bb2,eb3,g3,d5,bb5]@3 [d5,bb5], ~@3 [g3,bb3,d4,f4]@2 [f3,a3,c4,e4]@2 [eb3,g3,bb3,d4]@2 [d3,gb3,a3]@2 [c3,e3,g3,bb3]@2 [c3,e3,g3,bb3]@2 [bb2,eb3,g3]@2 [bb2,eb3,g3]@2 [g3,bb3,d4,f4]@2 [f3,a3,c4,e4]@2 [eb3,g3,bb3,d4]@2 [d3,gb3,a3]@2 [c3,e3,g3]@2 [c3,e3,g3]@2 ~]/8", // Gm Em Ebmaj7 Gm Gm7 Fmaj7 Ebmaj7 D …
  V: "[~@2 [d5,bb5]@2 [d5,bb5]@3 [d5,bb5]@3 [d5,bb5]@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 f5@2 g5@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 g5@2 gb5@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 f5@2 g5@2 [d5,bb5]@3 [d5,bb5]@3 [d5,bb5]@2 [d5,bb5]@3 [d5,bb5]@3 [d5,bb5]@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 f5@2 g5@2 g5@2 d5 f5@2 g5 ~ bb5 ~ g5 ~ d5 g5@2 gb5@2 [b4,g5]@3 [b4,g5]@3 [b4,g5]@2 [b4,g5]@3 [b4,g5]@3 [b4,g5]@2 [bb2,eb3,g3,d5,bb5]@3 [d5,bb5], ~ [bb2,eb3,g3]@2 [g3,bb3,d4,f4]@2 [f3,a3,c4,e4]@2 [eb3,g3,bb3,d4]@2 [d3,gb3,a3]@2 [c3,e3,g3,bb3]@2 [c3,e3,g3,bb3]@2 [bb2,eb3,g3]@2 [bb2,eb3,g3]@2 [g3,bb3,d4,f4]@2 [f3,a3,c4,e4]@2 [eb3,g3,bb3,d4]@2 [d3,gb3,a3]@2 [c3,e3,g3]@2 [c3,e3,g3]@2 ~]/8", // Gm Em Ebmaj7 Gm Eb Gm7 Fmaj7 Ebmaj7 …
  W: "[~@2 [d5,bb5]@2 [d5,bb5]@3 [d5,bb5]@3 [d5,bb5]@2 [g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@9 [g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@9 [g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@9 [g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@9 [g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@9 [g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@9 [g2,d3,bb4,f5]@6 ~ [c3,g3,bb4,e5]@7 ~ [g2,d3,bb4,f5]@3 ~@2, ~ [bb2,eb3,g3]@2 ~@29]/8", // Gm Gm7 C7 Gm7 C7 Gm7 C7 Gm7 …
})).s("gm_piano").gain(0.3)

// bass · electric bass finger · "Electric Bass"
const bass = note(`<
  A@4 B@2 C@2 D E C@2 D E C@2 D E C@2 D E F@2 G@2 H I J K H I L K H I J K H I L K M N O P@3 Q C@2 D E C@2 D E C@2 D E
  C@2 D E R@8 S@5 T U@2 V@8 W@24 X Y@6 Z
>`.pickRestart({
  A: "[g1@4 bb1 d2 ~ c2@25]/2", B: "[g1@4 bb1 d2 ~ c2@5 a1 f1 ~ g1@3 g3@2 f3@2 e3@2 eb3@2 d3@2 db3@2 d2@2]/2",
  C: "g1 c2", D: "g1 d2", E: "f1 d2", F: "g1@4 bb1 d2 ~ c2@9", G: "[g1@4 bb1 d2 ~ c2@5 a1 f1 ~ g1@3 ~@14]/2",
  H: "g2 f2", I: "eb2 d2", J: "c2 c3", K: "eb2!2", L: "c2!2", M: "g1@2 bb1@2 c2@2 g1 bb1@2 c2@2 db2 d2@2 g1@2",
  N: "bb1@2 c2@2 g1 bb1@2 c2@2 db2 d2@2 g1@2 bb1@2", O: "c2@2 g1 bb1@2 c2@2 db2 d2@2 g1@2 bb1@2 c2@2",
  P: "[f1@8 g1@2 bb1@2 c2@2 g1 bb1@2 c2@2 db2 d2@2 g1@2 bb1@2 c2@2 g1 bb1@2 c2@2 db2 d2@2 g1@2 bb1@2 c2@2 g1 bb1@2 c2@2 db2]/3",
  Q: "d2 g1 bb1 c2 f1@4",
  R: "[g1@8 c2@7 bb1@8 f1@8 g1@8 bb1@7 c2@8 d2@8 g2@8 c2@7 bb1@8 f2@8 g2@8 bb2@7 c3@8 d2@8 g2@4]/8",
  S: "[~@3 f2@8 eb2@8 d2@8 c2@7 d2@8 f2@8 gb2@8 g2@7 bb2@8 c3@7]/5", T: "~ d3@8 eb3@7", U: "[f3@8 g3@15 ~@9]/2",
  V: "[~@3 g2@2 f2@2 eb2@2 d2@2 c2@2 c3@2 eb2@2 eb2@2 g2@2 f2@2 eb2@2 d2@2 c2@2 c2@2 eb2]/8",
  W: "[~ eb2@2 g2@2 f2@2 eb2@2 d2@2 c2@2 c3@2 eb2@2 eb2@2 g2@2 f2@2 eb2@2 d2@2 c2@2 c2@2 eb2]/8", X: "~ eb2@2 g1",
  Y: "bb1 d2 ~ c2@9 g1@4", Z: "bb1 d2 ~ c2@5 a1 f1 ~ g1@3 ~@2",
})).s("gm_electric_bass_finger").gain(0.39)

// drums · kick
const kick = s("bd").struct("<A@5 ~@17 A@3 ~ B@16 C D E F G H I A@16 ~@16 J B@32 K@6 L>".pickRestart({
  A: "x ~@3 x ~@2 x ~@2 x ~@3 x ~", B: "x!4", C: "x ~@3 x!2 ~ x", D: "~@3 x!2 ~ x ~", E: "~@2 x!2 ~ x ~@2", F: "x!2",
  G: "x!2 ~ x ~@3 x", H: "x ~ x ~@3 x!2", I: "~ x ~@2 x ~@3", J: "~@3 x", K: "x ~@2 x ~@2 x ~@3 x ~ x ~@3",
  L: "x ~@2 x ~@2 x ~@3 x ~@5",
})).gain(0.29)

// drums · snare
const snare = s("sd").struct(`<
  A B A B A ~@17 A B A ~ C@15 D E F G H I J K A B@3 A B@3 A B@3 A B@3 ~@16 L@32 ~ M N M N M N M
>`.pickRestart({
  A: "~@2 x ~@4 x", B: "~@4 x ~@5 x ~ x ~@2 x", C: "~@3 x ~@12", D: "~@3 x ~@6 x!6", E: "~@2 x ~@4 x ~ x ~ x ~@4",
  F: "x ~@4 x ~ x ~ x ~@4 x ~", G: "~@3 x ~ x ~ x ~@8", H: "~@4 x!4 ~@2 x ~@4 x", I: "~ x ~ x ~@4 x ~@4 x ~ x",
  J: "~ x ~@4 x ~@4 x ~ x ~ x", K: "~@4 x!4 ~@8", L: "~@15 x", M: "x ~@4 x ~@2", N: "x ~@5 x ~ x ~@2 x ~@4",
})).gain(0.29)

// drums · low tom
const low_tom = s("lt").struct("<~@26 [~@7 x]!15 ~@41 [~@5 x ~@2]!32 ~@7>").gain(0.29)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@4 A ~ B@16 ~@2 A ~ B@16 ~@39 C B@31 D ~@6 E>".pickRestart({
  A: "~@15 x", B: "~ x ~ x ~ x ~ x", C: "~@7 x", D: "~ x ~ x ~ x ~@2", E: "~@11 x ~@4",
})).gain(0.29)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@26 [~@11 x!2 ~@3]!15 ~@41 [~@7 x!2 ~@7]!32 ~@7>").gain(0.29)

// drums · crash
const crash = s("cr").struct(`<
  A B A B A ~ C ~@3 C ~@3 C ~@3 C ~@3 A B A ~ C ~@3 C ~ C ~ C ~@3 C ~ C D E F ~ G H B D A ~ B ~ B ~ B ~ B ~ B ~ B ~ B
  ~@17 F ~@3 F ~ F ~ F ~@3 F ~ F ~ F ~@3 F ~ F ~ F ~@3 F ~ F ~ F I J I J I J I
>`.pickRestart({
  A: "x ~@6 x ~@8", B: "~ x ~@2", C: "x", D: "~ x", E: "x ~@6 x", F: "~@3 x", G: "x!2", H: "~@3 x ~@4", I: "~@3 x ~@12",
  J: "x ~@2 x",
})).gain(0.29)

// drums · high tom
const high_tom = s("ht").struct("<~@26 [~@7 x ~@8]!15 ~@41 [~@3 x ~@12]!32 ~@7>").gain(0.29)

// drums · ride
const ride = s("rd").struct(`<
  A B A B C ~ D E@3 D E@3 D E@3 D E@3 A B C ~ F G@3 F G F G F G@3 F G F H ~@7 I A B A B A B A B A B A B A B A ~@16 J K@3
  L K L K L K@3 L K L K L K@3 L K L K L K@3 L K L K@2 A I A I A I M
>`.pickRestart({
  A: "x!8", B: "x!2 ~ x!5", C: "x!7 ~", D: "~@2 x!3 ~ x!3 ~ x!3 ~ x!2", E: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2",
  F: "~@2 x ~ x ~@2 x ~ x ~ x!2 ~ x ~", G: "x ~ x ~ x ~@2 x ~ x ~ x!2 ~ x ~", H: "x!4 ~@4", I: "~ x!7", J: "~@7 x",
  K: "x ~@2 x ~ x ~ x!2 ~ x ~ x ~ x ~", L: "x ~@2 x ~ x ~ x!2 ~ x ~@3 x ~", M: "x!5 ~@3",
})).gain(0.29)

stack(tenor_sax, piano, bass, kick, snare, low_tom, pedal_hat, open_hat, mid_tom, crash, high_tom, ride)