Strudelify

Ballroom Blitz

Sweet

KeyE majorTempo109 bpm
0:00/0:00
// Ballroom Blitz — Sweet
// 109 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(109/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass pick
const bass = note(`<
  ~@10 A B C D E F G H F@2 G I J ~@3 K L M N O P Q R Q S T U V W X ~ K@2 E F G H F@2 G I J ~@3 K L M N O P Q R Q S Y Z Y
  AA Y AA Y Z AB AC L M N AD P AE R AF S T U V AG AH@4 AI AJ AI AK AI AK AI AL AM AI AK@2 AI AK AM AN
>`.pickRestart({
  A: "e1@2 e2 ~ e2 ~ e2 ~ e2@2 e2 e2@2 ~ e2@2", B: "e1@2 e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@2 ~ e2 ~",
  C: "e1 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@2 ~ e2 ~", D: "e1@2 e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@2 ~ b1@2",
  E: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 a1@2 ~ a1@2", F: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 a1@2 ~ a1 ~",
  G: "e1 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@2 ~ e2@2", H: "e1@2 e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@3 b1@2",
  I: "e1 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@2 ~ b1@2", J: "e1 ~@7", K: "e1@15 ~",
  L: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1 ~ f#1!2 ~ f#1!2 ~", M: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1!2 ~ a1!2 ~",
  N: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2!2 ~ c2!2 ~", O: "e2 ~ e2 ~ e2!3 ~ e2 ~ e2 ~ e2!2 e2@2",
  P: "e2 ~ e2 ~ e2!3 ~ e2@2 e2 ~ e2!2 b1 ~", Q: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ a1@2 a1!2 ~ a1!2 ~",
  R: "b1 ~ b1 ~ b1@2 b1 ~ e2 ~ e2!2 ~ e2!2 ~", S: "b1 ~ b1 ~ b1 ~ b1 ~ e2@2 e2 d2@3 d#2@2",
  T: "e2 ~ e2 ~ e2 ~ e2 ~ e2@2 e2 d2@2 ~ d#2@2", U: "e2 ~ e2 ~ e2 ~ e2 ~ e2@2 e2 d2@3 d#2@2",
  V: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 d2@3 d#2@2", W: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@3 d2@2", X: "e2 ~@7",
  Y: "e2!13 d2@2 ~", Z: "e2!11 d2@3 d#2 ~", AA: "e2!11 d2@3 d#2@2", AB: "e2 ~ e2@2 e2@2 e2@2 e2@2 e2@2 e2@2 e2@2",
  AC: "e2!8", AD: "e2@2 e2 ~ e2!3 ~ e2 ~ e2 ~ e2!2 e2@2", AE: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ a1@2 a1 a1@2 a1!2 ~",
  AF: "f#1 ~ f#1 ~ f#1 ~ f#1 ~ a1 ~ a1!2 ~ a1!2 ~", AG: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@3 e2@2",
  AH: "e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2 d2@3", AI: "e1 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2!2 ~ e2!2 ~",
  AJ: "e1@2 e2 ~ e2 ~ e2 ~ e2 ~ e2 e2@2 e2!2 ~", AK: "e1 ~ e2 ~ e2 ~ e2 ~ e2 ~ e2!2 ~ e2 e2@2",
  AL: "e1@2 e2 ~ e2 ~ e2 ~ e2 ~ e2!2 ~ e2 e2@2", AM: "e1@2 e2 ~ e2 ~ e2 ~ e2 ~ e2!2 ~ e2!2 ~",
  AN: "e1@2 e2 ~ e2 ~ e2 ~ e2 ~ e2 ~@5",
})).s("gm_electric_bass_pick").gain(0.8)

// chords · distortion guitar
const distortion_guitar = note(`<
  ~@10 A B C D ~@2 A B ~@2 A B E ~@3 F G H I J K L M N O P@3 Q ~@2 C D ~@2 A B ~@2 A B E ~@3 F G H I J K L M N O R ~@5
  S@2 T@2 G H I J K L M N O P@3 Q U V U W ~@4 X Y Z AA AB AC AD AE AF AG AH ~
>`.pickRestart({
  A: "e3 ~ [e3,b3]@2 ~ [e3,c#4]@3 [e3,d4]@3 [e3,c#4]@2 ~ [e3,b3]@2", // E5 C#m E7 C#m E5
  B: "e3 ~ [e3,b3]@3 [e3,c#4]@2 ~ [e3,d4]@3 [e3,c#4]@2 ~ [e3,b3]@2", // E5 C#m E7 C#m E5
  C: "e3 ~ [e3,b3]@3 [e3,c#4]@2 ~ [e3,d4]@2 ~ [e3,c#4]@2 ~ [e3,b3]@2", // E5 C#m E7 C#m E5
  D: "e3 ~ [e3,b3]@2 ~ [e3,c#4]@2 ~ [e3,d4]@3 [e3,c#4]@2 ~ [e3,b3]@2", E: "[e3,b3] ~@7", F: "[b3,e4]", G: "f#3",
  H: "e3", I: "[c3,g3]", J: "[e3,b3]!2", K: "[e3,b3]@4 [e3,b3]@4 [e3,b3]@4 [e3,b3]@3 ~", L: "[f#2,c#3] [a2,e3]",
  M: "[b2,f#3]@2 [e3,b3]!2", N: "[f#2,c#3]@7 ~ [a2,e3]@8", O: "[b2,f#3]@8 [e3,b3]@3 [d3,a3]@3 [d#3,a#3]@2",
  P: "[e3,b3]@2 b3!9 [d3,a3]@3 [d#3,a#3]@2", Q: "[e3,b3]@2 b3!14", R: "[b3,e4] ~@7",
  S: "~@2 e4 d4 e3 a3@2 e3 a3 b3@2 d4@2 b3 d4 e4, e3 ~@3", T: "[b3,e4]!16",
  U: "[b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] [a3,d4]@3", // E5 D5
  V: "[b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4]@2 [b3,e4] ~ [b3,e4] [a3,d4]@3", // E5 D5
  W: "[b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] ~ [b3,e4] [a3,d4]@2 ~", // E5 D5
  X: "e3 ~ e4 ~ e4 d4@2 e3 ~ e3 e4@2 e4 d4@2 ~", Y: "e3 ~ e4@2 e3 d4@2 e3 b3!2 a3@2 g3@4",
  Z: "e3@2 e4 ~ e4 d4 b3@2 d4@2 b3 d4@2 b3 d4 e4", AA: "~@2 g4 e4 f#4 a4 d5@2 ~ g4 e4 d4 b3 d4 b3 d4",
  AB: "~@2 [e4,a4] ~ [e4,a4]@2 [d4,g4] [e4,a4] ~ [e4,a4] ~ [d4,g4] [e4,a4] [d4,g4] [e4,a4]@2", // A5 G5 A5 G5 A5 G5 A5
  AC: "~@2 [e4,a4] [d4,g4] [e4,a4]@2 [d4,g4] [e4,a4] ~ [e4,a4] ~ [d4,g4] [e4,a4] [d4,g4] [e4,a4]@2", // A5 G5 A5 G5 A5 G5 A5 G5 …
  AD: "[e4,a4] ~ [e4,a4] [d4,g4] [e4,a4]!2 [d4,g4] [e4,a4]@2 [d4,g4] [e4,a4] [d4,g4] [e4,a4] [d4,g4] [e4,a4] ~", // A5 G5 A5 G5 A5 G5 A5 G5 …
  AE: "a4!15 ~", AF: "d3@2 b2 d3@2 b2 d3@2 ~ d3@2 b2 d3 b2 e3 ~", AG: "d3 ~ b2 d3@2 b2 d3@2 ~ d3 ~ b2 d3 b2 e3 ~",
  AH: "[e4,a4]!2 e4 [e4,a4] ~ e4!6 [e4,a4]@2 ~ [d4,g4] ~", // A5 G5
})).s("gm_distortion_guitar").gain(0.8).pan(0.7)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@10 A@4 B C A@2 B C A@2 D ~@3 E F G H I@2 J K J L M@3 N A@4 B C A@2 B C A@2 D ~@3 E F G H I@2 J K J O D P Q P Q P Q P
  R S F G H I@2 J K J L M@3 N T U T V A@15 W
>`.pickRestart({
  A: "e3@2 [e3,b3]@3 [e3,c#4]@3 [e3,d4]@3 [e3,c#4]@3 [e3,b3]@2", B: "[a2,e3] ~ a2 ~ a2 ~ a2 ~ a2 ~ a2!5 ~",
  C: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2!5 ~", D: "[e3,b3] ~@7", E: "[e3,b3]", F: "[f#2,c#3]!16", G: "[a2,e3]!16",
  H: "[c3,g3]!16", I: "[e3,b3]!16", J: "[f#2,c#3]!8 [a2,e3]!8", K: "[b2,f#3]!8 [e2,b2]!8",
  L: "[b2,f#3]!8 e3!3 [a2,d3]@3 [a#2,d#3]@2", M: "[b2,e3]@2 e3!9 [a2,d3]@3 [a#2,d#3]@2", N: "[b2,e3]@2 e3!14",
  O: "[b2,f#3]!8 e3!3 d3@3 d#3@2", P: "~@11 [d3,a3]@3 [d#3,a#3]@2", Q: "~@13 [d3,a3]@3", R: "[e3,b3]!8",
  S: "[e3,b3,e4]@2 [e3,b3,e4]@2 [e3,b3,e4]@2 [e3,b3,e4]@2 [e3,b3,e4]@2 [e3,b3,e4]@2 [e3,b3,e4]@2 [e3,b3,e4] ~", // E5
  T: "[e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] [d3,a3]@3", // E5 D5
  U: "[e3,b3] ~ [e3,b3] ~ [e3,b3]@2 [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] [d3,a3]@3", // E5 D5
  V: "[e3,b3] ~ [e3,b3] ~ [e3,b3]@2 [e3,b3] ~ [e3,b3] ~ [e3,b3] ~ [e3,b3] d3@2 ~", // E5
  W: "e3@2 [e3,b3]@3 [e3,c#4]@3 [e3,d4]@3 ~@5", // E5 C#m E7
})).s("gm_overdriven_guitar").gain(0.64).pan(0.2)

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

// drums · rim
const rim = s("rim").struct("<[x!4] ~@108>").gain(0.4)

// drums · clap
const clap = s("cp").struct("<~@10 A@12 ~@5 A@13 ~@2 A@10 ~@5 A@42 ~@10>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.64)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~ A@6 B A ~ B A B A ~@2 B A ~@2 A@5 ~@17 A@2 ~@2 A B ~@2 B A@4 ~@38 B A@2 B A@2 ~@10
>`.pickRestart({
  A: "x ~@2 x!2 ~@2 x!3 ~ x!2 ~@3", B: "x ~@2 x!3 ~ x!3 ~ x!2 ~@3",
})).gain(0.32)

// drums · low tom
const low_tom = s("lt").struct("<~@68 A B A B A B ~@15 C D@2 E ~@16>".pickRestart({
  A: "x!12 ~ x ~@2", B: "x!12 ~@2 x ~", C: "x ~ x!3 ~ x!3 ~ x!3 ~@3", D: "x ~ x!3 ~ x!3 ~ x ~ x ~@3",
  E: "x ~ x!3 ~ x!3 ~@7",
})).gain(0.56)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@14 A B ~@2 A B ~@7 A@3 C@2 A B@2 D E@4 ~@4 A B ~@2 A B ~@7 A@3 C@2 A B@2 D ~@10 A@3 C@2 A B@2 D E@3 F ~@20
>`.pickRestart({
  A: "~ x!7", B: "x!8", C: "~ x!3 ~ x!3", D: "x!5 ~@3", E: "~ x!4 ~@3", F: "~ x!6 ~",
})).gain(0.64)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@8 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A@4 B@2 A ~@2 C D@4 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@4 B@2 A ~@2 C A ~@3 A ~ A
  ~ A ~ A@3 B@2 A ~@2 C D@3 A E F@2 ~ A ~@15
>`.pickRestart({
  A: "x", B: "x!2", C: "~@11 x ~@2 x ~", D: "x ~@10 x ~@2 x ~", E: "x ~@12 x ~@2", F: "~@11 x ~ x ~@2",
})).gain(0.56)

stack(bass, distortion_guitar, overdriven_guitar, kick, rim, clap, snare, snare_soft, low_tom, hihat, crash)

More by Sweet