Strudelify

MMM Bop

Hanson

KeyA majorTempo110 bpm
0:00/0:00
// MMM Bop — Hanson
// 110 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 27, guitar program 29, guitar program 29.
setcpm(110/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.

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A@8 B@4 C D C D E@8 F G H I F G H I J K J K J K J K J K J K F G H I F G H I J K J K J K J K F G H I F G H I J K J K J
  K J K J K J K L M L I L M L I F G H I F G H I F G H I F G H I ~
>`.pickRestart({
  A: "[a2@2 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 b2@2 g#2 a2@3 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 b2@2 g#2 a2@3 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2]/8",
  B: "[~@2 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 c#3@2 g#2 ~]/4",
  C: "[a2,c#3]@4 [a2,c#3] ~@3 [a2,c#3] ~ [g#2,b2]@2 [g#2,b2] ~@3", // A G#m
  D: "~@2 [d3,f#3]@2 ~@4 [d3,f#3] ~ [b2,e3]@2 [b2,e3] ~@3", // D E5
  E: "[a2@2 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 e3@2 c#3@2 a2 g#2@3 e3@2 c#3@2 g#2 a2@3 f#3@2 d3@2 a2 g#2@3 e3@2 c#3@2 g#2 ~]/8",
  F: "[a2,c#3,e3]@4 [a2,c#3,e3]@2 ~@4 [a2,c#3,e3]@2 ~ [a2,c#3,e3]@2 ~", // A
  G: "[f#2,a2,d3]@4 [f#2,a2,d3]@2 ~@2 [f#2,a2,d3]@4 ~ [f#2,a2,d3]@2 ~", // D
  H: "[a2,c#3,e3]@2 [a2,c#3,e3] ~@2 [a2,c#3,e3] ~ [a2,c#3,e3]", I: "[g#2,b2,e3] ~",
  J: "[a2,c#3]@4 [a2,c#3]@3 [a2,c#3]@2 [g#2,b2]@3 [g#2,b2]@2 ~@2", // A G#m
  K: "[d3,f#3]@4 [d3,f#3]@3 [d3,f#3]@2 [c#3,e3]@3 [c#3,e3]@2 ~@2", L: "[a2,c#3,e3]@2 [a2,c#3,e3] ~@5",
  M: "[f#2,a2,d3]@2 [f#2,a2,d3] ~@5", // D
})).s("gm_electric_guitar_clean").gain(0.36).pan(0.1)

// bass · electric bass finger · "Bass"
const bass = note(`<
  A ~@3 B C B C B C B C B C B C B C B C B C B C D E D F D E D G B C B C B C B C B C B C D E D F D E D G B C B C B C B C
  D E D F D E D G B C B C B C B C B C B C H I H F H I H F D E D F D E D G D E D F D E D G ~
>`.pickRestart({
  A: "a2 ~@3", B: "a1@4 a1@4 e2@2 e2@5 ~", C: "d2@4 d2@4 e2@2 e2@5 ~", D: "a1@4 a1@2 ~@4 a1@2 ~ a1@2 ~",
  E: "d2@4 d2@2 ~@2 d2@2 ~@3 d2@2 ~", F: "e1 g#1 a1 b1 e1 d#1 d1 c1", G: "e1@2 d2@2 b1!3 ~", H: "a1@2 a1 ~@5",
  I: "d2@2 d2 ~@5",
})).s("gm_electric_bass_finger").gain(0.48)

// other · overdriven guitar
const overdriven_guitar = note(`<
  ~@12 A B A B ~@8 C D C E C D C E ~@12 C D C E C D C E ~@8 C D C E C D C E ~@12 F G F E F G F E C D C E C D C E C D C E
  C D C E ~
>`.pickRestart({
  A: "[a2,c#3]@4 [a2,c#3]@2 ~ [a2,c#3]@2 [g#2,b2]@3 [g#2,b2]@3 ~", // A G#m
  B: "~@2 [d3,f#3]@2 d3@2 ~ [d3,f#3]@2 [b2,e3]@3 [b2,e3]@2 ~@2", C: "a2@2 a2 ~@2 a2 ~ a2",
  D: "d3@4 d3@2 ~@4 d3@2 ~ d3@2 ~", E: "g#2 ~@3", F: "a2@2 a2 ~@5", G: "d3@2 d3 ~@5",
})).s("gm_overdriven_guitar").gain(0.25)

// other · lead 2 sawtooth · "Isaak"
const lead_2_sawtooth = note(`<
  ~@14 A ~@2 B@2 C D@2 E F G H G I G H G I ~@5 J@3 K@2 ~ L G H G I G H G I M ~ M N@3 ~@2 G H G I G H G I O ~ P Q@2 R S
  T@2 ~@3 U V U I U V U I G H G I G H G I G H G I G H G I ~
>`.pickRestart({
  A: "~ b3 a3@2 ~@4", B: "[~@4 d3@2 d3 d3@2 d3!5 c#3 a2@5 ~@12]/2", C: "~@6 e3!2 f#3 a3 c#4@6",
  D: "[b3@2 a3@2 c#4@8 b3@2 a3@5 b3@2 ~ e3!2 f#3 a3@2 c#4@5]/2", E: "b3@2 a3@3 a3@3 ~@8", F: "~@3 e3 c#4@2 b3 ~",
  G: "a3@4 a3@2 ~@4 a3 ~@3 a3 ~", H: "f#3@4 f#3@2 ~@2 d4!2 c#4 ~@2 b3 ~@2", I: "g#3 ~@3",
  J: "[~@6 e3!2 a3@2 a3!2 a3@2 c#4 c#4@4 ~@2 a3@2 e4@3 c#4 e4@2 c#4@2 a3@3 ~@14]/3", K: "[a3@12 g#3@3 f#3@3 ~@14]/2",
  L: "~@4 f#3 a3 ~@2 c#4@4 b3@4", M: "~@4 e4@2 e4 e4@2 e4 ~ e4 d4@4", N: "[~@15 a3@13 g#3@2 f#3@4 ~@14]/3",
  O: "~@4 e4@2 e4 e4@2 f#4@2 ~@5", P: "~@4 e4@2 e4 e4@2 ~@7",
  Q: "[~@4 e4@2 e4 e4@2 e4 e4@2 e4@3 e4@3 ~@2 e4@2 e4 e4@2 f#4@2 ~@2 a3@2 a3]/2", R: "c#4@2 e4@2 e4@3 c#4@5 b3@3 ~",
  S: "~@4 a3@2 a3 a3@2 e3@2 ~ a3!4", T: "[c#4@2 e4@4 c#4@6 b3@3 c#4@4 ~@13]/2", U: "a3@2 a3 ~@5", V: "f#3@2 f#3 ~@5",
})).s("gm_lead_2_sawtooth").gain(0.4).pan(0.6)

// other · lead 1 square · "Zac"
const lead_1_square = note(`<
  ~@24 A B A C A B A C ~@8 D@2 ~ E A B A C A B A C ~@3 F@3 ~@2 A B A C A B A C ~@7 G@3 H I J K J C J L J M A B A C A N A
  C A B A C A B A C ~
>`.pickRestart({
  A: "c#5@4 c#5@2 ~@4 c#5 ~@3 c#5 ~", B: "a4@4 a4@2 ~@2 d5!2 c#5 ~@2 b4 ~@2", C: "b4@3 ~@13",
  D: "[a4@12 g#4@3 f#4@3 ~@14]/2", E: "~@4 f#4 a4 ~@2 c#5@4 b4@4", F: "[~@11 b4 c#5@3 c#5@13 b4@2 a4@4 ~@14]/3",
  G: "[~@15 c#5@13 b4@3 a4@2 ~@15]/3", H: "~@6 a5 a5@2 b5@2 c#6@2 ~@2 a5", I: "a5@2 b5@2 c#6@3 d6 c#6@4 b5@4",
  J: "c#5@2 c#5 ~@5", K: "a4@2 a4 ~@5", L: "a4@2 a4 ~ f#5 a5 c#6 b5", M: "b4@3 ~@5 e6@2 e6@2 c#6@2 b5@2",
  N: "a4@4 a5@4 b5!2 a5@2 b5@2 a5@2",
})).s("gm_lead_1_square").gain(0.48).pan(0.8)

// chords · drawbar organ · "Keyboards"
const drawbar_organ = note(`<
  ~@16 A B A B A B A B C D E F C D E F A B A B A B A B A B A B C D E F C D E F A B A B A B A B C D E F C D E F A B A B A
  B A B A B A B G H G F G H G F C D E F C D E F C D E F C D E F ~
>`.pickRestart({
  A: "[a5,c#6] [g#5,b5]", B: "[f#5,a5] [g#5,b5]", C: "[c#5,e5,a5]@2 [c#5,e5,a5] ~@2 [c#5,e5,a5]@2 [c#5,e5,a5]",
  D: "[d5,f#5,a5]@4 [d5,f#5,a5]@2 ~@2 [f#5,a5,d6]@2 ~@3 [f#5,a5,d6]@2 ~", // D
  E: "[c#5,e5,a5]@2 [c#5,e5,a5] ~@2 [c#5,e5,a5] ~ [c#5,e5,a5]", F: "[e5,g#5,b5]@3 ~",
  G: "[c#5,e5,a5]@2 [c#5,e5,a5] ~@5", H: "[d5,f#5,a5]@2 [d5,f#5,a5] ~@5",
})).s("gm_drawbar_organ").gain(0.25).pan(0.7)

// chords · overdriven guitar
const overdriven_guitar_2 = note(`<
  ~@33 A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~@25
>`.pickRestart({
  A: "~@9 b2@3 b2@2 ~@2",
})).s("gm_overdriven_guitar").gain(0.44).pan(0.1)

// drums · kick
const kick = s("bd").struct("<[x ~ x ~@4 x ~ x!3 ~@3 x]!104 ~>").gain(0.57)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@24 A@5 B A@2 ~@12 A@5 B A@2 ~@8 A@5 B A@2 ~@12 A@13 B A@7 B A@2 ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.29)

// drums · hihat
const hihat = s("hh").struct("<[~@2 x!6]!104 ~>").gain(0.57)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 [~@11 x ~@4] ~@101>").gain(0.57)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A@2 ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~@3 A ~ A ~ A ~ A ~ A ~@3 A
  ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@10 x ~@2 x ~@2",
})).gain(0.57)

// drums · crash
const crash = s("cr").struct("<~@32 x ~@59 x ~@12>").gain(0.57)

// drums · tambourine
const tambourine = s("tb").struct("<~@24 A@8 ~@12 A@8 ~@8 A@8 ~@12 A@24 ~>".pickRestart({
  A: "x!16",
})).gain(0.57)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@24 A ~ A ~ A ~ A ~@13 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~@13 B@3 ~ B@3 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@4 x!2 ~@2", B: "~@2 x!2",
})).gain(0.57)

// drums · shaker
const shaker = s("sh").struct(`<
  A@4 B@23 A B@3 A B@15 A B@3 A B@11 A B@3 A B@15 A B@3 A B@3 A B@3 A B@3 A B@3 A ~
>`.pickRestart({
  A: "x ~ x!3 ~@2 x ~ x!4 ~@3", B: "x ~ x!3 ~@2 x ~ x!4 ~@2 x",
})).gain(0.57)

stack(
  electric_guitar_clean, bass, overdriven_guitar, lead_2_sawtooth, lead_1_square, drawbar_organ, overdriven_guitar_2,
  kick, snare, snare_soft, hihat, mid_tom, open_hat, crash, tambourine, cowbell, shaker
)

More by Hanson