Strudelify

Disco Fans

Star Wash

KeyA minorTempo158 bpm
0:00/0:00
// Disco Fans — Star Wash
// 158 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 124 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(158/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 · synth bass 1 · "+SYNBASS 3"
const bass = note(`<
  ~@20 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 ~ A B A B A B A B ~@8 A B A B
  A B ~@10 A B A B A B A B A B A B A B A B
>`.pickRestart({
  A: "~@2 a1 ~@3 a1 ~@3 a1 ~@3 a1 ~", B: "~@2 a1 ~@3 a1 ~@3 a1!2 ~@2 a1 ~",
})).s("gm_synth_bass_1").gain(0.47)

// other · lead 1 square · "SQUAREWAVE"
const lead_1_square = note(`<
  ~@12 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C ~@40 A@2 B C A@2 B C ~@40
>`.pickRestart({
  A: "~@2 [a3,a4] ~@3 a4 ~ [a3,a4] ~@3 [a3,a4] ~@3", B: "~@2 [b3,b4] ~@3 b4 ~ [b3,b4] ~@3 [b3,b4] ~@3",
  C: "~@2 [c4,c5] ~@3 c5 ~ [d4,d5] ~@3 [d4,d5] ~@3", // C D
})).s("gm_lead_1_square").gain(0.19)

// other · lead 1 square · "SQUAREWAVE" · soft notes
const lead_1_square_soft = note(`<
  ~@12 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C ~@40 A@2 B C A@2 B C ~@40
>`.pickRestart({
  A: "~@6 a3 ~@9", B: "~@6 b3 ~@9", C: "~@6 c4 ~@9",
})).s("gm_lead_1_square").gain(0.11)

// bass · synth bass 1 · "SYN BASS 1"
const bass_2 = note(`<
  ~@12
  [a2 ~@2 a2 ~@2 a2 ~@3 a2 ~ a2 ~ a2 a3]!32
  ~@24
  [a2 ~@2 a2 ~@2 a2 ~@3 a2 ~ a2 ~ a2 a3]!7
  ~
  [a2 ~@2 a2 ~@2 a2 ~@3 a2 ~ a2 ~ a2 a3]!24
  ~@8
  [a2 ~@2 a2 ~@2 a2 ~@3 a2 ~ a2 ~ a2 a3]!16
>`).s("gm_synth_bass_1").gain(0.18).pan(0.3)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@8 A@2 B C A@2 B C A@2 B C ~@16 A@2 B C A@2 B C ~@24 A@2 B C A@2 B C A@2 B C A@2 B C ~@16 A@2 B C A@2 B C A@2 B C A@2
  B C A@2 B C A@2 B C
>`.pickRestart({
  A: "[e4 f4, [a4,c5]]/2", B: "[d4,g4,b4]", C: "[c4,f4,a4] [d4,g4,b4]",
})).s("gm_synth_strings_1").gain(0.11).pan(0.6)

// other · piano · "A.PIANO 3"
const piano = note(`<
  A B C D A B C D A B C D A B C D A B C D ~@16 A B C D A B C D ~@24 A B C D A B C ~ A B C D A B C D ~@16 A B C D A B C D
  A B C D A B C D A B C D A B C D
>`.pickRestart({
  A: "~ a5 e5 a5 a4@4", B: "~ a5 f5 a5 a4@4", C: "~ g5 d5 g5 b4@4", D: "~@2 f5@2 c5@2 f5@3 ~@7",
})).s("gm_piano").gain(0.37).pan(0.7)

// bass · synth bass 1 · "+SYNBASS 3"
const bass_3 = note("<~@44 [~@2 a2!14] [a2!16]!14 ~@25 [~@2 a2!14] [a2!16]!13 ~@26>")
  .s("gm_synth_bass_1").gain(0.28).pan(0.6)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@3 A ~@3 A ~@3 A ~@47 A ~@3 A ~@3 A ~@27 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@4
>`.pickRestart({
  A: "~@2 [f3,f4] [g3,g4]", // F G
})).s("gm_lead_2_sawtooth").gain(0.23)

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

// drums · snare
const snare = s("sd").struct("<~@13 A B@5 ~@34 A B@5 ~@10 A B@5 ~@42 A B@5 ~>".pickRestart({
  A: "~@15 x", B: "x!16",
})).gain(0.13)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@12 A B ~@38 A B ~@14 A B ~@46 A B ~@6>".pickRestart({
  A: "x!16", B: "x!15 ~",
})).gain(0.07)

// drums · clap
const clap = s("cp").struct("<~@3 A B A B C B A B C B A B C B A B ~@82 A B C B A B ~@17>".pickRestart({
  A: "~@3 x", B: "x", C: "x ~@2 x",
})).gain(0.33)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@4 A B A@3 B A@3 B A@3 B A C A B A@3 B A@3 B A@3 B A D A B A@3 B A E F ~@14 C A B A@3 B A@3 B A@3 B A C A B A@3 B A E
  F ~@15 A B A@3 B A ~ A B A@3 B A@3 B A@3 B A C
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x ~@6 x!2 ~ x ~ x ~ x ~", D: "x ~@3 x ~@2 x!2 ~ x ~ x ~ x ~",
  E: "x ~@3 x ~@2 x!2 ~ x ~ x!3 ~", F: "x",
})).gain(0.53)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@20
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]!24
  ~@16
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]!24
  ~@24
  [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]!16
>`).gain(0.33)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@8 A@11 B ~@24 A@15 ~@29 A@10 B ~@25>".pickRestart({
  A: "x!4", B: "x",
})).gain(0.13)

// drums · open hat
const open_hat = s("oh").struct("<~@8 A@11 ~ A@39 ~ A@24 ~@4 A@10 ~@10 A@16>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.47)

// drums · ride
const ride = s("rd").struct("<~@48 A@11 ~@29 B C B C B C B C B D C ~@25>".pickRestart({
  A: "x!8", B: "~@4 x ~ x ~ x ~ x ~ x ~ x!2", C: "x", D: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2",
})).gain(0.33)

// drums · china
const china = s("cr").struct("<~@19 A B ~@15 B ~@5 B C B ~@14 A B ~@7 B ~@6 A B ~@5 B C B ~@15 B ~@22 A>".pickRestart({
  A: "x ~@3 x!4", B: "x", C: "~ x ~@2 x ~ x ~",
})).gain(0.47)

// drums · shaker
const shaker = s("sh").struct("<~@20 A@24 ~@16 A@12 ~@4 A@8 ~@8 A@6 B ~@9 A@12 ~@4>".pickRestart({
  A: "x ~ x ~@3 x!3 ~ x ~@3 x!2", B: "x",
})).gain(0.27)

stack(
  bass, lead_1_square, lead_1_square_soft, bass_2, synth_strings_1, piano, bass_3, lead_2_sawtooth, kick, snare,
  snare_soft, clap, low_tom, hihat, hihat_soft, open_hat, ride, china, shaker
)