Strudelify
Dance Hall Days cover art

1984 · Points On The Curve

Dance Hall Days

Wang Chung

KeyC majorTempo109 bpm
0:00/0:00
// Dance Hall Days — Wang Chung
// 109 bpm, 4/4, key C major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 108 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 · [...]/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 · string ensemble 1 · "Split Chan 1"
const string_ensemble_1 = note(`<
  ~@2 A@2 B@2 C D E@2 ~@7 F@3 G@2 H@2 I@2 J K G@2 C L ~@8 M@2 C D A@2 N@2 O P A@2 C Q A@2 E@2 ~@16 G@2 R@2 S@2 T@2 J P
  A@2 U@2 C D R@2 V@4 W@4 X@2 Y@2 G@2 Z AA
>`.pickRestart({
  A: "[[f4,a4]@8 e4@7 ~ d4@15 ~, ~ g4@3]/2", B: "[[f4,a4]@7 ~ e4@8 [d4,b4]@16, ~@7 g4@24 ~]/2", C: "[f4,a4] [e4,g4]",
  D: "[d4,g4]", E: "[[f4,a4]@8 e4@7 ~ [d4,b4]@13 ~@3, ~@8 g4@21 ~@3]/2",
  F: "[~@16 f4@8 e4@7 ~ d4@16, ~@15 a4@8 ~ g4@24]/3", G: "[[f4,a4]@8 e4@7 ~ d4@16, ~ g4@3]/2",
  H: "[[f4,a4]@8 e4@7 ~ d4@14 ~ f4, ~@8 g4@23 ~]/2", I: "[~@8 e4@7 ~ d#4@8 [d4,b4]@8, c5@3 ~, f4@15 ~@17]/2",
  J: "[f4,a4] [e4,g#4]", K: "a4@4 b4@4 c5@7 ~", L: "~ [d4,g4]@6 ~, b4@7 ~, ~@2 a4 ~@13",
  M: "[a4@3 a4@5 e4@7 ~ d4@15 ~, f4@7 ~ g4@23 ~]/2", N: "[f4@8 e4@7 ~ d#4@7 ~ [d4,b4]@8, c5@3 ~]/2",
  O: "[f4,a4] [e4,g#4], ~@8 d4 ~@7", P: "a4 b4 c5@2", Q: "[g4,b4], d4@7 ~",
  R: "[[f4,a4]@8 e4@7 ~ [d4,b4]@16, ~ g4@3]/2", S: "[[f4,a4]@8 e4@7 ~ d4@16, g4 ~@7 g4@24]/2",
  T: "[[f4,a4]@8 e4@7 d#4@8 ~ [d4,b4]@8, c5@23 ~@9]/2", U: "[[f4,a4]@8 e4@7 ~ d4@15 ~, ~ g4@3, ~@15 b4@16 ~]/2",
  V: "[[f4,a4]@8 e4@7 ~ d4@15 ~ f4@7 ~ e4@7 ~ d4@15 ~, ~@8 g4@23 a4@8 ~ g4@24, ~@47 b4@16 ~]/4", // F
  W: "[[f4,a4]@8 e4@7 ~ d4@11 d4@4 ~ f4@7 ~ e4@7 ~ d4@15 ~, ~@8 g4@23 a4@9 g4@24, ~@47 b4@16 ~]/4", // F
  X: "[[f4,a4]@8 e4@7 ~ d4@2 ~@14, ~@4 g4@5 ~@7]/2", Y: "[[f4,a4]@7 ~ e4@7 ~ [d4,b4]@3 ~@13, ~@7 g4@12 ~@13]/2",
  Z: "a4@8 [e4,g4]@7 ~, f4@3 ~", AA: "[d4,g4] ~@7",
})).s("gm_string_ensemble_1").gain(0.38)

// bass · electric bass finger · "Split Chan 16"
const bass = note(`<
  ~@2 A B A B C B C B C B C B C B C D E F E F E F G H I J K L M D A B C B C B C D E F E F E F N H O P K L K L Q L K B C
  B C B C B C B C B C B C B R S E F E F E F G T I P Q L Q L U L Q L Q S V D V W Q S X Y Z AA A AB X AA
>`.pickRestart({
  A: "f2@8 c2@7 ~", B: "g1", C: "f2 c2", D: "g1@15 ~", E: "f2 ~ f2 ~ f2 ~ f2 ~ e2 ~ e2 ~ e2 ~ e2 ~",
  F: "g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~ g1 ~", G: "f2 e2", H: "d#2@8 d2@7 ~", I: "f1@8 e1@7 ~",
  J: "a1@3 ~ b1@3 ~ c2@6 ~ e2", K: "f2 e2 f2@6 c2@7 ~", L: "g1@14 ~ e2", M: "f2 ~ f2@5 ~ c2@7 ~, ~@2 e2 ~@13",
  N: "f2@7 ~ e2@8", O: "f1@7 ~ e1@7 ~", P: "a1@4 b1@3 ~ c2@5 ~@2 e2", Q: "f2 e2 f2@6 c2@8", R: "f2@7 ~ c2@8",
  S: "g1@7 ~", T: "d#2 d2", U: "f2 ~ f2@6 c2@8, ~@2 e2 ~@13", V: "[e2,f2] ~ f2@6 c2@8, ~@2 e2 ~@13", W: "g1@15 e2",
  X: "~ f2@6 ~ c2@7 ~", Y: "g1@3 ~@12 f2", Z: "~ f2@7 c2@7 ~", AA: "g1 ~@7", AB: "g1@14 ~ f2",
})).s("gm_electric_bass_finger").gain(0.48)

// drums · kick
const kick = s("bd").struct(`<
  [x!2]!101
  [x ~@6 x ~ x ~ x ~@4]
  [x!2]
  [x ~@6 x ~ x ~ x ~@4]
  [x!2]
  [x ~@6 x ~ x ~ x ~@4]
  [x!2]
  x
>`).gain(0.6)

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

// drums · low tom
const low_tom = s("lt").struct("<~@27 A ~@29 A ~@15 A ~@25 A ~ B ~ B ~ B ~@2>".pickRestart({
  A: "~@7 x", B: "~@15 x",
})).gain(0.54)

// drums · hihat
const hihat = s("hh").struct("<A@27 B A@11 ~ A@17 B A@15 B A@17 ~ A@7 B A@7 C>".pickRestart({
  A: "x!8", B: "x!7 ~", C: "x",
})).gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@27 A ~@29 A ~@15 A ~@25 A ~ B ~ B ~ B ~@2>".pickRestart({
  A: "~@11 x ~ x ~@2", B: "~@7 x",
})).gain(0.54)

// drums · open hat
const open_hat = s("oh").struct("<~@27 A ~@29 A ~@15 A ~@25 A ~@8>".pickRestart({
  A: "~@7 x",
})).gain(0.3)

// drums · high tom
const high_tom = s("ht").struct("<~@27 A ~@29 A ~@15 A ~@25 A ~ B ~ B ~ B ~@2>".pickRestart({
  A: "~@9 x ~@6", B: "~@13 x ~@2",
})).gain(0.54)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<A@27 B A@11 C A@17 B A@15 B A@17 C A@7 B A@7 D>".pickRestart({
  A: "~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2", B: "~@2 x!3 ~ x!2 ~@2 x!2 ~@2 x!2", C: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x",
  D: "x",
})).gain(3.04)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<A@27 B A@11 C A@17 B A@15 B A@17 C A@7 B A@7 ~>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", B: "x!2 ~@3 x ~@2 x!2 ~@2 x!2 ~@2", C: "x!8",
})).gain(1.52)

stack(string_ensemble_1, bass, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, cabasa, cabasa_soft)

More by Wang Chung