Strudelify

Love Foolosophy

Jamiroquai

KeyB minorTempo130 bpm
0:00/0:00
// Love Foolosophy — Jamiroquai
// 130 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 123 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 · electric bass finger
const bass = note(`<
  ~@8 A B@2 C@2 D@4 E F G@2 H I@3 J@2 K@2 L@2 M@2 J@2 K@2 L@2 M@2 B@2 C@2 D@4 E F G@2 H I@3 J@2 K@2 L@2 M@2 J@2 K@2 L@2
  M@2 N O P Q N O P R N O P S N O P T U@4 L@2 M@2 J@2 K@2 L@2 M@2 J@2 K@2 L@2 M@2 J@2 K@2 L@2 V@2 ~@2
>`.pickRestart({
  A: "~@12 a1 ~@3", B: "[b1@2 ~@2 b1@2 ~@2 b2@2 b1@2 ~@2 e1@4 e2@2 ~@2 e1@2 ~@2 e1@3 ~ c2@2]/2",
  C: "[~@4 c2@2 ~ c2 c3@2 c2@2 ~@2 b1@4 b2 ~ b1 ~ f#2 ~@2 b1 a1@2 b1@2 d2@2]/2",
  D: "[b1@2 ~@2 b1@2 ~ b1 b2@2 a2@2 ~@2 e1@4 e2@2 ~@2 e1@2 ~@2 e1@2 f#1@2 c2@5 ~ c2@2 ~ c2 c2@2 c3 ~ c2 ~ b1@4 b2 ~ b1 ~ f#2 ~ f#1 d2 d2@2 e2@2 a1@2]/4",
  E: "b1@2 ~@2 b2@2 e3 b1 b2@2 a2 ~@3 e1@2", F: "~ e3 b2 ~@3 e1@3 ~ b1@3 ~ e2@2",
  G: "[c2@2 ~@2 c2@2 ~ c2 c3@2 c2@2 ~@2 b1@4 b2 ~ b1 ~ f#2 ~ f#1 d2 d2@2 e2@2 f#2@2]/2",
  H: "b1@2 ~@2 b1@2 b1 f#2 b2@2 e2@2 ~@2 e1@2",
  I: "[~ b1 e2 ~@3 e1@2 ~@2 e1@2 ~@2 c2@5 ~ c2@2 ~ c2 c2@2 c3 ~ c2 ~ b1@4 b2 ~ b1 ~ f#2 ~ f#1 c#2 d2@2 e2@2 ~@2]/3",
  J: "[b1@2 ~@2 b1 ~@2 b1 b1@2 c#2@2 ~@2 f#1@4 f#2 ~ f#1 e2 f2@2 f#2@3 f#3 ~@2 c#2@2]/2",
  K: "[~@4 c#2@2 ~ c#2 c#2@2 c#3 ~@3 e1@4 e2 ~ f#1@2 f#2 ~ g1@2 g2 ~ a1 ~ b2@2]/2",
  L: "[b1@2 ~@2 b1 ~@2 b1 b1@2 c#2@2 ~@2 f#1@4 f#2 ~ f#1 e2 f2@2 f#2@2 f#1 f#3 ~@2 f#3@2]/2",
  M: "[c#2@2 ~@2 c#2@2 ~ c#2 c#2@2 c#2 ~@3 e1@4 e2 ~ f#1 ~ f#2 ~ g1 ~ g2 ~ a1 ~ b2@2]/2",
  N: "b1@2 b1!3 ~ b1 ~ b1@2 b2 ~@5", O: "e1@2 e1!3 ~ e1 ~ e1@2 e2 ~@5", P: "c2@2 c2!3 ~ c2 ~ c2@2 c3 ~@5",
  Q: "b1@2 b1!3 ~ b1 ~ b1@2 b2 ~ a1@2 a2 ~", R: "b1@2 b1!3 ~ b1 ~ b1@2 b2 ~@3 d3 ~",
  S: "b1@2 b1!3 ~ b1 ~ b1@2 b2 ~ a1@2 ~ d3", T: "b1@2 b1!3 ~ b1 ~ b1@5 ~@3", U: "[b2@7 f#2@8 c#3@8 e3@5 d5@2 e4@2]/4",
  V: "[c#2@2 ~@2 c#2@2 ~ c#2 c#2@2 c#2 ~@3 e1@4 e2 ~ f#1 ~ f#2 ~ g1 ~ g2 ~@5]/2",
})).s("gm_electric_bass_finger").gain(0.58)

// bass · slap bass 1
const bass_2 = note(`<
  ~@11 A B C ~ D E F G A E H I D J K L M N K O P N K L M N K O P N ~@2 A B C ~ D E F G A E H I D J K L M N K O P N K L M
  N K O P N Q R S T Q R S U Q R S V Q R S ~@5 K O P N K L M N K O P N K L M N K O P N K L M N K O P W ~@2
>`.pickRestart({
  A: "~@7 c2 c3@2 ~@6", B: "~@2 b2 ~ b1 ~ f#2 ~@2 b1 ~@6", C: "~@7 b1 b2@2 ~@6", D: "~@7 c2 ~@2 c3 ~ c2 ~@3",
  E: "~@2 b2 ~ b1 ~ f#2 ~ f#1 d2 ~@6", F: "~@6 e3 b1 ~@8", G: "~@2 b2 ~@13", H: "~@6 b1 f#2 ~@8", I: "~@2 e2 ~@13",
  J: "~@2 b2 ~ b1 ~ f#2 ~ f#1 c#2 ~@6", K: "~@7 b1 ~@8", L: "~@4 f#1 ~@6 f#3 ~@4", M: "~@7 c#2 ~@2 c#3 ~@5",
  N: "~@2 e2 ~@3 f#2 ~@3 g2 ~@3 b2@2", O: "~@2 f#2 ~ f#1 ~@6 f#3 ~@2 f#3@2", P: "~@7 c#2 ~@8", Q: "~@10 b2 ~@5",
  R: "~@10 e2 ~@5", S: "~@10 c3 ~@5", T: "~@10 b2 ~@3 a2 ~", U: "~@10 b2 ~@3 d3 ~", V: "~@10 b2 ~@4 d3",
  W: "~@2 e2 ~@3 f#2 ~@3 g2 ~@5",
})).s("gm_slap_bass_1").gain(0.58)

// other · lead 1 square
const lead_1_square = note("<~@27 A B ~@6 A B ~@22 A B ~@4 C@8 ~@18 A B ~@4 C@20 D@4 ~@2>".pickRestart({
  A: "~@7 b5", B: "~ b5 ~@6", C: "[~@14 a5@16 g#5@16 g5@17 ~]/4", D: "[~@7 a5@8 g#5@8 g5@7 ~@2]/4",
})).s("gm_lead_1_square").gain(0.5)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@25 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@12 A ~@8 A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~
  A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@2 [b4,b5,b6] ~@2 [b4,b5,b6] ~@2 [b4,b5,b6] ~@2 [b4,b5,b6] ~@4", // B
})).s("gm_string_ensemble_1").gain(0.13).pan(0.7)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note(`<
  ~@25 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@12 A ~@8 A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~
  A ~ A ~ A ~ A ~@3
>`.pickRestart({
  A: "~@14 [b4,b5,b6] ~", // B
})).s("gm_string_ensemble_1").gain(0.09).pan(0.7)

// other · distortion guitar
const distortion_guitar = note("<~@24 A@8 B@8 C ~@15 A@8 B@8 C ~@15 D ~@4 B@24 E@4 ~@2>".pickRestart({
  A: "[~@7 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5]/8",
  B: "[~@2 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5]/8",
  C: "~ c#5 ~@2", D: "~ f#5@2 ~@2 f#5@2 ~", E: "[~@2 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@3 f#5@3 c#5@2 ~@4]/4",
})).s("gm_distortion_guitar").gain(0.18).pan(0.7)

// chords · piano
const piano = note("<~@81 A@2 B@2 C D E@2 F@4 ~@30>".pickRestart({
  A: "[[a3,d4,f#4]@5 [a3,d4,f#4,a4]@2 [e3,b3,d4,e4,g4]@9, [b2,f#3]@7 ~@9]/2", // D Em7 B5
  B: "[[c3,c4,e4,g4,b4]@14 ~@15 [b4,b5]@3, ~@7 [b2,f#3,a3,d4,f#4]@9, ~@13 [a4,a5]@3]/2", // Cmaj7 B Bm7 A
  C: "f#4@10 f#4@3 [f#4,a4]@3, [b2,f#3,a3,d4]", D: "[b3,g4]@5 [b3,g4]@3, [e3,d4,e4]",
  E: "[c4@10 c4@4 a3@12 a3@5 ~, [c3,e4,g4,b4]@14 [b2,f#3,d4,f#4,a4]@17 ~]/2", // Cmaj7 Bm7
  F: "[a3@5 a3@2 a3@6 a3@2 ~@7 b4 b3@6 ~ e4@2, [b2,f#3,d4,f#4]@7 [f#2,c#3,f#3,c#4,e4,a4]@8 [c#3,b3,c#4,e4,g#4]@8 [e2,e3,d4,g4]@9, ~@21 e5@2 ~@9, ~@21 b4 ~ e4@7 ~@2, ~@43 c#5@3 ~@12 b3@6]/4", // Bm F#m7 C#m7 Em7
})).s("gm_piano").gain(0.39)

// chords · epiano1
const epiano1 = note("<~@9 A@16 B@16 A@16 B@16 ~@20 B@24 C@4 ~@2>".pickRestart({
  A: "[[b2,a3,b3,d4,f#4]@14 [e3,b3,d4,e4,g4]@15 ~ [c3,b3,d4,e4,g4]@15 ~ [e4,f#4]@12 e4@4 ~@12 a4@4 [e3,b3,d4,e4,g4]@16 [c3,c4,e4,g4,b4]@16 f#4@14 e4@4, ~@23 [b2,a3,b3,d4]@8 [b2,a3,b3,d4,e4,f#4]@8 ~@16 [b2,a3,b3,d4]@9]/8", // Bm7 Em7 Cmaj7 Esus2 Em7 Cmaj7 Bm7
  B: "[[b2,b3,a4,d5,f#5]@7 [f#3,f#4,c#5,e5,a5]@8 [c#3,c#4,b4,c#5,e5,g#5]@8 [e3,e4,b4,d5,e5,g5]@9]/4", // Bm7 F#m7 C#m7 Em7
  C: "[[b2,b3,a4,d5,f#5]@7 [f#3,f#4,c#5,e5,a5]@8 [c#3,c#4,b4,c#5,e5,g#5]@8 [e3,e4,b4,d5,e5,g5]@7 ~@2]/4", // Bm7 F#m7 C#m7 Em7
})).s("gm_epiano1").gain(0.36)

// chords · electric guitar muted
const electric_guitar_muted = note(`<
  ~@17 A@2 B@2 C@2 D@2 E@16 ~@8 A@2 B@2 C@2 D@2 E@16 ~@20 E@24 F@4 ~@2
>`.pickRestart({
  A: "[[d3,f#3]@4 b2 ~ e3 ~ d3 e3 ~ d3 ~@2 [e3,g3]@5 ~ b2 ~ b2 ~ b2 a2 ~@2 b2 ~@3]/2", // D Em
  B: "[[c3,e3]@4 b2 ~ e3 ~ d3 e3 ~ d3 ~@2 [d3,f#3]@5 ~ b2 ~ b2 ~ b2 a2 ~ b2 ~@4]/2", // C D
  C: "[[d3,f#3]@4 b2 ~ e3 ~ d3 e3 ~ d3 ~@2 [e3,g3]@5 ~ b2 ~ e3 ~ d3 e3 ~@2 d3 ~@3]/2", // D Em
  D: "[[c3,e3]@4 b2 ~ e3 ~ d3 e3 ~ d3 ~@2 [d3,f#3]@5 ~ b2 ~ e3 ~ d3 e3 ~ d3 ~@4]/2", // C D
  E: "[f4 f#4@3 [d4,f#4] ~@3 [d4,f#4] ~ [b3,d4] [d4,f#4] [b3,d4]!2 f#4 g#4@2 [e4,g#4]!2 ~ [e4,g#4] ~ [e4,g#4] [c#4,e4] [e4,g#4] ~@2 [e4,g#4] [c#4,e4]!2 f#4 g#4@2 [e4,g#4]@3 [e4,g#4] [b3,e4] [e4,g#4] ~ [e4,g#4] ~ [b3,e4] [e4,g#4] [b3,e4]!2 f#4 g4@2 ~ [d4,g4] ~ [d4,g4] ~ [d4,g4] [b3,d4] [d4,g4] ~@2 [d4,g4] [b3,d4]!2 g4 ~, d4@4 ~@10 e4@3 ~@13 e4@3 ~@13 d4@3 ~@15]/4", // D Bm D Bm E C#m E C#m …
  F: "[f4 f#4@3 [d4,f#4] ~@3 [d4,f#4] ~ [b3,d4] [d4,f#4] [b3,d4]!2 f#4 g#4@2 [e4,g#4]!2 ~ [e4,g#4] ~ [e4,g#4] [c#4,e4] [e4,g#4] ~@2 [e4,g#4] [c#4,e4]!2 f#4 g#4@2 [e4,g#4]@3 [e4,g#4] [b3,e4] [e4,g#4] ~ [e4,g#4] ~ [b3,e4] [e4,g#4] [b3,e4]!2 f#4 g4@2 ~ [d4,g4] ~ [d4,g4] ~ [d4,g4] [b3,d4] [d4,g4] ~@2 [d4,g4] ~@4, d4@4 ~@10 e4@3 ~@13 e4@3 ~@13 d4@3 ~@15]/4", // D Bm D Bm E C#m E C#m …
})).s("gm_electric_guitar_muted").gain(0.18).pan(0.3)

// chords · electric guitar muted · soft notes
const electric_guitar_muted_2 = note(`<
  ~@25 A ~@2 B A ~@2 B A ~@2 B A ~@2 B ~@16 A ~@2 B A ~@2 B A ~@2 B A ~@2 B ~@20 A ~@2 B A ~@2 B A ~@2 B A ~@2 B A ~@2 B
  A ~@2 B A ~@2 C ~@2
>`.pickRestart({
  A: "~@6 [d4,f#4] ~@9", B: "~ [d4,g4] ~@12 b3 ~", C: "~ [d4,g4] ~@14",
})).s("gm_electric_guitar_muted").gain(0.13).pan(0.3)

// chords · electric guitar clean
const electric_guitar_clean = note("<A@5 B@20 C@16 B@16 C@16 B@16 C@32 ~@2>".pickRestart({
  A: "[~@14 f4 f#4@5 [d4,f#4] ~ [d4,f#4] ~ [d4,f#4] ~ [b3,d4] [d4,f#4] [b3,d4]!2 f#4 g4@2 [d4,g4]!2 ~ [d4,g4] ~ [d4,g4] [b3,d4] [d4,g4] ~@2 [d4,g4] [b3,d4]!2 f#4 g4@2 [d4,g4]@3 [d4,g4] [b3,d4] [d4,g4] ~ [d4,g4] ~ [b3,d4] [d4,g4] [b3,d4]!2 f4 f#4@2 [d4,f#4]!2 ~ [d4,f#4] ~ [d4,f#4] [b3,d4] [d4,f#4] ~@2 [d4,f#4] [b3,d4]!2 [b3,e4] ~, ~@14 d4@6 ~@10 d4@3 ~@13 d4@3 ~@13 d4@3 ~@15]/5", // D Bm D Bm G5 Bm G5 Bm …
  B: "[f4 f#4@3 [d4,f#4] ~ [d4,f#4] ~ [d4,f#4] ~ [b3,d4] [d4,f#4] [b3,d4]!2 f#4 g4@2 [d4,g4]!2 ~ [d4,g4] ~ [d4,g4] [b3,d4] [d4,g4] ~@2 [d4,g4] [b3,d4]!2 f#4 g4@2 [d4,g4]@3 [d4,g4] [b3,d4] [d4,g4] ~ [d4,g4] ~ [b3,d4] [d4,g4] [b3,d4]!2 f4 f#4@2 [d4,f#4]!2 ~ [d4,f#4] ~ [d4,f#4] [b3,d4] [d4,f#4] ~@2 [d4,f#4] [b3,d4]!2 [b3,e4] ~, d4@4 ~@10 d4@3 ~@13 d4@3 ~@13 d4@3 ~@15]/4", // D Bm D Bm G5 Bm G5 Bm …
  C: "~@4 [e4,e5]!2 ~@2 [e4,e5]@2 ~@6", // E
})).s("gm_electric_guitar_clean").gain(0.22).pan(0.3)

// other · piano
const piano_2 = note("<~@27 A@2 ~@6 A@2 ~@22 A@2 ~@4 B@8 ~@18 A@2 ~@4 B@24 ~ C>".pickRestart({
  A: "[~@7 b5@3 ~@6]/2", B: "[~@7 a5@8 g#5@8 g5@8 ~]/4", C: "~@14 [e4,a4,f5,g#5] ~",
})).s("gm_piano").gain(0.05)

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

// drums · clap
const clap = s("cp").struct("<~@25 A@7 B A@7 B ~@16 A@7 B A@7 B ~@20 A@11 B A@7 B A@7 C ~@2>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "~@2 x ~@2 x ~@2",
})).gain(0.5)

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

// drums · hihat
const hihat = s("hh").struct("<~ [x!8]!88 ~@4 [x!8]!27 [x!6 ~@2] ~@2>").gain(0.57)

// drums · crash
const crash = s("cr").struct(`<
  ~@9 A ~@15 A ~@3 A ~@3 A ~@3 A ~@3 A ~@15 A ~@3 A ~@3 A ~@3 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@5
>`.pickRestart({
  A: "x",
})).gain(0.43)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct(`<
  ~@5 A ~@2 A ~@3 A ~@3 A ~@3 A ~@2 A ~@20 A ~@3 A ~@3 A ~@2 A ~@67
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(2.73)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@25 A B A B A B A B A B A B A B A B ~@16 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 ~@4 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 ~@2
>`.pickRestart({
  A: "~ x ~@2 x ~@2 x ~ x ~@2 x ~@2 x", B: "~ x ~@2 x ~@2 x ~ x ~@5 x", C: "~ x ~@2 x ~@2 x ~ x ~@6",
})).gain(1.45)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~@26 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@5 A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4
>`.pickRestart({
  A: "~@3 x",
})).gain(0.36)

// drums · shaker
const shaker = s("sh").struct("<~@25 A@16 ~@16 A@16 B@16 ~@4 A@27 C ~@2>".pickRestart({
  A: "x!16", B: "x!2 ~ x!3 ~ x", C: "x!12 ~@4",
})).gain(0.21)

// drums · claves
const claves = s("clave:2").struct("<~@5 A ~@2 A ~@3 A ~@3 A ~@3 A ~@2 A ~@20 A ~@3 A ~@3 A ~@2 A ~@67>".pickRestart({
  A: "~ x ~@2",
})).gain(2.1)

// drums · woodblocks
const woodblocks = s("woodblock:5").struct(`<
  ~@5 A ~@2 A ~@3 A ~@3 A ~@3 A ~@2 A ~@20 A ~@3 A ~@3 A ~@2 A ~@67
>`.pickRestart({
  A: "~@3 x ~@4",
})).gain(0.62)

// drums · woodblocks
const woodblocks_2 = s("woodblock:4").struct(`<
  ~@5 A ~@2 A ~@3 A ~@3 A ~@3 A ~@2 A ~@20 A ~@3 A ~@3 A ~@2 A ~@67
>`.pickRestart({
  A: "~@7 x ~@8",
})).gain(0.62)

// drums · triangle
const triangle = s("triangles:30").struct(`<
  ~@5 A ~@2 A ~@3 A ~@3 A ~@3 A ~@2 A ~@20 A ~@3 A ~@3 A ~@2 A ~@67
>`.pickRestart({
// … 13 more lines

More by Jamiroquai