Strudelify

Two Divided by Love

The Grass Roots

KeyA♭ majorTempo123 bpm
0:00/0:00
// Two Divided by Love — The Grass Roots
// 123 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(123/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 · electric bass pick
const bass = note(`<
  ~ A B A B C@2 A D C@2 A D A B E F E G E F E H@2 I J C@2 A D C@2 A D A B E F E G E F E H@2 I J C@2 A D C@2 A D K L M N
  O P Q R S T U@2 V W U@2 V W U@2 V W U@2 ~
>`.pickRestart({
  A: "f2 ~@2 f2 c2 ~@2 c2", B: "bb1@2 c2@2 db2@2 eb2@7 ~@3", C: "[ab2@2 ~ eb2 ab2 eb2 db2 c2@2 g2 c3@3 g2 c3 g2]/2",
  D: "bb1 c2 ~ db2 ~ eb2@2 ~", E: "ab2@2 ~ ab2@3 eb2!2", F: "ab2@2 ~ eb3@2 eb3 ab2@2", G: "ab2@2 ~ ab2 db2 ~ ab2@2",
  H: "[ab2 eb2 ab2 g2@2 eb2 g2 f2@2 c2 ~ bb1@2 d2 f2 bb1]/2", I: "eb2@2 ~ eb2 eb2@2 ~ bb1", J: "~ bb1 c2@2 db2 eb2@2 ~",
  K: "f2 ~ c2 ~ f2@4 ~@2 f2@4 f2@2", L: "bb1 c2!6 eb2", M: "f2!7 eb2", N: "c2@2 c2!6", O: "db2!8",
  P: "db2 db3 c3 bb2 ab2 f2 eb2 db2", Q: "eb2@2 eb2!6", R: "eb2!2 db3 c3 bb2 ab2 g2 eb2", S: "e2!8",
  T: "e2 e3 d3 db3 b2 a2 ab2 e2", U: "[a2@2 ~ e2 a2 e2 d2 db2@2 ab2 db3@3 ab2 db3 ab2]/2", V: "gb2 ~@2 gb2 db2 ~@2 db2",
  W: "b1 db2 ~ d2 ~ e2@2 ~",
})).s("gm_electric_bass_pick").gain(0.7)

// other · piano
const piano = note(`<
  ~ A B A C ~@2 A D ~@2 A D A C E F G H I J G K L M ~@3 A N@2 ~ A O A C E F G H I J G K L M ~@3 A D ~@2 A D ~@12 P Q ~@2
  P Q ~@2 P Q ~@3
>`.pickRestart({
  A: "[f3,f4] ~@2 [f3,f4] [c3,c4] ~@2 [c3,c4]", B: "[bb2,bb3]@2 [c3,c4]@2 [db3,db4]@2 [eb3,eb4]@7 ~@3",
  C: "[bb2,bb3] [c3,c4] [db3,db4] [eb3,eb4]@4 ~", D: "[bb2,bb3] [c3,c4] ~ [db3,db4] ~ [eb3,eb4]@2 ~", E: "[ab3,c4]@7 ~",
  F: "[ab3,f4]", G: "[ab3,db4,f4]", H: "[ab3,c4,eb4]@4 [ab3,db4] ~ [ab3,c4] ~", I: "[ab3,c4,eb4]@7 ~", J: "[ab3,d4,f4]",
  K: "[ab3,c4,eb4] [g3,bb3,eb4]", L: "[f3,ab3,c4] [f3,bb3,d4]", M: "[eb3,f4,ab4]@3 ~",
  N: "[[bb2,bb3] [c3,c4] ~ [db3,db4] ~ [eb3,eb4]@4 ~@7]/2", O: "[bb2,bb3] [c3,c4] ~ [db3,db4] ~ [eb3,eb4]@3",
  P: "[gb3,gb4] ~@2 [gb3,gb4] [db3,db4] ~@2 [db3,db4]", Q: "[b2,b3] [db3,db4] ~ [d3,d4] ~ [e3,e4]@2 ~",
})).s("gm_piano").gain(0.14).pan(1)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~ A B A B C D A E C D A E A B ~@3 F ~@5 G H C D A E C D A E A B ~@3 F ~@5 G H C D A E C D A E ~@10 I J K L I J K L I J
  K M ~@3
>`.pickRestart({
  A: "f3 ~@2 f3 c3 ~@2 c3", B: "bb2@2 c3@2 db3@2 eb3@7 ~@3", C: "~@4 [ab3,c4,eb4] ~@7 [ab3,c4,eb4] ~@3",
  D: "~@4 [c4,eb4,g4] ~@7 [c4,eb4,g4] ~@3", E: "bb2 c3 ~ db3 ~ eb3@2 ~", F: "~@8 eb3@2 ab3 ~ c4@2 eb4 ~", G: "~@7 bb2",
  H: "~ bb2 c3@2 db3 eb3@2 ~", I: "~@4 [a3,db4,e4] ~@7 [a3,db4,e4] ~@3", J: "~@4 [db4,e4,ab4] ~@7 [db4,e4,ab4] ~@3",
  K: "gb3 ~@2 gb3 db3 ~@2 db3", L: "b2 db3 ~ d3 ~ e3@2 ~", M: "b2 db3 ~ d3 ~@4",
})).s("gm_overdriven_guitar").gain(0.25).pan(0)

// chords · overdriven guitar · soft notes · A Dbm
const overdriven_guitar_soft = note(`<
  ~@76
  [~@5 e3@2 ~]
  [~@4 [a3,db4,e4] ~@7 [a3,db4,e4] ~@3]
  [~@4 [db4,e4,ab4] ~@7 [db4,e4,ab4] ~@3]
  ~
>`).s("gm_overdriven_guitar").gain(0.1).pan(0)

// chords · overdriven guitar
const overdriven_guitar_2 = note(`<
  ~@4 A B C D ~@2 C D ~@14 B C D ~@2 C D ~@14 B C D ~@2 C D ~@11 E F G ~@2 F G ~ E F G ~@2 F ~
>`.pickRestart({
  A: "~@5 [c4,f4] [bb3,eb4]@2", B: "[c4,eb4,ab4]@3 ~@5", C: "~ eb4@2 ~", D: "~@2 c4 ~ c4 [c4,eb4] ~@2",
  E: "[db4,e4,a4]@3 ~@5", F: "~ e4@2 ~", G: "~@2 db4 ~ db4 [db4,e4] ~@2",
})).s("gm_overdriven_guitar").gain(0.25).pan(1)

// other · overdriven guitar
const overdriven_guitar_3 = note(`<
  ~@6 A B ~@2 A B ~@12 C ~@2 A B ~@2 A B ~@12 C ~@2 A B ~@2 A B ~@12 D E ~@2 D E ~@2 D E ~@2 D ~
>`.pickRestart({
  A: "~ c4@2 ~", B: "~@2 eb4 ~ f4 ~@3", C: "~@2 f4@3 db4@3 f4@4 db4@3 ~", D: "~ db4@2 ~", E: "~@2 e4 ~ gb4 ~@3",
})).s("gm_overdriven_guitar").gain(0.25).pan(1)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@14 A@4 B C@3 D E ~@11 A@4 B C@3 D E ~@10 F G F G H@2 I@2 J@2 ~@15>".pickRestart({
  A: "[~@8 db4@6 ~@2 c4@6 ~@2 [b3,eb4]@3 [gb3,b3]@3 ~@2, ~@7 gb3@5 ~@3 gb3@5 ~@3 gb3@3 ~@6]/4", B: "[c4,eb4,ab4]@5 ~@3",
  C: "[[c4,eb4]@6 ~@2 c4@6 ~@2 [b3,eb4]@3 [gb3,b3]@3 ~@2, ~@7 gb3@5 ~@3 gb3@3 ~@6]/3", // Cm B B5
  D: "~@4 [c4,eb4,ab4] ~@7 [c4,eb4,g4] ~@3", E: "~@4 [ab3,c4,f4] ~@7 [bb3,d4,f4] ~@3", F: "[ab3,c4,f4]",
  G: "[c4,eb4,g4]", H: "[ab3,db4,f4]/2", I: "[bb3,eb4] ~@3 [bb3,eb4] ~@3 [bb3,eb4] ~@3 [bb3,eb4] ~@3",
  J: "[b3,e4] ~@3 [b3,e4] ~@3 [b3,e4] ~@3 [b3,e4] ~@3", // E5
})).s("gm_electric_guitar_clean").gain(0.25).pan(0)

// other · trumpet
const trumpet = note(`<
  ~@3 A B ~@9 B ~@4 C D@2 E F G H I J@2 K L@2 ~ K ~ B ~@4 C D@2 E F G H I J@2 K L@2 ~ K ~@10 M N@2 O M N@2 O P@3 O Q@2 ~
>`.pickRestart({
  A: "f5 ~@2 f5 c5 ~@2 c5", B: "bb4@2 c5@2 db5@2 eb5@7 ~@3", C: "ab4", D: "f4", E: "ab4 g4", F: "f4!2", G: "~@7 bb4",
  H: "~ bb4 c5@2 db5 eb5@2 ~", I: "eb5", J: "[eb5 f5 g5 eb5 ~ c5 ~ ab4@5 ~@4]/2", K: "bb4 c5 ~ db5 ~ eb5@2 ~",
  L: "[eb5@4 eb5 f5 g5 c5@8 ~]/2", M: "e5", N: "[e5 gb5 ab5 e5 ~ db5 ~ a4@5 ~@4]/2", O: "b4 db5 ~ d5 ~ e5@2 ~",
  P: "[~@4 e5@3 ~ e5@2 gb5@2 ab5@2 db5@4 ~@2 db5@3 ~ db5@2 d5@2 e5@2 a4@10 ~@8]/3", Q: "[e5@4 e5 gb5 ab5 db5@8 ~]/2",
})).s("gm_trumpet").gain(0.25).pan(0)

// other · trombone
const trombone = note(`<
  ~@3 A B ~@9 B ~@4 C D E F G H I J K@2 L M@2 ~ L ~ B ~@4 C D E F G H I J K@2 L M@2 ~ L ~@10 N O@2 P N O@2 P Q@3 P R@2 ~
>`.pickRestart({
  A: "f4 ~@2 f4 c4 ~@2 c4", B: "bb3@2 c4@2 db4@2 eb4@7 ~@3", C: "c4", D: "bb3", E: "ab3", F: "c4 bb3", G: "ab3 bb3",
  H: "~@7 bb3", I: "~ bb3 c4@2 db4 eb4@2 ~", J: "eb4", K: "[eb4 f4 g4 eb4 ~ c4 ~ ab3@5 ~@4]/2",
  L: "bb3 c4 ~ db4 ~ eb4@2 ~", M: "[eb4@4 eb4 f4 g4 c4@8 ~]/2", N: "e4", O: "[e4 gb4 ab4 e4 ~ db4 ~ a3@5 ~@4]/2",
  P: "b3 db4 ~ d4 ~ e4@2 ~", Q: "[~@4 e4@3 ~ e4@2 gb4@2 ab4@2 db4@4 ~@2 db4@3 ~ db4@2 d4@2 e4@2 a3@10 ~@8]/3",
  R: "[e4@4 e4 gb4 ab4 db4@8 ~]/2",
})).s("gm_trombone").gain(0.32).pan(1)

// chords · rock organ
const rock_organ = note("<~@55 A B A C D@2 E@2 F@2 G H I J G H I J G H I K ~@3>".pickRestart({
  A: "[ab4,c5,f5]", B: "[c5,eb5,g5]", C: "g5@3 ab5 g5@4, [c5,eb5]",
  D: "[[ab4,db5,f5]@9 ~@4 ab5@3, ~@9 [f4,ab4,db5]@7]/2", E: "[eb5,ab5,db6]/2", F: "[e5,a5,d6]/2", G: "[db5,e5,a5]",
  H: "[db5,e5,ab5]", I: "[a4,db5,gb5]", J: "[b4,d5] db5 ~ d5 ~ [e5,ab5]@3", K: "[b4,d5] db5 ~ d5 ~@4",
})).s("gm_rock_organ").gain(0.25).pan(0.6)

// chords · rock organ · soft notes · E A Dbm
const rock_organ_soft = note("<~@76 [~@5 [e5,ab5]@3] [[db5,e5,a5]] [[db5,e5,ab5]] ~>")
  .s("gm_rock_organ").gain(0.13).pan(0.6)

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

// drums · rim
const rim = s("rim").struct("<~@55 [~ x ~ x]!6 ~@19>").gain(0.7)

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

// drums · hihat
const hihat = s("hh").struct("<~@3 A ~@51 B C D C B C ~@19>".pickRestart({
  A: "~@2 x!6", B: "x!7 ~", C: "x ~ x ~ x ~ x ~ x ~ x!5 ~", D: "x!5 ~ x!2",
})).gain(0.62)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@8 A ~@3 A ~@5 B ~@10 A ~@3 A ~@5 B ~@10 A ~@3 A C ~ A ~ C ~@8 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@3 x", C: "~@7 x",
})).gain(0.7)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@2 A ~ A ~@3 A ~@3 A ~ A ~@10 A ~@3 A ~@3 A ~ A ~@10 A ~@3 A ~@3 A ~@7 B ~ C ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "~@12 x!3 ~", B: "~@7 x", C: "~@4 x!2 ~@2",
})).gain(0.7)

// drums · high tom
const high_tom = s("ht").struct("<~@64 [~@4 x!4 ~@8] ~@15>").gain(0.7)

// drums · crash
const crash = s("cr").struct(`<
  ~@3 A B A ~@3 A ~@4 B A ~@3 A ~@2 A ~@2 C A ~@3 A ~@4 B A ~@3 A ~@2 A ~@2 C A ~@3 A ~@11 A ~ A ~@3 A ~@3 A ~@3 A ~@2
>`.pickRestart({
  A: "x", B: "~@3 x ~@4", C: "~@5 x ~@2",
})).gain(0.7)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 A@8 ~@2 B@10 ~ A@8 ~@2 B@10 ~ A@8 B@6 A@18 ~>".pickRestart({
  A: "x!4", B: "x!8",
})).gain(0.62)

// drums · cowbell
const cowbell = s("cb").struct("<~@5 A@8 ~@13 A@8 ~@13 A@8 ~@10 A@11 B ~@3>".pickRestart({
  A: "x!4", B: "x!2 ~@2",
})).gain(0.7)

// drums · cowbell · soft notes
const cowbell_soft = s("cb").struct("<~@76 [~@2 x!2] [x!4]!2 ~>").gain(0.31)

stack(
  bass, piano, overdriven_guitar, overdriven_guitar_soft, overdriven_guitar_2, overdriven_guitar_3,
  electric_guitar_clean, trumpet, trombone, rock_organ, rock_organ_soft, kick, rim, snare, hihat, open_hat, mid_tom,
  high_tom, crash, tambourine, cowbell, cowbell_soft
)

More by The Grass Roots