Strudelify

Le Dernier empereur

David Byrne

KeyG majorTempo90 bpm
0:00/0:00
// Le Dernier empereur — David Byrne
// 90 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. 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.

// other · violin
const violin = note(`<
  ~@10 A@2 B@2 C@2 D E F ~ F ~ G@2 D H I J K L M N D O P@4 Q@2 R S T@2 U@2 Q@2 D H I J K L M N D O V W X Y Z AA AB Y AC
  ~ AD@2 Q@2 R AE AF AG AH AI M AJ D AK AL@2 AM@2 AN@3 ~
>`.pickRestart({
  A: "[b4@4 d5@15 ~@13]/2", B: "[b4@4 d5@17 ~@11]/2", C: "[b4 d5 b4 a4 g4@2 e4@5 ~ b4 d5 b4 a4]/2", D: "g4@3 e4",
  E: "g4 ~", F: "b4 d5@3", G: "[b4 d5 b4 a4 g4@2 e4@6 b4 d5 b4 a4]/2", H: "g4@7 b4", I: "d5@3 e5", J: "d5@6 a4 b4",
  K: "d5@2 e5 g5", L: "d5@5 e5 d5 b4", M: "a4@3 g4", N: "a4@11 b4@3 a4@2", O: "g4@9 ~@7", P: "[b4 d5@7]/2",
  Q: "[b4 d5 b4 a4 g4@2 e4@4 b4 d5 b4 a4 g4 e4]/2", R: "g4@3 ~", S: "g4@7 ~", T: "[b4@2 d5@11 ~@3]/2",
  U: "[b4 d5@6 ~]/2", V: "b5 ~@3", W: "b5@2 d6 ~ b5 ~@11", X: "e5 ~@7", Y: "g5@2 a5 ~ b5@2 ~@10",
  Z: "b5@2 d6 ~@5 b5@7 ~", AA: "a5@2 b5 ~@5 g5@8", AB: "e5@2 g5 ~ g5@2 e5 ~ e5@8", AC: "b4 ~@3",
  AD: "[b4@4 d5@21 ~@7]/2", AE: "g4", AF: "b4@3 d5@9 e5@4", AG: "g5@6 e5 d5", AH: "b4@3 d5", AI: "b4@11 b4@5",
  AJ: "a4@6 b4 a4", AK: "g4@13 ~@3", AL: "[b4@3 d5@21 ~@8]/2", AM: "[b4@4 d5@19 ~@9]/2", AN: "[e5 g5@11]/3",
})).s("gm_violin").gain(0.27)

// other · violin · soft notes
const violin_soft = note("<~@40 A ~@17 B C D E F G ~ H I@2 ~@4 A ~@17>".pickRestart({
  A: "~@3 e4", B: "~@3 d6@12 ~", C: "~@5 a5 ~@2 g5@8", D: "~@2 g5 ~ g5@2 e5@10", E: "~@6 d6@9 ~", F: "~@4 d6@2 b5 ~@9",
  G: "~@4 a5@2 g5 ~@9", H: "~@3 d6@4 ~", I: "[~@3 d5@18 ~@11]/2",
})).s("gm_violin").gain(0.13)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@2 A B C D C E C F C D C E G H C D C E C F G I C E C H G I G J C F C D C E G H C D C E C F G I C E C H C I G J C F C
  D C E G H C D C E C F G I C E C F C D G J C F C D C E G H C K
>`.pickRestart({
  A: "g1@12 ~@2 g1 ~", B: "g1@11 ~@5", C: "g1@10 ~@4 g1 ~", D: "g1@3 ~", E: "g1@9 ~@7", F: "g1 ~", G: "a1@10 ~@4 a1 ~",
  H: "a1 ~", I: "a1@3 ~", J: "a1@9 ~@7", K: "g2 ~",
})).s("gm_acoustic_bass").gain(0.78)

// chords · koto
const koto = note(`<
  ~@10 A@3 B C D A@3 B E F D G@2 A H D I C D C B J A@3 B C D A@5 B C D A@5 B C D A@5 B C D A@5 B C D A@5 B C D A@5 B C D
  A ~
>`.pickRestart({
  A: "[g3,d4]@7 ~", B: "[g3,d4]@6 ~ [g3,d4]", C: "[a3,e4]@7 ~", D: "[a3,e4]@6 ~ [a3,e4]", E: "d4, g3@7 ~",
  F: "d4@7 [g3,d4], g3@3 ~", G: "[e4@7 a3 [g3,d4]@7 ~, a3@6 ~ e4@7 ~@2]/2", H: "[g3,e4]@7 ~", I: "[g3,e4]@6 ~ [g3,e4]",
  J: "[g3,d4] ~", // G5
})).s("gm_koto").gain(0.29)

// other · koto
const koto_2 = note("<~@58 A B A C D E F G ~@24>".pickRestart({
  A: "d5!4 b4 ~ e5 ~ d5@3 ~@5", B: "d5!2 d5@2 b4 ~ a5 ~ g5@3 ~@5", C: "d5!3 ~ b4 ~ a4 ~ g4@5 ~@3",
  D: "d5!4 b4 ~ e5 ~ d5@4 ~@4", E: "d5!4 b4 ~ a5 ~ g5@3 ~@5", F: "d5!4 b4 ~ e5 ~ d5@2 ~@6",
  G: "d5!4 b4 ~ a4 ~ g4@2 ~@6",
})).s("gm_koto").gain(0.43)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@18 A ~ B ~ C@2 D E ~@11 F G@4 ~@27 F H@4 ~@7 I J@2 K@2 ~@4>".pickRestart({
  A: "b3@4 d4@11 ~", B: "b3 d4@3", C: "[b3 d4 b3 a3 g3@2 e3@5 ~ b3 d4 b3 a3]/2", D: "g3@3 e3", E: "g3@13 ~@3",
  F: "~@6 b3 ~",
  G: "[b3@2 d4@2 ~@2 a3@2 ~@8 b3@2 ~@2 b3@2 ~ g3@2 ~ a3@2 ~ e3@2 ~@13 g3@14 ~@6, ~@2 g3@2 ~@2 e3@4 ~ d4 ~@2 g3@6 ~@2 e3@2 ~@8]/4",
  H: "[b3@2 d4@2 ~@2 a3@2 ~@8 b3@2 ~@2 b3@2 d4@2 g3@2 a3@2 ~ e3@2 ~@13 g3@13 ~@7, ~ g3 ~ e3@2 ~@2 g3@3 ~ e3 ~@4]/4",
  I: "~@3 b3", J: "[~@3 d4@15 ~@10 b3@4]/2", K: "[~@4 d4@17 ~@11]/2",
})).s("gm_string_ensemble_2").gain(0.4)

// chords · string ensemble 2 · "SYN STR 1"
const string_ensemble_2_2 = note(`<
  ~@18 A@2 B@2 C@2 D@2 ~@8 E@4 F@4 G@6 H@8 I@4 J@2 K@2 L@6 M@3 N@7 O@8 ~ P
>`.pickRestart({
  A: "[~@3 g4, [g3,b3,d4]@15 ~, ~ e4]/2", B: "[~@4 g4@2 a4 g4, [b3,d4], g3@15 ~, ~@2 e4@5 ~]/2",
  C: "[~ a4 g4 a4, [a3,e4]]/2", D: "[~@3 g4 a4@2 g4@2, [g3,d4], ~ b3@3]/2",
  E: "[~@3 g5 a5@3 g5 e5@3 g5 e5@2 d5@2, [g4,b4], d5@27 ~@5, ~@4 e5@3 ~@25]/4", // G
  F: "[e5@7 ~ b4@4 ~@10 a4@2 b4@8, a4@15 ~ [d4,g4]@16, ~@3 d5 ~@4, ~@7 b4@4 ~@5]/4", // G5
  G: "[~ a4@3 g4@3 a4 b4@3 a4 g4@3 ~@3 b4 d5 b4@2 a4@2, [g3,b3]@31 ~ a3@16, ~@5 a4 ~@2, ~@32 e4@15 ~]/6", // G
  H: "[g4@3 e4 g4@2 a4 g4 ~@2 a4 b4 d5@2 b4 a4 ~@4 b4@4 a4@2 b4 d5@3 b4 a4, d4@3 ~, g3@24 ~@8 g3@7 ~ a3@7 ~ a3@15 ~, ~@4 g4@5 g4@5 ~@2, ~@8 e4@8 a4@3 a4@3 ~@10]/8",
  I: "[g4@3 a4 ~ d4@3 ~@3 g4 a4@3 g4, g3, ~ [g4,b4] e4@2, ~@16 d4@15 ~]/4", J: "[~@3 g4 a4@3 g4, e4, [g3,d4]@15 ~]/2",
  K: "[a4@3 b4 ~@2 b4 a4, a3, e4@15 ~, ~@8 d5@5 ~@3]/2",
  L: "[g4@6 e4@2 ~@6 a4 ~@9 e5@2 g5@2 a5@2 g5@2 e5@6 g5@2 a5@4 g5@2 e5@2, g3@17 ~ d5@29 ~, ~@8 g4@39 ~, ~@16 b4@31 ~]/6",
  M: "[e5@4 c5 ~@3 g5@4 ~@2 g5@6 b4@4, ~@4 d5@6 ~@2 a5@3 ~@9]/3",
  N: "[~@11 d5@3 ~@2 d5@6 ~@2 g5@6 e5@2 a5@4 g5@2 ~@8 e5 ~@5 g5@2 e5@2, b4 b4@4 a4@2, ~@6 d5@3 ~@13 e5@3 ~@13 e5@6 d5@3 ~ e5@5 ~@3]/7",
  O: "[d5@3 e5 d5@4 e5@2 ~ e5 g5@2 a5 g5 e5@3 d5 e5@2 d5@10, b4, g4@23 ~@9]/8", P: "d4@5 ~@3",
})).s("gm_string_ensemble_2").gain(0.27)

// chords · string ensemble 2 · "SYN STR 1" · soft notes
const string_ensemble_2_soft = note(`<
  ~@38 A ~@3 B@6 ~@3 C D@5 E ~ F ~@4 G@3 ~@3 H@2 I@6 ~ J ~@2 K ~ L ~ M@4
>`.pickRestart({
  A: "~@3 d5", B: "d4/6", C: "a3@7 ~", D: "e4/5", E: "e4", F: "b3 ~@7", G: "[d4@7 ~]/3",
  H: "[~@6 e5@3 e5@5 ~@2, a4@15 ~]/2", I: "[~@2 e5 ~@8 e5 ~@12, g4@47 ~, d5 ~@3]/6", J: "e4 ~", K: "~@4 d5@3 ~",
  L: "d5 ~@3", M: "[g2 ~@23 g2@4 ~@4, [g3,g4]@29 ~@3]/4",
})).s("gm_string_ensemble_2").gain(0.13)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4
>`.pickRestart({
  A: "x",
})).gain(0.52)

// drums · crash
const crash = s("cr").struct(`<
  ~@6 A B ~@9 C D ~@6 E ~@7 F ~@8 G ~@5 H G ~@5 G ~ I G ~@13 J G ~@7 K G ~@7
>`.pickRestart({
  A: "~@12 x ~ x!2", B: "x!2 ~@2", C: "~@10 x!5 ~", D: "x!2 ~@14", E: "~@11 x!4 ~", F: "~@9 x ~ x ~@4", G: "x",
  H: "~@6 x!2", I: "~@4 x!4", J: "~@7 x", K: "~@5 x!3",
})).gain(0.15)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@25 A ~@7 B ~@7 C ~@6 D ~@5 E ~@2 F ~@14 G ~@8 H ~@8>".pickRestart({
  A: "~@7 x ~@8", B: "~ x ~ x ~@3 x ~@8", C: "~@4 x ~@2 x", D: "~@5 x ~@2", E: "~@3 x", F: "~@2 x!2 ~@4",
  G: "~@4 x!3 ~", H: "~@2 x!3 ~@3",
})).gain(0.05)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4
>`.pickRestart({
  A: "~@7 x",
})).gain(1.36)

// drums · congas
const congas = s("conga:18").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@4
>`.pickRestart({
  A: "x ~@3 x ~@3 x ~@3 x ~ x!2", B: "~ x!3",
})).gain(1.65)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@4 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
  B C D A B C D A B C D A B C D A B C D A B C D A B ~@4
>`.pickRestart({
  A: "x!3 ~ x ~ x ~", B: "x ~ x!3 ~ x!2", C: "x!4", D: "x ~ x!6",
})).gain(2.62)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@4 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A
  B C D A B C D A B C D A B C D A B C D A B C D A B ~@4
>`.pickRestart({
  A: "~@3 x ~ x ~ x", B: "~ x ~@3 x ~@2", C: "~ x ~ x ~ x ~ x", D: "~ x ~@6",
})).gain(1.57)

stack(
  violin, violin_soft, bass, koto, koto_2, string_ensemble_2, string_ensemble_2_2, string_ensemble_2_soft, low_tom,
  crash, crash_soft, bongos, congas, cabasa, cabasa_soft
)