Strudelify

Up on the Roof

The Drifters

KeyG majorTempo125 bpm
0:00/0:00
// Up on the Roof — The Drifters
// 125 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: ch 3 "PIZZICATO STRINHGS" named as a string part, played on pizzicato strings (its rock organ patch is not one)
// note: Full arrangement: all 81 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(125/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 · vibraphone · "VIBES"
const vibraphone = note("<A@4 ~@5 A@2 ~@4 A@2 ~@12 A@2 ~@4 A@2 ~@8 A@2 ~@18 A@2 ~@4 A@2 B@2 C@2 B@2 C@2>".pickRestart({
  A: "[~@2 b3@2 [c4,e4] [d4,g4] ~ [g4,b4]@9, ~@2 d4 ~@13]/2", // C G5 G
  B: "[~@2 [b3,e4] ~ [e4,g4] [f#4,a4] ~ b4@9, ~@7 g4@8 ~]/2", C: "[~@2 [b3,d4]@2 [c4,e4] [d4,g4] ~ [g4,b4]@7 ~@2]/2",
})).s("gm_vibraphone").gain(0.6).pan(0.2)

// chords · pizzicato strings · "PIZZICATO STRINHGS"
const pizzicato_strings = note("<~ A@16 B C D C E F G H A@12 I J K J L I G H A@8 I J K J L I G H A@19 M>".pickRestart({
  A: "~@2 e5!2 d5!2 e5 ~", B: "~@2 [e4,g4,c5]!6", C: "~@2 [e4,a4,c5]!6", D: "~@2 [e4,b4,c5]!6", E: "~@2 [d4,g4,b4]!6",
  F: "~@2 [e4,g4,b4]!6", G: "~@2 [e4,g4,c5]!5 [f4,g#4,c#5]", H: "[f#4,a4,d5] ~@7", I: "~@2 [e4,g4]!6",
  J: "~@2 [e4,a4]!6", K: "~@2 [e4,b4]!6", L: "~@2 [g4,b4]!6", M: "~@2 e5 ~@5",
})).s("gm_pizzicato_strings").gain(0.8).pan(0.9)

// other · electric guitar clean · "MUTE GUITAR"
const electric_guitar_clean = note(`<
  ~ A@5 B C D A@3 E C D A@2 C@4 F E G H A B C D A@3 E C D A@2 C@4 F E G H A@3 E C D A@2 C@4 F E G H A B C D A@3 E C D
  A@2 B@2 A I J@2 K L
>`.pickRestart({
  A: "g2@3 g2 d3@4", B: "e2@3 e2 b2@4", C: "c3@3 c3 g2@4", D: "a2@3 a2 d3@4", E: "e3@3 e3 b2@4", F: "g2@3 g2 d3@3 ~",
  G: "c3@3 c3 c3@2 c3 c#3", H: "d3 ~@7", I: "g2@3 g1 d2@4", J: "e1@3 e1 b1@4", K: "g1@3 g1 d2@4", L: "g1@3 ~@5",
})).s("gm_electric_guitar_clean").gain(0.8).pan(0.8)

// bass · electric bass pick · "BASS"
const bass = note(`<
  ~ A@5 B C D A@3 E C D A@2 C@4 F E G H A B C D A@3 E C D A@2 C@4 F E G H A@3 E C D A@2 C@4 F E G H A B C D A@3 E C D
  A@2 B@2 A@2 B@2 A I
>`.pickRestart({
  A: "g1@3 g1 d2@4", B: "e1@3 e1 b1@4", C: "c2@3 c2 g1@4", D: "a1@3 a1 d2@4", E: "e2@3 e2 b1@4", F: "g1@3 g1 d2@3 ~",
  G: "c2@3 c2 c2@2 c2 c#2", H: "d2 ~@7", I: "g1@3 ~@5",
})).s("gm_electric_bass_pick").gain(0.66).pan(0.2)

// chords · epiano2 · "PIANO"
const epiano2 = note(`<
  ~ A@5 B C D A@3 E C D A@2 C@4 F E G H A B C D A@3 E C D A@2 C@4 F E G H A@3 E C D A@2 C@4 F E G H A B C D A@3 E C D
  A@2 B@2 A@2 B@2 A I
>`.pickRestart({
  A: "~@4 [b3,d4,g4] ~ [b3,d4,g4] ~@5 [b3,d4,g4] ~@3, g2@3 g2 d3@4", // G
  B: "~@4 [b3,e4,g4] ~ [b3,e4,g4] ~@5 [b3,e4,g4] ~@3, e2@3 e2 b2@4", // Em
  C: "~@4 [c4,e4,g4] ~ [c4,e4,g4] ~@5 [c4,e4,g4] ~@3, c3@3 c3 g2@4", // C
  D: "~@4 [c4,e4,a4] ~ [c4,e4,a4] ~@5 [d4,f#4,a4] ~@3, a2@3 a2 d3@4", // Am D
  E: "~@4 [b3,e4,g4] ~ [b3,e4,g4] ~@5 [b3,e4,g4] ~@3, e3@3 e3 b2@4", // Em
  F: "~@4 [b3,d4,g4] ~ [b3,d4,g4] ~@5 [b3,d4,g4] ~@3, g2@3 g2 d3@3 ~", // G
  G: "~@4 [c4,e4,g4] ~ [c4,e4,g4] ~ c3@4 [c4,e4,g4] ~ [c#4,f4,g#4] ~, c3@3 c3 ~@2 c3 c#3", // C C#
  H: "[d4,f#4,a4] ~@15, d3 ~@7", I: "~@4 [b3,d4,g4] ~@11, g2@3 ~@5",
})).s("gm_epiano2").gain(0.45).pan(0.4)

// chords · trumpet · "TRUMPETS"
const trumpet = note("<~@30 A ~@5 B ~@14 C@2 ~@2 D E ~@2 F G ~@5 A ~@5 A ~ A ~ A ~ A ~ H>".pickRestart({
  A: "~@4 [b3,d4] ~@3 [c4,e4] ~ [d4,g4] ~@3 [g4,b4] ~", B: "~@4 [b3,d4] ~@3 [c4,e4] ~ [d4,g4] ~@3 [g4,c5] ~",
  C: "[~@4 [b3,d4] ~@3 [c4,e4] ~ [d4,g4] ~@3 [g4,b4]@18]/2", D: "~ g4 c5 b4", E: "g4@3 ~", F: "~ a4 c5 e5",
  G: "f#5 ~@7", H: "~@4 [b3,d4] ~@11",
})).s("gm_trumpet").gain(0.66).pan(0.7)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@17 A B C D E F G H A I A E J@2 A I A E J@2 A B C D E F G H ~ K L M N O P@2 F Q I D I A G R A I A E J@2 A I A E S@2
  T@2 S@2 T@2 S@2
>`.pickRestart({
  A: "g5", B: "a5", C: "b5 g5 a5 b5", D: "c6@3 d6@3 c6@2", E: "d6", F: "e6",
  G: "c6@6 [g4,c5,e5,g5,c6] [g#4,c#5,f5,g#5,c#6]", H: "[a4,d5,f#5,a5,d6] ~@7", I: "b5", J: "d5/2",
  K: "~@12 [g4,g#4] [a4,a#4,b4] [c5,c#5,d5] [d#5,e5,f5]", L: "g5@2 g5@2 g5@2 a5 g5, f#5 ~@15", M: "c6 b5 g5@2 g5@3 g5",
  N: "c6 b5 g5 d5", O: "e5@8 d5@3 e5@2 g5@3",
  P: "[[b5,d6]@20 g4 [g#4,a4] a#4 [b4,c5] c#5 [d5,d#5] e5 [f5,f#5] g5 [g#5,a5] b5 [c6,c#6]]/2", Q: "c6", R: "f#5 ~@7",
  S: "d6/2", T: "e6/2",
})).s("gm_string_ensemble_1").gain(0.55).pan(0.3)

// drums · kick
const kick = s("bd").struct("<~ A@23 B A@19 B A@15 B A@19 B>".pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x",
})).gain(0.61)

// drums · snare
const snare = s("sd").struct("<~ A@23 ~ A@19 ~ A@15 ~ A@19 B>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.61)

// drums · ride
const ride = s("rd").struct("<~ A@23 B A@19 B A@15 B A@19 C>".pickRestart({
  A: "x ~ x ~ x!3 ~", B: "x", C: "x!2 ~@2",
})).gain(0.68)

// drums · bongos
const bongos = s("bongo:4").struct("<~ [x ~ x ~ x!3 ~]!79 [x!2 ~@2]>").gain(1.61)

stack(
  vibraphone, pizzicato_strings, electric_guitar_clean, bass, epiano2, trumpet, string_ensemble_1, kick, snare, ride,
  bongos
)

More by The Drifters