Strudelify

Nut Rocker

Bumble B

KeyG majorTempo203 bpm
0:00/0:00
// Nut Rocker — Bumble B
// 203 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 98 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(203/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.

// chords · piano
const piano = note(`<
  A@6 B@4 C@5 D E F@4 G H G H G H G H I J K L J L M N G H G H G H G H I J K L J L M N F@4 O P Q R S T U V W X Y Z AA AB
  AC AD ~@4 AE AF AG AH AE AF AG AH AI AJ AK AL AM AN G H S T AO@3
>`.pickRestart({
  A: "[~@10 g3@2 g3@30 ~ e3@2 e3@28 g3@3 ~ g3@19]/6",
  B: "[~@10 e3@3 ~ e3@30 ~@2 [d5,g5]@4 ~@4 [d5,g5] ~@2 [d5,g5] ~@2 [d5,g5] ~ [e5,g5]@2]/4", // G5 Em
  C: "[~@6 [e5,g5]@4 ~@5 [f#5,b5]@6 ~@2 [d5,g5]@6 ~@2 [e5,g5]@16 [d5,g5]@4 ~@4 [d5,g5] ~@2 [d5,g5] ~@2 [d5,g5] ~ [e5,g5]@4 ~@4 [e5,g5]@4 ~@5]/5", // Em B5 G5 Em G5 Em
  D: "[f#5,b5]@3 ~ [d5,g5]@3 ~", E: "[e5,g5]", F: "g3!8",
  G: "~@2 [d5,g5] ~ [d5,g5] ~ [d5,g5] ~ [e5,g5] ~ [e5,g5] ~@3 [e5,g5] ~", // G5 Em
  H: "[d5,g5] ~ [d5,g5] ~ [d5,g5] ~ [e5,g5]@2 ~@8", I: "[c5,c6]@3 [d5,d6] [c5,c6]@2 [b4,b5]@2",
  J: "[a4,a5] [g4,g5] [f#4,f#5] [a4,a5]", K: "[b4,b5]@3 [c5,c6] [b4,b5]@2 [a4,a5]@2",
  L: "[g4,g5] [f#4,f#5] [e4,e5] [b4,b5]", M: "[c5,c6] [b4,b5] [a4,a5] [g4,g5]", N: "[f#4,f#5] [e4,e5] [d4,d5] ~",
  O: "~ [a#5,c#6] [b5,d6] g5 [a#5,c#6] [b5,d6] g5 [a#5,c#6]", P: "[b5,d6] g5 [a#5,c#6] [b5,d6] ~@4",
  Q: "~ [a#4,c#5] [b4,d5] g4 [a#4,c#5] [b4,d5] g4 [a#4,c#5]", R: "[b4,d5] g4 [a#4,c#5] [b4,d5] ~@4",
  S: "~ [a#3,c#4] [b3,d4] g3 [a#3,c#4] [b3,d4] g3 [a#3,c#4]", T: "[b3,d4] g3 [a#3,c#4] [b3,d4] g3 [a#3,c#4] [b3,d4] g3",
  U: "[a#3,c#4] [b3,d4] g3 [a#3,c#4] [b3,d4] g3 [a#3,c#4] [b3,d4]", V: "g3 [a#3,c#4] [b3,d4] g3 [a#3,c#4] [b3,d4] ~@2",
  W: "[a3,c4,e4]@7 ~", X: "[a3,d4]@2 ~ [a3,d4]@2 ~ [a3,d4] ~", Y: "[b3,d#4]@3 [b3,d#4]@2 ~ [b3,d#4] ~",
  Z: "[g3,b3,e4]@5 ~ [g3,b3,e4]@4 g3@2 [g3,b3,e4]@2 ~@2", AA: "[b3,d#4]@5 ~ [b3,d#4]@4 ~@2 [b3,d#4]@2 ~@2",
  AB: "[g3,b3,e4]@5 ~ [g3,b3,e4]@5 ~ [g3,b3,e4]@2 ~@2", AC: "[a3,c4,e4]@6 [a3,c4,e4]@5 ~ [a3,c4,e4]@2 ~@2",
  AD: "[a3,d4]@5 ~ [a3,d4]@5 ~ [a3,d4]@4", // D5
  AE: "[d5,g5,b5,d6]@6 ~@2 [d5,g5,b5,d6] ~@2 [d5,g5,b5,d6] ~ [d5,g5,b5,d6] ~@2", // G
  AF: "[e5,g5,b5,e6]@3 ~ [e5,g5,b5,e6]@3 ~", AG: "[f#5,b5,d6,f#6]@3 ~ [d5,g5,b5,d6]@3 ~", AH: "[e5,g5,b5,e6]@7 ~",
  AI: "[d6,g6,b6,d7]@6 ~@2 [d6,g6,b6,d7] ~@2 [d6,g6,b6,d7] ~ [d6,g6,b6,d7] ~@2", // G
  AJ: "[e6,g6,b6,e7]@3 ~ [e6,g6,b6,e7]@3 ~", AK: "[f#6,b6,d7,f#7]@3 ~ [d6,g6,b6,d7]@3 ~", AL: "[e6,g6,b6,e7]@7 ~",
  AM: "~@2 [d6,g6] ~ [d6,g6] ~ [d6,g6] ~ [e6,g6] ~ [e6,g6] ~@3 [e6,g6] ~", // G5 Em
  AN: "[d6,g6] ~ [d6,g6] ~ [d6,g6] ~ [e6,g6]@2 ~@8", // G5 Em
  AO: "[~@42 d5 [e5,f#5] [g4,b4,d5,g5]@3 ~, b3@32 ~@6 [b3,c4]@3 [a4,b4] c5@2 ~@4, d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@2 d4@3 [d4,e4]@5 ~@4, ~ g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 g3@2 [g3,a3]@7 ~@4, ~@10 [f4,g4] ~]/3", // Esus2 G Cmaj7 Asus2 Dsus2 Gsus2 Fsus2
})).s("gm_piano").gain(0.5).pan(0.7)

// bass · electric bass finger
const bass = note("<~@29 A B C D C D A B ~@8 A B C D C E A B ~@12 A B F D C D A B ~@6 G H I J@7 ~@8 K>".pickRestart({
  A: "a1 a2 a1 a2 a1 a2 a1 a2", B: "d2 d3 d2 d3 d2 d3 d2 d3", C: "b1 b2 b1 b2 b1 b2 b1 b2",
  D: "e2 e3 e2 e3 e2 e3 e2 e3", E: "e2 e3 e2 e3 e2 e3 ~ e3, ~@3 e2", F: "[a1,b1] b2 b1 b2 b1 b2 b1 b2",
  G: "~@4 e1 ~ d1 ~", H: "g1 ~ f#1 ~ e1 ~ d1 ~", I: "g1 ~ f#1 ~ e1 ~ d1 d2", J: "g1 g2 f#1 f#2 e1 e2 d1 d2",
  K: "~@6 g1 ~",
})).s("gm_electric_bass_finger").gain(0.4)

// bass · electric bass finger · soft notes
const bass_soft = note(`<
  ~@77
  [g1 g2 f#1 f#2 e1 e2 d1 d2]!2
  [g1 g2 f#1 f#2 ~ e2 ~ d2]
  [~ g2 ~ f#2 ~ e2 ~ d2]
  [~ g2 ~ f#2 ~ e2 ~@2]
  ~@16
>`).s("gm_electric_bass_finger").gain(0.2)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note("<~@29 A B C D C D E F ~@8 A B C D C D E F ~@44 G>".pickRestart({
  A: "[c4,e4,g4]", B: "[c4,d4,f#4]", C: "[b3,d#4,f#4]", D: "[b3,e4,g4]", E: "[c4,e4,a4]", F: "d4 e4 d4@2, [c4,f#4]",
  G: "~@12 [b3,d4,g4] ~@3", // G
})).s("gm_acoustic_guitar_nylon").gain(0.4)

// chords · lead 5 charang
const lead_5_charang = note("<~@65 A B C D E F G H ~@25>".pickRestart({
  A: "c5!2 d5 c5@2 a4 g4@2", B: "f#4@2 f4 f#4@2 ~@3", C: "~@2 f#4@2 g4@2 a4@2 b4 [c5,d5] c5@2 b4@2 a4@2",
  D: "g4@2 a4 b4 ~@4", E: "d#4 f#4 d#4 f#4", F: "e4@2 f#4 g4@2 a4 b4@2",
  G: "c5@4 a4 e4 [e4,a4,c5] ~ [e4,a4,c5] ~ [e4,a4,c5] ~ [e4,a4,c5]@4, ~@2 c5 ~@5", // Am
  H: "[f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5] ~ [f#4,a4,d5]@4 [f#4,a4,d5]@2 [f#4,a4,d5]@2 ~@2", // D
})).s("gm_lead_5_charang").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@20 A B A B A ~@4 C@8 B A B A ~@4 C@8 ~@4 B A B A B ~@3 C@24 B A B A B ~ B ~ D
>`.pickRestart({
  A: "~@5 x!3", B: "x", C: "x!4", D: "~@3 x",
})).gain(0.35)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@11 A B ~@3 C ~@60 D@2 E ~@15 F ~@2>".pickRestart({
  A: "~@15 x", B: "x!8 ~@8", C: "x!7 ~@9", D: "~ x ~ x ~ x ~ x", E: "~@7 x", F: "x",
})).gain(0.15)

// drums · low tom
const low_tom = s("lt").struct("<~@20 A B A B A ~@11 C B A B A ~@11 C ~@4 B A B A B ~@27 B A B A B ~@4>".pickRestart({
  A: "~@5 x!3", B: "x", C: "~@5 x ~ x",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@73 [x!8]!4 ~@21>").gain(0.35)

stack(piano, bass, bass_soft, acoustic_guitar_nylon, lead_5_charang, kick, snare, snare_soft, low_tom, ride)