Strudelify

Someday We'll Be Together

The Supremes

KeyD♭ majorTempo108 bpm
0:00/0:00
// Someday We'll Be Together — The Supremes
// 108 bpm, 4/4, key Db major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 94 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(108/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 · brass section · "FX8 (SCI-FI)"
const brass_section = note(`<
  ~@13 A B C@2 A B C@2 D E F@2 G H I J K B C@2 A B C@2 L@2 M@2 N@2 O P@2 B C@2 A B C@2 Q R S T U V W X@3 Q Y Z@2 AA@2
  L@2 M@2 N@2 O P@2 B C@2 A B C@2 AB B C@2 A B C@2 ~
>`.pickRestart({
  A: "~@3 bb4", B: "ab4 eb4@6 eb4@3 eb4@2 ~ eb4@2 ~, ~ f4 ~@14", C: "[eb4@15 db4@16 ~]/2",
  D: "~@6 ab3 ~ db4 ~ db4@4 bb3@2", E: "db4 bb3 ab3@3 ~@11", F: "[~@6 ab3 ~ f4@2 eb4@4 db4@4 eb4 f4@5 ~@8]/2",
  G: "~@3 bb3!2 db4 ~ f4", H: "~ eb4@2 db4 eb4 bb3@3", I: "~@6 db4@2 ab4@3 ~ db4@3 bb3",
  J: "db4@3 eb4 f4@3 bb3 db4@3 bb3 db4@3 eb4", K: "f4@3 ~@9 bb4@4",
  L: "[~@6 ab3@2 db4 ~ db4@2 bb3@2 db4@4 bb3@2 ab3@2 db4@4 bb3@2 ab3@2 ~@2]/2",
  M: "[~@4 f4 eb4@2 db4@2 bb3 db4@2 ~@4]/2", N: "[~ ab4@2 ab4@2 ab4@2 ab4@2 f4 eb4 db4 eb4 db4 bb3 db4]/2",
  O: "~@3 db4 ab4 f4 eb4 db4", P: "[eb4 db4 bb3 db4!3 bb3 ~ f4 bb3 ab3@2 ~@2 bb4@2, ~@7 db4@2 ~@7]/2",
  Q: "~@4 bb3 db4 eb4 f4", R: "~ eb4 ~ db4 eb4 ~ bb3@2", S: "~@4 db4 eb4 ~ f4", T: "~ f4 ~ eb4 f4 eb4 db4 eb4",
  U: "f4 ~@3 eb4 db4@2 ~", V: "~@3 db4 ab4 f4@2 eb4", W: "f4 eb4 db4 eb4 f4@2 ~@2",
  X: "[~@3 eb4@2 db4@2 eb4@2 db4 ~@2 bb3!2 db4 f4@2 eb4 ~ f4@2 eb4 db4@2]/3", Y: "~ eb4@2 f4@2 eb4 db4 bb3",
  Z: "[~@3 bb3 db4 eb4 f4 f4@2 eb4 db4 ab4 ~ bb4@3]/2", AA: "[ab4 f4 eb4@5 ~ ab4 f4 eb4@2 ~@2 db5@17 ~]/2",
  AB: "f4 bb3 ab3@2 ~@2 bb4@2",
})).s("gm_brass_section").gain(0.36).pan(0.2)

// other · tremolo strings
const tremolo_strings = note(`<
  ~@3 A B ~@16 C@4 D@2 E@2 ~@8 C@4 D@2 F@2 G H I J K L M@2 D@4 C@4 N O P Q R S ~ T U@2 V W X O Y Z AA AB AC AD AE AF AC
  AG AA AB AC AD AE AF AC AG ~
>`.pickRestart({
  A: "ab4!16", B: "ab4!12 ~@4", C: "[db4,f4]/2", D: "[db4,gb4]/2", E: "[db4,g4]/2",
  F: "[~@24 f4 gb4 ab4 bb4 c5 db5 eb5 e5, [db4,g4]]/2", G: "f5 eb5 db5 eb5 f5@12", H: "eb5 db5 c5 db5 eb5@12",
  I: "bb4 ~@2 bb4@3 db5 eb5", J: "db5@3 ~ db5 bb4 ab4 ~ db5@3 ~ db5 bb4 ab4 ~", K: "~ f5 eb5 db5", L: "ab5@7 ~",
  M: "db5/2", N: "~@4 eb5@3 db5", O: "bb4", P: "f5@2 eb5 db5", Q: "a4@2 db5 eb5", R: "f5 eb5 db5@6 eb5@4 f5@4",
  S: "db5", T: "ab4 bb4 db5 ~ ab4 bb4 db5 ~ ab4 bb4 db5 ~ ab4 bb4 db5 ~", U: "[db5@5 f5 eb5 db5]/2", V: "ab4",
  W: "db5@2 eb5 f5", X: "eb5@7 f5", Y: "e5@7 eb5", Z: "db5@8 ab4 bb4 c5 db5 eb5 f5 gb5 g5", AA: "ab5@3 f5",
  AB: "eb5@2 f5 eb5", AC: "db5@3 bb4", AD: "ab4@8 ab4 bb4 db5 eb5 db5 ~ bb4 ab4", AE: "db5@3 f5", AF: "eb5",
  AG: "ab4@8 ab4 bb4 db5 eb5 db5 bb4 ab4 bb4",
})).s("gm_tremolo_strings").gain(0.35).pan(0.1)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A B@3 C D@3 E F@2 G@2 H I J K L M J N ~@7 O P I J K L M J N ~@4 Q ~ R S T U V W X Y Z@2 ~@8 AA AB AC AD AE AF ~ AG
  AH@2 N AI AJ AB AK AL AM I J K L M J AN AM I J K L M J AN ~
>`.pickRestart({
  A: "~@14 ab2 ~", B: "db3 ~ ab3!6 db3 ~ ab3!6",
  C: "db3 ~ ab3!6 db3 ~ ab3!2 [ab3,ab4] [ab3,bb4,c5] [ab3,db5,eb5] [ab3,f5,gb5]", // Ab Absus4 Db
  D: "[g5 ~@3 ab2@4 db3@6 eb3@2 ~@8 bb5@2 ab5 ~ f5 eb5 db5 ~@5 db3@4 f3@6 gb3@2, ab5@3 ~ f5@2, ~@8 f3@9 ~@7]/3",
  E: "eb5@8 db5 eb5 f5 gb5 ab5 bb5 b5 c6, ab3", F: "[~@4 ab3@3 gb3 ~@4 gb5@3 ab5, db6@3 ~, ~ db3]/2",
  G: "[~@4 c4@3 bb3 ~@2 db6@2 c6@2 bb5@2, bb5@5 ~@3, ~ e3]/2", H: "ab5@3 f6", I: "eb6@2 f6 eb6", J: "db6@3 bb5",
  K: "ab5@8 ab5 bb5 db6 eb6 db6 ~ bb5 ab5", L: "db6@3 f6", M: "eb6", N: "ab5",
  O: "~@12 ab4 [bb4,c5] [db5,eb5] [f5,gb5]", P: "ab5@3 f6, g5 ~@15", Q: "[gb4,gb5] [ab4,ab5] [bb4,bb5]@14",
  R: "bb4 c5 db5@14", S: "~@8 f5 gb5 ab5 bb5 c6 db6 eb6 e6", T: "f6 eb6 db6 eb6 f6@12", U: "eb6 db6 c6 db6 eb6@12",
  V: "bb5 ~@2 bb5@3 db6 eb6", W: "db6@3 ~ db6 bb5 ab5 ~ db6@3 ~ db6 bb5 ab5 ~", X: "~ f6 eb6 db6", Y: "ab6@7 ~",
  Z: "db6/2", AA: "~@4 eb6@3 db6", AB: "bb5", AC: "f6@2 eb6 db6", AD: "a5@2 db6 eb6", AE: "f6 eb6 db6@6 eb6@4 f6@4",
  AF: "db6", AG: "ab5 bb5 db6 ~ ab5 bb5 db6 ~ ab5 bb5 db6 ~ ab5 bb5 db6 ~", AH: "[db6@5 f6 eb6 db6]/2",
  AI: "db6@2 eb6 f6", AJ: "eb6@7 f6", AK: "e6@7 eb6", AL: "db6@8 ab5 bb5 c6 db6 eb6 f6 gb6 g6", AM: "ab6@3 f6",
  AN: "ab5@8 ab5 bb5 db6 eb6 db6 bb5 ab5 bb5",
})).s("gm_string_ensemble_1").gain(0.25).pan(0.9)

// bass · electric bass finger · "BASS"
const bass = note(`<
  ~@2 A B@3 C B D E@2 F G H I J B D K J B@2 L@2 D E@2 M G H I J B D K J B@2 L@2 D E@2 M G H I J B D K J B N O P Q R S@2
  T N O P U V W X ~ B L@2 D E@2 M G H I J B D K J B H I J B D K J B ~
>`.pickRestart({
  A: "~@14 ab1 ~", B: "db2 ~ db2 ~@3 ab1 ~ db2 ~ db2 ~@3 ab1 ~", C: "db2 ~ db2 ~@3 ab1 ~ db2 ~ db2 ~@2 db2 ab1 ~",
  D: "db2 ~ db2 ~@3 ab1 ~ db2 ~ db2 ~@3 db2 ~", E: "gb1 ~ gb1 ~@3 db2 ~ gb1 ~ gb1 ~@3 db2 ~",
  F: "g1 ~ g1 ~@3 db2 ~ g1 ~ g1 ~@3 db2 ~", G: "g1 ~ g1 ~@3 db2 ~ g1 ~ g1 ~@3 g1 ~",
  H: "ab1@3 ~@3 ab1 ~ ab1 ~ ab1 ~@3 eb2 ~", I: "ab1 ~ ab1 ~@3 ab1 ~ ab1 ~ ab1 ~@3 ab1 ~",
  J: "gb1 ~ gb1 ~@3 db2 ~ gb1 ~ gb1 ~@3 gb1 ~", K: "ab1 ~ ab1 ~@3 eb2 ~ ab1 ~ ab1 ~@3 db2 ~",
  L: "db2 ~ db2 ~@3 ab1 ~ db2@2 db2 ~@3 ab1 ~", M: "g1@2 g1 ~@3 db2 ~ g1 ~ g1 ~@3 db2 ~",
  N: "gb2 ~ gb2 ~@3 db2 ~ gb2@2 gb2 ~@3 db2 ~", O: "gb2@2 gb2 ~@3 db2 ~ gb2 ~ gb2 ~@3 db2 ~",
  P: "gb2@2 gb2 ~@3 db2 ~ gb2@2 gb2 ~@3 db2 ~", Q: "gb2@2 gb2 ~@3 db2 ~ gb2 ~ gb2 ~@3 gb2@2",
  R: "db2 ~ db2 ~@3 ab2 ~ db2 ~ db2 ~@3 ab2 ~", S: "db2@2 db2 ~@3 ab2 ~ db2 ~ db2 ~@3 ab2 ~",
  T: "db2@2 db2 ~@3 ab2 ~ db2@2 db2 ~@3 db2 ~", U: "gb2@2 gb2 ~@3 db2 ~ gb2 ~ gb2 ~@3 bb1@2",
  V: "eb2 ~ eb2 ~@3 bb1 ~ eb2 ~ eb2 ~@3 bb1 ~", W: "eb2 ~ eb2 ~@3 bb1 ~ eb2 ~ eb2 ~@3 eb2 ~",
  X: "ab1 ~ ab1 ~@3 eb2 ~ ab1@2 ab1 ~@3 ab1@2",
})).s("gm_electric_bass_finger").gain(0.32).pan(0.1)

// other · electric guitar muted · "MUTE GUITAR"
const electric_guitar_muted = note("<[~@14 ab2 ~] [db3 ~ ab3!6 db3 ~ ab3!6]!4 ~@89>")
  .s("gm_electric_guitar_muted").gain(0.14).pan(0.9)

// other · pad poly · "PAD3"
const pad_poly = note("<~@5 A@4 B@3 C D E F D@2 E F D ~@8 D E F D@2 E F D G ~@7 D E F D@2 E F D ~@41>".pickRestart({
  A: "f4/4", B: "db4/3", C: "e4 g4 bb4 db5", D: "f4", E: "eb4", F: "db4", G: "~@2 [db4,f4] ~ [db4,f4] ~@11",
})).s("gm_pad_poly").gain(0.32).pan(0.2)

// other · pad poly · "PAD 3 (POLYSYNTH)"
const pad_poly_2 = note("<~@16 A B ~ C D ~@10 E F ~ G ~ H I ~@9 E F ~ G ~ H J ~@40>".pickRestart({
  A: "db5!2 ~@2 db5!2 ~@2 db5!2 ~@2 db5!3 ~", B: "bb4 ab4 ~@4 db4@2 bb3 ab3@2 ~@5", C: "~@7 eb5",
  D: "db5@3 ~@3 eb5@2 db5@3 ~@5", E: "~@8 db5@7 ~", F: "db5@2 db5@2 db5@4 db5@2 db5@2 bb4 ab4@3",
  G: "~@4 f4@2 ab4!2 ~ eb4@7, ~@9 f4 ~@6", H: "~@4 db5@3 ~ db5@3 ~ db5@3 ~", I: "bb4 ab4@3 ~@12", J: "bb4 ~@15",
})).s("gm_pad_poly").gain(0.44).pan(0.6)

// other · brass section · "FX4 (ATMOSPHERE)"
const brass_section_2 = note(`<
  ~@13 A B C@2 A B C@2 D E F@2 G H I J K B C@2 A B C@2 L@2 M@2 N@2 O P@2 B C@2 A B C@2 Q R S T U V W X@3 Q Y Z@2 AA@2
  L@2 M@2 N@2 O P@2 B C@2 A B C@2 AB B C@2 A B C@2 ~
>`.pickRestart({
  A: "~@3 bb5", B: "ab5 eb5@6 eb5@3 eb5@2 ~ eb5@2 ~, ~ f5 ~@14", C: "[eb5@15 db5@16 ~]/2",
  D: "~@6 ab4 ~ db5 ~ db5@4 bb4@2", E: "db5 bb4 ab4@3 ~@11", F: "[~@6 ab4 ~ f5@2 eb5@4 db5@4 eb5 f5@5 ~@8]/2",
  G: "~@3 bb4!2 db5 ~ f5", H: "~ eb5@2 db5 eb5 bb4@3", I: "~@6 db5@2 ab5@3 ~ db5@3 bb4",
  J: "db5@3 eb5 f5@3 bb4 db5@3 bb4 db5@3 eb5", K: "f5@3 ~@9 bb5@4",
  L: "[~@6 ab4@2 db5 ~ db5@2 bb4@2 db5@4 bb4@2 ab4@2 db5@4 bb4@2 ab4@2 ~@2]/2",
  M: "[~@4 f5 eb5@2 db5@2 bb4 db5@2 ~@4]/2", N: "[~ ab5@2 ab5@2 ab5@2 ab5@2 f5 eb5 db5 eb5 db5 bb4 db5]/2",
  O: "~@3 db5 ab5 f5 eb5 db5", P: "[eb5 db5 bb4 db5!3 bb4 ~ f5 bb4 ab4@2 ~@2 bb5@2, ~@7 db5@2 ~@7]/2",
  Q: "~@4 bb4 db5 eb5 f5", R: "~ eb5 ~ db5 eb5 ~ bb4@2", S: "~@4 db5 eb5 ~ f5", T: "~ f5 ~ eb5 f5 eb5 db5 eb5",
  U: "f5 ~@3 eb5 db5@2 ~", V: "~@3 db5 ab5 f5@2 eb5", W: "f5 eb5 db5 eb5 f5@2 ~@2",
  X: "[~@3 eb5@2 db5@2 eb5@2 db5 ~@2 bb4!2 db5 f5@2 eb5 ~ f5@2 eb5 db5@2]/3", Y: "~ eb5@2 f5@2 eb5 db5 bb4",
  Z: "[~@3 bb4 db5 eb5 f5 f5@2 eb5 db5 ab5 ~ bb5@3]/2", AA: "[ab5 f5 eb5@5 ~ ab5 f5 eb5@2 ~@2 db6@17 ~]/2",
  AB: "f5 bb4 ab4@2 ~@2 bb5@2",
})).s("gm_brass_section").gain(0.36).pan(0.8)

// chords · electric guitar clean · "EL. GUITAR"
const electric_guitar_clean = note(`<
  ~@21 A@4 B@2 C@2 ~@8 A@4 B@2 C@2 ~@8 D@4 E@3 F D@2 G@2 H@2 I ~ A@4 B@2 C@2 ~@17
>`.pickRestart({
  A: "[~ [db4,f4,ab4]@24 ~@7, [db3,ab3]@3 ~]/2", B: "[~ [db4,gb4]@24 ~@7, [gb3,bb3]@3 ~]/2",
  C: "[~ [db4,g4]@24 ~@7, [g3,bb3]@3 ~]/2", D: "~@4 [bb4,db5,gb5] ~@7 [bb4,db5,gb5] ~@3",
  E: "~@4 [ab4,db5,f5] ~@7 [ab4,db5,f5] ~@3", F: "~@4 [ab4,b4,f5] ~@7 [ab4,b4,f5] ~@3",
  G: "~@4 [a4,db5,gb5] ~@7 [a4,db5,gb5] ~@3", H: "~@4 [bb4,eb5,g5] ~@7 [bb4,eb5,g5] ~@3", I: "~@4 [ab4,c5,eb5] ~@11",
})).s("gm_electric_guitar_clean").gain(0.46).pan(0.1)

// drums · kick
const kick = s("bd").struct(`<
  ~@3 A@13 B A@3 B A@11 B A@3 B A@11 B A@3 B A@6 C D A@7 ~ A@11 B A@3 B A@3 B A@3 B ~
>`.pickRestart({
  A: "x!2 ~@2 x!2 ~@2", B: "x!6 ~ x", C: "x!2 ~@2 x!4", D: "x!8",
})).gain(0.28)

// drums · rim
const rim = s("rim").struct("<~@5 A@11 ~ A@3 ~@9 A@3 ~ A@3 ~@9 A@3 ~ A@3 ~@25 A@3 ~ A@3 ~ A@3 ~ A@3 ~@2>".pickRestart({
  A: "~ x ~ x",
})).gain(0.4)

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

// drums · hihat
const hihat = s("hh").struct(`<
  ~@5 A@11 ~ A@3 ~ A@11 ~ A@3 ~ A@11 ~ A@3 ~ A@15 ~ A@11 ~ A@3 ~ A@3 ~ A@3 ~@2
>`.pickRestart({
  A: "x!8",
})).gain(0.24)

// drums · crash
const crash = s("cr").struct("<~@25 A ~@15 A ~@15 A ~@7 A ~@7 A ~@20>".pickRestart({
  A: "x",
})).gain(0.28)

// drums · bongos
const bongos = s("bongo:18").struct("<~@67 [~@6 x!2] [~@2 x!2 ~@2 x!2] ~@25>").gain(0.74)

// drums · congas
const congas = s("conga:18").struct("<~@67 [~@8 x!4 ~@4] [x!2 ~@2 x!2 ~@2] ~@25>").gain(0.77)

stack(
  brass_section, tremolo_strings, string_ensemble_1, bass, electric_guitar_muted, pad_poly, pad_poly_2, brass_section_2,
  electric_guitar_clean, kick, rim, snare, hihat, crash, bongos, congas
)

More by The Supremes