Strudelify

Roots By Imagine Dragons

Jeron Lau

KeyG minorTempo170 bpm
0:00/0:00
// Roots By Imagine Dragons — Jeron Lau
// 170 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/1270486; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 112 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(170/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 · clarinet · "B♭ Clarinet"
const clarinet = note(`<
  A@2 B@2 C D E F E G H@3 ~ E F E G H@3 ~ I@3 J K@3 ~ I@3 J K@3 L M N E F E G H@3 ~ E F E G H@3 ~ I@3 J K@3 ~ I@3 J K@3
  ~@17 O P O P Q P ~ I@3 J K@3 ~ I@3 J R@2 ~@3
>`.pickRestart({
  A: "g4@2 ~ g4 g4@2 g4@2", B: "eb4@2 ~ eb4 eb4@2 eb4@2", C: "c4@2 ~ c4 c4@2 c4@2", D: "c5@2 ~ c5 d5@2 d5@2",
  E: "~@2 c5@3 c5@3", F: "c5@3 bb4@3 c5@2", G: "c5@3 bb4@3 d5 eb5", H: "~@2 d5 eb5 ~@4", I: "~ g4!3 bb4@2 a4@2",
  J: "~ g4!3 bb4@2 f5@2", K: "[eb5@3 ~ g4@4 g4@2 bb4@4 a4@6 g4@4 g4@2 bb4@4 a4@6 ~@12]/3", L: "d5", M: "g4", N: "bb4",
  O: "~ c4 bb3 ~@2 bb3 ~ bb3", P: "eb4@2 g4 ~ g4@4", Q: "~ bb3 ab3 ~@2 ab3 ~@2",
  R: "[eb5@2 g4@2 g4 bb4@2 a4@3 g4@2 g4 bb4@2 a4]/2",
})).s("gm_clarinet").gain(0.3)

// other · clarinet · "B♭ Clarinet" · soft notes
const clarinet_soft = note("<~@72 A B C D E F G H A B C D F I J ~@25>".pickRestart({
  A: "g4 d5", B: "bb4 d4", C: "g4 bb4", D: "bb5", E: "eb5", F: "c6", G: "eb6", H: "d5",
  I: "c6@3 b5@3 bb5@3 ~ a5@3 ab5@3", J: "g5",
})).s("gm_clarinet").gain(0.2)

// other · french horn
const french_horn = note(`<
  A@2 B A@2 C D E D F G@3 ~ H I H F G@3 ~ J K L M N O P ~ J K L M N O P Q A@2 D E D F G@3 ~ H I H F G@3 ~ J K L M N O P
  ~ J K L M N O P ~ R S T S U V@2 W R S T S U X Y W A Z A Z A Z ~ J K L M N O P ~ J K L M N O P AA ~
>`.pickRestart({
  A: "g3 ~ g3 ~ g3 ~ g3 ~", B: "bb3 ~ bb3 ~ bb3 ~ bb3 ~", C: "g3 ~ g3 ~ gb3 ~ gb3 ~", D: "~@2 d5 c5@2 d5 c5@2",
  E: "d5 c5@2 bb4@3 g4@2", F: "bb4 a4@2 g4@3 a4 g4", G: "~@2 a4 g4 ~@4", H: "~@2 d5@2 c5 d5@2 c5",
  I: "d5@2 c5 bb4@3 g4@2", J: "d4 g3", K: "d4 g4", L: "bb4 d4", M: "g4 bb4", N: "g4 eb4", O: "c5 g4", P: "g3 eb4",
  Q: "gb4 a4", R: "~@3 bb3!5", S: "c4@2 d4@2 d4 c4 bb3@2", T: "bb3 a3@3 bb3!4", U: "bb3 a3@3 ~@4",
  V: "[d4 c4@2 bb3@3 c4@3 ~@7]/2", W: "g4 g4@2 bb4@3 g4@2", X: "d4 c4@2 bb3@3 c4@2",
  Y: "[bb3,b3,c4] [f3,gb3,g3,ab3,a3] [eb3,e3] ~@13, ~ d3@6 ~", Z: "eb4@2 g4 ~ g4@4", AA: "~ d5!6 g4",
})).s("gm_french_horn").gain(0.3)

// other · oboe
const oboe = note(`<
  A B C D C E F G H I J@2 K J F G H I J@2 K ~ L A B A M A M ~ L A B A M A M N O@2 F G H I J@2 K J F G H I J@2 K ~ L A B
  A M A M ~ L A B A M A M ~ B P Q R S T U M B P Q R S T U ~ V W V W V W ~ L A B A M A M ~ X@3 Y Z@2 M ~@2
>`.pickRestart({
  A: "g4", B: "bb4", C: "eb5", D: "c5", E: "c5 gb5", F: "g4 ~", G: "d4 g4", H: "g4 bb3", I: "d4@4 g4@2 d5 c5",
  J: "~@6 d5 c5", K: "c4 eb4", L: "d4", M: "eb4", N: "gb4 a4", O: "f4 ~ f4 ~ f4 ~ f4 ~", P: "d5", Q: "g5", R: "d5 g4",
  S: "eb5 bb4", T: "eb5 g4", U: "c4 g4", V: "c5 bb4 a4 g4 c4 ~@3", W: "eb4@2 g4 ~ g4@4", X: "~ g4!3 bb4@2 a4@2",
  Y: "~ g4!3 bb4@2 f5@2", Z: "[eb5@2 g4@2 g4 bb4@2 a4@3 g4@2 g4 bb4@2 a4]/2",
})).s("gm_oboe").gain(0.25)

// other · electric guitar clean · "Electric Guitar [Tablature]"
const electric_guitar_clean = note(`<
  A@3 B@2 C D@7 ~ A@7 ~ B@7 ~ B@7 ~ D@9 ~ D@7 ~ E@3 F G@3 ~ E@3 F G@3 ~ H I@2 H@2 I@2 ~ H I J K@2 L I ~ M N M N O A ~ P
  ~ P ~ P ~ P ~ Q ~ Q ~ Q ~ Q ~ R
>`.pickRestart({
  A: "bb3 ~ bb3 ~ bb3 ~ bb3 ~", B: "c4 ~ c4 ~ c4 ~ c4 ~", C: "c4 ~ c4 ~ a3 ~ a3 ~", D: "g3 ~ g3 ~ g3 ~ g3 ~",
  E: "~ g3!3 bb3@2 a3@2", F: "~ g3!3 bb3@2 f4@2", G: "[eb4@3 ~ g3@4 g3@2 bb3@8 g3@4 g3@2 bb3@4 a3@6 ~@14]/3",
  H: "~ [bb3,eb4]@15, g3", I: "~ [bb3,d4]@15, g3", J: "~ [bb3,e4]@15, d3", K: "~ [bb3,e4]@15, db3",
  L: "~ [bb3,eb4]@15, d3", M: "c3!3 ~@2 c3 ~ c3", N: "bb3@2 c4 ~ c4@4", O: "bb2!3 ~@2 bb2 ~ bb2",
  P: "[g3,bb3,d4] [g3,bb3,d4]@3", Q: "~ [g3,bb3]@15, d4", R: "[g3,bb3,d4]",
})).s("gm_electric_guitar_clean").gain(0.4)

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

// drums · rim · soft notes
const rim_soft = s("rim").struct("<~@88 A B A B A B A C@7 ~@10>".pickRestart({
  A: "~@3 x ~ x ~@2", B: "x", C: "~ x",
})).gain(0.25)

// drums · snare
const snare = s("sd").struct(`<
  A B A B A B A B A B A B A C D E D E D E D C E D E D E D@2 C E D E D E D@2 C F B A B A B A B A C D E D E D E D C E D E
  D E D@2 C E D E D E D@2 ~@39 C ~
>`.pickRestart({
  A: "x ~@2 x", B: "~ x ~@2 x ~@3", C: "x", D: "x ~@2 x ~@3 x", E: "~@2 x ~@3 x ~@5 x!4", F: "~@3 x",
})).gain(0.5)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@88 A B A B A B A C D C D C D@2 ~ E@7 ~@2>".pickRestart({
  A: "x ~@2 x", B: "~@4 x ~ x ~ x!5 ~@3", C: "~@2 x ~@3 x ~@5 x!4", D: "x ~@2 x ~@3 x", E: "x ~@5 x!7 ~@3",
})).gain(0.25)

stack(clarinet, clarinet_soft, french_horn, oboe, electric_guitar_clean, rim, rim_soft, snare, snare_soft)