Strudelify
You Needed Me cover art

You Needed Me

Boyzone

KeyG majorTempo65 bpm
0:00/0:00
// You Needed Me — Boyzone
// 65 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 59 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(65/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · electric bass finger · "Bass"
const bass = note(`<
  ~@8 A B C D E F G H I J B C K E L M N O D P Q R S T Q U V W X B Y D Z L AA V AB J AC C K E L AD AE H K AF AG AH AI
>`.pickRestart({
  A: "~@4 d2!2 a1 d2", B: "g1@6 g1 ~ g1@6 g1 ~", C: "c2@6 g1 ~ c2 ~ c2@4 g1 ~", D: "d2@6 d2 ~ d2@6 d2 ~",
  E: "g1@3 g1@2 g1 d2 [g1,g2]", F: "b1@6 b1 ~ b1@6 b1 ~", G: "c2@3 ~ c2@3 ~ c2 ~ c2@2 c2@4", H: "a1@6 a1 ~ a1@7 ~",
  I: "d2@4 d2@3 ~ d2 ~ d2 ~ d2@3 ~", J: "d2@6 d2 ~ d2@2 d2@2 a1@2 d2@2", K: "d2@6 d2 ~ d2@7 ~", L: "b1@6 b1 ~ b1@7 ~",
  M: "c2@3 ~ c2@3 ~ c2 ~ c2@2 c#2@4", N: "g2@4 g2@4 b1 ~ b1@2 e2@3 ~", O: "a1@6 a1 ~ a1@6 a1 ~",
  P: "g1@6 g1 ~ g1@4 ~@2 f#1 ~", Q: "e2@6 e2 ~ g1@7 ~", R: "c2@6 g1 ~ g1@6 g1 ~", S: "a1@6 e2 ~ d2 ~ d2@4 a1 ~",
  T: "g1@6 g1 ~ b1@6 b1 ~", U: "c2@6 c2 ~ g1@7 ~", V: "a1@6 e2 ~ a1 ~ a1@4 e2 ~", W: "d2@6 d2 ~ d2@2 d2@2 a2@2 d2@2",
  X: "d2 ~@3", Y: "c2@6 c2 ~ c2@7 ~", Z: "g1@6 g1@4 g1 ~ d2@2 [g1,g2]@2", AA: "c2@3 ~ c2@4 c2 ~ c2@2 c2@4",
  AB: "d2@3 ~ d2@4 d2 ~ d2@2 d2@4", AC: "g1@6 d2 ~ g1 ~ g1@4 d2 ~", AD: "c2@4 c2@4 c2 ~ c2@2 c#2@4",
  AE: "g2@3 ~ g2@4 b1 ~ b1@2 e2@4", AF: "g1@6 g1 ~ e2@2 e2@2 b2@2 e2@2", AG: "a1@6 e2 ~ d2@6 d2 ~",
  AH: "g1@6 g1 ~ g1@2 g1@2 d2@2 g2@2", AI: "g1 ~",
})).s("gm_electric_bass_finger").gain(0.48)

// chords · piano
const piano = note(`<
  ~@8 A B C D E F G H I J K C L E F M N O L P Q R S T Q U V W X B C L Y F Z V I J K C L E F M AA AB L AC AD E ~
>`.pickRestart({
  A: "~@12 [f#3,a3,d4]@3 ~", B: "[g3,b3,d4]!4", C: "[g3,c4,e4]!4",
  D: "[f#3,a3,c4,d4]@2 [f#3,a3,c4,d4]@2 ~@3 [f#3,c4], ~@2 [f#3,c4,d4] d4, ~@10 a3@5 ~", // D7 F#dim D7
  E: "[g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@4 [g3,b3,d4]@3 ~", F: "[f#3,b3,d4]!4",
  G: "[g3,c4,f4]@2 [g3,c4,e4]@2 ~@3 e4, ~@2 [c4,e4] c4, ~@10 g3@5 ~", // Csus4 C
  H: "[g3,a3,c#4,e4]@2 [g3,a3,c#4,e4]@2 ~@3 [g3,c#4], ~@2 [g3,a3,c#4] a3, ~@10 e4@5 ~", // A7 Gdim A7
  I: "[g3,a3,d4] [f#3,a3,d4] [g3,a3,d4]!2", J: "[f#3,a3,d4]@3 ~ [f#3,a3,d4]@3 ~ [f#3,a3,d4]@4 [f#3,a3,d4]@3 ~",
  K: "[g3,b3,d4]@2 [g3,b3,d4]@2 ~@3 b3, ~@2 [g3,b3] g3, ~@10 d4@5 ~", L: "[f#3,a3,c4,d4]!4",
  M: "[g3,c4,f4] [g3,c4,e4]!2 [g3,c#4,e4]", N: "[g3,b3,d4]@3 ~ [g3,b3,d4]@4 ~@2 f#3@2 [g3,b3,e4]@4, ~@2 [b3,d#4] ~",
  O: "[a3,c#4,e4]!4", P: "[g3,b3,d4]@2 [g3,b3,d4]@2 [g3,b3,d4]@2 ~ d#4, ~@3 b3", Q: "[g3,b3,e4]!2 [g3,b3,d4]!2",
  R: "[g3,c4,e4]@2 [g3,c4,e4]@2 ~@3 b3, ~@2 [g3,b3] g3, ~@10 d4@5 ~", // C G
  S: "[g3,a3,c4,e4]@2 [g3,a3,c4,e4]@2 [g3,d4] ~@2 g3, ~@10 a3@5 ~, ~@3 d4", // Am7 G5
  T: "[g3,b3,d4]@2 [g3,b3,d4]@2 ~@2 b3 [a3,d#4], ~@2 [a3,b3,d#4] ~, ~@10 f#3@5 ~", U: "[g3,c4,e4]!2 [g3,b3,d4]!2",
  V: "[g3,a3,c#4,e4]!4", W: "[g3,a3,c4,d4]@3 ~ [g3,a3,c4,d4]@3 ~ [a3,c4,d4,f#4]@4 [a3,c4,d4,f#4]@3 ~",
  X: "[a3,c4,d4,f#4]@3 ~ [a3,c4,d4,f#4]@3 ~ [a3,c4,d4,f#4]@4 [a3,c4,d4,f#4]@3 ~", // D7
  Y: "[g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~", Z: "[g3,c4,f4] [g3,c4,e4]!3",
  AA: "[g3,b3,d4]@2 [g3,b3,d4]@2 [f#3,b3,d#4]@2 ~ g3, ~@3 e4", // G B
  AB: "[a3,c#4,e4]@2 [a3,c#4,e4]@2 ~@2 a3 c#4, ~@2 [a3,c#4] ~, ~@10 e4@5 ~", // A
  AC: "[g3,b3,d4]@3 ~ [g3,b3,d4]@3 ~ [g#3,b3,d4,e4]@4 [g#3,b3,d4,e4]@3 ~", AD: "[g3,a3,c#4,e4]!2 [f#3,a3,c4,d4]!2",
})).s("gm_piano").gain(0.44).pan(0.8)

// chords · acoustic guitar nylon · "Guitar"
const acoustic_guitar_nylon = note(`<
  A B C A D E F G C A B C A D H F I C A B C A D J K F C ~ L M N O L M P Q R A B C A D H F I C A B C A D J K F C S T A ~
>`.pickRestart({
  A: "~ d3 ~ d3 ~ d3 ~ d3, g3 [g3,b3] g3 [g3,b3]", B: "~ g3 ~ g3 ~ g3 ~ g3, c3 [c3,e3] c3 [c3,e3]",
  C: "~ a3 ~ a3 ~ a3 ~ a3, d3 [d3,f#3] d3 [d3,f#3]", D: "~ f#3 ~ f#3 ~ f#3 ~ f#3, b2@7 ~ b2@8, ~ [b3,d4] ~ [b3,d4]",
  E: "~ g3 ~ g3 ~ g3 ~ g3, c3@7 ~ c3@4 [c3,e3]@4, ~ [c4,f4] ~@2", F: "~ e3 ~ e3 ~ e3 ~ e3, a3 [a3,c#4] a3 [a3,c#4]",
  G: "~ a3 ~ a3 ~ a3 ~ a3, d3@7 ~ d3@4 [d3,f#3]@4, ~ [g3,d4] ~@2", H: "~ g3 ~ g3 ~ g3 ~ g3, [c3,c4,f4] [c3,e3]!3",
  I: "~ a3 ~ a3 ~ a3 ~ a3, [d3,g3,d4] [d3,f#3] d3@2, ~@2 [g3,d4]!2", // G5 D G5
  J: "~ g3 ~ g3 ~ g3 ~ g3, [c3,c4,f4] [c3,e3]!2 [c#4,e4]", // F5 C C#m
  K: "~ d3 ~ d3 ~ f#3 ~ b3, [g3,b3]!2 b2@2, ~@2 [b3,d#4] [g3,e4]", // G B C
  L: "~ b3 ~ b3 ~ d3 ~ d3, e3@7 ~@9, ~ [g3,e4] g3 [g3,b3]", // C G
  M: "~@2 g3@2 ~@2 g3@2 g3 ~ d3@2 ~@2 d3@2, c3 [c3,e3] ~ [g3,b3]", // C G
  N: "~ e4 ~ e4 ~ a3 ~ a3, a3 [a3,c4] d3@2, ~@3 [g3,d4]", O: "~ d3 ~ d3 ~ f#3 ~ f#3, g3 [g3,b3] b2@2, ~@3 [b3,d#4]",
  P: "~ e4 ~ e4 ~ e4 ~ e4, a3 [a3,c#4] a3 [a3,c#4]", Q: "~ a3 ~ a3 ~ a3 ~ a3, d3 [d3,g3] d3@2, ~@3 [f#3,d4]",
  R: "[d4,f#4]@14 a3 ~, a3 ~@15", S: "~ d3 ~ d3 ~ b3 ~ b3, g3 [g3,b3] e3@2, ~@3 [g#3,e4]",
  T: "~ e3 ~ e3 ~ a3 ~ a3, a3 [a3,c#4] d3 [d3,f#3]", // A D
})).s("gm_acoustic_guitar_nylon").gain(0.37).pan(0.3)

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

// drums · snare
const snare = s("sd").struct("<~@8 A B@3 C B@4 C B@3 D B@5 ~ B@8 ~ B@12 C B@5 E B C ~>".pickRestart({
  A: "~@11 x!2 ~ x ~", B: "~ x ~ x", C: "~@6 x ~@4 x!2 ~ x ~", D: "~@2 x ~@2 x!2 ~", E: "~@4 x ~ x ~@4 x!2 ~ x ~",
})).gain(0.45).pan(0.6)

// drums · low tom
const low_tom = s("lt").struct("<~@35 [~@7 x] ~@4 [~@7 x] ~@4 [~@7 x] ~@13>").gain(0.4).pan(0.6)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@35 [~@11 x!3 ~@2] ~@4 [~@11 x!3 ~@2] ~@4 [~@11 x!3 ~@2] ~@13>").gain(0.35).pan(0.6)

// drums · open hat
const open_hat = s("oh").struct("<~@36 [~@7 x] ~@2 [~@7 x] ~@19>").gain(0.35).pan(0.6)

// drums · high tom
const high_tom = s("ht").struct("<~@35 [~ x] ~@4 [~@5 x!2 ~ x ~@7] ~@4 [~@5 x!2 ~ x ~@7] ~@13>").gain(0.35).pan(0.6)

// drums · crash
const crash = s("cr").struct("<~@9 A ~@3 A ~@4 A ~@3 A ~@13 A ~@4 A ~@4 A ~@3 A ~@5 A ~ A>".pickRestart({
  A: "x",
})).gain(0.35).pan(0.6)

// drums · ride
const ride = s("rd").struct("<~@13 A@4 ~ A@3 ~ A@5 ~ A@7 ~@6 A@4 ~ A@3 ~ A@5 ~ A ~@2>".pickRestart({
  A: "x!2 ~ x!3 ~ x",
})).gain(0.3).pan(0.6)

// drums · tambourine
const tambourine = s("tb").struct("<~@13 A@4 ~ A@3 ~ A@5 ~ A@7 ~@6 A@4 ~ A@3 ~ A@5 ~ A ~@2>".pickRestart({
  A: "x!8",
})).gain(0.4).pan(0.6)

stack(
  bass, piano, acoustic_guitar_nylon, kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, ride, tambourine
)

More by Boyzone