Strudelify

Sweets for My Sweet

C.J. Lewis

KeyB♭ majorTempo114 bpm
0:00/0:00
// Sweets for My Sweet — C.J. Lewis
// 114 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): JAZZ GTR.
setcpm(114/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 · "FINGERDBAS"
const bass = note("<~@3 A B@7 C B@23 C B@7 D ~ E ~ F B@3 A B@7 C B@7 G@2 H ~ I@2 J@2 A B@7 C B@23 D ~>".pickRestart({
  A: "~@3 bb1", B: "~@2 bb1!2 f1 ~ f1@2 g1@2 f1@2 bb1@4", C: "~@2 bb1!2 ~@8 bb1@4",
  D: "~@2 bb1!2 f1 ~ f1@2 g1@2 f1@2 ~@4", E: "~@3 f1 g1 f1 ~@2", F: "~@3 f1 g1 f1 bb1@2",
  G: "[~@2 bb1!2 f1 ~ f1@2 g1@2 f1@2 bb1@17 ~@3]/2", H: "~@2 f1@2 ab1@2 f1@2 ab1@3 ~@5", I: "[~@12 bb1@17 ~@3]/2",
  J: "[~@2 f1@2 ab1@2 f1@2 ab1@3 ~ bb1@8 ~@12]/2",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · electric guitar jazz · "JAZZ GTR"
const electric_guitar_jazz = note(`<
  A@3 ~@2 B@2 C ~ B@2 D ~ B@2 C ~ B@2 C ~ B@2 C ~ B@2 C ~ B@2 C ~ B@2 D ~ B@2 C ~ B@2 C ~@9 B@2 C ~ B@2 D ~ B@2 C ~ B@2
  C ~@9 B@2 C ~ B@2 D ~ B@2 C ~ B@2 C ~ B@2 C ~ B@2 C ~ B@2 C ~ B@2 C ~
>`.pickRestart({
  A: "[~@16 [bb3,d4,f4]@2 bb3 [bb3,d4,f4] ~@2 bb3 ~ [bb3,eb4,g4]@2 bb3 [bb3,eb4,g4] ~ eb4 bb3 ~ [c4,f4,a4]@2 c4 [c4,f4,a4] ~@2 c4 ~ [g3,bb3,eb4,g4] ~@7, ~@15 f3@8 g3@8 a3@8 ~@9, ~@21 d4@2 ~@14 f4@2 ~@9]/3", // Bb Eb F Eb
  B: "[~@3 g3@8 f3@8 g3@8 ~@5]/2", C: "~@3 g3@7 ~@6, ~@3 a3 ~@12", D: "~@3 a3 bb3@2 ~@10, ~@3 g3@7 ~@6",
})).s("gm_electric_guitar_jazz").gain(0.07).pan(0.6)

// other · lead 5 charang · "CHARANG" · G Cmaj7 C Dm7 G7 Cmaj7
const lead_5_charang = note(`<
  ~@2
  [~@9 [c1,d1,eb1,e1,f1] [g1,a1,b1] [c2,d2,e2,f2,g2,a2,b2] [c3,d3,e3,f3,g3] [a3,b3,c4,d4,e4,f4] [g4,a4,b4,c5,d5,e5,f5] [g5,a5,b5,c6]]
  ~@106
>`).s("gm_lead_5_charang").gain(0.54)

// chords · orchestra hit · "ORCH.HIT"
const orchestra_hit = note("<~@3 A ~@47 B ~@15 C ~@3 C ~@3 D ~@33>".pickRestart({
  A: "[f3,ab3,c4,f4] ~ [f3,ab3,c4,f4] ~ [f3,ab3,c4,f4] ~@11", B: "~@4 [bb3,eb4,g4] ~@2 [bb3,g4] ~@8", C: "~@12 bb3 ~@3",
  D: "~@3 c2 eb2 ~ ab2 b2 ~@2 f3 ~@5",
})).s("gm_orchestra_hit").gain(0.25)

// chords · orchestra hit · "ORCH.HIT" · soft notes · Gbmaj7
const orchestra_hit_soft = note("<~@75 [~@3 db2 d2 [f2,gb2] ~@10] ~@33>").s("gm_orchestra_hit").gain(0.1)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~@3 A@8 B@8 C@16 B@8 D ~@7 A@8 B@8 D ~@11 E@8 C@16 F@5 ~>".pickRestart({
  A: "[~@12 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@4]/8",
  B: "[~@3 bb2 ~@8 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@4]/8",
  C: "[~@3 bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@4]/8",
  D: "~@3 bb2 f2 ~ f2@5 bb2 ~@4",
  E: "[~@12 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 ~@8 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@4]/8",
  F: "[~@3 bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@4 ~ bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 bb2@6 ~ bb2 f2 ~ f2@5 bb2 ~@4]/5",
})).s("gm_electric_guitar_muted").gain(0.25)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@3 A B C B C B C B D B C B C B C B C B C B C B C B C B C B C B C B D B C B C B C B E ~@7 A B C B C B C B D B C B C B
  C B E ~@7 A B C B C B C B D B C B C B C B C B C B C B C B C B C B C B C B E ~
>`.pickRestart({
  A: "~@12 [bb3,d4,f4] ~ [f3,bb3,d4] [bb3,d4,f4]", // Bb
  B: "~ [bb3,d4,f4] [f3,bb3,d4]@2 [bb3,eb4,g4]@2 [bb3,eb4] [bb3,eb4,g4] ~ [bb3,eb4,g4] [g3,bb3,eb4] ~ [c4,f4,a4] ~ [a3,c4,f4] [c4,f4,a4]", // Bb Eb Eb5 Eb F
  C: "~ [c4,f4,a4] [a3,c4,f4]@2 [bb3,eb4,g4]@2 [bb3,eb4] [bb3,eb4,g4] ~ [bb3,eb4,g4] [g3,bb3,eb4] ~ [bb3,d4,f4] ~ [f3,bb3,d4] [bb3,d4,f4]", // F Eb Eb5 Eb Bb
  D: "~ [c4,f4,a4] [a3,c4,f4]@2 ~@8 [bb3,d4,f4] ~ [f3,bb3,d4] [bb3,d4,f4]", // F Bb
  E: "~ [c4,f4,a4] [a3,c4,f4]@2 [bb3,eb4,g4]@2 [bb3,eb4] [bb3,eb4,g4] ~ [bb3,eb4,g4] [g3,bb3,eb4] ~@5", // F Eb Eb5 Eb
})).s("gm_electric_guitar_clean").gain(0.2)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note("<~@3 A@16 B ~@7 A@16 B ~@7 A@16 B ~@11 C@8 D@5 ~@17>".pickRestart({
  A: "[~@12 [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@7 ~ [bb3,eb4,g4]@7 ~ [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@7 ~ [bb3,eb4,g4]@7 ~ [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@7 ~ [bb3,eb4,g4]@7 ~ [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@4]/8", // Bb Eb F Eb Bb Eb F Eb …
  B: "~@4 [bb3,eb4,g4]@7 ~@5", // Eb
  C: "[~@12 [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@7 ~ [bb3,eb4,g4]@7 ~ [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@7 ~@9 [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@7 ~ [bb3,eb4,g4]@7 ~ [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@4]/8", // Bb Eb F Eb Bb Eb F Bb …
  D: "[~@4 [bb3,eb4,g4]@7 ~ [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@7 ~ [bb3,eb4,g4]@7 ~ [bb3,d4,f4]@7 ~ [bb3,eb4,g4]@7 ~ [c4,f4,a4]@7 ~ [bb3,eb4,g4]@7 ~@5]/5", // Eb Bb Eb F Eb Bb Eb F …
})).s("gm_synth_strings_1").gain(0.07)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@7 A@7 B@6 ~@15 C@7 D@2 ~@15 C@7 D@2 ~@15 E@7 F@2 ~@17>".pickRestart({
  A: "[~@12 [f5,f6]@8 [g5,g6]@7 [a5,a6]@9 [g5,g6]@7 [f5,f6]@8 ~ g5@7 ~ a6@8 g6@2 ~@6 [f5,f6]@8 [g5,g6]@7 [a5,a6]@9 [g5,g6]@7 [f5,f6]@5, ~@51 g6@8 a5@8 ~ g5 ~@43]/7", // F G A G F G A G …
  B: "[~@4 g5@7 ~ a6@8 [g5,g6]@7 ~ [f5,f6]@8 [g5,g6]@7 [a5,a6]@9 [g5,g6]@7 [f5,f6]@8 ~ g5@7 ~ a6@8 [g5,g6]@7 ~@5, ~@3 g6@8 a5@8 ~@48 g6@8 a5@8 ~@13]/6", // G F G A G F G
  C: "[~@12 [f5,f6]@8 [g5,g6]@7 [a5,a6]@9 [g5,g6]@7 [f5,f6]@8 ~ g5@7 ~ a6@8 [g5,g6]@7 ~ [f5,f6]@8 [g5,g6]@7 [a5,a6]@9 [g5,g6]@7 [f5,f6]@5, ~@51 g6@8 a5@8 ~@45]/7", // F G A G F G F G …
  D: "[~@4 g5@7 ~ a6@8 [g5,g6]@7 ~@5, ~@3 g6@8 a5@8 ~@13]/2", // G
  E: "[~@12 [bb4,d5,f5,f6]@8 [bb4,eb5,g5,g6]@7 [c5,f5,a5,a6]@8 ~ [g5,g6]@7 [d5,f5,f6]@8 ~ g5@7 ~ a6@7 ~ [g5,g6]@7 ~ [f5,f6]@7 ~ [g5,g6]@7 [c5,f5,a5,a6]@8 ~ [g5,g6]@7 ~ d5@4, ~@35 [bb4,eb5]@8 bb4@16 [c5,f5,a5]@8 bb4@15 ~ [bb4,eb5]@8 ~@8 bb4@13, ~@51 [eb5,g6]@8 ~@8 eb5@8 d5@8 ~@16 eb5@8 [f5,f6]@5]/7", // Bb Eb F G Dm G F G …
  F: "[~@4 [bb4,g5]@7 ~ [c5,a6]@7 ~ [g5,g6]@7 ~@5, ~@3 [eb5,g6]@8 [f5,a5]@8 [bb4,eb5]@6 ~@7]/2", // Eb F G Eb F Eb5
})).s("gm_string_ensemble_2").gain(0.06).pan(0.6)

// other · drawbar organ · "ORGAN 1"
const drawbar_organ = note("<~@11 A ~@23 A ~@23 A ~@23 A ~@25>".pickRestart({
  A: "~@8 [c3,e3,f3] [g3,a3,b3,c4] [d4,e4,f4,g4,a4,b4] [c5,d5,e5,f5,g5,a5] ~@4", // Fmaj7 Cmaj7 Em7 Dm7
})).s("gm_drawbar_organ").gain(0.21)

// other · drawbar organ · "ORGAN 1" · soft notes
const drawbar_organ_soft = note("<~@11 A ~@23 A ~@23 A ~@23 A ~@25>".pickRestart({
  A: "~@8 d3 ~@7",
})).s("gm_drawbar_organ").gain(0.13)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~ [x!2]!2 ~ [~@3 x ~@12]!72 ~@4 [~@3 x ~@12]!28 ~>").gain(0.25)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@4 A@7 B A@23 B A@15 C A@7 B A@15 C ~@4 A@3 B A@24 ~>".pickRestart({
  A: "~@3 x ~ x ~@10", B: "~@3 x!2 ~@11", C: "~@3 x ~@12",
})).gain(0.1)

// drums · low tom
const low_tom = s("lt").struct("<~@3 [~@3 x!3 ~@2] ~@105>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<~@3 A B@7 C B@23 C B@15 C B@7 C B@15 C B@7 C B@23 D ~>".pickRestart({
  A: "~@3 x", B: "x!7 ~", C: "x!2 ~@4 x ~", D: "x!6 ~@2",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@11 A ~@23 A ~@7 A ~@15 A ~@23 A ~@25>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~ [~ x ~ x ~ x ~ x] [~ x ~ x ~@4] [~@7 x]!104 ~@2>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@35 [~ x ~@2] ~@23 [~ x ~@2] ~@23 [~ x ~@2] ~@25>").gain(0.35)

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

// drums · tambourine
const tambourine = s("tb").struct("<~@3 A B@7 C B@23 C B@15 C B@7 C B@15 D ~@3 A B@3 C B@23 E ~>".pickRestart({
  A: "~@12 x!4", B: "x!16", C: "x!4 ~@8 x!4", D: "x!4 ~@12", E: "x!12 ~@4",
})).gain(0.15)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@3 A B@7 C B@23 C B@15 C B@7 C B@15 D ~@3 A B@3 C B@23 E ~>".pickRestart({
  A: "~@15 x", B: "x!4 ~@3 x!5 ~@3 x", C: "x!4 ~@11 x", D: "x!4 ~@12", E: "x!4 ~@3 x!5 ~@4",
})).gain(0.75)

stack(
  bass, electric_guitar_jazz, lead_5_charang, orchestra_hit, orchestra_hit_soft, electric_guitar_muted,
  electric_guitar_clean, synth_strings_1, string_ensemble_2, drawbar_organ, drawbar_organ_soft, kick, kick_soft, snare,
  snare_soft, low_tom, hihat, mid_tom, open_hat, high_tom, crash, tambourine, cabasa
)