Strudelify

Take My Love

Good Shape

KeyB minorTempo132 bpm
0:00/0:00
// Take My Love — Good Shape
// 132 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 132 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/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 2 · "SYN BASS 2"
const bass = note(`<
  ~@22 A B C A@2 B C A@2 B C A ~ A B C A@2 B C A@2 B C A@2 B C A@2 B C A@2 B C A ~ A B C A@2 B C A@2 B C A@2 B C A@2 B C
  A@2 B C A ~@4 A B C A@2 B C A@2 B C A ~@8 A B C A@2 B C ~ A B C A@2 B C A@2 B C A@2 B C A
>`.pickRestart({
  A: "b1@2 ~ b1 ~@2 b1@2 ~ b1 ~@2 b1 ~ b1 ~", B: "f#1@2 ~ f#1 ~@2 f#1@3 f#1 ~@2 f#1 ~ f#1 ~",
  C: "a1@3 a1 ~@2 a1@2 ~ a1 ~@2 a1 ~ a1 ~",
})).s("gm_synth_bass_2").gain(0.45)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note("<~ A B C D A B C D A B C D A B C E@2 ~@82 A B C D A B C D ~@24>".pickRestart({
  A: "[b3,d4,f#4]", B: "[f#3,a3,c#4]", C: "[a3,c#4,e4]", D: "[f#3,b3,d4]@15 ~", E: "[[f#3,b3,d4]@15 ~]/2",
})).s("gm_synth_strings_2").gain(0.15)

// bass · lead 2 sawtooth · "SAW WAVE"
const bass_2 = note("<~@5 A B C D ~@91 A B C D A B C D ~@24>".pickRestart({
  A: "b1@2 b1!2 ~ b1 b1@2 b1@2 b1@2 b1@2 b1@2", B: "f#1@2 f#1!2 ~ f#1 f#1@2 f#1@2 f#1@2 f#1@2 f#1@2",
  C: "a1@2 a1!2 ~ a1 a1@2 a1@2 a1@2 a1@2 a1@2", D: "b1@2 b1!2 ~ b1 b1@2 b1@2 b1@2 b1@2 b1 ~",
})).s("gm_lead_2_sawtooth").gain(0.06).pan(0.6)

// other · piano · "A.PIANO 1"
const piano = note(`<
  ~@9 A B C A@2 B C A D E F G E@2 F G E@2 F G E@2 F G E ~@9 A B C A@2 B C A E F G E@2 F G E ~@9 A B C A@2 B C A@2 B C
  A@2 B C A E F G E@2 F G E@2 F G E@2 F G E ~@4 A B C A ~@8 A B C A@2 B C A@2 B C A@2 B C ~
>`.pickRestart({
  A: "b1 b2 b1 b2 b1 b2 b1 b2", B: "f#1 f#2 f#1 f#2 f#1 f#2 f#1 f#2", C: "a1 a2 a1 a2 a1 a2 a1 a2", D: "b1 ~@7",
  E: "b2 b3 b2@2 b3@2 b2 b3@2 b2 b3@2 f#4@2 b3@2", F: "f#2 c#4 f#2@2 c#4@2 f#2 c#4@2 f#2 c#4@2 a4@2 c#4@2",
  G: "a2 a3 a2@2 a3@2 a2 a3@2 a2 a3@2 c#4@2 a3@2",
})).s("gm_piano").gain(0.07)

// other · piano · "A.PIANO 1"
const piano_2 = note(`<
  ~@13 A B C A D E F G E@2 F G E@2 F G E@2 F G E ~@8 D A B C A@2 B C H E F G E@2 F G E ~@8 D A B C A@2 B C H A B C A@2 B
  C A E F G E@2 F G E@2 F G E@2 F G I ~@4 A B C J ~@8 A B C A@2 B C J A B C A@2 B C K
>`.pickRestart({
  A: "b3 b4 b3 b4 b3 b4 b3 b4", B: "f#3 f#4 f#3 f#4 f#3 f#4 f#3 f#4", C: "a3 a4 a3 a4 a3 a4 a3 a4",
  D: "~@6 [c1,d1,e1,f#1,e4,f4,g4,a4,b4] [f1,g1,a3,b3,c4,d4] [a1,b1,c2,d2,e3,f3,g3] [e2,f2,g2,d3] [a2,b2,c3] [g2,a2,c3,d3,e3] [e2,f2,f3,g3] [b1,c2,d2,a3,b3,c4] [g1,a1,d4,e4,f4] [g4,a4]", // Cmaj7 Dm7 Am7 Em7 Am Am7 Em Bm7 …
  E: "b2 b3 b2@2 b3@2 b2 b3@2 b2 b3@2 f#4@2 b3@2", F: "f#2 c#4 f#2@2 c#4@2 f#2 c#4@2 f#2 c#4@2 a4@2 c#4@2",
  G: "a2 a3 a2@2 a3@2 a2 a3@2 a2 a3@2 c#4@2 a3@2",
  H: "b3@2 b4@2 b3@2 [c1,d1,e1,f#1,e4,f4,g4,a4] [f1,g1,a3,b3,c4,d4] [a1,b1,c2,d2,e3,f3,g3] [e2,f2,g2,d3] [a2,b2,c3] [g2,a2,c3,d3,e3] [e2,f2,f3,g3,b3] [b1,c2,d2,a3,b3,c4] [g1,a1,d4,e4,f4] [g4,a4], ~@3 b4 b3 b4 ~ b4", // D7 Dm7 Am7 Em7 Am Am7 Em Bm7 …
  I: "b2 b3 b2@2 b3@2 [c1,d1,e1,f#1,b2,e4,f4,g4,a4] [f1,g1,a3,b3,c4,d4] [a1,b1,c2,d2,e3,f3,g3] [e2,f2,g2,b2,d3] [a2,b2,c3] [g2,a2,c3,d3,e3] [e2,f2,f3,g3] [b1,c2,d2,a3,b3,c4] [g1,a1,d4,e4,f4] [g4,a4], ~@5 b3 f#4 b3", // Cmaj7 Dm7 Am7 Em7 Am Am7 Em Bm7 …
  J: "b3@2 b4@2 b3@2 [c1,d1,e1,f#1,e4,f4,g4,a4] [f1,g1,a3,b3,c4,d4] [a1,b1,c2,d2,e3,f3,g3] [e2,f2,g2,d3] [a2,b2,c3] [g2,a2,d3,e3] [d2,e2,f2,f3,g3,a3,b3] [b1,c2,b3,c4] [g1,a1,d4,e4,f4] [g4,a4], ~@3 b4 b3 b4 ~ b4", // D7 Dm7 Am7 Em7 Am Gsus2 Em7 Cmaj7 …
  K: "b3@2 b4@2 b3@2 [c1,d1,e1,f#1,e4,f4,g4,a4] [f1,g1,a3,b3,c4,d4] [a1,b1,c2,d2,e3,f3,g3] [e2,f2,g2,d3] [a2,b2,c3] [g2,a2,d3,e3] [d2,e2,f2,f3,g3,a3,b3] [b1,c2,b3,c4] [g1,a1,d4,e4,f4] ~, ~@3 b4 b3 b4 ~ b4", // D7 Dm7 Am7 Em7 Am Gsus2 Em7 Cmaj7 …
})).s("gm_piano").gain(0.3)

// chords · piano · "A.PIANO 1"
const piano_3 = note(`<
  ~@16 A@2 ~@20 B ~@2 A@2 ~@7 A@2 ~@11 B ~@2 A@2 ~@7 A@2 ~@6 B ~@14 A@2 ~@6 A@2 ~@24
>`.pickRestart({
  A: "[[d4,f#4,b4]@31 ~]/2", B: "[d4,f#4,b4]",
})).s("gm_piano").gain(0.07)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@18 A B C A@2 B C A@2 B C A@2 B C A ~@50 A B C A@2 B C A@2 B C A@2 B C A ~@32
>`.pickRestart({
  A: "b3 b4 b3@2 b4@2 b3 b4@2 b3 b4@2 f#5@2 b4@2", B: "f#3 c#5 f#3@2 c#5@2 f#3 c#5@2 f#3 c#5@2 a5@2 c#5@2",
  C: "a3 a4 a3@2 a4@2 a3 a4@2 a3 a4@2 c#5@2 a4@2",
})).s("gm_string_ensemble_1").gain(0.1)

// drums · kick
const kick = s("bd").struct("<~@17 A ~@8 B@8 ~ B@24 ~ B@24 ~@8 B@8 ~@8 B@7 ~ B@16>".pickRestart({
  A: "~@2 x!2 ~@4", B: "x!4",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct("<~@26 A@8 ~ A@24 ~ A@24 ~@8 A@8 ~@8 A@7 ~ A@16>".pickRestart({
  A: "~ x ~ x",
})).gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@17 A ~@16 B ~@24 B ~@55 B ~@16>".pickRestart({
  A: "~@2 x!2 ~@4", B: "x",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@22 A@12 ~ B@16 A@8 ~ B@24 ~@4 A@12 ~@8 B@7 ~ B@16>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@35
  [~ x ~ x ~ x ~ x]!16
  ~@9
  [~ x ~ x ~ x ~ x]!24
  ~@24
  [~ x ~ x ~ x ~ x]!7
  ~
  [~ x ~ x ~ x ~ x]!16
>`).gain(0.3)

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

// drums · crash · soft notes
const crash_soft = s("cr").struct(`<
  A ~@7 A ~@8 A ~@7 A ~@4 B ~@3 A B ~@3 B ~@2 A B ~@3 B ~@7 B ~@3 C B ~@3 B ~@2 A B ~@3 B ~@3 B ~@3 B ~@10 A ~@4 B ~@2 A
  ~@7 A B ~@3 B ~@2 A B ~@3 B ~@3 B ~@3 B ~@3
>`.pickRestart({
  A: "~@7 x ~ x ~@6", B: "~ x ~@2", C: "~@4 x ~@2 x ~ x ~@6",
})).gain(0.2)

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

// drums · shaker
const shaker = s("sh").struct(`<
  ~@26 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 ~@8 A@3 B A@3 B ~@8 A@3 B
  A@3 ~ A@3 B A@3 B A@3 B A@3 B
>`.pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x!3 ~ x ~ x ~",
})).gain(0.35)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct(`<
  ~@26 A B@2 C A B@2 C ~ A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C ~ A B@2 C A B@2 C A B@2 C A B@2 C A B@2 C A B@2
  C ~@8 A B@2 C A B@2 C ~@8 A B@2 C A B@2 ~ A B@2 C A B@2 C A B@2 C A B@2 D
>`.pickRestart({
  A: "~ x ~ x ~ x ~ x ~ x ~ x!2 ~@2 x", B: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", C: "~ x ~ x ~ x ~ x ~@3 x ~ x ~ x",
  D: "~ x ~ x ~ x ~ x ~@3 x ~ x ~@2",
})).gain(0.2)

stack(
  bass, synth_strings_2, bass_2, piano, piano_2, piano_3, string_ensemble_1, kick, snare, low_tom, hihat, open_hat,
  crash, crash_soft, tambourine, shaker, shaker_soft
)