Strudelify

How Can You Hear Us?

Fatboy Slim

KeyG minorTempo305 bpm
0:00/0:00
// How Can You Hear Us? — Fatboy Slim
// 305 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 11 electric guitar clean (copy of ch 9 electric guitar jazz); ch 14 lead 2 sawtooth (copy of ch 15 lead 2 sawtooth)
// note: Full arrangement: all 367 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(305/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.

// other · electric guitar clean · "loads more stuff"
const electric_guitar_clean = note(`<
  ~@45 A@4 ~@48 B@2 C D B@2 C D B@2 C D B@2 C D ~@32 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@2 E@4 ~@16 B@2 ~@2 B@2 ~@2 B@2 ~@2
  B@2 ~@2 F@2 ~@2 F@2 G H F@2 ~@2 F@2 ~@50 B@2 ~@2 B@2 ~@2 B@2 ~@6 B@2 ~@2 B@2 ~@2 B@2 ~@2 B@2 ~@2 I J@2 ~ K L M ~@3 N@6
  ~@25 O@3 ~ O@3 ~ O@3 ~ O@3 ~ O@3 ~ P@2 ~@11
>`.pickRestart({
  A: "gb2 g2!3", B: "g2!4", C: "[g2,d3] g2 [g2,eb3] [g2,d3]", D: "g2 [g2,eb3] [g2,d3] [g2,ab2]",
  E: "[gb2@2 g2 gb2@2 g2 gb2 g2]/2", F: "~@2 g2 ~", G: "~ g2 ~ eb2", H: "~@2 d2 f2", I: "g2@4 g2@4 ~ g2@4 g2@3",
  J: "[~ g2@4 g2@4 ~ g2@4 g2@4 ~@14]/2", K: "~@7 g2@5 g2@4", L: "~ g2@5 g2@5 g2@5", M: "g2@5 g2@5 g2@5 ~",
  N: "[~@3 g2@9 g2@8 g2@9 g2@9 g2@12 g2@12 g2@12 g2@12 ~@10]/6",
  O: "[~@11 g2@4 g2@4 g2@4 g2@4 g2@4 g2@4 g2@4 g2@4 ~@5]/3", P: "[~@11 g2@4 g2@4 g2@4 g2@4 ~@5]/2",
})).s("gm_electric_guitar_clean").gain(0.7).pan(0.3)

// other · electric guitar clean · "loads more stuff" · soft notes
const electric_guitar_clean_2 = note("<~@355 A@2 ~ B@3 ~ B@3 ~@2>".pickRestart({
  A: "[~@11 g2@4 g2@4 g2@4 g2@4 ~@5]/2", B: "[~@11 g2@4 g2@4 g2@4 g2@4 g2@4 g2@4 g2@4 g2@4 ~@5]/3",
})).s("gm_electric_guitar_clean").gain(0.28).pan(0.3)

// other · lead 5 charang
const lead_5_charang = note("<~@48 A ~@47 A ~@31 A ~@15 A ~@35 A ~@31 A ~@154>".pickRestart({
  A: "~@8 bb4 a4 ab4 g4 ~@4",
})).s("gm_lead_5_charang").gain(0.49)

// bass · fretless bass · "some here too"
const bass = note(`<
  ~@49 A@18 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C
  A@2 B C A@2 B C ~@16 A@2 D@2 A@2 D@2 A@2 D@2 A@2 D@2 ~@4 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B
  C E@2 A E@3 ~@2 E@2 A E@3 A E ~@32 A@18 B C A@2 B C A@2 B C ~@4 A@2 B C A@2 B C A@2 B C A@2 B C F G@2 H@2 I J@2 K@5
  L@8 ~@20 M@8 N@24 O
>`.pickRestart({
  A: "[g1,g2]!4", B: "[bb1,bb2]!4", C: "[c2,c3]!4", D: "[e1,e2]!4", E: "[g1,g2]!2 ~@2",
  F: "[g1,g2]@4 [g1,g2]@4 ~ [g1,g2]@4 [g1,g2]@3", // G
  G: "[~ [g1,g2]@4 [g1,g2]@4 ~ [g1,g2]@4 [g1,g2]@4 [bb1,bb2]@5 [bb1,bb2]@4 [bb1,bb2]@5]/2", // G Bb
  H: "[[bb1,bb2]@4 [c2,c3]@5 [c2,c3]@5 [c2,c3]@5 [c2,c3]@4 [g1,g2]@5 [g1,g2]@4]/2", // Bb C G
  I: "~ [g1,g2]@5 [g1,g2]@5 [g1,g2]@5", J: "[[g1,g2]@5 [g1,g2]@5 [g1,g2]@5 [bb1,bb2]@6 [bb1,bb2]@6 [bb1,bb2]@5]/2",
  K: "[[bb1,bb2]@6 [c2,c3]@7 [c2,c3]@7 ~ [c2,c3]@7 [c2,c3]@7 [g1,g2]@9 [g1,g2]@8 [g1,g2]@9 [g1,g2]@9 [g1,g2]@10]/5", // Bb C G
  L: "[~@2 [g1,g2]@12 [g1,g2]@12 [g1,g2]@12 ~ [bb1,bb2]@20 [bb1,bb2]@20 [bb1,bb2]@20 ~ [bb1,bb2]@20 ~@8]/8", // G Bb
  M: "[~@11 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [c2,c3]@4 [c2,c3]@4 [c2,c3]@4 [c2,c3]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [c2,c3]@4 [c2,c3]]/8", // G Bb C G Bb C
  N: "[~@3 [c2,c3]@4 [c2,c3]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [c2,c3]@4 [c2,c3]@4 [c2,c3]@4 [c2,c3]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [g1,g2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [bb1,bb2]@4 [c2,c3]@4 [c2,c3]]/8", // C G Bb C G Bb C
  O: "~@3 [c2,c3]@4 [c2,c3]@4 ~@5", // C
})).s("gm_fretless_bass").gain(0.49).pan(0.3)

// other · trombone · "and here"
const trombone = note("<~@49 [~@4 g4 ~@3]!16 ~@180 [~@4 g4 ~@3]!16 ~@106>").s("gm_trombone").gain(0.49)

// other · piano
const piano = note("<~@49 [d4 ~@5 d4!2]!16 ~@180 [d4 ~@5 d4!2]!16 ~@106>").s("gm_piano").gain(0.27).pan(0.3)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@57 A@6 B@2 ~@64 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@20 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2
  ~@14 B@2 ~@154
>`.pickRestart({
  A: "g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~", B: "g2@3 ~ g2@3 ~ a2@3 ~ a2@3 ~",
})).s("gm_distortion_guitar").gain(0.8)

// other · electric guitar jazz
const electric_guitar_jazz = note(`<
  ~@181 A B A B A B A B A B A B A B A B ~@64 A B A B A B A B A B A B ~@61 C@8 D@8 E@6 ~@11
>`.pickRestart({
  A: "d4 c4 g4@2", B: "d4 c4 d4 g4",
  C: "[~@11 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4]/8",
  D: "[~@3 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4]/8",
  E: "[~@3 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 ~@5]/6",
})).s("gm_electric_guitar_jazz").gain(0.49).pan(0.3)

// other · electric guitar jazz · soft notes
const electric_guitar_jazz_2 = note("<~@355 A@8 B@4>".pickRestart({
  A: "[~@11 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4]/8",
  B: "[~@3 g4@8 d4@4 c4@4 d4@4 g4@4 d4@4 c4@4 g4@8 d4@4 c4@4 d4@4 g4@4 ~@5]/4",
})).s("gm_electric_guitar_jazz").gain(0.15).pan(0.3)

// chords · distortion guitar
const distortion_guitar_2 = note("<~@197 A@2 ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@156>".pickRestart({
  A: "~@3 [c4,d4]", // Csus2
})).s("gm_distortion_guitar").gain(0.39).pan(0.9)

// other · electric guitar clean
const electric_guitar_clean_3 = note("<~@272 [g2!16]!3 [bb2!16] [f2!16] ~@90>")
  .s("gm_electric_guitar_clean").gain(0.24).pan(0.3)

// other · lead 2 sawtooth
const lead_2_sawtooth = note("<~@314 A@3 B C D@2 E F@2 G@8 ~ H@2 ~@32>".pickRestart({
  A: "[~@7 e1@4 f1@4 gb1@4 g1@3 ab1@4 a1@4 bb1@4 b1@4 c2@3 db2@4 d2@3]/3", B: "~ e2@4 f2@4 gb2@3 g2@4",
  C: "a2 bb2 b2 c3", D: "[d3@3 eb3@4 e3@4 f3@4 g3@4 ab3@5 a3@8]/2", E: "bb3", F: "[~@5 b3@27]/2", G: "[~@7 c4@121]/8",
  H: "[~@4 ab-1@19 ~@9]/2",
})).s("gm_lead_2_sawtooth").gain(0.8).pan(0)

// other · lead 2 sawtooth · soft notes
const lead_2_sawtooth_soft = note("<~@313 A@2 ~@52>".pickRestart({
  A: "[~@8 c1@4 db1@3 d1@4 eb1@4 ~@9]/2",
})).s("gm_lead_2_sawtooth").gain(0.48).pan(0)

// drums · kick
const kick = s("bd").struct(`<
  ~@9 A B A B A B A B A@44 C@4 A@78 ~@2 A@16 ~@4 A@32 ~@16 A D A D A D A D A D A D A D A D A D A D A D A D A D A D A D A
  D ~@8 A@20 ~@4 A@16 E F G H I J K ~ L M N O P ~ Q R ~@3 S T ~@20 U V@31 R
>`.pickRestart({
  A: "x ~@2 x", B: "x", C: "x!4", D: "~ x ~ x", E: "x ~@12 x ~@2", F: "~ x ~@12 x ~", G: "~ x ~@6", H: "x!2 ~@2",
  I: "~@3 x ~@3 x ~@8", J: "~@6 x ~@4 x ~@4", K: "~@10 x ~@4 x", L: "x ~@2 x ~@4", M: "~@3 x", N: "~@3 x ~@12",
  O: "~@13 x ~@2", P: "~@3 x ~@4", Q: "~@5 x ~@2", R: "~@7 x ~@8", S: "~ x ~@2", T: "~ x", U: "~@11 x ~@4",
  V: "~@7 x ~@3 x ~@4",
})).gain(0.49)

// drums · snare
const snare = s("sd").struct("<~@16 A ~@40 B@4 C@2 D@2 ~@142 B E ~@4 F@32 ~@8 B@8 ~@106>".pickRestart({
  A: "~@8 x!8", B: "x ~ x!3 ~ x!2", C: "x!4", D: "x!8", E: "x ~ x!2 ~@4", F: "~ x",
})).gain(0.49)

// drums · clap
const clap = s("cp").struct(`<
  ~@17 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@16 A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@2 A
  B A B A B A B A B A B A B A B ~@4 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@64 A B A B A B A B
  A B A B ~@4 A B A B A B A B A B A B A B A B C D E F G H I E J K ~ L M N O ~@2 P ~ Q R ~@21 S T S T S T S T S T S T S T
  S T S T S T S T S T S T S T S T S T
>`.pickRestart({
  A: "~@2 x!2", B: "x!2 ~ x", C: "~@9 x ~@3 x ~@2", D: "~ x ~@3 x ~@8 x ~", E: "~@11 x ~@4", F: "x ~@3 x ~@4 x ~@6",
  G: "~@3 x ~@12", H: "~ x ~@4 x ~@4 x ~@4", I: "x ~@4 x ~@2", J: "x ~@5 x ~@6 x ~@2", K: "~@3 x", L: "~@4 x ~@8 x ~@2",
  M: "~@3 x ~@4", N: "~ x ~@6", O: "~@5 x ~@2", P: "~@15 x", Q: "~ x ~@2", R: "~ x", S: "~@3 x ~@3 x ~@3 x ~@3 x",
  T: "~@7 x ~@8",
})).gain(0.49)

// drums · low tom
const low_tom = s("lt").struct("<~@64 [~@4 x!4] ~@195 [~@3 x] ~@106>").gain(0.49)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@11 B C D@2
  E@2 ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~ F ~@16 A ~ A ~ A ~ A ~ A ~ A ~@4 E A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ G ~ H ~ I ~@3 J ~@4 H ~@25 K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~ K ~@2
>`.pickRestart({
  A: "x", B: "x ~ x!3 ~ x!2", C: "x ~ x!2 ~@4", D: "x!2 ~@2", E: "x!4", F: "~@3 x", G: "~ x ~@6", H: "~@7 x ~@8",
  I: "~@15 x", J: "~@3 x ~@12", K: "~@11 x ~@4",
})).gain(0.49)

// drums · mid tom
const mid_tom = s("mt").struct("<~@63 A B ~@79 C ~@19 C ~@47 C ~@47 C ~@15 C ~@90>".pickRestart({
  A: "~@4 x!4", B: "x!4 ~@4", C: "x!8",
})).gain(0.49)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@48 A ~@19 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@11 A ~@7 A ~@7 A ~@7 A ~@64 B@2 C@2
  ~@7 A ~@15 A ~@3 A ~@3 A ~@9 D ~@39 E ~@7 E ~@7 E ~@7 E
>`.pickRestart({
  A: "~@9 x ~@6", B: "x!2", C: "x!4", D: "~@3 x ~@4", E: "~ x ~@2",
})).gain(0.49)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@15 B ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ C
  ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 C ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~@4 D ~@2 E ~@4 D
  ~@2 C ~@47 C ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ F ~ G ~ H ~@3 I ~@4 G ~@25 J ~ J ~ J ~ J
  ~ J ~ J ~ J ~ J ~ J ~ J ~ J ~ J ~ J ~ J ~ J ~ J ~@2
>`.pickRestart({
  A: "x", B: "x!4 ~@4", C: "~@4 x!4", D: "~@8 x!8", E: "~@4 x!4 ~@8", F: "~ x ~@6", G: "~@7 x ~@8", H: "~@15 x",
  I: "~@3 x ~@12", J: "~@11 x ~@4",
})).gain(0.49)

// drums · crash
const crash = s("cr").struct(`<
  ~@9 A B A B A B A B C B A B A B A B A B A B A B A B C B A B A B A B A B A B A B A B D ~@15 A B A B A B A B E B A B A B
  A B A B A B A B A B E B A B A B A B C B A B A B A B A B A B A B A B A B A B A B A B E B A B A B A B E B A B A B A B E
  B A B A B ~@2 A B A B A B A B E B A B A B A B ~@4 A B A B A B A B E B A B A B A B A B A B A B A B E B A B A B A B ~@16
  C D ~@46 C F ~@2 E D ~@2 C F ~@5 G C F ~@14 H I ~@39 J K ~@2 L M ~@2 J K ~@2 L M ~@2 J K ~@2 L M ~@2 J K ~@2 L M ~@3
>`.pickRestart({
  A: "~@2 x!2", B: "x!2 ~ x", C: "x ~ x!2", D: "x", E: "x!4", F: "x!2 ~@2", G: "~@4 x!4", H: "x ~@8 x ~@3 x ~@2",
  I: "~ x ~@3 x ~@10", J: "~@11 x ~@4", K: "~@3 x ~@3 x ~@3 x ~@3 x", L: "~@11 x ~@3 x", M: "~@3 x ~@3 x ~@3 x ~@4",
})).gain(0.34)

// drums · tambourine
const tambourine = s("tb").struct("<~@49 A@16 ~@132 B@2 A B@3 C D ~@4 B@2 A@2 ~@32 A@16 ~@106>".pickRestart({
  A: "x!4", B: "x!2 ~@2", C: "x ~@2 x", D: "~ x!2 ~",
})).gain(0.49)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@205 [x!2 ~@2]!2 ~@160>").gain(2.46)

// drums · shaker
const shaker = s("sh").struct(`<
  ~@213 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@122
>`.pickRestart({
  A: "~@2 x!2", B: "x!3 ~",
})).gain(0.49)
// … 7 more lines

More by Fatboy Slim