Strudelify

Papa Was a Rolling Stone

The Temptations

KeyB♭ minorTempo120 bpm
0:00/0:00
// Papa Was a Rolling Stone — The Temptations
// 120 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (4/4 at bar 1, 3/4 at bar 117, 4/4 at bar 117) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 144 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
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 · trumpet · "#Trumpet"
const trumpet = note("<~@16 A B C D E@4 F G H I J K L ~@52 A B C M N O P Q ~@17 R S T U@2 V W X ~@28>".pickRestart({
  A: "~@14 f4 ~", B: "ab4 bb4 ~ bb4@4 ~@7 bb4 ~", C: "db5 eb5 ~ eb5@4 ~@7 f5 ~", D: "ab5 bb5 ~ bb5@2 [ab5,a5] ~@10",
  E: "[~@10 bb4 ~ db5 eb5 ~ db5@3 bb4 ~@7 bb4 ~ db5 eb5 ~ e5@3 eb5 ~@7 f5 ~ ab5 bb5 ~ bb5@2 ab5 ~@12 bb4 ~]/4",
  F: "db5!2 ~ bb4@3 f4 ~ ab4 bb4 ~@4 bb4 ~", G: "db5!2 ~ bb4@3 f4 ~ ab4 f4 ~@4 f4 ~", H: "ab4 bb4 ~ bb4@2 ~@9 bb4 ~",
  I: "db5 eb5 ~ eb5@3 ~@2 db5 eb5 ~@6", J: "~@2 f5 ~ e5 f5!3 e5 f5!3 e5 f5!3", K: "e5 f5!3 e5 f5!3 e5 f5!3 e5 f5!3",
  L: "db5@2 bb4 ~@13", M: "ab5 bb5 ~ bb5@2 [g5,ab5,a5] ~@10", N: "~@14 bb5 ab5",
  O: "bb5@2 ab5 f5 ab5@2 f5 eb5 f5@2 eb5 db5 eb5@2 ~ bb4", P: "db5@2 ~ ab4 bb4@3 ~ ab4@2 f4 eb4 f4 ~ f4 ~",
  Q: "ab4 bb4 ~ bb4@2 ~@11", R: "~@4 db5@2 eb5 ~ db5@4 ~@2 bb4 ~",
  S: "f5@3 ~ f5@3 ~ [e5,f5] eb5 db5@2 bb4@2 ab4 ~, e5 ~@3 e5 ~@11", T: "~@2 f5 ~ ab5 bb5 ~ bb5@3 ab5 f5 ab5@2 f5 ~",
  U: "[f5@2 eb5 ~ eb5@2 ~ eb5 db5@2 bb4 ab4 bb4@3 ab4@2 ~ f4@2 ab4 bb4 ~ bb4@3 ab4 ~@5, ~@15 f4 ~@16]/2",
  V: "~@2 bb4@2 db5 eb5 ~ e5@3 eb5 ~ db5 eb5 ~@2", W: "~@2 f5 ~ ab5 bb5 ~ bb5 ~@6 f4@2",
  X: "ab4 bb4 ~@2 bb4 ~@2 bb4 ~@2 bb4 ~@5",
})).s("gm_trumpet").gain(0.64)

// other · trumpet · "#Trumpet" · soft notes
const trumpet_soft = note("<~@19 A ~@3 B ~@3 C ~@58 D ~ E F ~@20 G H ~@3 I ~@28>".pickRestart({
  A: "~@5 g5 gb5 ~@9", B: "~ a5 [gb5,g5] ~@13", C: "~@6 bb4 ~@9", D: "~@6 gb5 ~@9", E: "~@14 db5 ~",
  F: "~@2 bb4 ~@3 ab4 f4 ~@8", G: "~@15 eb5", H: "~@3 db5 ~@2 db5 ~@7 ab4 ~", I: "~@6 ab4 ~@2 ab4 ~@6",
})).s("gm_trumpet").gain(0.4)

// bass · electric bass finger · "#Fing.Bas"
const bass = note(`<
  A B C D A B C D A B C D A B C D A B C D A B C E B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D
  A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D A B C D F ~ G
  ~ H ~ G ~ H ~ G ~ H ~ G ~ H ~ G ~ H ~ G ~ H ~ G ~@2
>`.pickRestart({
  A: "~@7 ab1", B: "bb1 ~@7", C: "~@2 db2!2 ~ ab1 ~@2", D: "bb1@3 ~@13", E: "bb1@3 ~@11 ab1@2", F: "~@6 bb1 ~",
  G: "db2@2 db2@2 ~@2 ab1@2 ~@4 bb1@3 ~", H: "~@5 ab1 bb1 ~",
})).s("gm_electric_bass_finger").gain(0.57)

// chords · string ensemble 2 · "#Sl.Strin"
const string_ensemble_2 = note("<~@5 A B@3 C D@3 E F G@2 C D@3 E F H@2 D@3 E F I@2 ~@77 J@3 ~@32>".pickRestart({
  A: "~ [eb5,f5,c6]", B: "[db6@8 eb6@7 ~ c6@8 bb5@24, [f5,ab5] f5@2, ~@15 eb5@32 ~]/3", C: "~ [eb5,g5]",
  D: "[[f5,ab5]@8 [g5,bb5]@7 ~ g5@7 ~ f5@24, ~@15 eb5@8 db5@24 ~]/3", E: "~ [f5,c6]", F: "db6 eb6, ab5",
  G: "[c6 bb5@3, f5]/2", H: "[c6 bb5@2 [eb5,g5], f5@3 ~]/2", I: "[c6@2 bb5@5 ~, f5@7 ~]/2",
  J: "[[f5,ab5]@8 [g5,bb5]@7 ~ g5@15 ~ f5@8 ~@8, ~@15 eb5@16 db5@8 ~@9]/3", // Fm Gm
})).s("gm_string_ensemble_2").gain(0.48)

// other · orchestral harp · "Harp"
const orchestral_harp = note("<~@23 A B ~@6 C D E F G F G F G F H ~@102>".pickRestart({
  A: "~@8 [ab5,bb5] [eb5,f5,g5] [c5,db5] [g4,ab4,bb4] [eb4,f4] [bb3,c4,db4] [f3,g3,ab3] [c3,db3,eb3]", B: "bb2 ~@15",
  C: "~@8 [g5,ab5] [eb5,f5] [c5,db5] [g4,ab4,bb4] [eb4,f4] [bb3,c4,db4] [f3,g3,ab3] [c3,db3,eb3]", // Abmaj7 Ebsus2 Dbmaj7 Gm Ebsus2 Bbm Fm Cm
  D: "bb2 ~@7 [bb5,db6] ab5 [eb5,f5] [bb4,db5] [f4,ab4] [db4,eb4] [ab3,bb3] [db3,eb3,f3]", // Bbm Ebsus2 Bbm Fm Dbsus2 Absus2 Db
  E: "[bb2,f3,ab3] bb3 [db4,eb4,f4] [ab4,bb4] [db5,eb5] [f5,ab5] bb5 ~ [db4,eb4] [f4,ab4] [bb4,db5] [eb5,f5] [ab5,bb5] [db6,eb6] [f6,ab6] ~", // Bb7 Db Absus2 Dbsus2 Fm Dbsus2 Fm Bbm …
  F: "[f6,ab6] eb6 [bb5,db6] [f5,ab5] [db5,eb5] [ab4,bb4] [eb4,f4] [bb3,db4] ab4 [eb4,f4] [bb3,db4] ab3 [eb3,f3] [bb2,db3] [f2,ab2] [db2,eb2]", // Fm Bbm Fm Dbsus2 Absus2 Ebsus2 Bbm Ebsus2 …
  G: "[ab1,bb1] db2 [eb2,f2] [ab2,bb2] [db3,eb3] [f3,ab3] [bb3,db4] [eb4,f4,ab4] [f4,ab4] bb4 [db5,eb5] [f5,ab5] [bb5,db6] [eb6,f6] ab6 ~", // Absus2 Ebsus2 Absus2 Dbsus2 Fm Bbm Fm7 Fm …
  H: "[ab1,bb1] ~@15", // Absus2
})).s("gm_orchestral_harp").gain(0.24).pan(0.3)

// other · string ensemble 1 · "#St.Strin"
const string_ensemble_1 = note("<~@48 A@2 ~@77 B@3 ~ B@3 ~ B@3 ~ B@3 ~@2>".pickRestart({
  A: "[ab5@6 g5@5 ~ f5@6 eb5@6 db5@2 ~ f5@3 ~@2, ~@13 eb5 ~@2]/2",
  B: "[~@12 ab5@6 g5@5 ~ f5@6 eb5@6 db5@2 ~ f5@3 ~@6, ~@19 eb5 ~@4]/3",
})).s("gm_string_ensemble_1").gain(0.48)

// chords · tremolo strings · "#Susp.Str"
const tremolo_strings = note("<~@36 A@8 ~@100>".pickRestart({
  A: "[bb5@63 bb4@65, db4]/8",
})).s("gm_tremolo_strings").gain(0.33)

// chords · electric guitar muted · "#Muted Gt"
const electric_guitar_muted = note(`<
  ~@8 A B@3 C B@4 D B@2 C B@15 E ~@2 F G H I J ~@3 K L M N O P@2 Q@2 ~ R@2 ~@2 S ~ T U ~@6 V W@8 X ~@9 Y Z W@4 X ~@3 AA
  ~@13 AB AC W@4 AD@3 AE AD@3 AE AD@3 AE AD@3 AE AD@3 AE AD@3 AF
>`.pickRestart({
  A: "~@12 [f4,bb4]@2 [d4,eb4,e4,ab4,a4] [db4,g4]", B: "[db4,f4] ~@3 [db4,f4,bb4] ~@7 [db4,f4] ~@3",
  C: "[db4,f4] ~@3 [db4,f4,bb4] ~@5 [db4,f4]@2 [db4,f4]@3 db4", D: "~@4 [db4,f4,bb4] ~@7 [db4,f4] ~@3",
  E: "[db4,f4] ~@15", F: "~@12 [db4,f4,bb4] ~@3", G: "[db4,f4] ~@3 [db4,f4,bb4] ~@6 f3 [db4,f4] ~ f3 ab3",
  H: "[f3,bb3]@5 ~@11", I: "~@6 ab3 ~ ab3@2 ~ bb3@5", J: "~@4 ab3 ~@3 bb3 ~@7", K: "~@8 [a4,bb4] ab4 ~@6",
  L: "~@8 [db4,f4]@3 [db4,f4] ~@2 [db4,f4] ~", M: "~ [db4,f4] ~@14", N: "~@5 ab4@3, ~@9 f4@6 ~",
  O: "d4@2 db4@2 bb3@4 e3 eb3 db3@2 bb2@4",
  P: "[~@3 bb2 [db4,f4]@2 [db4,f4]@2 [db4,f4]@2 f4@2 db4@3 db4@4 ~@13, ~@4 ab3@11 ~@17]/2", // Db
  Q: "[~@5 f4 ab4@6 ~ f4 bb4@6 ~ f4 ab4 ~ eb4@3 db4 bb3@3 ~]/2", R: "[~@9 [eb4,e4] ~@2 eb4@2 bb3@4 ~@14]/2",
  S: "~@8 bb4@2 [ab4,a4] [gb4,g4] ~@4", T: "e4 f4 ab4@2 db5 ~ eb5@4 ~@2 db5@4", U: "bb4 ~",
  V: "~@2 eb4@2 ~@2 eb4 ~ db4@4 bb3@4", W: "[f4,bb4] ~@3 [db4,f4,bb4] ~@3 [f4,bb4] ~@3 [f4,bb4] ~@3", X: "[ab3,db4,f4]",
  Y: "~@7 eb4", Z: "~ db4 ~ ab3 bb3 ~@3", AA: "[db4,f4]@2 ~@2 [db4,f4] ~@11", AB: "~@8 f4@3 ab4 db4@4",
  AC: "bb3@3 ~ db3 eb3@2 db3 bb2@4 ~@4", AD: "[db4,f4,bb4] ~@3 [f4,bb4] ~@3 [f4,bb4] ~@3 [f4,bb4] ~@3",
  AE: "[db4,f4,bb4] ~@3 [f4,bb4] ~@3 [db4,f4,bb4] ~@3 [f4,bb4] ~@3", // Bbm Bb5 Bbm Bb5
  AF: "[db4,f4,bb4] ~@3 [f4,bb4] ~@3 [db4,f4,bb4] ~@7", // Bbm Bb5 Bbm
})).s("gm_electric_guitar_muted").gain(0.26).pan(0.8)

// chords · electric guitar muted · "#Muted Gt" · soft notes
const electric_guitar_muted_2 = note(`<
  ~@8 A B C D E C D B C B C D E C D B C D B C D B C D B C D B C ~@3 F ~ G ~@4 H ~@2 I J K@2 L M ~ N ~@3 O ~@4 P ~@5 Q R
  D Q@2 R D Q ~@12 Q R D Q ~@4 S ~@14 T Q R D U V W X Y V W X Y V W X Y V W X Y V W X Y V W X Y
>`.pickRestart({
  A: "~@12 [e4,a4]@2 ~ [c4,f4,gb4]", B: "~@5 f3 ~ f3", C: "~@5 f3 ~ bb2", D: "~@3 bb3 ~ bb3 ~ bb3",
  E: "~@2 bb3@2 ~@6 ab3@5 f4", F: "~@14 bb3 db4", G: "~@4 ab3 ~@5 f3@6", H: "~@9 [gb4,g4] [eb4,e4,f4] ~@5",
  I: "~@8 eb4 e4 ~@6", J: "~@8 f3 ~@7", K: "[~@10 db4@2 f4@3 f4@4 ~@13]/2", L: "~@4 [eb4,e4] ~@7 [eb4,e4] ~@3",
  M: "~@4 [eb4,e4] ~@11", N: "~@8 f4 ~ db4@2 ~@4", O: "~@6 f4 ~ [ab4,a4] ~@3 [e4,f4] ~@3",
  P: "[eb4,e4] ~ [f4,ab4]@4 [f4,ab4]@2 [f4,ab4]@4 [f4,ab4]@4", Q: "~@5 bb3 ~ bb3", R: "~@5 f3 ~ bb3", S: "~ bb3 ~@6",
  T: "~@3 ab3 ~@12", U: "~@5 bb3 ~@2", V: "~@3 bb3 ~ bb3 ~@2", W: "~@3 f3 ~ bb3 ~@2", X: "~ bb3 ~ bb3 ~ bb3 ~@2",
  Y: "~@3 bb3 ~@4",
})).s("gm_electric_guitar_muted").gain(0.13).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~@32 [~ x ~ x]!111 [~ x ~@2]>").gain(0.64)

// drums · clap
const clap = s("cp").struct("<~@32 A@4 B ~@39 A@16 ~@8 A@8 ~@15 C A@19 D>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~@6", C: "~@7 x", D: "~ x ~ x ~ x ~@2",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~ [x!4]!142 [x!3 ~]>").gain(0.64)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~ [~ x ~ x ~ x ~ x]!142 [~ x ~ x ~ x ~@2]>").gain(0.32)

// drums · low tom
const low_tom = s("lt").struct("<~@31 [~@7 x] ~@112>").gain(0.48)

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 [~@7 x] ~@112>").gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@115
  [~@11 x!2 ~ x ~]
  [x ~@2 x!2 ~ x ~ x ~@2 x!2 ~ x ~]!27
  [x ~@2 x!2 ~ x ~ x ~@7]
>`).gain(0.4)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@115 [~@5 x ~@2] [~ x ~@3 x ~@2]!28>").gain(0.16)

// drums · congas
const congas = s("conga:13").struct("<~@32 [~ x ~ x]!11 [~ x ~@2] ~@24 [~ x ~ x]!40 x ~@35>").gain(1.28)

// drums · congas · soft notes
const congas_soft = s("conga:13").struct("<~@32 [~@5 x!2 ~@7 x!2]!11 [~@5 x ~@10] ~@24 [~@5 x!2 ~@7 x!2]!40 ~@36>")
  .gain(0.51)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@32
  [x ~ x ~@4 x ~ x ~ x ~@4]!11
  [x ~ x ~@3 x!3 ~@4 x!3]
  [x!9 ~@7]
  ~@23
  [x ~ x ~@4 x ~ x ~ x ~@4]!40
  ~@36
>`).gain(1.28)

// drums · congas · soft notes
const congas_soft_2 = s("conga:18").struct("<~@43 [~@9 x!4 ~@3] ~@100>").gain(0.51)

stack(
  trumpet, trumpet_soft, bass, string_ensemble_2, orchestral_harp, string_ensemble_1, tremolo_strings,
  electric_guitar_muted, electric_guitar_muted_2, kick, clap, hihat, hihat_soft, low_tom, mid_tom, tambourine,
  tambourine_soft, congas, congas_soft, congas_2, congas_soft_2
)

More by The Temptations