Strudelify

Love Is All Around

R.E.M.

KeyB majorTempo88 bpm
0:00/0:00
// Love Is All Around — R.E.M.
// 88 bpm, 4/4, key B major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 13 acoustic guitar steel (copy of ch 7 electric guitar jazz)
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(88/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.

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A@4 B C D E B C D F B C D E B C D G@2 H I J K H I L M@2 N@4 B C D E B C D F B C D E B C D G@2 H I J K H I L O@3 P B
  C D Q B C D F R S T U R S T U R S T U R S T V W@3
>`.pickRestart({
  A: "[[f#3,a#3,c#4]@4 [f#3,a#3,c#4]@3 f#3 ~ [f#3,b3,d#4]@2 ~ d#4@3 ~ [a#3,c#4]@4 [f#3,a#3,c#4]@4 ~ [b3,d#4]@2 ~ [b3,d#4]@3 ~ [a#3,c#4]@3 ~ [f#3,a#3,c#4]@4 f#3 [f#3,b3,d#4]@2 ~ [b3,d#4]@3 ~ [a#3,c#4]@15 ~, ~@12 f#3@8 ~@4 f#3@3 ~ f#3@7 ~@9 f#3@19 ~, ~@12 b3 ~@51]/4", // F# B A#m F# B A#m F# B …
  B: "[f#4,b4,d#5]@4 [f#4,b4,d#5]@2 f#4 ~ [g#4,c#5,e5]@4 [g#4,c#5,e5]@2 g#4@2", // B C#m
  C: "[g#4,b4,e5]@3 ~ [b4,e5]@2 g#4 ~ [f#4,a#4,c#5]@3 ~ [f#4,a#4,c#5]@2 f#4 ~, ~@4 g#4 ~@11", // E E5 F#
  D: "[f#4,b4,d#5]@3 ~ [f#4,b4,d#5]@2 f#4 ~ [g#4,c#5,e5]@4 [c#5,e5]@2 g#4@2, ~@12 g#4 ~@3", // B C#m
  E: "[g#4,b4,e5]@3 ~ [b4,e5]@2 g#4 ~ [f#4,a#4,c#5]@4 [f#4,a#4,c#5]@2 f#4@2, ~@4 g#4 ~@11", // E E5 F#
  F: "[g#4,b4,e5]@3 ~ [b4,e5]@2 g#4 ~ [f#4,a#4,c#5]@3 ~ [f#4,a#4,c#5]@2 f#4@2, ~@4 g#4 ~@11", // E E5 F#
  G: "[[g#4,b4,e5]@3 ~ [b4,e5]@2 g#4 ~ [f#3,a#3,c#4]@23 ~, ~@4 g#4 ~@27]/2", H: "[e3,g#3,b3]@15 ~",
  I: "[e3,g#3,c#4]@15 ~", J: "[e3,g#3,b3]@7 ~", K: "[d#3,f#3,b3]@7 ~", L: "[e3,g#3,c#4]@7 ~", M: "[f#3,a#3,c#4]",
  N: "[[b3,d#4,f#4]@4 [b3,d#4,f#4]@3 ~ [c#4,e4,g#4]@3 ~ [c#4,e4,g#4]@3 ~ [b3,e4,g#4]@4 [b3,e4,g#4]@3 ~ [a#3,c#4,f#4]@3 ~ [a#3,c#4,f#4,b4]@3 ~, ~@4 b4@6 ~@2 b4@6 ~@2 b4@7 ~@5]/2", // B C#m E F#
  O: "[[f#3,a#3,c#4]@4 [f#3,a#3,c#4]@3 f#3 ~ [f#3,b3,d#4]@2 ~ d#4@3 ~ [a#3,c#4]@4 [f#3,a#3,c#4]@4 ~ [b3,d#4]@2 ~ [b3,d#4]@3 ~ [a#3,c#4]@3 ~ [f#3,a#3,c#4]@4 f#3 [f#3,b3,d#4]@2 ~ [f#3,b3,d#4]@3 ~, ~@12 f#3@8 ~@4 f#3@3 ~ f#3@7 ~@13, ~@12 b3 ~@35]/3", // F# B A#m F# B A#m F# B
  P: "[f#3,a#3,c#4]@15 ~", Q: "[g#4,b4,e5]@3 ~ [b4,e5]@2 g#4 ~ [f#4,a#4,c#5]@4 [f#4,a#4,c#5]@2 f#4 ~, ~@4 g#4 ~@11",
  R: "[f#3,b3,d#4]@4 [f#3,b3,d#4]@2 ~@2 [g#3,c#4,e4]@3 ~ [g#3,c#4,e4]@3 ~", // B C#m
  S: "[g#3,b3,e4]@3 ~ g#3@2 g#3 ~ [f#3,a#3,c#4]@4 [f#3,a#3,c#4]@3 ~, ~ [b3,e4] ~@2", // E F# E5
  T: "[f#3,b3,d#4]@4 [f#3,b3,d#4]@3 ~ [g#3,b3,e4]@4 [g#3,b3,c#4]@3 ~", // B E C#7
  U: "[g#3,b3,e4]@3 ~ [g#3,b3,e4]@4 [f#3,a#3,c#4]@3 ~ [f#3,a#3,c#4]@3 ~", // E F#
  V: "[g#3,b3,e4]@3 ~ [g#3,b3,e4]@5 ~ [f#3,a#3,c#4]@5 ~", W: "[[f#3,a#3,c#4]@3 ~ [b2,b3,d#4,f#4]@16 ~@4]/3",
})).s("gm_acoustic_guitar_steel").gain(0.25)

// chords · brass section
const brass_section = note("<~ A@4 ~@24 B@2 ~@28 C@4 ~@8 D@14 E@5>".pickRestart({
  A: "[f#2@14 ~ f#2 f#2@14 ~ f#2 f#2@14 ~ f#2 f#2@11 ~@5, [f#3,a#3,c#4]@15 ~, ~@8 [f#4,a#4,c#5]@7 ~]/4", // F#
  B: "[[f#2,f#3,a#3,c#4]@7 ~]/2", C: "[f#2@15 f#2 f#2@14 ~ f#2 [f#2,f#4,a#4,c#5]@24 ~@8, [f#3,a#3,c#4]@3 ~]/4",
  D: "[[f#3,b3,d#4]@7 ~ c#4@8 b3@7 ~ [f#3,a#3,c#4]@7 ~, ~ [g#3,e4]@2 ~]/2", // B F# C#m
  E: "[[f#3,b3,d#4]@7 ~ c#4@8 b3@8 ~@2 [f#3,a#3,c#4]@12 ~@2 b2@32 ~@8, ~@4 e4@9 ~@27, ~ g#3@2 ~@7]/5", // B F#
})).s("gm_brass_section").gain(0.14)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~ A@4 ~@8 B@4 C@5 ~@6 D E@2 F@2 G@2 ~@8 B@4 C@5 H I J K ~@2 D E@2 ~@2 F@2 L@2 M@2 N@2 O@14 P@2 Q@3
>`.pickRestart({
  A: "[[c#5,f#5,a#5]@31 ~]/4", B: "[d#5@4 e5@8 f#5@8 g#5@3 b5@6 ~@2 f#5]/4",
  C: "[d#5@7 ~ e5@16 f#5@16 g#5@6 b5@10 f#5@23 ~]/5", D: "~@4 c#5@2 d#5 e5", E: "[f#5@7 ~]/2",
  F: "[f#4@4 g#4 f#4 g#4 b4@7 a#4@2]/2", G: "[f#4@7 ~ g#4@2 f#4@2 g#4@2 b4@17 ~]/2", H: "e5",
  I: "d#5@2 c#5@3 ~ c#5@9 ~", J: "~ b4@7", K: "f#4@2 f#4@3 ~ f#4@9 ~",
  L: "[f#4@7 ~ g#4@2 f#4@2 g#4@2 ~@10 f#4@8, ~@7 b4@7 ~@2]/2",
  M: "[f#4@8 g#4@2 f#4@2 g#4@2 b4@7 ~ [b4,d#5]@2 [a#4,c#5]@2 [b4,d#5]@2 [c#5,e5]@2 [d#5,f#5]@2]/2", // B A#m B C#m D#m
  N: "[b4@11 [b4,d#5] [a#4,c#5] [b4,d#5] [c#5,e5] [d#5,f#5], d#5@9 ~@23]/2", // B A#m B C#m D#m
  O: "[d#5@9 e5@13 [b4,d#5]@2 [a#4,c#5]@2 [b4,d#5]@2 [c#5,e5]@2 [d#5,f#5]@2, b4@11 ~@5]/2", // B A#m B C#m D#m
  P: "[d#5@9 e5@14 [b4,d#5]@3 [a#4,c#5]@3 [b4,d#5]@3, b4@23 ~@9]/2", Q: "[[c#5,e5] [d#5,f#5] [b4,d#5,f#5]@8 ~@2]/3",
})).s("gm_string_ensemble_1").gain(0.22).pan(0.3)

// other · timpani
const timpani = note("<~ A@3 B ~@24 C ~@29 A@2 B ~@25 D E F>".pickRestart({
  A: "f#2 ~@14 f#2", B: "f#2 ~@15", C: "f#2", D: "~@8 b2!8", E: "b2!16", F: "b2!9 ~@7",
})).s("gm_timpani").gain(0.23)

// chords · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~@13 A@4 B@5 ~@6 C D@2 E F G F ~@8 A@4 B@5 H I J K ~@2 C D@2 ~@2 E F L M E F N O N O N O N O N O N O N O N O N P@4
>`.pickRestart({
  A: "[[b3,b4]@4 [f#3,f#4]@16 [g#3,g#4]@3 [b3,b4]@6 ~@2 [f#3,f#4]]/4", // B F# G# B F#
  B: "[[b3,b4]@8 [f#3,f#4]@32 [g#3,g#4]@6 [b3,b4]@10 [f#3,f#4]@23 ~]/5", C: "~@4 [c#3,c#4]@2 [d#3,d#4] [e3,e4]",
  D: "[[f#3,f#4]@7 ~]/2", E: "[f#3,d#4]@8 e4@2 d#4 ~ e4@2 c#4 ~, ~@8 g#3@7 ~", F: "b3@15 ~",
  G: "[f#3,d#4]@8 e4@2 d#4@2 e4 ~ c#4 ~, ~ g#3", H: "[g#4,b4]@15 ~", I: "[e4,g#4]", J: "[e4,g#4]@15 ~", K: "[b3,d#4]",
  L: "[f#3,d#4]@8 e4@2 d#4 ~ e4@2 ~ d#4, ~ g#3", M: "e4 d#4 b3@6 f#3@8", N: "[f#3,b3,d#4]@7 ~ [g#3,c#4,e4]@8",
  O: "[g#3,b3,e4]@8 [f#3,a#3,c#4]@7 ~", P: "[[g#3,b3]@4 ~ [f#3,a#3,c#4]@6 ~ [b3,d#4,f#4]@16 ~@4, e4@5 ~@27]/4",
})).s("gm_string_ensemble_1").gain(0.17).pan(0.7)

// bass · synth bass 2
const bass = note(`<
  ~ A B@3 C D C D C D C E C D F D C D G E H I J I K L J M N O P Q R Q C D C D C D C E C D F D C D S E T I J I K L J M A
  B@3 U V W X Y Z AA AB AC AD AE AF AC AD AE AF AC AD AE AF AC AD AE AG@4
>`.pickRestart({
  A: "f#2", B: "f#2@15 ~", C: "b1 c#2", D: "e1@7 e1 f#1 ~ f#1@4 f#1@2", E: "e1@7 e1 f#1 ~ f#1@3 ~ f#1 ~",
  F: "b1@7 ~ c#2@8", G: "b2@7 ~ c#3@2 g#2@2 f#2 ~ e2@2", H: "~@2 c#2 e2 f#2 ~ f#2@4 b2 c3 c#3 g#2 f#2 ~",
  I: "e2@6 ~ e2!2 ~ e2@5 ~", J: "c#2@6 ~ c#2!2 ~ c#2@5 ~", K: "b1@6 ~ b1!2 ~ b1@5 ~", L: "e2@6 ~ e2!2 ~ e2@6",
  M: "c#2@7 c#2!2 ~ c#2@6", N: "f#1@6 ~ f#1!2 ~ f#1@5 ~", O: "f#1@15 ~", P: "b1@7 b1 c#2@7 c#2",
  Q: "e2@7 e2 f#2 ~ f#2@3 ~ f#2@2", R: "b1@6 ~ b1 c#2@7 c#2", S: "b2@3 c3 c#3 g#2 f#2 e2",
  T: "f#2 ~ a2 a#2 g#2 f#2 f#3@9 ~", U: "b1@5 ~ b1 ~ c#2@5 ~ c#2 g#1", V: "e1@7 e1 f#1 ~ f#1@4 f#1 ~",
  W: "b1@7 b1 c#2@5 ~ c#2 g#1", X: "e1@7 e1 f#1 ~ f#1 ~ f#1@2 f#1 g#1", Y: "b1@6 b1!2 c#2@5 ~ c#2 g#1",
  Z: "e1@6 e1!2 f#1 ~ f#1 ~ f#1 ~ f#1 g#1", AA: "b1@6 b1!2 c#2@3 c#2@2 ~ c#2 g#1",
  AB: "e1@6 e1@2 f#1 ~ f#1 ~ f#1@2 f#1 ~", AC: "b2@7 b2 c#3@5 ~ c#3 g#2", AD: "e2@6 ~ e2 f#2 ~ f#2@4 f#2@2",
  AE: "b2@6 ~ b2 c#3@5 ~ c#3 g#2", AF: "e2@7 e2 f#2 ~ f#2@4 f#2 g#2",
  AG: "[e2@8 e2 ~ f#2@2 ~ f#2@7 f#2@2 g#2@2 b1@32 ~@8]/4",
})).s("gm_synth_bass_2").gain(0.32)

// chords · percussive organ
const percussive_organ = note(`<
  ~@20 A@2 B@2 C D@2 E@2 F@2 ~@19 G@2 B@2 C D@2 E@2 H@3 I ~@8 J K L M J K L M J K L M J K L N@2 ~@2
>`.pickRestart({
  A: "[~ [f#5,f#6]@3]/2", B: "[b4@15 ~ c#5@15 ~, [e5,g#5]@31 ~]/2", C: "[b4,e5,g#5]",
  D: "[[d#5,f#5]@16 [e5,g#5]@15 ~, b4@31 ~]/2", E: "[[e5,g#5]@16 [e5,g#5]@15 ~, c#5@31 ~]/2",
  F: "[[a#4,c#5,f#5]@7 ~]/2", G: "[~ [f#4,f#5]@7]/2", H: "[f#4,a#4,c#5]/3",
  I: "[a#4,c#5,f#5]@12 [b4,c5,d5] [d4,e4,f4,g4,a4] [f3,g3,a3,b3,c4] [b2,c3,d3,e3]", // F# Bm Dm F Cmaj7
  J: "[b4,d#5,f#5]@8 [c#5,e5,g#5]@7 ~", K: "[b4,e5,g#5]@7 ~ [a#4,c#5,f#5]@7 ~", L: "[b4,d#5,f#5]@7 ~ [c#5,e5,g#5]@8",
  M: "[b4,e5,g#5]@8 [a#4,c#5,f#5]@7 ~", N: "[[e5,g#5]@4 ~ [a#4,c#5,f#5]@6 ~@5, b4@5 ~@11]/2",
})).s("gm_percussive_organ").gain(0.08)

// other · pizzicato strings
const pizzicato_strings = note("<~@37 A B C ~ A B C ~ A B C ~ A D ~@39>".pickRestart({
  A: "~@2 d#4 ~ c#4 ~ b3 ~ c#4 ~ g#3 ~@3 e4 ~", B: "~@2 e4 ~ e4 ~ d#4 ~ c#4 ~ b3 ~ a#3 ~ f#3 ~", C: "d#4 ~@15",
  D: "~@2 e4 ~ e4 ~ d#4 ~ c#4 ~ f#3 ~@5",
})).s("gm_pizzicato_strings").gain(0.32)

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

// drums · rim
const rim = s("rim").struct("<[x!4] ~@4 [~ x ~ x]!16 ~@14 [~ x ~ x]!16 ~@39>").gain(0.45)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@2 A@3 ~@25 B ~@31 C ~@7 B ~@7 B ~@8 D ~@2>".pickRestart({
  A: "x", B: "~@15 x", C: "~@14 x!2", D: "~@3 x ~@4",
})).gain(0.35)

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

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

// drums · high tom
const high_tom = s("ht").struct("<~ A@3 ~@26 B ~@3 C ~@27 D ~@7 E ~@7 E ~@8 F ~@2>".pickRestart({
  A: "~@15 x", B: "~@11 x!2 ~@3", C: "~@13 x ~@2", D: "~@5 x ~@2", E: "~@12 x!2 ~@2", F: "x!2 ~@6",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@22 A B@3 A B@3 ~@22 A B@3 A B@2 ~@12 B@3 C B@3 C B@3 C B@3 D ~@3>".pickRestart({
  A: "~ x!7", B: "x!8", C: "x!4 ~@4", D: "x ~ x ~ x ~@2 x ~@8",
})).gain(0.4)

stack(
  acoustic_guitar_steel, brass_section, string_ensemble_1, timpani, string_ensemble_1_2, bass, percussive_organ,
  pizzicato_strings, kick, rim, snare, hihat, low_tom, mid_tom, crash, high_tom, ride
)

More by R.E.M.