Strudelify

thomas the tank engine theme

rnifnuf

KeyD majorTempo128 bpm
0:00/0:00
// thomas the tank engine theme — rnifnuf
// 128 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (3/4 at bar 1, 4/4 at bar 6) are rendered on a constant 4/4 grid of one bar per cycle
// note: duplicate parts dropped: ch 6 "Baritone Saxophone" baritone sax (copy of ch 8 "Bass Clarinet" clarinet); ch 14 "C Tuba" tuba (copy of ch 8 "Bass Clarinet" clarinet)
// note: Transcription provider: pdmx. https://musescore.com/score/150592; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 55 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · oboe
const oboe = note(`<
  A B@4 ~@11 C D E F G H I J K L ~ M N O P Q R S@2 T@2 U@2 V W I W X Y Z AA AB AC AD AE AF AG L ~
>`.pickRestart({
  A: "~ a5", B: "[e5 f#5 d5 a4@4 [c#5,f#5]@3 [a4,d5]@6]/4", C: "d4", D: "f#4 d5@3", E: "c#5 d5", F: "d5 c#5",
  G: "b4@4 d5@2 f#5 a5", H: "f#5", I: "g5", J: "g#5@3 a5 a5@4", K: "c#5@3 b4@3 a4@2", L: "a4", M: "a4@3 a4@5",
  N: "a4@3 c5@3 f4 g4", O: "g4", P: "~@6 g4 a4", Q: "a#4@3 a#4", R: "a#4@3 d5@3 g4@2", S: "[a4@5 ~@2 f5]/2",
  T: "[d6@2 d6@3 ~@2 c6]/2", U: "[c6@3 a5 a5@8 ~@4]/2", V: "a#5 a5 g5 f5@3 d5@2", W: "f5", X: "e5@3 ~",
  Y: "f#5 g5 a5 a5@2 f#5@2 a5", Z: "a5@2 g5 f#5 g5 ~@3", AA: "e5 f#5 g5 g5@2 d5 g5@2", AB: "g5@4 f#5 ~@3",
  AC: "f#5@3 g5@2 a5@3 a5@2 f#5@4 d5@2", AD: "a5 f#5 d5 b5@5", AE: "~ b5 c#6 d6", AF: "d6@3 d5!2 ~@2 d5",
  AG: "g5@2 a5 g5@3 e5@2",
})).s("gm_oboe").gain(0.25)

// other · flute
const flute = note(`<
  ~@5 A B C D E F G H I J ~ A B K L M F G H I J ~ N O P Q R S T@2 U@2 V@2 W X P X Y ~@11
>`.pickRestart({
  A: "f#5 g5 a5 a5@2 f#5@2 a5", B: "a5@2 g5 f#5 g5 ~@3", C: "e5 f#5 g5 g5@3 g5@2", D: "g5@2 f#5 ~",
  E: "f#5 g5 a5 a5@2 f#5@2 d5", F: "a5 f#5 d5 b5@5", G: "~ b5 c#6 d6", H: "d6@3 d5!2 ~@2 d5", I: "g5@2 a5 g5@3 e5@2",
  J: "e5", K: "e5 f#5 g5 g5@2 d5 g5@2", L: "g5 f#5", M: "f#5@3 g5@2 a5@3 a5@4 f#5@2 d5@2", N: "a5@3 a5@5",
  O: "a5@3 c6@3 f5 g5", P: "g5", Q: "~@6 g5 a5", R: "a#5@3 a#5", S: "a#5@3 d6@3 g5@2", T: "[a5@5 ~@2 f5]/2",
  U: "[d6@2 d6@3 ~@2 c6]/2", V: "[c6@3 a5 a5@8 ~@4]/2", W: "a#5 a5 g5 f5@3 d5@2", X: "f5", Y: "e5@3 ~",
})).s("gm_flute").gain(0.3)

// other · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  ~@5 A B C D E F G H I J ~ A B K D L F G H I J ~ M N O P Q R S@2 T@2 U@2 V W O W X ~@11
>`.pickRestart({
  A: "f#4 g4 a4 a4@2 f#4@2 a4", B: "a4@2 g4 f#4 g4 ~@3", C: "e4 f#4 g4 g4@3 g4@2", D: "g4@2 f#4 ~",
  E: "f#4 g4 a4 a4@2 f#4@2 d4", F: "a4 f#4 d4 b4@5", G: "~ b4 c#5 d5", H: "d5@3 d4!2 ~@2 d4", I: "g4@2 a4 g4@3 e4@2",
  J: "e4", K: "e4 f#4 g4 g4@2 d4 g4@2", L: "f#4@3 g4@2 a4@3 a4@4 f#4@2 d4@2", M: "a4@3 a4@5", N: "a4@3 c5@3 f4 g4",
  O: "g4", P: "~@6 g4 a4", Q: "a#4@3 a#4", R: "a#4@3 d5@3 g4@2", S: "[a4@5 ~@2 f4]/2", T: "[d5@2 d5@3 ~@2 c5]/2",
  U: "[c5@3 a4 a4@8 ~@4]/2", V: "a#4 a4 g4 f4@3 d4@2", W: "f4", X: "e4@3 ~",
})).s("gm_alto_sax").gain(0.3)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note("<~@27 A B C D E F G H I J K L M N O P Q ~@11>".pickRestart({
  A: "~ c4@2 c4 ~ c4@2 c4", B: "d4@2 d4 a3 g3 a3 a3@2", C: "a#3 a#3@2 a#3@2 a#3@2 ~", D: "c4@3 f4@3 c4@2",
  E: "a#3 f3 a#3 d4@2 a#3 d4@2", F: "f4@4 f4@2 a4@6 a#4 ~ a#4@2", G: "c5 a4", H: "f4 d4 c4 a#3 a3 g3 f3@2",
  I: "g3 f3 g3 a#3@2 d4 a#3@2", J: "a3 e3 a3 c4@3 g3@2", K: "g3@2 g3 a3@5", L: "d3 f3 g3 a3", M: "a#3 f3 g3 f3@5",
  N: "d4 c4", O: "b3 d4", P: "c4", Q: "b3@3 ~",
})).s("gm_tenor_sax").gain(0.3)

// other · clarinet · "Bb Clarinet"
const clarinet = note("<A B@4 C D E F G H I J K L M ~@11 N O P Q R S T U V W X Y Z AA AB AC AD ~@11>".pickRestart({
  A: "~ a4", B: "[e4 f#4 d4 a3@4 [c#4,f#4]@3 [a3,d4]@6]/4", C: "d4 ~ a3 ~ d4 ~ a3 ~ d4@2 a3 ~ d4@2 e4@2",
  D: "f#4@2 ~@4 d4@2 d4@3 ~@3 c#4 d4", E: "b3 c#4 d4 d4@3 d4@2", F: "d4@2 c#4 ~", G: "~@2 a3 b3 c#4@4 d4@8",
  H: "a3@3 b3@5", I: "e4", J: "f#4@3 d4!2 ~@2 d4", K: "g4@2 a4 g4@3 e4@2", L: "e4 c#4", M: "a3",
  N: "~ c5@2 c5 ~ c5@2 c5", O: "d5@2 d5 a4 g4 a4 a4@2", P: "a#4 a#4@2 a#4@2 a#4@2 ~", Q: "c5@3 f5@3 c5@2",
  R: "a#4 f4 a#4 d5@2 a#4 d5@2", S: "f5@4 f5@2 a5@6 a#5 ~ a#5@2", T: "c6 a5", U: "f5 d5 c5 a#4 a4 g4 f4@2",
  V: "g4 f4 g4 a#4@2 d5 a#4@2", W: "a4 e4 a4 c5@3 g4@2", X: "g4@2 g4 a4@5", Y: "d4 f4 g4 a4", Z: "a#4 f4 g4 f4@5",
  AA: "d4 c4", AB: "b3 d4", AC: "c4", AD: "b3@3 ~",
})).s("gm_clarinet").gain(0.3)

// bass · clarinet · "Bass Clarinet"
const bass = note(`<
  ~@10 A B C D C E F G H I J F E K L M ~ N O F P F Q R S T C U F V C W X Y ~@5 Z E AA AB AC ~
>`.pickRestart({
  A: "f#3@3 g3@5", B: "g#3", C: "a3", D: "d4@3 b3", E: "e3", F: "d3", G: "f#3 d4@3", H: "c#3 d3", I: "d3 c#3",
  J: "b2@2 c#3 d3", K: "d3@3 a3 a3@4", L: "c#3@3 b2@3 a2@2", M: "a2", N: "f3", O: "f3@3 c3", P: "f3@3 e3",
  Q: "d3@3 e3@3 g3@2", R: "a3 d4", S: "f4@3 c4", T: "a#3", U: "e3 d3", V: "c3", W: "g3", X: "c4", Y: "b3@3 ~",
  Z: "f#3@3 d3@5", AA: "a3@3 d3!2 ~@3", AB: "e3@3 g3", AC: "f#3",
})).s("gm_electric_bass_finger").gain(0.25)

// other · french horn · "Horn"
const french_horn = note("<~@10 A B C D E ~ F G H I J A B C D E ~ K L M N O P Q@2 R@2 S@2 T U M U V ~@11>".pickRestart({
  A: "a4 f#4 d4 b4@5", B: "~ b4 c#5 d5", C: "d5@3 d4!2 ~@2 d4", D: "g4@2 a4 g4@3 e4@2", E: "e4",
  F: "f#4 g4 a4 a4@2 f#4@2 a4", G: "a4@2 g4 f#4 g4 ~@3", H: "e4 f#4 g4 g4@2 d4 g4@2", I: "g4@2 f#4 ~",
  J: "f#4@3 g4@2 a4@3 a4@4 f#4@2 d4@2", K: "a4@3 a4@5", L: "a4@3 c5@3 f4 g4", M: "g4", N: "~@6 g4 a4", O: "a#4@3 a#4",
  P: "a#4@3 d5@3 g4@2", Q: "[a4@5 ~@2 f4]/2", R: "[d5@2 d5@3 ~@2 c5]/2", S: "[c5@3 a4 a4@8 ~@4]/2",
  T: "a#4 a4 g4 f4@3 d4@2", U: "f4", V: "e4@3 ~",
})).s("gm_french_horn").gain(0.3)

// other · trumpet · "Bb Trumpet"
const trumpet = note("<~@27 A B C D E F G@2 H@2 I@2 J K C K L ~@11>".pickRestart({
  A: "a4@3 a4@5", B: "a4@3 c5@3 f4 g4", C: "g4", D: "~@6 g4 a4", E: "a#4@3 a#4", F: "a#4@3 d5@3 g4@2",
  G: "[a4@5 ~@2 f4]/2", H: "[d5@2 d5@3 ~@2 c5]/2", I: "[c5@3 a4 a4@8 ~@4]/2", J: "a#4 a4 g4 f4@3 d4@2", K: "f4",
  L: "e4@3 ~",
})).s("gm_trumpet").gain(0.4)

// other · trombone
const trombone = note(`<
  ~@10 A B C D C E F G H I J K L M N C ~ O P F Q F R S T U C V F W X Y W Z ~@5 AA E AB AC AD ~
>`.pickRestart({
  A: "f#3@3 g3@5", B: "g#3", C: "a3", D: "d4@3 b3", E: "e3", F: "d3", G: "f#3 d4@3", H: "c#4 d4", I: "d4 c#4",
  J: "b3@2 c#4 d4", K: "d4", L: "e4", M: "d4@3 a3 a3@4", N: "c#4@3 b3@3 a3@2", O: "f3", P: "f3@3 c3", Q: "f3@3 e3",
  R: "d3@3 e3@3 g3@2", S: "a3 d4", T: "f4@3 c4", U: "a#3", V: "e3 d3", W: "c3", X: "a2", Y: "g2", Z: "b2@3 ~",
  AA: "f#3@3 d3@5", AB: "f#3@3 d3!2 ~@3", AC: "e3@3 g3", AD: "f#3",
})).s("gm_trombone").gain(0.25)

// other · bassoon
const bassoon = note(`<
  ~@10 A B C D C E F G H I J F E K L M ~ N O F P F Q R S T C U F V M W V X ~@5 Y E Z AA AB ~
>`.pickRestart({
  A: "f#3@3 g3@5", B: "g#3", C: "a3", D: "d4@3 b3", E: "e3", F: "d3", G: "a3 d3@3", H: "c#3 d3", I: "d3 c#3",
  J: "b2@2 c#3 d3", K: "d3@3 a3 a3@4", L: "c#3@3 b2@3 a2@2", M: "a2", N: "f3", O: "f3@3 c3", P: "f3@3 e3",
  Q: "d3@3 e3@3 g3@2", R: "a3 d4", S: "f4@3 c4", T: "a#3", U: "e3 d3", V: "c3", W: "g2", X: "b2@3 ~", Y: "f#3@3 d3@5",
  Z: "f#3@3 d3!2 ~@3", AA: "e3@3 g3", AB: "f#3",
})).s("gm_bassoon").gain(0.25)

// drums · rim
const rim = s("rim").struct("<~@27 [~ x!2 ~ x ~@3]!16 [~@2 x!2] ~@11>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@26 [~@14 x!2] [x ~@2 x ~ x!3]!16 [x!3 ~ x ~ x ~ x ~ x ~@5] ~@10 [~@14 x!2]>").gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@26 [~@12 x!2 ~@2] ~@16 [~@3 x] ~@10 [~@12 x!2 ~@2]>").gain(0.2)

stack(oboe, flute, alto_sax, tenor_sax, clarinet, bass, french_horn, trumpet, trombone, bassoon, rim, snare, snare_soft)