Strudelify

Night Shift

Commodores

KeyA♭ majorTempo105 bpm
0:00/0:00
// Night Shift — Commodores
// 105 bpm, 4/4, key G# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/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 · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~@2 A@4 B C@6 D E@4 F@2 G@8 H I J@2 K@2 L@2 M D F@2 N@4 O@2 P@2 Q@3 R S@2 T@2 F@2 U@8 V R W@6 H I X@2 K@2 Y@2 Z@2 AA@2
  AB@4 V AC AD@4 AE ~@8 AF@4 Q@3 R
>`.pickRestart({
  A: "[~@32 eb4@15 ~ f3@16, ab3@47 c4@17]/4", B: "[eb3,bb3]", C: "[bb3@2 ab3@7 bb3 ab3@2, eb4]/6", D: "[f3,c4]",
  E: "[[eb3,bb3]@31 ~ db3@32, ~@31 ab3@32 ~]/4", F: "[eb3,bb3]/2",
  G: "[ab3@16 [f3,c4]@16 [eb3,bb3]@31 ~ db3@32 [eb3,bb3]@32, eb4@127 ~, ~@63 ab3@32 ~@33]/8", H: "[c4,eb4,ab4]",
  I: "[ab3,db4,f4]", J: "[bb3,eb4]/2", K: "[[eb4,c5] [f4,db5], ab4]/2", L: "[db4,f4,ab4,c5]/2", M: "[ab3,eb4]",
  N: "[db3@4 ~@3 f4, ab3, eb4@7 ~, ~ eb3]/4", O: "[[ab3,eb4] [f3,c4], ab4]/2", P: "[eb3,bb3,bb4]/2",
  Q: "[[db3,ab3,ab4] [eb3,bb3,bb4] [ab3,ab4], eb4]/3", R: "[f3,c4,f4]", S: "[[db3,ab3,ab4] [eb3,bb3,bb4], eb4]/2",
  T: "[[ab3,eb4]@15 ~ f3@16, ~@15 c4@17]/2", U: "[ab3@2 f3@2 eb3@4 [db3,ab3]@4 bb3@3 g3, eb4, ab4@32 ~@64 eb3@31 ~]/8",
  V: "[ab3,eb4,ab4]", W: "[[eb3,bb3]@31 ~ db3@32 [eb3,bb3]@32, eb4, ~@31 ab3@32 ~@33]/6", X: "[~ bb4, [bb3,eb4]]/2",
  Y: "[[db4,f5]@2 ab3 [f3,f4,ab4,db5], [ab4,c5]@3 ~, ~ eb5]/2", Z: "[[ab3,eb4]@2 ~ f4, ab4@3 ~, ~ [f3,c4]]/2",
  AA: "[eb3,bb3,eb4]/2", AB: "[db3@4 ~@3 [db4,f4], ab3, eb4@7 ~, ~ eb3]/4", AC: "[f3,c4,f4,c5]",
  AD: "[[eb3,bb3,bb4]@2 [db3,ab3,ab4] [eb3,bb3,bb4], eb5, ~ eb4]/4", AE: "[f3,c4,c5,f5] ~",
  AF: "[[ab3,eb4] [f3,c4] ~ bb4, ab4@3 ~, ~ [eb3,bb3]]/4", // Ab5 F5 Eb5
})).s("gm_synth_strings_1").gain(0.2)

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~@4 A B C D E@2 F G H B C I J K C L H B M@2 N O C P Q R S T U R N V W X Y@2 Z AA AB AC AD X AE Y Z AE AB AF AG AH A B
  AI@2 AJ AK AL AM AN AO AL AP AQ AR AS AT AU AV AW AX AY AZ BA@2 BB BC BD BE BF X BG BH AV BI BJ BK BL BM BN BO Z AE BP
  ~@7 BQ AD X AE Y Z AE AB AF
>`.pickRestart({
  A: "ab2@15 ~", B: "f2@2 db2 f2", C: "eb2@15 ~", D: "eb3@15 ~", E: "[db2@6 db3 db2]/2", F: "ab1@15 ~",
  G: "ab2@6 [bb2,eb3]@9 ~", H: "ab1 ab2", I: "eb2@8 bb2@7 ~", J: "db2 db3", K: "db2@11 ~ db2@4",
  L: "eb2@4 c2@2 db2 eb2", M: "[eb2@14 [bb2,eb3]@9 ~ bb2@4 eb2@4]/2", N: "db2", O: "db3@3 db2", P: "eb2@2 bb2 eb2",
  Q: "f1@3 f2@2 ~ f2@2 f1@3 c2@3 f2@2", R: "bb1@3 f2@3 bb2@2 bb1@3 bb2@3 bb1@2", S: "eb2@3 bb2@3 eb3@2 eb2@3 eb2 bb2@4",
  T: "eb2@3 bb2@3 eb3@2 eb2@3 eb2 eb3@2 eb2!2", U: "f1@3 c2@3 f2@2 f1@3 f1 f2@2 f1@2", V: "f3@3 ~",
  W: "ab1@2 ~ ab1@2 ~ eb2@6 ab1@3 ~", X: "f2@2 ~ f2@2 ~ f2@2 db2@4 f2@3 ~", Y: "eb2@2 ~ eb2@2 ~ bb2@6 eb2@3 ~",
  Z: "db2@2 ~ db2@2 ~ db3@9 ~", AA: "db2@2 ~ db2@2 ~ db3@6 db2@3 ~", AB: "ab1@2 ~ ab1@2 ~ ab2@9 ~",
  AC: "ab1@2 ~ ab1@2 ab2 eb2@2 eb2@3 ~@3 eb3@2, ~@3 eb2", AD: "ab1@2 ~ ab1@2 ~ ab2@6 eb2@3 ~",
  AE: "eb2@2 ~ eb2@2 ~ eb3@6 eb2@3 ~", AF: "f2@2 ~ f2@2 ~ f3@4 c3@2 f2 ~ c2@2", AG: "db2@2 ~ db2@2 ~ db2@6 db2@3 ~",
  AH: "eb2@2 ~ eb2@2 ~ [eb3,g3]@10", AI: "[eb2@20 ~@2 [bb3,eb4]@6 ~ eb3 ~@2]/2", AJ: "ab1!2 ~ ab1 eb2@2 ab2@2 ab1 ~@7",
  AK: "~ c2 f2@2 c2@2 f2@2 db2@4 f2@4", AL: "eb2@3 eb2@3 eb3@10", AM: "eb2!2 ~ eb2 bb2 ~ eb3@2 eb2@3 ~ eb2@4",
  AN: "db2@3 db2@2 ~ db3@10", AO: "db2 ~@2 db2@3 db3@6 db2@3 ~", AP: "eb2@2 ~ eb2 ~@3 ab3 eb4 f4 eb4@4 ab3 ~",
  AQ: "~@2 ab1@2 eb2@2 ab2@2 ab1@2 ab1 ab1@4 ~", AR: "f1@3 c2@3 f2@2 db2@4 f2@4",
  AS: "eb2@2 ~ eb2@2 ~ eb3@4 eb2 eb3 eb2@4", AT: "eb2@2 ~ eb2@2 ~ bb2@6 bb2@4", AU: "db2@2 ~ db2@2 ~ db3@10",
  AV: "db2@2 ~ db2@2 ~ db3@6 db2@4", AW: "eb2@2 ~ eb2@2 ~ eb3@10", AX: "eb2@2 ~ eb2@3 ~ eb2 c2@4 ~ c2 c2@2",
  AY: "f1@2 ~ f1 c2@2 f2@2 f1@3 f2@4 ~", AZ: "bb1@2 ~ bb1 f2@2 bb2@2 bb1@3 f2@3 bb1@2",
  BA: "[eb2@2 ~ eb2 bb2@2 eb3@2 eb2@3 eb3@2 bb2 eb3@5 eb2 ~ eb2!2 ~ eb2@3 bb2@3 eb2@2]/2",
  BB: "f1@2 ~ f1 c2@2 f2@2 f1@3 f1 f2@2 f1@2", BC: "bb1@2 ~ bb1 f2@2 bb2@2 bb1@3 bb2@3 bb1@2", BD: "[db2,f2,db3,ab3]",
  BE: "ab1@2 ~ ab2@2 ab1!2 eb2 f2!2 ab2 bb2 c3 eb3 f3 ab2", BF: "ab1@2 ~ ab1@2 ~ f2@2 ~@4 ab1@3 ~, ~@4 ab2@3 ~",
  BG: "eb2@2 ~ eb2@2 ~ bb2@4 eb2!2 eb3@4", BH: "eb2@2 ~ eb2@2 ~ eb3@4 eb2@2 eb3@2 eb2!2",
  BI: "db2@2 ~ db2@2 ~ db3@6 db2@2 db3@2", BJ: "ab1@2 ~ ab1@2 ~ ab2@4 ab1@2 ab2@4",
  BK: "ab1@2 ~ ab1@2 ab2 eb2@2 eb4 f4 eb4@2 bb3 ab3 eb3@2", BL: "ab1@2 ~ ab1@2 ab2 eb2@2 ab2@4 eb2@2 ab2@2",
  BM: "f1@2 ~ f1 ~ f2 f1 f2 db2@4 f2@3 ~", BN: "eb2@2 ~ eb2@2 ~ eb3@6 eb2@2 f2 eb2",
  BO: "eb2@2 ~ eb2@2 ~ eb3@4 eb2@2 eb2@2 ~ eb2", BP: "[f1,c3,f3] ~",
  BQ: "~@2 [bb3,eb4]@6 bb3 ab3 f3 eb3 c3 eb3 bb2 ab2", // Eb5
})).s("gm_fretless_bass").gain(0.4)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@12 A ~ A ~ A ~ A B A ~ A ~ A ~ A B ~@30 A ~ A ~ A ~ A B A ~ A ~ A ~ A B ~@39
>`.pickRestart({
  A: "~@11 f3 ab3!2 ~@2", B: "~@7 ab3 c4@2 eb4 ~@5",
})).s("gm_electric_guitar_muted").gain(0.48).pan(0.3)

// other · electric guitar muted · "MUTED GTR" · soft notes
const electric_guitar_muted_2 = note(`<
  ~@12 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@31 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@40
>`.pickRestart({
  A: "~@10 eb3 ~@5",
})).s("gm_electric_guitar_muted").gain(0.24).pan(0.3)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted_3 = note(`<
  ~@4 A@3 B A@3 C A@3 B A@3 C A@3 B A@3 D ~@26 A@3 E A@3 B A@3 F A@3 B A@3 G ~@39
>`.pickRestart({
  A: "eb3 ~@2 eb3 ~@2 eb3@2 f3 ~@7", B: "eb3 ~ eb3!2 ~@2 bb3@4 ab3 ~@5", C: "eb3 ~ eb3!2 ~@3 eb3 ~@2 c3 eb3!3 c3 ~",
  D: "eb3 ~ eb3!2 ~@2 bb2 c3 eb3@2 c3 ~ eb3!2 c3 ~", E: "eb3 ~ eb3!2 ~@2 eb3@2 c3 ~ bb2 c3 eb3!2 c3 ~",
  F: "eb3 ~ eb3!2 ~@2 g3 f3 eb3@2 c3 ~ eb3!2 c3 ~", G: "eb3 ~ eb3!2 ~@2 c3@2 eb3 ~ c3 eb3!3 c3 ~",
})).s("gm_electric_guitar_muted").gain(0.48).pan(0.8)

// other · electric guitar muted · "MUTED GTR" · soft notes
const electric_guitar_muted_4 = note(`<
  ~@4 A B@2 C B@3 D A B@2 C B@3 D A B@2 C B@3 E ~@26 B@3 E A B@2 C B@3 E A B@2 C B@3 E ~@39
>`.pickRestart({
  A: "~@2 eb3 ~@2 eb3 ~@10", B: "~@2 eb3 ~@2 eb3 ~@8 eb3!2", C: "~@5 eb3 ~@10", D: "~@5 eb3!2 ~@6 f3 ~@2",
  E: "~@5 eb3 ~@7 f3 ~@2",
})).s("gm_electric_guitar_muted").gain(0.24).pan(0.8)

// chords · electric guitar clean · "+CHORUS GT"
const electric_guitar_clean = note(`<
  ~@3 A@2 ~ B@2 ~@20 C D ~ E C D ~@2 F G H@2 F G I@2 F G H@2 F J F@2 I J ~@2 B@2 ~@16 C D ~ E C D ~@2 F G H@2 F G I@2 F
  G H@2 F K ~@9 F G H@2 F J F@2
>`.pickRestart({
  A: "[~ [bb4,eb5], ~@15 [ab3,eb4]@17]/2", B: "[~@7 eb4@7 ~@2, ~@2 bb4@5 ~, ~@11 f4@17 ~@4]/2",
  C: "~@2 [c4,eb4,ab4,c5] ~ [eb4,ab4,c5] [c4,eb4,ab4,c5] ~ [eb4,ab4] [b3,d4,g4,b4] [eb4,ab4,c5] ~ [c4,eb4,ab4,c5] ~@4", // Ab Ab5 G Ab
  D: "~@2 [db4,f4,ab4,c5] ~ [db4,f4,ab4,c5]!2 ~ [db4,f4,c5] [c4,e4,g4,b4] [db4,f4,ab4,c5] ~ [db4,f4,ab4,c5] ~@4", // Dbmaj7 Cmaj7 Dbmaj7
  E: "[eb4,bb4,eb5]@2 ~ [eb4,bb4,eb5] ~@4 [db4,f4,bb4] ~ [ab4,db5] ~ [f4,bb4]@3 ~", // Eb5 Bbm Db5 Bb5
  F: "~@3 ab3 ~@4 ab3 ~@2 ab3 c4 ~ eb4 ~", G: "~@2 ab3!2 ~@4 ab3 ~@2 ab3 c4 ~ eb4 ~",
  H: "~@3 bb3 ~@2 bb3 ~ f4!2 ~@2 eb4!2 ~@2", I: "~@3 ab3 ~@2 ab3 ~ f4!2 ~@2 eb4!2 ~@2",
  J: "~@2 bb3!2 ~@3 bb3 c4!2 bb3 ~ c4 ~ bb3 ~", K: "~@2 ab3!2 ~@2 ab3 bb3 c4!2 bb3 ~ c4 ~ bb3 ~",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.3)

// chords · electric guitar clean · "+CHORUS GT" · soft notes
const electric_guitar_clean_2 = note(`<
  ~@28 A B ~@2 A B ~@2 C D E@2 C D F@2 C D E@2 C G C@2 F G ~@20 A B ~@2 A B ~@2 C D E@2 C D F@2 C D E@2 C ~@10 C D E@2 C
  G C@2
>`.pickRestart({
  A: "~@4 c4 ~@2 [c4,c5] ~ c4 ~@6", B: "~@7 ab4 ~@8", C: "~@2 ab3 ~@7 ab3 ~@5", D: "~@10 ab3 ~@5",
  E: "~@7 c4 ~@3 bb3 ~@4", F: "~@7 bb3 ~@3 bb3 ~@4", G: "~@6 ab3 ~@9",
})).s("gm_electric_guitar_clean").gain(0.24).pan(0.3)

// other · electric guitar clean · "+CHORUS GT"
const electric_guitar_clean_3 = note(`<
  ~@29 A B C ~ D@2 ~ E F E@3 F E@3 F E@3 F E@3 F ~@21 A B C ~ D@2 ~ E F E@3 F E@3 F E@3 F G ~@8 E F E@3 F E@2
>`.pickRestart({
  A: "~@14 f3 ~", B: "ab3!2 ~ ab3 ~@2 eb3 f3 ab3!2 ~ ab3 ~@2 f3 ~", C: "ab3!2 ~ ab3 ~@2 eb3 f3 ab3!2 ~ ab3 ~@4",
  D: "[~ [ab3,db4,f4,ab4,c5], ~@15 db3@17]/2", E: "eb3 ~@2 eb3 ~@2 eb3@2 f3 ~@7", F: "eb3 ~@2 eb3 ~@2 eb3@2 f3 ~@6 eb3",
  G: "f3 ~@2 f3 ~@2 eb3@2 f3 ~@7",
})).s("gm_electric_guitar_clean").gain(0.48).pan(0.8)

// other · electric guitar clean · "+CHORUS GT" · soft notes
const electric_guitar_clean_4 = note(`<
  ~@31 A ~@4 B C D B@2 C D B@2 C D B@2 C D B@2 C ~@23 A ~@4 B C D B@2 C D B@2 C D B@2 C E ~@8 B C D B@2 C D B
>`.pickRestart({
  A: "~@14 eb3!2", B: "~@2 eb3 ~@2 eb3 ~@10", C: "~@2 eb3 ~@2 eb3 ~@8 eb3 ~", D: "~@2 eb3 ~@2 eb3 ~@8 eb3!2",
  E: "~@2 f3 ~@2 f3 ~@10",
})).s("gm_electric_guitar_clean").gain(0.24).pan(0.8)

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

// drums · rim
const rim = s("rim").struct("<~@58 A B C B D E F B ~@47>".pickRestart({
  A: "~@3 x ~@4", B: "~@2 x ~@2 x ~@2 x ~@7", C: "x ~@9 x!2 ~@4", D: "~@12 x!2 ~@2", E: "~@2 x ~@2 x ~@10",
  F: "~@6 x ~@2 x ~@2 x ~@3",
})).gain(0.56)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@67 A ~@11 B ~@17 C D E F G H@2 I ~@8>".pickRestart({
  A: "~@15 x", B: "~@3 x", C: "~@3 x ~@12", D: "~@3 x ~@8 x ~ x!2", E: "~@3 x ~ x ~ x ~@4 x!2 ~ x",
  F: "~@2 x!2 ~ x ~ x ~@4 x!3 ~", G: "~@3 x ~ x ~ x ~@4 x ~ x!2", H: "~@3 x ~ x ~ x ~@4 x!3 ~", I: "~@7 x",
})).gain(0.16)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@20 A B C D E F G H I J@2 K J K ~@2 I J@7 I L J L@3 J@3 M N O ~ O P Q R S R S R S J T J T J T J U V W J K J X ~ Y Z L
  AA AB W AC J AD Z L@2 AA L@2 AE ~@8 I L AF AB W AC J AD
>`.pickRestart({
  A: "~@2 x!2 ~ x ~ x ~@2 x ~@5", B: "~@3 x ~ x ~ x ~ x ~@6", C: "~@2 x!2 ~ x ~ x ~@6 x!2", D: "~@3 x ~ x ~ x ~@8",
  E: "~@2 x!2 ~ x ~ x ~@6 x ~", F: "x ~ x!2 ~ x ~ x ~@8", G: "x ~ x!2 ~ x ~ x ~@6 x!2", H: "~@2 x!2 ~@12", I: "~ x!15",
  J: "x!16", K: "x!15 ~", L: "x!10 ~@2 x!4", M: "x!8 ~ x!3 ~@4", N: "x", O: "~ x!3 ~ x ~ x ~@8",
  P: "x ~ x!2 ~ x!2 ~@5 x ~@3", Q: "x ~ x!7 ~ x!3 ~ x!2", R: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2", S: "x ~ x!3 ~ x!3 ~ x!3 ~@3",
  T: "x!3 ~ x!12", U: "x!8 ~ x!2 ~@2 x!2 ~", V: "~ x!13 ~@2", W: "x!9 ~ x!6", X: "x!11 ~@5",
  Y: "x ~ x ~ x!3 ~ x ~ x ~@5", Z: "~ x!9 ~@2 x!4", AA: "x!3 ~ x!6 ~@2 x!4", AB: "x!3 ~ x!5 ~@3 x!4", AC: "x!6 ~@2 x!8",
  AD: "x!14 ~@2", AE: "x!8 ~@8", AF: "x!11 ~ x!4",
})).gain(0.32)

// drums · mid tom
const mid_tom = s("mt").struct("<~@35 A ~@7 B ~@7 C ~@13 D ~@15 E ~@7 E ~@22 E>".pickRestart({
  A: "~ x!3 ~@4 x ~@7", B: "~ x ~@7 x ~@6", C: "~@9 x ~@6", D: "~@11 x!2 ~ x ~", E: "~@7 x",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@21 A ~ A B C ~@5 B ~@13 A ~ A@3 ~@3 C ~@7 C ~ C ~ C ~ D ~ D ~ D ~@2 C E ~ B ~@3 C A@2 F G E H ~ C A@3 F A@2 I ~@9 A
  J G E H ~ C
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@15 x", C: "~@7 x", D: "~@3 x ~@12", E: "~@9 x ~@6", F: "~@3 x ~@6 x ~@5",
  G: "~@3 x ~@5 x!2 ~@5", H: "~@3 x ~@4", I: "~ x", J: "~@11 x ~@4",
})).gain(0.48)

// drums · crash
const crash = s("cr").struct("<~@28 A ~@5 A ~ A ~@7 A ~@9 A ~@5 A ~ A ~@11 A ~@5 A ~ A ~@7 A ~@14 A ~@7>".pickRestart({
  A: "x",
})).gain(0.48)

// drums · ride
const ride = s("rd").struct("<~@60 [~@10 x ~@2 x ~@2] [~@5 x!2 ~] ~@51>").gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<A@2 B A@4 B A@7 B A@4 C D A@4 B A@29 B A C D A@4 B A@31 ~@9 A@8>".pickRestart({
// … 102 more lines

More by Commodores