Strudelify

I Need You

3T

KeyF majorTempo122 bpm
0:00/0:00
// I Need You — 3T
// 122 bpm, 4/4, key F major. 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. Source detail keeps the original performance.
setcpm(122/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 · fretless bass
const bass = note(`<
  ~@17 A B A C D E F G D H D C I F J K L ~@15 D M A N A E O P D Q A N R F S T U M V Q W E X Y D B V H Z AA AB AC ~@15 AD
  AE AF B V AG F AH AI AJ AK B J AL AM U AN ~@10
>`.pickRestart({
  A: "f2@5 ~ f2 ~", B: "e2@5 ~ e2 ~", C: "bb2@8 a2@4 g2@3 ~", D: "f2@9 ~@3 f2@2 ~@2", E: "g2@5 ~ g2 ~",
  F: "a2@5 ~ a2 ~", G: "a2@9 ~@3 a2@2 ~@2", H: "c2@9 ~@3 c2@2 ~@2", I: "f2@7 ~ g2@8", J: "d2@9 ~@3 d2@2 ~@2",
  K: "bb1@7 ~ c2@6 ~@2", L: "f2 ~", M: "e2@10 ~@2 e2 ~@3", N: "bb2@2 a2 g2", O: "a2@3 e3", P: "a2@5 ~ g2 ~",
  Q: "c2@5 ~ c2 ~", R: "f2 g2", S: "d2@10 ~@2 d2 ~@3", T: "bb1@7 ~ c2@7 ~", U: "f2@9 ~@3 f2 ~@3", V: "d2@5 ~ d2 ~",
  W: "bb2@5 ~ bb2 ~", X: "c3@10 ~@2 c3 ~@3", Y: "c3@11 ~ g2@3 ~", Z: "bb2@7 ~", AA: "g2 f2", AB: "eb2@9 ~@3 eb2 ~@3",
  AC: "c2", AD: "d2@7 ~ d2@8", AE: "g2@9 ~@3 g2 ~@3", AF: "gb2@10 ~@2 gb2 ~@3", AG: "c3@5 ~ c3 ~",
  AH: "d3@10 ~@2 d3 ~@3", AI: "d2@11 ~ d2@3 ~", AJ: "g2@9 ~@3 g2@2 ~@2", AK: "gb2@5 ~ gb2 ~", AL: "c3@7 ~", AM: "a2 g2",
  AN: "d2",
})).s("gm_fretless_bass").gain(0.4)

// chords · piano
const piano = note(`<
  A B C D@2 E@2 F G B H D@2 I J K@2 L M L N L O P Q L M L N R S T U V ~@5 W X Y Z AA Y AB AC AD AE L M L N L O P Q L M L
  N R S T U AF AG AA AH AI AJ AK AL Y AM AA AH AN AO AD AP AQ AR AS@2 AT@2 AU@2 AV AR AW@2 AX ~@2 AY AZ BA BB BC BD BE
  BF BG BH BI BJ@2 BK BL BM BN BO BP@2 BQ BR@2 ~@2 BS@2
>`.pickRestart({
  A: "~@2 f4 g4", B: "a4", C: "~@3 c5, g4@15 ~", D: "[f4@23 ~ f4@2 e4@2 c4@2 a3@2]/2", E: "[d4@27 ~ e4@2 f4@2]/2",
  F: "f4", G: "e4@3 ~ f4@2 g4@2", H: "g4@3 c5", I: "d4", J: "bb4 a4", K: "[g4@15 ~]/2", L: "[c4,f4,a4]!2",
  M: "[c4,e4,g4]!2", N: "~@8 a4@4 g4@3 ~, [db4,f4,g4,bb4]@5 ~@3", O: "[d4,g4,bb4]!2", P: "[d4,e4,a4]!2",
  Q: "[db4,e4,a4]@8 [db4,e4,a4]@7 ~", R: "[c4,f4,a4]@3 ~ [d4,g4,bb4]@3 ~", S: "[d4,e4,a4] [db4,e4,a4]",
  T: "~ [e3,e4] f3 [a3,a4], [d3,d4,f4,a4]@9 ~@7", U: "~ [e4,e5] [f4,f5] g5, [d4,f4,g4,bb4,d5]@8 [c4,g4]@7 ~",
  V: "[a4,a5]", W: "~@4 bb3 c4 d4 f4", X: "e4@13 ~@3", Y: "~@4 c4@4 ~@4 c4@3 ~, [f4,a4]@8 [f4,a4]@7 ~",
  Z: "~@4 c4@3 ~@5 c4@3 ~, [e4,g4]@7 ~ c5@7 ~", AA: "~ d4 ~ d4, [f4,a4]!2", AB: "~ bb3 f4@2, [d4,f4]@2 d4 ~",
  AC: "[d4,g4,bb4] [c4,f4,a4]", AD: "[bb3,eb4,g4]@15 ~", AE: "[c4,e4,g4]@15 ~",
  AF: "~@4 c4@3 ~@5 c4@4, a5, [f4,a4]@7 ~ [f4,a4]@8", AG: "~ c4 ~ c4, [e4,g4] [e4,g4,c5]", AH: "~ c4 ~ c4, [f4,a4]!2",
  AI: "d4@3 ~ d4@4 ~@4 d4@3 ~, [f4,bb4]@8 [f4,bb4]@7 ~", AJ: "~ d4 ~ d4, [f4,g4,bb4]!2", AK: "~ c4 ~ c4, [f4,g4,c5]!2",
  AL: "~ c4 ~ c4, [e4,g4,c5]!2", AM: "~@4 c4@3 ~@5 c4@4, [e4,g4]@7 ~ [e4,g4,c5]@8", AN: "~ bb3 ~ bb3, [d4,f4,bb4]!2",
  AO: "[d4,g4,bb4]@7 ~ [c4,f4,a4]@7 ~", AP: "[c4,e4,g4]", AQ: "[f4,a4]@3 ~, a5", AR: "g5@3 c6", AS: "[f5@5 ~@3]/2",
  AT: "[d5@14 e5 f5]/2", AU: "[g5@19 ~@13]/2", AV: "a5", AW: "f5/2", AX: "d5@15 ~", AY: "[c4,d4,g4]@11 ~@5",
  AZ: "~@4 d4@3 ~@5 d4@4, [b4,b5], g4@7 ~ g4@8", BA: "~ d4 ~ d4, [gb4,a4] [gb4,a4,d5]", BB: "~ e4 ~ e4, [g4,b4]!2",
  BC: "~ d4 ~ d4, [g4,b4]!2", BD: "e4@3 ~ e4@4 ~@4 e4@3 ~, [g4,c5]@8 [g4,c5]@7 ~", BE: "~ e4 ~ e4, [g4,a4,c5]!2",
  BF: "~ d4 ~ d4, [g4,a4,d5]!2", BG: "~ d4 g5 [d4,gb5], [gb4,a4,d5]!2",
  BH: "~@4 d4@4 ~@4 d4@3 ~, g5@15 ~, [g4,b4]@8 [g4,b4]@7 ~", // G
  BI: "~@4 d4@3 ~@5 [d4,g5]@4, a5@3 ~, [gb4,a4]@7 ~ [gb4,a4,d5]@8", // G5 Gbm D
  BJ: "[~@3 e4 ~ d4 b4 [d4,d5], [g4,b4]!2 [g4,b4] g4, e5@3 e5@9 ~@4, ~ e4 ~@6]/2", BK: "~ c4 ~ c4, e5, [e4,g4,c5]!2",
  BL: "[e4,a4,c5]@7 ~ [d4,g4,b4]@7 ~", BM: "[c4,f4,a4]@15 ~", BN: "[d4,gb4,a4]", BO: "[g4,b4] [gb4,a4]",
  BP: "[~@29 d4@3, g2 a2, [g4,b4]!2 [gb4,a4]!2, ~@4 d4@7 ~ d4@7 ~ d4@7 ~@5]/2", // G Gbm
  BQ: "~@13 d4@3, ~ b2@15, ~ [g4,b4]@8 [g4,b4]@7, ~@5 d4@6 ~@5", // G
  BR: "[~@10 [eb5,g5]@13 ~@9, ~ [c3,eb4,g4,c5]@22 ~@9, ~@8 d6@15 ~@9, ~@9 c6@14 ~@9]/2", BS: "[~ g1@12 ~@3]/2",
})).s("gm_piano").gain(0.45).pan(0.4)

// other · accordion
const accordion = note(`<
  ~@32 A B C@2 D E F@2 A B G@2 H I J K ~@16 A B L@2 H E M@2 ~@3 N O ~ P@2 ~@17 Q R@3 S T@3 U V@3 W X@3 ~@10
>`.pickRestart({
  A: "~@4 [f3,f4]@2 [g3,g4] [f3,f4]", B: "[a3,a4]@8 ~@4 [f3,f4] ~ [f3,f4]@2",
  C: "[[g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~@2 [g3,g4]@3 [a3,a4]@2 ~ g3@3 [f3,f4]@2 [d3,d4]@3 ~ [d3,d4]@8, ~@7 g4@2 ~@7]/2", // G A F D
  D: "~@7 [f3,f4]@2 ~ a3@6, ~@9 a4@6 ~", E: "[g3,g4]@2 [f3,f4]@2 [d3,d4]@5 ~@3 [f3,f4] ~ [f3,f4] ~",
  F: "[[f3,f4] ~ [f3,f4] ~ [f3,f4] ~@2 [f3,f4]@2 [a3,a4]@3 ~@3 a3@3 [g3,g4]@11 ~@3, ~@6 bb4 a4@2 ~@7, ~@13 bb3@2 ~@17]/2", // F A G
  G: "[[g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4]@3 ~ [a3,a4]@2 [g3,g4]@4 [f3,f4]@2 [d3,d4]@3 ~ [d3,d4]@8]/2", // G A G F D
  H: "~@4 [f3,f4] [a3,a4]@3", I: "[g3,g4]@2 [f3,f4]@2 [d3,d4]@7 ~@5", J: "[bb3,bb4]@8 [a3,a4]@7 ~",
  K: "[a3,a4] [g3,g4]@7", // A G
  L: "[[g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4] ~ [g3,g4]@3 ~ [a3,a4]@2 [g3,g4]@4 [f3,f4]@2 [d3,d4]@2 ~@2 [d3,d4]@8]/2", // G A G F D
  M: "[[f3,f4] ~ [f3,f4] ~ [f3,f4] ~ [f3,f4]@2 [a3,a4]@3 ~ [bb3,bb4]@2 [a3,a4]@4 [g3,g4]@6 ~@8]/2", // F A Bb A G
  N: "~@8 [d4,f4,a4]@7 ~", O: "[f4,a4,c5]@7 ~ [c4,f4,a4]@7 ~",
  P: "[[d4,bb4,d5]@4 [c4,a4,c5]@5 [bb3,eb4,g4,bb4]@7, f4@17 ~@15]/2", Q: "~@3 [g3,g4]",
  R: "[[a3,a4]@11 ~ [b3,b4]@2 [a3,a4]@4 [g3,g4]@2 e4@3 ~ e4@14 ~@2 [g3,g4]@2 [b3,b4]@6, ~@10 e3@9 ~@5]/3", // A B A G B
  S: "[a3,a4] [g3,g4] [e3,e4]@4 [g3,g4]@2", // A G E G
  T: "[[g3,g4]@4 [g3,g4]@4 [b3,b4]@4 [c4,c5]@2 [b3,b4]@4 [a3,a4]@19 ~@3 [g3,g4]@4 [a3,a4]@2 [g3,g4]@2]/3", // G B C B A G A G
  U: "[b3,b4]@5 ~ [g3,g4]@2", V: "[[a3,a4]@12 [b3,b4]@2 [a3,a4]@4 [g3,g4]@2 [e3,e4]@17 ~@3 [g3,g4]@2 [b3,b4]@6]/3",
  W: "[a3,a4]@2 [g3,g4]@2 [e3,e4]@9 ~@3", X: "[[c4,c5]@4 [b3,b4]@5 a4@15, ~@9 a3@7 ~@8]/3",
})).s("gm_accordion").gain(0.35).pan(0.6)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~ A@2 B@6 A@2 C@4 D@2 E@5 F@7 G@4 H@2 I@8 J@3 K L@2 M@5 F@7 N@4 H@2 O@8 P@3 K Q@2 R@2 S@8 T@3 U V W@2 X Y@8 Z@3 AA
  AB@2 ~@10
>`.pickRestart({
  A: "[[f4,a4] [e4,g4], c4@31 ~]/2", B: "[d4 c4 ~@3 e4, f4 g4, a4@2 d4@3 ~, ~@32 bb3@32 c4@31 ~]/6",
  C: "[d4@2 c4@2 bb3@2 [f4,bb4] [c4,f4,a4], f4@3 ~, a4@4 d4@3 ~]/4", D: "[[bb3,eb4]@16 [c4,e4]@15 ~, g4@31 ~]/2",
  E: "[[f3,a3] [e3,g3] a3 [bb3,db4] [a3,c4], c4@3 ~@2, ~@2 f3@3]/5", // F Em Bbm Am
  F: "[[f3,bb3]@16 ~@16 db4@16 f3@15 ~ [e3,g3]@16 a3@16 [bb3,db4]@16, d4@2 ~ c4@3 ~, ~ a3@3 ~ f3@2, ~ e4@2 ~@4]/7", // Bb5 Em Bbm
  G: "[[a3,c4]@8 [f3,bb3]@8 ~@8 db4@8 ~@16 bb3@7 ~ [c4,e4,g4]@8, ~ d4@2 ~ [d4,f4]@3 ~, ~@16 a3@31 ~@17, ~@16 e4@15 ~@33]/4", // Am Bb5 C Dm
  H: "[[f4,a4] [e4,g4], c4]/2", // F Em
  I: "[d4@16 c4@15 ~@33 f4@16 e4@15 ~ [f4,a4]@16 [e4,g4]@16, f4@3 g4@3 c5@2, a4 [bb3,d4] c4@2]/8", // F Em Bb
  J: "[d4@15 ~ c4@15 ~ [bb3,d4,bb4]@15 ~, f4, a4@2 ~]/3", K: "[bb3,d4,g4,bb4] [a3,c4,f4,a4]",
  L: "[[bb3,eb4]@8 [c4,e4]@7 ~, [g3,g4]@31 ~]/2", M: "[[f3,a3] [e3,g3] a3 [bb3,db4] [a3,c4], c4@3 ~@2, ~@32 f3@47 ~]/5",
  N: "[[a3,c4] [f3,bb3] ~ db4 ~@2 bb3 [c4,e4,g4], ~ d4@2 ~ [d4,f4]@3 ~, ~@16 a3@31 ~@17, ~ e4 ~@2]/4", // Am Bb5 C Dm
  O: "[d4@16 c4@15 ~@33 f4@16 e4@16 [f4,a4]@16 [e4,g4]@16, f4@3 g4@3 c5@2, a4 [bb3,d4] c4@2]/8", // F Em Bb
  P: "[d4@15 ~ c4@16 [bb3,d4,bb4]@16, f4, a4@2 ~]/3", Q: "[[bb3,eb4] [c4,e4], [g3,g4]]/2",
  R: "[[f4,a4]@15 ~ [e4,g4]@16, c4@31 ~]/2", // F Em
  S: "[d4@16 c4@15 ~@33 f4@16 e4@15 ~ [f4,a4]@16 [e4,g4]@16, f4@47 g4@48 ~@33, a4 [d4,bb4] c4@2]/8", // F Em Gm
  T: "[d4@15 c4@15 ~@2 [d4,bb4]@15 ~, f4, a4@2 ~]/3", U: "[d4,g4,bb4] [c4,f4,a4]", V: "[bb3,eb4,g4]@15 ~",
  W: "[[c4,g4]@3 [gb4,a4] [g4,b4]@4, d4]/2", X: "[d4,gb4,a4]",
  Y: "[e4@16 d4@15 ~@33 g4@16 gb4@15 ~ [g4,b4]@16 [gb4,a4]@16, g4@3 a4@3 d5@2, b4 [c4,e4] d4@2]/8", // G Gbm C
  Z: "[e4@15 ~ d4@15 ~ [c4,e4,c5]@15 ~, g4@47 ~, b4@2 ~]/3", AA: "[c4,e4,a4,c5] [b3,d4,g4,b4]",
  AB: "[[c4,f4] [d4,gb4], [a3,a4]]/2", // F5 D A
})).s("gm_synth_strings_1").gain(0.3).pan(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@17 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@3 A B ~@15 C A B A B
  A B A B A B A B@3 A B ~@10
>`.pickRestart({
  A: "x ~@2 x", B: "x", C: "x!2",
})).gain(0.45)

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

// drums · clap
const clap = s("cp").struct("<~@96 [~@3 x]!2 ~ x [~ x ~@2]!2 x!10 ~@11>").gain(0.5)

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

// drums · open hat
const open_hat = s("oh").struct("<~@86 [~@5 x ~@2] ~@3 x ~ [~ x ~@2] ~@30>").gain(0.25)

// drums · ride
const ride = s("rd").struct(`<
  ~@16 A ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@15 A ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@4 C D
  ~@3 B ~@5 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ E ~@8
>`.pickRestart({
  A: "~@3 x", B: "~ x", C: "~ x!7", D: "~ x ~@2", E: "x",
})).gain(0.45)

// drums · tambourine
const tambourine = s("tb").struct("<~@16 [~ x] ~@31 [~ x] ~@74>").gain(0.45)

stack(bass, piano, accordion, synth_strings_1, kick, snare, clap, hihat, open_hat, ride, tambourine)

More by 3T