Strudelify
KeyG majorTempo80 bpm
0:00/0:00
// redbone — Childish Gambino
// 80 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/4391106; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 64 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(80/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 · pizzicato strings
const pizzicato_strings = note("<~@63 [e5 ~@3]>").s("gm_pizzicato_strings").gain(0.05)

// other · string ensemble 1
const string_ensemble_1 = note("<~@25 A B C D E F G H I J K L M ~@9 A N C O P F Q R S T J K L M ~@3>".pickRestart({
  A: "~@6 d5 c5", B: "b4!2 ~@4 d5 c5", C: "b4 a4 ~@4 d5 c5", D: "b4!2 ~@4 b4 c5", E: "b4 c5 b4@4 ~ d5",
  F: "~ b4!2 ~ a4@4 ~@4 g4@2 a4@2", G: "a#4 a4 ~@3 b4 e5!2", H: "~@6 e5!2", I: "e5!2 ~@4 g4 a4",
  J: "b4 a4 g4 a4 b4 e5!3", K: "e5 e4 a4!2 g4 [e4,b4] e5!2", L: "~@2 e4!2 ~@2 e5!2", M: "e5!2 a4!2 g4 e4 ~@2",
  N: "c5 b4 ~@4 d5 c5", O: "c5 b4 ~@4 b4 c5", P: "b4 c5 e5@4 ~ d5", Q: "a#4 a4 ~@6", R: "~@5 b4 e5!2",
  S: "~@6 [a4,e5]!2", T: "g4 e4 ~@4 g4 a4",
})).s("gm_string_ensemble_1").gain(0.4)

// other · pizzicato strings
const pizzicato_strings_2 = note("<~@63 [e5 ~@3]>").s("gm_pizzicato_strings").gain(0.05)

// other · string ensemble 1 · "Violins"
const string_ensemble_1_2 = note("<~@25 A B C D E F G H I@2 J K@2 ~@9 A L C M N F O P H Q@2 J R@2 ~@3>".pickRestart({
  A: "~@6 d5 c5", B: "b4!2 ~@4 d5 c5", C: "b4 a4 ~@4 d5 c5", D: "b4!2 ~@4 b4 c5", E: "b4 c5 g4@4 ~ d5",
  F: "~ b4!2 ~ a4@4 ~@4 g4@2 a4@2", G: "a#4 a4 ~@3 b3 e4!2", H: "~@2 e4!2 ~@2 a4!2", I: "[g4 e4 e4@2 g4@8 ~ e4 a4!2]/2",
  J: "g4 e4 ~ a#4 a4 b3 e4!2", K: "[~@4 g4@7 ~@5, ~@2 e4@3 ~@11]/2", L: "c5 b4 ~@4 d5 c5", M: "c5 b4 ~@4 b4 c5",
  N: "b4 c5 b4@4 ~ d5", O: "a#4 a4 ~@6", P: "~@5 b3 ~ e4", Q: "[g4 e4 ~@2 g4@8 ~@2 a4!2, ~@2 e4@3 ~@11]/2",
  R: "[~@4 g4@7 ~@5, ~ e4@2 ~@5]/2",
})).s("gm_string_ensemble_1").gain(0.4)

// other · electric guitar clean · "Electric Guitar"
const electric_guitar_clean = note(`<
  ~@2 A@2 B@2 C@2 D@2 ~@22 A@2 B@2 C@2 E@2 ~@8 F@6 ~ A@2 B@2 C@2 E@2 ~
>`.pickRestart({
  A: "[~@2 [a4,b4]@2 a4@2 g4@2 [e4,f#4]@2 d4@2 b3@2 e4@10 d4@2 e4 ~ [f#4,g4]@2 d5 ~, ~@14 d4 ~@17]/2", // Asus2 Esus2 Gmaj7
  B: "[b4@8 f#4@2 g4@2 a4 ~ g4@18]/2",
  C: "[~@2 b4@2 a4@2 g4@2 [e4,f#4]@2 d4@2 b3@2 e4@10 d4@2 e4 ~ [f#4,g4]@2 d5 ~, ~@14 d4 ~@17]/2", // Esus2 Gmaj7
  D: "[b4@8 ~@2 [g4,a4]@2 g4 ~ e4@18]/2", E: "[b4@4 f#4 g4 a4 g4@9]/2",
  F: "[d5 e5 d5 e5 d5 ~ b4 ~ [e4,f#4]@2 d4@2 b3@2 d4 ~ d5 e5 d5 e5 d5 ~ b4 ~@9, ~@7 e4@5 ~@4]/2", // Esus2
})).s("gm_electric_guitar_clean").gain(0.3)

// bass · electric bass finger · "Electric Bass"
const bass = note(`<
  ~@2 A@2 B@2 A@2 C@2 D@6 E@2 D@6 ~@2 F G H I J K A@2 B@2 A@2 L ~ D@6 E@2 M@2 N@2 O@2 ~ A@2 B@2 A@2 P@2 ~
>`.pickRestart({
  A: "[~@2 b2 ~ b1@2 c2@2 d2@4 ~@2 e2@10 ~@2 e3 ~@3 d3 ~]/2", B: "[~@2 b2 ~ c2@4 d2@4 ~@2 e2@10 e2@6 d3@2]/2",
  C: "[~@2 b2 ~ c2@4 d2@4 ~@2 e2@14 ~@4]/2", D: "[c2@4 g1@2 c2@2 d2@2 a1@2 d2@2 e2@10 ~@2 d2 ~@3 c2 ~]/2",
  E: "[c2@2 g1 c2 d2 a1 d2 e2@5 ~ b1!3]/2", F: "e3!2 ~ e3!2 ~@3", G: "a2!2 ~ a2!2 ~@3", H: "f#2!2 ~ f#2!2 ~ d#2@2",
  I: "e2!2 ~ e2!2 ~@3", J: "a1!2 ~ a1 ~ a2 ~ g2", K: "f#2!2 ~ f#2 b2 ~@3", L: "~@2 b2 ~ c2@4 ~@8",
  M: "[a1 ~ c2 ~ d2@2 d2 e2@5 d2 ~ c2 ~]/2", N: "[a1 ~ c2 ~ d2@2 d2 e2@5 ~ c2 ~ b1]/2",
  O: "[a1 ~ c2 ~ d2 a1 d2 e2@5 ~ c2 c2@2]/2", P: "[~@2 b2 ~ c2@4 d2@2 a1@2 d2@2 e2@10 ~@2 d2@2 ~@2 c2@2]/2",
})).s("gm_electric_bass_finger").gain(0.3)

// bass · contrabass
const bass_2 = note("<~@2 A@6 B@2 A@6 C@2 A@6 ~@2 D E F D G H A@6 I ~ A@6 C@2 J@6 K A@8 ~>".pickRestart({
  A: "[c2@4 d2@3 e2@5 e2@2 d2@2]/2", B: "[c2@4 d2@3 e2@7 ~@2]/2", C: "[c2@4 d2@3 e2@5 ~ b1!3]/2", D: "e2!2 ~ e2!2 ~@3",
  E: "a1!2 ~ a1!2 ~@3", F: "f#1!2 ~ f#1!2 ~ d#2@2", G: "a1!2 ~ a1!2 ~ g1 ~", H: "f#1!2 ~ f#1 b1 ~@3", I: "c2 ~",
  J: "[a1 ~ c2 ~ d2@3 e1@5 d2 ~ c2 ~]/2", K: "b1!2 ~ b1 b1@2 ~@2",
})).s("gm_contrabass").gain(0.3)

// chords · piano
const piano = note(`<
  ~@2 A@2 B@2 C@4 D@4 E@2 A@2 D@4 E@2 A@2 F@6 A@2 B@2 E@2 A@2 D@4 E@2 A@2 ~@6 G A@2 B@2 E@2 B@2 H
>`.pickRestart({
  A: "[[e4,g4,b4,c5]@8 [d4,f#4,a4,d5]@6 [e4,g4,b4,e5]@17 ~]/2", // Cmaj7 D Em
  B: "[[e4,g4,b4,c5]@8 [d4,f#4,a4,d5]@6 ~@8 b5 ~ e6 ~ f#6 ~ g6 ~ b6 ~, ~@14 [e4,g4,b4,e5]@17 ~]/2", // Cmaj7 D Em
  C: "[[e4,g4,b4,c5]@8 [d4,f#4,a4,d5]@6 ~@18 [e4,g4,b4,c5]@8 [d4,f#4,a4,d5]@6 [e4,g4,b4,e5]@17 ~, e6@2 ~@12 [e4,g4,b4,e5]@17 ~@33, ~@3 [g5,b5,d6]@2 ~@3, ~@25 e6@15 ~@24]/4", // Cmaj7 D Cmaj7 D Em G
  D: "[[e4,g4,b4,c5]@8 [d4,f#4,a4,d5]@6 ~@18 [e4,g4,b4,c5]@8 [d4,f#4,a4,d5]@6 ~@8 b5 ~ e6 ~ f#6 ~ g6 ~ b6 ~, ~@14 [e4,g4,b4,e5]@17 ~@15 [e4,g4,b4,e5]@17 ~, ~@3 [g5,b5,d6]@2 ~@3, ~@25 e6@15 ~@24]/4", // Cmaj7 D Cmaj7 D Em G
  E: "[[e4,g4,b4,c5]@8 [d4,f#4,a4,d5]@6 [e4,g4,b4,e5]@17 ~, e6 ~@15]/2", // Cmaj7 D Em
  F: "[~@4 e5@8 e5@8 e5@8 e5@8 e5@8 e5@8 e5@8 e5@8 e5@8 e5@8 ~@2 b5 ~ e6 ~ f#6 ~ g6 ~ b6 ~]/6",
  G: "[b2,f#3,b3]@2 [b2,f#3,b3]@2 ~@2 [b2,f#3,b3]@2 e6 ~ f#6 ~ g6 ~ b6 ~, ~@6 b5 ~ [b2,f#3,b3]@4 ~@4", H: "e6 ~@7",
})).s("gm_piano").gain(0.25)

// drums · kick
const kick = s("bd").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 C@6 D B A B A B A E A B A B A B A B F B F B F E ~ D B A B A B A B
  ~
>`.pickRestart({
  A: "x ~@3 x!2 ~ x", B: "~@4 x!2 ~ x", C: "x!2 ~ x!2 ~@3", D: "~@7 x", E: "~@4 x!2 ~@2", F: "x ~@3 x ~@2 x",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<~@2 A@7 B A@14 ~@2 A@5 C D A@5 C ~ A@14 ~ D A@7 ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x!2 ~@4 x ~", C: "~ x ~@2", D: "~@3 x",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@9 [~@3 x] ~@54>").gain(0.5)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@2 A@3 B A@5 C A@7 C A@4 ~@2 A@5 D E A@2 B A@2 F ~ A C A@11 G ~ E A@2 B A@4 ~
>`.pickRestart({
  A: "x!8", B: "x ~ x ~@3 x ~ x ~ x ~ x ~ x!2", C: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2", D: "x!5 ~@3", E: "~@6 x!2",
  F: "x!4 ~@4", G: "x!7 ~",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@9 [~@5 x ~@2] ~@54>").gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@5 [~ x ~@2] ~@29 [~ x ~@2] ~@22 [~ x ~@2] ~@5>").gain(0.45)

// drums · ride bell
const ride_bell = s("rd").struct("<~@49 [~@3 x ~@4] ~@14>").gain(0.45)

stack(
  pizzicato_strings, string_ensemble_1, pizzicato_strings_2, string_ensemble_1_2, electric_guitar_clean, bass, bass_2,
  piano, kick, snare, low_tom, hihat, mid_tom, open_hat, ride_bell
)