Strudelify

Love Is Magic

Loft

KeyC minorTempo120 bpm
0:00/0:00
// Love Is Magic — Loft
// 120 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 125 bars on a 16-step grid, each part at one level. 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 1 · "SYN BASS 1"
const bass = note(`<
  A@3 B A@3 B A@3 B A B A B A B A B A B A B A B A C D@3 E D@3 F D@3 E D@3 F A B A B A B A B A B A B A B A C D@3 E D@3 E
  D@3 E D@3 F D@3 E D@3 F A B A B A B A B A B A B A B A C ~@8 A B A B A B A B A B A B A B A ~@2
>`.pickRestart({
  A: "[c1,c2]@2 [c2,c3]!2 [c1,c2]@2 [c2,c3]!2 [c1,c2]@2 [c2,c3]@2 [c1,c2]@2 [c2,c3]@2", // C
  B: "[ab0,ab1]@2 [ab1,ab2]!2 [ab0,ab1]@2 [ab1,ab2]!2 [bb0,bb1]@2 [bb1,bb2]@2 [bb0,bb1]@2 [bb1,bb2]@2", // Ab Bb
  C: "[ab0,ab1]@2 [ab1,ab2]!2 [ab0,ab1]@2 [ab1,ab2]!2 [bb0,bb1]@2 [bb1,bb2]@2 [bb0,bb1] ~@3", // Ab Bb
  D: "[c1,c2] [c2,c3] [c1,c2] [c2,c3] [c1,c2] [c2,c3] [c1,c2] [c2,c3]", // C
  E: "[ab0,ab1] [ab1,ab2] [ab0,ab1] [ab1,ab2] [bb0,bb1] [bb1,bb2] [bb0,bb1] [bb1,bb2]", // Ab Bb
  F: "[ab0,ab1] [ab1,ab2] [ab0,ab1] [ab1,ab2] [bb0,bb1] [bb1,bb2] ~@2", // Ab Bb
})).s("gm_synth_bass_1").gain(0.29)

// bass · lead 8 bass lead · "BASS&LEAD"
const bass_2 = note(`<
  ~@4 A@2 B ~ A@2 C D ~@16 E F G H I@2 E@2 J K L M N@2 O@2 A@2 B ~ A@2 C P Q@3 ~ A@2 R S T ~@7 E F G H I@2 E@2 J K L M
  N@2 O@2 A@2 B ~ A@2 C P Q@3 ~ A@2 R S T ~@7 A@2 B ~ A@2 C P Q@3 ~ A@2 R S T
>`.pickRestart({
  A: "[c4@4 eb4@4 f4@4 g4@2 f4@5 ~@7 c4@2 g4 ~ g4@2]/2", B: "f4@3 eb4 ~@4", C: "f4@3 eb4 ~ bb4 g4 eb4",
  D: "f4@3 eb4@2 ~@3", E: "c3@4 ~ c3 ~ c3 ~ bb2 c3 ~ c3@3 ~", F: "c3@4 ~ c3!3 ~ c3 bb2 ~ c3@3 ~",
  G: "c3@4 ~ c3 ~ c3 ~ bb2 c3 ~ c3@3 c3", H: "~ bb2 c3 ~ c3@2 ~ c3 ~ bb2 c3 ~ c3@3 ~",
  I: "c3@4 ~ c3 ~ c3 ~ bb2 c3 ~ c3 ~ c3 ~", J: "c3@4 ~ c3!2 ~ c3 ~ c3 ~ c3 ~ c3 ~",
  K: "c3@3 c3 ~ c3 ~ c3!2 ~ c3 ~ c3 ~ c3 ~", L: "c3@2 ~ c3!2 ~ c3 ~ c3 ~ c3!3 ~ c3!2",
  M: "c3@3 c3 ~ c3 ~ c3 ~ c3 ~ c3!2 ~ c3 ~", N: "c3@2 ~ c3!3 ~ c3!3 ~ c3!3 ~ c3",
  O: "[c3@3 ~ c3!2 ~ c3 ~ c3 ~ c3 ~ c3 ~ c3@4 ~ c3!2 ~ c3 ~ c3 c3@4 ~@2]/2", P: "f4@6 eb4@4 ~@2 bb3 ~ bb3@2",
  Q: "[bb4 ~ bb4@2 g4 ~ g4@2 eb4@2 c4@4 bb4@6 g4@4 eb4@2 f4@2 g4 ~ g4@10 ~@8]/3", R: "f4@3 eb4 ~@2 c4 eb4",
  S: "ab4@4 g4@4 f4@4 eb4 ~ f4@2", T: "~ eb4 c4@6 ~@8",
})).s("gm_lead_8_bass_lead").gain(0.23)

// other · drawbar organ · "ORGAN 1"
const drawbar_organ = note("<~@28 A@7 B A@7 B ~@24 A@7 B A@7 B ~@16 A@7 B ~@17>".pickRestart({
  A: "c8!3 ~ c8 ~ c8!3 ~ c8 ~ c8!3 ~", B: "c8!3 ~ c8 ~ c8!3 ~@7",
})).s("gm_drawbar_organ").gain(0.36)

// other · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note("<~@100 A@2 B@2 A@2 C@2 ~@17>".pickRestart({
  A: "[c2,c3]/2", B: "[ab1,ab2]/2", C: "[bb1,bb2]/2",
})).s("gm_synth_brass_1").gain(0.27)

// other · flute
const flute = note("<~@11 [~@11 c9 c1@2 ~@2] ~@55 [~@11 c9 c1@2 ~@2] ~@39 [~@11 c9 c1@2 ~@2] ~@17>")
  .s("gm_flute").gain(0.19)

// drums · rim
const rim = s("rim").struct("<~@11 A ~@16 B@7 C B@7 C ~@23 A B@7 C B@7 C ~@16 B@7 D ~@17>".pickRestart({
  A: "~@3 x", B: "x!16", C: "x!11 ~@5", D: "x!11 ~ x ~@3",
})).gain(0.3)

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

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

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@123 [~@3 x] ~>").gain(0.42)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A@15 B ~@8 A@7 B A@15 B A@8 ~@8 A@7 B A@15 B ~@8 A@15 ~@2>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~ x ~@2",
})).gain(0.42)

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

// drums · cowbell
const cowbell = s("cb").struct("<~@4 A@3 B A@3 ~ A@15 C ~@16 A@15 C ~@24 A@15 C ~@8 A@15 ~@2>".pickRestart({
  A: "x!5 ~ x!3 ~ x!3 ~ x ~", B: "x!5 ~ x!3 ~ x!6", C: "x!5 ~ x!3 ~ x!2 ~@4",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@12 A ~@15 A ~@7 A ~@7 A ~@15 A ~@7 A ~@7 A ~@7 A ~@15 A ~@7 A ~@16>".pickRestart({
  A: "x",
})).gain(0.36)

// drums · woodblocks
const woodblocks = s("woodblock:4").struct("<~@12 A@16 ~@16 A@16 ~@24 A@16 ~@8 A@16 ~>".pickRestart({
  A: "~@7 x ~@2 x ~@5",
})).gain(0.61)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<~@60 x!3 [x!2] x!3 [x!2] ~@57>").gain(1.3)

stack(
  bass, bass_2, drawbar_organ, synth_brass_1, flute, rim, kick, snare, hihat, mid_tom, open_hat, tambourine, cowbell,
  crash, woodblocks, jingle_bells
)