Strudelify

Groovin'

UB40

KeyA♭ majorTempo99 bpm
0:00/0:00
// Groovin' — UB40
// 99 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 7 "CLEAN GTR" electric guitar clean (copy of ch 3 "A.PIANO" piano)
// note: Full arrangement: all 97 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(99/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 · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~ A B C D E F C D E F C D E F C D A B C D A B G H E F C D E F C D E F C D A B C D A B G H A B C D A B G H E F C D E F
  C D E F C D A B C D A B G H A B C D A B G H A B C D A B G H A B C D A B G H
>`.pickRestart({
  A: "ab1 ~@2 ab1 ~@2 ab1 ~ ab1 ~@2 ab1 ~ ab1 eb2 db2", B: "c2 ~@2 c2 ~@2 c2 ~ c2 ~@2 c2 ~ c2 bb1 c2",
  C: "db2 ~@2 db2 ~@2 db2 ~ db2 ~@2 db2 bb1 ~ db2 ~", D: "eb2 ~@2 eb2 ~@2 eb2 ~ eb2 ~@2 eb2 c2@2 eb2@2",
  E: "ab1 ~@2 ab1 ~@2 ab1 ~ ab1 ~@2 ab1 ~ ab1 eb2 c2", F: "db2 ~@2 db2 ~@2 db2 ~ db2 ~@2 db2 ~ db2 bb1 c2",
  G: "db2 ~@2 db2 ~@2 db2 ~ eb2 ~@2 eb2 ~@2 eb2 ~", H: "ab1 ~@2 ab1 ~@2 ab1 ~ ab1 ~@3 gb2@3 ~",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · piano · "A.PIANO"
const piano = note(`<
  ~ A B C D A C@2 D A C@2 D A C@2 D A B C D A B E A ~@8 A C@2 D A B C D A B E A ~@16 A C@2 D A B C D A B E A@2 B C D A B
  E A@2 B C D A B E A@2 B C D A B E A
>`.pickRestart({
  A: "~@2 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~", // Ab
  B: "~@2 [c4,eb4,g4] ~@3 [c4,eb4,g4] ~@3 [c4,eb4,g4] ~@3 [c4,eb4,g4] ~", // Cm
  C: "~@2 [ab3,db4,f4] ~@3 [ab3,db4,f4] ~@3 [ab3,db4,f4] ~@3 [ab3,db4,f4] ~", // Db
  D: "~@2 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~", // Eb
  E: "~@2 [ab3,db4,f4] ~@3 [ab3,db4,f4] ~@3 [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~", // Db Eb
})).s("gm_piano").gain(0.3)

// other · alto sax
const alto_sax = note(`<
  ~@6 A B C ~ A B D ~@4 E ~@3 E ~@4 A B C ~ A B D ~ A B C E ~@3 E F G H@2 I J K L M N O ~@12 E F B C E F G P E F B C E F
  G P Q R S T U V W X Q R S T U V W X
>`.pickRestart({
  A: "~@8 db4 ~@3 db4@4", B: "ab3", C: "bb3@7 ~", D: "eb4@4 db4@3 ~", E: "~@4 bb3@2 c4 ~ bb3@2 c4 ~@5",
  F: "~@8 c4 ~@3 c4@4", G: "ab3 bb3", H: "[c4@13 eb3@2 eb3@2 ~@12 eb3!2 ~, ~@13 d3 ~ d3 ~@16]/2",
  I: "g3 ~@7 bb3@5 bb3@3, ~@8 ab3 ~@4 ab3 ~@2", J: "ab3 ~@12 f3@2 ~, ~@13 eb3 ~@2",
  K: "eb3 ~@5 c3@2 bb2 ~ f3@2 eb3 ~@3, ~@6 bb2 ~@3 eb3 ~@5", L: "eb3@2 ~@11 eb3!2 ~",
  M: "g3 ~@7 bb3@5 ab3 bb3@2, ~@8 ab3 ~@7", N: "ab3 ~@4 eb3 f3@2 eb3 ~@4 [bb2,c3] bb2@2", O: "ab2 ~@7", P: "c4@7 ~",
  Q: "~@4 bb3@2 c4 ~ bb3@2 c4 ~@2 eb3!2 ~", R: "~@8 [ab3,c4] ~@4 bb3@3, ~@2 bb3 c4, ~@13 ab3 ~@2", S: "ab3 ~@15",
  T: "eb3 ~@5 c3@2 bb2 ~ f3@2 eb3 ~@3, bb3@7 ~, ~@10 eb3 ~@5", U: "eb3@2 ~@2 bb3@2 c4 ~ bb3@2 c4 ~@2 eb3!2 ~",
  V: "~@8 [ab3,c4] ~@5 bb3@2, ~@3 c4", W: "ab3 ~@5 f3@2 eb3 ~@4 c3 bb2@2, ~ bb3", X: "c4@7 ~, ab2 ~@7",
})).s("gm_alto_sax").gain(0.3)

// other · alto sax · soft notes
const alto_sax_soft = note("<~@48 A ~@33 B C D ~ E F ~@2 B C D ~ E F ~>".pickRestart({
  A: "~@15 d3", B: "g3 ~@15", C: "~@13 f3@2 ~, ~@13 eb3 ~@2", D: "~@6 bb2 ~@8 d3", E: "g3 ~@7 bb3@5 ab3 ~@2",
  F: "~@5 eb3 ~@7 bb2 ~@2",
})).s("gm_alto_sax").gain(0.15)

// chords · synth strings 1 · "SYN STRING"
const synth_strings_1 = note("<~@25 A B@2 C A B@2 C A B@2 C ~@16 D@3 E F@3 G H@3 I ~@32>".pickRestart({
  A: "eb5", B: "f5/2", C: "g5", D: "[eb5 ~ ab5, ab4@31 ~@17, c5@3 ~@5, ~ [db5,f5]@2]/3",
  E: "eb6@7 ~ db6@8, bb5, g5@3 ~", F: "[[c5,eb5]@15 ~@17 ab5@15 ~, ab4@31 ~@17, ~ [db5,f5]@2]/3",
  G: "eb6@7 ~ db6@7 ~, bb5, g5@3 ~", H: "[[c5,eb5] ~ ab5, ab4@31 ~@17, ~ [db5,f5]@2]/3", I: "eb6@8 db6@7 ~, [g5,bb5]",
})).s("gm_synth_strings_1").gain(0.2)

// other · synth brass 1 · "SYNTHBRASS"
const synth_brass_1 = note(`<
  ~@6 A B C ~ A D E ~@4 F ~@3 F ~@4 A B C ~ A D E ~ A B C F ~@3 F G H I ~@20 F A B C F G H I F A B C F G H I F A B C F G
  H I F A B C F G H I
>`.pickRestart({
  A: "~@8 ab4 ~@3 ab4@4", B: "f4", C: "g4@7 ~", D: "f4@15 ~", E: "g4 f4", F: "~@4 bb4@2 c5 ~ bb4@2 c5 ~@5",
  G: "~@8 [ab4,ab5] ~@3 [ab4,ab5]@4", H: "[f4,f5] [g4,g5]", I: "[ab4,ab5]@15 ~",
})).s("gm_synth_brass_1").gain(0.35)

// drums · kick
const kick = s("bd").struct("<[x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~]!96 [x ~@2 x ~@2 x ~ x ~@2 x ~@4]>").gain(0.51)

// drums · rim
const rim = s("rim").struct("<[x!4] ~@96>").gain(0.51)

// drums · snare
const snare = s("sd").struct("<~ A B A B C@8 A B A B C@21 A@2 B A B C@31 A@2 B A B C@11 A@2 B A B C@2>".pickRestart({
  A: "~@4 x ~@7 x!3 ~", B: "~@4 x ~@7 x!2 ~@2", C: "~ x ~ x",
})).gain(0.51)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~ A B A B ~@8 A B A B ~@21 A@2 B A B ~@31 A@2 B A B ~@11 A@2 B A B ~@2
>`.pickRestart({
  A: "~@15 x", B: "~@7 x",
})).gain(0.26)

// drums · clap
const clap = s("cp").struct(`<
  A B@4 ~@8 B@4 ~ C@2 ~ C ~ C ~@13 C B@5 ~@10 C@8 ~@5 C@2 ~ C ~ C ~ C B@5 ~@3 C@2 ~ C ~ C ~ C B@5 ~@2
>`.pickRestart({
  A: "x!4", B: "~ x ~@2", C: "~@3 x",
})).gain(0.46)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@15 A ~@3 A ~@15 A ~@3 A ~@23 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.51)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~ A B A B A B A B A B A B A B A B A@3 B A B A B A B A B A B A B A B A B A@3 B A B A B A B A B A B A B A@9 B A B A@3 B
  A B A B A@3 B A B A B A@3 B A B A B A@3 B A B A C
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~ x ~@2 x ~ x!3", B: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~", C: "x ~@2 x ~@2 x ~ x ~@2 x ~@4",
})).gain(0.51)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~ A B A B C@8 A B A B C@21 A@2 B A B C@31 A@2 B A B C@11 A@2 B A B C@2
>`.pickRestart({
  A: "~ x ~@2 x ~@2 x ~ x!2 ~ x ~ x ~", B: "~ x ~@3 x ~ x!3 ~@3 x ~ x", C: "~ x ~@2 x ~@2 x ~@2 x ~@2 x ~@2",
})).gain(1.56)

stack(
  bass, piano, alto_sax, alto_sax_soft, synth_strings_1, synth_brass_1, kick, rim, snare, snare_soft, clap, crash,
  tambourine, cabasa
)

More by UB40