Strudelify

Oops Up Side Your Head

The Gap Band

KeyB minorTempo106 bpm
0:00/0:00
// Oops Up Side Your Head — The Gap Band
// 106 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 106 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(106/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · piano
const piano = note(`<
  ~@9 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~@29 A B A B A B A B A B A B A B A
  B A B A B A B A C ~@4
>`.pickRestart({
  A: "[e4,g4,b4]@15 ~", B: "[d4,f#4,a4,b4]@15 ~", C: "[d4,f#4,a4,b4] ~",
})).s("gm_piano").gain(0.3)

// bass · electric bass finger
const bass = note(`<
  A ~@3 B C ~@10 D E F E F E F E F G H G I G J G K L M L N O M P Q G R G J G J G S ~@11 T@2 ~@2 U@3 V@8 W@2 X Y Z Y AA
  AB AC AB AD Y Z Y AA AB AC AB AD Y Z Y AA AB AC AB AE@3 AF@2
>`.pickRestart({
  A: "[a3,d4]", B: "~@9 d4@2 d2@5", C: "e1@7 ~@9", D: "~@3 b1", E: "e1@5 ~ g1 a1", F: "b1 ~", G: "e1@3 g1",
  H: "a1@5 ~@3", I: "a1@4 ~ a1 b1 d2", J: "a1@5 a1 b1 d2", K: "a1@6 e1 ~", L: "e1 ~@2 g1", M: "a1@2 ~@3 g1 a1 d2",
  N: "a1@2 ~@4 d4 ~", O: "e1@2 ~@4 g1 ~", P: "e1@3 ~@3 g1 a1", Q: "b1@5 ~ e3@2", R: "a1@3 ~", S: "a1@6 b1 d2",
  T: "[~@15 g1@5 ~@12]/2", U: "[~@15 g1@5 ~@5 e2 f#2 g2 f#2 e2 d2 c#2@3 d2!2 ~@6 b1 ~ d2 e2 ~ g1]/3",
  V: "[~@3 g#1 ~@3 a1 ~@3 a#1 ~ e2 d#2 d2@3 ~ d2 d3 d2!3 d3 d2 b1 ~ d2 e2 ~ g1@5 ~@5 e2 f#2 g2 f#2 e2 d2 c#2@3 d2!2 ~@6 b1 ~ d2 e2 ~ g1]/4",
  W: "[~@3 g#1 ~@3 a1 ~@3 a#1 ~ e2 d#2 d2@3 ~ d2!9 d1!4]/2", X: "d1!14 d1@2", Y: "e1@3 ~@8 e1 g1@2 a1@2",
  Z: "b1@3 ~@9 d2@4", AA: "b1@3 ~@9 b1@4", AB: "e1@4 ~@7 e1 g1@2 a1@2", AC: "b1@2 ~@4 b1 d2", AD: "b1@5 ~@7 b1@4",
  AE: "[b1@5 ~@10 g1@5 ~@5 e2 f#2 g2 f#2 e2 d2 c#2@3 d2!2 ~@6 b1 ~ d2 e2 ~ g1]/3",
  AF: "[~@3 g#1 ~@3 a1 ~@3 a#1 ~ e2 d#2 d2@3 ~ d2 d3 d2!3 d3 d2 b1 ~ d2 e2 ~ e1]/2",
})).s("gm_electric_bass_finger").gain(0.4)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@17 A B C D A B C D ~@2 E F@2 G H@2 ~@2 I J ~@2 K L ~@2 E F@2 G H@2 ~@28 M N O N O N O N O N O N O N O N O N O N O N
  O N P ~@4
>`.pickRestart({
  A: "b4 a4 g4 f#4", B: "e4 d#4!2 d4", C: "d4@12 f#4 g4@2 f#4", D: "[a4,b4]@2 c5@2 b4 a4 g4 f#4 ~@8",
  E: "~@9 f#5@4 g5@3", F: "[f#4@6 g4@2 e4@4 f#4 d4 ~ d4@9 e4 f#4 e4 f#4 g4@4]/2",
  G: "e4@2 d4@2 d4@4 d4 e4 d4 e4 f#4 d4@2 ~", H: "[d4@11 ~ f#4 g4 ~ f#4@4 ~@5 d4 e4 ~@2 f#4@2 e4 ~]/2",
  I: "d4@8 f#4 [f#4,g4] e4 d4 f#4 g4@2 f#4", J: "b4@8 a4@5 ~@3", K: "d4@8 f#4 [f#4,g4] e4 d4 f#4 g4 ~@2",
  L: "b4@2 c5 b4 [b4,c5] a4 g4 f#4 f#4@8", M: "d3!16",
  N: "~@2 [g3,b3,e4] ~@3 [g3,b3,e4] ~@3 [g3,b3,e4] ~@3 [g3,b3,e4] ~", // Em
  O: "~@2 [f#3,a3,d4] ~@3 [f#3,a3,d4] ~@3 [f#3,a3,d4] ~@3 [f#3,a3,d4] ~", P: "~@2 [f#3,a3,d4] ~@3 [f#3,a3,d4] ~@9",
})).s("gm_electric_guitar_clean").gain(0.2).pan(0.7)

// other · pan flute
const pan_flute = note("<~@25 A B C D A B C D ~@8 A B C D A B C D ~@57>".pickRestart({
  A: "b5 ~ b5 ~ a5 ~@11", B: "g5 ~ a5 ~ a5!2 ~ b5 ~@8", C: "b5 ~ b5 ~ a5 ~@2 b5 ~ b5 ~ b5 a5 ~@3",
  D: "a5 ~ a5 ~ a5!2 ~ b5 ~@8",
})).s("gm_pan_flute").gain(0.35).pan(0.3)

// chords · soprano sax
const soprano_sax = note("<~@25 A B C D A B C D ~@8 A B C D A B C D ~@57>".pickRestart({
  A: "b4 ~ [e4,b4] ~ [d4,a4] ~@2 e4 ~ e4 ~ e4 d4 ~ d4 ~", B: "[d4,g4] ~ [d4,a4] ~ [d4,a4]!2 ~ [e4,b4] ~@8",
  C: "e4 ~ [e4,b4] ~ [d4,a4] ~@2 [e4,b4] ~ [e4,b4] ~ [e4,b4] [d4,a4] ~ [d4,a4] ~", // E5 D5 E5 D5
  D: "[d4,a4] ~ [d4,a4] ~ [d4,a4]!2 ~ [e4,b4] ~@8", // D5 E5
})).s("gm_soprano_sax").gain(0.3).pan(0.7)

// other · lead 1 square
const lead_1_square = note("<~@17 A B C ~ A B C ~@82>".pickRestart({
  A: "b6 a6 g6 f#6", B: "e6 d#6!2 d6", C: "d6",
})).s("gm_lead_1_square").gain(0.25)

// other · brass section
const brass_section = note(`<
  ~@52 A ~@3 A ~@3 B C@2 D@2 C@2 D@2 C@2 D@2 C@2 E@3 F ~@3 F ~@7 F ~@7 F ~@2 B C@2 G@2
>`.pickRestart({
  A: "~@6 [d4,g4,b4,e5] ~", B: "~@10 b2 ~ d3 e3 ~ g3", C: "[~@9 e3 f#3 g3 f#3 e3 d3 c#3@3 d3!2 ~@6 b2 ~ d3 e3 ~ g3]/2",
  D: "[~ [g3,g4] ~@3 [g#3,g#4] ~@3 [a3,a4] ~@3 [e4,e5] [d#4,d#5] [d4,f#4,a4,d5]@10 ~ b2 ~ d3 e3 ~ g3]/2", // G G# A E D# D
  E: "[~ [g3,g4] ~@3 [g#3,g#4] ~@3 [a3,a4] ~@3 [e4,e5] [d#4,d#5] [d4,f#4,a4,d5]@33]/3", F: "[g4,b4,d5,e5] ~@7",
  G: "[~ [g3,g4] ~@3 [g#3,g#4] ~@3 [a3,a4] ~@3 [e4,e5] [d#4,d#5] [d4,f#4,a4,d5]@10 ~ [b3,b4] ~ [d4,f#4,a4,d5] [e4,g4,b4,e5] ~ [e4,g4,b4,e5]]/2", // G G# A E D# D B D …
})).s("gm_brass_section").gain(0.4)

// other · trombone
const trombone = note(`<
  ~@52 A ~@3 A ~@3 B C@2 D@2 C@2 D@2 C@2 D@2 C@2 E@2 F G ~@3 G ~@7 G ~@7 G ~@2 B C@2 H@2
>`.pickRestart({
  A: "~@6 [d5,g5,b5,e6] ~", B: "~@10 b3 ~ d4 e4 ~ g4", C: "[~@9 e4 f#4 g4 f#4 e4 d4 c#4@3 d4!2 ~@6 b3 ~ d4 e4 ~ g4]/2",
  D: "[~ [g4,g5] ~@3 [g#4,g#5] ~@3 [a4,a5] ~@3 [e5,e6] [d#5,d#6] [d5,f#5,a5,d6]@10 ~ b3 ~ d4 e4 ~ g4]/2", // G G# A E D# D
  E: "[~ [g4,g5] ~@3 [g#4,g#5] ~@3 [a4,a5] ~@3 [e5,e6] [d#5,d#6] [d5,f#5,a5,d6]@17]/2", F: "[d5,f#5,a5,d6]",
  G: "[g4,b4,d5,e5] ~@7", // Em7
  H: "[~ [g4,g5] ~@3 [g#4,g#5] ~@3 [a4,a5] ~@3 [e5,e6] [d#5,d#6] [d5,f#5,a5,d6]@10 ~ [b3,b4] ~ [d4,f#4,a4,d5] [e4,g4,b4,e5] ~ [e4,g4,b4,e5]]/2", // G G# A E D# D B D …
})).s("gm_trombone").gain(0.4).pan(0.3)

// other · synth brass 1
const synth_brass_1 = note(`<
  ~@52 A ~@3 A ~@3 B C@2 D@2 C@2 E@2 C@2 E@2 C@2 F@3 G ~@3 G ~@7 G ~@7 G ~@2 B C@2 H@2
>`.pickRestart({
  A: "~@6 e4 ~", B: "~@10 b1 ~ d2 e2 ~ g2", C: "[~@9 e2 f#2 g2 f#2 e2 d2 c#2@3 d2!2 ~@6 b1 ~ d2 e2 ~ g1]/2",
  D: "[~ [g1,g2] ~ [g#1,g#2] ~ [g#1,g#2] ~ [a1,a2] ~ [a1,a2] ~ [a#1,a#2] ~ [e2,e3] [d#2,d#3] [d2,d3]@10 ~ b1 ~ d2 e2 ~ g2]/2", // G G# A A# E D# D
  E: "[~ [g1,g2] ~@3 [g#1,g#2] ~@3 [a1,a2] ~@3 [e2,e3] [d#2,d#3] [d2,d3]@10 ~ b1 ~ d2 e2 ~ g2]/2", // G G# A E D# D
  F: "[~ [g1,g2] ~@3 [g#1,g#2] ~@3 [a1,a2] ~@3 [e2,e3] [d#2,d#3] [d2,d3]@33]/3", G: "[e2,e3] ~@7",
  H: "[~ [g1,g2] ~@3 [g#1,g#2] ~@3 [a1,a2] ~@3 [e2,e3] [d#2,d#3] [d2,d3]@10 ~ [b1,b2] ~ [d2,d3] [e2,e3] ~ [e2,e3]]/2", // G G# A E D# D B D …
})).s("gm_synth_brass_1").gain(0.35).pan(0.7)

// drums · kick
const kick = s("bd").struct("<~@5 A@55 B A@3 B A C D E A C D E A C D ~@2 A@23 B A C D F>".pickRestart({
  A: "x!4", B: "x!3 ~", C: "x ~@3 x ~@3 x ~@3 x ~@2 x", D: "~@3 x ~@3 x ~@3 x ~@3 x", E: "~ x!2 ~",
  F: "~@4 x ~@3 x ~@3 x!2 ~ x",
})).gain(0.4)

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

// drums · low tom
const low_tom = s("lt").struct("<~@25 A@8 ~@3 B ~@4 A@8 ~@11 C ~@45>".pickRestart({
  A: "x ~@2 x!2 ~@3 x ~@2 x!2 ~@3", B: "~@8 x!4 ~@4", C: "~@10 x!2 ~@4",
})).gain(0.2)

// drums · hihat
const hihat = s("hh").struct("<~ A@4 B@12 C@15 D C@16 B@17 E F B@2 E F B@2 E G B ~ B@25 E F H>".pickRestart({
  A: "x!4", B: "~ x ~ x ~ x ~ x", C: "x!8", D: "x!7 ~", E: "~@2 x ~@3 x ~@3 x ~@3 x!2", F: "~@3 x ~@3 x ~@3 x ~@3 x",
  G: "~@3 x ~@3 x ~@3 x ~@2 x ~", H: "~@2 x ~@3 x ~ x ~@3 x!2 ~@2",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@60 [~@8 x!2 ~@2 x!2 ~@2] ~@45>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@10 A ~ A ~ A ~ A ~@3 A ~@3 A ~@81>".pickRestart({
  A: "~@13 x ~@2",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@60 A B C ~@2 C B ~@2 B@2 ~@2 C B ~@27 C B ~ D>".pickRestart({
  A: "~@4 x ~ x!2 ~@6 x!2", B: "~ x!5 ~ x!2 ~@7", C: "x!9 ~@7", D: "~@10 x ~ x!2 ~ x",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct(`<
  ~@25 A ~@3 A ~@2 B ~@3 B ~@4 A ~@3 A ~@6 B ~@3 B ~@3 C ~@3 C ~@2 C ~@3 C ~@3 C ~@2 A ~@7 A ~@7 A ~@6 C ~@2 C@2
>`.pickRestart({
  A: "x", B: "~@3 x", C: "~@15 x",
})).gain(0.4)

// drums · cowbell
const cowbell = s("cb").struct(`<
  ~@17
  [x!2 ~ x!3 ~ x]!44
  ~@17
  [x!2 ~ x!3 ~ x]!23
  [x!2 ~ x!2 ~@3]
  ~@3
  [~@10 x ~ x!2 ~ x]
>`).gain(0.35)

// drums · congas
const congas = s("conga:13").struct("<~@17 A@7 B A@8 C@7 D A@8 E@12 ~@45>".pickRestart({
  A: "x ~ x!2 ~@2 x ~@3 x!2 ~@2 x ~", B: "x ~ x!2 ~@2 x ~@3 x!3 ~ x ~", C: "x ~ x!2 ~@2 x ~@9",
  D: "x ~ x!2 ~@2 x ~@3 x ~@3 x ~", E: "x ~ x!5 ~@5 x ~@3",
})).gain(1.27)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  ~@17
  [~ x ~ x]!7
  [~ x ~@2]
  [~@4 x!2 ~@6 x!2 ~@2]!8
  [~@4 x!2 ~@10]!8
  [~@4 x!2 ~@6 x!2 ~@2]!8
  [~@4 x ~@2 x]!12
  ~@45
>`).gain(1.27)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~@17
  [~ x ~ x ~ x ~ x]!84
  [~ x ~ x!2 ~@3]
  [~ x ~ x ~ x ~ x]!3
  [~@2 x ~@3 x ~@3 x ~ x!2 ~ x]
>`).gain(1.76)

stack(
  piano, bass, electric_guitar_clean, pan_flute, soprano_sax, lead_1_square, brass_section, trombone, synth_brass_1,
  kick, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash, cowbell, congas, congas_2, cabasa
)

More by The Gap Band