Strudelify
Funky Town cover art

Funky Town

Inc. Lipps

KeyC minorTempo123 bpm
0:00/0:00
// Funky Town — Lipps, Inc.
// 123 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 7 "Sax Solo" soprano sax (copy of ch 6 "Sax Solo" alto sax)
// note: Full arrangement: all 174 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(123/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · lead 8 bass lead · "Bass"
const bass = note(`<
  A B@4 C@2 D C D@2 E C F G H I J@2 K L M A@8 N M ~@7 O P Q P Q P Q P Q P Q R S P S P S P S P S P S P Q T ~ T ~ T ~ T ~
  P Q R S P S P S P S P S P S P Q A@5 D C D@2 E C F G H I J@2 K L M A@8 N M ~@3 O P Q P A P Q R S P S P S P Q R S P S P
  S P Q R S P S P S P Q R S P Q R S P Q R S P Q R S P Q P Q P Q P Q
>`.pickRestart({
  A: "c2 ~ c3 ~ c2 ~ c3 ~ c2 ~ c3 ~ c2 ~ c3 ~", B: "c2 ~ c3 ~ c2 ~ c3 ~ c2 ~ c3 ~ c2 ~ c3@2",
  C: "c2 ~ c3@2 c2 ~ c3@2 c2 ~ c3@2 c2 ~ c3@2", D: "c2 ~ c3@2 c2 ~ c3@2 c2 ~ c3 ~ c2 ~ c3@2",
  E: "c2 ~ c3@2 c2 ~ c3@2 c2 ~ c3@2 c2@2 c3@2", F: "c2 ~ c3@2 c2 ~ c3@2 c2@2 c3 ~ c2@2 c3@2",
  G: "c2@2 c3@2 c2 ~ c3@2 c2 ~ c3@2 c2@2 c3@2", H: "c2 ~ c3@2 c2@2 c3 ~ c2 ~ c3 ~ c2 ~ c3 ~",
  I: "[g1,c2] ~ g2 ~ g1 ~ g2 ~ g1 ~ g2 ~ g1 ~ g2 ~", J: "g1 ~ g2 ~ g1 ~ g2 ~ g1 ~ g2 ~ g1 ~ g2 ~",
  K: "g1 ~ g2 ~ g1 ~ g2 ~ g1 ~ g2 ~ g1@2 g2 ~", L: "g1 ~ g2 ~ g1 ~ g2 ~ f1@2 f2 ~ f1@2 f2@2",
  M: "e1@2 e2 ~ e1@2 e2 ~ d1@2 d2 ~ d1 ~ d2 ~", N: "[g1,c2] ~ g2 ~ g1 ~ g2 ~ f1@2 f2 ~ f1@2 f2@2", O: "~@14 c2 ~",
  P: "c2 ~ c2 ~ g1 ~ g1 ~ bb1 ~ bb1 ~ b1 ~ b1 ~", Q: "c2 ~ c2 ~ g1 ~ g1 ~ bb1 ~ bb1 ~ b1@3 ~",
  R: "c2 ~ c2 ~ g1 ~ g1 ~ [g1,bb1] ~ bb1 ~ b1 ~ b1 ~", S: "c2 ~ c2 ~ g1 ~ g1 ~ bb1 ~ bb1 ~ b1@2 ~@2",
  T: "c2 [f1,f2] ~ [f1,f2] ~ [f1,f2] ~ [f1,f2]!2 ~@7", // F
})).s("gm_lead_8_bass_lead").gain(0.66)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@56 A B A C A B A C ~@16 A B A C A B A C ~@86>".pickRestart({
  A: "~@6 bb4 ~ c5 ~ bb4 ~ c5 ~ bb4 ~", B: "~@6 bb4 ~ c5 ~ bb4 ~ eb5@3 ~", C: "~@6 bb4 ~ c5 ~ c5 ~ eb4@3 ~",
})).s("gm_string_ensemble_1").gain(0.52)

// other · alto sax · "Sax Solo"
const alto_sax = note("<~@64 A B C D A E F G@2 ~@101>".pickRestart({
  A: "~@12 f4@2 eb4 ~", B: "f4 ~ eb4 ~ f4 ~ eb4 ~ bb4@3 ab4@2 ~ bb4 ~", C: "~@12 eb4@2 f4 ~",
  D: "bb4@2 ab4@2 f4@2 eb4 ~ eb4@3 f4@5", E: "f4@2 eb4 ~ f4@2 eb4 ~ bb4@3 ab4@3 bb4@2", F: "~@6 eb4 f4",
  G: "[bb4@2 ab4@2 f4@2 eb4@2 eb4@3 f4@19 ~@2]/2",
})).s("gm_alto_sax").gain(0.52).pan(0.6)

// chords · electric guitar clean · "Gitar"
const electric_guitar_clean = note(`<
  ~@48 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ B ~ B ~ B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@39 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
>`.pickRestart({
  A: "[c4,eb4,f4]@2 ~ [c4,eb4,f4]!2 ~@11", B: "[c4,f4,a4]!2 ~ [c4,f4,a4] ~ [c4,f4,a4] ~ [bb3,eb4,g4] [c4,f4,a4] ~@7",
})).s("gm_electric_guitar_clean").gain(0.57)

// drums · kick
const kick = s("bd").struct("<A@64 B C B C B C B C A@98 ~@4>".pickRestart({
  A: "x!2", B: "~@3 x", C: "x!4",
})).gain(0.59)

// drums · rim
const rim = s("rim").struct("<~@94 A@49 B A B A B A@24 ~@2>".pickRestart({
  A: "~@2 x ~@2 x ~@4 x ~@2 x ~@2", B: "~@2 x ~@2 x ~@4 x ~@5",
})).gain(0.52)

// drums · snare
const snare = s("sd").struct("<A@64 B ~ B ~ B ~ B ~ A@53 C A@23 D A@20 ~@4>".pickRestart({
  A: "~ x ~ x", B: "x!2 ~ x ~ x ~ x!2 ~@7", C: "~@4 x ~@2 x ~@2 x ~ x ~ x!2", D: "~@4 x ~@2 x!2 ~ x!6",
})).gain(0.59)

// drums · clap
const clap = s("cp").struct("<~@102 A@3 B A@3 C ~ A ~ A ~ D A B E F E G ~@23 H ~ D ~@24 I J>".pickRestart({
  A: "~@3 x", B: "~@5 x!2 ~", C: "~@10 x ~ x ~ x!2", D: "~@10 x!3 ~@3", E: "~@2 x!2 ~ x ~@6 x ~@3",
  F: "~@2 x!2 ~@2 x ~ x ~@2 x!2 ~ x!2", G: "~@2 x ~@3 x ~@3 x!2 ~ x!2 ~", H: "~@10 x!2 ~ x ~@2", I: "~ x ~ x",
  J: "~@4 x ~@5 x!3 ~@3",
})).gain(0.52)

// drums · pedal hat
const pedal_hat = s("hh").struct("<[x!8]!32 [~ x ~@2]!16 [x!8]!16 ~@4 [x!4]!4 [x!8]!22 [x!4]!78 ~@2>").gain(0.66)

// drums · open hat
const open_hat = s("oh").struct("<~@32 A@16 ~@46 B@31 ~ B@17 C B C B C B@24 ~@2>".pickRestart({
  A: "~ x ~@6", B: "~ x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~@2",
})).gain(0.52)

// drums · crash
const crash = s("cr").struct(`<
  ~@94 A ~@27 A ~@3 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~ A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.52)

// drums · cowbell
const cowbell = s("cb").struct("<~@32 A B C B D B A E A B C B D B A E ~@46 F@49 G F G F G F@24 ~@2>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x!2 ~ x!2 ~@3", C: "x ~ x!3 ~@3", D: "x ~@2 x!2 ~ x ~", E: "x ~ x ~@2 x ~@2 x ~@7",
  F: "~ x ~ x ~@2 x ~@2 x ~ x ~@2 x ~", G: "~ x ~ x ~@2 x ~@2 x ~ x ~@4",
})).gain(0.52)

// drums · shaker
const shaker = s("sh").struct("<~@94 A@49 B A B A B A@24 ~@2>".pickRestart({
  A: "x!16", B: "x!13 ~@3",
})).gain(0.52)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct("<[~@8 x!8]!50 ~@38 [~@8 x!8]!38 ~@48>").gain(0.76)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct("<[~@2 x!6 ~@8]!50 ~@38 [~@2 x!6 ~@8]!38 ~@48>").gain(0.76)

stack(
  bass, string_ensemble_1, alto_sax, electric_guitar_clean, kick, rim, snare, clap, pedal_hat, open_hat, crash, cowbell,
  shaker, woodblocks, woodblocks_2
)