Strudelify

Funk #49

Joe Walsh

KeyA majorTempo91 bpm
0:00/0:00
// Funk #49 — Joe Walsh
// 91 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 1 "Guitar" overdriven guitar (copy of ch 4 distortion guitar); ch 9 brass section (copy of ch 7 brass section)
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Guitar.
setcpm(91/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass pick · "Bass"
const bass = note(`<
  ~@3 A B C B D E F G H G H I J I K L M E N O P G H G H I J I K L Q ~@17 R B S E T B D G H G H I J I K L M E N O P B C B
  D E F B C B D E F ~
>`.pickRestart({
  A: "~@12 a2 g2 e2@2", B: "a1@2 ~ a1 c#2 e2 ~ e2 g2 a2 ~ e2 a2 g2 e2 ~",
  C: "d2 ~@2 d2!2 e2 g2 e2 a2 g2@2 e2@2 d2 c2 ~", D: "d2 ~@2 d2!2 f#2 a2 e2 d3 c3@2 a2@2 g2 e2@2",
  E: "a2 g2 e2 a1@2 ~@3 a1 e2 a2!2 ~@2 e2 d#2", F: "d2@3 e2 g2 a2@2 c3 d3 c3@2 a2@3 g2@2",
  G: "a2 g2 e2 d2 ~ c2 ~ g1 a1@2 ~@2 a1@3 ~", H: "a2 g2 e2 d2 ~ c2 ~ g1 a1@2 ~@6",
  I: "b2 a2 f#2 e2 ~ d2 ~ a1 b1@2 ~@2 b1@3 ~", J: "b2 a2 f#2 e2 ~ d2 ~ a1 b1@2 ~@6",
  K: "b2 a2 f#2 e2 ~ d2 ~ a1 b1@2 e2@5 ~", L: "a1 a2 e2 a2@3 ~ d2 a1@3 ~ d2 e2 a2 e2",
  M: "d2@3 ~ g2 a2 ~@2 d3 c3@2 a2@2 e2 g2@2", N: "d2@3 e2 g2 a2@2 g2 e2 g2@2 e2@3 d2@2",
  O: "a1@2 ~ a1 c#2 e2 ~ e2 g2 a2 ~ e2 a2 g2 e2 d#2", P: "d2@3 d2!2 e2 g2 e2 d3 c3@2 a2@2 g2@3",
  Q: "d2@3 ~ g2 a2 ~@2 d3 c3@2 a2@2 ~ a2@2", R: "~@8 [a1,a2]!5 a2 f#2 e2",
  S: "d2 ~@2 d2!2 e2 g2 e2 d3 c3@2 a2@2 g2 e2@2", T: "d2@3 e2 g2 a2@2 c3 a2 g2@2 e2@3 d2@2",
})).s("gm_electric_bass_pick").gain(0.8).pan(0.4)

// chords · distortion guitar
const distortion_guitar = note(`<
  A B C D E D F G F D H I H J K L K M F D F G F G H I H J K L K M F D ~@14 N O P Q E D F G F D H I H J K L K M F D F G F
  G E D F G F D E D F G F D ~
>`.pickRestart({
  A: "d4@6 f4 ~ e4@4 c4@3 ~", B: "e4!2 ~ e4 e4@2 e4!2 ~ e4 e4@2 d4 [a3,c4] c4 [g3,a3]",
  C: "b3 c#4@2 ~ [a2,a3]!2 [d3,g3,d4]@2 ~ c#4 ~@5 g4, [e2,a2,a3]@3 ~@5 [a2,e3,a3,b3]@2 ~@4 [a2,e3,a3,f#4]@2", // A G5 A5 Asus2 F#m7
  D: "[d3,a3,d4,f#4]@4 ~@2 [d4,f#4]@2 ~ c#4 ~@2 a2@4, ~@5 [d3,a3,d4]@2 ~ [a2,e3,a3,b3]@2 ~@6", // D D5 Asus2
  E: "~ c#4 ~@4 [g3,d4] ~@2 c#4 ~ a2@3 ~ g4, [a2,e3,a3,b3]@2 ~@3 [a2,e3,a3]@2 ~ [a2,e3,a3,b3]@2 ~@4 [a2,e3,a3,f#4]@2", // G5 Asus2 A5 Asus2 F#m7
  F: "~ c#4 ~@4 [g3,d4] ~@2 c#4 ~@5 g4, [a2,e3,a3,b3]@2 ~@3 [a2,e3,a3]@2 ~ [a2,e3,a3,b3]@2 ~@4 [a2,e3,a3,f#4]@2", // G5 Asus2 A5 Asus2 F#m7
  G: "[d3,a3,d4,f#4]@5 ~ [d4,f#4]@2 ~ c#4 ~@2 a2@4, ~@5 [d3,a3,d4]@2 ~ [a2,e3,a3,b3]@2 ~@6", // D D5 Asus2
  H: "a3 g3 e3 d3 ~ c3 ~ g2 a2@2 ~@2 [e2,a2,a3]@3 ~", I: "a3 g3 e3 d3 ~ c3 ~ g2 a2@5 ~@3",
  J: "a3 g3 e3 d3 ~ c3@2 g2 a2@5 ~@3", K: "b3 a3 f#3 e3 ~ d3 ~ a2 b2@2 ~@2 [b1,f#2,b2,f#3]@3 ~",
  L: "b3 a3 f#3 e3 ~ d3 ~ a2 b2@6 ~@2", M: "b3 a3 f#3 e3 ~ d3@2 a2 b2@2 [b2,e3,g#3,b3,d4,g#4]@4 ~@2",
  N: "[a1,a2]@2 [a3,a4] ~ [a4,a5] ~ [a1,a2] ~ [a3,c4,c5]@4 a3@3 ~, ~@8 [a2,e3] ~@7", // A Am A5
  O: "g5 e5@3 c5 a4@2 [a1,a2,e3] [a2,d3,a3,d4]@2 [a2,e3,a3,c4]@6", // A5 D5 Am
  P: "[g2,a2]@2 [a1,a2]!2 ~ [a1,a2] ~ [a1,a2] [a1,a2,a3]!2 [d3,g3,d4]@2 ~ c#4 [a1,a2]!2, ~@6 [a2,e3,a3,b3] ~", // Gsus2 A G5 A Asus2
  Q: "[d3,a3,d4,f#4]@3 ~ a2 ~ [d4,f#4]@2 ~ c#4 ~@6, ~@5 [d3,a3,d4]@2 ~ [a2,e3,a3,b3]@2 ~@6", // D D5 Asus2
})).s("gm_distortion_guitar").gain(0.8).pan(0.4)

// chords · distortion guitar · "Guitar"
const distortion_guitar_2 = note("<[~@7 f4 ~@8] ~@84>").s("gm_distortion_guitar").gain(0.8).pan(0.7)

// other · brass section
const brass_section = note("<~@7 A ~ A ~@11 A ~ A ~@31 B ~ B ~@27>".pickRestart({
  A: "[a4,a5] ~ [a4,a5] ~ [a4,a5]@2 [f#4,f#5] ~ [b4,b5]@3 [e4,e5] [f#4,f#5]@2 ~@2, ~@8 [a4,a5] ~@7", // A F# B E F# A
  B: "[f#4,f#5] ~ [a4,a5] ~ [a4,a5]@2 [f#4,f#5] ~ [b4,b5]@3 [e4,e5] [f#4,f#5]@2 ~@2, ~@8 [a4,a5] ~@7", // F# A F# B E F# A
})).s("gm_brass_section").gain(0.8).pan(0.6)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A B@2 C B C B D E D E F E D G B@2 C B C B D H D I F E D G B@2 J K J K J K J K J K J K J L ~@4 B@2 C B C B D E D E
  F E D G B@2 C B C B J K J K J K J K J K J K ~
>`.pickRestart({
  A: "~@9 x ~ x ~ x ~@2", B: "x ~@2 x ~@4 x ~@2 x ~@3 x", C: "x ~@2 x ~@4 x ~@2 x ~ x ~ x",
  D: "~ x ~ x ~ x ~ x ~ x ~ x!3 ~ x", E: "~ x ~ x ~ x ~ x!2 ~@2 x ~@3 x", F: "x!2 ~ x ~ x ~ x ~ x ~ x!3 ~ x",
  G: "~ x ~ x ~ x ~ x!2 ~ x ~@3 x ~", H: "~ x ~ x ~ x ~ x!3 ~ x ~@3 x", I: "~ x ~ x ~ x ~ x!2 ~@2 x ~ x ~ x",
  J: "x ~@2 x ~@3 x ~ x ~ x ~@4", K: "x ~@2 x ~@3 x ~ x ~ x ~@3 x", L: "x ~@2 x ~@3 x ~@8",
})).gain(0.8).pan(0.6)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@34 A B C D A B C D C E C F A G ~@24 C F C F C F C F C F C F ~>".pickRestart({
  A: "~@5 x ~ x ~@8", B: "~ x ~@9 x ~@4", C: "~@5 x ~ x ~@7 x", D: "~ x ~ x ~@7 x ~@4", E: "x!2 ~@9 x ~@4",
  F: "x!2 ~ x ~@7 x ~@4", G: "x!2 ~ x ~@12",
})).gain(0.32).pan(0.6)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@4 A ~@5 B C ~ D ~ E ~ F A ~@5 B C G D H E G F A I A J A K A J A K A J A K A L ~@4 A ~@5 B C ~ D ~ E ~ F A ~@5 A K A
  K A K A K A K A K ~
>`.pickRestart({
  A: "~@7 x", B: "~ x", C: "~@10 x!2 ~@2 x!2", D: "~@10 x!2 ~ x ~@2", E: "~@10 x ~@2 x ~ x", F: "~@2 x!2 ~@4 x ~@7",
  G: "~@11 x ~@4", H: "~@10 x!2 ~@4", I: "~@15 x", J: "~@11 x ~@2 x ~", K: "~@3 x ~@7 x ~@2 x ~", L: "~@3 x ~@12",
})).gain(0.8).pan(0.6)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@4 A B ~@4 C D ~ E ~ E ~ F A B ~@4 C D G E@3 G F A B A H A H A H A H A H A H A ~@5 A B ~@4 C D ~ E ~ E ~ I A B ~@4 A
  H A H A H A H A H A H ~
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@7 x", C: "~@11 x ~@4", D: "~@9 x ~@3 x ~@2", E: "~@9 x ~@6", F: "~ x ~@14", G: "~@9 x!2 ~@5",
  H: "~@10 x ~@2 x ~@2", I: "~ x ~@5 x ~@8",
})).gain(0.8).pan(0.6)

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

// drums · high tom
const high_tom = s("ht").struct("<~@5 A ~@4 B ~@8 A ~@4 B ~ C ~@6 A ~@19 A ~@4 B ~@6 D ~ A ~@17>".pickRestart({
  A: "~@13 x ~@2", B: "~@9 x!2 ~@5", C: "~@9 x ~@6", D: "~@7 x ~@8",
})).gain(0.64).pan(0.6)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A B A ~ A ~ C ~ C ~ D ~ C E A B A ~ A ~ C ~ C ~ D ~ C E A B A@13 F ~@4 A B A ~ A ~ C ~ C ~ D ~ C E A B A ~ A ~
  A@12 ~
>`.pickRestart({
  A: "x", B: "x!2", C: "~@3 x", D: "x ~@2 x", E: "~@5 x ~@2", F: "x!3 ~",
})).gain(0.8).pan(0.6)

// drums · ride bell
const ride_bell = s("rd").struct("<~@34 A ~ A ~ A ~ A ~ A ~ B@3 C ~@24 B@12 ~>".pickRestart({
  A: "~@2 x!2", B: "x!8", C: "x!4 ~@4",
})).gain(0.8).pan(0.6)

// drums · tambourine
const tambourine = s("tb").struct("<~@38 [x!8]!9 [x!5 ~@3] ~@24 [x!8]!12 ~>").gain(0.8).pan(0.6)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@34
  [x ~@2 x!2 ~@3 x ~@2 x!2 ~@3]!13
  [x ~@2 x!2 ~@3 x!8]
  ~@24
  [x ~@2 x!2 ~@3 x ~@2 x!2 ~@3]!12
  ~
>`).gain(0.8).pan(0.6)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@41 x!7 ~@24 x!12 ~>").gain(9.4).pan(0.6)

// drums · bongos
const bongos = s("bongo:4").struct("<~@4 A ~@13 A ~@13 A ~ B@13 C ~@4 A ~@13 A ~@5 B@12 ~>".pickRestart({
  A: "x", B: "x ~@2 x!2 ~@3 x ~@2 x!2 ~@3", C: "x ~@2 x!2 ~@11",
})).gain(2.1).pan(0.6)

// drums · congas
const congas = s("conga:18").struct("<~@40 A@4 B C D E ~@24 B C B C B C B C B C B C ~>".pickRestart({
  A: "~@4 x ~@4 x ~@2 x ~@3", B: "~@2 x ~@2 x ~@3 x!2 ~ x ~@3", C: "~@4 x!2 ~@3 x!2 ~ x!4",
  D: "~@4 x ~@4 x ~@2 x!2 ~@2", E: "~@4 x!2 ~@10",
})).gain(2.3).pan(0.6)

// drums · congas
const congas_2 = s("conga:33").struct("<~@40 A B C A D E F G ~@24 D E D E D E D E D E D E ~>".pickRestart({
  A: "x ~ x!2 ~@2 x!2 ~@3 x ~@2 x!2", B: "x ~ x!2 ~@2 x!2 ~@3 x ~@4", C: "x ~ x!2 ~@3 x ~@3 x ~@4",
  D: "x!2 ~ x!2 ~ x!3 ~@2 x ~@4", E: "x!4 ~@3 x ~@3 x ~@4", F: "x ~ x!2 ~@2 x!3 ~@2 x ~@2 x!2", G: "x!4 ~@2 x!2 ~@8",
})).gain(2.3).pan(0.6)

// drums · congas · soft notes
const congas_soft = s("conga:33").struct("<~@40 A B C A B C A ~@25 B C B C B C B C B C B C ~>".pickRestart({
  A: "~@5 x ~@4 x ~@5", B: "~@7 x", C: "~@3 x ~@4",
})).gain(1.28).pan(0.6)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~@38 A B C@2 A B C@3 D ~@24 C@12 ~>".pickRestart({
  A: "x ~ x!4 ~ x!2 ~ x ~ x ~ x!2", B: "x ~ x!7 ~ x ~ x ~ x!2", C: "x ~ x ~ x!9 ~ x!2", D: "x ~ x ~ x!5 ~@7",
})).gain(4.08).pan(0.6)

// drums · shaker
const shaker = s("sh").struct("<~@34 [x!8]!4 ~@47>").gain(0.8).pan(0.6)

stack(
  bass, distortion_guitar, distortion_guitar_2, brass_section, kick, snare, snare_soft, low_tom, hihat, mid_tom,
  open_hat, high_tom, crash, ride_bell, tambourine, cowbell, vibraslap, bongos, congas, congas_2, congas_soft,
  agogo_bells, shaker
)

More by Joe Walsh