Strudelify

Radio Song

R.E.M.

KeyA♭ majorTempo120 bpm
0:00/0:00
// Radio Song — R.E.M.
// 120 bpm, 4/4, key Ab major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): Guitar 4.
setcpm(120/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 · acoustic guitar steel · "Guitar 1"
const acoustic_guitar_steel = note(`<
  A B A B A B A B A B A B ~@16 A B A B A B ~@18 A B A B A B ~@18 A B A B A B A B A B A B ~@20
>`.pickRestart({
  A: "ab4 c5 eb5 c5 ab4 c5 eb5 c5", B: "ab4 db5 eb5 db5 ab4 db5 eb5 db5",
})).s("gm_acoustic_guitar_steel").gain(0.4)

// chords · electric guitar clean · "Guitar 2"
const electric_guitar_clean = note(`<
  ~@20 A B@3 ~@4 C D C D C E F G ~@8 A B@3 ~@4 C D C D C E F G ~@8 A B@3 ~@4 C D C D C D C D C D C E F G ~@18
>`.pickRestart({
  A: "bb2@4 [bb2,f3,bb3,c4,f4]@2 [bb2,f3,bb3,c4,f4] [bb2,f3,bb3,c4,ab4]@2 [bb2,f3,bb3,c4,ab4]@2 [bb2,f3,bb3,c4,ab4]@2 [bb2,f3,bb3,c4,f4]!3", // Bbsus2 Fm Bbsus2
  B: "[bb2,f3,bb3,c4,f4]@4 [bb2,f3,bb3,c4,f4]@2 [bb2,f3,bb3,c4,f4] [bb2,f3,bb3,c4,ab4]@2 [bb2,f3,bb3,c4,ab4]@2 [bb2,f3,bb3,c4,ab4]@2 [bb2,f3,bb3,c4,f4]!3", // Bbsus2 Fm Bbsus2
  C: "[ab3,c4,eb4,ab4]@3 [ab3,c4,eb4,ab4]@2 [ab3,c4,eb4,ab4]@2 [ab3,c4,eb4,ab4]", // Ab
  D: "[ab3,db4,eb4,ab4]@3 [ab3,db4,eb4,ab4]@2 [ab3,db4,eb4,ab4]@2 [ab3,db4,eb4,ab4]", // Absus4
  E: "[ab3,db4,eb4,ab4]@3 [ab3,db4,eb4,ab4]@2 [ab3,db4,eb4,ab4]@2 [ab3,c4,eb4,ab4]", // Absus4 Ab
  F: "[bb3,f4,bb4] ~@2 [bb3,f4,bb4] ~ [ab3,eb4,ab4] [bb3,f4,bb4] ~", G: "[eb3,bb3,eb4]!5 ~@3",
})).s("gm_electric_guitar_clean").gain(0.32)

// other · electric guitar muted · "Guitar 2- Muted"
const electric_guitar_muted = note(`<
  ~@12 A B A B A B A B ~@4 A B A B ~@8 A B A B A B A B ~@4 A B A B ~@8 A B A B A B A B ~@4 A B A B ~@15 A B A B A B A B
  A B A B A B A B ~
>`.pickRestart({
  A: "f2@2 f2@2 f3@2 c3 f3@2 f3@2 f3 c3 bb2 ab2@2", B: "f2@2 f2@2 f3@2 c3 eb3@2 f3@2 c3 f3@2 eb3@2",
})).s("gm_electric_guitar_muted").gain(0.1).pan(0.2)

// chords · electric guitar clean · "Guitar 3"
const electric_guitar_clean_2 = note(`<
  ~@12 A B A B A B ~@6 A B A B ~@8 A B A B A B A B ~@4 A B A B ~@8 A B A B A B A B ~@4 A B A B ~@15 A B A B A B A B A B
  A B A B A B ~
>`.pickRestart({
  A: "[f4,c5,eb5,ab5]!4 [f4,c5,eb5,ab5]@2 [f4,c5,eb5,ab5] [f4,c5,eb5,ab5]@2 [f4,c5,eb5,ab5]@2 [f4,c5,eb5,ab5] [f4,c5,eb5,ab5]@2 ~ [f4,c5,eb5,ab5]", // Fm7
  B: "[f4,c5,eb5,ab5] ~@3", // Fm7
})).s("gm_electric_guitar_clean").gain(0.25)

// chords · overdriven guitar · "Guitar 4" · F5
const overdriven_guitar = note("<~@18 [~@15 [f3,c4,f4]] [[f3,c4,f4] ~] ~@88>").s("gm_overdriven_guitar").gain(0.25)

// bass · fretless bass · "Bass"
const bass = note(`<
  ~ A B@8 C D E@8 F@4 E@4 G H G H G I J K E@8 F@4 E@4 G H G H G I J K E@8 F@4 E@4 G H G H G H G H G H G I J L ~ E@16 ~
>`.pickRestart({
  A: "~@7 eb2", B: "[ab2@14 ~ eb2]/2", C: "ab2", D: "~@6 eb3 ~", E: "f2@2 ~@2 f2!2 ~@2", F: "bb2@2 ~@2 bb2!2 ~@2",
  G: "ab2 ~ ab2@2", H: "db3@2 ~@2 ab2 db3 eb3 db3", I: "db3@2 ~@2 ab2 db3 eb3 ab2", J: "bb2 ~@2 bb2 ~ ab2 bb2 db3",
  K: "eb3!5 ~ eb2 ~", L: "eb3!5 ~@3",
})).s("gm_fretless_bass").gain(0.63)

// chords · drawbar organ · "Keyboard"
const drawbar_organ = note(`<
  A B C D C D E F E F G H I J I J I J I J K@4 I J I J E F E F E L M N I J I J I J I J K@4 I J I J E F E F E L M N I J I
  J I J I J K@4 I J I J E F E F E F E F E F E L M N ~ I J I J I J I J I J I J I J I J ~
>`.pickRestart({
  A: "ab5", B: "db6", C: "[ab5,c6]", D: "[ab5,db6]", E: "[ab5,c6,eb6]", F: "[ab5,db6,eb6]", G: "[ab5,c6,eb6,ab6]",
  H: "[ab5,db6,eb6,ab6]", I: "[f4,f5,c6]@2 [f4,f5,c6]@2 [f5,c6]@2 [c5,c6] [f5,c6]@2 [f5,eb6]@2 [f5,c6,eb6]@5",
  J: "[f4,f5,c6]@2 [f4,f5,c6]@2 [f5,c6]@2 [c5,c6,eb6] [eb5,c6,eb6]@2 [f5,eb6]@2 [c5,f5,c6,eb6]@5", // F5 Cm F7
  K: "[bb4,f5,f6]@4 [bb5,c6,f6,bb6]@2 [bb5,c6,f6,bb6] [bb5,c6,ab6,bb6]@2 [bb5,c6,ab6,bb6]@2 [bb5,c6,ab6,bb6]@2 [bb5,c6,f6,bb6]!3", // Bb5 Bbsus2 Fm Bbsus2
  L: "ab5@7 ab5, [db6,eb6]", M: "[bb5,f6,bb6]@4 ~ [ab5,eb6,ab6] [bb5,f6,bb6] ~", N: "[bb5,eb6,eb7]!5 ~@3",
})).s("gm_drawbar_organ").gain(0.25)

// other · string ensemble 2 · "Strings"
const string_ensemble_2 = note(`<
  ~@29 A B C D E F G ~@17 A B C D E F G ~@17 A B C D A ~ A B C D E F G ~@18
>`.pickRestart({
  A: "ab5", B: "f5 c6", C: "bb5 db6", D: "c6 eb6", E: "db6 f6", F: "bb5 f6", G: "eb6 ~",
})).s("gm_string_ensemble_2").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@12 A@16 ~@8 A@16 ~@8 A@16 ~@15 A@16 ~>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2",
})).gain(0.4)

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

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

// drums · open hat
const open_hat = s("oh").struct("<~@11 A B@16 C@7 D B@16 C@7 D B@16 C@13 D ~ B@16 ~>".pickRestart({
  A: "~@3 x", B: "~@7 x", C: "~@3 x ~@3 x", D: "x",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@28 A ~@23 A ~@23 A ~@5 A ~@25>".pickRestart({
  A: "x",
})).gain(0.4)

stack(
  acoustic_guitar_steel, electric_guitar_clean, electric_guitar_muted, electric_guitar_clean_2, overdriven_guitar, bass,
  drawbar_organ, string_ensemble_2, kick, snare, hihat, open_hat, crash
)

More by R.E.M.