Strudelify
At the Hop cover art

For Cool Grandkids Everywhere

At the Hop

Danny & The Juniors

KeyA majorTempo180 bpm
0:00/0:00
// At the Hop — Danny & The Juniors
// 180 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 5 "PIANO BRIGHT LEAD" piano (copy of ch 4 "PIANO LEAD" piano)
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(180/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.

// bass · acoustic bass · "BASS"
const bass = note(`<
  A B A B A B C D E F G H A B A I A J K L A M N O A J P Q R S T U A J V W X Y A I A J K L A Z N O A J P Q R S T U A J V
  W X Y AA AB A AC AD AE AF AG AH AI AJ AK A I A J K L A M N O A J A I A J K L A M N O A J P Q R S T U A J V W X Y A B C
  D E F G H AL
>`.pickRestart({
  A: "a1 c#2 e2 f#2", B: "e2 f#2 e2 c#2", C: "f#1@4 a1@4 c#2@4 d2@3 ~", D: "c#2@4 d2@4 c#2@3 ~ a1@3 ~",
  E: "d1 f#1 a1 b1", F: "a1@2 b1@2 a1@2 f#1 ~", G: "b2@3 ~ b2@2 ~@2 e2@2 ~@2 e2@3 ~",
  H: "b2@3 ~ b2@2 ~@2 e1@3 ~ e1@2 ~@2", I: "a3@4 f#2@4 e2@4 c#2@3 ~", J: "e2@4 f#2@4 e2@4 c#2@3 ~", K: "d2 f#2 a2 b2",
  L: "d3@4 d2@3 ~ a2@4 d3@3 ~", M: "e2@4 f#2@4 e2@4 c#2@2 e2 ~", N: "e3 ~ e3@2 b2@2 g#2 ~", O: "d3 ~ d3@2 a2@2 f#2@2",
  P: "a1 ~ a1@2 e2@2 f#2@2", Q: "a2@3 ~ f#2@4 e2@4 a1@3 ~", R: "a2 ~ a1@2 e2@2 f#2@2", S: "a1 b1 c2 c#2",
  T: "d2@3 ~ d3@4 a2@2 ~@2 a2@4", U: "d3@3 ~ d3@4 a1@4 d3@3 ~", V: "b2@3 ~ b2@4 e2@3 ~ e2@3 ~",
  W: "d2@4 f#2@3 ~ a2@3 ~ a2@3 ~", X: "a1@2 ~@2 a2@3 ~ e2@3 ~ f#2@3 ~", Y: "e2@4 f#2@4 a1@3 ~ a1@3 ~",
  Z: "e2@2 f#2@2 e2@2 c#2 e2", AA: "a1@3 ~ c#2@4 e2@4 c#2@4", AB: "a1@4 c#2@2 ~ d2 e2@4 c#2@3 ~",
  AC: "e2@2 c#2@2 a1 a1@2 ~", AD: "d2 f#2 a2 f#2", AE: "d2@4 f#2@2 g2@2 a2@4 f#2@3 ~", AF: "a1 b1 c#2 b1",
  AG: "a1@4 a1@2 c#2@2 e2@3 ~ a1@2 ~@2", AH: "e2@2 g1 g#1 e1@2 e2@2", AI: "d1@2 f#1 g#1 a1@2 a1@2", AJ: "a1 c2 c#2 d2",
  AK: "e1@3 ~ e1@3 ~ e1@3 ~ e1@3 ~", AL: "a1 ~@7",
})).s("gm_acoustic_bass").gain(0.54)

// chords · piano · "PIANO FILLS"
const piano = note("<~@51 A ~ B ~ C ~ D E ~ F ~@58>".pickRestart({
  A: "~@3 [e5,g#5,a5]@2 ~@2 [e5,a5]!2 ~ [e5,a5] ~ [e5,a5]@2 ~@2", // Amaj7 A5
  B: "~@3 [e5,g5,a5]@4 [e5,g5,a5]!2 ~ [e5,g5,a5] ~ [g5,a5] ~@3, ~@3 f#5 ~@8 e5@2 ~@2", // A7 Gsus2
  C: "~@3 [c5,d5,a5]@3 ~ [c5,d5,a5]!2 ~ [c5,d5,a5] ~ [c5,d5]@2 ~@2, ~@12 a5 ~@3", // D7 Csus2
  D: "~@3 [c#5,e5,a5]@2 ~@2 [c#5,e5,a5]!2 ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~@3", E: "[b4,e5,g#5] ~@15", F: "[c#5,e5,a5] ~@7",
})).s("gm_piano").gain(0.8)

// chords · piano · "PIANO LEAD"
const piano_2 = note("<~@62 A B C D E F G H I J K L ~@45>".pickRestart({
  A: "[e5,a5,c#6] ~ [e5,a5,c#6] ~ [e5,g5,a5,c#6] ~ [e5,c#6] ~ [e5,a5,c#6] ~ [e5,a5,c#6] ~ [e5,g5,a5,c#6] ~ [e5,c#6] ~", // A A7 C#m A A7 C#m
  B: "[e5,a5,c#6] ~ g5@2 e5 ~ [a5,c#6] ~@3 e5@2 f#5 ~ e5 ~, ~@3 e5 ~@4", // A
  C: "[e5,a5,c#6] ~ [e5,a5] ~ g5@2 e5 ~ [e5,a5,c#6] ~ [e5,a5] ~ g5@2 e5@2, ~ c#6 ~@3 c#6 ~@2", // A A5 A A5
  D: "[e5,g5] ~ [e5,a5] ~@3 e5 ~@5 f#5@2 a5 ~, ~@11 e5@2 ~@3", // Em A5
  E: "[f#5,d6] ~ [f#5,d6]@2 a5@2 f#5 ~ [f#5,d6] ~ [f#5,d6] ~ a5 ~ e5 ~, ~@4 f#5 ~@11", // D
  F: "[f#5,d6] ~ [f#5,d6] ~@7 e5@2 f#5 ~ a5 ~", G: "[e5,c#6] ~ [e5,c#6] ~ a5@2 f#5 ~ [e5,c#6] ~ [e5,c#6] ~ a5@2 f#5 ~",
  H: "[e5,c#6] ~ [e5,c#6] ~@7 e5@2 f#5 ~ a5 ~", // C#m
  I: "[d5,e5,e6] ~ [d5,e5,e6] ~ [d5,e5,e6] ~ [d5,e5,e6] ~ [d5,e5,e6] ~ b5 ~ g#5@2 e5 ~", // Dsus2
  J: "[a5,d6] ~ [d5,a5,d6] ~ [d5,a5,d6] ~ [d5,f#5,a5,d6] ~ [d5,f#5,a5,d6] ~ a5 ~ f#5@2 a5 ~", // D5 D
  K: "[e5,g5,c#6] ~ [e5,g5,c#6] ~ [c#5,e5,g5,a5,c#6] ~ e5@2 [e5,g5,c#6] ~ [e5,g5,c#6] ~ [e5,g5,c#6] ~ [e5,g5,c#6] ~, ~@6 g5 ~@9", // C#dim A7 C#dim
  L: "[e5,g5,c#6] ~ [e5,g5,c#6] ~ [e5,g5,c#6] ~ [e5,g5,c#6] ~ [e5,g5,c#6] ~ [e5,g5,c#6] ~ [e5,g5,c#6] ~ [e5,g5,c#6] ~", // C#dim
})).s("gm_piano").gain(0.8).pan(0.3)

// chords · piano · "PIANO RIGHT RYTHM"
const piano_3 = note(`<
  A@6 B@2 C@2 D@2 A@6 C@2 A@2 E F G H A@4 C@2 A@2 E F G I A@4 C@2 A@2 E F G H A@4 C@2 A@2 E F G H ~@12 A@4 C@2 A@2 E F G
  H A@4 C@2 A@2 E F G H A@4 C@2 A@2 E F G H A@2 B@2 C@2 D@2 J
>`.pickRestart({
  A: "[c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~", // A
  B: "[c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~", // F#m
  C: "[d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~ [d4,f#4,a4] ~", // D
  D: "[d4,g#4,b4] ~ [d4,g#4,b4] ~ [d4,g#4,b4] ~ [d4,g#4,b4] ~ [d4,g#4,b4] ~ [d4,g#4,b4] ~ [d4,g#4,b4] ~ [d4,g#4,b4] ~", // G#dim
  E: "[d4,e4,g#4,b4] ~ [d4,e4,g#4,b4] ~ [d4,e4,g#4,b4] ~ [d4,e4,g#4,b4] ~ [d4,e4,g#4,b4] ~ [d4,e4,g#4,b4] ~ [d4,e4,g#4,b4] ~ [d4,e4,g#4,b4] ~", // E7
  F: "[c4,d4,f#4,a4] ~ [d4,e4,f#4,a4] ~ [d4,e4,f#4,a4] ~ [d4,e4,f#4,a4] ~ [d4,e4,f#4,a4] ~ [d4,e4,f#4,a4] ~ [d4,e4,f#4,a4] ~ [d4,e4,f#4,a4] ~", // D7 D
  G: "[c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,f#4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,f#4,a4] ~ [c#4,e4,a4] ~", // A F#m7 A F#m7 A
  H: "[c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~, ~@2 f#4 ~@5", // A
  I: "[c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4] ~@3, ~@2 f#4 ~@5", // A
  J: "[a3,c#4,e4,a4] ~@15", // A
})).s("gm_piano").gain(0.48).pan(0.7)

// bass · piano · "PIANO LEFT BASS"
const bass_2 = note(`<
  A B A B A B C D E F G H I J K L K M N O K P Q R K S K L K T N O K P Q R K S K L K M N O K P Q R K S K L K T N O K P Q
  R K S U V W X Y Z AA AB AC AD AE AF K L K M N O K P Q R K S K L K M N O K P Q R K S K L K T N O K P Q R K S A B C D E
  F G H AG
>`.pickRestart({
  A: "a1 ~ a1 ~ c#2@4 e2@4 f#2@4", B: "e2 ~ e2@2 f#2 ~ f#2@2 e2@4 c#2@4", C: "f#1 ~ f#1 ~ a1@4 c#2@4 d2@3 ~",
  D: "c#2 ~ c#2 ~ d2@3 ~ c#2@4 a1@3 ~", E: "d1@4 f#1@4 a1@4 b1@3 ~", F: "a1 ~ a1 ~ b1@4 a1@4 f#1@3 ~",
  G: "e1 g#1 b1 c#2", H: "b1 ~ b1 ~ c#2@4 b1@4 g#1@3 ~", I: "a1 ~ a1@2 c#2@4 e2@4 f#2@4",
  J: "e2 ~ e2@2 f#2 ~ f#2@2 e2@4 c#2@3 ~", K: "a1 c#2 e2 f#2", L: "e2 f#2 e2 c#2", M: "e2@2 f#2@2 e2@2 c#2 ~",
  N: "d1 f#2 a2 b2", O: "d1@4 b1@4 a2@4 f#1@3 ~", P: "e2 ~ e2 ~ f#2@4 e2@3 ~ c#2@3 ~", Q: "e1 b1 g#2 e2",
  R: "d1@4 a2@4 f#2@4 d2@3 ~", S: "e2 ~ e2 ~ f#2@4 e2@4 c#1@3 ~", T: "a2@2 b2@2 c3@2 c#2 ~",
  U: "a1@2 c#2 d2 e2@2 d2 c#2", V: "a1@2 a1@2 c#2 ~ d2@2 e2@2 e2@2 d2@2 c#2@2", W: "a1@4 c#2 ~ d2@2 e2@4 f#2@4",
  X: "e2@4 c#2@2 b1@2 a1@2 a1 ~@5", Y: "d1@4 f#1 ~ g1@2 a1@4 f#1@2 f#1 ~", Z: "d1@4 f#1 ~ g1@2 a1@4 f#1 ~ f#1 ~",
  AA: "a1@4 b1@2 c2@2 c#2@4 c2 b1@2 ~", AB: "a1@2 a1 ~ c2@2 c#2@2 e2@3 ~@5",
  AC: "e1@2 ~ g#1 a1@2 b1@2 b1@2 g#1@2 f#1@2 e1@2", AD: "d1@2 f#1 g1 a1@3 ~", AE: "a1@2 c2 c#2 d2@2 d#2@2",
  AF: "e2@4 d2@4 c#2@4 b1@3 ~", AG: "a1 ~@15",
})).s("gm_piano").gain(0.8).pan(0.2)

// chords · rock organ · "ORGAN"
const rock_organ = note(`<
  ~@4 A@2 B@2 C@2 D@2 ~@2 E@2 F ~ G@2 H ~ I J K@2 ~@12 L@4 M@2 N@2 I J O@2 P@2 Q@2 R ~ S ~ T J U ~@13 E@2 F ~ G@2 H ~ I
  J K@2 L@4 M@2 N@2 I J O@2 P@2 Q@2 R ~ S ~ T J U ~ A@2 B@2 C@2 D@2 ~
>`.pickRestart({
  A: "[~@3 a5, a4, ~ c#5@3, ~ e5]/2", B: "[~@3 f#5, f#4, ~ a4@3, ~ c#5]/2", C: "[~@3 d5, d4, ~ f#4@3, ~ a4]/2",
  D: "[~@3 e5, e4, ~ g#4@3, ~ b4]/2", E: "[[a4,c#5,e5] ~@3 [a4,c#5,e5] ~@3 [a4,c#5,e5]@2 ~@5 [a4,c#5,e5]@2 ~@15]/2",
  F: "[a4,c#5,e5] ~@3 [a4,c#5,e5]@2 ~@2 [a4,c#5,e5]@2 ~@4 [c#5,e5,g5,a5]@2", // A A7
  G: "[[a4,d5,f#5] ~@3 [a4,d5,f#5] ~@3 [a4,d5,f#5]@2 ~@5 [a4,d5,f#5]@2 ~@15]/2", // D
  H: "[a4,c#5,e5] ~@3 [a4,c#5,e5]@2 ~@2 [a4,c#5,e5] ~@5 [a4,c#5,e5]@2", I: "[e5,g#5,b5]", J: "[d5,f#5,a5]@15 ~",
  K: "[[a4,c#5,e5]@2 ~@2 [a4,c#5,e5]@2 ~@2 [a4,c#5,e5] ~@6 [a4,c#5,e5]@2 ~@15]/2", // A
  L: "[~@43 f#5@5 g5@13 ~@3, [c#5,e5]@15 ~]/4", M: "[[a4,d5,f#5]@31 ~]/2", N: "[[a4,c#5,e5]@29 ~@3]/2",
  O: "[[a4,c#5,e5]@7 ~]/2", P: "[[c#5,e5]@27 ~@5]/2", Q: "[[c#5,e5]@13 ~@3]/2", R: "[d5,f#5]@13 ~@2 [d5,f#5]",
  S: "[c#5,e5]@13 ~@2 [c#5,e5]", T: "[e5,g#5,b5]@15 ~", U: "[c#5,e5]@14 ~ [c#5,e5]",
})).s("gm_rock_organ").gain(0.55)

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

// drums · clap
const clap = s("cp").struct(`<
  ~@62
  [~@2 x!2 ~@2 x!2]
  [~@2 x!2 ~@2 x ~]
  [~@2 x!2 ~@2 x!2]!3
  [~@2 x!2 ~@2 x ~]
  [~@2 x!2 ~@2 x!2]!5
  [~@2 x!2 ~@4]
  ~@45
>`).gain(0.64)

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

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

// drums · hihat
const hihat = s("hh").struct("<~@118 x>").gain(0.08)

// drums · open hat
const open_hat = s("oh").struct("<~@2 A@23 B A@11 C A@11 D A@11 B A@11 E F A@10 G A@11 D A@11 B A@8 H>".pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x!2", C: "~@2 x ~@3 x!2", D: "x!3 ~", E: "~ x ~ x", F: "x!4", G: "x!6 ~@2", H: "x",
})).gain(0.8)

// drums · crash
const crash = s("cr").struct("<~@2 A ~@35 A ~@35 B ~@11 A ~@32>".pickRestart({
  A: "x", B: "~ x ~@2",
})).gain(0.8)

// drums · high tom
const high_tom = s("ht").struct("<~@85 [~@7 x] ~@33>").gain(0.64)

// drums · ride
const ride = s("rd").struct("<~@2 A@35 B A@11 C A@23 B A@11 C A@11 C A@19 C ~>".pickRestart({
  A: "x!4", B: "~ x ~ x", C: "x!3 ~",
})).gain(0.8)

stack(
  bass, piano, piano_2, piano_3, bass_2, rock_organ, kick, clap, snare, snare_soft, hihat, open_hat, crash, high_tom,
  ride
)