Strudelify

Le carnaval des animaux

C. Saint-Saëns

KeyG majorTempo60 bpm
0:00/0:00
// Le carnaval des animaux — C. Saint-Saëns
// 60 bpm, 6/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/1752116; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 28 bars on a 48-step grid, each part at one level. Source detail keeps the original performance.
setcpm(60/6)

// 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@2 B@2 A@2 C D E F G H I J K L M A B@2 N O P Q R S@2 T>".pickRestart({
  A: "b3 d4 b4 g4 b3 d4 b4 g4 b3 d4 b4 g4 b3 d4 b4 g4 b3 d4 b4 g4 b3 d4 b4 g4, g2 d3 g3 d3 g2 d3 g2 d3 g3 d3 g2 d3",
  B: "c4 e4 c5 a4 c4 e4 c5 a4 c4 e4 c5 a4 c4 e4 c5 a4 c4 e4 c5 a4 c4 e4 c5 a4, g2 e3 a3 e3 g2 e3 g2 e3 a3 e3 g2 e3",
  C: "c#4 e4 c#5 a#4 c#4 e4 c#5 a#4 c#4 e4 c#5 a#4 c#4 e4 c#5 a#4 c#4 e4 c#5 a#4 c#4 e4 c#5 a#4, g2 e3 a#3 e3 g2 e3 g2 e3 a#3 e3 g2 e3",
  D: "b3 d4 b4 f#4 b3 d4 b4 f#4 b3 d4 b4 f#4 a#3 e4 a#4 f#4 a#3 e4 a#4 f#4 a#3 e4 a#4 f#4, f#2 d3 f#3 d3 f#2 d3 f#2 c#3 f#3 c#3 f#2 c#3",
  E: "d4 f#4 b4 f#4 d4 f#4 b4 f#4 d4 f#4 b4 f#4 d4 f#4 b4 f#4 d4 f#4 b4 f#4 d4 f#4 b4 f#4, b2 f#3 b3 f#3 b2 f#3 b2 f#3 b3 f#3 b2 f#3",
  F: "d4 g4 d5 b4 d4 g4 d5 b4 d4 g4 d5 b4 c#4 e4 c#5 g4 c#4 e4 c#5 g4 c#4 e4 c#5 g4, b2 d3 b3 d3 b2 d3 a#2 d3 a#3 d3 a#2 d3",
  G: "c4 e4 c5 g4 c4 e4 c5 g4 c4 e4 c5 g4 c4 e4 c5 g4 c4 e4 c5 g4 c4 e4 c5 g4, a2 d3 a3 d3 a2 d3 d2 d3 a3 d3 a2 d3",
  H: "c4 f4 c5 a4 c4 f4 c5 a4 c4 f4 c5 a4 b3 d4 b4 f4 b3 d4 b4 f4 b3 d4 b4 f4, a2 c3 a3 c3 a2 c3 g#2 c3 g#3 c3 g#2 c3",
  I: "a#3 c4 a#4 f4 a#3 c4 a#4 f4 a#3 c4 a#4 f4 a#3 c4 a#4 f4 a#3 c4 a#4 f4 a#3 c4 a#4 f4, g2 c3 g3 c3 g2 c3 c2 c3 g3 c3 c2 c3",
  J: "a3 e4 a4 e4 a3 e4 a4 e4 a3 e4 a4 e4 a3 e4 a4 e4 a3 e4 a4 e4 a3 e4 a4 e4, f2 a2 f3 a2 f2 a2 e2 a2 e3 a2 e2 a2",
  K: "a3 e4 a4 e4 a3 e4 a4 e4 a3 e4 a4 e4 a3 e4 a4 e4 a3 e4 a4 e4 a3 e4 a4 e4, d2 a2 d3 a2 d2 a2 e2 a2 e3 a2 e2 a2",
  L: "a3 e4 a4 d4 a3 e4 a4 d4 a3 e4 a4 d4 a3 c#4 a4 e4 a3 c#4 a4 e4 a3 c#4 a4 e4, f2 a2 f3 a2 f2 a2 e2 a2 e3 a2 e2 a2",
  M: "a3 d4 a4 f4 b3 d4 a4 f4 c4 d4 a4 f4 c4 d4 a4 f#4 c4 d4 a4 f#4 c4 d4 a4 f#4, d2 a2 d3 a2 d2 a2 c3 c2 b2 b1 a2 a1",
  N: "b3 d4 b4 f4 b3 d4 b4 f4 b3 d4 b4 a4 d4 g4 d5 b4 d4 g4 d5 b4 d4 g4 d5 b4, g2 d3 g3 d3 f2 b2 e2 b2 g#3 b2 e2 b2",
  O: "c4 e4 c5 a4 c4 e4 c5 a4 c4 e4 c5 a4 c4 e4 c5 a4 c4 e4 c5 a4 c4 e4 c5 a4, a2 e3 a3 e3 a2 e3 a2 f#3 a3 f#3 a2 e3",
  P: "b3@2 d4@2 b4@2 g4@2 b3@2 d4@2 b4@2 g4@2 b3@2 d4@2 b4@2 g4@2 [e2,e3,a3,c4,g4]@23 ~, b2 d3 g3 d3 b2 d3 ~@6", // Am7
  Q: "d2 ~ d4@2 b4@2 g4@2 d4@2 g4@2 d5@2 b4@2 g4@2 b4@2 g5@2 d5@2 ~@24, b3 ~ g3@2 b3@2 g3@2 d4@2 b3@2 ~@12, ~ d3@3 ~@44",
  R: "b3@2 e4@2 b4@2 ~ g4@2 e4@2 g4@2 e5@2 ~ b4@2 g4@2 b4@2 g5@2 ~ e5@2 [d4,a4,c5]@5 ~@16, [d2,d3] ~@5", // D7 D
  S: "[~@27 e6@2 g6@2 e7@2 b6@2 d6@2 g6@2 d7@2 b6@2 b5@2 e6@2 b6@2 g6@2 e5@2 g5@2 e6@2 b5@2 d5@2 g5@2 d6@2 b5@2 b4@2 e5@2 b5@2 g5@2 b4@2 d5@2 b5@2 g5@2 e4@2 g4@2 e3@3 b4@2 d4@2 g4@2, ~@27 b5@4 e5@4 b5@4 d5@4 e5@4 b4@4 b4@4 e4@4 b4@4 d4@4 e4@4 b3@4 d4@4 b3@4 b3@4 e5@2 ~@3 b3@4]/2",
  T: "d5@2 b4@2 ~ b3@3 d4@3 b4@3 g4@3 [g2,b3]@8 ~@23, d3@4 ~ g3@6 b2@6 ~@31", // G
})).s("gm_piano").gain(0.15)

// chords · piano
const piano_2 = note("<A@2 B C D E F G H I@2 J K ~ L ~ M A B C N O P Q ~@2 R S>".pickRestart({
  A: "[g2,d3,b3,d4]@4 ~@9 b5@3 ~@8, ~@3 [b3,d4,g4,b4] ~@2, ~@25 [d5,g5]@7 ~@16", // G G5
  B: "[g2,e3,a3,c4,e4]@4 ~@9 c6@3 ~@8, ~@3 [g3,e4,a4,c5] ~@2, ~@25 [e5,a5]@7 ~@16", // Am7 A5
  C: "~@2 c5@6 ~@17 [f#4,c5]@7 ~@16, [g2,e3,a3,c4] ~@2 [g2,d3,a3,c4] ~@2, ~ [e4,a4]@7 ~@40", // F#dim Am7 Gsus4 A5
  D: "~ [g4,b4]@7 ~@18 [b5,d6]@6 ~@16, [g2,d3,g3,b3] ~@2 [b3,d4,g4,b4] ~@2, ~@25 [d5,g5]@7 ~@16", // G Bm G G5
  E: "[g2,d3,b3,d4]@4 ~@9 [b5,d6]@3 ~@8, ~@3 [b3,d4,g4,b4] ~@2, ~@25 [d5,g5]@7 ~@16", // G Bm G G5
  F: "~ a#4@3 ~@9 a#5@3 ~@8, g2@24 f#2@23 ~, a#3@8 ~@17 [c#5,e5]@7 ~@16, ~ [c#4,e4]@7 ~@16 a#4@8 ~@16", // C#m
  G: "~ d5@3 ~@9 a#4@3 ~@8, [f#2,d3,f#3,b3,d4] ~@2 [f#2,c#3,f#3,a#3] ~@2, ~ [f#4,b4]@7 ~@17 [e4,f#4]@7 ~@16", // Bm F# B5 Esus2
  H: "[b1,b2,b3,d4,f#4,b4]@4 ~@9 b6@3 ~@8, ~@3 [f#4,b4,d5,f#5,b5] ~@2, ~@25 [d6,f#6]@7 ~@16", I: "~ [d6,d7]!5",
  J: "~ [c6,c7]!5", K: "~ [c6,c7]!2 ~ [c6,c7]!2", L: "[d4,f#4,d5,f#5]@8 [c4,e4,c5,e5]@5 ~@3, [a3,a4]@13 ~@3",
  M: "[f4,f5]@3 ~ b3 c4, [d4,d5], a3@2 ~, ~@24 [f#4,f#5]@23 ~", // F D F#
  N: "g2@4 f2@2 ~@2 [d4,g#4,d5] ~@3, ~ e2, ~@6 [d4,g#4] ~@5, ~@25 [b2,g#3]@23", // Ddim E
  O: "c4 e4 c5 e4 c4 e4 c4 f#4 c5 f#4 c4 f#4, a2 e3 a3 a2 f#3 a3", P: "[b1,b2,b3,d4,g4,b4]@23 ~ [e2,e3,a3,c4,g4]@23 ~",
  Q: "[d2,d3,d4]@23 ~@25", R: "~@12 [g5,b5]@7 ~@29, ~@11 [b3,g4,b4]@8 ~@29",
  S: "~@18 g5@7 ~@23, ~@17 [g2,d3,b3,g4,b4,d5]@8 ~@23", // G
})).s("gm_piano").gain(0.15)

stack(piano, piano_2)