Strudelify
Play That Funky Music cover art

1976 · Wild Cherry

Play That Funky Music

Wild Cherry

KeyE majorTempo108 bpm
0:00/0:00
// Play That Funky Music — Wild Cherry
// 108 bpm, 4/4, key E major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 8 "CLEAN GTR" electric guitar clean (copy of ch 3 "+FUNK GTR" electric guitar muted)
// note: Full arrangement: all 136 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 · brass section · "BRASS 1"
const brass_section = note(`<
  ~@11 A B ~@2 A B ~@2 A B ~@2 C ~@15 D E ~@2 A B ~@2 A B ~@2 A B ~@2 C ~@27 A B ~@2 A B ~@2 A B ~@2 C ~@13 F G ~@25
>`.pickRestart({
  A: "~@12 [e4,a4,c#5] ~ [d#4,g#4,c5] ~", B: "[d4,g4,b4]!2 ~@14", C: "~@4 [e4,e5,e6] ~ [d4,d5,d6] ~ [e4,e5,e6] ~@7",
  D: "~@14 d5 [d#5,d#6], ~@7 d6", E: "[e5,e6] ~@15", F: "~@7 [d3,d4,d5,d6]", G: "[e3,e4,e5,e6] ~@15",
})).s("gm_brass_section").gain(0.64)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@4 A@20 B ~@2 C D@5 E F G A@20 B ~@2 C D@4 H I F G A@28 B ~@2 C D@4 H I F G A@4 J ~@6 K L@15 M
>`.pickRestart({
  A: "e1@2 ~@4 d2 ~ e2 ~@2 e1 a1 b1 d2 e2", B: "e1 ~@7", C: "~@5 e1 f1 f#1", D: "g1@2 ~@4 g2 ~ g2 ~@2 g1 c2 d2 f2 g2",
  E: "a#1@2 ~@4 a#2 ~ a#2@4 ~@4", F: "c3@3 ~ d3@2 b2@2 d3@4 b2@2 a2@2", G: "b2@4 a2@2 b2 ~ a2@2 g2@2 e2@2 d2@2",
  H: "g1@2 ~@4 g2 ~ g2 ~@3 g#1@2 a1@2", I: "a#1@4 ~@2 a#2 ~ a#2@4 ~@4", J: "g1 ~@7", K: "~@4 g1 g2 g#1 g#2",
  L: "a1@2 ~@4 a2 ~ a2 ~@2 a1 d2 e2 g2 a2", M: "a1@2 ~@4 a2 ~ a2 ~@2 a1 d2 e2 g2 ~",
})).s("gm_electric_bass_finger").gain(0.52)

// other · electric guitar muted · "+FUNK GTR"
const electric_guitar_muted = note(`<
  A@24 B@4 C@5 D ~ E A@20 B@4 C@5 D ~ E A@4 F G F G F G F G A@16 B@4 C@5 D ~ E A@4 C@8 H@16
>`.pickRestart({
  A: "e2 ~ e2 ~ e3 ~ d3 ~ e3 ~ a2 b2 ~ d3 e3 ~", B: "d3 ~ d3 e3 ~ e3!2 ~ d3 ~ d3 e3 ~ e3!2 ~",
  C: "g2 ~ g2 ~ g3 ~ f3 ~ g3 ~ c3 d3 ~ f3 g3 ~", D: "a#2 ~ a#2 ~ a#3 ~ g#3 ~ d#3 f3@7", E: "~@14 d3 ~",
  F: "e2 ~ e2 ~ e3 ~ d3 ~ e3 ~@3 a2 b2 d3 e3", G: "e2 ~@3 d3 ~ c#3 ~ d3 ~ a2 b2 ~ d3 e3 ~",
  H: "a2 ~ a2 ~ a3 ~ g3 ~ a3 ~ d3 e3 ~ g3 a3 ~",
})).s("gm_electric_guitar_muted").gain(0.64).pan(0.3)

// chords · electric guitar clean · "+CHORUS GT"
const electric_guitar_clean = note(`<
  ~@3 A B@5 C B C B C B C B C B C B C B C D E F G H@4 I@2 J K B@5 C B C B C B C B C B C B C B C D E F G H@4 I@2 J K B@5
  C B C B C B C B C B C B C B C B C B C B C B C D E F G H@4 I@2 J K B C B L M N O N O N O P Q@16
>`.pickRestart({
  A: "~@10 [d4,f#4] [e4,g#4,c#5] ~ [e4,g#4] [d#4,g4,c5] ~", // D C#m E Cm
  B: "[d4,f#4,b4]!2 d3!2 [d4,f#4,b4] ~ [c#4,f4,a#4] ~ [d4,f#4,b4] ~ [d4,f#4] [e4,g#4,c#5] ~ [e4,g#4] [d#4,g4,c5] ~", // Bm A#m Bm D C#m E Cm
  C: "[d4,f#4,b4]!2 d3!2 [d4,f#4,b4] ~ [c#4,f4,a#4] ~ [d4,f#4,b4] ~ [d4,f#4] [d4,e4,g4,g#4,c5,c#5]@2 [e4,g#4,c#5] [d#4,g4,c5] ~", // Bm A#m Bm D C#m Cm
  D: "[d4,f#4,b4] ~ [d4,f#4,b4]!2 ~ [d4,f#4] [d4,f#4,b4]!2 ~@2 [d4,f#4,b4]!2 ~ [d4,f#4] [d4,f#4,b4]!2", // Bm D Bm D Bm
  E: "~ [d4,f#4] [d4,f#4,b4]!2 ~@2 [d4,f#4,b4]!2 ~ [d4,f#4] [d4,f#4,b4]!2 ~ [d4,f#4] [d4,f#4,b4]!2", // D Bm D Bm D Bm
  F: "~@2 [d4,f#4,b4]!2 ~ [d4,f#4] [d4,f#4,b4]!2 ~ [d4,f#4] [d4,f#4,b4]!2 ~@2 [d4,f#4,b4]!2", // Bm D Bm D Bm
  G: "~ [d4,f#4] [d4,f#4,b4]!2 ~ [d4,f#4] [d4,f#4,b4]!2 ~@2 [d4,f#4,b4] ~ [d#4,g4,c5] ~ [e4,g#4,c#5] ~", // D Bm D Bm Cm C#m
  H: "[f4,a4,d5]!2 [f4,a4] [f4,a4,d5] ~@2 [a4,d5] [f4,a4,d5] ~ [f4,a4,d5] ~ [f4,a4] [g4,b4,e5] [g4,b4] [f#4,a#4,d#5] ~", // Dm F Dm D5 Dm F Em G …
  I: "[[f4,a4,d5]!2 [f4,a4] [f4,a4,d5] ~@2 [a4,d5] [f4,a4,d5] ~ [f4,a4,d5] ~ [f4,a4] [g4,b4,e5] [g4,b4] [f#4,a#4,d#5] ~ [c4,f4]@6 ~ f3@3 ~@2 [c4,f4]@2 [g3,b3,e4] [b3,e4], ~@15 g#3@6 ~ [g#3,c4,f4]@4 g#3@4 ~@2, ~@13 [c4,f4] ~@2, ~@27 f3@2 ~@3]/2", // Dm F Dm D5 Dm F Em G …
  J: "[c3,g3,b3,e4]@7 [e3,a3,d4]", K: "[b2,e3,a3,d4,g4]@15 ~",
  L: "[d4,f#4,b4]!2 d3!2 [d4,f#4,b4] ~ [c#4,f4,a#4] ~ [d4,f#4,b4] ~ [d4,f#4,b4] ~ [d#4,g4,c5] ~ [e4,g#4,c#5] ~", // Bm A#m Bm Cm C#m
  M: "[f4,a4,d5]!2 [f4,a4] [f4,a4,d5] ~@2 [a4,d5] [f4,a4,d5] ~ [f4,a4,d5] ~ [f4,a4] [f4,a4,d5] ~@3", // Dm F Dm D5 Dm F Dm
  N: "[f4,a4,d5]!2 ~ [f4,a4,d5]!2 ~ [f4,a4,d5]!2 ~ [f4,a4,d5] ~ [f4,a4] [f4,a4,d5] [g4,b4,e5] [g4,b4] ~", // Dm F Dm Em G
  O: "[f4,a4,d5]!2 ~ [f4,a4,d5]!2 ~ [f4,a4,d5]!2 ~ [f4,a4,d5] ~ [f4,a4] [f4,a4,d5] ~@3", // Dm F Dm
  P: "[f4,a4,d5]!2 ~ [f4,a4,d5]!2 ~ [f4,a4,d5]!2 ~ [f4,a4,d5] ~ [f4,a4] [f#4,a#4,d#5]!2 [f#4,a#4] [f#4,a#4,d#5]", // Dm F D#m F# D#m
  Q: "[g4,b4,e5]!2 [g4,b4] [g4,b4,e5] ~@2 [b4,e5] [g4,b4,e5] ~ [g4,b4,e5] ~ [g4,b4] [a4,c#5,f#5] [a4,c#5] [g#4,c5,f5] ~", // Em G Em E5 Em G F#m A …
})).s("gm_electric_guitar_clean").gain(0.36).pan(0.7)

// bass · baritone sax · "BARITONSAX"
const bass_2 = note(`<
  ~@11 A ~@3 A ~@3 A ~@15 B C B C ~@4 A ~@3 A ~@3 A ~@15 B C B C ~ D ~@10 A ~@3 A ~@3 A ~@3 A ~@11 B C B C ~@25
>`.pickRestart({
  A: "~@4 e2 ~ d2 ~ e2 ~@7", B: "~@7 d2", C: "e2 ~@15", D: "~@4 e2 ~@11",
})).s("gm_baritone_sax").gain(0.72)

// other · overdriven guitar · "OVERDIVE"
const overdriven_guitar = note("<~@71 A B@4 C D E F G ~@55>".pickRestart({
  A: "~@10 d4 e4 g4 a4 g4@2",
  B: "[d5@12 b4@2 a5@14 e5 d5 e5 d5@7 d5 b4 d5@4 e5 d5 e5 d5@5 g5@2 d5@3 ~ d5@2 g5@2 d5 g5, ~@57 g5@2 ~@5]/4",
  C: "d6@2 d5 b4 a#4 a4 g4 e4!2 [d4,g4,b4]@3 e4 g4!3", D: "d5@4 b4@2 g5@6 e5 d5 e5 ~",
  E: "a#5@3 ~ a5@4 g5@3 ~ e5 g5 e5@2", F: "d5 e5 g5 d5 e5 g5 d5 e5 g5 a5@3 g5 e5@3", G: "~ [b4,c5,d5] ~@14",
})).s("gm_overdriven_guitar").gain(0.56)

// other · overdriven guitar · "OVERDIVE" · soft notes · Fmaj7 Csus2
const overdriven_guitar_soft = note("<~@80 [~@2 [e4,f4,g4,a4] [c4,d4] ~@12] ~@55>").s("gm_overdriven_guitar").gain(0.32)

// other · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note("<~@34 A B ~@30 A B ~@38 A B ~@28>".pickRestart({
  A: "e3@2 d3 b2 d3@2 b2 a2", B: "b2@2 a2 b2 a2 g2 e2 ~",
})).s("gm_electric_guitar_jazz").gain(0.42).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A@3 B A@16 C@3 D A@6 E F A@3 B A@16 C@3 D A@6 E F A@3 D A@23 D C@3 D A@6 E F A@3 D C@3 G C@3 H A@7 D A@7 D
>`.pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~@2 x ~@4", C: "x!2 ~ x!3 ~ x", D: "x", E: "x!4", F: "x ~ x ~ x ~@2 x",
  G: "x!2 ~ x!3 ~@2", H: "~ x ~ x ~@4",
})).gain(0.48)

// drums · snare
const snare = s("sd").struct(`<
  ~@3 A B@3 C B@3 D B@3 D B@3 D B@3 D B@3 E B D B D B D ~ F B@3 C B@3 D B@3 D B@3 D B@3 D B@3 G B D B D B@2 ~ F B@3 H B
  D B D B D B D B@3 D B@3 D B@3 D B@3 I B@3 J B D B D B D ~ F B D B K B D B L B D B M B D B D B D B E B D B D B D B E
>`.pickRestart({
  A: "~@8 x!3 ~ x!3 ~", B: "~ x ~ x", C: "~@4 x ~@2 x!8 ~", D: "~@4 x ~@6 x!3 ~@2", E: "x ~ x!13 ~", F: "~@10 x!4 ~@2",
  G: "x!15 ~", H: "~@2 x!13 ~", I: "~@4 x ~ x!10", J: "x ~ x ~ x ~ x ~ x!7 ~", K: "~@2 x!14", L: "~@4 x ~@7 x ~ x!2",
  M: "x ~@3 x ~@3 x!7 ~",
})).gain(0.64)

// drums · clap
const clap = s("cp").struct("<~@24 A@4 B@8 ~@20 A@4 B@8 ~@28 A@4 B@8 ~@4 A@24>".pickRestart({
  A: "x!4", B: "~ x ~ x",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@4 A B@2 C A B@2 D B@3 D B@3 D B@3 D E@2 F G A D B D B D H I A B@2 C A B@2 D B@3 D B@3 D B@3 D E@2 F ~ A D B D B J H
  I A B@2 ~ A D B D B D B D B@3 D B@3 D B@3 D B@3 K L@3 ~ M D J D J N H O A D B ~ P Q E@2 L R E S A D B D B D B ~ A D B
  D B D B ~
>`.pickRestart({
  A: "~ x!7", B: "x!8", C: "x!4 ~@4", D: "x!6 ~@2", E: "x!3 ~ x!3 ~", F: "x!3 ~ x!4", G: "x",
  H: "x ~@3 x ~ x!4 ~@2 x!4", I: "x!2 ~@2 x!4 ~@2 x ~@5", J: "x!5 ~ x!2", K: "x!3 ~@5", L: "x ~ x!3 ~ x!2",
  M: "~ x!4 ~ x!2", N: "x!6 ~ x", O: "x!2 ~@2 x!3 ~@3 x ~@5", P: "~@2 x!3 ~ x!2", Q: "x ~ x!4 ~@2", R: "x ~ x!3 ~ x ~",
  S: "x!2 ~ x ~@4",
})).gain(0.56)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@11 A ~@3 A ~@3 A ~@3 A B@2 C ~@2 A ~ A ~ A D E ~@7 A ~@3 A ~@3 A ~@3 A B@2 C ~@2 A ~ A ~ F D E ~@3 G ~ A ~ A ~ A ~ A
  ~@3 A ~@3 A ~@3 A ~@4 D@3 H F A F A F ~ D I ~ A ~@2 D J B C D K B ~@2 A ~ A ~ A ~ G ~ A ~ A ~ A ~ G
>`.pickRestart({
  A: "~@7 x", B: "~@3 x ~@3 x", C: "~@3 x ~@4", D: "~ x ~@3 x ~@2", E: "~ x ~@2 x ~@3", F: "~@5 x ~@2", G: "x",
  H: "x!4 ~@4", I: "~@2 x ~@4 x!2 ~@7", J: "~ x ~@5 x", K: "~ x ~@3 x ~ x",
})).gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@3 A ~@19 A ~@7 A ~@3 A ~@18 A@2 ~@7 A ~@3 A ~@7 A ~@19 A ~@7 A ~@2 A@2 ~@6 B A ~@7 A ~@7
>`.pickRestart({
  A: "x", B: "x!2 ~@2",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@72 [~ x ~ x]!8 ~@56>").gain(0.64)

// drums · cowbell
const cowbell = s("cb").struct("<~@4 A@4 ~@16 A@12 ~@20 A@12 ~@4 A@8 ~@16 A@12 ~@4 A@24>".pickRestart({
  A: "x!4",
})).gain(0.56)

stack(
  brass_section, bass, electric_guitar_muted, electric_guitar_clean, bass_2, overdriven_guitar, overdriven_guitar_soft,
  electric_guitar_jazz, kick, snare, clap, hihat, open_hat, crash, tambourine, cowbell
)