Strudelify

Petit robot

Maxime Le Forestier

KeyG majorTempo83 bpm
0:00/0:00
// Petit robot — Maxime Le Forestier
// 83 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(83/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 · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  A B A B C D E F G H@2 I J K L M N O C D E F G H@2 I J K L M N O C D E F G H@2 I J K L M N O C P E F G H@2 I J K L M N
  Q C D E F G H@2 I R S@3
>`.pickRestart({
  A: "~@2 [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4]@2 ~@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2, g3@6 ~@2 d#4@5 ~@3", // G Am
  B: "~@2 [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4]@2 ~@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2, g3@5 ~@3 d#4@5 ~@3", // G Am
  C: "~@2 [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4]@2 ~@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2, g3@5 ~@3 d#4@7 ~", // G Am
  D: "~@2 [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4]@2 ~@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2, g3@6 ~@2 d#4@7 ~", // G Am
  E: "~@2 [g4,c5] ~ [g4,c5] ~ [g4,c5]@2 ~@2 [a4,c#5] ~ [a4,c#5] ~ [a4,c#5]@2, c4@7 ~ a3@6 ~@2", // C5 A
  F: "~@2 [g4,d5] ~ [g4,d5] ~ [g4,d5]@2 ~@2 [c5,d#5] ~ [c5,d#5] ~ [c5,d#5]@2, g3@5 ~@3 g#4@8", // G5 Cm
  G: "~@2 [a4,c5] ~ [a4,c5] ~ [d4,a4,c5]@2 ~@2 [g4,b4] ~ [g4,b4] ~ [g4,b4]@2, d4@6 ~@2 g3@7 ~", // Am D7 G
  H: "[~@2 [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4]@2 ~@2 [a4,c5] ~ [a4,c5] ~ c5@2 g3@2 [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4]@2 d#4@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2, g3@5 ~@3 d#4@8 ~@16, ~@7 a4@2 ~@7]/2", // G Am G Am
  I: "~@2 [g4,c5] ~ [g4,c5] ~ [g4,c5]@2 ~@2 [e4,a4,c#5] ~ [e4,a4,c#5] ~ [e4,a4,c#5]@2, c4@3 ~ a3@4", // C5 A
  J: "~@2 [g4,b4] ~ [g4,b4] ~ [g4,b4]@2 ~@2 [c5,d#5] ~ [c5,d#5] ~ [c5,d#5]@2, g3@7 ~ g#3@8", // G Cm
  K: "~@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2 ~@2 [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4]@2, d4@8 g3@7 ~", // Am G
  L: "~@2 [g4,c5] ~ [g4,c5] ~ [g4,c5]@2 ~@2 [g4,c5] ~ [g4,c5] ~ [e4,g4,c5]@2, c4@6 ~@2 e4@5 ~@3", // C5 C
  M: "~@2 [a4,c#5] ~ [a4,c#5] ~ [a4,c#5]@2 ~@2 [a4,c#5] ~ [a4,c#5] ~ [a4,c#5]@2, a3 e4", // A
  N: "~@2 [a4,d5] ~ [a4,d5] ~ [a4,d5]@2 ~@2 [a4,c#5] ~ [a4,c#5] ~ [a4,c#5]@2, d4@8 a3@7 ~", // D5 A
  O: "~@2 d5 ~ d5@2 d5@2 d5@2 d5@2 d5@2 d5@2, d4@5 ~@11",
  P: "~@2 [d4,g4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4]@2 ~@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2, g3@3 ~ d#4@4", // G Am
  Q: "~@2 d5 ~ d5@2 d5@2 d5 ~ d5@2 d5@2 d5@2, d4@5 ~@11",
  R: "~@2 [g4,b4] ~ [g4,b4] ~ [g4,b4]@2 ~@2 [c5,d#5] ~ [c5,d#5]@4, g3@3 ~ d#4@4", // G Cm
  S: "[~@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2 ~@2 [g4,b4] ~ [g4,b4] ~ b4@2 ~@2 [a4,c5] ~ [a4,c5] ~ [a4,c5]@2 ~@3 g5@5 ~@16, d4@8 g3@6 g4@5 ~@6 [b3,g4]@11 ~@12, ~@16 d#4@7 ~ g3@12 ~@12, ~@26 [b4,d5]@9 ~@13]/3", // Am G Am Em Bm
})).s("gm_acoustic_guitar_nylon").gain(0.51)

// other · lead 8 bass lead
const lead_8_bass_lead = note(`<
  ~@2 A B ~@14 C D E F G H I@2 J K L M N O C D E F G H P@2 J K L M N O C D E F G H P@2 J K L M N O C D E F G H P@2 Q R S
  ~
>`.pickRestart({
  A: "~ f#4 g4@2 b4 ~ d5@2 c5@2 b4@2 a4@2 g4@2", B: "b4 g4 b4 d5 c5 b4 a4 g4", C: "b4 b4@7 c5@7 ~, ~ c5 ~@14",
  D: "b4@2 g4@2 b4@2 d5@2 c5@2 b4@2 a4@2 g4 ~", E: "c5@5 ~ c5@2 c#5@5 c#5 d5 e5, g4 ~@15",
  F: "d5@5 ~ d5@2 c5@8, ~@8 g#4 ~@7", G: "~@2 f#4@2 d5@2 c5@2 b4@2 g4@2 d4@2 c4 a#3",
  H: "b3@2 d4 ~ g4@2 b4@2 d5@2 c5@2 b4@3 a4",
  I: "[b4@2 g4@2 b4@2 d5@2 c5@2 b4@2 a4@3 ~ c5@2 c5@4 c5@2 c#5@2 c#5 ~ d5@3 e5, a#4 ~@14 g4@2 ~@15]/2",
  J: "d5 ~ d5@3 ~ d5@2 g#4@2 c5@6", K: "~ f#4 d5 c5 b4 g4 d4@2", L: "~@8 g4 e4 c4 e4 g4 e4 c4 e4",
  M: "a4@2 e4@2 c#4@2 ~@8 e4 a4", N: "f4 d4 a4 f4 d4@2 f4@2 e4@2 c#4 a3 e4@2 c#4@2", O: "d4@3 ~",
  P: "[b4@2 g4@2 b4@2 d5@2 c5@2 b4@2 a4@3 ~ c5@2 c5@4 c5@2 c#5@2 c#5 ~ d5@3 e5, a#4 ~@14 g4@3 ~@14]/2",
  Q: "d5@7 ~ [g#4,c5]@8", R: "~ f#4 d5 c5 b4 g4 b4 d5", S: "c5@2 b4@2 a4@2 g4@2 b4 b4@7, ~@9 c5 ~@6",
})).s("gm_lead_8_bass_lead").gain(0.15).pan(0.2)

// bass · acoustic bass
const bass = note(`<
  ~@4 A B C D E F B G D H I J K L A B C D E F B G D H I J K L A B C D E F B G D H I J K L A B C M E F B G D H I J K L A
  B C M E F B G N O P@2
>`.pickRestart({
  A: "g2@7 ~ d#3@7 ~", B: "g2@7 ~ d#3@5 ~ d3@2", C: "c3 a2", D: "g2@7 ~ g#2@8", E: "d3@8 g2@5 ~ g2@2", F: "g2 d#3",
  G: "c3@7 ~ a2@8", H: "d3@2 f#3 d3 g2@4", I: "c3@5 ~ g3@2 e3@6 ~@2", J: "a2@5 ~ e3@2 a3@4 a2@4",
  K: "d3@5 ~@3 a3@3 ~ a2@4", L: "d3@5 ~ d3@2 d2@8", M: "g2@7 ~ g#2@7 ~", N: "d3@4 g#2@3 ~", O: "d2@7 ~ g2@7 ~",
  P: "[f#2@5 ~ g2@2 ~@8 g3@5 ~@11, ~@8 g2@13 ~@11]/2",
})).s("gm_acoustic_bass").gain(0.36)

// other · viola
const viola = note("<~@28 A B C D ~@10 A B C D ~@10 A B C D ~@12>".pickRestart({
  A: "~@15 g4", B: "a4@4 e4@9 ~ e4@2", C: "f4@3 f4 e4@2 a4 e4", D: "f4@2 d4@4 f4 a4 d5@8",
})).s("gm_viola").gain(0.15).pan(0.8)

// chords · synth strings 1
const synth_strings_1 = note("<~@42 A B C@2 D@2 E F G D@2 H I J A B C@2 D@2 E F G D@2 H K L M@2>".pickRestart({
  A: "[e4,g4,c5]", B: "[e4,a4,c#5]", C: "[[f4,a4,d5] [c#5,e5] [f4,d5]@2, [g4,e5] ~@7 a4@24]/2",
  D: "[d4,g4,b4] [d#4,f#4,a4]", E: "[g4,c5]@8 [a4,c#5]@7 ~, e4", F: "[g4,b4,d5] [d#4,g#4,c5], ~@8 c#5 ~@7",
  G: "[f#4,a4,d5]@4 [g4,b4,d5]@3 ~", H: "[g4,c5] [a4,c#5], e4", I: "[g4,b4,d5]@7 ~ [g#4,c5,d#5]@8, ~@8 c#5 ~@7",
  J: "[f#4,a4] [g4,b4], d5", K: "[g4,b4] [g#4,c5]", L: "[f#4,a4] [g4,b4]",
  M: "[[d#4,f#4,a4]@8 [g4,b4]@11 ~@13, ~@2 d4@5 ~]/2", // D#dim G
})).s("gm_synth_strings_1").gain(0.26)

// drums · kick
const kick = s("bd").struct("x").gain(0.26)

// drums · pedal hat
const pedal_hat = s("hh").struct("x!4").gain(0.26)

stack(acoustic_guitar_nylon, lead_8_bass_lead, bass, viola, synth_strings_1, kick, pedal_hat)

More by Maxime Le Forestier