Strudelify

the lion sleeps tonight

The Tokens

KeyF majorTempo120 bpm
0:00/0:00
// the lion sleeps tonight — The Tokens
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5853397; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 51 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 · "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 · piano
const piano = note(`<
  A B C@2 D E D F D E D G H I J@2 K L M@2 N O P Q N O R@2 S T U V W@2 X Y Z AA AB AC AD AA AB AE AF AA AG AH AI AJ AK
>`.pickRestart({
  A: "f4@2 g4 a4 a4@2 g4@2", B: "bb4@2 a4 g4@2 f4@2 f4",
  C: "[a4 c4@2 c4@2 c4 ~@2 [e3,g3]!2 ~ [e3,g3]!3 ~ c4, ~@3 c4@4 ~]/2", D: "[f3,a3,c4]!8, f4", E: "[f3,bb3,d4]!8, f4",
  F: "~ [g3,bb3,c4,e4]!3 ~ [g3,bb3,c4,e4]!2 c4", G: "~ [g3,bb3,c4,e4]!3 ~ [g3,bb3,c4,e4]!3",
  H: "[a3,c4,f4]@2 g4 a4@2 g4@2 a4", I: "[d4,f4,bb4]@2 a4 g4@2 f4@2 g4",
  J: "[[c4,f4,a4] g4@2 [a3,c4,f4]@3 a4 ~@2 [g3,c4,e4] ~ [g3,c4,e4]!3 ~ c4, ~@7 g4@7 ~@2]/2", // F C
  K: "[a4,c5] c4 [f4,a4] [c4,g4]@2 [c4,f4,a4]@2 [c4,f4,c5]", // Am F C5 F F5
  L: "[d4,f4,bb4]@2 [c4,f4,a4] [bb3,d4,g4]@2 [bb3,d4,f4]@2 [bb3,d4,g4]", // Bb F Gm Bb Gm
  M: "[[c4,f4,a4] [bb3,d4,g4]@2 [a3,c4,f4]@2 c4 [c4,f4,a4] [c4,e4,g4]@2 [g3,c4,e4]!3 ~ [g3,c4,e4]!2 c4]/2", // F Gm F C
  N: "[c4,f4,a4]!8, c5", O: "[d4,f4]!2 [d4,f4,bb4] [d4,f4,c5] ~ [d4,f4,bb4] ~ [c4,f4,a4], c5 ~@3",
  P: "~ [a3,c4] ~ [f3,bb3] ~ f3 [f3,a3] f3, ~@3 c4", Q: "[e3,g3]!2 ~ [e3,g3]!3 ~ c4, c4@3 ~",
  R: "[~ [a3,c4] ~ [f3,a3,c4] ~ f3 [f3,a3] f3 [e3,g3]!2 ~ [e3,g3]!3 ~@2, ~@3 c4@4 ~]/2", // Am F Em
  S: "[a4,c5]@2 [c5,f5,a5] g5 f5 e5 d5 c5", T: "bb4 ~ [f4,f5] ~ [bb4,bb5] ~ [d5,d6] ~",
  U: "[c5,c6]@2 a5 g5 f5 e5 d5 c5", V: "bb4@2 [f4,f5] ~ [bb4,bb5] ~ [d5,d6] ~",
  W: "[[d5,bb5]@2 a5 g5 f5 e5 d5 ~ [g4,c5]@3 e5 [a4,f5]@2 [g4,e5]@2, ~@7 e5@4 ~@5]/2", X: "[f4,a4,c5]!8, f5",
  Y: "[f4,bb4,d5]!8, f5", Z: "[f4,a4,c5]!6 ~ [f4,a4,c5], f5", AA: "~ [g4,bb4,c5,e5]!3 ~ [g4,bb4,c5,e5]!2 ~",
  AB: "[a4,c5,f5] d5 c5 [a4,c5]@2 a4 [a4,c5,f5]@2, ~@3 f5@3 ~@2", // F Am F
  AC: "[f4,bb4,f5] d5 c5 [bb4,d5]@2 bb4 [bb4,d5,f5]@2, ~@3 f5@3 ~@2", // Bb5 Bb
  AD: "[a4,c5,f5] d5 c5 [a4,c5,f5]@2 a4 [a4,c5,f5]!2", // F
  AE: "[f4,bb4,f5] d5 c5 [bb4,d5,f5] [bb4,d5] bb4 [bb4,d5,f5]@2, ~@2 f5 ~", // Bb5 Bb
  AF: "[a4,c5,f5] d5 c5 [a4,c5,f5] [a4,c5] a4 [a4,c5,f5]@2, ~@2 f5 ~", AG: "f4@2 g4 a4@2 g4@2 a4",
  AH: "bb4@2 a4 g4@2 f4@2 g4", AI: "a4 g4@2 f4@3 a4@2", AJ: "g4@2 [g3,c4,f4] [g3,c4,e4]", AK: "[a3,c4,f4]",
})).s("gm_piano").gain(0.3)

// bass · piano
const bass = note(`<
  A B C D E F E G E F E H I J K L E M E N E M E N E M E G O M E M P Q E M E N I R K S E M E H A B T U V
>`.pickRestart({
  A: "[f3,a3,c4]", B: "[f3,bb3,d4]", C: "[f3,a3]", D: "[c2,c3]!8", E: "f1!2 f2!2 f1!2 f2!2",
  F: "bb1!2 bb2!2 bb1!2 bb2 bb1", G: "c2!2 c3!2 c2!2 c3 c2", H: "c2!2 c3!2 c2!2 c3@2", I: "[f2,f3]@2 f3 c3",
  J: "bb2@2 f3 bb2", K: "f2@4 f3 c3 f3@2", L: "c2!2 c3 g2 c2!2 c3@2", M: "bb1!2 bb2!2 bb1!2 bb2!2",
  N: "c2!2 c3!2 c2!2 c3!2", O: "[f1,f2]@4 f2@2 c2 f2", P: "g1 d2 g2 bb2", Q: "c3 c2 c3 c2", R: "bb1@2 bb2 f2",
  S: "[c2,c3]@2 c3 g2 [c2,c3] c2 c3 g2", T: "[f3,c4]", U: "[e3,g3,c4] [c2,c3]", V: "[f1,f2]",
})).s("gm_piano").gain(0.3)

stack(piano, bass)