Strudelify

On and On

Stephen Bishop

KeyA♭ majorTempo93 bpm
0:00/0:00
// On and On — Stephen Bishop
// 93 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 79 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(93/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.

// bass · fretless bass · "Bass"
const bass = note(`<
  ~@6 A B C B D B C E C F G B H I J B C B C B D K L E L I M K N I J B C E O P N Q O R@2 I S C B C B D B C E T F M B H I
  J C B S U V B W X C K C K Y ~@2
>`.pickRestart({
  A: "~@7 eb1", B: "ab1@3 ab1@5", C: "ab1@13 ~ ab1@2", D: "db1@3 eb1@4 eb1", E: "db1@3 db1@5", F: "bb1@3 bb1@4 bb1",
  G: "eb1@7 eb1", H: "eb1@3 f1@4 f1", I: "bb1@3 bb1@5", J: "eb1@4 eb1@3 eb1", K: "ab1@3 ab1@4 ab1", L: "ab1@13 ~ c2@2",
  M: "bb1@3 eb1@4 eb1", N: "f1@13 ~ f1@2", O: "c2@13 ~ c2@2", P: "bb1@3 bb1 eb1@3 eb1", Q: "bb1@3 db1@4 db1",
  R: "[db1@6 d1@8 bb1@15 ~ bb1@2]/2", S: "bb1@13 ~ bb1@2", T: "ab1@6 ab1 c2", U: "eb1@3 eb1 eb1@4", V: "ab1@3 ab1",
  W: "bb1@7 bb1", X: "eb1@3 eb1 eb1@3 eb1", Y: "ab1@7 ~",
})).s("gm_fretless_bass").gain(0.19)

// chords · piano · "Piano 1"
const piano = note(`<
  A B A C A D A E F E G H F I F J K L M N O H F H F E P E Q R Q J S H T U O L F V W X T Y W Z AA@2 AB L F E F AC F L AD
  AE AB AF F AG AB AH F L AB AI AJ E AB AI F L F H AK@2 ~
>`.pickRestart({
  A: "~@7 eb3", B: "~@7 ab3, ab3@2 ab3@5 ~, ~ eb3@4 eb3@3, ~@3 db4@5, ~@3 f3",
  C: "~@7 g3, g3@2 g3@5 ~, ~ eb3@4 eb3@3, ~@3 bb3@5, ~@3 f3",
  D: "~@7 eb4, c4@3 c4@5, ~ ab3@5 ab3@2, ~@2 eb4@5 ~, ~@5 eb3@3", E: "~@7 eb4, ab2, ~@5 eb3@3, ~@3 ab3", F: "ab3@7 ab3",
  G: "db3@3 ~@4 eb3, ~@3 eb2@5", H: "ab2@5 ~@2 ab3, ~@5 ab2@3, ~@3 eb3", I: "db2@3 ~@4 db2, ~@3 ab2@3 ab2@2, ~@5 db3@3",
  J: "~@7 bb1, bb1@7 ~, ~@5 bb2@3, ~@3 f2", K: "eb3@7 eb3", L: "~@7 ab2, ab2@7 ~, ~@5 ab3@3, ~@3 eb3",
  M: "eb3@3 ~@4 f3, ~@3 f2@5", N: "bb1@5 ~@2 bb2, ~@5 bb1@3, ~@3 f2", O: "eb3@4 ~@3 eb3, ~ bb2", P: "db3@3 eb3@4 eb3",
  Q: "ab3@7 c3", R: "db2@3 db3@2 ~@2 db2, ~@5 db3@3, ~@3 ab2", S: "bb2@3 ~@4 eb3, ~@3 eb2@5", T: "f3@7 f3",
  U: "~@7 f3, bb1, ~@5 f2@3, ~@3 bb2", V: "~@7 ab3, db2, ~@5 ab2@3, ~@3 db3", W: "c3@7 c3",
  X: "bb1@4 ~@3 bb3, ~ bb2, ~@3 eb3", Y: "bb1@3 ab2@2 ~@2 ab3, ~@5 ab2@3, ~@3 db3",
  Z: "db2@3 d2@2 ~ d3 bb1, ~@5 d2@2 ~", AA: "[bb2@7 ~@8 bb1, ~@7 bb2@6 bb2@3, ~@8 bb1@7 ~, ~@7 f2]/2", AB: "bb2@7 bb2",
  AC: "db2@3 ~@4 eb3, ~@3 bb2@3 bb2@2, ~@5 eb2@3", AD: "db3@3 ~@4 db3, ~@3 ab2@5", AE: "ab2@5 ab2 eb3 c3",
  AF: "bb1@3 ~@4 eb2, ~@3 bb2@3 bb2@2, ~@5 eb3@3", AG: "eb2@3 f3@2 ~@2 f2, ~@5 f3@3, ~@3 c3",
  AH: "eb2@4 ~@3 bb3, ~ bb2, ~@3 eb3", AI: "eb2@4 ~@3 eb3, ~ eb2, ~@3 bb2", AJ: "ab3@3 ab3", AK: "ab3/2",
})).s("gm_piano").gain(0.19).pan(0.7)

// chords · piano · "Piano 2"
const piano_2 = note(`<
  A B A C D E F G@3 H G@2 I G J K L M J N G@5 O G P I Q J R L S J T G@2 U V W X Y V Z AA@3 G@4 O G@2 I AB J R L M J N
  G@2 J AC AD G J N G@4 AE@3
>`.pickRestart({
  A: "[ab3,c4,eb4]@3 [ab3,c4,eb4]@5", B: "[ab3,db4,eb4,f4]", C: "[g3,bb3,eb4,f4]",
  D: "[ab3,db4,eb4,f4]@3 [ab3,db4,eb4,f4]@5", E: "[ab3,c4,eb4]", F: "[g3,bb3,eb4,f4]@3 [g3,bb3,eb4,f4]@5",
  G: "~@3 c4@5, ab3, ~ eb3@7, ~ bb3@3", H: "~@2 f3 eb4@5, eb3@3 ~@5, ~ db3@2 ~@5",
  I: "~@2 ab3 ab3@5, f3@3 ~@5, ~ eb3@2 ~@5", J: "~@3 db4@5, f3, ~ db3@7, ~ ab3@3", K: "~@3 db4@5, g3, ~ db3@7, ~ bb3@3",
  L: "~@3 eb4@5, g3, ~ eb3@7, ~ c4@3", M: "~@2 g3 eb4@5, f3@3 ~@5, ~ eb3@2 ~@5",
  N: "~@3 eb4 g3@4, ab3 ~, ~ eb3@3 ~@4, ~ bb3 ~@2", O: "~@2 ab3 eb4@5, f3@3 ~@5, ~ eb3@2 ~@5",
  P: "~@3 c4@4 g3, ab3@7 ~, ~ eb3@6 ~, ~@2 bb3@5 ~", Q: "~@3 c4@4 eb3, ab3@7 ~, ~ eb3@6 ~, ~@2 bb3@5 ~",
  R: "~@2 f3 db4@5, eb3@3 ~@5, ~ db3@2 ~@5", S: "~@3 eb4@5, a3, ~ eb3@7, ~ c4@3",
  T: "~@3 eb4 eb3@4, ab3 ~, ~ eb3@3 ~@4, ~ bb3 ~@2", U: "~@3 f4@5, ab3, ~ f3@7, ~ c4@3",
  V: "~@3 eb4@5, g3, ~ eb3@7, ~ bb3@3", W: "~@3 db4 bb3@4, f3 ~, ~ db3@3 ~@4, ~ ab3 ~@2",
  X: "~@3 bb3@5, f3, ~ eb3@7, ~ ab3@3", Y: "~@2 bb3 f4@5, f3@3 ~@5, ~ db3@2 ~@5",
  Z: "~@2 f3 d4@4 db3, eb3@3 ~@5, ~ db3@2 ~@5", AA: "~@3 bb3@5, eb3, ~ db3@7, ~ ab3@3",
  AB: "~@3 c4@3 eb3 bb3, ab3@3 ~, ~ eb3@5 ~@2, ~ bb3@2 ~", AC: "~@3 eb4 bb3@4, ab3 ~, ~ eb3@3 ~@4, ~ bb3 ~@2",
  AD: "~@3 c4@3 ab3@2, ab3@3 ~, ~ eb3@5 ~@2, ~ bb3@2 ~",
  AE: "[~@4 ab5@13 ~@7, ab3@2 ~, ab1@3 eb5@13 ~@8, ~ eb3@15 ~@8, ~ ab4@7 ~@4]/3",
})).s("gm_piano").gain(0.15).pan(0.7)

// other · piano · "Pian 3"
const piano_3 = note(`<
  [ab1 ab1@2 ab1]
  [~@3 ab3@5, db2]
  [ab1 ~@2 ab2, ~ ab1@3]
  [~@3 bb3@5, eb3]
  [db2 ~@2 db3, ~ db2@3]
  [~@3 eb3@5, ab1]
  [eb2 ~@2 eb3, ~ eb2@3]
  ~@72
>`).s("gm_piano").gain(0.13).pan(0.3)

// other · acoustic guitar nylon · "Guitar 1"
const acoustic_guitar_nylon = note(`<
  A@8 B@2 C B@2 D B E F B G E H B@5 C B I D I E J B K E H B@2 L M N K O M P@2 E@2 B@4 C B@2 D Q E J B G E H B@2 E H R B
  E H B@5 ~@2
>`.pickRestart({
  A: "[~@7 ab2, c4@6 eb3@3 f3@7 ~@2 eb4@6 ~@3 eb4@5 ~@3 db4@5 c4@8 bb3@2 bb3@6 ~@8, ~ ab3@7 ab3@2 ab3@6 ~ ab3@5 ab3@3 g3@7 ab3@2 ab3@6 ~ ab3@5 ab3@3 g3@7 ~@8, ~@2 eb4@6 ~@3 db4@5 c4@8 bb3@2 bb3@6 ~@6 db3@3 ~@2 ab4@5 ~@6 eb3@3 ~@7, ~@3 ab4@5 ~@6 eb3@3 ~@2 ab4@5 ~@6 eb3@3 f3@7 ~@2 eb4@6 ~@3 eb4@5 ~@8]/8",
  B: "ab2", C: "db2@3 eb2@5", D: "db2@3 db2@5", E: "bb2", F: "eb2", G: "eb2@3 f2@5", H: "eb2!2", I: "ab2@7 c3",
  J: "bb2@3 eb2@5", K: "f2", L: "db2", M: "c3", N: "bb2 eb2", O: "bb2@3 db2@5", P: "[db2@3 d2@4 bb2@9]/2",
  Q: "ab2@6 ab2 c3", R: "ab2@3 ab2",
})).s("gm_acoustic_guitar_nylon").gain(0.1).pan(0.3)

// chords · acoustic guitar nylon · "Guitar 2"
const acoustic_guitar_nylon_2 = note(`<
  ~@7 A B A C D E F E G H I J K L D E M N D O A P F Q K R S T G L D B U V W X Y Z AA AB@2 E@2 M N D O A N F AC K AD AE
  AF K AG E M AH L AI D AJ AK E D E D AL@3
>`.pickRestart({
  A: "~@7 bb3, ab3 ab3@2 ab3, ~ eb3@4 eb3@3, ~@3 bb3@4 ~",
  B: "~@7 c4, ab3@3 ab3@3 ab3@2, ~ c4@6 ~, ~@2 eb3@3 eb3@3, ~ bb3",
  C: "~@2 f3 ~@4 bb3, f3@2 ~ bb3@4 ~, ~ eb3@2 ~ g3@2 g3@2, ~@5 eb3@3",
  D: "~@7 bb3, ab3@3 ab3@3 ab3@2, ~ c4@7, ~@2 eb3@3 eb3@3", E: "~@7 bb3, ab3!4, ~ eb3@4 eb3@3, ~@3 bb3@4 ~",
  F: "~@2 eb3 ~@4 ab3, f3@3 f3@3 f3@2, ~ bb3@2 ~@2 eb3@3", G: "~@7 db4, ab3@3 ab3@3 ab3@2, ~ db4@6 ~, ~@2 f3@3 f3@3",
  H: "~@7 g4, bb3@3 bb3@3 bb3@2, ~ g4@6 ~, ~@2 g3@3 g3@3, ~ db4", I: "~@7 c4, g3 g3@2 g3, ~ eb3@4 eb3@3, ~@3 c4@4 ~",
  J: "~@2 f3 ~@4 c4, f3@2 ~ c4@4 ~, ~ eb3@2 ~ a3@2 a3@2, ~@5 eb3@3",
  K: "~@7 db4, ab3@3 ab3@3 ab3@2, ~ f4@7, ~@2 f3@3 f3@3", L: "~@3 bb3 ~@3 bb3, ab3!2 g3!2, ~ eb3@3 ~ eb3@3",
  M: "~@7 bb3, ab3@3 ab3@3 ab3@2, ~ bb3@6 ~, ~@2 eb3@3 eb3@3",
  N: "~@7 bb3, ab3@3 ab3@3 ab3@2, ~ bb3@3 bb3@3 ~, ~@2 eb3@3 eb3@3",
  O: "~@2 eb3 ~@4 eb4, f3@3 g3@3 g3@2, ~ bb3@2 ~ bb3@4, ~@5 eb3@3",
  P: "~@6 ab3 bb3, ab3@3 ab3@3 ~@2, ~ bb3@3 bb3@3 ~, ~@2 eb3@3 eb3@2 ~",
  Q: "~@6 ab3 bb3, ab3!3 ~, ~ eb3@4 eb3@2 ~, ~@3 bb3@4 ~",
  R: "~@2 f3 ~@4 db4, f3@2 ~ db4@4 ~, ~ eb3@2 ~ bb3@2 bb3@2, ~@5 g3@3",
  S: "~@7 c4, g3@3 g3@3 g3@2, ~ c4@6 ~, ~@2 eb3@3 eb3@3", T: "~@7 c4, a3!4, ~ eb3@4 eb3@3, ~@3 c4@4 ~",
  U: "~@7 c4, ab3 ab3@2 ab3, ~ f3@4 f3@3, ~@3 c4@4 ~", V: "~@7 bb3, g3@3 g3@3 g3@2, ~ bb3@3 bb3@3 ~, ~@2 eb3@3 eb3@3",
  W: "~@3 ab3 ~@3 db4, ab3@3 ~@2 g3@3, ~ f4@3 g4@4, ~ f3 ~ bb3", X: "~@7 ab3, f3!4, ~ eb3@4 eb3@3, ~@3 ab3@4 ~",
  Y: "~@2 f3 ~@4 c4, bb3@3 ab3@3 ab3@2, ~ db4@2 ~@2 f3@3", Z: "~@7 bb3, g3!4, ~ eb3@4 eb3@3, ~@3 bb3@4 ~",
  AA: "~@2 eb3 ~@3 ab3 bb3, f3@3 ab3@3 ~@2, ~ db4@2 ~@2 f3@2 ~",
  AB: "[~@15 bb3, ab3@3 ab3@3 ab3@2 ab3@2 ab3@4 ab3@2, ~ db4@6 db4@9, ~@2 eb3@3 eb3@4 eb3@4 eb3@3, ~@4 bb3@7 bb3@4 ~]/2",
  AC: "~@5 eb3 ab3 bb3, ab3!3 ~, ~ eb3@4 ~@3, ~@3 bb3@3 ~@2",
  AD: "~@2 eb3 ~@4 db4, f3@3 ~ db4@3 ~, ~ bb3@2 bb3@3 bb3@2, ~@5 g3@3",
  AE: "~@7 c4, g3@3 g3@3 g3@2, ~ eb4@7, ~@2 eb3@3 eb3@3",
  AF: "~@2 eb3 ~@4 c4, f3@3 ~ c4@3 ~, ~ g3@2 a3@3 a3@2, ~@5 eb3@3",
  AG: "~@3 ab3 ~@3 eb4, ab3@3 ~ bb3@4, ~ eb4@3 ~@2 g3@2, ~@2 eb3@2 ~ eb3@3",
  AH: "~@7 f4, ab3@3 ab3@3 ab3@2, ~ f4@6 ~, ~@2 f3@3 f3@3, ~ db4",
  AI: "~@5 eb3 ~ c4, ab3!4, ~ eb3@4 ~@3, ~@3 bb3@3 ~@2", AJ: "~@7 db4, ab3!4, ~ f3@4 f3@3, ~@3 db4@4 ~",
  AK: "~@3 ab3 ~@3 bb3, ab3@3 ~@3 g3@2, ~ eb4@3 g4@4, ~@2 eb3@2 ~ eb3@3",
  AL: "[ab3 ~ ab4@23 ~@23, [ab2,c3]@13 ~@11, ~ ab3@35 ~@12, ~ [eb3,c4]@27 ~@20]/3", // Ab Cm
})).s("gm_acoustic_guitar_nylon").gain(0.16).pan(0.3)

// other · flute · "Harmony"
const flute = note(`<
  ~@14 A B@2 C D E F@2 ~@6 G ~ A B@2 C D E F@2 ~@19 A B@2 H D E I@2 A J K L M N O@3 ~@5
>`.pickRestart({
  A: "~@5 eb5@2 f5", B: "[db5@4 ~ c5 ab4 eb5@2 db5@2 c5@2 ab4 f4@2]/2", C: "f4@2 eb5@2 eb5@2 eb5@3 ~ eb5@2 eb5 ~ eb5@2",
  D: "~@2 eb5@3 ~ f5@4 ab5@4 eb5@2", E: "~@2 f5@2 db5@5 ~ eb5@4 f5@2", F: "[db5@2 ~@2 eb5 db5 ab4 c5@7 ~@2]/2",
  G: "eb5@2 f5 ~ ab5@2 eb5@8 ~@2", H: "f4@2 eb5@2 eb5@2 eb5@3 ~ eb5@2 eb5 ~ f5@2",
  I: "[db5@2 ~@2 eb5 db5 ab4 ~ ab4@6 ~@2, ~@7 c5@7 ~@2]/2", J: "db5@6 ~@4 eb5@4 f5 ~",
  K: "db5@4 ~@4 eb5@2 eb5@3 ~ db5@2", L: "c5@3 ~", M: "~@10 eb5@4 f5 ~", N: "db5@3 ~@5",
  O: "[~@3 eb5@2 db5@2 c5@12 ~@5]/3",
})).s("gm_flute").gain(0.2).pan(0.8)

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

// drums · snare
const snare = s("sd").struct("<~@7 A@7 B A@7 B A@7 C A@7 ~ A@10 C A@15 D A@9 ~@4>".pickRestart({
  A: "~ x ~ x", B: "~ x!2 ~", C: "~ x ~@2", D: "x",
})).gain(0.32)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@30 A ~@7 B ~@10 A ~@15 C ~@13>".pickRestart({
  A: "~@6 x ~@2 x ~@6", B: "x ~@2 x ~@12", C: "~ x!2 ~@10 x ~ x",
})).gain(0.12)

// drums · hihat
const hihat = s("hh").struct("<A@14 B A@23 ~ A@10 B A@15 ~ A@10 C ~@2>".pickRestart({
  A: "x!4", B: "x!2 ~@2", C: "x!3 ~",
})).gain(0.2)

// drums · low tom
const low_tom = s("lt").struct("<~@14 A ~@7 A ~@7 B ~@7 C ~@10 B ~@15 D ~@13>".pickRestart({
  A: "~@7 x", B: "~@12 x!3 ~", C: "~@6 x!3 ~@3 x!3 ~", D: "~@5 x ~@2",
})).gain(0.36)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@15 A B ~ B ~ B ~@2 B ~ C ~ C ~ C D ~ D ~ D ~ D ~@4 D E ~ E ~ E ~ E ~@3 D ~ D ~@2 B ~@14 B ~@6
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~ x", D: "~ x ~@2", E: "x!2 ~@2",
})).gain(0.28)

// drums · mid tom
const mid_tom = s("mt").struct("<~@14 A ~@7 A ~@7 B ~@7 C ~@10 B ~@15 D ~@13>".pickRestart({
  A: "~@10 x!3 ~@3", B: "~@7 x!2 ~ x ~@5", C: "~ x!2 ~ x ~@5 x ~@5", D: "~@6 x!3 ~@7",
})).gain(0.28)

// drums · high tom
const high_tom = s("ht").struct("<~@65 [~@3 x!2 ~@9 x ~] ~@13>").gain(0.28)

// drums · cowbell
const cowbell = s("cb").struct("<~@7 [x!4]!68 ~@4>").gain(0.24)

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

// drums · congas
const congas = s("conga:18").struct(`<
  A@4 B A B A@5 B@3 A B A B@2 A B A B A@6 B@5 A@4 B A B@9 A B@9 A B A B@3 A B@2 A B A B A B ~@4
>`.pickRestart({
  A: "~@2 x!2 ~@2 x!2", B: "~@2 x ~@3 x!2",
})).gain(0.64)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct(`<
  ~ A ~ A B ~ B ~ C ~ C ~ D E F G E ~ H I ~ J ~ K ~ L ~ L ~ L D M D M H ~@2 N O H O H P Q P Q M R M S C S H@8 ~ T ~ T
  M@2 ~ U V ~ V ~ W ~ H ~@4
>`.pickRestart({
  A: "~@13 x ~ x", B: "x!3 ~@4 x ~@2 x ~@2 x ~@2", C: "~ x ~@14", D: "x ~ x ~@7 x ~@4 x", E: "x ~ x ~@7 x ~@2 x ~@2",
  F: "x ~ x ~@4 x ~@2 x ~@4 x", G: "~@5 x ~@10", H: "x!2 ~@3 x ~@2", I: "x!3 ~@7 x ~@4 x", J: "x ~ x ~@7 x!2 ~@3 x",
// … 19 more lines

More by Stephen Bishop