Strudelify

Groovin'

The Rascals

KeyE♭ majorTempo108 bpm
0:00/0:00
// Groovin' — The Rascals
// 108 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 2 "Electric Piano" named as a piano, played on epiano1 (its vibraphone patch is not one)
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(108/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 · piano
const piano = note(`<
  A B A B A B A B A B A B C D E F G H I B A B A B A B C D E F G H A B A B A B A J A B A B A B C D E F G F K L A B M N O
  P O Q M N R S ~@6
>`.pickRestart({
  A: "[g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~, eb2@6 bb2@5 ~ bb2@4", // Cm7
  B: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~, f2@5 ~ bb2@6 bb1@2 ~@2", // Fm7
  C: "g1@5 ~ g1@7 ~ g1@2, [g3,bb3,d4,f4]@7 ~", D: "[f3,ab3,c4,eb4]@15 ~, f1@5 ~@11",
  E: "g1@5 ~ g1@7 ~ g1@2, [g3,bb3,d4,f4]@15 ~", F: "f1@5 ~ f1@9 ~, [f3,ab3,c4,eb4]@15 ~",
  G: "g1@5 ~ g1@7 ~@3, [g3,bb3,d4,f4]@3 ~", // Gm7
  H: "[f2,eb4]@2 [f2,eb4]@2 ~@2 [c4,eb4] ~@3 [bb2,bb3,d4,f4]@2 bb1@3 ~, [ab3,c4] ~ [ab3,c4] ~@3 ab2@2 ~@8", // F7 Cm Bb Ab
  I: "[g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~, eb2@3 ~@3 bb2@2", // Cm7
  J: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4,f4] g4 [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4,eb5] ~ [f3,ab3,c4,eb4,eb5] f5, f2@5 ~ bb2@6 bb1@2 ~@2, ~@5 bb4 ~@2", // Fm7
  K: "[ab2,c4,eb4,ab4] ~ [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~@3 [bb3,d4,g4] ~ [g2,bb3,d4,g4]@3 ~, ~@2 ab2@3 ~ ab2@3 ~ g2@2 ~@4", // Ab Gm
  L: "[ab3,c4,f4] ~ [ab3,c4,f4]@2 ~@2 f2@3 ~ bb2@2 bb1@4, ~@10 [ab3,c4,eb4,g4]@5 ~", // Fm Abmaj7
  M: "[g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~, eb2@5 ~ eb2@2 ~@2 ab2@2 ~@2 bb2@2", // Cm7
  N: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [bb2,f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~, ~@3 bb2 ~@4", // Fm7
  O: "[g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~, eb2@2 ~ eb2 ~ ab2 ~ bb2", // Cm7
  P: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [bb2,f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~, ~ bb2 ~@6", // Fm7
  Q: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [bb2,f3,ab3,c4,eb4] ~ [bb2,f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~, ~ bb2 ~@6", // Fm7
  R: "[g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~, eb2@2 ~ eb2 ~@4", // Cm7
  S: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~@11", // Fm7
})).s("gm_piano").gain(0.22).pan(0.1)

// chords · piano · soft notes
const piano_soft = note("<~@13 A ~@4 B ~@8 A ~@19 A ~@5 C ~@2 D E D F D G D E H I J K L M ~@2>".pickRestart({
  A: "~@6 f1@9 ~", B: "~@6 bb2@5 ~@5", C: "f2 ~ f2@3 ~@11", D: "~@4 g2 ~ a2 ~", E: "~@2 bb2@2 ~@8 bb2 c3 eb3@2",
  F: "~@6 bb2@3 ~@3 bb2 c3 eb3@2", G: "~@6 bb2@2 ~@5 c3 eb3 ~", H: "~@4 g2 ab2 a2 bb2",
  I: "~@2 bb2@3 ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [bb2,f3,ab3,c4,eb4] ~ [bb2,f3,ab3,c4,eb4] c3 [f3,ab3,c4,eb4] ~, ~@3 bb2 ~@3 eb3", // Fm7
  J: "[g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~, eb2@2 ~ eb2 g2 ab2 a2 bb2", // Cm7
  K: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [bb2,f3,ab3,c4,eb4] ~ [bb2,f3,ab3,c4,eb4] c3 [eb3,f3,ab3,c4,eb4] ~, ~ bb2 ~ bb2 ~@4", // Fm7
  L: "[g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~ [g3,bb3,c4,eb4] ~, eb2@6 bb2@5 ~ bb2@4", // Cm7
  M: "[f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~ [f3,ab3,c4,eb4] ~, f2@5 ~ bb2@6 bb1@2 ~@2", // Fm7
})).s("gm_piano").gain(0.06).pan(0.1)

// other · epiano1 · "Electric Piano"
const epiano1 = note("<~ A B A C ~@54 A D ~ A D ~@8>".pickRestart({
  A: "~@2 eb5 c5", B: "bb4", C: "g5", D: "bb4@7 ~",
})).s("gm_epiano1").gain(0.32).pan(1)

// other · harmonica
const harmonica = note("<~@4 A B@2 C@5 ~@6 D B@2 E@5 ~@6 D B@2 F@5 ~@16 D G@3 H@4 I@2 ~@6>".pickRestart({
  A: "~@3 eb6@3 c6@2", B: "[bb5@12 ~ eb6@2 c6]/2", C: "[bb5@3 c6@2 bb5@6 ~ eb6@8 ~ c6@2 bb5@4 ~ eb6@12]/5",
  D: "~@2 eb6 c6", E: "[bb5@2 ~ c6@2 ~@7 eb6@14 ~@3 c6@2 bb5@2 ~@2 c6@2 bb5@2 ~, ~@5 bb5@8 ~@27]/5",
  F: "[bb5@10 ~@2 eb6@14 ~@3 c6@2 bb5@8 ~]/5", G: "[bb5@12 ~ eb6@8 ~@3]/3",
  H: "[~@4 eb6@7 ~@2 c6@2 ~@5 eb6@8 eb6@2 c6@2, ~@15 bb5@6 ~@11]/4", I: "[bb5@3 ~]/2",
})).s("gm_harmonica").gain(0.1).pan(0.9)

// other · harmonica · soft notes
const harmonica_soft = note("<~@65 A B@6>".pickRestart({
  A: "~@10 eb6@3 ~ c6@2",
  B: "[bb5@2 ~ c6@2 ~@7 eb6@7 ~@2 c6@2 ~@9 bb5@2 ~ c6@2 bb5@8 ~@3, ~@5 bb5@8 ~@10 bb5@6 ~@19, ~@7 eb6@2 ~@3]/6",
})).s("gm_harmonica").gain(0.01).pan(0.9)

// other · electric guitar jazz · "guitar"
const electric_guitar_jazz = note("<~@12 A B A B C D ~@8 A B A B C D ~@14 A B A B C B ~@20>".pickRestart({
  A: "d5 f5 g5 f5 d5 f5 g5 f5", B: "c5 f5 g5 f5 c5 f5 g5 f5", C: "d5@2 f5@2 g5@2 f5@2 d5@2 f5@2 g5@2 f5 ~",
  D: "ab4@3 g4@2 f4@2 ~",
})).s("gm_electric_guitar_jazz").gain(0.4).pan(0.9)

// bass · acoustic bass · "Bass"
const bass = note(`<
  A B A B A B A B A B A B C D C D E F A B A B A B A B C D C D G F A B A B A B A B A B A B A B C D C D G H I J A B K L M
  N M O P Q R ~@7
>`.pickRestart({
  A: "eb2@6 bb2@5 ~ bb2@4", B: "f2@5 ~ bb2@6 bb1@3 ~", C: "g2@5 ~ g2@7 ~ g2@2", D: "f2@5 ~ f2@9 ~",
  E: "g2@5 ~ g2@7 ~@3", F: "f2 ~ f2@3 ~ ab2@2 ~@2 bb2@2 bb1@3 ~", G: "g1@5 ~ g1@7 ~@3", H: "f1@5 ~ f1@9 ~",
  I: "ab2 ~ ab2@3 ~ ab2@3 ~ g2@2 g2@3 ~", J: "f2 ~ f2@3 ~ f2@3 ~ bb2@2 bb1@4", K: "eb2@5 ~ eb2@2 g2@2 ab2@2 a2@2 bb2@2",
  L: "~@2 bb2@2 ~@2 bb2@2 ~@2 bb2 ~ bb2 c3 eb3@2", M: "eb2@2 ~ eb2 g2 ab2 a2 bb2",
  N: "~@2 bb2@3 ~ bb2@3 ~ bb2 ~ bb2 c3 eb3@2", O: "~@2 bb2@2 ~@6 bb2 ~ bb2 ~ eb3 ~",
  P: "eb2@5 ~ eb2@2 ~@2 ab2@2 ~@2 bb2@2", Q: "~@6 bb2@2 ~@2 bb2 ~ bb2 c3 eb3@2", R: "eb2@2 ~ eb2 ~@4",
})).s("gm_acoustic_bass").gain(0.64)

// bass · acoustic bass · "Bass" · soft notes
const bass_soft = note("<~@61 A B C D E F G H I J ~>".pickRestart({
  A: "~@6 bb2@2 ~@5 c3 ~@2", B: "~@4 g2 ~ a2 ~", C: "~ bb2 ~@6", D: "~@4 g2 ab2 a2 bb2",
  E: "~@2 bb2@3 ~ bb2@3 ~ bb2 ~ bb2 c3 eb3@2", F: "eb2@2 ~ eb2 g2 ab2 a2 bb2",
  G: "~@2 bb2@2 ~@2 bb2@2 ~@2 bb2 ~ bb2 c3 eb3 ~", H: "eb2@6 bb2@5 ~ bb2@4", I: "f2@5 ~ bb2@6 bb1@3 ~",
  J: "eb2@2 ~ eb2 ~@4",
})).s("gm_acoustic_bass").gain(0.16)

// chords · piano · "Piano 2" · Eb Ab Eb Ab Eb Ab
const piano_2 = note(`<
  ~@40
  [eb5@5 ~ bb2@2, eb2@3 ~@5]
  [~@3 [bb3,eb4,g4,bb4,eb5,g5] [bb3,eb4,g4,bb4,eb5,g5]@2 ~ [c4,eb4,ab4,c5,eb5,ab5] [c4,eb4,ab4,c5,eb5,ab5]@2 ~ [c4,eb4,ab4,c5,eb5,ab5] [c4,eb4,ab4,c5,eb5,ab5]@4, ~@3 bb2@3 ~@2]
  [eb2@3 ~@3 bb2@2]
  [~@3 [bb3,eb4,g4,bb4,eb5,g5] [bb3,eb4,g4,bb4,eb5,g5]@2 ~ [c4,eb4,ab4,c5,eb5,ab5] [c4,eb4,ab4,c5,eb5,ab5]@2 ~ [c4,eb4,ab4,c5,eb5,ab5] [c4,eb4,ab4,c5,eb5,ab5]@4, ~@3 bb2@3 ~@2]
  [eb2@3 ~@3 bb2@2]
  [~@3 [bb3,eb4,g4,bb4,eb5,g5] [bb3,eb4,g4,bb4,eb5,g5]@2 ~ [c4,eb4,ab4,c5,eb5,ab5] [c4,eb4,ab4,c5,eb5,ab5]@2 ~ [c4,eb4,ab4,c5,eb5,ab5] [c4,eb4,ab4,c5,eb5,ab5]@3 ~, ~@3 bb2@3 ~@2]
  ~@26
>`).s("gm_piano").gain(0.29).pan(0.1)

// chords · piano · "Piano 2" · soft notes
const piano_soft_2 = note(`<
  ~@40
  [~@6 bb2@5 ~@5]
  [f2@5 ~@7 bb1@3 ~]
  [~@6 bb2@5 ~@5]
  [f2@5 ~@7 bb1@3 ~]
  [~@6 bb2@5 ~@5]
  [f2@5 ~@7 bb1@3 ~]
  ~@26
>`).s("gm_piano").gain(0.19).pan(0.1)

// drums · rim
const rim = s("rim").struct("<~@12 [x!4]!6 ~@8 [x!4]!6 ~@14 [x!4]!6 ~@20>").gain(0.45).pan(0)

// drums · tambourine
const tambourine = s("tb").struct("<A@12 ~@6 A@8 ~@6 A@14 ~@8 A@11 B ~@6>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.5).pan(0)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@65 [~@3 x] [~ x ~ x]!5 ~>").gain(0.05).pan(0)

// drums · bongos
const bongos = s("bongo:18").struct("<A@10 B C ~@5 D A@7 C ~@5 D A@14 ~@7 E A@11 ~@7>".pickRestart({
  A: "~@6 x!2", B: "~@3 x", C: "~@4 x ~@5 x ~ x!3 ~", D: "~@10 x ~ x!3 ~", E: "x ~ x ~@3 x ~@3 x ~ x!3 ~",
})).gain(1.3).pan(0)

// drums · bongos · soft notes
const bongos_soft = s("bongo:18").struct("<~@65 [~@6 x!2]!5 [~@3 x] ~>").gain(0.13).pan(0)

// drums · agogo bells
const agogo_bells = s("agogo:4").struct("<A@12 ~@6 A@8 ~@6 A@14 ~@8 A@11 B ~@6>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(2.85).pan(0)

// drums · agogo bells · soft notes
const agogo_bells_soft = s("agogo:4").struct("<~@65 [~@3 x] [~ x ~ x]!4 ~@2>").gain(0.32).pan(0)

stack(
  piano, piano_soft, epiano1, harmonica, harmonica_soft, electric_guitar_jazz, bass, bass_soft, piano_2, piano_soft_2,
  rim, tambourine, tambourine_soft, bongos, bongos_soft, agogo_bells, agogo_bells_soft
)

More by The Rascals