Strudelify

Outstanding

The Gap Band

KeyF♯ majorTempo99 bpm
0:00/0:00
// Outstanding — The Gap Band
// 99 bpm, 4/4, key F# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 3 "LowPiano" piano (copy of ch 2 "Bass" synth bass 1)
// note: Full arrangement: all 143 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(99/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 · piano
const piano = note(`<
  ~@7 A@2 B@2 C@2 D@2 A@2 B@2 C@2 E@2 F G F G F G F G H@2 I@2 J@2 K@2 A@2 B@2 C@2 E@2 F G F G F G F G F G F G F G F G
  L@2 M@2 N@2 J@2 A@2 O@2 ~@4 P@2 J@4 Q@2 P@2 J@4 Q@2 P@2 J@4 R@2 F G F G F G F G F G F G F G F G L@2 M@2 N@2 J@2 ~@16
>`.pickRestart({
  A: "[~@6 [f#3,b3,f#4]@14 ~ [f#3,a#3,d#4]@18 a#3@2 ~ [f#3,a#3,c#4,g#4]@6]/2", // B5 D#m F#
  B: "[~@6 [f#3,b3,f#4]@14 ~ a#3@11 ~ a#3@6 ~@3 [f#3,a#3,c#4,g#4]@6, ~@7 [f#3,d#4]@6 ~@3]/2", // B5 F# D#m
  C: "[~@6 [f#3,b3,f#4]@15 [f#3,a#3,d#4]@18 ~@3 [f#3,a#3,c#4,g#4]@5 ~]/2", // B5 D#m F#
  D: "[~@6 [f#3,b3,f#4]@14 ~ a#3@11 ~ a#3@6 ~@3 [f#3,a#3,c#4,g#4]@6, ~@21 [f#3,d#4]@19 ~@8]/2", // B5 F# D#m
  E: "[~@6 [f#3,b3,f#4]@12 ~@3 [f#3,a#3]@10 ~@5 [f#3,a#3,f#4]@3 ~@9, ~@21 d#4@8 ~@19]/2", // B5 F#
  F: "~@3 [c#4,g#4,c#5]@14 ~ c#4@3 g#3@3", // C#5
  G: "~@3 [a#3,c#4,f#4]@2 ~ [a#3,c#4,f#4]@2 ~ [a#3,c#4,f#4]@2 ~ [a#3,c#4,f#4]@2 ~ [a#3,c#4] ~@2 [a#3,c#4,f#4] ~ [g#3,c4,f4]@4, ~@15 f#4@2 ~@7", // F# A#m F# Fm
  H: "[~@6 [f#3,b3,f#4]@13 ~@2 [f#3,a#3,d#4]@16 ~@5 [f#3,a#3,c#4]@5 ~]/2", // B5 D#m F#
  I: "[~@3 [f#3,b3,f#4]@16 ~@2 [f#3,a#3,d#4]@15 ~@6 [f#3,a#3,c#4]@6]/2", // B5 D#m F#
  J: "[~@3 [f#3,b3,f#4]@15 ~@3 [f#3,a#3,d#4]@15 ~@6 [f#3,a#3,c#4]@5 ~]/2", // B5 D#m F#
  K: "[~@3 [f#3,b3,f#4]@15 ~@3 [f#3,a#3,d#4]@16 ~@5 [f#3,a#3,c#4]@5 ~]/2", // B5 D#m F#
  L: "[~@6 [f#3,b3,f#4]@11 ~@4 [f#3,a#3,d#4]@15 ~@6 [f#3,a#3,c#4]@4 ~@2]/2", // B5 D#m F#
  M: "[~@3 [f#3,b3,f#4]@14 ~@4 [f#3,a#3,d#4]@15 ~@6 [f#3,a#3,c#4]@5 ~]/2", // B5 D#m F#
  N: "[~@6 [f#3,b3,f#4]@12 ~@3 [f#3,a#3,d#4]@15 ~@6 [f#3,a#3,c#4]@5 ~]/2", // B5 D#m F#
  O: "[~@6 [f#3,b3,f#4]@14 ~ [f#3,a#3,d#4]@5 ~@22]/2", // B5 D#m
  P: "[[f#3,b3,f#4]@18 ~@3 [f#3,a#3,d#4]@16 ~@5 [f#3,a#3,c#4]@4 ~@2]/2", // B5 D#m F#
  Q: "[~@6 [f#3,b3,f#4]@12 ~@3 [f#3,a#3,d#4]@14 ~ [f#3,d#4] ~@5 [f#3,a#3,c#4]@4 ~@2]/2", // B5 D#m F#
  R: "[~@3 [f#3,b3,f#4]@15 ~@3 [f#3,a#3]@10 ~@5 [f#3,a#3,f#4]@3 ~@9, ~@21 d#4@8 ~@19]/2", // B5 F#
})).s("gm_piano").gain(0.25).pan(0.4)

// bass · synth bass 1 · "Bass"
const bass = note(`<
  ~@6 A B C D C E C F G H C D C E C H I J K L K M K L K H C D C E C F N H C D C E C H I J K L K M K L K J K L K M K L K
  H C D C E C F G H C D ~ O P Q R H C D C E C F G H C D C E C F G H C D C E C H I J K L K M K L K J K L K M K L K H C D
  C E C F G ~@3 S T S T S ~@3 S T S T ~
>`.pickRestart({
  A: "~@23 f#1", B: "[f#1,g#1]@3 ~@6 f#1@3 g#1@3 ~@2 a#1@2 ~@2 b1@3",
  C: "~@11 g#1 b1@2 ~ c#2@2 ~ d#2@2 f#1@4, ~@17 d2@2 ~@5", D: "g#1@3 ~@6 f#1@3 g#1@3 ~@2 a#1@2 ~@2 b1@3",
  E: "g#1@3 ~@6 f#1@2 ~ g#1@2 ~@3 a#1@2 ~@2 b1@3", F: "g#1@3 ~@6 f#1@3 g#1@2 ~@3 a#1@2 ~@2 b1@2 ~",
  G: "~@11 g#1 b1@2 ~ c#2@2 d2 d#2@2 f#1@4", H: "g#1@3 ~@6 f#1@3 g#1@3 ~@2 a#1@2 ~@2 b1@3, f#1 ~@23",
  I: "~@12 b1@2 ~@4 c#2@3 d2@3", J: "d#2@2 ~@6 d#2 f2@2 ~ f#2@2 ~@3 f2@2 ~@2 c#2@2 ~",
  K: "b1@2 ~@9 a#1 b1@2 ~ b1 ~@2 b1 ~ a#1@4", L: "d#2@3 ~@5 d#2 f2@2 ~ f#2@2 ~@3 f2@2 ~@2 c#2@2 ~",
  M: "d#2@2 ~@6 d#2 f2@2 ~ f#2@2 ~@3 f2 ~@3 c#2@2 ~", N: "~@11 g#1 b1@2 ~@4 c#2@2 d#2@4",
  O: "~@9 f#1@3 g#1@3 ~@2 a#1@2 ~@2 b1@3", P: "~@11 g#1 b1@2 g#1 c#2@2 ~ d#2@2 f#1@4, ~@17 d2@2 ~@5",
  Q: "g#1@3 ~@6 f#1@2 ~ g#1@3 ~@2 a#1@2 ~@2 b1@2 ~", R: "~@11 g#1 b1@3 ~@2 g#1 c#2@2 d#2@4", S: "~@5 f#1",
  T: "g#1 ~@11",
})).s("gm_synth_bass_1").gain(0.29)

// other · electric guitar clean · "Guitar"
const electric_guitar_clean = note(`<
  ~@7 A B C B D B C B A B C B D B E F G H I J K L G M A B C B D B C N A B C B D B E F G H I J K L G M G H I J K L G M A
  B C B D B C B A B C B O P Q N A B C B D B C B A B C B D B C B A B C B D B E F G H I J K L G M G H I J K L G M A B C B
  D B C B R S R T R T R U R S R T R T V ~
>`.pickRestart({
  A: "[f#2,g#2] ~ g#2@2 ~@5 f#2 ~@2 g#2@2 ~ f#2 ~ a#2@2 ~ f#2 b2 ~@2", B: "~@11 g#2 b2 ~ g#2 c#3@2 d3 d#3@2 f#2@4",
  C: "g#2@4 ~@5 f#2 ~@2 g#2@2 ~ f#2 ~ a#2@2 ~ f#2 b2 ~@2, f#2 ~@23",
  D: "g#2@3 ~@6 f#2 ~@2 g#2@2 ~ f#2 ~ a#2@2 ~ f#2 b2 ~@2, f#2 ~@23",
  E: "g#2 ~ g#2 ~@5 g#2 f#2 ~ f#2 g#2@2 ~@3 a#2 ~@2 g#2 b2 ~ b2", F: "~@11 g#2 b2 ~@4 g#2 c#3 ~ g#2 d3 ~ g#2",
  G: "d#3 ~ d#3 ~@5 d#3 f3 ~@2 f#3 ~@4 f3 ~@3 c#3 ~@2", H: "b2 ~@10 a#2 b2 ~ a#2 b2 ~ a#2 b2@2 a#2@4",
  I: "d#3 ~ d#3 ~@5 d#3 f3 ~@2 f#3 ~@2 f#3 ~ f3 ~@3 c#3 ~@2", J: "b2@2 ~@9 a#2 b2 ~ a#2 b2 ~ a#2 b2@2 a#2@4",
  K: "d#3 ~ d#3 ~@6 f3 ~@2 f#3 ~@4 f3 ~@3 c#3 ~@2", L: "b2@2 ~@9 a#2 b2@2 a#2 b2 ~ a#2 b2 ~ a#2@4",
  M: "b2 ~@10 a#2 b2@2 a#2 b2@2 a#2 b2 ~ a#2@3 ~", N: "~@11 g#2 b2 ~@5 c#3@2 d#3@4",
  O: "g#2@2 ~@7 f#2 ~@2 g#2@2 ~@3 a#2@2 ~ g#2 b2@2 ~", P: "~@11 g#2 b2 ~@2 c#3@2 d3 d#3 ~ f#2@4",
  Q: "g#2@2 ~@7 f#2 ~@2 g#2 ~@4 a#2 ~@2 g#2 b2@2 ~", R: "g#2@2 ~@7 f#2@2 ~ g#2@2 ~@3 a#2@2 ~@2 b2@2 ~",
  S: "~@11 g#2 b2@2 ~ c#3@2 d3 d#3 ~ f#2@4", T: "~@11 g#2 b2@2 ~ c#3@2 ~ d#3 ~ f#2@4, ~@17 d3@2 ~@5",
  U: "~@11 g#2 b2@2 ~@3 g#2 c#3@2 d#3@4", V: "g#2@2 ~@7 f#2@2 ~@13",
})).s("gm_electric_guitar_clean").gain(0.2).pan(0.2)

// other · french horn · "FrHorn"
const french_horn = note(`<
  ~@24 A B A B A B C D@6 E@2 D@8 F A B A B A B A B A B A B A B C D@10 G ~@9 D@4 H@6 I@2 H@6 D@2 F A B A B A B A B A B A
  B A B C D@8 ~@8 D@6 J ~
>`.pickRestart({
  A: "d#4@2 f#4 a#4", B: "g#4", C: "d#4@2 f#4 g#4", D: "[c#4@6 a#3 d#4]/2", E: "[c#4@18 a#3 ~@5]/2", F: "d#4", G: "c#4",
  H: "[[c#4,f#4]@6 a#3 d#4]/2", I: "[[c#4,f#4]@3 ~]/2", J: "f#4 ~@3",
})).s("gm_french_horn").gain(0.06).pan(0.8)

// other · brass section · "Brass"
const brass_section = note(`<
  ~@63 A B C@2 D E F@2 D G H ~@29 D I J K D L D M D ~@7 D N O@2 P Q R S T ~@15
>`.pickRestart({
  A: "~@2 [d#4,a#5,d#6] ~@5", B: "[a#4,a#5]@5 [g#4,g#5] ~@3 [c#5,c#6] ~@2 [a#4,a#5]@5 [g#4,g#5] ~@6",
  C: "[~@12 [d#4,d#5]@2 [f4,f5] [f#4,f#5] ~@2 [a#4,a#5]@2 [b4,b5] [c#5,c#6] ~ a#4@2 ~@11 d#4 ~@2 f#4 ~@2 g#4@2 a#4@2 ~@2, ~@23 a#5 ~@24]/2", // D# F F# A# B C#
  D: "~@3 [d#4,a#4,d#5]@2 ~@7", E: "a#4@4 ~ g#4 ~@3 c#5 ~@2 a#4@5 g#4@2 ~@5",
  F: "[~@11 c#4 d#4@2 ~ f#4 ~@2 a#4@2 b4 c#5 ~ a#4@2 ~@11 d#4@2 ~ f#4 ~@2 g#4@2 a#4@2 ~@2, ~@7 f4 ~@16]/2",
  G: "~@12 a#4@5 g#4 ~@6", H: "~@12 d#4@2 f4 f#4 ~@2 a#4@2 b4 c#5@2 a#4",
  I: "~@3 g#4 ~@2 g#4 ~@2 g#4 ~@2 g#4 ~@2 g#4 ~@2 g#4@2 a#4@3 ~", J: "~@2 [d#4,a#4,d#5] ~@5",
  K: "~@3 g#4@2 ~ g#4@2 ~ g#4@2 ~ g#4@2 ~ g#4 ~@2 g#4 ~ a#4@3 ~",
  L: "~@3 g#4@2 ~ g#4@2 ~ g#4@2 ~ g#4@2 ~ g#4 ~@2 g#4@2 a#4@3 ~",
  M: "~@3 g#4 ~@2 g#4@2 ~ g#4@2 ~ g#4@2 ~ g#4 ~@2 g#4@2 a#4@3 ~",
  N: "[a#3,a#4]@5 g#4@2 ~@2 [c#4,c#5] ~@2 [a#3,a#4]@5 [g#3,g#4]@2 ~@5, ~@5 g#3 ~@18", // A# C# A# G#
  O: "[~@11 d#5 d#4@2 f4 f#4 ~@2 a#4@2 b4 c#5 ~ a#4@2 ~@11 [d#4,d#5] ~@2 f#4@2 ~ g#4@2 [a#4,a#5]@2 ~@2, ~@39 f#5 ~@2 g#5 ~@5]/2", // D# A#
  P: "~@2 [a#4,d#5,a#5,d#6] ~@5", Q: "[a#3,a#4]@5 [g#3,g#4]@2 ~@2 [c#4,c#5] ~@2 [a#3,a#4]@5 [g#3,g#4]@2 ~@5",
  R: "~@11 d#5 d#4@2 f4 f#4 ~@2 a#4@2 b4 c#5 ~ a#4",
  S: "~@12 [d#4,d#5] ~@2 f#4@2 ~ [g#4,g#5]@2 [a#4,a#5]@4, ~@15 f#5 ~@8", T: "~@3 [a#4,d#5,a#5,d#6]@2 ~@7",
})).s("gm_brass_section").gain(0.17).pan(0.3)

// chords · string ensemble 1 · "GapBand"
const string_ensemble_1 = note(`<
  ~@31 A ~ B@2 C ~ D@2 ~@17 E F E G E F H A ~ B@2 C ~ D@2 A ~ B@2 ~@20 A ~ B@2 C ~ D@2 ~@9 E F E G E F H A ~ B@2 C ~ D@2
  A ~ B@2 C ~ D@2 A ~ B@2 C ~ D@2
>`.pickRestart({
  A: "~ [f#4,a#4,a#5] [d#4,g#4,g#5] [f#4,a#4,a#5]", // F# G#5 F#
  B: "[~@12 [c#4,f#4,f#5]@3 [d#4,g#4,g#5]@2 ~ [f#4,a#4,a#5]@2 ~ [b4,b5]@2 [f#4,a#4,a#5]@2 ~@23, ~@21 g#4 ~@26]/2", // F#5 G#5 F# B F#
  C: "~ [f#4,a#4,a#5] [d#4,g#4,g#5] [f#4,a#4,a#5], ~@6 g#5 ~@11 g#5 ~@5", // F# G#5 F#
  D: "[~@11 [c#4,f#4,f#5] [c#4,f#4,f#5]@3 [d#4,g#4,g#5]@2 ~ [f#4,a#4,a#5]@2 ~ [b4,b5]@2 [f#4,a#4,a#5]@2 ~@23, ~@21 g#4 ~@26]/2", // F#5 G#5 F# B F#
  E: "~ d#4 f#4 a#4", F: "g#4", G: "g#4@23 ~", H: "~ d#4 f#4 g#4",
})).s("gm_string_ensemble_1").gain(0.19).pan(0.6)

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

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

// drums · clap
const clap = s("cp").struct("<~ [~ x ~ x]!77 [~ x ~@2] [~ x ~ x]!62 [~ x ~@2] ~>").gain(0.71)

// drums · hihat
const hihat = s("hh").struct(`<
  ~ A B A B A B A B A B A B A B A B A B A B A B A C A D A E A B A B A B A B A F A B A B A B A B A C A D A E A B A C A D
  A E A B A B A B A B A B A B A B A B A G A B A B A B A F A B A B A B A B A B A B A B A B A C A D A E A B A C A D A E A
  B A B A B A B A B A B A B A B A F A B A B A B G ~
>`.pickRestart({
  A: "x!8", B: "x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~@2 x ~ x ~@3", C: "x ~@2 x ~@2 x ~@2 x ~@2 x ~ x!2 ~@2 x ~ x ~@3",
  D: "x ~@2 x ~@2 x ~@2 x ~@2 x ~ x ~@3 x ~ x ~@3", E: "x!7 ~", F: "x!6 ~@2", G: "x!4 ~@4",
})).gain(0.63)

// drums · low tom
const low_tom = s("lt").struct("<~@75 [x!2]!28 x ~@23 [x!2]!14 x ~>").gain(0.47)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@7 x", B: "~@5 x ~ x",
})).gain(0.63)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@38 A ~@36 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@25 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~
>`.pickRestart({
  A: "~@7 x", B: "~ x ~ x ~@4",
})).gain(0.55)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@22 A ~@23 A ~@28 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B A ~@24 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~
>`.pickRestart({
  A: "~@7 x", B: "~ x ~@2",
})).gain(0.55)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@17 A ~@3 A ~@3 A ~@7 A ~@7 A ~ A ~@3 A ~ A ~@3 A ~@3 A ~@7 A ~@3 A ~@3 A ~@7 A ~@7 A ~@7 A ~ A ~@3 A ~ A
  ~@3 A ~@3 A ~@7 A ~@7 A ~@7
>`.pickRestart({
  A: "x",
})).gain(0.47)

// drums · congas
const congas = s("conga:13").struct(`<
  A B ~ C ~ D E D ~ F ~ G ~ H ~ D ~ F ~ G ~@3 I ~ I F I J I J D ~ F ~ G ~ H ~ D ~ F ~ G ~@3 K J K B K F K J K F K L K L
  K ~ D ~ F ~ G ~ H ~ H ~ H ~ H ~ H A H ~ H ~ C M H D H ~ H ~ C M H D H ~ H ~ C M ~@2 K J K B K F K J K F K L K L K ~ D
  ~ F ~ G ~ H ~ N J K L K F K O N J K L K F D ~
>`.pickRestart({
  A: "~@9 x!2 ~", B: "~@6 x ~@5 x ~ x!2 ~ x!2 ~@5", C: "~@3 x ~@8 x ~ x!2 ~ x!2 ~@5", D: "~ x ~@6",
  E: "~@6 x ~ x!2 ~ x!2 ~@11", F: "~@12 x ~ x!2 ~ x ~@6", G: "~ x ~@5 x", H: "~@3 x ~@8 x ~ x!2 ~ x ~@6",
  I: "~@17 x!2 ~@5", J: "~@12 x ~ x!2 ~ x!2 ~@5", K: "~@3 x ~@13 x!2 ~@5", L: "~@6 x ~@5 x ~ x!2 ~ x ~@6", M: "~@7 x",
  N: "~@3 x ~@8 x ~@4 x!2 ~@5", O: "~@6 x ~@2 x!2 ~",
})).gain(1.51)

// drums · congas
const congas_2 = s("conga:33").struct(`<
  A B ~ B ~@2 C ~@2 B ~@3 B ~@3 B ~@6 B@3 ~ B@3 ~@2 B ~@3 B ~@3 B ~@5 B@9 D B D B D B E ~@2 B ~@3 B ~ B ~ B ~ B ~ B A B
  ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@3 B@9 D B D B D B E ~@2 B ~@3 B ~ B@7 A B@6 ~@2
>`.pickRestart({
  A: "~@17 x ~@6", B: "~@7 x", C: "~@5 x ~@2", D: "~@21 x ~ x", E: "~@9 x!2 ~",
})).gain(1.51)

stack(
  piano, bass, electric_guitar_clean, french_horn, brass_section, string_ensemble_1, kick, snare, clap, hihat, low_tom,
// … 2 more lines

More by The Gap Band