Strudelify

Encore et encore

Cabrel Francis

KeyF minorTempo167 bpm
0:00/0:00
// Encore et encore — Cabrel Francis
// 167 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 3 "Guitare" named as a guitar, played on electric guitar clean (its pad poly patch is not one)
// note: Full arrangement: all 191 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(167/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 · electric guitar clean · "Guitare"
const electric_guitar_clean = note(`<
  ~ A B A B A B A B A B A B C D C D E F G H A B A B A B A B C D C D E F G H A B I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 A B A B
  C D C D E F G H A B I@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 Q@2 R@2 Q@2 ~ S Q@2 R@2 Q@2 ~@4 T U T ~ V ~ V ~ W ~ W ~ X ~ Y ~ V
  ~ X ~ Y ~ V ~ M@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 M@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 M@2 J@2 K@2 L@2 M@2 N@2 O@2 P@2 M@2 J@2
  K@2 L@2 M@2 N@2 O@2 P@2
>`.pickRestart({
  A: "f3!2 [c4,f4] f3!2 [c4,f4] f3!2", B: "[c4,f4] f3!2 [eb4,ab4] f3!2 [eb4,ab4] f4",
  C: "ab3!2 [eb4,ab4] ab3!2 [eb4,ab4] ab3!2", D: "[eb4,ab4] ab3!2 [eb4,ab4] ab3!2 [eb4,ab4] f4",
  E: "db4!2 [db4,ab4] db4!2 [db4,ab4] db4!2", F: "[db4,ab4] db4!2 [db4,ab4] db4!2 [db4,bb4] ab4",
  G: "bb3!2 [f4,ab4,c5] bb3!2 [f4,ab4] bb3!2", H: "[f4,ab4] bb3!2 [f4,bb4] bb3!2 [f4,bb4] ab4",
  I: "[[eb4,ab4,c5,eb5], ab3 ~]/2", J: "[eb4,bb4,eb5,g5]/2", K: "[f3,c4,f4,ab4,c5,f5]/2", L: "[db4,ab4,db5,f5]/2",
  M: "[ab3,eb4,ab4,c5,eb5]/2", N: "[c4,g4,c5,e5]/2", O: "[[bb3,f4,bb4,db5,f5] [bb3,f4,bb4,db5,f5]@7]/2",
  P: "[[bb3,f4,bb4,db5,f5]@3 [bb3,f4,bb4,db5,f5]@13]/2", Q: "[[eb4,ab4,c5,eb5,ab5]@2 ~@5 [eb4,bb4,eb5,g5]@9]/2",
  R: "[[f4,ab4,c5,f5]@2 ~@5 [db4,ab4,db5,f5]@9]/2", S: "~@3 [eb4,bb4,eb5,g5]",
  T: "[eb4,bb4,eb5,ab5]@7 [eb4,bb4,eb5,g5]", U: "~@2 [eb4,bb4,eb5]@2 [eb4,bb4,eb5]!4", V: "[f3,c4,f4]!2 ~@2",
  W: "[ab3,eb4,ab4]!2 ~@2", X: "[db4,ab4,db5]!2 ~@2", Y: "[bb3,f4,bb4]!2 ~@2",
})).s("gm_electric_guitar_clean").gain(0.09).pan(0.4)

// chords · piano · "Clavier"
const piano = note(`<
  ~@39 A B C D E F E F A B G H ~@18 A B C D E F E F A B G H ~@46 A B C D E F E F A B G H ~@4 A B C D E F E F A B G H ~@4
  A B C D E F E F A B G H ~@4 A B C D E F E F A B G H ~@4
>`.pickRestart({
  A: "~@2 [eb4,ab4] ~@2 [eb4,ab4] ~@2", B: "[eb4,ab4] ~@2 [eb4,ab4] ~@2 [eb4,ab4] ~",
  C: "~@2 [eb4,bb4] ~@2 [eb4,bb4] ~@2", D: "[eb4,bb4] ~@2 [eb4,bb4] ~@2 [eb4,bb4] ~",
  E: "~@2 [f4,ab4] ~@2 [f4,ab4] ~@2", F: "[f4,ab4] ~@2 [f4,ab4] ~@2 [f4,ab4] ~", G: "~@2 [c4,g4] ~@2 [c4,g4] ~@2",
  H: "[c4,g4] ~@2 [c4,g4] ~@2 [c4,g4] ~", // C5
})).s("gm_piano").gain(0.25)

// bass · electric bass pick · "Basse"
const bass = note(`<
  ~ A ~ A ~ A ~ A B A ~ A ~ C ~ C ~ D ~ E ~ A ~ A F A ~ A ~ C ~ C ~ D ~ E ~ G@2 H I J K L M N O I@2 P@2 Q@2 R@2 A ~ A ~
  C ~ C ~ D ~ E ~ G@2 H I J K L M N O I@2 P@2 Q@2 S@2 T@2 U ~ V ~ W X Y@2 Z@2 Y@2 AA N AB AC AD AE AF AG AH ~ AH ~ AI ~
  AI ~ AJ@2 AK@2 AH AL AM@2 AN@2 AO AP I@2 AQ@2 AR@2 N AS I@2 P@2 AT@2 AU@2 I@2 AQ@2 AR@2 N AS I@2 P@2 AT@2 AU@2 I@2
  AQ@2 AR@2 N AS I@2 P@2 AT@2 AU@2 I@2 AQ@2 AR@2 N AS I@2 P@2 AT@2 AU@2
>`.pickRestart({
  A: "f2!2 ~ f2 f2@2 ~@2", B: "~@3 bb2 c3!2 eb3 f3", C: "ab2!2 ~ ab2 ab2@2 ~@2", D: "db3!2 ~ db3 db3@2 ~@2",
  E: "bb2!2 ~ bb2 bb2@2 ~@2", F: "~@4 eb3 f3@3", G: "[f2!2 ~ f2 f2@10 ~@2]/2", H: "ab2@2 ~ ab2 ab2@2 ~ ab2",
  I: "ab2!2 ~ ab2!3 ~ ab2", J: "eb3@2 ~ eb3 eb3@2 ~ eb3", K: "eb3!2 ~ eb3!4 e3", L: "f3@2 ~ f3 f3@2 ~ f3",
  M: "f3@2 ~ f3!3 ~@2", N: "db3!2 ~ db3!3 ~ db3", O: "db3!3 eb3 f3 ab3 f3 eb3", P: "c3!2 ~ c3!3 ~ c3",
  Q: "[bb2@2 bb2@9 eb3 f3@2 ab3 bb3]/2", R: "[bb2@2 ~ bb2@13]/2", S: "[bb2@2 ~ bb2@11 ~@2]/2",
  T: "[ab2@2 ~@5 eb3@2 ~@7]/2", U: "f3@2 ~@5 db3", V: "ab2@2 ~@5 eb3", W: "f3@2 ~ f3!3 ~ f3", X: "f3!4 f3@3 g2",
  Y: "[ab2@4 ~@3 eb3@7 ~@2]/2", Z: "[f3@4 ~@3 db3@7 ~@2]/2", AA: "db3@2 ~ db3!3 ~ db3", AB: "f3!2 ~ f3!3 ~ f3",
  AC: "f3!4 eb3 f3!3", AD: "eb3!6 ~ eb3", AE: "eb3!2 ~ eb3!5", AF: "d3 eb3!7", AG: "eb3!6 eb3@2", AH: "f2!2 ~@2",
  AI: "ab2!2 ~@2", AJ: "[db3 db3@7]/2", AK: "[bb2 bb2@7]/2", AL: "~@14 eb3 ab3", AM: "[db3@2 db3@10 ~ f3@3]/2",
  AN: "[bb2 bb2@6 ~]/2", AO: "f2@2 ~@2 f2!2 ~ f2", AP: "f2!6 ~ f2", AQ: "eb3!2 ~ eb3!3 ~ eb3", AR: "f2!2 ~ f2!3 ~ f2",
  AS: "db3 ~ db3 eb3 f3 g3 f3 eb3", AT: "[bb2@2 bb2@8 ~ eb3 f3!2 ab3 bb3]/2", AU: "[bb2@3 bb2@8 eb3 f3!2 ab3@2]/2",
})).s("gm_electric_bass_pick").gain(0.48)

// drums · kick
const kick = s("bd").struct(`<
  A B@37 C B@15 D B@13 C B@16 ~@6 B@2 ~@6 B@7 C E@13 F E@3 F G D B@7 H B@7 D B@7 H B@7 D B@7 H B@7 D B@7 H B@7 D
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "~ x!3", D: "~@2 x ~@2 x!2 ~", E: "~ x", F: "~@8 x ~@6 x", G: "~@5 x ~@2",
  H: "~@4 x ~@3 x ~ x!3 ~@3",
})).gain(0.14)

// drums · snare
const snare = s("sd").struct(`<
  ~ A B A B A B A C A C A D A C A E A C A D A C A D A C A D A C A E A C A D A F A B A B A B A G A B A B H B@2 I A C A D
  A C A E A C A D A F A B A B A B A G A B A B H B@3 J@5 A J K J@5 A@3 J B L M N O P Q P R P R P R P R P R P Q P R P Q H
  S A@3 J A@3 T A@3 B U V B T A@3 J A@3 T A@3 B U V B T A@3 J A@3 T A@3 B U V B T A@3 J A@3 T A@3 B U V B T
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x!3 ~@2", C: "x ~@4 x ~@2", D: "~ x ~@3 x ~@2", E: "~ x ~@2 x!2 ~@2",
  F: "~ x ~@3 x ~ x", G: "~ x ~ x!3 ~@2", H: "x!2", I: "~ x ~ x!2 ~@3", J: "x ~@2 x!2 ~@2 x", K: "x ~@4 x ~ x",
  L: "x ~@3 x!2 ~@2", M: "x!2 ~@2 x!2 ~@2", N: "x!2 ~ x!3 ~ x", O: "x!8", P: "x!2 ~@2", Q: "x ~@6 x", R: "x",
  S: "x!2 ~ x!2 ~@3", T: "x!2 ~ x!2 ~@2 x", U: "x!3 ~", V: "x ~@2 x!3 ~ x",
})).gain(0.14)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B A B A B A B A@3 B A B A C A B A B A B A B A@3 B A B A C A B A B A D E B A B A B A B E B A B F G H G A@3 B A B A
  C A B A B A D E B A B A B A B E B A B F G H A I J K J K J K J I J K J K J ~ A L G M@2 N F O P Q@3 R S T Q U V T Q P Q
  W Q X Y Z A@3 B H A@2 AA A@3 B H B AB AC A@3 B H A@2 AA A@3 B H B AB AC A@3 B H A@2 AA A@3 B H B AB AC A@3 B H A@2 AA
  A@3 B H B AB AC
>`.pickRestart({
  A: "x!8", B: "x!6 ~@2", C: "x ~ x ~ x ~ x!3 ~ x ~ x ~@3", D: "x!4 ~@4", E: "x!2 ~@2 x!4", F: "x!2 ~@6",
  G: "x!2 ~@2 x!2 ~@2", H: "~@2 x!6", I: "x!2 ~ x", J: "~ x ~@2", K: "~ x ~ x", L: "x ~ x ~ x ~ x!3 ~ x ~ x ~ x ~",
  M: "x!2 ~ x!3 ~ x", N: "x!4 ~ x!3", O: "x!2 ~@2", P: "x!2", Q: "x!3 ~", R: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2",
  S: "x!5 ~ x ~ x ~ x ~@5", T: "x ~@2 x ~@4", U: "x ~ x!6", V: "x ~ x ~ x ~@2 x", W: "x ~ x ~ x ~ x ~@7 x!2",
  X: "x ~ x!2 ~@4", Y: "x ~ x ~ x!4", Z: "x!3 ~@5", AA: "x!4 ~ x ~ x", AB: "~@3 x!5", AC: "x!2 ~@2 x!3 ~",
})).gain(0.14)

// drums · mid tom
const mid_tom = s("mt").struct("<~@93 A ~@48 B ~@15 B ~@15 B ~@15 B>".pickRestart({
  A: "~@7 x", B: "~@3 x ~@4",
})).gain(0.14)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~ A ~ A ~ B ~@3 A ~ A ~ B ~ A ~ A ~ A ~ B ~@3 A ~ A ~ B ~ A ~ A ~@2 C A ~ A ~ A ~ A C A ~ A D E F G ~@3 A ~ A ~
  B ~ A ~ A ~@2 C A ~ A ~ A ~ A C A ~ A D E F ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A H ~@2 E@3 I J I ~@2 K ~@3 I ~@3 I ~@3 I ~ I
  ~ L ~@3 A F ~@2 M ~@3 A F A F N ~@3 A F ~@2 M ~@3 A F A F N ~@3 A F ~@2 M ~@3 A F A F N ~@3 A F ~@2 M ~@3 A F A F N
>`.pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~ x ~@2", D: "~ x!3", E: "~ x ~ x", F: "x", G: "~@2 x ~@4 x", H: "x!4", I: "~ x",
  J: "~@2 x!5 ~", K: "~@5 x ~@2", L: "~@3 x!2 ~@2 x", M: "~@2 x!2", N: "~ x!2 ~",
})).gain(0.14)

// drums · tambourine
const tambourine = s("tb").struct("<~@39 A@13 B A ~@15 A@13 B A C ~@42 A@2 ~ A@15 ~ A@15 ~ A@15 ~ A@13>".pickRestart({
  A: "x!8", B: "x!4 ~@2 x!2", C: "x!4",
})).gain(0.14)

// drums · bongos
const bongos = s("bongo:4").struct("<~@85 [~ x ~@6]!7 ~ [~ x ~@2]!12 ~@86>").gain(0.6)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@85
  [~@2 x!2 ~@4]!6
  [~@2 x!2 ~ x!3]
  [x ~@5 x!7 ~ x ~]
  [x ~@2 x!2 ~@3]!12
  [x!2 ~@2 x ~@2 x]
  [~@4 x!12]
  ~@84
>`).gain(0.73)

// drums · congas
const congas_2 = s("conga:18").struct("<~@85 [~@3 x]!6 ~@2 [~ x ~@3 x ~@2]!12 ~@86>").gain(0.73)

// drums · congas
const congas_3 = s("conga:33").struct("<~@85 [x ~@3 x!2 ~ x]!6 x ~ [~@6 x!2]!12 ~@86>").gain(0.73)

stack(
  electric_guitar_clean, piano, bass, kick, snare, hihat, mid_tom, open_hat, tambourine, bongos, congas, congas_2,
  congas_3
)

More by Cabrel Francis