Strudelify

Good Times

Chic

KeyE minorTempo111 bpm
0:00/0:00
// Good Times — Chic
// 111 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 105 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(111/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 · "A.PIANO 2"
const piano = note(`<
  ~@7 A B C@2 D@2 E@2 F B G@2 H@2 G@2 ~ I J K L M N O P Q R S T U V W X B C@2 D@2 E@2 F B G@2 H@2 G@2 ~ I J K L M N O P
  Q R S T U V Y X B C@2 D@2 E@2 F B G@2 H@2 G@2 A B C@2 D@2 E@2 F B G@2 H@2 G@2 ~@2
>`.pickRestart({
  A: "~@6 [c#5,e5,a5] ~", B: "[d5,g5,b5] ~@7",
  C: "[[c#5,e5,a5]@2 ~@2 [c#5,e5]@2 ~@2 [c#5,a5]@2 ~@2 [c#5,e5,a5]@2 ~ [d5,g5,b5]@2 ~@15, ~@4 a5 ~@3 e5 ~@23]/2", // A C#m F#m A G
  D: "[[f#4,c#5,a5]@2 ~@2 [f#4,c#5,a5]@2 ~@2 [f#4,c#5,a5]@2 ~@2 [f#4,c#5,e5,a5]@2 ~ [d4,d5,g5,b5]@2 ~@15, e5 ~@3 e5 ~@3 e5 ~@23]/2", // F#m F#m7 G
  E: "[[c#5,e5,a5]@2 ~@2 [c#5,a5]@2 ~@2 [c#5,a5]@2 ~@2 [c#5,e5,a5]@2 ~ [d5,b5]@2 ~@15, ~@4 e5 ~@3 e5 ~@6 g5 ~@16]/2", // A F#m A G
  F: "~@12 [c#5,e5,a5]@3 ~", // A
  G: "[[c#5,e5,a5]@2 ~@2 [c#5,e5,a5]@2 ~@2 [c#5,e5,a5]@2 ~@2 [c#5,e5,a5]@2 ~ [d5,g5,b5]@2 ~@15]/2", // A G
  H: "[[f#4,c#5,e5,a5]@2 ~@2 [f#4,c#5,e5,a5]@2 ~@2 [f#4,c#5,e5,a5]@2 ~@2 [f#4,c#5,e5,a5]@2 ~ [d4,d5,g5,b5]@2 ~@15]/2", // F#m7 G
  I: "~@2 d5 ~ e5@2 d5 e5 ~@6 f#5@2", J: "g5@2 f#5!2 ~@12",
  K: "~@2 [b4,d5] ~ e5@2 [b4,d5] [c#5,e5] ~@6 [d5,f#5] ~, ~@4 c#5 ~@11", L: "g5@2 [c#5,f#5] [c#5,e5] ~@12, c#5 ~@15",
  M: "~@2 d5 ~ e5@2 d5 e5 ~@6 f#5 ~", N: "g5@2 f#5 ~ e5 ~ f#5@5 ~@5", O: "~@4 e5 ~ d5 e5 ~@6 e5 ~",
  P: "e5@3 ~ e5!2 d5 e5 ~@8", Q: "~@2 e5 ~ e5 ~ d5 e5 ~@6 c#5 d5", R: "e5 ~ e5 ~ e5 ~ d5 e5 ~@8",
  S: "~@2 e5 ~ e5 ~ d5 e5 ~@6 [a4,c#5]@2", T: "[c#5,e5] ~ [c#5,e5] ~ [c#5,e5] ~ [b4,d5] [c#5,e5] ~@8",
  U: "~@2 g5 ~ g5@2 f#5!2 ~@6 e5 f#5", V: "g5 ~ f#5 ~ f#5@2 ~@10",
  W: "~@2 [c#5,e5] ~ [c#5,e5] ~ [c#5,e5] ~ [c#5,e5] ~ [c#5,e5] ~ [b4,d5] ~ [c#5,e5] ~", // C#m Bm C#m
  X: "[e5,g5]@2 [d5,f#5] [c#5,e5] [c#5,f#5] ~@7 [c#5,e5,a5]@2 ~@2", // Em D C#m F#5 A
  Y: "~@2 [c#5,e5] ~@3 [c#5,e5] ~ [c#5,e5] ~ [c#5,e5] ~ [b4,d5] ~ [c#5,e5] ~", // C#m Bm C#m
})).s("gm_piano").gain(0.64)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B@2 C D E@2 F G H@2 I D B@2 J G K@2 L D B@2 M N O P Q N O P Q N O P Q N O P Q G H@2 I D B@2 J G K@2 L D B@2 M N O P
  Q N O P Q N O P Q N O P Q G H@2 I D B@2 J G K@2 L D B@2 M G H@2 I D B@2 J G K@2 L D B@2 M ~
>`.pickRestart({
  A: "e2 ~@3 e2@2 ~@2 e2@2 ~@5 e2", B: "[e2 ~ f#2@2 g2@2 a2@2 b2@2 c#3@2 d3@2 e3 a2@2 ~@3 a2@2 ~@2 a2@2 ~@5 a2]/2",
  C: "a2 g2 a2 e3 g3@2 f#3@2 a2@2 ~ d2 e2 d2 f#2@2", D: "e2@2 ~@2 e2@2 ~@2 e2@2 ~@5 e2",
  E: "[e2!2 f#2@2 g2@2 a2@2 b2@2 c#3@2 d3@2 e3 a2@2 ~@3 a2@2 ~@2 a2@2 ~@5 a2]/2",
  F: "a2 g2 a2 e3 g3 ~ f#3@2 a2 ~@2 d2 e2 ~ f#2@2", G: "e2@2 ~@2 e2@2 ~@2 e2@3 ~@4 e2",
  H: "[e2!2 f#2@2 g2@2 a2 ~ b2@2 c#3@2 d3@2 e3 a2@2 ~@3 a2@2 ~@2 a2@2 ~@5 a2]/2",
  I: "a2 g2 a2 e3 g3 ~ f#3 ~ a2@2 ~ d2 e2 d2 f#2@2", J: "a2 g2 a2 e3 g3 ~ f#3@2 a2 ~@2 d2 e2 d2 f#2@2",
  K: "[e2!2 f#2@2 g2@2 a2@2 b2 ~ c#3@2 d3@2 e3 a2@2 ~@3 a2@2 ~@2 a2@2 ~@5 a2]/2",
  L: "a2 g2 a2 e3 g3 ~ f#3@2 a2@2 ~ e2!2 ~ f#2@2", M: "a2 g2 a2 e3 g3 ~ f#3 ~ a2@2 ~ e2 g2 e2 a2 ~",
  N: "e2 ~@3 e2 ~@3 e2@2 ~@2 e2@2 ~ d3", O: "e2 ~ e2 ~ e2@2 ~@2 e2@2 ~@2 e2@2 g2 e2",
  P: "a2 ~@3 a2 ~@3 a2 ~@3 a2@2 ~ e2", Q: "a2 ~@3 a2@2 ~@2 a2@2 ~ e2 a2 e2 d3 ~",
})).s("gm_acoustic_bass").gain(0.56)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C D E F C D E G C H I G J K I L A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 C D E
  F C D E G C H I G J K I L A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 B@2 A@2 M@3
>`.pickRestart({
  A: "[~@10 b5 b5@2 [g5,b5]@18 ~, [e4,g4,b4,d5]@31 ~, ~@10 d6@21 ~, ~@11 e6@20 ~]/2", // G Em7
  B: "[~@13 d5@19, [e4,g4]@31 ~, d5@13 ~@19, ~@10 b4@21 ~]/2", C: "[e4,g4,b4]", D: "[g4,b4,e5]", E: "[a4,g5,b5,d6]",
  F: "[c#5,e5,a5,c#6]", G: "~ a4, [c#5,e5,a5,c#6]", H: "~ [g5,b5,d6], [g4,b4,e5]", I: "[a4,e5,g5,b5,d6]",
  J: "[e4,g4,b4,d5]@15 ~", K: "[a4,b4,d5,e5] [g5,b5,d6]", L: "c#5@8 a4@7 ~, [e5,a5,c#6]@15 ~",
  M: "[~@13 d5@32 ~@3, [e4,g4]@2 ~, d5@13 ~@35, ~@5 b4@16 ~@3]/3", // Em
})).s("gm_acoustic_guitar_nylon").gain(0.36)

// other · epiano1 · "E.PIANO 1"
const epiano1 = note("<~ [a5@13 ~@3] ~ [a5@13 ~@3] ~ [a5@7 ~] ~@99>").s("gm_epiano1").gain(0.48)

// chords · slap bass 1 · "SLAPBASS 1"
const slap_bass_1 = note(`<
  A B C D A B C D A B C D A B C D A B C D A B C D E F G H I J K L M N O P Q R S T A B C D A B C D A B C D A B C D E F G
  H I J K L M N O P Q R S T 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 ~
>`.pickRestart({
  A: "[e4,g4,b4] [g4,b4] e4 ~ [e4,g4,b4] [g4,b4] e4 ~ [e4,g4,b4] [g4,b4] e4 ~ [e4,g4,b4] ~@3", // Em G Em G Em G Em
  B: "[e4,a4,b4] ~ [e4,a4,b4] ~ [e4,a4,b4] ~ [e4,a4,b4] ~ [e4,a4,b4] ~ [e4,a4,b4] ~ [e4,a4,b4] ~ [e4,a4,b4] ~", // Esus4
  C: "[c#4,e4,a4] [e4,a4] c#4 ~ [c#4,e4,a4] [e4,a4] c#4 ~ [c#4,e4,a4] [e4,a4] c#4 ~ [c#4,e4,a4] [e4,a4] c#4 ~", // A A5 A A5 A A5 A A5
  D: "[c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~ [c#4,f#4,a4] ~", // F#m
  E: "~@2 [e4,g4,b4] ~ b4 [e4,g4,b4] ~ [g4,b4] [e4,g4,b4] ~@2 [e4,g4,b4] ~ [g4,b4] [e4,g4,b4] ~", // Em G Em G Em
  F: "~@2 [e4,g4,b4] ~ [e4,g4,b4]!2 ~ [e4,g4,b4]!2 ~ [e4,g4,b4]!2 ~ b4 [e4,g4,b4] ~", // Em
  G: "~@2 [c#4,e4,a4] ~ [c#4,a4] [c#4,e4,a4] ~ [e4,a4] [c#4,e4,a4] ~ [c#4,e4,a4]!2 ~ [c#4,e4,a4] [c#4,f#4,a4] ~", // A F#m A A5 A F#m
  H: "[c#4,e4,a4] ~ [c#4,e4,a4] ~@2 [c#4,e4,a4] [e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4] [c#4,e4,a4] ~ a4 [c#4,e4,a4] ~", // A A5 A C#m A
  I: "~@2 [e4,g4,b4] ~ [e4,g4,b4]!2 ~@2 [e4,g4,b4]!2 ~ [g4,b4] [e4,g4,b4] ~ [e4,g4,b4]!2", // Em G Em
  J: "~ [e4,g4,b4]!2 ~ [e4,g4,b4]!2 ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4]!2 ~ [e4,g4,b4] ~", // Em
  K: "~@2 [c#4,e4,a4] ~ [c#4,e4,a4]!2 ~ [c#4,e4,a4]!2 ~ [c#4,e4,a4]!2 ~ [c#4,e4,a4] [c#4,f#4,a4] ~", // A F#m
  L: "[c#4,e4,a4] ~ [c#4,e4,a4] ~ [c#4,e4,a4]!2 ~ [c#4,e4,a4]!2 ~ [c#4,e4,a4]!2 ~ [c#4,e4,a4]!2 ~", // A
  M: "~@2 [e4,g4,b4] ~ [e4,g4,b4]!2 ~ [e4,g4,b4]!2 ~ [e4,g4,b4]!4 ~@2", // Em
  N: "[e4,g4,b4] ~ [e4,g4,b4]!2 ~ [e4,g4,b4]!2 ~ [g4,b4] [e4,g4,b4] ~ [g4,b4] [e4,g4,b4] [g4,b4] [e4,g4,b4] ~", // Em G Em G Em G Em
  O: "~@2 [c#4,e4,a4] ~ e4 [c#4,e4,a4] ~ [c#4,e4,a4]!2 ~@2 [c#4,e4,a4] ~ [c#4,e4,a4] [c#4,f#4,a4] ~", // A F#m
  P: "[c#4,e4,a4] ~ [c#4,e4,a4] ~@2 [c#4,e4,a4] ~ [c#4,e4,a4]!2 ~ [c#4,e4,a4]!2 ~ [e4,a4] [c#4,e4,a4] ~", // A A5 A
  Q: "~@2 [e4,g4,b4] ~ b4 [e4,g4,b4] ~ [e4,g4,b4]!2 ~ [e4,g4,b4]!2 ~ [e4,g4,b4] ~ [e4,g4,b4]", // Em
  R: "~@2 [e4,g4,b4] ~ [e4,g4,b4]!2 ~ [e4,g4,b4] ~ [e4,g4,b4]!2 ~ [e4,g4,b4]!2 ~ [e4,g4,b4]", // Em
  S: "~@2 [c#4,e4,a4] ~@2 [c#4,e4,a4] ~ [c#4,e4,a4]!2 ~ e4 [c#4,e4,a4] ~ [c#4,e4,a4] [c#4,f#4,a4] ~", // A F#m
  T: "~@2 [c#4,e4,a4] ~@2 [c#4,e4,a4] ~ [c#4,e4,a4]!2 ~ [c#4,e4] [c#4,e4,a4] ~ [e4,a4] ~@2", // A C#m A A5
})).s("gm_slap_bass_1").gain(0.61)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note(`<
  ~@8 A B C D E F ~ D G H I J G K@2 L M N O P M Q O R ~@4 M S O T A B C D E F ~ D G H I J G K@2 L M N O P M Q O R ~@4 M
  S O T A B C D E F ~ D G H I J G K@2 L A B C D E F ~ D G H I J G K@2 L ~
>`.pickRestart({
  A: "b5 ~@7, b4 ~@15", B: "[e5,a5]@11 ~@5", C: "[b3,b4] ~@7", D: "[c#5,e5,a5]@3 ~", E: "[b3,b4,b5] ~@7",
  F: "[b4,e5,a5]@12 ~@2 [d4,e4,d5,e5] [c#4,c#5]", G: "[b4,b5] ~@7", H: "[b4,e5,a5]@7 ~", I: "[b3,b4] ~@15",
  J: "[c#5,e5,a5]@13 ~@3", K: "[[b4,e5,a5]@12 ~@2 [e4,e5] [d4,c#5,d5] ~@16, ~@15 c#4@2 ~@15]/2", L: "[c#5,e5,a5]@15 ~",
  M: "~ [b3,b4] [d4,d5] [g4,g5]", N: "[b4,b5]@13 ~@3", O: "~ [a3,a4] [d4,d5] [e4,e5]", P: "[a4,a5]@3 ~",
  Q: "[b4,b5]@11 ~@5", R: "[a4,a5]@7 ~", S: "[b4,b5]@3 ~", T: "[a4,a5]@15 ~",
})).s("gm_string_ensemble_2").gain(0.37)

// drums · kick
const kick = s("bd").struct("<[x!4]!104 ~>").gain(0.62)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!87 [~@4 x ~@7 x ~ x!2] [~ x ~ x]!16 ~>").gain(0.7)

// drums · clap
const clap = s("cp").struct("<~@8 [~ x ~ x]!16 ~@16 [~ x ~ x]!16 ~@16 [~ x ~ x]!32 ~>").gain(0.7)

// drums · hihat
const hihat = s("hh").struct("<[x!16]!103 [x!15 ~] ~>").gain(0.62)

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

// drums · crash
const crash = s("cr").struct("<A ~@15 A ~@7 A ~@7 A ~@15 A ~@7 A ~@23 A ~@15 A ~@8>".pickRestart({
  A: "x",
})).gain(0.7)

// drums · bell tree
const bell_tree = s("marktrees:0").struct("<~@70 [~ x ~@2] ~@34>").gain(2.77)

stack(
  piano, bass, acoustic_guitar_nylon, epiano1, slap_bass_1, string_ensemble_2, kick, snare, clap, hihat, open_hat,
  crash, bell_tree
)

More by Chic