Strudelify
KeyC majorTempo120 bpm
0:00/0:00
// YMCA — Luis Terrados Valderas
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5387579; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 43 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · piano
const piano = note(`<
  A@2 B A@2 B C@2 A@2 B A@2 B D E F@2 G H I J K L M F@2 N O P Q R S B T U T U R V W L ~
>`.pickRestart({
  A: "c4 ~ e4 ~ g4@2 ~@2", B: "c4 ~ e4 ~ a4@2 ~@2", C: "[b4@3 a4@3 g4@3 f4@3 e4@2 d4@2]/2",
  D: "g4@3 ~ g4@3 ~ g4@3 ~ g4@3 ~", E: "g4@3 ~@13", F: "[c5@4 c5@2 c5 c5@2 e5!2 d5!2 c5 c5@2]/2", G: "a4@4 a4@2 g4 a4",
  H: "a4 ~@3", I: "c5 b4", J: "a4 g4", K: "a4 b4", L: "c5@15 ~",
  M: "a4@2 a#4@2 b4@2 c5 [c#5,d5] [d#5,e5] d#5 d5 c#5 c5@4", N: "a4@4 a4@2 a4!2", O: "f4 ~@3", P: "f4 e4", Q: "d4 c4",
  R: "d4 e4", S: "f4 ~", T: "c4 e4 g4@2", U: "c4 ~@3 e4 ~@3 g4@3 ~@5", V: "c4@15 ~", W: "b4@15 ~",
})).s("gm_piano").gain(0.3)

// other · orchestral harp
const orchestral_harp = note(`<
  A B C D E F G@2 A B C D E F H I J@2 K@2 L M N O P J@2 K@2 L M N Q R S T S T N U V W ~
>`.pickRestart({
  A: "c5!2 c5@2", B: "c5@2 c5@3 c5 b4@2", C: "a4@2 a4@2 a4!4", D: "a4@2 a4@3 a4 g4@2", E: "f4@2 f4@2 f4!4",
  F: "d4@2 d4@2 d4!4", G: "[b4@3 a4@3 g4@3 f4@3 e4@2 d4@2]/2", H: "g4@3 ~ g4@3 ~ g4@3 ~ g4@3 ~", I: "g4@3 ~@13",
  J: "[c4,g4]", K: "[e4,a4]", L: "[f4,f5]", M: "[d4,d5]", N: "[g4,g5] [f4,f5]", O: "[d4,d5] [g4,g5]", P: "b4@11 ~@5",
  Q: "[d4,d5] ~ [g4,g5] ~", R: "c5@2 c5 ~ c5!4", S: "c5@2 c5@2 c5 b4 c5 b4", T: "a4 ~@3 a4 ~@3 e4@3 ~@5", U: "a4!8",
  V: "a4", W: "c4",
})).s("gm_orchestral_harp").gain(0.3)

// other · harmonica
const harmonica = note("<~ A ~ A ~ B C D ~ A ~ A ~ B ~@2 E ~ F ~@7 G ~@2 H@2 I J K ~ L@2 M@2 N O P ~>".pickRestart({
  A: "c4 d4 e4 g4@2 e4 g4@2", B: "d4 e4 f4 a4@2 c5 a4@2", C: "b4@3 a4@3 g4@2", D: "g4 f4@3 e4@2 d4@2",
  E: "a4@4 ~@4 g4@2 ~@2 a4 ~ g4 ~", F: "e4@4 ~@4 d4@2 ~@2 e4 ~ d4 ~", G: "a4 c5 a4 g4",
  H: "[c5 a4 g4 c5@2 c5@2 a4@2 a4 g4 c5@2 c5@2 a4]/2", I: "f4 g4 f4 g4 c5@4", J: "c5@4 d4 f4 e4 g4",
  K: "c4 ~ e4 ~ g4@2 ~@2", L: "[c4 ~@3 e4 ~@3 g4@11 ~@13]/2", M: "[c4 ~@3 e4 ~@3 g4@11 ~@5 e4@8]/2",
  N: "f4@2 f4 g4 ~@4", O: "g4", P: "c4",
})).s("gm_harmonica").gain(0.3)

// drums · bongos
const bongos = s("bongo:4").struct("<~@42 x>").gain(1.17)

// drums · whistle
const whistle = s("ballwhistle:0").struct("<~@42 x>").gain(0.58)

stack(piano, orchestral_harp, harmonica, bongos, whistle)