Strudelify

I'm So in Love With You

Duke

KeyB♭ minorTempo128 bpm
0:00/0:00
// I'm So in Love With You — Duke
// 128 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 124 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/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.

// chords · epiano1 · "E.PIANO 1"
const epiano1 = note(`<
  ~@28 A@2 B@2 C D C E A@2 B@2 C D C E A@2 B@2 C D C E A@2 B@2 C D C E A@2 B@2 C D C E A@2 B@2 C D C E F ~ G H I ~ J H K
  ~ L@2 A@2 B@2 C D C E A@2 B@2 C D C E ~@16 F ~ M ~
>`.pickRestart({
  A: "[[bb3,eb4,g4] ~@3 [bb3,eb4,g4]@2 [a3,eb4,g4] ~@3 [a3,eb4,g4] ~@3 [bb3,eb4,g4]@4 [bb3,eb4,g4] ~@3 [a3,eb4,g4]@2 [bb3,eb4,g4]@3 ~ [a3,eb4,g4]@3 ~]/2", // Eb Am7b5 Eb Am7b5 Eb Am7b5
  B: "[[bb3,eb4,g4] ~@3 [bb3,g4]@2 [a3,eb4,g4] ~@3 [a3,eb4,g4] ~@3 [bb3,eb4,g4]@4 [eb4,g4] ~@3 [a3,eb4,g4] ~ [bb3,eb4,g4] ~@3 [g3,db4,f4]@3 ~, ~@4 eb4 ~@13 bb3@2 ~@12]/2", // Eb Am7b5 Eb Am7b5 Eb Gm7b5
  C: "[ab3,db4,f4] ~@3 [ab3,db4,f4] ~ [g3,db4,f4] ~@3 [g3,db4,f4] ~@3 [ab3,db4,f4]@2", // Db Gm7b5 Db
  D: "~@2 [ab3,db4,f4] ~@3 [db4,f4]@2 [ab3,db4,f4] ~@3 [g3,db4,f4]@3 ~, ~@6 g3 ~@9", // Db Gm7b5
  E: "~@2 [ab3,db4,f4] ~@3 [g3,db4,f4] ~ [ab3,db4,f4] ~@3 [g3,db4,f4]@3 ~", // Db Gm7b5 Db Gm7b5
  F: "[c3,eb4,g4,bb4,d5] ~ [c3,eb4,g4,bb4,d5] ~ [c3,eb4,g4,bb4,d5] ~@9 [c3,eb4,g4,bb4,d5] ~", // Cm7
  G: "[bb2,db4,f4,ab4,c5] ~ [bb2,db4,f4,ab4,c5] ~ [db4,f4,ab4,c5] ~@9 [ab4,c5,eb5] ~, ~@2 bb2 ~@4 [bb2,g5]", // Bbm7 Dbmaj7 Ab Eb
  H: "~ [bb2,ab4,c5,eb5,g5] ~@6", // Cm7
  I: "[c3,eb4,g4,bb4,d5] ~ [c3,eb4,g4,bb4,d5] ~ [eb4,g4,bb4,d5] ~@9 [c3,eb4,g4]@2, ~@4 c3@2 ~@8 [bb4,d5] ~", // Cm7 Ebmaj7 Cm Bb
  J: "[bb2,db4,f4,ab4,c5] ~ [bb2,db4,f4,ab4,c5] ~ [db4,f4,ab4,c5] ~@9 [bb2,ab4,c5,eb5,g5]@2, ~@2 bb2 ~@5", // Bbm7 Dbmaj7 Cm7
  K: "[c3,eb4,g4,bb4,d5] ~ [c3,eb4,g4,bb4,d5] ~ [c3,eb4,g4,bb4,d5] ~@9 [eb4,g4,bb4,d5] ~, ~@7 c3", // Cm7 Ebmaj7
  L: "[[c3,eb4,g4,bb4,d5] ~ [c3,eb4,g4,bb4,d5] ~ [eb4,g4,bb4,d5] ~@9 [c3,eb4,g4,bb4,d5]@17 ~, ~@2 c3 ~@13]/2", // Cm7 Ebmaj7 Cm7
  M: "[c3,eb4,g4,bb4,d5] ~ [c3,eb4,g4,bb4,d5] ~ [eb4,g4,bb4,d5] ~@9 [eb4,g4,bb4,d5] ~, ~@2 c3 ~@4 c3", // Cm7 Ebmaj7
})).s("gm_epiano1").gain(0.24).pan(0.6)

// bass · synth bass 1 · "SYN BASS 1"
const bass = note(`<
  ~@4 A B C D E F E G A B C D E F E G A B C D E F E G A B C D E F E G A B C D E F E G A B C D E F E G A B C D E F E G A
  B C D E F E G A B C D E F E G H ~ I J K ~ I L K ~ M@2 A B C D E F E G A B C D E F E G A B C D E F E G A B C D E F E G
  H ~ N ~
>`.pickRestart({
  A: "c2 ~ c2@3 ~ eb2@2 ~@2 f2@2 ~@2 g2@2", B: "~@2 bb2@2 ~@2 g2 ~ bb2 ~ g2 ~ bb2 ~ c3@2",
  C: "c2 ~ c2@3 ~ eb2@2 ~@2 f2@2 ~@2 g2@2, ~@10 g2 ~@5", D: "~@2 bb2@2 ~@2 g2@2 c2@2 c3@2 b1@2 b2 ~",
  E: "bb1 ~ bb1@3 ~ db2@2 ~@2 eb2@2 ~@2 f2@2", F: "~@2 ab2@2 ~@2 f2 ~ ab2 ~ f2 ~ ab2 ~ bb2@2",
  G: "~@2 ab2@2 ~@2 f2@2 bb1@2 bb2@2 b1@2 b2 ~", H: "c2 ~ c2 ~ c2@2 ~@8 c2@2", I: "bb1 ~ bb1 ~ bb1 ~@9 bb1 ~",
  J: "~@2 bb1 ~@3 ab1@2 bb1@2 bb2@2 b1@2 b2@2", K: "c2 ~ c2 ~ c2 ~@9 c2@2",
  L: "~@2 bb1 ~@3 ab1@2 bb1@2 bb2 ~ b1@2 b2 ~", M: "[c2 ~ c2 ~ c2 ~@9 c2@17 ~]/2", N: "c2 ~ c2 ~ c2 ~@9 c2 ~",
})).s("gm_synth_bass_1").gain(0.36)

// chords · epiano1 · "+DET.EP 1"
const epiano1_2 = note(`<
  ~@12 A B A C D E D F A B A C D E D F A B A C D E D F A B A C D E D F A B A C D E D F A B A C D E D F A B A C D E D F A
  B A C D E D F ~@10 G@2 A B A C D E D F A B A C D E D F A B A C D E D F A B A C D E D F ~@4
>`.pickRestart({
  A: "~@4 [eb4,g4,bb4] ~ c4 ~@7 [eb4,g4,bb4]@2", // Eb
  B: "~@2 [eb4,g4,bb4] ~@3 [eb4,g4,bb4]@3 ~ [eb4,g4,bb4] ~@3 [eb4,g4,bb4] ~", // Eb
  C: "~@2 [eb4,g4,bb4] ~@3 [eb4,g4,bb4]@3 ~ [eb4,g4,bb4] ~@3 [db4,f4,ab4] ~", // Eb Db
  D: "~@4 [db4,f4,ab4] ~ bb3 ~@7 [db4,f4,ab4]@2", // Db
  E: "~@2 [db4,f4,ab4] ~@3 [db4,f4,ab4]@3 ~ [db4,f4,ab4] ~@3 [db4,f4,ab4] ~", // Db
  F: "~@2 [db4,f4,ab4] ~@3 [db4,f4,ab4]@3 ~ [db4,f4,ab4] ~@3 [eb4,g4,bb4] ~", // Db Eb
  G: "[~@9 bb5@2 [bb5,d6,f6]@5, ~@7 [eb4,g4,bb4]@9, ~@9 [eb5,g5]@7]/2", // Bb Eb
})).s("gm_epiano1").gain(0.28).pan(0)

// bass · slap bass 1 · "SLAPBASS 1"
const bass_2 = note("<~@11 A ~@15 B ~@15 B ~@7 C D ~@6 B ~@11 E ~@3 B ~@23 E ~@3 B ~@7 A ~@7 A ~@4>".pickRestart({
  A: "~@8 bb2 ~@5 c3 ~", B: "~@8 bb1@2 bb2@2 ~@2 b2 ~", C: "~@5 bb2 b2 b1", D: "c2 ~@7", E: "~@5 c3 ~ b2",
})).s("gm_slap_bass_1").gain(0.37)

// bass · slap bass 1 · "SLAPBASS 1" · soft notes
const bass_soft = note("<~@11 A ~@15 B ~@15 B ~@15 B ~@11 C D ~@2 B ~@23 C D ~@2 B ~@7 A ~@7 A ~@4>".pickRestart({
  A: "~@10 bb1 ~ b1 ~@3", B: "~@6 b1 ~", C: "~@4 c2 ~ b1 ~", D: "bb1 ~@7",
})).s("gm_slap_bass_1").gain(0.25)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note("<~@41 A@3 ~@13 A@3 ~@13 A@3 ~@25 A@3 ~@20>".pickRestart({
  A: "[bb3,db4,f4,ab4]/3", // Bbm7
})).s("gm_synth_strings_2").gain(0.14)

// chords · synth strings 2 · "SYN STR 2" · soft notes
const synth_strings_2_soft = note("<~@64 A@4 ~@18 B@2 ~@4 A@4 ~@28>".pickRestart({
  A: "[~@3 [bb3,db4,f4,ab4]@12 ~]/4", B: "[c2,c3]/2",
})).s("gm_synth_strings_2").gain(0.08)

// drums · kick
const kick = s("bd").struct("<~@4 A@39 B A@15 B A@16 C ~ C D C ~ C D C ~ C E A@32 C ~ C ~>".pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x!3 ~@4 x", D: "~ x ~@6", E: "~@7 x",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct("<~@4 [~ x ~ x]!72 ~@12 [~ x ~ x]!32 ~@4>").gain(0.64)

// drums · low tom
const low_tom = s("lt").struct("<~@87 [~@5 x ~ x] ~@36>").gain(0.56)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@4 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@12 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 ~@4
>`.pickRestart({
  A: "~ x!2 ~@2 x ~@2", B: "~ x ~@3 x ~@2",
})).gain(0.16)

// drums · open hat
const open_hat = s("oh").struct("<A@76 B ~ B C B ~ B C B ~ B D A@32 B ~ B ~>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "x!3 ~@4 x", C: "~ x ~@6", D: "~@7 x",
})).gain(0.8)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<[~ x ~ x]!76 ~@12 [~ x ~ x]!32 ~@4>").gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 A ~@55 B ~@15 B ~@11 A ~@15 B ~@15 B ~@4>".pickRestart({
  A: "x!15 ~", B: "~@8 x!2 ~@2 x!2 ~@2",
})).gain(0.4)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@10 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@12 B ~@6 A ~@7 A ~@7 A C ~@6 A C ~@4
>`.pickRestart({
  A: "~@7 x", B: "~ x ~@6", C: "~@3 x ~@4",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<A@76 B ~ B C B ~ B C B ~ D E A@32 B ~ B ~>".pickRestart({
  A: "~@3 x", B: "x!3 ~@4 x", C: "~ x ~@6", D: "x!3 ~@5", E: "~ x ~ x ~ x ~ x",
})).gain(0.56)

// drums · cowbell
const cowbell = s("cb").struct("<[x!2]!123 ~>").gain(0.56)

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

// drums · bongos · soft notes
const bongos_soft = s("bongo:4").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~
>`.pickRestart({
  A: "~ x ~@6",
})).gain(0.21)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A C
>`.pickRestart({
  A: "~@3 x!4 ~", B: "x!3 ~ x!4", C: "x",
})).gain(0.42)

// drums · bongos · soft notes
const bongos_soft_2 = s("bongo:18").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A ~
>`.pickRestart({
  A: "x!3 ~@4 x", B: "~@3 x ~@4",
})).gain(0.21)

// drums · congas
const congas = s("conga:13").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~
>`.pickRestart({
  A: "~ x ~@2",
})).gain(0.77)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~@2
>`.pickRestart({
  A: "~@3 x!2 ~@3",
})).gain(0.77)

// drums · congas
const congas_3 = s("conga:33").struct("<[~@6 x!2]!76 ~@12 [~@6 x!2]!32 ~@4>").gain(0.77)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct(`<
  ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~@2
// … 65 more lines