Strudelify

Maybe Tomorrow

UB40

KeyD majorTempo188 bpm
0:00/0:00
// Maybe Tomorrow — UB40
// 188 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 162 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(188/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.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B C D E F A G A B C D E F A G A B C D E F A H A B C D E F A G A I E J E K L M L M A E N O N L M L M E N E P L Q R
  S T U V W E L Q A B C D E F A G A B C D E F A G A H X Y Z AA AB AC A AD AE AF A AG A AH AI AJ AK AL E AM AN AO L AP T
  AQ AR AS AT AU AV AW AX AY AZ BA@2 ~@2 AY BB BC BD BE BF BC BG BC BF BH BI AY BD BJ BI BK BD ~ BL BM BN BO AO T BP BQ
  BG BO BR BS BR AW AS BT BU ~@2
>`.pickRestart({
  A: "a2@5 ~ e3 ~ a2@5 ~ e3 ~", B: "a2 ~ a2@3 ~ e3 ~ a2@5 ~ e3 ~", C: "d3@5 ~ a3 ~ d3@5 ~@3", D: "d3 ~ d3@4 ~@8 a3 ~",
  E: "d3@5 ~ a3 ~ d3@5 ~ a3 ~", F: "d3 ~ d3@4 a3 ~@7 a3 ~", G: "a2 ~ a2@4 e3 ~ a2@5 ~@3",
  H: "a2 ~ a2@3 ~ e3 ~ a2@5 ~@3", I: "a2 ~ a2@4 e3 ~ a2@5 ~ e3 ~", J: "d3 ~ d3@4 a3@2 d3@5 ~ a3@2",
  K: "d3 ~ d3@4 a3 ~ d3@5 ~ a3@2", L: "g2@5 ~ d3 ~ g2@5 ~ d3 ~", M: "g2 ~ g2@4 d3 ~ g2@5 ~ d3 ~",
  N: "d3 ~ d3@4 a3 ~ d3@5 ~ a3 ~", O: "d3@5 ~@3 d3@5 ~@3", P: "d3 ~ d3@4 ~@2 d3@5 ~ a3 ~, ~@2 a3 ~@13",
  Q: "g2 ~ g2@4 ~@2 g2@5 ~@3", R: "g2@5 ~@3 g2@5 ~ d3@2", S: "g2 ~ g2@4 ~@2 g2@5 ~ d3 ~", T: "c3@5 ~ g3 ~ c3@5 ~ g3 ~",
  U: "c3 ~ c3@4 g3 ~ c3@5 ~ g3 ~", V: "c3@5 ~@3 c3@5 ~@3", W: "c3 ~ c3@4 g3 ~ c3@5 ~@3", X: "a2@5 ~ e3 ~@7 e3 ~",
  Y: "~ a2 ~@6", Z: "b3 ~@3 b3 ~@3 b3 ~@3 g#3@4", AA: "~@4 f#3@6 ~@2 e3 ~@3", AB: "~@8 b2@5 ~@3",
  AC: "b2@5 ~@3 b2@5 ~@3", AD: "a2 ~ a2@2 ~@2 e3 ~ a2@4 ~@2 e3 ~", AE: "~@6 e3 ~@7 e3 ~",
  AF: "a2 ~ a2 ~@3 e3 ~ a2@5 ~ e3 ~", AG: "a2 ~ a2@2 ~@2 e3 ~ a2@5 ~ e3 ~", AH: "a2 ~ a2@2 ~@2 e3 ~ a2@5 ~@3",
  AI: "a2@4 ~@4 a2@4 ~@2 e3 ~", AJ: "a2 ~ a2@2 ~@2 e3@2 a2@5 ~ e3 ~", AK: "a2@5 ~@3 a2@5 ~ e3 ~",
  AL: "a2 ~ a2@2 ~@2 e3 ~ a2@5 ~ e3@2", AM: "d3 ~ d3 ~@3 a3 ~ d3@5 ~ a3 ~", AN: "g2@5 ~ d3 ~ g2@4 ~@2 d3 ~",
  AO: "g2 ~ g2@2 ~@2 d3 ~ g2@5 ~ d3 ~", AP: "g2 ~ g2@2 ~@2 d3 ~ g2@5 ~ d3@2", AQ: "c3 ~ c3@3 ~ g3 ~ c3@5 ~ g3 ~",
  AR: "~@8 c3@5 ~ g3 ~", AS: "c3 ~ c3@3 ~ g3@2 c3@5 ~ g3 ~", AT: "d3@5 ~ a3@2 d3@5 ~ a3@2", AU: "~@8 g2@5 ~ d3 ~",
  AV: "g2 ~ g2@2 ~@2 d3 ~@7 d3 ~", AW: "~@6 g3@2 c3@5 ~ g3 ~", AX: "c3 ~ c3@3 ~ g3 ~@9", AY: "~@6 g3 ~ c3@5 ~ g3 ~",
  AZ: "c3 ~ c3@2 ~@2 g3@2 ~@8", BA: "[d4 ~@3 d4 ~@3 d4 ~@3 b3@7 ~@5 g3@5 ~@3]/2", BB: "c3 ~ c3@2 ~@2 g3 ~ c3@5 ~ g3@2",
  BC: "c3@5 ~ g3@2 c3@5 ~ g3 ~", BD: "c3 ~ c3@3 ~ g3@2 ~@6 g3@2", BE: "c3@5 ~ g3@2 c3@5 ~ g3@2",
  BF: "c3 ~ c3@3 ~ g3 ~@7 g3@2", BG: "c3 ~ c3@3 ~ g3 ~ c3@5 ~ g3@2", BH: "~@6 g3 ~@7 g3@2",
  BI: "~@2 c3@3 ~ g3@2 ~@6 g3@2", BJ: "c3@5 ~ g3@2 ~@6 g3 ~", BK: "~@6 g3 ~ c3@5 ~ g3@2",
  BL: "c3 ~ c3@3 ~ g3 ~@5 b2 ~@3", BM: "g2@5 ~ d3@2 ~@6 d3 ~", BN: "g2 ~ g2@3 ~@11", BO: "g2@5 ~ d3@2 g2@5 ~ d3 ~",
  BP: "c3 ~ c3@2 ~@2 g3 ~@7 g3 ~", BQ: "~@6 g3 ~@7 g3 ~", BR: "g2 ~ g2@3 ~ d3@2 ~@6 d3@2", BS: "g2@5 ~@9 d3 ~",
  BT: "c3@6 g3@2 c3@5 ~ g3 ~", BU: "c3 ~ c3@3 ~ g3@2 c3@5 ~ g3@2",
})).s("gm_acoustic_bass").gain(0.74)

// bass · acoustic bass · "ACOU BASS" · soft notes
const bass_soft = note(`<
  ~@3 A B ~ C ~@4 A B ~ C ~@4 A B ~ C ~@4 A B ~ C ~@15 D ~@10 E F@2 ~@2 G H ~@2 F ~@2 A B ~ C ~@4 A B ~ C ~@4 I J ~@2 K
  ~@3 L ~@4 M N ~ N ~@9 O ~@2 P Q R S R T ~ U V W R ~@2 T ~ T ~@3 T X Y R T@2 Y R T Z AA AB AC ~@3 T X ~@2 Q AD Q R ~@3
  AE@2
>`.pickRestart({
  A: "~@14 a3 ~", B: "~@6 a3 ~ d3@5 ~@3", C: "~@8 d3@5 ~@3", D: "~@6 a3 ~@7 a3 ~", E: "~@6 d3 ~@7 d3 ~",
  F: "~@6 d3 ~@9", G: "~@6 g3 ~@7 g3 ~", H: "~@14 g3 ~", I: "~@2 a2 ~", J: "a2 ~@5 e3 ~ a2@6 ~@2", K: "f#3@7 ~@9",
  L: "a2@4 ~@4 a2@5 ~@3", M: "~@14 e3 ~", N: "~@6 e3 ~@9", O: "c3@5 ~ g3 ~@9", P: "g2@5 ~ d3 ~@9", Q: "~@8 g2@5 ~@3",
  R: "c3@5 ~@11", S: "~@8 c3@5 ~ g3 ~", T: "~@8 c3@5 ~@3", U: "~@4 a3 ~@11", V: "a3@7 ~ d3@4 ~@4",
  W: "d3@5 ~@3 d3@5 ~@3", X: "c3@5 ~@3 c3@5 ~@3", Y: "c3 ~@7 c3@5 ~@3", Z: "c3@5 ~ g3@2 c3@5 ~ g3@2", AA: "~@8 d3 ~@7",
  AB: "~@4 g2@3 ~", AC: "~@6 d3 ~ g2@4 ~@4", AD: "~@6 d3@2 g2@5 ~@3", AE: "[g2@11 ~@5]/2",
})).s("gm_acoustic_bass").gain(0.07)

// chords · drawbar organ · "ORGAN 1"
const drawbar_organ = note(`<
  ~@17 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 E@2 F@2 G@2 H@2 I@2 J F@4 K@4 F@4 K@4 L@2 M@2 N O@2 ~@16 E@4 P@2 Q@2 R@2 E@8 S@2
  T@2 K@4 L@4 N K@2 L@4 U@2 V@2 L@20 K@2 ~@14 W@2
>`.pickRestart({
  A: "[[c#4,e4,a4] ~@3 [c#4,e4,a4]@24 ~@4]/2", B: "[[d4,f#4,a4] ~@3 [d4,f#4,a4]@24 ~@4]/2",
  C: "[[d4,f#4,a4] ~@3 [d4,f#4,a4]@20 ~@8]/2", D: "[[c#4,e4,a4] ~@3 [c#4,e4,a4]@20 ~@8]/2",
  E: "[[c#4,e4,a4] ~@3 [c#4,e4,a4]@25 ~@3]/2", F: "[[d4,f#4,a4] ~@3 [d4,f#4,a4]@25 ~@3]/2",
  G: "[[d4,f#4,a4] ~@3 [d4,f#4,a4]@26 ~@2]/2", H: "[[b3,d4,g4] ~@3 [b3,d4,g4]@24 ~@4]/2",
  I: "[[b3,d4,g4] ~@3 [b3,d4,g4]@22 ~@6]/2", J: "[c#4,e4,a4] ~@3 [c#4,e4,a4]@9 ~@3",
  K: "[[b3,d4,g4] ~@3 [b3,d4,g4]@25 ~@3]/2", L: "[[c4,e4,g4] ~@3 [c4,e4,g4]@25 ~@3]/2",
  M: "[[c4,e4,g4] ~@3 [c4,e4,g4]@24 ~@4]/2", N: "[d4,f#4,a4] ~@3 [d4,f#4,a4]@9 ~@3",
  O: "[[b3,d4,g4] ~@3 [b3,d4,g4]@26 ~@2]/2", P: "[[e4,g#4,b4] ~@3 [e4,g#4,b4]@21 ~@7]/2",
  Q: "[[b3,b4] ~@3 [b3,b4]@25 ~@3]/2", R: "[a4 ~@3 [c#4,a4]@25 ~@3]/2",
  S: "[[c#4,e4,a4] ~@23 g4@5 ~@3, ~@2 [c#4,e4,a4]@13 ~]/2", T: "[[d4,f#4] ~@3 [d4,f#4,a4]@25 ~@3]/2",
  U: "[[d4,g4,b4] ~@3 [d4,g4,b4]@25 ~@3]/2", V: "[[d4,g4,a4] ~@3 [d4,f#4,a4]@25 ~@3]/2", W: "[[b3,d4,g4]@21 ~@11]/2",
})).s("gm_drawbar_organ").gain(0.48)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~ A@2 B@4 A@4 B@4 A@4 B@4 A@4 B@4 A@4 B@4 C@4 A B@4 C@4 B@4 C@4 D@4 B C@2 A@2 B@4 A@4 B@4 A@6 E@2 F@2 A@11 G B@2 C@4
  D@4 B C@2 D@4 H@2 I@2 D@14 J D@5 C@4 D@4 C@4 D@4 K@2
>`.pickRestart({
  A: "~@2 [c#4,e4,a4] ~@3 [c#4,e4,a4] ~", B: "~@2 [d4,f#4,a4] ~@3 [d4,f#4,a4] ~", C: "~@2 [b3,d4,g4] ~@3 [b3,d4,g4] ~",
  D: "~@2 [c4,e4,g4] ~@3 [c4,e4,g4] ~", E: "~@2 [b3,e4,g#4,b4] ~@3 [b3,e4,g#4,b4] ~",
  F: "~@2 [b3,e4,f#4,b4] ~@3 [b3,d#4,f#4,b4] ~", G: "~@2 [c#4,e4,a4] ~@3 [c#4,e4,g4,a4] ~",
  H: "~@2 [d4,g4,b4] ~@3 [d4,g4,b4] ~", I: "~@2 [d4,g4,a4] ~@3 [d4,f#4,a4] ~", J: "~@2 [c4,f4,g4] ~@3 [c4,e4,g4] ~",
  K: "[[d3,g3,b3]@5 ~@3]/2", // G
})).s("gm_electric_guitar_muted").gain(0.48)

// chords · trumpet
const trumpet = note(`<
  A B C D@2 E F G A B C D@2 E F G ~@50 A B C D@2 E F G A B C D@2 E F G ~@5 H@2 I@2 ~@29 J@2 K@2 ~@19 L M@2 N O P@2 Q R S
  T N O P@2 Q U S ~
>`.pickRestart({
  A: "~@12 [e4,a4] ~ [f#4,b4]@2", B: "[a4,c#5] ~@3 [a4,c#5] ~@7 a4 ~ [f#4,b4]@2",
  C: "[a4,c#5] ~@3 [a4,c#5] ~@3 [f#4,b4]@2 [a4,c#5]@2 [f#4,b4]@2 [e4,a4]@2", // A B5 A B5 A5
  D: "[[d4,f#4]@26 ~@2 [d4,f#4] ~ [e4,a4]@2]/2", E: "[f#4,b4] ~@3 [f#4,b4] ~@7 f#4 ~ [e4,a4]@2",
  F: "[f#4,b4] ~@3 [f#4,b4] ~@3 [e4,a4] ~ f#4@2 e4 ~ f#4@2", G: "[e4,a4]",
  H: "[[b4,b5] ~@3 [b4,b5] ~@3 [b4,b5] ~@3 [g#4,g#5]@7 ~ f#5@2 ~@2 [e4,e5] ~ g#4@2 [f#4,f#5] ~ [e4,e5]@2, ~@26 g#5 ~@5]/2", // B G# E F# E
  I: "[f#4@29 ~@3]/2", J: "[d5 ~@3 d5 ~@3 d5 ~@3 b4@7 ~ a4@3 ~ g4 ~ b4@2 ~@2 g4@2]/2", K: "[a4@7 ~]/2",
  L: "~@8 a4 ~@3 a4@2 ~@2", M: "[g4@25 ~@3 [d4,g4] ~ [e4,a4]@2]/2", N: "[g4,b4]@2 ~@2 [g4,b4] ~@7 g4 ~ [e4,a4]@2",
  O: "[g4,b4] ~@3 [g4,b4] ~@3 [e4,a4]@2 [g4,b4]@2 [e4,a4]@2 [d4,g4]@2", P: "[[c4,e4]@26 ~@2 [c4,e4] ~ [d4,g4]@2]/2",
  Q: "[e4,a4] ~@3 [e4,a4] ~@7 e4 ~ [d4,g4]@2", R: "[e4,a4] ~@3 [e4,a4] ~@3 [d4,g4] ~ e4@2 d4 e4@2 ~", S: "[d4,g4]",
  T: "~@12 [d4,g4] ~ [e4,a4]@2", U: "[e4,a4] ~@3 [e4,a4] ~@3 [d4,g4] ~ e4@2 d4 ~ e4@2",
})).s("gm_trumpet").gain(0.55)

// chords · trumpet · soft notes
const trumpet_soft = note("<~@5 A B ~@6 A B ~@56 A B ~@6 A B ~@40 C ~@21 D ~@6 E F ~@6 E G ~@2>".pickRestart({
  A: "~@12 d4 ~@3", B: "~@10 b4@2 a4 ~ c#4@2", C: "~@12 a4 ~@3", D: "~@10 b4@2 ~ e4@2 ~", E: "~@12 c4 ~@3",
  F: "~@10 a4@2 g4 b3@2 ~", G: "~@10 a4@2 g4 ~ b3@2",
})).s("gm_trumpet").gain(0.28)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~@2 A@2 ~@14 A B A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4 A ~ A ~@17 A ~ A ~@17 A ~ A ~@5
>`.pickRestart({
  A: "x", B: "~ x",
})).gain(0.08)

// drums · snare
const snare = s("sd").struct("<~ [~ x]!159 ~@2>").gain(0.08)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A@82 B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C
  B C B C B C B C B C B C B C B C B C B C B ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "x!4", C: "~ x!3",
})).gain(0.7)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@84 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 ~@3
>`.pickRestart({
  A: "x",
})).gain(0.39)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 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 ~ 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 ~ B ~
>`.pickRestart({
  A: "~@7 x", B: "x",
})).gain(0.7)

// drums · crash
const crash = s("cr").struct("<[~ x] ~@65 [~ x] ~@95>").gain(0.78)

// drums · lt
const lt = s("lt").struct("<~ [~ x]!159 ~@2>").gain(0.08)

stack(
  bass, bass_soft, drawbar_organ, electric_guitar_muted, trumpet, trumpet_soft, kick, kick_soft, snare, hihat,
  hihat_soft, open_hat, crash, lt
)

More by UB40