Strudelify
Moving On Up cover art

Moving On Up

M People

KeyC minorTempo125 bpm
0:00/0:00
// Moving On Up — M People
// 125 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 111 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. 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 · epiano2 · "E.PIANO 2"
const epiano2 = note(`<
  A@12 ~@15 B C@2 D@2 C@2 E@2 F@4 ~@15 B C@2 D@2 C@2 E@2 ~@12 A@4 G@4 C@2 D@2 C@2 D@2 C@2 D@2 C@2 E@2 ~@11
>`.pickRestart({
  A: "[[g3,c4,f4]@2 c3@2 [g3,c4,f4]@2 ~@2 [g3,c4,eb4]@2 c3@2 g3 ~ [g3,bb3]@4 c4 ~ [g3,c4] ~ bb3 ~ [g3,c4] ~ c3@2 g3@2 [g3,c4,f4]@4 c3@2 [g3,c4,f4]@2 c3@2 [g3,c4,eb4]@2 ~@2 c3 ~ [g3,bb3]@4 c4 ~ [g3,c4]@2 bb3 ~ [g3,c4]@2 c3 ~@3 c3@2, ~@28 c4 ~@35]/4", // Csus4 Cm Gm C5 Csus4 Cm Gm C5
  B: "~@14 [g3,bb3,c4,eb4] ~", // Cm7
  C: "~@2 g3@2 f3@2 eb3@2 [ab3,c4]@2 ~@4 [g3,bb3,c4,eb4] ~, ~@2 [bb3,c4,eb4]@4 ~@2 [f3,eb4] ~@7", // Ab Cm7 F7
  D: "[~@2 g3@2 f3@2 eb3@2 [ab3,c4]@2 ~@4 [gb3,bb3,c4,eb4]@6 ~@2 eb3@2 [f3,f4] ~ [ab3,c4,eb4]@2 ~@2 [g3,bb3,c4,eb4] ~, ~@2 [bb3,c4,eb4]@4 ~@2 [f3,eb4] ~@23]/2", // Ab Cm7b5 F Ab Cm7 F7
  E: "[~@2 g3@2 f3@2 eb3@2 [ab3,c4]@2 ~@4 [gb3,bb3,c4,eb4]@6 ~@2 eb3@2 [f3,f4] ~ [ab3,c4,eb4]@2 ~@2 [f3,bb3,c4,eb4]@2, ~@2 [bb3,c4,eb4]@4 ~@2 [f3,eb4] ~@23]/2", // Ab Cm7b5 F Ab Fsus4 Cm7 F7
  F: "[[g3,c4,f4]@2 c3@2 [g3,c4,f4]@2 ~@2 [g3,c4,eb4]@2 c3@2 g3 ~ [g3,bb3]@4 c4 ~ [g3,c4] ~ bb3 ~ [g3,c4] ~ c3@2 g3@2 [g3,c4,f4]@4 c3@2 [g3,c4,f4]@2 c3@2 [g3,c4,eb4]@2 ~@2 c3 ~ [g3,bb3]@4 c4 ~ [g3,c4]@2 bb3 ~ [g3,c4]@2 ~@6, ~@28 c4 ~@35]/4", // Csus4 Cm Gm C5 Csus4 Cm Gm C5
  G: "[[g3,c4,f4]@2 c3@2 [g3,c4,f4]@2 ~@2 [g3,c4,eb4]@2 c3@2 g3 ~ [g3,bb3]@4 c4 ~ [g3,c4] ~ bb3 ~ [g3,c4] ~ c3@2 g3@2 [g3,c4,f4]@4 c3@2 [g3,c4,f4]@2 c3@2 [g3,c4,eb4]@2 ~@2 c3 ~ [g3,bb3]@4 c4 ~ [g3,c4]@2 bb3 ~ [g3,c4]@2 c3 ~@3 [g3,bb3,c4,eb4] ~, ~@28 c4 ~@35]/4", // Csus4 Cm Gm C5 Csus4 Cm Gm C5 …
})).s("gm_epiano2").gain(0.48)

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@4 A B A B A B A C A B A B A B A C A B A B A B A B D E D F D E D F A B A C A B A B A B A C A B A B A B A B D E D F D
  E D F A B A B ~@16 D E D F D E D F D E D F D E D F ~@11
>`.pickRestart({
  A: "c2 ~ c3@2 ~@2 bb2@2 ~@2 g2@2 ~@2 bb1@2", B: "c2 ~ c3@2 ~@2 bb2@2 ~@2 g2@2 ~@2 eb2@2",
  C: "f1 ~ f2@2 g1@2 g2@2 ab1@2 ab2@2 bb1@2 bb2@2", D: "c2 ~ c3@2 ~@2 bb2@2 ~@2 f2@2 f2 ~ bb1@2",
  E: "c2 ~ c3@2 ~@2 bb2@2 ~@2 f2@2 f2 ~ eb2@2", F: "gb1 ~ gb2@2 g1@2 g2@2 ab1@2 ab2@2 bb1@2 bb2@2",
})).s("gm_electric_bass_finger").gain(0.35)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  ~@4 A@3 B A@3 ~@9 C@4 D C@3 E@2 F G E@2 F G ~@4 H I H J K I H@2 C@4 D C@3 E@2 F G E@2 F G L M L M L M L M L M L M ~@8
  E@2 F G E@2 F G E@2 F G E@2 F G L M L M L M L M ~@3
>`.pickRestart({
  A: "~@4 [g3,c4,eb4]@3 [g3,c4,eb4] eb4 ~@7", B: "~@10 g3!2 bb3 c4 ~@2",
  C: "~@4 [g4,c5,eb5]@3 [g4,c5,eb5] bb4 ~ [c4,eb4,bb4] ~@3 [c4,eb4,bb4] ~", // Cm Cm7
  D: "[g4,c5] ~@3 [g4,c5,eb5]@3 [g4,c5,eb5] bb4 ~ [c4,eb4,bb4] ~@3 [c4,eb4,bb4] ~", // C5 Cm Cm7
  E: "~@10 [f4,ab4,c5,eb5] ~@3 [f4,ab4,c5,eb5]@2", F: "~@10 [f4,ab4,c5,eb5] ~@3 [gb4,bb4,c5,eb5]@2",
  G: "~@3 eb5!2 [eb4,eb5]!3 ~@8", H: "~@4 [g4,c5,eb5]@3 [g4,c5,eb5] bb4 ~@7",
  I: "~@4 f5 f5@2 [g4,c5,eb5] ~@8, ~@4 [g4,c5]@3 ~@9", J: "~@4 [f4,gb4,c5] ~ [f4,c5]@2 eb4 f4 eb4@2 ~@4",
  K: "[g4,c5] ~@3 [g4,c5,eb5]@3 [g4,c5,eb5] bb4 ~@7", // C5 Cm
  L: "~@2 [c4,eb4,bb4] ~ [c4,eb4,bb4] [eb4,bb4] ~ [c4,eb4,bb4] ~@2 [c4,eb4,bb4] ~@3 [c4,eb4,bb4] ~", // Cm7 Eb5 Cm7
  M: "~@2 [c4,eb4,bb4] ~ [c4,eb4,bb4] [eb4,bb4] ~ [c4,eb4,a4] ~@2 [c4,eb4,a4] ~@3 [c4,eb4,a4] ~", // Cm7 Eb5 Adim
})).s("gm_electric_guitar_clean").gain(0.32).pan(0.8)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@4 A@2 B@2 A@2 B@2 ~@15 C D@2 E@2 D@2 F@2 A@2 B@2 ~@15 C D@2 E@2 D@2 F@2 ~@19 C D@2 E@2 D@2 E@2 D@2 E@2 D@2 F@2 ~@11
>`.pickRestart({
  A: "[[f4,f6] ~@3 [f4,f6] ~@3 [eb4,eb6]@2 [c4,c6] ~ [g3,g5] ~ [bb3,bb5]@4 [c4,c6] ~ [c4,c6]@2 [bb3,bb5] ~ [c4,c6] ~ [g3,g5] ~ [bb3,bb5] ~ [f4,f6]@2]/2", // F Eb C G Bb C Bb C …
  B: "[~@2 [g3,g5] ~ [f4,f6]@2 ~@2 [eb4,eb6]@2 ~@2 [g3,g5] ~ [bb3,bb5]@4 [c4,c6] ~ [c4,c6] ~ [bb3,bb5] ~ [c4,c6] ~@7]/2", // G F Eb G Bb C Bb C
  C: "~@14 [g4,g6] ~", D: "~@2 [g4,g6]@2 [bb4,bb6]@4 [eb4,eb6] ~@5 [g4,g6] ~",
  E: "[~@2 [g4,g6]@2 [bb4,bb6]@4 [eb4,eb6] ~@5 [gb4,gb6]@6 [f4,f6]@2 [eb4,eb6] ~ [f4,f6]@2 [eb4,eb6] ~@3 [g4,g6] ~]/2", // G Bb Eb Gb F Eb F Eb …
  F: "[~@2 [g4,g6]@2 [bb4,bb6]@4 [eb4,eb6] ~@5 [gb4,gb6]@6 [f4,f6]@2 [eb4,eb6] ~ [f4,f6]@2 [eb4,eb6] ~@5]/2", // G Bb Eb Gb F Eb F Eb
})).s("gm_string_ensemble_1").gain(0.4)

// other · tenor sax
const tenor_sax = note(`<
  ~@3 A B C B D B C E A B C B D B C E A B C B D B C E A B C B D B C E D B C E A B C B D B C E A B C B D B C E A B C B D
  B C E D B C E A B C B D B C E A ~@7 A B C B D B C E A B C B D B C E A B C B D B C E ~@4
>`.pickRestart({
  A: "~@7 bb2", B: "c3 ~@15", C: "~@10 eb3 ~@3 bb2@2", D: "~@14 bb2 b2", E: "c3@2 c3 ~@13",
})).s("gm_tenor_sax").gain(0.64).pan(0.3)

// other · alto sax
const alto_sax = note("<~@68 A@3 B A@2 C A ~@24 D E F G H I J@5>".pickRestart({
  A: "c5 ~ bb4 ~ c5 bb4 ~ c5 ~@8", B: "c5 ~ bb4 ~ c5 bb4 ~ c5 ~ c5 bb4 ~@5", C: "c5 ~ bb4 ~ c5 bb4 ~ c5 ~@7 bb4",
  D: "~@2 g4 ~ bb4 c5 ~ eb5@3 ~@6", E: "~@2 eb5 ~ d5 c5 bb4 c5@4 ~@5", F: "~@2 g4 ~ bb4 c5 ~ eb5@2 ~ c5 bb4 c5@2 bb4 ~",
  G: "f4@2 ~ eb4@3 eb4@3 ~ c4@2 ~@4", H: "~@2 c5@2 eb5@2 f5@2 f5@3 ~ f5@4", I: "eb5@2 c5@2 ~@2 c5@4 c5 ~ c5 c5@2 c5",
  J: "[c5@2 c5 c5@2 c5 c5@2 bb5@10 a5 ~ g5 eb5 d5 c5@5 eb5 c5 d5 c5@3 ~@2 eb5 c5 d5 c5@3 ~@2 eb5 c5 d5 c5@3 ~@2 eb5 c5 d5 c5@3 ~@2 eb5 c5 d5 c5@3 ~@2 eb5 c5 d5 c5@3 ~@6]/5",
})).s("gm_alto_sax").gain(0.64)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~@12 A B A B A B A B A B A B A B A B ~@12 A B A B A B A B A B A B A B A B ~@12 C D C D C D C D ~@24 C E C ~@8
>`.pickRestart({
  A: "c5 ~ c4@2 [eb5,c6] ~ [eb5,c6] [eb5,bb5] ~@6 bb3@2", B: "c5 ~ c4@2 [eb5,c6] ~ [eb5,c6] [eb5,bb5] ~@6 eb4@2",
  C: "c4 ~@3 [bb4,eb5] ~ c5 [bb4,eb5]@2 ~@7", D: "c4 ~@3 [bb4,eb5] ~ c5 [bb4,eb5]@2 ~@5 bb3@2", E: "~@7 bb3",
})).s("gm_percussive_organ").gain(0.4)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note("<~@20 A@4 B@4 ~@20 A@4 B@4 ~@55>".pickRestart({
  A: "[g3@2 ab3 bb3, c4]/4", B: "[g3@2 [ab3,eb4] [bb3,d4,f4], c4]/4",
})).s("gm_synth_strings_1").gain(0.32)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 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 ~ 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 C@8 D ~@7 A B A B A B A B A B A B A B A B C@4 ~@7
>`.pickRestart({
  A: "x!4", B: "x ~ x ~ x ~ x!2", C: "x ~@4 x ~@2", D: "x",
})).gain(0.64)

// drums · snare
const snare = s("sd").struct(`<
  ~@4 A@7 B A@15 C A@7 D A@3 ~ A@7 E A@7 F A@7 G A@4 H@7 I A@7 J A@15 K H@4 ~@7
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x ~ x ~@2 x ~@2 x ~ x ~@2 x", C: "~@4 x ~@5 x ~ x!4", D: "~@4 x ~@7 x!4",
  E: "~@4 x ~@4 x ~@2 x ~@2 x", F: "~@4 x ~@5 x!4 ~@2", G: "~@4 x ~@7 x ~ x!2", H: "~@4 x ~@2 x ~ x ~@2 x ~@3",
  I: "~@4 x ~@2 x ~ x!4 ~@3", J: "~@4 x ~@3 x ~ x ~ x!4", K: "~@4 x ~@2 x ~@2 x ~ x ~ x!2",
})).gain(0.56)

// drums · clap
const clap = s("cp").struct("<~@4 [~ x ~ x]!35 ~ [~ x ~ x]!68 ~@3>").gain(0.56)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@35 B A@28 C@8 ~@8 A@16 C@4 ~@7>".pickRestart({
  A: "x!4", B: "x", C: "~ x ~ x ~ x ~ x",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@4 [~ x ~ x ~ x ~ x]!35 ~ [~ x ~ x ~ x ~ x]!28 ~@16 [~ x ~ x ~ x ~ x]!16 ~@11>")
  .gain(0.32)

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

// drums · ride
const ride = s("rd").struct("<~@68 A B@3 A B@3 ~@24 A B@3 ~@7>".pickRestart({
  A: "~ x!3", B: "x!4",
})).gain(0.56)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@4 A B A B A B A B ~@16 A B A B A B A B A B A ~@17 A B A B A B A B A B A B A B A B A B A C D ~@7 A B A B A B A B A B
  A B A B A B A B A B A B A B ~@3
>`.pickRestart({
  A: "x!3 ~ x!12", B: "x!11 ~ x!4", C: "x!16", D: "x",
})).gain(0.24)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct(`<
  ~@4 A B A B A B A B ~@16 A B A B A B A B A B A ~@17 A B A B A B A B A B A B A B A B A B A ~@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 ~@3
>`.pickRestart({
  A: "~@3 x ~@12", B: "~@11 x ~@4",
})).gain(0.16)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@4 [x ~@2 x ~@4]!35 ~ [x ~@2 x ~@4]!36 ~@8 [x ~@2 x ~@4]!20 ~@7>").gain(1.62)

stack(
  epiano2, bass, electric_guitar_clean, string_ensemble_1, tenor_sax, alto_sax, percussive_organ, synth_strings_1, kick,
  snare, clap, hihat, open_hat, crash, ride, tambourine, tambourine_soft, cabasa
)

More by M People