Strudelify

Feel Like Making Love

Heatwave

KeyE♭ majorTempo90 bpm
0:00/0:00
// Feel Like Making Love — Heatwave
// 90 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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 · fretless bass
const bass = note(`<
  ~ A B C@2 D E F@2 G H I J K L M N O P Q R@2 D E F@2 G H I J K L M N O P Q R@2 D E F@2 G H I J K L M N O P Q R@2 D E
  F@2 G H I J K L M N O P Q R@2 D E F@2 G H I J K L M S ~@5
>`.pickRestart({
  A: "eb2@2 ~ eb2 eb2@2 ~@2 eb2 ~@2 eb2 eb2@2 bb2 ~", B: "bb1@2 ~ bb1 bb1@2 ~@2 bb1@2 ~ bb1!2 ~ bb2 ~",
  C: "[eb2@2 ~ eb2 eb2@2 ~@2 eb2@2 ~ eb2!2 ~ db2@7 ~ c2@6 c2@2 c3 ~]/2", D: "f2@2 ~ f2 f2@2 ~@2 f2 ~@2 f2 c3@2 f2 ~",
  E: "bb1@2 ~ bb1 f2@3 ~ bb2@2 ~ bb2 f2@2 bb2 ~",
  F: "[eb2@2 ~ eb2 bb2@2 ~@2 eb2@2 ~ eb2 bb2 ~ db2@6 ~@2 c2@6 c2@2 ~@2]/2", G: "f2@2 ~ f2 c2@2 ~@2 f2@2 ~ f2 c3 ~ f2 ~",
  H: "bb1@2 ~ bb1 f2@2 ~@2 bb2@2 ~ bb2 f2@2 bb2 ~", I: "eb2@2 ~ eb2 bb1@3 ~ eb2@2 ~ eb2 bb2@2 ~@2",
  J: "a2@3 d2 e2 f2 g2@2", K: "ab2@2 ~ ab2 ab2@2 ~@2 ab2@2 ~ ab2 eb2@2 ~@2",
  L: "g2@2 ~ g2 g2@2 ~@2 g2@2 ~ g2 g1@2 d2 g2", M: "f2@2 ~ f2 f2@2 ~@2 f2@2 ~ f2!2 ~@3",
  N: "c2@2 ~ c2 c2@2 ~@2 c2@2 ~ c2 eb2 g2 bb2 ~", O: "ab2@2 ~ ab2!2 ~ eb2 ~ ab2@2 ~ ab2!2 ~ eb2 ~",
  P: "g2@3 g2 g2@2 ~@2 g2@2 ~ g2 g2@2 ~@2, gb2 ~@15", Q: "db2@2 ~ db2 db2@2 ~@2 db2@2 ~ db2 db2@3 ~",
  R: "[c2@2 ~ c2 c2@3 ~ c2 ~ eb2 ~ e2@2 f2@8 ~@6 f2 ~ c2 ~]/2", S: "c2@2 ~ c2 c2@2 ~@2 c2@2 ~ c2 eb2 ~@3",
})).s("gm_fretless_bass").gain(0.64)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~ A B C D E F G D F@2 H I J K L M N O P Q@2 E F G D F@2 H I J K L M N O P Q@2 E F G D F@2 H I J K L M N O P Q@2 E F G
  D F@2 H I J K L M N O P Q@2 E F G D F@2 H I J K R ~@6
>`.pickRestart({
  A: "[g3,bb3,d4]@2 ~ [g3,bb3,d4] [bb3,d4]@2 ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4]@3 ~@2", // Gm Bb Gm
  B: "[f3,ab3,eb4]@2 ~ [f3,ab3,eb4] [f3,ab3,eb4]@2 ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] [f3,ab3,eb4]@2 ~@2", // Fm7
  C: "[g3,bb3,d4]@2 ~ [g3,bb3,d4] [bb3,d4]@2 ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~@2 bb3 ~ [f3,ab3,db4]@2, ~@11 [g3,bb3,d4]@2 ~@3", // Gm Bb Gm Db Gm
  D: "~@6 [e3,g3,bb3]@3 ~@7", // Edim
  E: "[f3,ab3,eb4]@2 ~ [f3,ab3,eb4] [ab3,eb4]@2 ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] ~ [f3,ab3,eb4]@2 ~@3", // Fm7 Ab5 Fm7
  F: "[f3,ab3,eb4]@2 ~ [f3,ab3,eb4] [ab3,eb4]@2 ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] [ab3,eb4]@2 ~@2", // Fm7 Ab5 Fm7 Ab5
  G: "[g3,bb3,d4]@2 ~ [g3,bb3,d4] [bb3,d4]@2 ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4] [g3,bb3,d4]@2 [f3,ab3,db4]@2", // Gm Bb Gm Db
  H: "[g3,bb3,d4]@2 ~@2 bb3@2 ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~ [g3,bb3,d4] [g3,bb3,d4]@2 ~@2, ~@3 [g3,bb3,d4]@2 ~@11", // Gm
  I: "[g3,db4,e4,g4]@2 ~ [g3,db4,e4,g4] [g3,db4,e4,g4]@2 ~ [g3,db4,e4,g4] ~ [g3,db4,e4,g4] ~ [g3,db4,g4] [db4,g4]@2 ~@2, ~@5 e4 ~@2", // Dbdim Gdim Dbdim
  J: "[ab3,c4,eb4,g4]@2 ~ [ab3,c4,eb4,g4] [ab3,c4,eb4,g4]@2 ~ [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] [ab3,c4,eb4,g4]@2 ~@2", // Abmaj7
  K: "[g3,bb3,d4,f4]@2 ~@2 [bb3,f4]@2 ~ [g3,bb3,d4,f4] ~ [g3,bb3,d4,f4] ~@2 [bb3,f4]@2 [g3,bb3,d4,f4] ~, ~@3 [g3,bb3,d4,f4]@2 ~@6 [g3,bb3,d4,f4]@2 ~@3", // Gm7 Bb5 Gm7 Bb5 Gm7
  L: "[f3,ab3,eb4]@2 ~ [f3,ab3,eb4] [ab3,eb4]@2 ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] [f3,ab3,eb4]@2 ~@2", // Fm7 Ab5 Fm7
  M: "[g3,bb3]@2 ~ [g3,bb3] [g3,bb3]@2 ~ [g3,bb3] ~ [g3,bb3] ~ [g3,bb3] [g3,bb3]@2 ~@2", // Gm
  N: "[ab3,c4,eb4,g4]@2 ~ [ab3,c4,eb4,g4] [ab3,c4,eb4,g4]@2 ~ [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] [c4,eb4,g4]@2 ~@2", // Abmaj7 Cm
  O: "[f3,bb3,d4]@2 ~ [f3,bb3,d4] [bb3,d4]@2 ~ [g3,bb3,d4] ~ [g3,bb3,d4] ~@2 bb3@2 ~@2, ~@11 [g3,bb3,d4]@2 ~@3", // Bb Gm
  P: "[f3,ab3,b3,eb4]@2 ~ [f3,ab3,b3,eb4] [f3,ab3,b3,eb4]@2 ~ [f3,ab3,b3,eb4] ~ [f3,ab3,b3,eb4] ~ [f3,ab3,b3,eb4] [ab3,b3,eb4]@2 ~@2", // Fm7b5 Abm
  Q: "[[eb3,g3,bb3]@2 ~ [eb3,g3,bb3] [eb3,g3,bb3]@2 ~@2 [eb3,g3,bb3]!2 ~ [g3,bb3] [eb3,g3,d4]@2 [eb3,a3,d4]@4 ~@10 [f3,ab3,eb4] ~ [f3,ab3,eb4] ~]/2", // Eb Gm Ebmaj7 D Fm7
  R: "[f3,ab3,eb4]@2 ~ [f3,ab3,eb4] [ab3,eb4]@2 ~ [f3,ab3,eb4] ~ [f3,ab3,eb4] ~@6", // Fm7 Ab5 Fm7
})).s("gm_acoustic_guitar_nylon").gain(0.44).pan(0.2)

// other · synth brass 1
const synth_brass_1 = note(`<
  ~@22 A@2 B@2 A@2 C D E F G@2 H I J K@2 ~@17 A@2 B@2 A@2 C D E F G@2 H I J K@2 A@2 B@2 A@2 C D E L ~@7
>`.pickRestart({
  A: "c5/2", B: "[bb4@12 ~ c5 b4@7 ~ bb4@8 ~@2, ~@6 bb4 ~@9]/2", C: "bb4", D: "db5@5 ~ eb5 ~ e5 gb5 g5@6",
  E: "eb5@6 ~ eb5", F: "d5@13 ~ d5@2", G: "[c5@18 ~@2 c5 ~ d5 ~ eb5@2 ~ f5@2 g5@3]/2", H: "eb5", I: "d5", J: "b4",
  K: "[~@4 c5 eb5 e5 d5@6 ~@3]/2", L: "d5@13 ~@3",
})).s("gm_synth_brass_1").gain(0.51).pan(0.9)

// other · synth brass 1
const synth_brass_1_2 = note(`<
  ~ A B C@2 ~@17 D@2 E@2 D@2 F G H I J K L M@2 N@2 ~@17 D@2 E@2 D@2 F G H I J K L M@2 N@2 D@2 E@2 D@2 F G H O ~@7
>`.pickRestart({
  A: "~@4 g4 bb4 g4 bb4 d5 bb4 ~ bb4@2 ~ g4 ~", B: "ab4@3 eb5 eb5@11 ~",
  C: "[~@4 g4 bb4 g4 bb4 d5 bb4 ~ bb4@2 g4 ~ f4@7 e4@8 ~@2]/2", D: "eb4/2", E: "[d4@12 bb3 c4 f4@7 ~ e4@8 ~@2]/2",
  F: "d4", G: "db4@6 eb4 ~ e4 gb4 g4@6", H: "g4@7 g4", I: "f4@7 f4", J: "eb4", K: "~@4 c4@2 d4@2 eb4@3 f4@2 g4@3",
  L: "g4", M: "f4", N: "[~@8 c4 ~ eb4 ~ e4 ~ f4@12 ~@6]/2", O: "f4@7 ~",
})).s("gm_synth_brass_1").gain(0.14).pan(0.7)

// other · synth brass 1
const synth_brass_1_3 = note(`<
  ~@22 A@2 B@2 A@2 C D E F G H I J G K@2 ~@17 A@2 B@2 A@2 C D E F G H I J G K@2 A@2 B@2 A@2 C D E L ~@7
>`.pickRestart({
  A: "ab4/2", B: "[g4@12 bb3 c4 ab3@7 ~ g4@8 ~@2]/2", C: "g4", D: "db4@6 eb4 ~ e4 gb4 g4@6", E: "c5@7 c5",
  F: "bb4@7 bb4", G: "ab4", H: "~@4 c4@2 d4@2 eb4@3 f4@2 g4@3", I: "c5", J: "bb4",
  K: "[~@8 c4 ~ eb4 ~ e4 ~ a3@12 ~@6]/2", L: "bb4@7 ~",
})).s("gm_synth_brass_1").gain(0.4).pan(0.2)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~ A@3 ~ A@3 ~ A@11 ~@2 A@3 ~ A@11 ~@2 A@3 ~ A@11 ~@2 A@3 ~ A@11 ~@2 A@3 ~ A@7 ~@6
>`.pickRestart({
  A: "~@7 x",
})).gain(0.15)

// drums · low tom
const low_tom = s("lt").struct("<~@4 A ~@3 A ~@16 A ~@16 A ~@16 A ~@16 A ~@13>".pickRestart({
  A: "~@12 x!2 ~@2",
})).gain(0.45)

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A@3 B A@3 B A@11 C ~ A@3 B A@11 C ~ A@3 B A@11 C ~ A@3 B A@11 C ~ A@3 B A@8 ~@5
>`.pickRestart({
  A: "~@2 x ~@2 x ~@2", B: "x ~@2 x ~@4", C: "~ x ~@2",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@21 A ~@16 A ~@16 A ~@16 A ~@17>".pickRestart({
  A: "~@7 x",
})).gain(0.4)

stack(
  bass, acoustic_guitar_nylon, synth_brass_1, synth_brass_1_2, synth_brass_1_3, kick, snare, snare_soft, low_tom, hihat,
  mid_tom, open_hat, high_tom
)

More by Heatwave