Strudelify

thomas the dank engine

Mimi F.

KeyC minorTempo100 bpm
0:00/0:00
// thomas the dank engine — Mimi F.
// 100 bpm, 2/2, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5027665; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 60 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(100/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// other · flute
const flute = note(`<
  A@2 B C D E F G H I B C D E F G H I J K L M J N O P Q R S B C D E F G H I J K L M J N O P Q R S B C D E F G H T U V W
  V
>`.pickRestart({
  A: "~@2 eb5!2 ~@2 eb5 ~@3 eb5 ~ eb5@2 eb5@2", B: "g4 a4 b4 c5@2 d5 e5@2", C: "ab4 ~", D: "a4@2 f4@2 a4@2 g4@4 ~@5 g4",
  E: "a4@2 f4@2 f4@2 a4 g4@2 ~@2 gb4 g4 gb4 g4 gb4", F: "g4@4 g4@4 ~@4 g4 gb4 g4@2",
  G: "ab4@4 ab4@4 ~ eb4@2 eb4 f4@2 gb4@2", H: "g4 bb4 f4 g4", I: "ab4 ~@7", J: "~@2 f5@2 f5@4 f5@3 f5@3 ~@2",
  K: "~@2 eb5@2 eb5@4 eb5@3 eb5@3 ~@2", L: "~@2 db5@2 db5@4 db5@3 db5@3 ~@2",
  M: "~@2 c5 eb5 ab5@2 c5 gb5 eb5 c5 ab4 gb4@2 c5 eb5 gb5", N: "c6@2 bb5 c6 bb5 ab5 ~ eb5 ab5@2 g5 ab5 g5 f5 ~@2",
  O: "~@2 g5@2 g5@4 g5@3 g5@3 ~@2", P: "eb5@2 ~ eb5 db5@2 ~ db5", Q: "c5@2 ~ c5 bb4@2 ~ bb4", R: "g5@2 ~ g5 f5@2 ~ f5",
  S: "e5@2 ~ e5 d5 ~ d5!2", T: "ab4 ~@4 ab4 g4 gb4", U: "f4@4 a4 f4 a4 bb4@4 ~ db5@2 db5@2",
  V: "c5@2 eb4 c5@2 eb4 bb4@2 ab4@2 ~@2 ab5@2 ~@2", W: "~ f5@3 f5@3 f5@3 f5@3 f5@2 ~",
})).s("gm_flute").gain(0.3)

// other · flute
const flute_2 = note(`<
  A@2 B@2 C@2 D E@2 A B@2 C@2 F E@3 G H I ~ G J K L M N O B@2 C@2 F E@3 G H I ~ G J K L M N O B@2 C@2 D E@3 P Q R S
>`.pickRestart({
  A: "~@2 d5!2 ~@2 d5 ~@3 d5 ~ d5@2 d5@2", B: "~ c5 ~ c5 ~ c5 ~ c5", C: "~ d5 ~ d5 ~ d5 ~ d5", D: "~ g4 ~ g4 ~ g4 ~ g4",
  E: "~ eb5 ~ eb5 ~ eb5 ~ eb5", F: "~ b4 ~ b4 ~ b4 ~ b4", G: "~@2 db5@2 db5@4 db5@3 db5@3 ~@2",
  H: "~@2 c5@2 c5@4 c5@3 c5@3 ~@2", I: "~@2 bb4@2 bb4@4 bb4@3 bb4@3 ~@2",
  J: "f5@2 eb5 f5 db5 c5 ~@2 f5@2 eb5 f5 db5 c5 ~@2", K: "~@2 eb5@2 eb5@4 eb5@3 eb5@3 ~@2", L: "~ bb4 ~ bb4",
  M: "~ c5 ~ f5", N: "~ b4 ~ d5", O: "~@2 d5@2 ~@2 d5!2", P: "a4@4 c5 f5 c5 db5@4 ~ f5@2 f5@2",
  Q: "eb5@2 c5 eb5@2 c5 db5@2 c5@2 ~@2 eb5@2 ~@2", R: "ab5@3 f5@3 d5@3 b4@3 ab4@2 eb4@2",
  S: "eb5@2 c5 eb5@2 c5 db5@2 c5@2 ~@2 ab5@2 ~@2",
})).s("gm_flute").gain(0.3)

// other · trombone
const trombone = note(`<
  A@2 B C D@2 E C F A B C D@2 G C F C H I J K H L H M N O P B C D@2 G C F C H I J K H L H M N O P B C D@2 G C F C Q R S
  R
>`.pickRestart({
  A: "ab3 ~ eb3 ~ ab3 ~@3", B: "c3 ~ g2 ~ c3 ~ g2 ~", C: "ab3 ~ eb3 ~ ab3 ~ eb3 ~", D: "a3 ~ d3 ~ g3 ~ d3 ~",
  E: "b3 ~ e3 ~ b3 ~ e3 ~", F: "g3 ~ eb3 ~ bb3 ~ eb3 ~", G: "g3 ~ d3 ~ g3 ~ d3 ~", H: "f2@2 bb2@6 ~ f2 ~ bb2@5",
  I: "eb2@2 ab2@6 ~ eb2 ~ ab2@5", J: "bb2@2 db3@6 ~ bb2 ~ db3@5", K: "ab2@3 eb3!2 e3@2 gb3 ~ eb3@3 db3@2 c3@2",
  L: "ab3@2 g3 ab3 g3 f3 ~ b2 c3@2 bb2 c3 bb2 ab2 ~@2", M: "eb3 db3", N: "c3 bb2", O: "g3 f3", P: "e3@4 d3 ~@3",
  Q: "f2 ~ a2 ~ bb2 ~ db3 ~", R: "c3@2 ~ c3@2 ~ c3@2 ab2@2 ~@2 ab2@2 ~@2", S: "ab3@3 f3@3 d3@3 b2@3 ab2@2 eb2@2",
})).s("gm_trombone").gain(0.3)

stack(flute, flute_2, trombone)