Strudelify
0:00/0:00
// by the rivers of babylon — Grantson Kwamina Bright and Grantson Emmanuel Junior. 26th December 2017 Bubiashie-Accra Ghana
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 4 "Flugelhorn" trumpet (copy of ch 2 "B♭ Trumpet" trumpet); ch 9 "E♭ Alto Horn" french horn (copy of ch 8 "Alto Saxophone" alto sax)
// note: Transcription provider: pdmx. https://musescore.com/score/5008210; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 103 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  ~@11 A B C D E F G H@2 B C D E F G I@2 J K L@4 F M ~ J K L@4 F M ~@2 C D C N F G O P ~@7 Q R S T U V W@2 A B C D E F G
  X ~@8 A B C D E F G X A B C D E F G X ~
>`.pickRestart({
  A: "~@2 g4!2 c5!2 d5@2", B: "e5@2 e5 e5@5", C: "~ g4 c5 d5", D: "e5", E: "~ e5 f5 e5", F: "d5", G: "~ d5!3 d5@2 e5@2",
  H: "[d5@3 c5@6 ~ g4!2 c5!2 d5@2]/2", I: "[d5@3 c5@6 ~@7]/2", J: "e5!3 d5 e5@2 d5@2", K: "e5@2 e5@3 ~ e5@4 ~@4 d5@2",
  L: "[c5@2 c5@3 ~ d5@2 c5@4 a4@2 c5@4 ~@8 g4@4 c5@4 c5@2 c5@2 c5@6 d5@2 e5@4 e5@4 ~@4 f5@2 e5@2 ~@2]/4", M: "c5",
  N: "e5!2 f5 e5", O: "~ g5!3 e5!2 d5!2", P: "c5 c5@4 ~@3", Q: "~@4 g5@2 g5 e5", R: "g5@2 ~@2 a5@2 g5 e5",
  S: "f5@2 ~ g5@2 g5!2 e5", T: "g5@2 g5@2 a5@2 g5 e5", U: "f5@2 ~@2 g5@2 g5 e5", V: "g5@3 g5!2 a5 g5 e5",
  W: "[f5@2 ~@2 g5@3 f5@2 e5@2 ~@5]/2", X: "d5@3 c5@4 ~",
})).s("gm_trumpet").gain(0.15)

// other · glockenspiel
const glockenspiel = note(`<
  ~@27 A B C D@4 E F A B C D@4 E F ~@18 G H I H J K@2 ~@9 L M N O P Q R M L M N O P Q R M L M N O P Q R ~
>`.pickRestart({
  A: "~@2 g6 c7 a6@2 g6@2", B: "e6!3 d6 e6@2 d6@2", C: "e6@2 e6@3 ~ e6@4 ~@4 d6@2",
  D: "[c6@2 c6@3 ~ d6@2 c6@4 a5@2 c6@4 ~@8 g5@4 c6@4 c6@2 c6@2 c6@6 d6@2 e6@4 e6@4 ~@4 f6@2 e6@2 ~@2]/4", E: "d6",
  F: "c6", G: "g6@2 ~@2 a6@2 g6 e6", H: "f6 ~@3", I: "g6@2 g6@2 a6@2 g6 e6", J: "g6@3 g6!2 a6 g6 e6",
  K: "[f6@2 ~@2 g6@3 f6@2 e6@2 ~@5]/2", L: "g7@2 g7 f7 e7@2 f7 g7", M: "~@2 g7 a7 g7 f7 e7 f7",
  N: "g7 ~ g7 f7 e7 ~ f7 g7", O: "~@2 g7 a7 g7 a7 g7 a7", P: "b7 ~ b7 a7 g7 ~ a7 b7", Q: "~@2 b7 a7 g7 a7 f7 g7",
  R: "e7 ~ g7 f7 e7 ~ f7 g7",
})).s("gm_glockenspiel").gain(0.48)

// other · trumpet · "B♭ Cornet"
const trumpet_2 = note(`<
  ~@12 A B C D E F G@2 A B C D E F G@2 H I J@4 K C ~ H I J@4 K C ~@2 L C L M E F N ~@9 O P Q P R S@2 ~ A B C D E F T ~@8
  B C B C D E F U B C B C D E F U ~
>`.pickRestart({
  A: "c5@2 c5 c5@3 ~@2", B: "~ a4 c5 b4", C: "c5", D: "~ c5 d5 c5", E: "b4", F: "~ b4!3 b4@2 c5@2",
  G: "[b4@3 g4@6 ~@7]/2", H: "g4!3 f4 e4@2 f4 f#4", I: "g4@2 g4@3 ~ g4@4 ~@4 e4@2",
  J: "[f4@2 f4@3 ~ g4@2 f4@4 f4@2 e4@4 ~@8 e4@4 e4@4 e4@2 e4@2 e4@6 d5@2 e5@4 e5@4 ~@4 f5@2 e5@2 ~@2]/4", K: "d5",
  L: "~ g4 c5 b4", M: "c5!2 d5 c5", N: "b4 g4", O: "e5@2 ~@2 f5@2 e5 c5", P: "d5 ~@3", Q: "e5@2 e5@2 f5@2 e5 c5",
  R: "e5@2 ~ e5!2 f5 e5 c5", S: "[d5@2 ~@2 e5@3 d5@2 c5@2 ~@5]/2", T: "b4@3 g4@4 ~", U: "b4@3 a4@4 ~",
})).s("gm_trumpet").gain(0.11)

// other · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  ~@12 A B C D E F G@2 A B C D E F G@2 H I J@4 K C ~ H I J@4 K C ~@2 L C L M E F N ~@9 O P Q P R S@2 ~ A B C D E F T ~@8
  B C B C D E F T B C B C D E F T ~
>`.pickRestart({
  A: "c4@2 c4 c4@3 ~@2", B: "~ a3 c4 b3", C: "c4", D: "~ c4 d4 c4", E: "b3", F: "~ b3!3 b3@2 c4@2",
  G: "[b3@3 g3@6 ~@7]/2", H: "e4!3 d4 e4@2 d4@2", I: "e4@2 e4@3 ~ e4@4 ~@4 d4@2",
  J: "[c4@2 c4@3 ~ d4@2 c4@4 a3@2 c4@4 ~@8 g3@4 c4@4 c4@2 c4@2 c4@6 d4@2 e4@4 e4@4 ~@4 f4@2 e4@2 ~@2]/4", K: "d4",
  L: "~ g3 c4 b3", M: "c4!2 d4 c4", N: "b3 g3", O: "e4@2 ~@2 f4@2 e4 c4", P: "d4 ~@3", Q: "e4@2 e4@2 f4@2 e4 c4",
  R: "e4@2 ~ e4!2 f4 e4 c4", S: "[d4@2 ~@2 e4@3 d4@2 c4@2 ~@5]/2", T: "b3@3 g3@4 ~",
})).s("gm_alto_sax").gain(0.39)

// bass · tuba · "Euphonium"
const bass = note(`<
  A ~@2 B C B C D E F G@2 H@3 I J K L@2 H@3 I J K L@2 H@2 M H@2 L N L@2 H@2 M H@2 L N L@2 B C B C D E F O@2 P Q R S T
  U@2 ~ P Q R S T U@2 ~ L@4 V N W B C B C D E F X ~ L@4 V N W ~ L@4 V N W A
>`.pickRestart({
  A: "~@2 c4 g3 a3 f3 g3 c3", B: "~ g2 c3 d3", C: "e3", D: "~ e3 f3 e3", E: "d3", F: "~ d3!3 d3@2 e3@2",
  G: "[d3@3 c3@6 ~@7]/2", H: "c3@2 g2@2 c3 e3 g2 b2", I: "c3@2 g2@2 d3 f3 a2 c3", J: "d3@2 d3@2 d3 f3 a2 c3",
  K: "d3@2 d3@2 g2!2 a2 b2", L: "c3!2 a2 g2 c3!2 a2 g2", M: "f2!2 a2 c3 f2 ~ a2 b2", N: "g2!2 d2!2 g2!2 a2 b2",
  O: "[d3@3 c3@6 ~@3 g2@2 g2@2]/2", P: "c3@2 ~@2 c3@2 c3 f2", Q: "g2@2 ~ g2@2 g2!3", R: "c3@2 c3@2 c3@2 c3 f2",
  S: "g2 ~ g2!2", T: "c3@3 c3 c3@3 f2", U: "[g2@2 ~@2 g2@3 f2@2 e2@2 ~@5]/2", V: "g2!2 d2!2 g2!2 d2!2",
  W: "c3!2 a2 g2 c3!2 a2 ~", X: "d3@3 c3@5",
})).s("gm_tuba").gain(0.47)

// bass · tuba · "B♭ Tuba"
const bass_2 = note(`<
  A ~@3 B ~ C ~ B ~ D@2 E@4 F G E@6 F G E@4 H E@3 G E@4 H E@3 G E@2 I C I C J K L M@2 N O P Q R S@2 ~ N O P Q R S@2 ~
  E@4 F G T I C I C J K L U ~ E@4 F G T ~ E@4 F G T V
>`.pickRestart({
  A: "~@2 c3 g2 a2 f2 g2 c2", B: "g2", C: "e3", D: "[~@3 c2@6 ~@7]/2", E: "c3!2 a2 g2 c3!2 a2 g2",
  F: "g2!2 d2!2 g2!2 d2!2", G: "g2!2 d2!2 g2!2 a2 b2", H: "f2!2 a2 c3 f2 ~ a2 b2", I: "~ g2 c3 d3", J: "~ e3 f3 e3",
  K: "d3", L: "~ d3!3 d3@2 e3@2", M: "[d3@3 c3@6 ~@3 g2@2 g2@2]/2", N: "c3@2 ~@2 c3@2 c3 f2", O: "g2@2 ~ g2@2 g2!3",
  P: "c3@2 c3@2 c3@2 c3 f2", Q: "g2 ~ g2!2", R: "c3@3 c3 c3@3 f2", S: "[g2@2 ~@2 g2@3 f2@2 e2@2 ~@5]/2",
  T: "c3!2 a2 g2 c3!2 a2 ~", U: "d3@3 c3@5", V: "~@2 c4 g3 a3 f3 g3 c3",
})).s("gm_tuba").gain(0.26)

// bass · tuba · "Sousaphone"
const bass_3 = note(`<
  A ~@3 B ~ B ~ C ~ D@2 E@4 F G E@6 F G E@4 H E@3 G E@4 H E@3 G E@2 I J I J K L M N@2 O P Q R S T@2 ~ O P Q R S T@2 ~
  E@4 F G U I J I J K L M V ~ E@4 F G U ~ E@4 F G U W
>`.pickRestart({
  A: "~@2 c3 g2 a2 f2 g2 c2", B: "c2", C: "b2", D: "[~@3 c2@6 ~@7]/2", E: "c2!2 a1 g1 c2!2 a1 g1",
  F: "g1!2 d1!2 g1!2 d1!2", G: "g1!2 d1!2 g1!2 a1 b1", H: "f1!2 a1 c2 f1 ~ a1 b1", I: "~ g1 c2 d2", J: "e2",
  K: "~ e2 f2 e2", L: "d2", M: "~ d2!3 d2@2 e2@2", N: "[d2@3 c2@6 ~@3 g1@2 g1@2]/2", O: "c2@2 ~@2 c2@2 c2 f1",
  P: "g1@2 ~ g1@2 g1!3", Q: "c2@2 c2@2 c2@2 c2 f1", R: "g1 ~ g1!2", S: "c2@3 c2 c2@3 f1",
  T: "[g1@2 ~@2 g1@3 f1@2 e1@2 ~@5]/2", U: "c2!2 a1 g1 c2!2 a1 ~", V: "d2@3 c2@5", W: "~@2 c4 g3 a3 f3 g3 c3",
})).s("gm_tuba").gain(0.12)

// drums · kick
const kick = s("bd").struct("<~@2 A B ~@8 A@43 B ~@6 C D B D B D B D ~ A@7 ~@9 A@7 ~ A@7 ~>".pickRestart({
  A: "x!4", B: "x", C: "x!2", D: "x!2 ~@6",
})).gain(0.48)

// drums · rim
const rim = s("rim").struct(`<
  ~@3 A B@7 A C D E B A B E ~ C D E B A B E ~ C D E B A B E ~@2 C D E B A B E ~@4 E@7 B@6 A B E@7 ~ C D E B A B C@11 D E
  B A B E C@2 D E B A B E ~
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~@4 x ~@2 x ~ x ~@2 x ~@3", D: "x!2 ~ x", E: "~@4 x ~@2 x ~ x ~@2 x ~ x ~",
})).gain(0.48)

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A B C@7 D E ~ F G D ~ F ~ E ~ F G D ~ F ~ E ~ F G D ~ F H ~ E ~ F G D ~ F H ~ H ~ F@7 ~@8 F@7 ~ E ~ F G D ~ F@10 E
  ~ F G D ~ F@2 E ~ F G D ~ F ~
>`.pickRestart({
  A: "x!16", B: "x", C: "x!4 ~@12", D: "x!11 ~@5", E: "x!4 ~@2 x ~@3 x ~@3 x ~", F: "x!4 ~@2 x ~@3 x ~@5", G: "x!2 ~@6",
  H: "x!11 ~ x ~@3",
})).gain(0.48)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@11 A ~@2 A ~ A B ~ B ~@2 A ~ A B ~@2 C ~ C B D ~ B@2 ~ C ~ C B D ~ B@2 ~@9 A ~@15 B ~@2 B ~ A B ~@2 B ~ B ~@5 C ~ C
  B D ~ B ~ C ~ C B D ~ B ~
>`.pickRestart({
  A: "~@8 x!8", B: "~@8 x!4 ~@4", C: "~ x", D: "~@2 x!2 ~@12",
})).gain(0.48)

// drums · whistle
const whistle = s("ballwhistle:0").struct(`<
  ~@11 A ~@2 A ~ A B C A ~@2 A ~ A B C ~@4 A D ~ A@2 ~@4 A D ~ A@2 ~@9 A ~@15 A ~@2 A ~ A B C ~ A ~ A ~@8 A D ~ A ~@4 A
  D ~ A ~
>`.pickRestart({
  A: "~@4 x!4 ~@8", B: "~@12 x!4", C: "x", D: "~@4 x!5 ~@7",
})).gain(0.62)

// drums · guiro
const guiro = s("guiro:0").struct("<~@17 x ~@7 x ~@50 x ~@26>").gain(10.14)

// drums · claves
const claves = s("clave:2").struct(`<
  ~@17 A B ~@6 A B ~@2 C ~@3 C ~@4 C ~@3 C ~@19 C ~ C ~ C ~ C ~@7 A ~@11 C ~@3 C ~@3 C ~@3 C ~@2
>`.pickRestart({
  A: "~ x ~@2", B: "~@7 x", C: "~@3 x ~@3 x",
})).gain(2.35)

stack(
  trumpet, glockenspiel, trumpet_2, alto_sax, bass, bass_2, bass_3, kick, rim, snare, high_tom, whistle, guiro, claves
)