Strudelify

Music Box Dancer

Frank Mills

KeyC majorTempo125 bpm
0:00/0:00
// Music Box Dancer — Frank Mills
// 125 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 84 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(125/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.

// chords · piano · "Main-Ver1.0"
const piano = note(`<
  A@3 B C D E F C D G H I J K L I J M N O P Q R S T U V A@3 B C D E F C D G H I J K L I J M N O P Q R S T U V A@3 B C D
  E F C D G H I J K L I J M N O P Q R S T U V
>`.pickRestart({
  A: "c4 e4 g4 e4 c5 g4 e4 g4", B: "c4 e4 g4 e4 c5 g4 e4 [g4,c5]",
  C: "[c4,c5] [e4,g4] [g4,c5] [c5,e5] [e4,c5] [g4,e5] [c5,g5] [g4,c5]", // C Em C5 C C5
  D: "[f4,c6] [a4,b5] [c5,a5] c5 c4 e4 g4 c5, ~@3 g5@3 ~@2", // F5 Asus2 F
  E: "[g3,g5] [a3,f5] [d4,d5] [g4,b4] [b3,g4] [d4,b4] [g4,d5] [d4,f5]", // G Dm D G Em G G5 Dm
  F: "[c4,e5] [e4,c5] [c5,a5] g4 e4 g4 c5 [g4,c5], ~@3 g5@3 ~@2", // C F C5
  G: "[g3,g5] [a3,f5] [d4,d5] [g4,b4] [b3,g4] [d4,b4] [g4,d5] [d4,b4]", // G Dm D G Em G G5 G
  H: "[c4,c5] [e4,g4] [g4,e5] ~ e4 g4 c5 [g3,c5], ~@3 c5@3 ~@2", // C Em C C5
  I: "c5 [g3,g4] [c4,e4,c5] [c4,e4,e5] [g3,c5] [g3,e5] [c4,e4,g5] [c3,c5], c3@7 ~", // G C C5 C
  J: "c6 [f3,b5] [a3,c4,a5] g3 c3 g3 [c4,e4] d3, f2 ~, ~@3 g5@3 ~@2", // Fdim Am C
  K: "g6 [g3,f6] [b3,f4,d6] [b3,f4,b5] [g3,g5] [g3,b5] [b3,f4,d6] [g3,f6], g2", // G7 Bdim G Bdim G7
  L: "e6 [g3,c6] [c4,e4,a6] [c4,e4] g3!2 [c4,e4] [g3,c5], c3, ~@3 g6@3 ~@2", // C5 Am C C5
  M: "g6 [g3,f6] [b3,f4,d6] [b3,f4,b5] [g3,g5] [g3,b5] [b3,f4,d6] [g3,b5], g2", // G7 Bdim G Bdim G
  N: "c6 [g3,g5] [c4,e4,e6] [c4,e4] g3 [g3,c6] [c4,e4,c6] [g3,c6], c3, ~@3 c6@2 ~@3", // G C C5 C C5
  O: "[c6,a6,c7] [f3,a6] [a3,c4,f6] [a3,c4,c6] [f3,a5] [f3,c6] [a3,c4,f6] [g3,a6], f2", // F Am F F5 F Gsus2
  P: "g6 [g3,c6] [c4,e4,a6] [c4,e4] g3!2 [c4,e4] [d3,g3], c3, ~@3 g6@3 ~@2", // C5 Am C G5
  Q: "[b5,d6,g6] [g3,f6] [b3,f4,d6] [b3,d4,b5] [g3,g5] [b3,b5] [b3,d4,d6] [g3,f6], g2", // G G7 Bdim Bm G B Bm G7
  R: "e6 [c4,c6] [e4,g4,a6] [e4,g4] c4 [c4,e6] [e4,g4,e6] [f3,e6], c3, ~@3 g6@2 ~@3", // C A7 Em C Em Fmaj7
  S: "[c6,a6,c7] [f3,a6] [a3,c4,f6] [a3,f4,c6] [f3,a5] [f3,c6] [a3,c4,f6] [g3,a6], f2", // F F5 F Gsus2
  T: "g6 [g3,c6] [c4,e4,a6] [c4,e4] g3 [g3,c6] [c4,e4,c6] [g3,c6], c3, ~@3 g6@2 ~@3", // C5 Am C C5 C C5
  U: "[b5,d6,g6] [g3,f6] [b3,f4,d6] [d4,f4,b5] [g3,g5] [g3,b5] [b3,f4,d6] [g3,b5], g2", // G G7 Bdim G Bdim G
  V: "c6 [g3,g5] [c4,e4,e6] [g3,c6] [c4,e4,c6]@2 ~@2, c3", // G C C5 C
})).s("gm_piano").gain(0.57)

// bass · fretless bass · "Base"
const bass = note(`<
  ~@11 A B C D E F C G H I J G K I H G L ~@3 A B C M K F C G N B C D F@2 C G O I J G K I H G L ~@3 A B C M K F C G N B C
  D F@2 C G O I J G K I H G L
>`.pickRestart({
  A: "~@7 g1", B: "c2@3 c2 c2@3 c2", C: "f2@3 f2 c2@3 c2", D: "g2@3 g2 g2@3 d2", E: "c2@3 c2 g1 a1 c2@2",
  F: "c2@3 c2 c2@2 c2@2", G: "g2@3 g2!2 f2 e2 d2", H: "c2@3 c2!2 b1 c2 d2", I: "f2@3 f2!2 e2 d2 c2",
  J: "c2@3 c2!2 e2 g2@2", K: "c2@3 c2!2 d2 e2@2", L: "c2@3 g1 c2@4", M: "g2@3 g2!2 f#2 e2 d2", N: "c2@3 c2 c2@3 g1",
  O: "c2@3 c2 c2@4",
})).s("gm_fretless_bass").gain(0.54)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@40 A B C D ~@3 E F ~ G H ~@8 I J K L M J N O I J P M@2 J N Q R S N L R T N U
>`.pickRestart({
  A: "~ [e3,g3]@7 ~ [e3,g3]@7, c3!2", B: "~ [c3,a3]@7 ~ f3@7, f3 [c3,a3]",
  C: "~@2 [d3,g3]@2 d3 ~@3 [d3,g3]@4 [d3,g3]@4, [d3,g3]@2 ~@3 [d3,g3]@2 b3@2 ~@7, ~ b3@4 ~ [g3,b3]@2 ~@8", // G5 G
  D: "c3 [e3,g3] [c3,e3,g3]@2 ~ [e3,g3]@11, ~ c3@3", E: "~@12 c4 [a#3,b3] [g#3,a3] [f#3,g3]", F: "f3 ~@15",
  G: "~ b3@6 ~, b2@3 ~, ~ [d3,g3]@12 ~@3", H: "~@8 [c3,e3,g#3] ~ [c3,e3,g#3] ~ [c3,e3,g#3] ~ [c3,e3,g#3] ~",
  I: "c3@3 c3 c3@3 c3", J: "f3@3 f3 c3@3 c3", K: "g3@3 g3!2 f#3 e3 d3", L: "c3@3 c3!2 d3 e3@2", M: "c3@3 c3 c3@2 c3@2",
  N: "g3@3 g3!2 f3 e3 d3", O: "c3@3 c3 c3@3 g2", P: "g3@3 g3 g3@3 d3", Q: "c3@3 c3 c3@4", R: "f3@3 f3!2 e3 d3 c3",
  S: "c3@3 c3!2 e3 g3@2", T: "c3@3 c3!2 b2 c3 d3", U: "c3@3 g2 ~@4",
})).s("gm_distortion_guitar").gain(0.22).pan(0.9)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@23 [x!2 ~@6] ~@60>").gain(0.4)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@60 [~@3 x] ~@23>").gain(0.4)

// drums · crash
const crash = s("cr").struct(`<
  ~@12 A ~@7 A ~@3 A ~@2 B ~@12 A ~@7 A ~ C@6 ~@4 A D ~ D ~ D ~@2 A@12 ~@3 B
>`.pickRestart({
  A: "x", B: "~ x", C: "x!2", D: "~@3 x",
})).gain(0.4)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@20 A@7 B ~@12 A@15 ~@13 A@7 B A@7 ~>".pickRestart({
  A: "x!8", B: "x!4 ~@4",
})).gain(2.01)

stack(piano, bass, distortion_guitar, kick, snare, low_tom, open_hat, mid_tom, crash, cabasa)