Strudelify

Move On Up

Curtis Mayfield

KeyB minorTempo140 bpm
0:00/0:00
// Move On Up — Curtis Mayfield
// 140 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 121 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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 · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B
  C@2 D B C@2 D B C@2 D B C@2 D B C@2 D B C@2 D ~@15 A B C@2 D B C@2 D B C@2 D B C@2 E@8 ~
>`.pickRestart({
  A: "~@8 [a3,c#4,e4]@2 [a3,c#4,e4]!3 ~ [g3,b3,d4] ~", // A G
  B: "~@2 [g3,b3,d4]!3 ~ [g3,b3,d4]!3 ~ [g3,b3,d4]!3 ~ [g3,b3,d4]!2", // G
  C: "[[g3,b3,d4] ~ [g3,b3,d4]!3 ~ [g3,b3,d4]!2 [a3,c#4,e4]@2 [a3,c#4,e4]!3 ~ [a3,d4,f#4]@4 [a3,d4,f#4]!3 ~ [a3,d4,f#4]!3 ~ [a3,d4,f#4]!3 ~ [a3,d4,f#4]!2]/2", // G A D
  D: "[a3,d4,f#4] ~ [a3,d4,f#4]!3 ~ [a3,d4,f#4]!2 [a3,c#4,e4]@2 [a3,c#4,e4]!3 ~ [g3,b3,d4] ~", // D A G
  E: "[[a3,d4,f#4] ~ [a3,d4,f#4]!3 ~ [a3,d4,f#4]!2 [a3,c#4,e4]@2 [a3,c#4,e4]!3 ~ [g3,b3,d4]@114]/8", // D A G
})).s("gm_acoustic_guitar_steel").gain(0.27)

// bass · fretless bass
const bass = note(`<
  A B C@2 D B E@2 F@2 G@2 F@2 G@2 F@2 G@2 F@2 G@2 H@2 G@2 F@2 G@2 F@2 G@2 F@2 G@2 H@2 G@2 F@2 I@4 G@2 F@2 G@2 F@2 G@2
  F@2 J@2 F@2 G@2 F@2 G@2 H@2 G@2 H@2 G@2 K ~@15 L@2 G@2 H@2 G@2 F@2 G@2 F@2 G@2 K ~ M ~@6
>`.pickRestart({
  A: "~@8 f#2@5 ~ e2@2", B: "e2@2 ~@4 e3 ~@3 d3@2 ~@2 b2@2",
  C: "[~@2 a2 ~ e2@2 ~@2 f#2@2 a2 ~ b2 ~ b1@7 ~ b2 ~@3 a2@2 ~@2 f#2@2]/2", D: "~@2 d2@2 b1@2 ~@2 f#2@2 a2 ~ b2 ~ e2@2",
  E: "[~@2 a2 ~ e2@2 ~@2 f#2@2 a2@2 b2 ~ b1@7 ~ b2 ~@3 a2@2 ~@2 f#2@2]/2",
  F: "[~@2 d2@2 b1@2 ~@2 f#2@5 ~ e2@8 e3 ~@3 d3@2 ~@2 b2@2]/2",
  G: "[~@2 a2 ~ e2@2 ~@2 f#2@5 ~ b1@7 ~ b2 ~@3 a2@2 ~@2 f#2@2]/2",
  H: "[~@2 d2@2 b1@2 ~@2 f#2@5 ~ e2@7 ~ e3 ~@3 d3@2 ~@2 b2@2]/2",
  I: "[~@2 a2 ~ e2@2 ~@2 f#2@5 ~ b1@7 ~ b2 ~@3 a2@2 ~@2 f#2@4 d2@2 b1@2 ~@2 f#2@5 ~ e2@8 e3 ~@3 d3@2 ~@2 b2@2]/4",
  J: "[~@2 a2 ~ e2@4 f#2@2 a2 ~ b2@2 b1@7 ~ b2 ~@3 a2@2 ~@2 f#2@2]/2", K: "~@2 d2@2 b1@2 ~@2 f#2@5 ~ e2@2",
  L: "[~@8 f#2@5 ~ e2@7 ~ e3 ~@3 d3@2 ~@2 b2@2]/2", M: "~@10 f#1 ~ d2@2 b1@2, ~@9 a1@2 ~@5",
})).s("gm_fretless_bass").gain(0.5)

// chords · epiano2
const epiano2 = note("<A@80 B ~@15 A@16 C@3 ~@6>".pickRestart({
  A: "[~@4 [f#3,a3,c#4,e4]@3 [e3,g3,b3,d4]@13 [f#3,a3,c#4,e4]@3 [a3,b3,d4,f#4]@13 [f#3,a3,c#4,e4]@3 [e3,g3,b3,d4]@13 [f#3,a3,c#4,e4]@3 [a3,b3,d4,f#4]@9]/8", // F#m7 Em7 F#m7 Bm7 F#m7 Em7 F#m7 Bm7
  B: "~@8 [f#3,a3,c#4,e4]@5 ~@3", C: "[~@8 [f#3,a3,c#4,e4]@6 [e3,g3,b3,d4]@26 [f#3,a3,c#4,e4]@6 [a3,b3,d4,f#4] ~]/3",
})).s("gm_epiano2").gain(0.32)

// other · string ensemble 1
const string_ensemble_1 = note("<~@33 A B C D ~@20 A E C D ~@60>".pickRestart({
  A: "~@4 b5 ~ d6 ~ f#6@2 ~@2 f#6@3 ~", B: "b5 ~ e6@2 ~@12", C: "~@4 a5 ~ b5 ~ d6@3 ~ d6@3 ~", D: "b5 ~@7",
  E: "[b5,c#6] ~ e6@2 ~@12", // Bsus2
})).s("gm_string_ensemble_1").gain(0.36)

// chords · rock organ
const rock_organ = note("<~@24 A@2 B C D E@8 F G@8 ~@2 H@5 I@8 F G@8 ~@51>".pickRestart({
  A: "[~@6 [f5,f#5] ~@3 e5@2 ~@2 [d5,e5]@6 d5@6 ~@6]/2", B: "~@4 a4 ~ b4 ~ d5@3 ~ b4 ~ e5@2, ~@14 d5 ~",
  C: "~@2 b4 ~@13", D: "~@6 b5@3 ~ f#5 ~@3 e5@2, ~@6 a5 ~@9",
  E: "[~@4 d5 ~@5 f#5 ~@9 a4 ~ b4 ~ d5@3 ~ b4 ~@5 b4 ~@19 a5 ~ b5 ~ d6@4 f#6 ~@21 a4 ~ b4 ~ d5@4 b4 ~@5 b4 ~@19 [a5,b5] ~@3 a5 ~@3 [e5,f#5]@2, ~ e5@2 e5@12 e5@32 e5@16 ~]/8", // Asus2 Esus2
  F: "~@4 d5 ~ d5 ~@3 f#5 ~@5, ~ e5@3 e5@4",
  G: "[~@4 a4 ~ b4 ~ d5@3 ~ b4 ~ d5 ~@3 b4 ~@5 b4@3 ~ a4 ~ b4 ~@97, ~@7 e5@57]/8",
  H: "[~@6 [f5,f#5] ~@3 e5@4 d5 ~@3 d5 ~@17 a4 ~ b4 ~ d5@3 ~ b4 ~ d5 ~@3 b4 ~@19 b5@3 ~ f#5 ~@3 e5@2, ~@7 e5@16 e5@16 ~, ~@70 a5 ~@9]/5", // F#maj7
  I: "[~@4 d5 ~@5 f#5 ~@9 a4 ~ b4 ~ d5@3 ~ b4 ~@5 b4 ~@19 a5 ~ b5@2 d6@4 f#6 ~@21 a4 ~ b4 ~ d5@4 b4 ~ d5 ~@3 b4 ~@19 [a5,b5] ~@3 a5 ~@3 [e5,f#5]@2, ~ e5@2 e5@12 e5@32 e5@16 ~]/8", // Asus2 Esus2
})).s("gm_rock_organ").gain(0.31)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@2 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 ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~ A ~ B ~@8
>`.pickRestart({
  A: "~@15 x", B: "~@7 x ~@8",
})).gain(0.19)

// drums · clap
const clap = s("cp").struct("<[~@3 x] [~ x ~ x]!112 ~@8>").gain(0.52)

// drums · snare
const snare = s("sd").struct("<[~@3 x] [~ x ~ x]!112 ~ [~ x] ~@6>").gain(0.64)

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

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

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

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@81 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B ~@24>".pickRestart({
  A: "~@7 x", B: "~ x ~@6",
})).gain(0.32)

// drums · crash
const crash = s("cr").struct("<[~@7 x] ~@7 [~@7 x] ~@87 [~@7 x] ~@15 [~@7 x] ~@8>").gain(0.58)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  ~ A B C B C B C ~ C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B
  C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C ~@9
>`.pickRestart({
  A: "~ x ~@2", B: "~ x!2 ~@5", C: "x!2 ~@2",
})).gain(1.02)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  ~ A B A B A B A ~ 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 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 A B A B A B A B A B A B A B A B A B A B A B A ~@9
>`.pickRestart({
  A: "~@2 x ~@2 x ~@10", B: "~ x ~@3 x ~@10",
})).gain(1.02)

// drums · congas
const congas = s("conga:13").struct("<~ [~@10 x ~@2 x ~@2]!111 ~@9>").gain(1.24)

// drums · congas
const congas_2 = s("conga:18").struct("<~ [~@8 x ~@2 x ~@4]!7 [~@11 x ~@4] [~@8 x ~@2 x ~@4]!103 ~@9>").gain(1.24)

// drums · congas
const congas_3 = s("conga:33").struct("<~ [~@6 x!2 ~@6 x!2]!7 [~@14 x!2] [~@6 x!2 ~@6 x!2]!103 ~@9>").gain(1.24)

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

// drums · mt
const mt = s("mt").struct("<~@81 A B C D E F G@2 H I J K D L D ~ A B C D E F G@2 H I J K D L D ~@9>".pickRestart({
  A: "~@7 x", B: "x ~ x ~ x!2 ~ x ~@8", C: "~@3 x ~@4", D: "~@15 x", E: "x ~ x ~ x ~@2 x ~@4 x ~ x ~",
  F: "~@5 x ~@6 x ~ x ~", G: "~@3 x ~@3 x", H: "x!3 ~ x ~@2 x!4 ~@5", I: "x ~ x ~ x ~@2 x ~@8",
  J: "x ~ x ~ x ~@2 x!4 ~@5", K: "~@3 x ~@2 x ~@4 x ~@2 x ~", L: "~@11 x ~ x ~ x",
})).gain(0.32)

stack(
  acoustic_guitar_steel, bass, epiano2, string_ensemble_1, rock_organ, kick, kick_soft, clap, snare, hihat, hihat_soft,
  open_hat, open_hat_soft, crash, bongos, bongos_2, congas, congas_2, congas_3, ht, mt
)