Strudelify

It's a Love Thing

CB Milton

KeyE minorTempo138 bpm
0:00/0:00
// It's a Love Thing — CB Milton
// 138 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 137 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(138/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.

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  A B C D A B C D A B C D A B C D ~@24 A B C D A B C D ~@24 A B C D A B C D E@2 F G E@2 F G ~@8 A B C D A B C D ~@16 E@2
  F G E@2 F G ~@9
>`.pickRestart({
  A: "[b3,e4,g4] ~ [b3,e4,g4] ~ [b3,e4,f#4] [b3,e4,g4] ~ [b3,e4,a4]", // Em Bsus4 Em Esus4
  B: "~@2 [b3,e4,g4]@2 ~@2 b3 ~ [b3,e4,f#4]@3 ~ [b3,e4,g4]@3 ~", // Em Bsus4 Em
  C: "[a3,d4,f#4] ~ [a3,d4,f#4] ~ [a3,d4,e4] [a3,d4] ~ [a3,c4,e4]", // D Asus4 D5 Am
  D: "~@2 [a3,c4,e4]@2 ~@2 a3 ~ [a3,c4,e4]@3 ~ [a3,d4,f#4]@3 ~", // Am D
  E: "[e4,g4,b4]@2 ~ [e4,g4,a4] ~@2 [e4,g4,b4]@2 ~ [e4,g4,c5]@2 ~ [e4,g4,b4] ~ [e4,g4,a4] ~", // Em A7 Em C Em A7
  F: "[d4,f#4,a4]@2 ~ [d4,f#4,g4] ~@2 [d4,f#4,a4]@2 ~@2 d4 ~ [d4,f#4,a4] ~ [d4,f#4] ~, ~@9 [f#4,b4]@2 ~@5", // D Gmaj7 D B5
  G: "[a3,c4,e4,g4]@2 ~ [a3,c4,e4,f#4] ~@2 [a3,c4,e4,g4]@2 ~ [a3,c4,e4,f#4]@2 ~ [a3,c4,e4,g4]@2 ~@2", // Am7 F#m7b5 Am7 F#m7b5 Am7
})).s("gm_lead_2_sawtooth").gain(0.48)

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@8 A B C D A B C E A B C D A B C E A B C D A B C E A F C D A F C E ~@4 A B C E A B C D A B C E A B C D A B C E A F C
  D A F C E ~@8 A B C D A B C E A F C D A F C E ~@8 A F C D A F C E A F C D A F C E A B C D A B C E ~@9
>`.pickRestart({
  A: "e2@2 ~@2 e2@2 ~@2 e2 ~ e2@2 ~@2 d2@2", B: "e2 ~ e2@2 ~@2 e2@2 ~@2 e2@2 g2@2 e2@2",
  C: "d2@2 ~@2 d2@2 ~@2 d2 ~ d2@2 ~@2 a2@2", D: "~ a2 ~ a2 ~ a2 b2 a2", E: "~ a2 ~ a2 ~ a2 g2 a2",
  F: "g2 ~ g2@2 ~@2 g2@2 ~@2 g2@2 a2@2 g2@2",
})).s("gm_synth_bass_2").gain(0.64)

// bass · synth bass 1 · "SYN BASS 1"
const bass_2 = 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 ~@8 A B C D A B C D A B C D A B C D A B C D A B C D
  ~@8 A B C D A B C D A B C D A B C D ~@8 A B C D A B C D ~@16 A B C D A B C D ~@9
>`.pickRestart({
  A: "e3 ~ e4 ~ e3 ~ b3 ~ e3 ~ e4 ~ e3 ~ b3 ~", B: "e3 ~ e4 ~ e3 ~ b3 ~ e3 ~ e4 ~ d4 ~ b3 ~",
  C: "d3 ~ d4 ~ d3 ~ a3 ~ d3 ~ d4 ~ d3 ~ c4 ~", D: "a3 ~ a4 ~ a3 ~ a4 ~ a3 ~ a4 ~ g4 ~ d4 ~",
})).s("gm_synth_bass_1").gain(0.36).pan(0.3)

// bass · synth bass 1 · "SYN BASS 1" · soft notes
const bass_soft = note(`<
  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 ~@8 A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C
  ~@8 A@2 B C A@2 B C A@2 B C A@2 B C ~@8 A@2 B C A@2 B C ~@16 A@2 B C A@2 B C ~@9
>`.pickRestart({
  A: "~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3 ~ e3", B: "~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3 ~ d3",
  C: "~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3",
})).s("gm_synth_bass_1").gain(0.24).pan(0.3)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@8 A@2 B C A@2 B C ~@8 A@2 B C A@2 B C A D B C A D B C A@2 B C A@2 B C ~@8 A@2 B C A@2 B C A D B C A D B C A@2 B C
  A@2 B C A@2 B C A@2 B C A D B C A D B C ~@8 A D B C A D B C A D B C A D B C A@2 B C A@2 B C E F G H E F G H I
>`.pickRestart({
  A: "[b3,e4,g4]!4", B: "[a3,d4,f#4]!4", C: "[a3,c4,e4]!4", D: "[b3,d4,g4]!4", E: "e4!4", F: "g4!4", G: "d4!4",
  H: "a4!4", I: "e4",
})).s("gm_synth_strings_1").gain(0.23).pan(0.6)

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

// drums · clap
const clap = s("cp").struct("<~@8 A@32 ~@4 A@28 ~@4 A@12 ~@16 A@24 ~@9>".pickRestart({
  A: "~ x ~ x",
})).gain(0.48)

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

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@4 [x!4]!92 ~@4 [x!4]!28 ~@9>").gain(0.08)

// drums · open hat
const open_hat = s("oh").struct("<~@4 [~ x ~ x ~ x ~ x]!92 ~@4 [~ x ~ x ~ x ~ x]!28 ~@9>").gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@7 A ~@7 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@7 A ~@3 A ~@3 A ~@7 A ~@15 A ~@7 A ~@7 A ~@7 A ~@8
>`.pickRestart({
  A: "x",
})).gain(0.48)

// drums · ride
const ride = s("rd").struct("<~@128 A B A B A B A B ~>".pickRestart({
  A: "x ~ x ~ x ~ x!2", B: "x!4",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@8 A@8 ~@16 A@8 ~@4 A@4 ~@16 A@8 ~@8 A@8 ~@16 A@24 ~@9>".pickRestart({
  A: "x!16",
})).gain(0.4)

// drums · shaker
const shaker = s("sh").struct("<~@8 A@32 ~@4 A@28 ~@4 A@12 ~@16 A@24 ~@9>".pickRestart({
  A: "x!16",
})).gain(0.56)

stack(
  lead_2_sawtooth, bass, bass_2, bass_soft, synth_strings_1, kick, clap, snare, pedal_hat, open_hat, crash, ride,
  tambourine, shaker
)