Strudelify

Feel the Need In Me

Detroit Emeralds

KeyA majorTempo122 bpm
0:00/0:00
// Feel the Need In Me — Detroit Emeralds
// 122 bpm, 4/4, key A major. 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 109 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. 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.

// other · piano
const piano = note("<~@78 [~@12 a4 ~@3] ~@30>").s("gm_piano").gain(0.31)

// bass · fretless bass
const bass = note(`<
  ~ A B A B A B A C@2 D E F G@2 H I@2 J K L M N O P Q R S T U V W X@2 D E Y Z AA AB AC@2 AD AE AF AG AH AI B AI B AI B
  AI B AI B AI AJ@2 J AK L AL AM AN AC@2 AO E AP AQ AR AS AT AU AV AN S AU AW AN AX@2 D K L AY AM AZ AX@2 D E BA BB BC
  AI B AI B AI B AI B AI B AI BD
>`.pickRestart({
  A: "a1@2 a2@2 g2@2 f#2@2 e2 ~ d2 ~ c2@2 a1@2", B: "~ c2 ~ d2 ~ c2 ~ g1",
  C: "[~@2 c2@3 ~ g1@2 a1@2 b1 ~ c#2 ~ d2@6 ~@2 d2 ~ d2@2 d2 ~@3 f#2 ~]/2", D: "f#2@5 ~ f#2 ~ f#2@2 f#2 ~@3 c#2 ~",
  E: "c#2@5 ~ c#2 ~ c#2@2 c#2 ~@3 b1 ~", F: "b1@5 ~ b1 ~ b1@2 b1@2 ~@2 b1 ~",
  G: "[b1@5 ~ b1 ~ b1 ~ b1 ~ b1 ~ d2@6 ~@2 d2 ~ d2 ~ d2 ~ d2 ~ a1 ~]/2", H: "a1@4 ~@2 a1 ~ a1@2 g1 ~ g1 ~ a1 ~",
  I: "[a1@2 a1 ~@3 g1 ~ a1@2 b1 ~ c#2 ~ d2@6 ~@2 d2 ~ d2@2 d2 ~@3 f#1 ~]/2", J: "f#1@5 ~ f#1 ~ f#1@2 f#1 ~@3 c#2 ~",
  K: "c#2@5 ~ c#2 ~ c#2 ~ c#2 ~@3 b1 ~", L: "b1@5 ~ b1 ~ b1@2 b1 ~@3 b1 ~", M: "b1@4 ~@2 b1 ~ b1 ~ b1 ~@3 d2 ~",
  N: "d2@4 ~@2 d2 ~ d2 ~ d2 ~ d2 ~ a1 ~", O: "a1 ~ a1@3 ~ a1 ~ a1 ~ g1@3 ~ a1 ~", P: "a1@5 ~ a1 ~ a1 ~ a1 ~ a1 ~ g1 ~",
  Q: "g1@5 ~ g1 ~ g1 ~ g1@2 ~@2 a#1 ~", R: "a#1 ~ a#1@3 ~ a#1 ~ a#1@2 f1 ~ f1 ~ a1 ~",
  S: "a1@5 ~ a1 ~ a1 ~ a1@3 ~ g1 ~", T: "a1 ~ a1@3 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", U: "g1 ~ g1@4 g1 ~ g1 ~ g1 ~ g1 ~ g1@2",
  V: "a#1 ~ a#1@3 ~ a#1 ~ a#1 ~ a#1 ~ a#1 ~ a1 ~", W: "a1 ~ a1@3 ~ a1 ~ a1 ~ a1@3 ~ a1 ~",
  X: "[a1 ~ a1 ~ a1 ~ a1 ~ a1@2 b1 ~ c#2 ~ d2@7 ~ d2 ~ d2 ~ d2@3 ~ f#2 ~]/2", Y: "b1@5 ~ b1 ~ b1@2 b1 ~@3 f#1 ~",
  Z: "b1@5 ~ b1 ~ b1 ~ b1 ~ b1 ~ d2 ~", AA: "d2@5 ~ d2 ~ d2 ~ d2@2 ~@2 a1 ~", AB: "a1@5 ~ a1 ~ a1 ~ g1@3 ~ a1 ~",
  AC: "[a1@6 g1 ~ a1@2 b1 ~ c#2 ~ d2@6 ~@2 d2 ~ d2@2 d2 ~@3 f#2 ~]/2", AD: "f#2@5 ~ f#2 ~ f#2@2 f#2 ~@3 e2 ~",
  AE: "c#2@4 ~@2 c#2 ~ c#2 ~ c#2@4 b1 ~", AF: "b1@5 ~ b1 ~ b1 ~ b1@3 ~ b1 ~", AG: "b1@5 ~ b1 ~ b1 ~ b1@3 ~ d2 ~",
  AH: "d2@5 ~ d2 ~ d2 ~ d2@3 ~ g1@2", AI: "a1 a2 g2 f#2 e2 d2 c2 a1",
  AJ: "[~@2 c2@4 g1@2 a1@2 b1 ~ c#2 ~ d2@6 ~@2 d2 ~ d2@2 d2 ~@3 f#1 ~]/2", AK: "c#2@5 ~ c#2 ~ c#2@2 c#2@2 ~@2 b1 ~",
  AL: "b1@5 ~ b1 ~ b1 ~ b1 ~@3 d2 ~", AM: "d2@4 ~@2 d2 ~ d2 ~ d2 ~@3 a1 ~", AN: "a1@5 ~ a1 ~ a1 ~ a1@3 ~ a1 ~",
  AO: "f#2@5 ~ f#2 ~ f#2@2 f#2@2 ~@2 e2 ~", AP: "b1@5 ~ b1 ~ b1 ~ b1@2 ~@2 b1 ~", AQ: "b1@5 ~ b1 ~ b1 ~ b1@2 ~@2 d2 ~",
  AR: "d2@5 ~ d2 ~ d2@2 d2 ~@3 a1 ~", AS: "a1@5 ~ a1 ~ a1 ~ g1@4 a1 ~", AT: "a1@5 ~ a1 ~ a1 ~ a1@3 ~ g1@2",
  AU: "g1@5 ~ g1 ~ g1 ~ g1@4 a#1 ~", AV: "a#1@5 ~ a#1 ~ a#1 ~ a#1@4 a1 ~", AW: "a#1@5 ~ a#1 ~ a#1 ~ f1@4 a1 ~",
  AX: "[a1@5 ~ g1 ~ a1@2 b1 ~ c#2 ~ d2@6 ~@2 d2 ~ d2@2 d2 ~@3 f#2 ~]/2", AY: "b1@5 ~ b1 ~ b1@2 b1@2 ~@2 d2 ~",
  AZ: "a1@4 ~@2 a1 ~ a1 ~ g1@3 ~ a1 ~", BA: "b1@5 ~ f#1 ~ b1@2 b1 ~@3 b1 ~", BB: "b1@5 ~ b1 ~ b1@2 b1 ~@3 d2 ~",
  BC: "d2@4 ~@2 d2 ~ d2 ~ d2 ~@3 g1 ~", BD: "~@6 a2@3 ~@7",
})).s("gm_fretless_bass").gain(0.4)

// chords · rock organ
const rock_organ = note(`<
  ~ A B A B A B C D@5 E@2 F@6 E@2 G@2 H@7 I@5 E@2 F@6 E@2 J K J K J K J K J K J L@5 E@2 F@6 E@2 G@2 H@7 I@5 E@2 F@6 E@2
  J K J K J K J K J K M N
>`.pickRestart({
  A: "~@4 [c#5,e5,a5]@4 ~@4 [c#5,e5,a5]@2 [c#5,e5,a5] ~", B: "~ [g4,c5,e5] ~ [a4,d5,f#5] ~ [g4,c5,e5] ~@2",
  C: "~@2 [c#5,e5,a5]@2 ~@2 [c#5,e5,a5]!2", // A
  D: "[[c#5,e5,a5] ~@13 [d5,f#5,a5]@16 [c#5,f#5,a5]@15 ~ [c#5,f5,g#5]@16 [b4,d#5,f#5]@17 ~]/5", // A D F#m C# B
  E: "[[b4,d5,f#5]@14 [d5,f#5,a5]@17 ~]/2", // Bm D
  F: "[[c#5,e5,a5]@9 ~ [b4,d5,g5]@2 ~@2 [c#5,e5,a5]@8 ~@8 [d5,f#5,a5]@16 [c#5,f#5,a5]@15 ~ [c#5,f5,g#5]@16 [b4,d#5,f#5]@17 ~]/6", // A G A D F#m C# B
  G: "[[c#5,e5,a5]@9 ~ [b4,d5,g5]@2 ~@2 [a4,c#5,e5]@18]/2", // A G A
  H: "[[g4,b4,d5]@7 [a#4,d5,f5]@8 [a4,c#5,e5]@16 [g4,b4,d5]@8 [a#4,d5,f5]@8 [a4,c#5,e5]@9]/7", // G A# A G A# A
  I: "[~@14 [d5,f#5,a5]@16 [c#5,f#5,a5]@15 ~ [c#5,f5,g#5]@16 [b4,d#5,f#5]@17 ~]/5", // D F#m C# B
  J: "~@4 [c#5,e5,a5]@2 [c#5,e5,a5] ~@5 [c#5,e5,a5]@2 [c#5,e5,a5] ~", // A
  K: "~@2 [g4,e5] ~@3 [a4,d5,f#5]@2 ~@2 [g4,c5,e5]@2 ~@4, ~ c5 ~@6", // C D C
  L: "[[c#5,e5,a5]@2 ~@12 [d5,f#5,a5]@16 [c#5,f#5,a5]@15 ~ [c#5,f5,g#5]@16 [b4,d#5,f#5]@17 ~]/5", // A D F#m C# B
  M: "~@4 [c#5,e5,a5]@2 [c#5,e5,a5] ~@5 [b4,d5,g5]@2 [a4,c#5,e5] ~", N: "~@3 [a5,a6] ~@4",
})).s("gm_rock_organ").gain(0.3).pan(0.7)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A B A B A C A C D ~@15 E@8 F ~@13 A C A C A C A C A C A C D ~@15 G@8 F ~@13 A C A C A C A C A C A C H
>`.pickRestart({
  A: "~@7 [b3,d4,g4]", B: "[c#4,e4,a4]!4 ~ [b3,d4,g4] ~ [c#4,e4,a4]", C: "[c#4,e4,a4]!4 ~ [b3,d4,g4] [c#4,e4,a4]!2",
  D: "[c#4,e4,a4] ~@7", // A
  E: "[~@14 [g3,b3,d4]@4 [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2 ~@2 [a#3,d4,f4]@4 [a#3,d4,f4]@2 [a#3,d4,g4]@2 [a#3,d4,f4]@2 [a#3,d4,g4]@2 [a#3,d4,f4]@2 ~@2 [a3,c#4,e4]@4 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4]@4 [a3,c#4,e4]@2 e4 f#4 a4 ~ c5@2 a4 ~@3 [g3,b3,d4]@4 [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2 ~@2 [a#3,d4,f4]@4 [a#3,d4,f4]@2 [a#3,d4,g4]@2 [a#3,d4,f4]@2 [a#3,d4,g4]@2 [a#3,d4,f4]@2 ~@2 [a3,c#4,e4]@4 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4]@2]/8", // G Em G Em G A# Gm A# …
  F: "~ [a3,c#4,e4]!5 ~@2", // A
  G: "[~@14 [g3,b3,d4]@4 [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2 ~@2 [a#3,d4,f4]@4 [a#3,d4,f4]@2 [a#3,d4,g4]@2 [a#3,d4,f4]@2 [a#3,d4,g4]@2 [a#3,d4,f4]@2 ~@2 [a3,c#4,e4]@4 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4]@4 [a3,c#4,e4]@2 e4 f#4 a4 ~ c5@2 c5 ~@3 [g3,b3,d4]@4 [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2 [g3,b3,e4]@2 [g3,b3,d4]@2 ~@2 [a#3,d4,f4]@4 [a#3,d4,f4]@2 [a#3,d4,g4]@2 [a#3,d4,f4]@2 [a#3,d4,g4]@2 [a#3,d4,f4]@2 ~@2 [a3,c#4,e4]@4 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 [a3,c#4,e4]@2 ~@2 [a3,c#4,e4]@2]/8", // G Em G Em G A# Gm A# …
  H: "~@3 [a3,a4] ~@4", // A
})).s("gm_electric_guitar_clean").gain(0.2).pan(0.3)

// chords · brass section
const brass_section = note(`<
  ~@2 A ~ A ~ A ~ B@2 ~@5 C@3 ~@2 D@2 ~ E@5 F G ~@2 B@2 ~@3 H@6 ~@2 I@2 ~ A ~ A ~ A ~ A ~ J K B@2 ~@5 C@3 ~@2 D@2 ~ E@5
  F G ~@2 B@2 ~@3 H@6 ~@2 I@2 ~ A ~ A ~ A ~ A ~ J K L
>`.pickRestart({
  A: "~ [e4,g4,c5] ~ [f#4,a4,d5] ~ [e4,g4,c5] ~@2", // C D C
  B: "[~@6 [g3,g4] ~ [a3,a4] ~ [b3,b4] ~ [c#4,c#5] ~ [f#4,a4,d5]@8 ~@10]/2", // G A B C# D
  C: "[~@10 [b3,d4,g4] ~@3 [c#4,e4,a4]@6 ~@2 [g3,g4] ~ [a3,a4] ~ [b3,b4] ~ [c#4,c#5] ~ [f#4,a4,d5]@8 ~@10]/3", // G A G A B C# D
  D: "[~@8 c#5@2 b4 ~ f#4 ~ a4@9 ~@9]/2",
  E: "[~@10 [b3,d4,g4] ~@3 [c#4,e4,a4]@10 ~@2 [c#4,e4,a4] ~@3 [b3,d4,g4]@14 ~@2 [d4,f4,a#4]@14 ~@2 [c#4,e4,a4]@17 ~]/5", // G A G A# A
  F: "~@8 c5@2 c5 ~ a4@2 g4 ~", G: "a4@2 a4 ~ g4 ~@11",
  H: "[~@6 [b3,b4]@3 ~ [f#3,f#4] ~ [a3,a4]@16 ~@2 [a3,a4]@10 ~@2 [g3,g4]@2 ~@2 [a3,a4]@6 ~@2 [g3,g4] ~ [a3,a4] ~ [b3,b4] ~ [c#4,c#5] ~ [f#4,a4,d5]@8 ~@8 [f#4,a4,c#5]@14 ~@4]/6", // B F# A G A G A B …
  I: "[~@6 [b3,b4]@3 ~ [f#3,f#4] ~ [a3,a4]@19 ~]/2", J: "~ [g4,c5,e5] ~ [a4,d5,f#5] ~ [g4,c5,e5] ~ [g3,g4]",
  K: "[a3,a4] ~ [a4,a5] ~ [g4,g5]@2 [f#4,f#5] ~ [e4,e5] ~ [d4,d5] ~ [c4,c5] ~ [a3,a4]@2", L: "~@3 [a4,a5] ~@4",
})).s("gm_brass_section").gain(0.64).pan(0.8)

// other · baritone sax
const baritone_sax = note("<~ A B A B A B A B ~@38 A B A C D E F E F G ~@40 A B A C H E H E H E I J>".pickRestart({
  A: "~@7 g2", B: "a2 ~@7", C: "a2 ~@6 g2", D: "a2 ~ a3 ~ g3@2 f#3 ~ e3@2 d3@2 c3 ~ g2@2", E: "a2 ~@13 g2@2",
  F: "a2 ~ a3 ~ g3@2 f#3 ~ e3@2 d3 ~ c3@2 g2@2", G: "a2 ~@15", H: "a2 ~ a3 ~ g3@2 f#3 ~ e3@2 d3@2 c3@2 g2@2",
  I: "a2 ~ a3 ~ g3 ~ f#3 ~ e3 ~ d3 ~ c3 ~ a2@2", J: "~@3 a2 ~@4",
})).s("gm_baritone_sax").gain(0.64).pan(0.8)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@4 A B@2 C@2 ~@7 D ~@4 E@4 F@7 G@5 ~@9 H ~@4 I J I K B@2 C@2 ~@7 D ~@4 E@4 F@7 G@5 ~@9 H ~@4 I J I K B@2 L M
>`.pickRestart({
  A: "~@7 [g3,g4]", // G
  B: "[[a3,a4] ~ [a4,a5] ~ [g4,g5] ~ [f#4,f#5] ~ [e4,e5]@2 [d4,d5] ~ [c4,c5] ~ [a3,a4]@14 ~@2 [g3,g4]@2]/2", // A G F# E D C A G
  C: "[[a3,a4] ~ [a4,a5] ~ [g4,g5] ~ [f#4,f#5] ~ [e4,e5]@2 [d4,d5] ~ [c4,c5] ~ [a3,a4]@9 ~@9]/2", // A G F# E D C A
  D: "~@6 g4 ~ a4 ~ b4 ~ c#5 ~@3", E: "[~@6 b4@3 ~ f#4 ~ a4@15 ~ f#4 ~ a4@26 ~@4 a4 [b4,c#5] d5 [e5,f#5]]/4",
  F: "[g5@9 ~ a5 ~ c6 ~ a#5@13 ~ c6 ~ a5@11 ~ g5 ~@3 a5@14 ~@2 g5@11 ~ a5 ~ c6 ~ a#5@13 ~ c6 ~ a5@11 ~ g5 ~@3 a5@2]/7",
  G: "[~@6 g5 ~ a5 ~ b5 ~ c#6 ~ d6@14 ~@2 c#6@13 ~ a5 ~ b5@14 g#5 ~ a5@17 ~]/5", H: "~@6 b5@3 ~ f#5 ~ a5@4",
  I: "[a4,a5] ~ [a4,a5] ~ [a4,a5]@3 ~ [a4,a5] ~ [a4,a5] ~ [a4,a5]@3 ~", J: "~@2 [c5,e5] ~@3 [d5,f#5] ~@3 [c5,e5] ~@5",
  K: "~@2 [c5,e5] ~@3 [d5,f#5] ~@3 [c5,e5] ~@3 [g3,g4]@2", // C D C G
  L: "[a3,a4] ~ [a4,a5] ~ [g4,g5] ~ [f#4,f#5] ~ [e4,e5]@2 [d4,d5] ~ [c4,c5] ~ [a3,a4] ~", M: "~@3 [a4,a6] ~@4",
})).s("gm_string_ensemble_1").gain(0.35).pan(0.2)

// other · string ensemble 1 · soft notes
const string_ensemble_1_soft = note("<~@16 A@5 ~@45 B@5 ~@38>".pickRestart({
  A: "[~@14 [f#4,a4,d5]@15 ~ [f#4,a4,c#5]@14 ~@2 [f4,g#4,b4]@15 ~ [d#4,f#4,a4]@17 ~]/5", // D F#m Fdim D#dim
  B: "[~@14 [f#4,a4,d5]@14 ~@2 [f#4,a4,c#5]@14 ~@2 [f4,g#4,b4]@15 ~ [d#4,f#4,a4]@17 ~]/5", // D F#m Fdim D#dim
})).s("gm_string_ensemble_1").gain(0.2).pan(0.2)

// other · tremolo strings
const tremolo_strings = note("<~@3 A@2 ~@42 B@4 ~@46 B@4 ~@8>".pickRestart({
  A: "[a5@7 ~]/2", B: "a5/4",
})).s("gm_tremolo_strings").gain(0.35).pan(0.2)

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

// drums · snare
const snare = s("sd").struct("<~ A@7 B A@29 B A@7 B A@11 C A@5 B A@13 B A@9 B A@7 B A@10 D E>".pickRestart({
  A: "~ x ~ x", B: "~@2 x ~@2 x!2 ~", C: "~@2 x!11 ~ x ~", D: "~@4 x ~@5 x!5 ~", E: "~ x!2 ~@5",
})).gain(0.4)

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

// drums · open hat
const open_hat = s("oh").struct("<~@48 A ~ A ~ A ~ A ~ A ~@41 A ~ A ~ A ~ A ~ A ~@2>".pickRestart({
  A: "~@5 x ~@2",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@108 [~@3 x ~@4]>").gain(0.4)

stack(
  piano, bass, rock_organ, electric_guitar_clean, brass_section, baritone_sax, string_ensemble_1,
  string_ensemble_1_soft, tremolo_strings, kick, snare, hihat, open_hat, crash
)