Strudelify

Scatman

Scatman

KeyE♭ majorTempo136 bpm
0:00/0:00
// Scatman — Scatman
// 136 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 96 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(136/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.

// bass · electric bass finger
const bass = note(`<
  ~ A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C ~@2 A B C D A B C D A B C D A B C D
  ~@2 A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B E ~
>`.pickRestart({
  A: "db1 ~@2 db1 ~@2 db1 ~@2 db1 ~@2 db1 ~ db1 ~", B: "f1 ~@2 f1 ~@2 f1 ~@2 f1 ~@2 f1 ~ f1 ~",
  C: "eb1 ~@2 eb1 ~@2 eb1 ~@2 eb1 ~@2 eb1 ~ eb1 ~", D: "eb1 ~@2 eb1 ~@2 eb1 ~@2 eb1 ~@2 eb1 ~ f1 ~",
  E: "eb1 ~@2 eb1 ~@2 eb1 ~@2 eb1 ~@2 eb1 ~@3",
})).s("gm_electric_bass_finger").gain(0.48)

// other · synth brass 1
const synth_brass_1 = note(`<
  ~ A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@16 A@2 B@2 ~@13 A@2 B@2 ~@10 A@2 B@2 ~@16 A@2 B@2 A@2 B@2 A@2 C ~
>`.pickRestart({
  A: "c5 ~ f4 ~ ab4 f4 ~ c5 ~ f4 ~ ab4 ~ f4 ab4 ~", B: "bb4 ~ eb4 ~ g4 eb4 ~ bb4 ~ eb4 ~ g4 ~ eb4 g4 ~",
  C: "bb4 ~ eb4 ~ g4 eb4 ~ bb4 ~ eb4 ~ g4 ~ eb4 ~@2",
})).s("gm_synth_brass_1").gain(0.32).pan(0.6)

// other · lead 2 sawtooth
const lead_2_sawtooth = note("<~@9 A@2 B@2 A@2 B@2 ~@33 A@2 B@2 ~@10 A@2 B@2 ~@20 A@2 B@2 A@2 C ~>".pickRestart({
  A: "c6 ~ f5 ~ ab5 f5 ~ c6 ~ f5 ~ ab5 ~ f5 ab5 ~", B: "bb5 ~ eb5 ~ g5 eb5 ~ bb5 ~ eb5 ~ g5 ~ eb5 g5 ~",
  C: "bb5 ~ eb5 ~ g5 eb5 ~ bb5 ~ eb5 ~ g5 ~ eb5 ~@2",
})).s("gm_lead_2_sawtooth").gain(0.32)

// bass · synth bass 1
const bass_2 = note(`<
  ~ A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@3 A B C@2 A B C@2 A B C@2 A B C@4 A B
  C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B D ~
>`.pickRestart({
  A: "db1 db2 db1 db2 db1 db2 db1 db2 db1 db2 db1 db2 db1 db2 db1 db2",
  B: "f1 f2 f1 f2 f1 f2 f1 f2 f1 f2 f1 f2 f1 f2 f1 f2",
  C: "eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2",
  D: "eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2 eb1 eb2 ~@2",
})).s("gm_synth_bass_1").gain(0.23).pan(0.6)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@9 A@2 B@2 A@2 B@2 ~@25 A@2 B@2 A@2 B@2 A@2 C D ~@6 A@2 B@2 A@2 B@2 ~@8 A@2 B@2 A@2 B@2 ~@4 A@2 B@2 A@2 E@2
>`.pickRestart({
  A: "[db4 c5, [f4,ab4]]/2", B: "[eb4@3 c5, [g4,bb4]]/2", C: "[eb4,g4,bb4]", D: "~ c5", E: "[[g4,bb4], eb4@3 ~]/2",
})).s("gm_synth_strings_1").gain(0.16).pan(0.4)

// other · alto sax
const alto_sax = note("<~ A B A B A B A B ~@41 A B A B ~@10 A B A B ~@28>".pickRestart({
  A: "bb3!5 ~ bb3 ~ bb3!2 ~ bb3@2 ~@3", B: "~@6 bb3 ~ bb3!2 ~ bb3 ~@4",
})).s("gm_alto_sax").gain(0.41)

// drums · kick
const kick = s("bd").struct(`<
  ~@9 A B A C A B A C ~@4 A B A C A B A C D ~@3 A B A C A B A ~@2 A B A C A B A C A B A C A B A C ~@2 A B A C A B A C D
  ~@7 A B A C A B A C A B A C A B A C A B A ~
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x ~@3 x ~@3 x ~@3 x ~@2 x", D: "x",
})).gain(0.62)

// drums · snare
const snare = s("sd").struct("<~@8 A B@8 ~@4 B@8 ~@4 B@8 C B@7 A B@9 C B@7 A ~@7 A ~@8 B@11 ~>".pickRestart({
  A: "x!16", B: "~ x ~ x", C: "~@4 x ~@2 x ~@2 x!6",
})).gain(0.31)

// drums · clap
const clap = s("cp").struct(`<
  ~ A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A ~@2 A B A C A B A C A B A C A B A C
  ~@2 A B A C A B A C ~@16 A B A C A B A C A B A ~
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~@2 x", C: "~@4 x ~@7 x!3 ~",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~ A@39 B C A@16 B C A@35 ~>".pickRestart({
  A: "x!2 ~ x!3 ~ x!3 ~ x!3 ~ x", B: "~ x!3", C: "x!4",
})).gain(0.37)

// drums · open hat
const open_hat = s("oh").struct("<~ [~ x ~ x ~ x ~ x]!94 ~>").gain(0.37)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@9 [x!16]!59 ~@16 [x!16]!11 ~>").gain(0.31)

stack(
  bass, synth_brass_1, lead_2_sawtooth, bass_2, synth_strings_1, alto_sax, kick, snare, clap, hihat, open_hat, crash,
  tambourine
)