Strudelify

dancing in the moonlight

Gavin Sandford

KeyE♭ majorTempo119 bpm
0:00/0:00
// dancing in the moonlight — Gavin Sandford
// 119 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 1 "Flute" named as a pipe, played on flute (its piano patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/5885287; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 92 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(119/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.

// other · flute
const flute = note(`<
  A@8 ~@8 A@8 ~@4 B C@2 D A@8 ~@2 E F G ~@11 H@4 I@2 J@2 I@2 J@2 I@2 J@2 I@2 K L A@8 M@8
>`.pickRestart({
  A: "[ab4@2 c5@2 eb5@2 g5@4 g5@2 ~@2 f5@9 ~ g5@2 bb5 ~ f5 ~ eb5@4 bb4@2 ~@2 f5@4 bb5@2 f5 ~ eb5@9 ~@7 ab4@4 c5@2 eb5@2 g5@4 g5@2 ~@2 f5@8 d5@2 f5 g5 bb5 ~ f5 ~ eb5@4 bb5@2 g5@2 f5@4 bb5@2 f5 ~ eb5@6 ~@12]/8",
  B: "c5@9 ~ f5@4 bb5@2", C: "[~@10 f5@2 ~@2 g5@11 ~ d5@4 c5@2]/2", D: "~@3 c5@3 ~@2", E: "g5@2 ~ g5 f5@2 ~ f5",
  F: "eb5@2 ~ eb5 d5@2 ~ d5", G: "eb5@15 ~",
  H: "[ab4@2 c5@2 eb5@2 g5@4 g5@2 ~@2 f5@8 d5@2 f5 g5 bb5 ~ f5 ~ eb5@4 bb5@2 g5@2 f5@4 bb5@2 f5 ~ eb5@6 ~@12]/4",
  I: "[~@2 ab5 ~@2 g5 ~ f5@4 ~@5]/2", J: "[~@2 g5 ~@2 f5 ~ eb5@4 ~@5]/2", K: "~@2 g5 ~@2 f5 ~ eb5", L: "eb5@3 ~@5",
  M: "[ab4@2 c5@2 eb5@2 g5@4 g5@2 ~@2 f5@9 ~ g5@2 bb5 ~ f5 ~ eb5@4 bb4@2 ~@2 f5@4 bb5@2 f5 ~ eb5@9 ~@7 ab4@4 c5@2 eb5@2 g5@4 g5@2 ~@2 f5@8 d5@2 f5 g5 bb5 ~ f5 ~ eb5@4 bb5@2 g5@2 f5@4 bb5@2 f5 ~ eb5@6 ~@2 eb5@8 ~@2]/8",
})).s("gm_flute").gain(0.4)

// other · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  ~@3 A B@2 C D ~@11 E@5 F G@2 H I J@2 K@2 L@3 M N@3 ~@8 O@2 P@2 O@2 P@2 B@2 C D O@2 P@2 O@2 P@2 O@2 P@2 O@2 Q R@2 L@3 M
  N@3 S L@3 M T@3
>`.pickRestart({
  A: "c4 eb4 g4 c5 g5@2 eb5@2", B: "[ab4 c5 eb5 g5@2 g5 ~ f5@2 d5 c5 bb4@2 f4 bb4@2]/2", C: "~ g4 bb4 eb5 d4 g4 bb4 f5",
  D: "g4 c5 eb5 g5@4 ~",
  E: "[~@14 ab4@4 c5@2 eb5@2 g5@4 g5@2 ~@2 f5@8 d4@2 f4 g4 bb4 ~ f4 ~ eb4@4 bb4@2 g4@2 f4@4 bb4@2 f4 ~ eb4@6 ~@12]/5",
  F: "f4@5 ab4@2 bb4", G: "[~@5 bb4 ~ bb4@6 f4@2 eb4]/2", H: "~@2 c5 bb4 c5 eb5@2 ~", I: "ab4@5 c5@2 f5",
  J: "[~@5 d5 ~ eb5@6 bb4@2 g4]/2", K: "[~@3 g4@3 ~ g5@2 f5!2 eb5 eb5@2 g5@2]/2",
  L: "[~ f5 eb5 f5@2 eb5@2 g5@2 f5@2 f5@2 eb5@2 eb5@2 c5 bb4 c5@2 eb5@2 g5]/3", M: "f5@2 eb5 f5 eb5 f5 ~@2",
  N: "[~ f5 eb5 f5@2 eb5@2 g5@2 f5@2 f5@2 eb5@2 g5@3 f5 eb5@2 ~@3]/3", O: "[~@2 ab5 ~@2 g5 ~ f5@4 ~@5]/2",
  P: "[~@2 g5 ~@2 f5 ~ eb5@4 ~@5]/2", Q: "~@2 g5 ~@2 f5 ~ eb5", R: "[eb5@3 ~@4 g5@2 f5!2 eb5 eb5@2 g5@2]/2",
  S: "g5 f5!2 eb5 eb5@2 g5@2", T: "[~ f5 eb5 f5@2 eb5@2 g5@2 f5@2 f5@2 eb5@2 g5@3 f5 eb5@4 ~]/3",
})).s("gm_trumpet").gain(0.3)

// other · tenor sax · "Tenor Saxophone"
const tenor_sax = note("<~@7 A B C@4 D@3 ~@7 A B C@4 E@4 F@3 B G@3 ~@36 H@8 I@8>".pickRestart({
  A: "~@2 c4 bb3 c4 eb4@2 g3", B: "f3@2 eb3 f3 eb3 f3 ~@2",
  C: "[~@4 eb3 f3@2 g3@2 bb3 g3 bb3@2 bb3 g3 c4@2 ~ c4 bb3 c4 eb4@2 g3@2 f3@2 f3@2 eb3 f3 ~]/4",
  D: "[~@2 f3 eb3!2 f3@2 g3@2 bb3 g3 bb3@2 g3@2 c4@3 f3 eb3 ~@4]/3",
  E: "[~@2 f3 eb3!2 f3@2 g3@2 bb3 g3 bb3@2 g3@2 c4@3 f3 eb3 ~@3 g3@2 f3!2 eb3 eb3@2 g3@2]/4",
  F: "[~ f3 eb3 f3@2 eb3@2 g3@2 f3@2 f3@2 eb3@2 eb3@2 c3 bb2 c3@2 eb3@2 g3]/3",
  G: "[~ f3 eb3 f3@2 eb3@2 g3@2 f3@2 f3@2 eb3@2 g3@3 f3 eb3@2 ~@3]/3",
  H: "[ab3@2 c4@2 eb4@2 g4@4 g4@2 ~@2 f4@10 g4@2 bb4 ~ f4 ~ eb4@4 bb3@2 ~@2 f4@4 bb4@2 f4 ~ eb4@10 ~@6 ab3@4 c4@2 eb4@2 g4@4 g4@2 ~@2 f4@8 d4@2 f4 g4 bb4 ~ f4 ~ eb4@4 bb4@2 g4@2 f4@4 bb4@2 f4 ~ eb4@6 ~@12]/8",
  I: "[ab3@2 c4@2 eb4@2 g4@4 g4@2 ~@2 f4@10 g4@2 bb4 ~ f4 ~ eb4@4 bb3@2 ~@2 f4@4 bb4@2 f4 ~ eb4@10 ~@6 ab3@4 c4@2 eb4@2 g4@4 g4@2 ~@2 f4@8 d4@2 f4 g4 bb4 ~ f4 ~ eb4@4 bb4@2 g4@2 f4@4 bb4@2 f4 ~ eb4@6 ~@2 g3@8 ~@2]/8",
})).s("gm_tenor_sax").gain(0.4)

// other · tenor sax · "Tenor Saxophone" · soft notes
const tenor_sax_soft = note("<~@42 A B C ~@15 D@2 E@2 D@2 E@2 D@2 E@2 D@2 F G ~@16>".pickRestart({
  A: "eb4 ~@2 eb4 d4 ~@2 d4", B: "c4 ~@2 c4 bb3 ~@2 bb3", C: "ab3", D: "[~@2 ab4 ~@2 g4 ~ f4@4 ~@5]/2",
  E: "[~@2 g4 ~@2 f4 ~ eb4@4 ~@5]/2", F: "~@2 g4 ~@2 f4 ~ eb4", G: "eb4@3 ~@5",
})).s("gm_tenor_sax").gain(0.2)

// other · alto sax · "Alto Saxophone"
const alto_sax = note(`<
  ~@19 A@5 ~@4 B C@2 D@2 E@3 F G@3 H@2 I J ~ K ~@2 L@2 M@2 L@2 M@2 N@4 L@2 M@2 L@2 M@2 L@2 M@2 L@2 O P@2 E@3 F G@3 Q E@3
  F R@3
>`.pickRestart({
  A: "[~@14 ab3@4 c4@2 eb4@2 g4@4 g4@2 ~@2 f4@8 d4@2 f4 g4 bb4 ~ f4 ~ eb4@4 bb4@2 g4@2 f4@4 bb4@2 f4 ~ eb4@6 ~@12]/5",
  B: "f4@5 ab4@2 bb4", C: "[~@5 bb4 ~ bb4@6 f4@2 eb4]/2", D: "[~@3 eb4@3 ~ g4@2 f4!2 eb4 eb4@2 g4@2]/2",
  E: "[~ f4 eb4 f4@2 eb4@2 g4@2 f4@2 f4@2 eb4@2 eb4@2 c4 bb3 c4@2 eb4@2 g4]/3", F: "f4@2 eb4 f4 eb4 f4 ~@2",
  G: "[~ f4 eb4 f4@2 eb4@2 g4@2 f4@2 f4@2 eb4@2 g4@3 f4 eb4@2 ~@3]/3", H: "[ab4 bb4@27 bb4 c5 ~@2]/2",
  I: "g4 eb4 ~@2 f4 d4 ~@2", J: "eb4 c4 ~@2 d4 bb3 ~@2", K: "~@4 bb4 c5 ~@2 g4@2 eb4@2 f4@4",
  L: "[~@2 ab4 ~@2 g4 ~ f4@4 ~@5]/2", M: "[~@2 g4 ~@2 f4 ~ eb4@4 ~@5]/2",
  N: "[ab3@2 c4@2 eb4@2 g4@4 g4@2 ~@2 f4@8 d4@2 f4 g4 bb4 ~ f4 ~ eb4@4 bb4@2 g4@2 f4@4 bb4@2 f4 ~ eb4@6 ~@12]/4",
  O: "~@2 g4 ~@2 f4 ~ eb4", P: "[eb4@3 ~@4 g4@2 f4!2 eb4 eb4@2 g4@2]/2", Q: "g4 f4!2 eb4 eb4@2 g4@2",
  R: "[~ f4 eb4 f4@2 eb4@2 g4@2 f4@2 f4@2 eb4@2 g4@3 f4 eb4@4 ~]/3",
})).s("gm_alto_sax").gain(0.45)

// chords · electric guitar clean · "Electric Guitar"
const electric_guitar_clean = note(`<
  ~@8 A B C D A B C D ~@3 D A B C ~ A B C D A B C D E F G H E F G H ~@4 A B C D A B C D A B C D ~@4 A B C D A B C D A B
  C D A B C D E F G H E F G H E F G H E F G I
>`.pickRestart({
  A: "~@2 [ab3,c4,f4] ~@2 [ab3,c4,f4] ~@2", B: "~@2 [bb3,d4,f4] ~@2 [bb3,d4,f4] ~@2",
  C: "~@2 [bb3,eb4,g4] ~@2 [bb3,d4,f4] ~@2", D: "~@2 [c4,eb4,g4] ~@3 [c4,eb4,g4]!2",
  E: "[ab3,c4,eb4,g4]@3 [ab3,c4,eb4,g4]@2 [ab3,c4,eb4,g4]@2 [ab3,c4,f4]", F: "~@5 [ab3,c4,f4]@2 [bb3,eb4,g4]",
  G: "~@5 [bb3,d4,g4]@2 [bb3,c4,g4]", H: "~@3 [bb3,c4,eb4] ~@4", I: "~@3 [bb3,eb4,g4]@4 ~",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.4)

// other · baritone sax · "Baritone Saxophone"
const baritone_sax = note(`<
  ~@7 A B C D E F G D H I@4 J C D E F C D E J C D H J C D E J C D E ~@2 K L J C D H J C D H J C D H ~@4 F C D E F C D E
  F C D E F C D H J C D E J C D E J C D E J C D M
>`.pickRestart({
  A: "~@12 [d3,eb3] [c3,db3] [a2,bb2,b2] [g2,ab2]", B: "f2@4 ~ ab2@2 bb2, gb2 ~@15", C: "~@5 c3 bb2 eb3",
  D: "~@2 eb3 d3@3 d3 c3", E: "~@3 c3 bb2 c3 bb2 g2", F: "f2@3 f2@2 ab2@2 bb2", G: "~@3 bb2@2 bb2 c3 eb3",
  H: "~@2 c3 g2 bb2 c3@2 eb3", I: "[f3@5 f3@2 bb2@8 eb3@4 d3@4 c3@4 bb2@3 bb2@2]/4", J: "f2@4 ~ ab2@2 bb2",
  K: "eb3 ~@2 eb3 d3 ~@2 d3", L: "c3 ~@2 c3 bb2 ~@2 g2", M: "~@3 c3@4 ~",
})).s("gm_baritone_sax").gain(0.4)

// chords · piano
const piano = note(`<
  A@2 B@2 C@4 D@8 E@4 C@4 D@8 F@4 G@4 H@2 I J K L M N O P Q R S@4 C@4 T@12 U@3 V C@12 W@4
>`.pickRestart({
  A: "[~ c5 eb5 g5@2 g5@2 ~ d4@3 ~ g4 bb4 f4 eb4, [f4,ab4]@14 f5@8 d4@9 ~, ~@2 bb4 ~]/2", // Fm
  B: "[g4 ~ g4 ~@2 g4 f4 ~@2 g4 bb4 ~ eb4 [eb4,bb4]@2 ab4, eb4@4 eb4@4 [d4,bb4]@8 c4@15 ~, ~ bb4@3 ~@7 c5@2 ~@3, ~@6 f4@4 ~@4 eb4@9 ~@9]/2", // Eb5 Gm
  C: "[~@2 c5@2 eb5@2 g5@4 [f3,g5]@4 [d5,f5]@8 d4@2 f4 g4 bb4@2 f4@2 [eb4,g4]@6 g4@2 bb4@4 g4@2 f4@2 eb4@6 ~@8 bb2@4, ab4@13 ~@25 f4@2 ~@6 g4@17 ~, f3@9 ~@5 bb2@15 ~ eb3@8 d3@8 c3@8 bb2@6 ~@4, ~@26 c4@2 eb4@3 ~]/4", // Fsus2 Dm Eb
  D: "[[f3,ab4,c5,f5]@9 ~ [f3,ab4,c5,f5]@4 [bb2,d4,f4,bb4]@15 ~ [eb3,eb4,g4,bb4]@8 [d3,d4,f4,bb4]@8 c5@2 c5@6 c5@2 c5@4 [bb2,bb3,eb4,g4,c5]@4, ~@23 [c3,c4,eb4,g4]@4 [bb2,bb3,eb4,g4]@3 ~@2]/4", // Fm Bb Eb Bb Cm7 Cm Eb
  E: "[~ c5 eb5 g5@2 g5@2 ~ bb4@4 g4 bb4 f4 ~ g4 ~ g4 ~@2 g4 f4 ~@2 g4 bb4 ~ eb4 [eb4,bb4]@2 ab4, ab4@14 f5@9 ~@7 eb4@6 ~@2 f4@4 ~@4 eb4@9 ~@9, ~@17 bb4@3 bb4@4 ~@3 c5@2 ~@3]/4", // Eb5
  F: "[ab4@2 c5@2 eb5@2 g5@4 g5@2 ~@2 f5@9 ~ g5@2 bb5 ~ f5 ~ eb5@4 bb4@2 ~@2 f5@4 bb5@2 f5 ~ eb5@9 ~@9]/4",
  G: "[[ab4,c5,eb5]@13 ~ [bb4,d5,f5]@15 ~ [bb4,g5]@8 [bb4,f5]@8 [g4,c5,g5]@9 ~ [g4,c5,eb5]@8]/4", // Ab Bb Eb Bb5 C5 Cm
  H: "[[f2,f3,ab3,c4,eb4] ~@4 [f2,f3,ab3,c4,eb4] ~ bb2 bb2 [bb2,f3,bb3,d4]!2 ~@5, ~@7 [f3,bb3,c4]@2 ~@7]/2", // Fm7 Bb Fsus4
  I: "[bb3,eb4,g4]@2 ~ [eb3,bb3,eb4,g4] [bb3,d4,f4]@2 ~ [d3,bb3,d4,f4], eb3 ~@3 d3 ~@3", // Eb Bb
  J: "[g3,c4,eb4]@2 ~ [c3,g3,c4,eb4] [f3,bb3,d4]@2 ~ [g2,bb3,d4], c3 ~@3 bb2 ~@3", K: "[ab3,c4,eb4]@15 ~",
  L: "[bb3,d4,f4] ~", M: "[eb4,g4,bb4] [d4,f4,bb4]", N: "[eb4,g4,c5]@15 ~", O: "f2!4", P: "bb2!4",
  Q: "g3 g4 bb4 g5 d4 g4 f5 eb5, eb2 g2", R: "c4 eb4 g4 c5 [c3,g5]@2 [c3,eb5]@2, c3 ~",
  S: "[f2@4 ~ ab2@2 bb2 ~@5 c3 bb2 eb3 ~@2 eb3 d3@3 d3 c3 ~@2 c3 g2 bb2 c3@2 eb3, [ab4,c5,eb5]@13 ~ [bb4,d5,f5]@15 ~ [bb4,g5]@8 [bb4,f5]@8 [g4,c5,g5]@9 ~ [g4,c5,eb5]@8]/4", // Ab Bb Eb Bb5 C5 Cm
  T: "[[ab3,c4,eb4]@13 ~ [bb3,d4,f4]@15 ~ [bb3,g4]@8 [bb3,f4]@8 [g3,c4,g4]@9 ~ [g3,c4,eb4]@8]/4", // Ab Bb Eb Bb5 C5 Cm
  U: "[[ab3,c4,eb4]@13 ~ [bb3,d4,f4]@15 ~ [bb3,g4]@8 [bb3,f4]@8 [g3,c4,g4]@2]/3", V: "[g3,c4,g4] [g3,c4,eb4]",
  W: "[~@2 c5@2 eb5@2 g5@4 [f3,g5]@4 [d5,f5]@8 d4@2 f4 g4 bb4@2 f4@2 [eb4,g4]@6 g4@2 bb4@4 g4@2 f4@2 eb4@6 ~@2 [bb2,eb4,g4,bb4]@8 ~@2, ab4@13 ~@25 f4@2 ~@12 c4@9 ~@3, f3@9 ~@5 bb2@15 ~ eb3@8 d3@8 [c3,g4]@8 ~@10]/4", // Fsus2 Dm Eb C5
})).s("gm_piano").gain(0.61)

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

// drums · snare
const snare = s("sd").struct("<~@8 A@8 ~ B A@13 C A@24 ~@3 B A@15 D A@7 E A@7 C>".pickRestart({
  A: "~ x ~ x", B: "~@3 x", C: "~ x ~@2", D: "x ~@3 x ~@3 x!4 ~@4", E: "~@8 x!2 ~ x ~@4",
})).gain(0.59)

// drums · low tom
const low_tom = s("lt").struct("<~@31 [~@13 x ~@2] ~@43 [~@15 x] ~@7 [~@15 x] ~@8>").gain(0.66)

// drums · hihat
const hihat = s("hh").struct("<~@8 A@8 ~@2 A@13 B C D@23 ~@3 A@16 ~@17>".pickRestart({
  A: "x!4", B: "x!2 ~@2", C: "~ x!7", D: "x!8",
})).gain(0.59)

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 [~@11 x ~@4] ~@43 [~@7 x] ~@7 [~@4 x!4 ~@5 x ~@2] ~@8>").gain(0.74)

// drums · high tom
const high_tom = s("ht").struct("<~@31 [~ x] ~@43 [~@12 x!2 ~@2] ~@7 [x!4 ~@8 x ~@3] ~@8>").gain(0.74)

// drums · crash
const crash = s("cr").struct("<~@32 x ~@43 x ~@7 x ~@7>").gain(0.66)

// drums · ride
const ride = s("rd").struct("<~@75 [x!2 ~@2] [~ x!3] [x!4]!6 ~ [~ x!3] [x!4]!6 [x!2 ~@2]>").gain(0.66)

stack(
  flute, trumpet, tenor_sax, tenor_sax_soft, alto_sax, electric_guitar_clean, baritone_sax, piano, kick, snare, low_tom,
  hihat, mid_tom, high_tom, crash, ride
)