Strudelify

You Made Me the Thief of Your Heart

Capella

KeyG minorTempo120 bpm
0:00/0:00
// You Made Me the Thief of Your Heart — Capella
// 120 bpm, 4/4, key G minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 127 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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.

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@17 A B A C A B A C A B A C D@2 ~ E F G F G F G F G F G F G F G F G A B A C A B A C H B A C D@2 ~ E F G F G F G F G F
  G F G F G F G A B A C A B A C A B A C A B A C A B A C A B A C ~@12 A B A C A B A C I@2
>`.pickRestart({
  A: "g1@2 ~ g1@2 ~ f1@2 g1@2 ~ g1@2 ~ bb1@2", B: "eb1@2 ~ eb1@2 ~ f1@2 ~ f1 ~ eb1 f1@2 eb1@2",
  C: "f1@2 ~ f1@2 ~ g1@2 ~ g1 ~ g1 g1@2 f1@2", D: "g1/2", E: "~@7 f1", F: "g1@2 ~ g1@2 ~ f1 ~ g1!2 ~ g1@2 ~ f1 ~",
  G: "g1@2 ~ g1@2 ~ f1@2 c2@2 ~ c2@2 c2 f1@2", H: "g1 ~@2 g1@2 ~ f1@2 g1@2 ~ g1@2 ~ bb1@2", I: "[g1@9 ~@7]/2",
})).s("gm_synth_bass_2").gain(0.61)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@25 A B C D A B C E F G H I J K L M ~@8 A B C D A B C E ~@8 N O P@2 J K Q M ~@8 A B C D A B C E ~@28 A B C D A B C E
  ~@2
>`.pickRestart({
  A: "bb4@2 a4 ~ g4 ~ bb4@2 a4 ~ g4@2 ~@4", B: "bb4@2 a4 ~ g4 ~ bb4@2 a4@2 g4@2 ~@4",
  C: "bb4@2 a4@2 g4@2 bb4@2 a4@2 g4@3 ~@3", D: "bb4 a4 g4 f4 a4@2 g4@2", E: "bb4 a4 g4 f4 a4@2 g4 ~",
  F: "bb4@2 a4@2 g4 ~ bb4@3 ~@7", G: "~@2 f4 ~ g4 ~ f4 ~ c5@3 ~ bb4@3 ~", H: "~@2 d4@2 f4 ~ d4 ~ f4@2 ~@2 f4@2 d4 ~",
  I: "f4 ~ f4@2 g4 ~ g4@3 ~@7", J: "bb4@2 a4 ~ g4 ~ bb4@5 ~@5", K: "~@2 f4 ~ g4 ~ f4 ~ c5@4 bb4@2 ~@2",
  L: "~@2 c5@3 ~ bb4 ~ bb4@2 g4@2 ~@4", M: "f4@2 g4 ~ g4 ~ g4@3 ~@7", N: "bb4@2 a4@2 g4 ~ bb4@3 ~@5 f4 ~",
  O: "f4 ~ f4 ~ f4 ~ c5@3 ~ bb4@3 ~@3", P: "[~@2 d4@2 f4 ~ d4 ~ f4@2 ~@2 d4@2 f4@4 g4@2 ~@2 g4@3 ~@5 g4 ~]/2",
  Q: "~@2 f4@2 f4@2 d4 ~ f4@2 g4@2 ~@4",
})).s("gm_overdriven_guitar").gain(0.31)

// chords · pad halo · "HALO PAD"
const pad_halo = note(`<
  A B C D A B E@2 A B C D A B E@2 ~@41 F G F H F G F H ~@24 F G F H F G F H F G F H F G F H ~@20 I@2
>`.pickRestart({
  A: "g4", B: "eb4 f4", C: "d4", D: "c4 bb3", E: "g4/2", F: "[d4,g4]", G: "[bb3,eb4] [a3,f4]", H: "[a3,f4] [d4,g4]",
  I: "[[g2,g3]@9 ~@7]/2", // G
})).s("gm_pad_halo").gain(0.13)

// chords · pad halo · "HALO PAD" · soft notes
const pad_halo_soft = note("<A B C D A B E@2 A B C D A B E@2 ~@111>".pickRestart({
  A: "g3", B: "eb3 f3", C: "d3", D: "c3 bb2", E: "g3/2",
})).s("gm_pad_halo").gain(0.09)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@41
  [~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 c5 ~]!7
  ~@25
  [~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 c5 ~]!7
  ~@25
  [~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 ~ bb4 c5 ~]!11
  ~@11
>`).s("gm_lead_2_sawtooth").gain(0.16).pan(0.8)

// other · lead 2 sawtooth · "SAW WAVE" · soft notes
const lead_2_sawtooth_soft = note(`<
  ~@41
  [bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~@3]!7
  ~@25
  [bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~@3]!7
  ~@25
  [bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~ bb3 ~@3]!11
  ~@11
>`).s("gm_lead_2_sawtooth").gain(0.08).pan(0.8)

// other · agogo
const agogo = note("<~@4 A B ~@92 C ~@15 C ~@3 D ~@3 D ~@4>".pickRestart({
  A: "~@8 g5 a5 ~ b5 db6 eb6 ~ f6", B: "g6 a6 ~ c2@4 ~@9", C: "~@3 c2@5 ~@8", D: "~@7 c2@5 ~@4",
})).s("gm_agogo").gain(0.14).pan(0.8)

// other · synth drum
const synth_drum = note("<~@4 A ~@3 B ~@7 C ~@99 C ~@8 D ~>".pickRestart({
  A: "c2!2 ~@2 c2 ~@11", B: "c2 ~@15", C: "c2!2 ~ c2 c2@3 ~@3 c2 ~ c2@3 ~", D: "c2!2 ~ c2 c2@3 ~@9",
})).s("gm_synth_drum").gain(0.33).pan(0.2)

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

// drums · snare
const snare = s("sd").struct("<~@4 A ~@11 B C@15 ~ C@15 ~ C@15 ~ C@15 ~ C@24 ~@11 B C@7 ~ D ~>".pickRestart({
  A: "x!2 ~@2 x ~@11", B: "x!2 ~ x!2 ~@5 x ~ x ~@3", C: "~ x ~ x", D: "x!2 ~ x!2 ~@11",
})).gain(0.41)

// drums · clap
const clap = s("cp").struct("<~@105 [~ x ~ x]!11 ~@11>").gain(0.41)

// drums · hihat
const hihat = s("hh").struct("<~@8 A@8 B A@31 ~ A@31 ~ A@16 C A@18 B A@8 B ~>".pickRestart({
  A: "x!4", B: "x", C: "~ x!3",
})).gain(0.28)

// drums · open hat
const open_hat = s("oh").struct("<~@8 A@8 ~ A@31 ~ A@31 ~ A@35 ~ A@8 ~@2>".pickRestart({
  A: "~ x ~ x ~ x ~ x",
})).gain(0.28)

// drums · ride
const ride = s("rd").struct("<~@33 A@7 B A@7 ~ A@15 ~ A@7 B A@7 ~ A@16 C A@7 ~@8 A@3 ~ A@8 ~@2>".pickRestart({
  A: "x ~ x ~ x ~ x ~ x!3 ~ x ~ x ~", B: "x ~ x ~ x ~ x ~ x!2 ~ x!2 ~ x ~", C: "~@2 x ~ x ~ x ~ x!3 ~ x ~ x ~",
})).gain(0.35)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@17 A@15 B A@15 ~ A@15 ~ A@15 ~ A@35 ~ A@8 ~@2>".pickRestart({
  A: "x!16", B: "x!8 ~@8",
})).gain(0.41)

// drums · woodblocks
const woodblocks = s("woodblock:4").struct("<A@16 ~ A@31 ~ A@31 ~ A@35 ~ A@8 ~@2>".pickRestart({
  A: "~ x ~@2",
})).gain(0.5)

stack(
  bass, overdriven_guitar, pad_halo, pad_halo_soft, lead_2_sawtooth, lead_2_sawtooth_soft, agogo, synth_drum, kick,
  snare, clap, hihat, open_hat, ride, china, tambourine, woodblocks
)