Strudelify

Whatcha Gonna Do With My Lovin'

Inner City

KeyB minorTempo109 bpm
0:00/0:00
// Whatcha Gonna Do With My Lovin' — Inner City
// 109 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 116 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(109/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 · piano
const piano = note(`<
  A B A C A B A C A B A C A B A C A B A C A B A D E F E F E F G F E F H F A B A C A B A C A B A C A B A C A B A C A B A
  D E F E F E F G F E F H F A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A I
>`.pickRestart({
  A: "~@7 [a3,b3,d4,f#4]@9", B: "~@2 [g3,b3,d4,f#4] [a3,c#4,e4,a4]", C: "~@2 [f#3,b3,d4] [e3,a3,c#4]",
  D: "~ [a3,c#4,e4]", E: "[b3,d4,g4]", F: "[a3,c#4,e4]@7 [a3,d4,f#4]@9", G: "[b3,e4,g4]", H: "[c4,e4,g4,b4]",
  I: "~@2 b3 ~ d4!2 b3 ~ d4 ~ b3 ~ a3 b3 ~@2",
})).s("gm_piano").gain(0.4)

// other · piano
const piano_2 = note("<~@88 A@3 B C D E F G H I J K L K M ~@12>".pickRestart({
  A: "f#4 g4 a4 b4 f#4 g4 a4 b4", B: "f#4 g4 a4 b4!2 d5 c#5 a4", C: "b4@2 c#5@2 c#5@2 b4@2 b4@2 d5@2 d5 c#5 b4@2",
  D: "e5 d5 c#5@2 b4@2 b4@2 a5 b5 ~@2 b4@2 c#5 d5", E: "d5 c#5 b4 ~ d5 c#5 ~ b4 ~ e5 ~ c#5 ~ b4 f#4 g4",
  F: "a4 d5 c#5 ~ b4 ~ f#4 g4 ~ a4 ~ d5 ~ c#5 b4 c#5", G: "~ d5@2 c#5@2 b4@2 a4 d5 c#5 b4 g4 a4 g4 f#4 g4",
  H: "e4@2 f#4@2 g4@2 a4@2 f#4@2 g4@2 a4@2 b4 e5", I: "c#5@2 a4 b4 f#4 a4 c#5 d5 e5 b4 a4 d5 c#4 f#4 a4 e5",
  J: "c#5@2 c#6 d6 e6 f#6 [a6,c#7] b6!3 a6 [f#6,g6] e6 ~ c#6 d6", // A Gmaj7
  K: "e6 d6 c#6 a5 b5@2 c#6 d6 e6 d6 c#6 a5 b5@2 c#6 d6", L: "e6 d6 c#6 a5 c#6 b5 a5 f#5 e5 f#5 g5 a5 b5@2 c#6 d6",
  M: "e6 d6 c#6 a5 b5 ~ e6 d6 c#6 b5 a5 g5 f#5 e5 c#5 b4",
})).s("gm_piano").gain(0.4)

// bass · synth bass 2
const bass = note(`<
  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 E D E D F G A H F G 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 E D E D F G A H F G 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 I J I J A B A B A B A B A B A K
>`.pickRestart({
  A: "e1 ~@3 e1 ~@2 e1!2 ~ e1 ~ e1!2 ~@2", B: "e1 ~@3 e1 ~ e1 g1!2 ~ g1 ~ a1 ~ a1 ~",
  C: "e1 ~@3 e1 ~@2 e1!2 ~ e1 ~ e1 ~ d1 ~", D: "e1 ~@3 e1 ~@2 a1!2 ~ a1 ~ b1 ~ b1 ~",
  E: "e1 ~@3 e1 ~@2 e1!2 ~ e1 ~ e1 d1 ~@2", F: "c2 ~@3 c1 ~@2 c1!2 ~ c1 ~ c1!2 ~@2",
  G: "a1 ~@3 a1 ~@2 f#1!2 ~ f#1 ~ b1 ~ b1 ~", H: "f#1 ~@3 f#1 ~@2 b1!2 ~ b1 ~ b1!2 ~@2",
  I: "e1 ~@3 e1 ~@2 e1 ~@2 e1 ~@2 e1 ~@2", J: "e1 ~@3 e1 ~ e1 g1@2 ~ g1 ~ a1 ~ a1 ~",
  K: "e1@6 b1@2 d2 ~ b1 ~ a1 b1 ~@2",
})).s("gm_synth_bass_2").gain(0.45)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  A@16 ~@7 B C D C D C D E D C D E D A@16 ~@7 B C D C D C D E D C D E D A@24 F@8 A@8 ~@4
>`.pickRestart({
  A: "[b3,d4,f#4]/8", B: "~ [a3,c#4,e4]", C: "[b3,d4,g4]", D: "[a3,c#4,e4] [a3,d4,f#4]", E: "[b3,e4,g4]",
  F: "[~@31 [a3,c#4,e4], [b3,d4,f#4]]/8", // A Bm
})).s("gm_string_ensemble_1").gain(0.2).pan(0.3)

// other · string ensemble 1
const string_ensemble_1_2 = note("<~@7 A ~@5 B ~@29 C ~@5 B ~@29 C ~@35 C>".pickRestart({
  A: "~@6 b4 ~ d5 ~ b4 ~ a4 b4 ~@2", B: "~@6 [b4,b5] ~@5 [b4,b5]!2 ~@2", C: "~@6 b5 ~ d6 ~ b5 ~ a5 b5 ~@2",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.7)

// chords · flute
const flute = note("<~@36 A B C D A B C E ~@28 A B C D A B C E ~@32 A B ~@2>".pickRestart({
  A: "~@12 [d6,f#6] [a5,d6] [b5,e6] [d6,f#6]", B: "[a5,d6]", C: "~@12 f#6 d6 b5 g5", D: "f#5",
  E: "f#5@6 b5 ~ d6 ~ b5 ~ a5 b5 ~@2",
})).s("gm_flute").gain(0.25)

// other · brass section
const brass_section = note(`<
  ~@7 A ~@28 B C B C B C B D ~@28 B C B C B C B D ~@24 B C B C B C B C B C B D
>`.pickRestart({
  A: "~@6 b4 ~ d5 ~ b4 ~ a4 b4 ~@2", B: "~@2 b4 ~ d5!2 b4 ~@3 b4 ~ d5!2 b4 ~",
  C: "~@2 b4 ~ d5!2 b4 ~ d5 ~ b4 d5 ~ e5 f#5 ~", D: "~@2 b4 ~ d5!2 b4 ~ d5 ~ b4 ~ a4 b4 ~@2",
})).s("gm_brass_section").gain(0.64)

// chords · clarinet
const clarinet = note(`<
  ~@24 A B ~@2 C D ~@2 A E ~@26 A B ~@2 C D ~@2 A E ~@10 F G@2 ~@5 F G@2 ~@5 F G@2 ~@5 F G@2 ~@9
>`.pickRestart({
  A: "d5@2 d5 ~ d5 ~ d5 ~ d5@2 c#5@2 b4@2 c#5@2", B: "d5@2 c#5@11 ~@3", C: "d5 ~ d5 ~ d5 ~ d5 ~ d5@2 c#5@2 b4@2 c#5 d5",
  D: "d5 c#5@5 ~@2", E: "d5 c#5@3 ~@4", F: "~@2 [b4,d5]!5 ~ [b4,d5]!4 [b4,d5]@3 ~",
  G: "[~@8 d4 ~ b3 ~ d4 ~ d4 f#4@6 ~@11]/2",
})).s("gm_clarinet").gain(0.4)

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

// drums · snare
const snare = s("sd").struct(`<
  [~@4 x ~@2 x ~@4 x ~@2 x]!100
  ~@3
  [~@4 x ~@2 x ~@4 x ~@2 x]!12
  [~@4 x ~@2 x!2 ~ x ~ x!2 ~@2]
>`).gain(0.45)

// drums · hihat
const hihat = s("hh").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 ~@4 A B A B A B A B A B A C
>`.pickRestart({
  A: "x!8", B: "x ~ x ~ x ~ x ~ x ~ x ~ x!4", C: "x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~@2",
})).gain(0.25)

// drums · crash
const crash = s("cr").struct(`<
  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 ~@3 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.45)

// drums · tambourine
const tambourine = s("tb").struct("~ x ~ x").gain(0.4)

// drums · congas
const congas = s("conga:13").struct("<~@24 [~ x ~@3 x ~@2]!20 ~@16 [~ x ~@3 x ~@2]!40 ~@16>").gain(1.27)

// drums · congas
const congas_2 = s("conga:18").struct("<~@24 [~@4 x!2 ~@6 x!2 ~@2]!20 ~@16 [~@4 x!2 ~@6 x!2 ~@2]!40 ~@16>").gain(1.27)

// drums · congas
const congas_3 = s("conga:33").struct("<~@24 [~@6 x!2 ~@6 x!2]!20 ~@16 [~@6 x!2 ~@6 x!2]!40 ~@16>").gain(1.27)

stack(
  piano, piano_2, bass, string_ensemble_1, string_ensemble_1_2, flute, brass_section, clarinet, kick, snare, hihat,
  crash, tambourine, congas, congas_2, congas_3
)

More by Inner City