Strudelify

Temptation Eyes

The Grass Roots

KeyB♭ majorTempo138 bpm
0:00/0:00
// Temptation Eyes — The Grass Roots
// 138 bpm, 4/4, key A# 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 88 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(138/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A@4 B@3 C D E F G D E F G H E@2 I J K J K J L M N A@4 O@4 D E F G D E F G H E@2 I J K J K J L P Q D E F G D E F G H
  E@2 I J K J K J L P Q J K J K J L P Q R@3
>`.pickRestart({
  A: "[bb2@10 f2@2 bb2@2 ab2@11 ~ bb2@2 ab2@2 gb2@12 ab2@2 gb2@2 f2@9 ~ f2@4 f1@4]/4",
  B: "[bb2@10 f2@2 bb2 ~ ab2@11 ~ bb2 ~ ab2 ~ gb2@12 ab2@2 gb2@3 ~]/3", C: "f2@7 ~ f3@3 ~ f3@2 ~@2",
  D: "bb2@3 ~ bb2@3 ~ bb2@2 f2@2 bb2@2 f2 ~", E: "ab2@3 ~ ab2@3 ~ ab2@3 ~ ab2@3 ~", F: "g2@3 ~ g2@3 ~ g2@3 ~ g2@3 ~",
  G: "gb2@3 ~ gb2@3 ~ f2@3 ~ f2@3 ~", H: "gb2@3 ~ gb2@3 ~ gb2@3 ~ gb2@3 ~",
  I: "a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~ a2 ~", J: "bb2@3 ~ bb2@3 ~ bb2@2 bb1@2 bb2@2 bb1@2",
  K: "bb2@3 ~ bb2@3 ~ bb2@3 ~ bb2@2 bb1@2", L: "bb2@3 ~ bb2@3 ~ bb2@2 bb1 ~ bb2@3 ~",
  M: "eb2@3 ~ eb2@3 ~ eb2@3 ~ eb2@3 ~", N: "f2@3 ~ f2@3 ~ f2@3 ~ f2@2 ~@2",
  O: "[bb2@10 f2@2 bb2 ~ ab2@11 ~ bb2 ~ ab2 ~ gb2@12 ab2@2 gb2 ~ f2@7 ~@3 f3@3 ~ f3@2 ~@2]/4",
  P: "eb2@2 f2@2 g2@2 bb2@2 eb3@2 eb2 ~ f2@2 eb2 ~", Q: "f2@2 g2 ~ a2@2 c3@2 f3@2 c3@2 f2@3 ~, ~@12 c3 ~@3",
  R: "[bb1@11 ~@5]/3",
})).s("gm_acoustic_bass").gain(0.48)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~ A@3 B A@3 B C D E F C D E F G H@2 I J K L M L N O P A@3 B A@3 B C Q E F C D E F G H@2 I J K L M L N O P C D E F C D
  E F G H@2 I J K L M L N O P J K L M L N O P R@3
>`.pickRestart({
  A: "[db4,f4,bb4]!4", B: "[db4,f4,bb4]@4 [db4,f4,bb4]@4 [c4,f4,a4]@3 ~ [c4,f4,a4]@3 ~",
  C: "[f3,bb3,db4]@4 ~@4 [f3,bb3,db4]@2 ~@2 bb2@2 [f3,bb3,db4] ~, bb2@3 bb2@3 ~@2, ~@2 [f3,bb3,db4]@2 ~ [f3,bb3,db4]@2 ~", // Bbm
  D: "[f3,bb3,db4]@3 ~@5 [f3,bb3,db4]@2 ~@4 [f3,bb3,db4]@2, ab2@3 ab2@3 ab2@2, ~@2 [f3,bb3,db4]@2 ~ [f3,bb3,db4]@2 ~", // Bbm
  E: "[g3,bb3,db4]@3 ~@9 [g3,bb3,db4]@4, g2@3 g2@2 g2@3, ~ [g3,bb3,db4]!2 ~", // Gdim
  F: "[gb3,bb3,db4]@4 [gb3,bb3,db4]@4 [f3,a3,c4]@3 ~ [f3,a3,c4]@3 ~, gb2@8 f2@7 ~", // Gb F
  G: "~@4 [gb3,bb3,db4]@7 ~ [gb3,bb3,db4]@4, gb2@15 ~", // Gb
  H: "[~@4 [ab3,c4,eb4]@7 ~ [ab3,c4,eb4]@7 ~ [ab3,c4,eb4]@7 ~ [ab3,c4,eb4]@3 ~, ab2@15 ~]/2", // Ab
  I: "~@2 [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~ [a3,c4,f4] ~, f2@15 ~", // F
  J: "[bb2,bb3,d4,f4]@5 bb3 ~ c4, ~@5 [d4,f4]@3, ~@3 bb2", K: "[c3,c4,e4,g4]@5 [c4,e4,g4]@3",
  L: "[bb3,d4,f4]@5 [bb3,d4,f4]@3, bb2", M: "[c4,e4,g4]@8 [c4,e4,g4]@2 [c4,e4,g4]@5 ~, c3@15 ~",
  N: "[c4,e4,g4]@5 [c4,e4,g4]@3, c3", O: "[bb3,eb4,g4]@5 ~@2 c3, [eb3,g3], ~@5 [bb3,eb4,g4]@3",
  P: "[f3,a3,c4]@6 [f3,a3,c4]@2 [f3,a3,c4]@2 [f3,a3,c4]@5 ~, f2@15 ~", // F
  Q: "[f3,db4]@3 ~@5 [f3,bb3,db4]@2 ~@4 [f3,bb3,db4]@2, ab2@3 ab2@3 ab2@2, bb3 ~@3 [f3,bb3,db4]@4 ~@2 [f3,bb3,db4]@4 ~@2", // Db Bbm
  R: "[[bb1,bb2,f3,bb3,d4]@11 ~@5]/3", // Bb
})).s("gm_piano").gain(0.48)

// chords · brass section · "BRASS 1"
const brass_section = note(`<
  ~@5 A@3 B ~@12 C D C E F G@2 H I@4 J@4 ~@3 K@2 L M N O P@2 Q C D C E F G@2 H O R S T O U S V W X@2 Y C D C E F G@2 H C
  D C E F G@2 H Z@3
>`.pickRestart({
  A: "[[bb3,bb4]@10 [f3,f4] ~ [bb3,bb4] ~ [ab3,ab4]@12 [bb3,bb4] ~ [ab3,ab4] ~ [gb3,gb4]@11 ~ [ab3,ab4] ~ [gb3,gb4]@3 ~]/3", // Bb F Bb Ab Bb Ab Gb Ab …
  B: "[f3,f4]@7 ~", C: "[d4,f4,bb4]@15 ~", D: "[e4,g4,c5]@15 ~", E: "[e4,g4,c5]@7 ~", F: "[d4,f4,bb4]@7 ~",
  G: "[[e4,g4,c5]@12 ~@2 [eb4,g4,bb4,d5]@15 ~@3]/2", H: "[f4,a4,c5,eb5]@7 ~",
  I: "[[bb3,bb4]@10 [f3,f4] ~ [bb3,bb4] ~ [ab3,ab4]@12 [bb3,bb4] ~ [ab3,ab4] ~ [gb3,gb4]@11 ~ [ab3,ab4] ~ [gb3,gb4] ~ [f3,f4]@14 ~@4]/4", // Bb F Bb Ab Bb Ab Gb Ab …
  J: "[[bb4,bb5]@9 ~ [f4,f5] ~ [bb4,bb5] ~ [ab4,ab5]@11 ~ [bb4,bb5] ~ [ab4,ab5] ~ [gb4,gb5]@11 ~ [ab4,ab5] ~ [gb4,gb5] ~ [f4,f5]@17 ~]/4", // Bb F Bb Ab Bb Ab Gb Ab …
  K: "[~@8 [bb3,bb4] ~ [f3,f4] ~ [ab3,ab4] ~@3 bb2@14 ~@2, ~@7 [bb3,bb4]@9]/2", // Bb F Ab Bb
  L: "~@4 [bb3,bb4]@3 ~ [db4,db5] ~ [db4,db5]@2 ~@4, ab2@7 ~", M: "~@4 [db4,db5]@7 ~ [eb4,eb5]@2 ~@2, g2@15 ~",
  N: "[f4,f5]@3 ~ [f4,f5]@3 ~ [eb4,eb5]@2 [db4,db5] ~@5, gb2@7 ~ f2@4 ~@4", O: "bb3@15 ~", P: "[c4@31 ~]/2",
  Q: "c4@7 ~", R: "ab3", S: "g3", T: "gb3@7 ~ f3@7 ~", U: "ab3@15 ~", V: "gb3@4 f3@3 ~", W: "[bb3,db4,gb4]@15 ~",
  X: "[[c4,eb4,ab4]@31 ~]/2", Y: "[c4,f4,a4]@7 ~", Z: "[[f4,bb4,d5]@11 ~@5]/3",
})).s("gm_brass_section").gain(0.56)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@5 A@4 ~@8 B C@3 D E D E D F G H A@8 ~@12 D E D E D F G H I@8 ~@4 D E D E D F G H D E D E D F G H ~@3
>`.pickRestart({
  A: "[f6@63 ~]/4", B: "[bb5,db6,gb6]@15 ~", C: "[[eb6,ab6]@31 ~ [f6,a6]@15 ~, c6@23 ~]/3", D: "[d5,f5,bb5]@15 ~",
  E: "[e5,g5,c6]@15 ~", F: "[e5,g5,c6]@7 ~", G: "[eb4,bb4,eb5,g5]@15 ~", H: "[f4,a4,c5]@15 ~",
  I: "[f4@31 ~ g4@15 ~ gb4@7 ~ [f4,a4,c5]@6 ~@2, [bb4,db5]@55 ~@9]/4", // F Bbm
})).s("gm_rock_organ").gain(0.33)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note("<~@57 A@4 B C@2 D ~@23>".pickRestart({
  A: "[~@4 bb4@15 ~@3 bb4@3 ~ ab4 ~ f4@6 ~@2 f4@2 ~@2 f4@3 ~ eb4@17 ~@3, ~@43 db4@2 ~@19]/4",
  B: "~@2 f4 ~ bb4@2 ~@2 bb4@3 ~ bb4@2 ~@2", C: "[bb4 ~ f5@10 ~@2 f5@10 f5@2 eb5 ~ db5 ~ eb5 ~]/2",
  D: "f5@7 ~ ab5 f5@6 ~",
})).s("gm_overdriven_guitar").gain(0.64)

// drums · kick
const kick = s("bd").struct("<A B@8 C@12 D@8 B@7 E C@12 D@8 C@12 D@16 F ~ G>".pickRestart({
  A: "~@7 x", B: "x!4", C: "x ~@3 x!2 ~ x", D: "x ~@2 x!3 ~ x", E: "x!2 ~ x ~ x ~ x", F: "x", G: "~ x ~@14",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  A ~@3 A B@3 C B@7 D B@3 E F@7 G ~@3 A@3 B F B@7 D B@3 E F@7 G B@7 D B@3 E F@7 G F@7 H ~ I J
>`.pickRestart({
  A: "~@3 x", B: "~ x ~ x", C: "x!3 ~", D: "~@4 x ~@5 x!3 ~@3", E: "x ~ x ~ x ~ x ~ x ~ x ~ x!4", F: "x!4",
  G: "x ~ x ~ x ~ x ~ x!8", H: "x ~ x ~ x!12", I: "~@15 x", J: "x",
})).gain(0.5)

// drums · low tom
const low_tom = s("lt").struct("<A ~@7 B ~@11 C ~@7 D ~@7 B ~@11 C ~@7 D ~@11 C ~@7 D ~@11>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~@5 x!3", D: "~@4 x!2 ~@2",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<~@5 [x!4]!24 ~@8 [x!4]!48 ~@3>").gain(0.5)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@9 [~ x ~ x ~ x ~ x]!20 ~@8 [~ x ~ x ~ x ~ x]!48 ~@3>").gain(0.05)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@7 B ~@3 C ~@7 D ~@7 E ~@7 B ~@3 C ~@7 D ~@7 B ~@3 C ~@7 D ~@11>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@7 x", C: "~@2 x!3 ~@3", D: "x!4 ~@4", E: "~@13 x ~@2",
})).gain(0.5)

// drums · high tom
const high_tom = s("ht").struct("<~@20 [x!2 ~@6] ~@27 [x!2 ~@6] ~@19 [x!2 ~@6] ~@19>").gain(0.5)

// drums · crash
const crash = s("cr").struct("<~@9 A ~@17 A ~@9 A ~@17 A ~ A ~@7 A ~@9 A ~ A ~@5 A ~ A ~ B>".pickRestart({
  A: "x", B: "~ x ~@14",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@21 [x!16]!8 ~@20 [x!16]!8 ~@12 [x!16]!16 ~@3>").gain(0.15)

stack(
  bass, piano, brass_section, rock_organ, overdriven_guitar, kick, snare, low_tom, hihat, hihat_soft, mid_tom, high_tom,
  crash, tambourine
)

More by The Grass Roots