Strudelify

Y'a le printemps qui chante

Claude Francois

KeyF majorTempo90 bpm
0:00/0:00
// Y'a le printemps qui chante — Claude Francois
// 90 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 6 synth brass 1 (copy of ch 5 trumpet)
// note: Full arrangement: all 74 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(90/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 · synth brass 2
const synth_brass_2 = note(`<
  A B C A D E F G D H F I J K J K L@2 M N O P Q@2 R L@2 M N O P Q@2 R D E F G D H F I J K J K L@2 M N O P Q@2 R L@2 M N
  O P Q@2 R L@2 M N O P Q@2 R ~
>`.pickRestart({
  A: "c4", B: "a3", C: "f3 bb3", D: "f4 g4, c4", E: "~ a4, f4", F: "[d4,f4] [e4,g4]", G: "[c4,f4] ~", H: "c4 a4, f4",
  I: "[f4,a4]@7 ~", J: "~ bb4, g4, ~@3 d4@5", K: "~ c5, g4, ~@3 e4@5",
  L: "[f2@4 f2@2 f3!2 f2@2 f3@2 f2@2 f3!2 f2@2 f3@2 f2@2 [a4,c5,f5] ~ g2@2 g3!2 g2@2 g3@2, [a4,c5,f5]@10 ~ f3 [bb4,d5,g5]@4]/2", // F Gm
  M: "g2@2 g3@2 g2@2 g3@2 g2@2 g3!2 g2@2 g3@2, [bb4,d5,g5]!2", // Gm
  N: "g2@2 g3!2 g2@2 g3!2 g2@2 g3!2 g2@2 g3@2, [bb4,d5,g5]!2", O: "f2@2 f3!2 f2@2 f3!2 f2@2 f3!2 f2@2 f3@2, [a4,c5,f5]",
  P: "f2@2 f3!2 f2@2 f3!2 f2@2 f3@2 f2@2 f3!2, [a4,c5,eb5,f5]@15 ~", // F7
  Q: "[bb2@2 bb3 bb2 bb2@2 bb3 bb2 bb2@2 bb3!2 bb2@2 bb3 bb2 g2@2 g3!2 g2@2 g3!2 g2@2 g3 [g2,g3] g2@2 g3@2, d5@15 ~, [f4,bb4]@8 [g4,b4,f5]@7 ~]/2", // G Bb5 G7
  R: "c3@3 c4 [c3,e4,g4,bb4,c5]@4, [e4,g4,bb4,c5] ~", // C7
})).s("gm_synth_brass_2").gain(0.26)

// bass · acoustic bass
const bass = note(`<
  A B C D A B C E A B C F G H I J K L I@2 K M N O P K L I@2 K M N O P A B C E A B C F G H I J K L I@2 K M N O P K L I@2
  K M N O P K L I@2 K M N O P Q
>`.pickRestart({
  A: "f3 e3", B: "d3 c3", C: "bb2 c3", D: "f2@5 ~ f2 ~ f2@4 f2@4", E: "f2@5 ~ f2 ~ f2@8",
  F: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2@2", G: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2@2",
  H: "c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3@2", I: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~",
  J: "c3 ~ c3 ~ g2 ~ g2 ~ c3@2 bb2 ~ a2 ~ g2 ~", K: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~",
  L: "f2 ~ f2 ~ f2 ~ f2 ~ g2 ~ g2 ~ g2 ~ g2 ~", M: "f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ f2 ~ c3 e3 f3 ~",
  N: "bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ bb2 ~ d3 e3 f3 ~", O: "g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ g2 ~ d3 e3 f3 ~",
  P: "c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3 ~", Q: "~ f2@7 ~@8",
})).s("gm_acoustic_bass").gain(0.36)

// chords · piano
const piano = note("<A B C D E F@3 G H I J@3 K@2 ~@18 E F@3 G H I J@3 L@2 ~@28>".pickRestart({
  A: "~@2 [f4,a4] [g4,bb4] [a4,c5]@8 ~@4", B: "~@2 [d4,f4] [e4,g4] [f4,a4]@8 ~@4",
  C: "~@2 [bb3,d4] [c4,e4] [d4,f4]@3 ~ [bb3,e4,g4]@4 c4@2 ~@2", D: "c5 d5 c5@14",
  E: "[f3,c4,f4,a4,c5]@11 ~ [e3,e4,g4,c5]@3 ~", // F C
  F: "[[d3,a3,d4,f4,a4,c5]@8 ~@4 a3@2 ~@6 bb3@3 ~ c3@4 g3@2 e4@2 [f3,f4,a4]@12 ~@4, ~@2 f4@4 c5@5 ~, ~@8 a4@8 [bb2,f3,bb4]@7 ~@25, ~@4 [f3,c5]@3 d4@5 ~@2 g4@2 ~@8]/3", // Dm7 F Bb5 F5
  G: "[f3,f4,a4,c5]@7 ~ [e3,e4,g4,c5]@7 ~", H: "~@3 d4 ~@3 c4, [d3,c5]@4 [c3,c5]@3 ~, ~ a4@3 a4@4, ~@5 f4@3",
  I: "~@6 f4@2 ~@4 g4@2 e4 ~, bb4@4 ~ bb4@2 ~, bb2@6 ~@2 [c3,c5]@7 ~, ~ d4@3 ~@4", // C
  J: "[f3 ~ f3 ~ [f3,c4] ~ [f3,c4] ~ [f3,a3,c4] ~ [f3,c4] ~ [f3,a3,c4] ~ [f3,c4,a4,c5] ~ d3 ~ d3 ~ d3 ~ d3 ~ [d3,bb3] ~ [d3,bb3] ~ [d3,bb3] ~ [d3,bb3,f4,d5] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3] ~ [c3,g3,bb3] ~ [c3,bb3] ~ c3@2 [g3,e4,g4,bb4,c5]@2, [f4,a4,c5]@7 f4@7 ~@2 [e4,g4,c5]@6 ~@2, ~@8 [g4,d5]@6 ~ g4 ~@8, ~@16 bb4@7 ~ bb4@6 bb4@16 ~@2]/3", // F5 F F5 F Gm Bb C5 C7 …
  K: "[[d3,g3,bb3] ~ [d3,g3,bb3] ~ [d3,g3,bb3] ~ [d3,bb3] ~ d3@2 g3 ~ [d3,g3]@2 [g3,bb3,d4,g4] ~ [g3,bb3] ~ bb3@2 [c3,bb3] ~ [c3,bb3]@2 [c3,bb3,e4]@2 c3@2 bb3@2 [g4,bb4,c5]@2, [d4,g4,bb4]@12 ~@2 bb4@10 [g4,bb4,c5]@5 ~@3, ~@6 g3@2 g3 ~ bb3@4 ~@2 [e4,g4,c5]@8 ~@2 bb3 ~@5, ~@16 c3@4 ~@10 [c3,e4] ~]/2", // Gm G5 Gm C7 Gm C7 C
  L: "[[d3,g3,bb3] ~ [d3,g3,bb3] ~ [d3,g3,bb3] ~ [d3,g3,bb3] ~ d3@2 g3 ~ [d3,g3]@2 [g3,bb3,d4,g4] ~ [g3,bb3] ~ bb3@2 [c3,bb3] ~ [c3,bb3]@2 [c3,bb3,e4]@2 c3@2 bb3@2 [g4,bb4,c5]@2, [d4,g4,bb4]@12 ~@2 bb4@10 [g4,bb4,c5]@5 ~@3, ~@8 g3 ~ bb3@4 ~@2 [e4,g4,c5]@8 ~@2 bb3 ~@5, ~@16 c3@4 ~@10 [c3,e4] ~]/2", // Gm G5 Gm C7 Gm C7 C
})).s("gm_piano").gain(0.2).pan(0.4)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B C D ~@3 E@2 ~@2 F G H G I J K L@2 J M N O P J K L@2 J M N O P ~@3 E@2 ~@2 F G H G I J K L@2 J M N O P J K L@2 J M
  N O P J K L@2 J M N O P Q
>`.pickRestart({
  A: "~@2 [f4,a4] [g4,bb4] [a4,c5]@8 ~@4", B: "~@2 [d4,f4] [e4,g4] [f4,a4]@8 ~@4",
  C: "~@2 [bb3,d4] [c4,e4] [d4,f4]@3 ~ [bb3,e4,g4]@4 c4@2 ~@2", D: "c5 d5 c5@14",
  E: "[~@10 [f4,a4] ~ [g4,bb4] ~ [a4,c5]@4 ~@14]/2", F: "~@10 [f4,a4] ~ [g4,bb4] ~ [a4,c5]@2", G: "g4@6 ~ g4",
  H: "d5 c5@7", I: "f5 e5@7",
  J: "[f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~", // F
  K: "[f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [f4,a4,c5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~", // F Gm
  L: "[g4,bb4,d5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~ [g4,bb4,d5] ~", // Gm
  M: "[f4,a4,eb5] ~ [f4,a4,eb5] ~ [f4,a4,eb5] ~ [f4,a4,eb5] ~ [f4,a4,eb5] ~ [f4,a4,eb5] ~ [f4,a4,eb5] ~ [f4,a4,eb5] ~", // F7
  N: "[f4,bb4,d5] ~ [f4,bb4,d5] ~ [f4,bb4,d5] ~ [f4,bb4,d5] ~ [f4,bb4,d5] ~ [f4,bb4,d5] ~ [f4,bb4,d5] ~ [f4,bb4,d5] ~", // Bb
  O: "[f4,g4,b4,d5] ~ [f4,g4,b4,d5] ~ [f4,g4,b4,d5] ~ [f4,g4,b4,d5] ~ [f4,g4,b4,d5] ~ [f4,g4,b4,d5] ~ [f4,g4,b4,d5] ~ [f4,g4,b4,d5] ~", // G7
  P: "[e4,g4,bb4,c5] ~ [e4,g4,bb4,c5] ~ [e4,g4,bb4,c5] ~ [e4,g4,bb4,c5] ~ [e4,g4,bb4,c5] ~ [e4,g4,bb4,c5] ~ [e4,g4,bb4,c5] ~ [e4,g4,bb4,c5] ~", // C7
  Q: "~@7 f5@2 ~@7, [f2,f3] ~, ~@4 f4@2 c5@3 ~@7, ~@5 a4@2 ~@9", // F
})).s("gm_acoustic_guitar_steel").gain(0.36)

// other · trumpet
const trumpet = note(`<
  ~@17 A B ~ C D E F G ~ A B ~ C D E F G ~@13 A B ~ C D E F G ~ A B ~ C D E F G ~ A B ~ C D E F G ~
>`.pickRestart({
  A: "~@13 d4 g4 bb4", B: "db5@2 d5 ~ db5@2 d5 ~@9", C: "~@5 f4 a4 c5 e5@2 f5 ~ e5@2 f5 ~", D: "[c4,f4]@7 ~",
  E: "[d4,f4]@7 ~", F: "[f4,g4]@7 ~", G: "[c4,e4]@7 ~",
})).s("gm_trumpet").gain(0.36)

// drums · kick
const kick = s("bd").struct(`<
  A@15 B C D@2 E@2 C D@2 E C D@2 E@2 C D@2 E A@11 B C D@2 E@2 C D@2 E C D@2 E@2 C D@2 E C D@2 E@2 C D@2 E ~
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x!2 ~ x!2", C: "x!2", D: "x ~@6 x!2 ~@7", E: "x ~@7 x ~@6 x",
})).gain(0.41)

// drums · snare
const snare = s("sd").struct("<~@12 A B A C D@18 ~@8 A B A C D@27 ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x!3", C: "~@2 x!2 ~@2 x ~@3 x ~@2 x!2 ~", D: "~ x ~ x",
})).gain(0.41)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!16 [~ x ~ x ~ x ~ x]!18 [x!4]!12 [~ x ~ x ~ x ~ x]!27 ~>").gain(0.41)

stack(synth_brass_2, bass, piano, acoustic_guitar_steel, trumpet, kick, snare, hihat)

More by Claude Francois