Strudelify

I Feel Love

Donna Summer

KeyA majorTempo130 bpm
0:00/0:00
// I Feel Love — Donna Summer
// 130 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 3 "Bowed Bass" named as a bass, played on electric bass finger (its contrabass patch is not one)
// note: duplicate parts dropped: ch 2 "Right Bass" synth bass 1 (copy of ch 1 "Left Bass" synth bass 1, 0.25 beats late)
// note: Full arrangement: all 187 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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 1 · "Left Bass"
const bass = note(`<
  A@24 B@4 C@4 D@7 E A B C D A B C D A@24 B@4 C@4 D@7 E A B C D A B C D A B C D A B C D A B C D A B C D A@24 B@4 C@4 D@7
  E A B C D A B C D A B C D A B C D A B C D A B C D A B C D A@6 F
>`.pickRestart({
  A: "a2 ~ a2 ~ e2 ~ g2 ~ a2 ~ a2 ~ e2 ~ g2 ~", B: "c3 ~ c3 ~ g2 ~ a2 ~ c3 ~ c3 ~ g2 ~ a2 ~",
  C: "d3 ~ d3 ~ a2 ~ c3 ~ d3 ~ d3 ~ a2 ~ c3 ~", D: "e3 ~ e3 ~ b2 ~ d3 ~ e3 ~ e3 ~ b2 ~ d3 ~",
  E: "e3 ~ e3 ~ b2 ~ d3 ~ e3 ~ e3 ~ d3 ~ e3 ~", F: "a2 ~ a2 ~ e2 ~ g2 ~ a2 ~ a2 ~@5",
})).s("gm_synth_bass_1").gain(0.6).pan(0.1)

// bass · electric bass finger · "Bowed Bass"
const bass_2 = note(`<
  ~@4 A@20 B@4 C@4 D@8 A B C D A B C D A@24 B@4 C@4 D@8 A B C D A B C D A B C D A B C D A B C D A ~@15 A@12 B@4 C@4 D@8
  A B C D A B C D A B C D A B C D A B C D A ~@14
>`.pickRestart({
  A: "a1 ~ a1 ~@13", B: "c2 ~ c2 ~@13", C: "d2 ~ d2 ~@13", D: "e2 ~ e2 ~@13",
})).s("gm_electric_bass_finger").gain(0.72)

// chords · synth strings 1 · "Strings"
const synth_strings_1 = note(`<
  ~@12 A@8 ~@4 B@4 C@4 D@8 E F@6 G@8 ~ H@4 I@4 J@7 K@8 L@8 M@7 N O@2 P Q@4 R@4 S@4 ~@18 J@7 T@5 U@3 L@8 M@7 N O@2 P Q@4
  R@4 S@4 ~@13
>`.pickRestart({
  A: "[c#4,e4,a4]/8", B: "[c4,e4,g4]/4", C: "[d4,f#4,a4]/4", D: "[b3,e4,g#4]/8", E: "[c#4,a4]",
  F: "[[c4,g4]@15 ~ d4@15 [b3,g#4]@16 [a3,c#4,a4]@17 [c4,g4]@15 ~ [d4,a4]@15 g#4, ~@15 [a3,f#4]@16 e4@48 f#4@16 ~]/6", // C5 E A C5 D5 D
  G: "[b3@15 c#4@64 ~ c4@48, e4, ~@15 a4@113]/8", H: "[~@31 c#5@16 e5@17, c#4]/4", I: "[c4,c5]/4", J: "[a3,c#4,e4]/7",
  K: "[~@16 g4@63 ~ [d4,f#4,a4]@48, ~@15 e4@113, ~@15 c4@64 ~@49]/8", L: "[~ [e4,b4]@7, ~@15 g#4@113]/8",
  M: "[~@16 a4@15 ~ g4@15 [d4,f#4,a4]@16 [e4,g#4,b4]@16 ~ [c#4,a4]@16 [c4,g4]@16, ~@15 c#4@16 c4@16 ~@32 e4@32 ~]/7", // D E F#m C5
  N: "[d4,f#4,a4]", O: "[[e4,g#4,b4]@15 ~ [e4,a4]@16, ~@15 c#5@16 ~]/2", P: "[e4,g4,c5]",
  Q: "[~@16 [g#4,b4]@15 ~ a4@16 [g4,c5]@16, [f#4,a4,d5]@17 ~@14 e4@33, ~@15 e5@16 c#5@16 ~@17]/4", // G#m C5 D
  R: "[[f#4,a4,d5]@15 ~ b4@15 ~ a4@15 [e4,g4,c5]@17, ~@15 [g#4,e5]@16 [e4,c#5]@16 ~@17]/4", // D C C#m
  S: "[[f#4,a4,d5]@15 [g#4,b4,e5]@16 ~ a4@15 [g4,c5]@17, ~@31 e4@32 ~, ~@31 c#5@17 ~@16]/4", // D E C5
  T: "[~ g4@4, ~@15 [c4,e4]@64 ~]/5", U: "[d4,f#4,a4]/3",
})).s("gm_synth_strings_1").gain(0.29)

// drums · kick
const kick = s("bd").struct("<[x!4]!186 [x!3 ~]>").gain(0.72)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!109 ~@7 [~ x ~ x]!57 ~@14>").gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<[x!16]!104 [x!14 ~@2] ~@17 [x!16]!46 [x!14 ~@2] ~@18>").gain(0.64)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@104 [~@14 x!2] [x!16]!4 ~@59 [~@14 x!2] [x!16]!4 ~@14>").gain(0.24)

// drums · shaker
const shaker = s("sh").struct(`<
  [~ x ~ x ~ x ~ x]!108
  [~ x ~ x ~ x ~@2]
  ~@11
  [~ x ~ x ~ x ~ x]!52
  [~ x ~ x ~ x ~@2]
  ~@14
>`).gain(0.64)

// drums · claves
const claves = s("clave:2").struct(`<
  [~ x ~@2 x ~ x!2 ~ x ~@2 x ~ x!2]!104
  [~ x ~@2 x ~ x!2 ~ x ~@2 x ~@3]
  ~@15
  [~ x ~@2 x ~ x!2 ~ x ~@2 x ~ x!2]!48
  [~ x ~@2 x ~ x!2 ~ x ~@2 x ~@3]
  ~@18
>`).gain(3.14)

// drums · claves · soft notes
const claves_soft = s("clave:2").struct("<~@104 A B@3 C ~@59 A B@3 C ~@14>".pickRestart({
  A: "~@14 x!2", B: "~ x ~@2 x ~ x!2 ~ x ~@2 x ~ x!2", C: "~ x ~@2 x ~ x!2 ~ x ~@2 x ~ x ~",
})).gain(1.18)

stack(bass, bass_2, synth_strings_1, kick, snare, hihat, hihat_soft, shaker, claves, claves_soft)

More by Donna Summer