Strudelify

I Love Music

The O'Jays

KeyC majorTempo126 bpm
0:00/0:00
// I Love Music — The O'Jays
// 126 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 129 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(126/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
const bass = note(`<
  ~@6 A B A B A B A B A B A B A B A B A B A B A B C D A B C D A B A B A B A B A B A B A B C D A B C D 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 C D A B C D A B A B A B A B A B A B A B A B A B C D A B C D A B A B A B A B A B A B
  A B A B A B E
>`.pickRestart({
  A: "g1@3 ~ d2@2 g1@2 a1@3 ~ e2@2 a1@2", B: "g1@3 ~ d2@2 g1@2 a1@2 d2@2 f2@2 g2@2", C: "a#1@3 ~ a#1@3 ~ a1@3 ~ a1@3 ~",
  D: "g1@3 ~ g1@3 ~ c2@3 ~ c2@3 ~", E: "f2 ~@7",
})).s("gm_electric_bass_finger").gain(0.45)

// chords · piano
const piano = note(`<
  ~@9 A B C B C B C B C B C B D B D B D B D E F B D E F B D B D B D B D B D B D B D E F B D E F B D B D B D B D B D B D
  B D B D B D B D B D B D B D E F B D E F B D B D B D B D B D B D B D B D B D E F B D E F B D B D B D B D B D B D B D B
  D B D G
>`.pickRestart({
  A: "~@8 [f1,g1] [a1,b1] [c2,d2,e2] [f2,g2,a2,b2] [c3,d3,e3,f3] [g3,a3,b3] [c4,d4,e4,f4] ~", // Fsus2 Asus2 C G7 Dm7 G Dm7
  B: "~@2 [g3,a#3,d4,f4]@2 ~ [g3,a#3,d4,f4] ~@2 [a3,c4,e4,g4]@3 ~ [a3,c4,e4,g4]@3 ~", // Gm7 Am7
  C: "~@2 [g3,a#3,d4,f4]@2 ~ [g3,a#3,d4,f4] ~@2 [a3,c4,e4,g4]@6 ~@2", // Gm7 Am7
  D: "~@2 [g3,a#3,d4,f4]@2 ~ [g3,a#3,d4,f4] ~@4 d2@2 f2@2 g2@2, ~@4 [a3,c4,e4,g4]@3 ~", E: "[a#3,d4,f4] [a3,c4,e4]",
  F: "[g3,a#3,d4]@4 [c4,e4,g4]@3 ~", G: "[f3,a3,c4,f4] ~@7",
})).s("gm_piano").gain(0.4).pan(0.7)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@10 A@18 B@2 A@2 B@2 A@2 C@12 B@2 A@2 B@2 A@2 C@23 D ~@8 C@15 E ~@8 C@16 F
>`.pickRestart({
  A: "~@2 [a#3,d4,f4,a4] ~@2 [a#3,d4,f4,a4] ~@2 [c4,e4,g4,a4]@3 c4 [c4,e4,g4,a4] ~@3", // A#maj7 Am7
  B: "~@2 [a#3,d4,f4,g4] ~@2 [a#3,d4,f4,g4] ~@2 [a#3,d4,f4,g4]@5 ~@3", // Gm7
  C: "~@2 [d4,f4,g4,c5] ~@2 [d4,f4,g4,c5] ~@2 [d4,f4,a4,c5]@3 d4 [d4,f4,a4,c5] ~@3", // Dm7
  D: "~@2 [d4,f4,g4,c5] ~@2 [d4,f4,g4,c5] ~@2 [d4,f4,a4,c5]@3 ~@5", // Dm7
  E: "~@2 [d4,f4,g4,c5] ~@2 [d4,f4,g4,c5] ~@2 [d4,f4,a4,c5]@2 g5@2 ~@4", F: "[f3,f4,a4,c5] ~@7",
})).s("gm_electric_guitar_clean").gain(0.35).pan(0.3)

// other · distortion guitar
const distortion_guitar = note("<~@79 A B@2 C@2 D@2 E@2 ~@15 F@3 ~ G@2 ~@2 H ~@17>".pickRestart({
  A: "~@12 a4 c5 d5 ~", B: "[d5@2 ~ d5@2 ~ d5 ~ d5@4 c5@6 d5@2 c5@2 a4@2 c5@3 a4@3 g4@2]/2", C: "[d4@13 ~@3]/2",
  D: "[d5@3 c5@3 a#4@2 g5@10 f5@3 d5@3 c5@3 a#4@3 c5@2]/2", E: "[d5@2 c5 a#4 g4@2 d4@23 ~@3]/2",
  F: "[~@13 f5@32 ~@3]/3", G: "[~@2 g3 f4 g4@2 a4@2 a#4@2 d5@2 f5@20]/2", H: "~@2 d5@2 c5 a#4 g4@8 ~@2",
})).s("gm_distortion_guitar").gain(0.45)

// other · synth strings 1
const synth_strings_1 = note("<~@27 A@6 B@3 C@3 D ~@7 A@6 B@3 ~@15 E@5 F@8 G@4 ~@7 E@5 F@8 G@4 ~@17>".pickRestart({
  A: "[~@15 a5@4 g5@2 a5@2 g5@4 f5@2 g5@2 f5@4 e5@2 f5@2 e5@4 d5@2 c5@2 d5@8 a4@18 ~@6 a5@4 g5@2 a5@2 g5@4 f5@2 g5@2 f5]/6",
  B: "[~@3 e5@2 f5@2 e5@4 d5@2 c5@2 d5@8 a4@18 ~@7]/3",
  C: "[~@7 c6@12 a#5@2 c6@2 a#5@4 a5@2 a#5@2 a5@14 a5 g5 [e5,f5]]/3", D: "d5@7 e5@8 ~",
  E: "[~@15 d5@4 f5@4 g5@4 a5@4 c6@15 ~ c6@8 a5@8 f5@8 d5@8 d5]/5",
  F: "[~@3 f5@4 g5@4 a5@4 c6@15 ~ c6@8 a5@8 f5@8 d5@8 a5@4 g5@2 a5@2 g5@4 f5@2 g5@2 f5@4 e5@2 f5@2 e5@4 d5@2 c5@2 d5@8 a4@18 ~@6 a5]/8",
  G: "[~@3 g5@2 a5@2 g5@4 f5@2 g5@2 f5@4 e5@2 f5@2 e5@4 d5@2 c5@2 d5@8 a4@18 ~@7]/4",
})).s("gm_synth_strings_1").gain(0.4).pan(0.7)

// other · synth brass 1
const synth_brass_1 = note(`<
  ~@14 A B ~@14 C@2 ~@2 C@2 ~@14 C@2 ~@2 C@2 ~@26 C@2 ~@2 C@2 ~@18 C@2 ~@2 C@2 ~@17
>`.pickRestart({
  A: "~@4 a5@4 f5 ~ g5@4 c6 ~", B: "a5@4 f5 ~ g5@10", C: "[~@4 [d4,d5]@3 [c4,c5] [d4,d5] ~ [a4,a5]@21 ~]/2",
})).s("gm_synth_brass_1").gain(0.43).pan(0.2)

// other · piccolo
const piccolo = note("<~@30 A B ~@2 A B ~@14 A B ~@2 A B ~@26 A B ~@2 A B ~@18 A B ~@2 A B ~@17>".pickRestart({
  A: "~@12 d6 c6 a5 g5", B: "a5@5 ~@3",
})).s("gm_piccolo").gain(0.45).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@6 [x!2]!34 [~ x] [x!2]!87 x>").gain(0.45)

// drums · rim
const rim = s("rim").struct("<~@6 [~ x ~ x]!122 ~>").gain(0.35)

// drums · snare
const snare = s("sd").struct(`<
  ~@6 A@3 B A@9 C A@7 D A@3 E A@3 F A@3 D A@7 D A@3 E A@3 F A@7 D A@7 D A@7 D A@3 E A@3 F A@7 D A@7 G A@3 E A@3 F A@7 D
  A@7 D H
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x ~@2 x!5", C: "~@4 x ~@3 x!3 ~ x!4", D: "~@4 x ~@3 x!8", E: "~@2 x!4 ~@2 x ~@3 x!4",
  F: "x!5 ~ x!10", G: "~@4 x!12", H: "x",
})).gain(0.35)

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

// drums · open hat
const open_hat = s("oh").struct("<~@5 [~@7 x] [~ x ~ x ~ x ~ x]!122 ~>").gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~@10 A ~@3 A ~@3 A ~ A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A
  ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A
>`.pickRestart({
  A: "x",
})).gain(0.35)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 [~@15 x] [x!16]!122 x>").gain(0.2)

// drums · congas
const congas = s("conga:13").struct("<~@2 [~ x] [x!2]!125 ~>").gain(1.43)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@2 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 B A B ~
>`.pickRestart({
  A: "~@3 x!2 ~@6 x!2 ~@3", B: "~@3 x!2 ~@4 x!4 ~@3",
})).gain(1.43)

// drums · congas
const congas_3 = s("conga:33").struct("<~@2 [x ~@2 x ~@3 x] [~@3 x ~@3 x]!125 ~>").gain(1.43)

stack(
  bass, piano, electric_guitar_clean, distortion_guitar, synth_strings_1, synth_brass_1, piccolo, kick, rim, snare,
  hihat, open_hat, crash, tambourine, congas, congas_2, congas_3
)

More by The O'Jays