Strudelify

Boogie Fever

The Sylvers

KeyF majorTempo132 bpm
0:00/0:00
// Boogie Fever — The Sylvers
// 132 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(132/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("<~@11 A B ~@7 C@8 ~@8 C@8 D ~@15 C@8 D ~@7 D ~@6 E F ~@7 D ~@7 D ~@7 D ~@6 G H>".pickRestart({
  A: "[e2,f2,g2] [a2,b2] [c3,d3,e3,f3] [g3,a3,b3,c4] [d4,e4,f4,g4,a4] [b4,c5,d5,e5,f5] [g5,a5,b5,c6] [d6,e6,f6,g6,a6] [b6,c7,d7,e7,f7] ~ [a6,b6,c7,d7,e7] [b5,c6,d6,e6,f6,g6] [d5,e5,f5,g5,a5] [e4,f4,g4,a4,b4,c5] [g3,a3,b3,c4,d4] [b2,c3,d3,e3,f3]", // Em Asus2 Dm7 Cmaj7 Dm Bdim Cmaj7 Dm …
  B: "[f2,g2]@3 ~@13, a2 ~@15", // Fsus2
  C: "[[f3,a3,c4,f4,a4,c5]@13 ~ [f3,bb3,d4,f4,c5,eb5]@10 [f3,bb3,d4,f4,c5,eb5] ~ [f3,bb3,d4,f4,bb4,d5]@4 [f3,a3,f4,a4,c5]@16 [f3,bb3,d4,f4,c5,eb5]@10 [f3,bb3,d4,f4,c5,eb5] ~ [f3,bb3,d4,f4,bb4,d5]@3 ~ [f3,a3,c4,f4,a4,c5]@15 ~ [f3,bb3,d4,f4,c5,eb5]@10 [f3,bb3,d4,f4,c5,eb5] ~ [f3,bb3,d4,f4,bb4,d5]@3 ~ [f3,bb3,d4,f4,bb4,d5]@33 ~, ~@15 c4@7 ~@42]/8", // F Bb F Bb F Bb
  D: "f2@3 ~@13", E: "~@12 [a6,b6,c7,d7,e7,f7] [b5,c6,d6,e6,f6,g6] [b4,c5,d5,e5,f5,g5,a5] [c4,d4,e4,f4,g4,a4]",
  F: "[e3,f3,g3,a3,b3] [c3,d3] ~@14", // Em Csus2
  G: "~@11 [e7,f7] [a6,b6,c7,d7] [a5,b5,c6,d6,e6,f6,g6] [a4,b4,c5,d5,e5,f5,g5] [a3,b3,c4,d4,e4,f4,g4]", // Fmaj7 D7 Am7
  H: "[c3,d3,e3,f3,g3] ~@3 [f4,c5,f5]@2 ~@10, [f4,c5,f5] ~@7", // C F5
})).s("gm_piano").gain(0.5)

// bass · synth bass 2
const bass = note(`<
  ~@4 A B C D C B E D A B C D C B E D F@5 G H I A B C D C B E D F@5 G H I A B C D C B E J K@2 L M N O P I F@5 G H I A B
  C D C B E D A B C D C B E J K@2 L M N O P I A B C D C B E D A B C D C B E D A B C D C B E D Q
>`.pickRestart({
  A: "f1@3 ~ f1@2 ~@4 c2@2 f2@2 eb2@2", B: "~@2 eb2 ~ eb2@2 c2@2 eb2 ~ eb2 ~ eb2@2 f2@2", C: "f1 ~ f1 ~@2 c2 f2 eb2",
  D: "~ c2 eb2 f2 ab2 g2 f2 eb2", E: "f1@2 ~@2 f1@2 ~@4 c2@2 f2 ~ eb2@2", F: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~",
  G: "f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ f1 ~ bb1@2", H: "~@2 bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~ bb1 ~",
  I: "~@2 c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", J: "~ c2 eb2 f2 ab2 g2 f2 gb1",
  K: "g1@2 ~@2 g1@2 ~@2 g1 ~ g1@2 ~@2 f1@2", L: "g1@2 ~@2 g1 ~@3 g1 ~ g1 ~@3 f1@2",
  M: "g1 ~ g1 ~ g1 ~ g1 ~ bb1@2 g1@2 c2@2 bb1@2", N: "g1@2 ~@2 g1@2 ~@2 g1 ~ g1 ~@3 f1@2",
  O: "g1 ~@3 g1@2 ~@2 g1 ~ g1@2 ~@2 f1@2", P: "g1@2 ~@2 g1 ~@3 g1 ~ g1@2 ~@2 c2@2", Q: "f2 ~ f1 ~@5",
})).s("gm_synth_bass_2").gain(0.71)

// other · electric guitar clean
const electric_guitar_clean = note(`<
  ~@8 A B C@2 A B C@2 A B C@2 ~@24 A B C@2 A B D@2 E F G H I J@3 K ~@7 A B C@2 A B C@2 A B C@2 A B D@2 E F G H I J@3 L B
  C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 M
>`.pickRestart({
  A: "f2@5 ~@2 g2 a2@2 c3@2 f3 ~ eb3@2, ~@3 f2 ~@4", B: "~@2 eb3 ~ eb3@2 c3@2 eb3 ~ eb3 ~ eb3@2 f3@2",
  C: "[f2@5 ~ f2@2 a2@2 c3@2 f3 ~ eb3@4 c3@2 eb3@2 f3@2 ab3@2 g3@2 f3@2 eb3@2]/2",
  D: "[f2@5 ~ f2@2 a2@2 c3@2 f3 ~ eb3@4 c3@2 eb3@2 f3@2 ab3@2 g3@2 f3@2 f3@2]/2", E: "c5@13 bb4@2 ~",
  F: "f4 g4 bb4 f4 g4 bb4 f4 g4 bb4 f4 g4 bb4 f4 g4 bb4 [f4,g4]", G: "c5@12 ~@3 d5, bb4 ~@15",
  H: "f5@14 d5 [c5,d5], e5 ~@15", I: "c5 d5@15",
  J: "[g4 bb4 c5 g4 [bb4,c5]@2 g4 [bb4,c5]@2 ~ bb4 c5@2 ~ bb4 ~ bb5@9 a5 ab5 a5 [ab5,a5] g5 ~ gb5 ~@6 c5 ~ c5@6 [bb4,b4,c5] bb4, ~@9 g4@2 ~@2 g4@2 c5@2 ~@13 f5@2 ~@16, ~@31 g5@13 ~@4]/3", // Bbsus2 Amaj7
  K: "f4@3 ~@5", L: "[f2,f4]@6 ~ g2 a2@2 c3@2 f3 ~ eb3@2, ~@3 f2 ~@4", M: "f2 ~ f2 ~@5",
})).s("gm_electric_guitar_clean").gain(0.5)

// other · brass section
const brass_section = note(`<
  ~@13 A ~ B ~ C ~ D E ~@4 F@2 G ~ A ~ B ~ C ~ D H@8 ~ A ~ B ~ C ~ I J K@2 L K@2 M N H@8 ~ A ~ B ~ C ~ D O P Q B R S T I
  J K@2 L K@2 M N ~ A ~ B ~ C ~ D E A ~ B R U T D V W Q B Q X Q D Y
>`.pickRestart({
  A: "~@2 eb4 ~ eb4@2 c4@2 eb4 ~@2 c4 eb4@2 f4 ~", B: "~ c5 eb5 f5 ab5 g5 f5 eb5, ~@8 gb5 ~@7",
  C: "~@2 eb4 ~ eb4@2 c4@2 eb4 ~ c4 ~ eb4@2 f4 ~", D: "~ c5 eb5 f5 ab5 g5 f5 eb5", E: "f5 ~@7",
  F: "[~@14 bb2@16 c3 ~]/2", G: "~@2 [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~",
  H: "[f5@11 ~ f5 ~ eb5@9 ~ eb5 ~ d5@2 ~@2 c5@13 ~ c5 ~ eb5@9 ~ eb5 ~ d5@2 ~@2 c5@13 ~ c5 ~ eb5@9 ~ eb5 ~ eb5@2 ~@2 bb2@16 ~@4 [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5] ~, ~@47 d5@9 ~@8, ~@55 c3@9]/8", // C
  I: "~ c5 eb5 f5 ab5 g5 f5 gb5", J: "g5@2 ~@2 g3@2 ~@2 g3 ~ g3 ~@3 f3@2", K: "g3 ~@3 g3 ~@3 g3 ~ g3 ~@3 f3@2",
  L: "g3 ~ g3 ~ g3 ~ g3 ~ bb3@2 g3 ~ c4@2 bb3@2", M: "g3 ~@3 g3 ~@3 g3 ~ g3 ~@3 c4@2",
  N: "~@2 [c4,c5] ~ [c4,c5] ~ [c4,c5] ~ [c4,c5,c6] ~ [c4,c5,c6] ~ [c4,c5,c6]!3 ~", O: "f5@2 ~@3 f5@2 ~@9",
  P: "~@2 [eb4,eb5] ~ [eb4,eb5]@2 d4@2 d5@2 ~ c4 [eb4,bb4]@2 [f4,c5] ~, ~@6 d5 ~ d4 ~ c5@2 ~@4", Q: "~ f5@3",
  R: "~@2 f5 ~@5", S: "~@2 [eb4,eb5] ~ [eb4,eb5]@2 c4@2 eb4 ~ eb5@2 eb4@2 [f4,f5] ~, ~@10 c4 ~@5", T: "~@4 f5@11 ~",
  U: "~@2 [eb4,eb5] ~ eb4@2 c4@2 eb4 ~ [c4,eb5] ~ [eb4,eb5]@2 f5@2, ~@6 eb5 ~@7 f4 ~", V: "f5 ~ f5@6",
  W: "~@2 [eb4,eb5] ~ eb4@2 c4@2 eb4 ~ eb5 c4 [eb4,eb5]@2 [f4,f5] ~, ~@6 eb5 ~@9", // Eb F
  X: "~@2 [eb4,eb5] ~ eb4@2 c4@2 eb4 ~ [c4,eb5] ~ [eb4,eb5]@2 [f4,f5] ~, ~@6 eb5 ~@9", // Eb Cm Eb F
  Y: "[f4,f5] ~ [f3,f4,f5] ~@5, f3 ~@15", // F
})).s("gm_brass_section").gain(0.5)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~@12 A B A ~ A B A ~ C D@2 E D@2 ~@2 A B A ~ A B A ~ C D@2 E D@2 ~@2 A B A ~ A B A ~ F@2 G F@4 ~ C D@2 E D@2 ~@2 A B A
  ~ A B A ~ A B A ~ A B A ~ F@2 G F@4 ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ A B A ~ H
>`.pickRestart({
  A: "~@4 [bb4,c5,f5]@2 ~@6 [bb4,c5,f5] ~@3", B: "~@4 [bb4,c5,f5] ~@11", C: "~@4 [f4,bb4,c5] ~@7 [f4,bb4,c5,f5] ~@3",
  D: "~@4 [f4,bb4,c5,f5] ~@7 [f4,bb4,c5,f5] ~@3", E: "~@4 [f4,bb4,c5,f5] g5 ~@6 [f4,bb4,c5,f5] ~@3",
  F: "~@4 [g4,d5,g5] ~@7 [g4,d5,g5] ~@3", G: "~@4 [g4,d5,g5] ~@7 [g3,g4,d5,g5] ~@3", H: "[f4,c5,f5] ~ [f4,c5,f5] ~@5",
})).s("gm_acoustic_guitar_nylon").gain(0.45)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~@8 A ~ B ~@2 C@2 D@2 C@2 E ~@6 F@2 ~ C@2 D@2 C@4 ~@5 F@2 ~ C@2 D@2 C@2 E ~@14 F@2 ~ C@2 D@2 C@2 E ~ C@2 D@2 C@2 E ~@9
  C@2 D@2 C@2 E ~ C@2 D@2 C@2 E ~ C@2 D@2 C@2 E ~
>`.pickRestart({
  A: "db4 ~@3", B: "db4@5 ~@11", C: "[~@12 [f4,c5,f5]@11 ~@9]/2", D: "[~@12 [f4,c5,f5]@11 ~@9, ~@12 g5 ~@19]/2",
  E: "~@3 [f4,c5,f5]", F: "[~@7 [c5,g5,c6]@9]/2",
})).s("gm_acoustic_guitar_steel").gain(0.5)

// drums · kick
const kick = s("bd").struct("<[x ~ x ~ x!3 ~]!116 [x!2 ~@2]>").gain(0.6)

// drums · snare
const snare = s("sd").struct(`<
  ~@12 A@7 B A@7 C A@7 B A@7 C A@7 B A@7 D A@7 C A@7 B A@7 B A@7 E A@7 D A@7 D A@7 D ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x ~ x ~ x!2 ~@2", C: "~ x!6 ~", D: "~@4 x ~@7 x!2 ~@2",
  E: "~@2 x ~ x ~ x ~ x ~ x ~ x!3 ~",
})).gain(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@27 A ~@15 A ~@15 B ~@7 A ~@31 B ~@7 B ~@7 C ~>".pickRestart({
  A: "~@13 x!2 ~", B: "~ x!5 ~@2", C: "~ x!5 ~ x",
})).gain(0.6)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@4 A ~@4 A ~@2 B C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D B
  C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D B C@2 D C@3 D ~
>`.pickRestart({
  A: "x", B: "~@2 x ~ x!2 ~ x", C: "x!7 ~", D: "x!8",
})).gain(0.6)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@19 A ~@7 B ~@7 A ~@7 B ~@7 A ~@7 C ~@7 B ~@7 A ~@7 A ~@15 C ~@7 C ~@7 D ~
>`.pickRestart({
  A: "~@15 x", B: "~@13 x ~@2", C: "~@2 x ~ x ~ x ~ x ~ x ~@3 x!2", D: "~@2 x ~ x ~ x ~ x ~ x ~ x!4",
})).gain(0.6)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@3 A ~@4 A ~@3 B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B
  A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~ B A@2 ~ A@3 ~@2
>`.pickRestart({
  A: "~@7 x", B: "~@3 x",
})).gain(0.6)

// drums · high tom
const high_tom = s("ht").struct("<~@19 A ~@15 A ~@15 A ~@23 A ~@7 A ~@31 B ~>".pickRestart({
  A: "~@7 x", B: "~@5 x ~@2",
})).gain(0.6)

// drums · crash
const crash = s("cr").struct(`<
  A ~@11 A ~@6 B ~@5 B ~ C ~@13 B ~ C A ~@6 B ~@13 B ~ C A ~@6 B A ~@6 B ~@8 A ~@6 B A ~@6 B A ~@6 B D
>`.pickRestart({
  A: "x", B: "~@7 x", C: "~@13 x ~@2", D: "~ x ~@2",
})).gain(0.6)

// drums · cowbell
const cowbell = s("cb").struct("<A B@19 ~@8 B@8 ~@8 B@16 ~@8 B@48 ~>".pickRestart({
  A: "~@3 x!2 ~@2 x", B: "x ~@2 x!2 ~@2 x",
})).gain(0.6)

// drums · shaker
const shaker = s("sh").struct("<[x!8]!116 ~>").gain(0.6)

stack(
  piano, bass, electric_guitar_clean, brass_section, acoustic_guitar_nylon, acoustic_guitar_steel, kick, snare, low_tom,
  pedal_hat, mid_tom, open_hat, high_tom, crash, cowbell, shaker
)