Strudelify

Never Can Say Goodbye

Communards

KeyF majorTempo130 bpm
0:00/0:00
// Never Can Say Goodbye — Communards
// 130 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 161 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(130/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 STRING"
const synth_strings_1 = note(`<
  A@4 B@2 C@2 A@4 B@2 C@2 D E@2 F D G@3 H I J@2 H I K L M N O@2 P@3 Q D E@2 F D G@3 H I J@2 H I K L M N O@2 R@4 A@4 B@2
  C@2 A@4 B@2 C@2 D E@2 F D G@3 H I J@2 H I K L M N O@2 P@3 Q D E@2 F D G@3 H I J@2 H I K L M N O@2 R@4 A@4 B@2 C@2 A@4
  B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 S
>`.pickRestart({
  A: "[[a4,c5,f5]@12 ~@2 [a4,c5,f5]@8 ~@2 [a4,c5,f5]@4 ~@2 [ab4,c5,f5]@5 ~ [ab4,c5,eb5]@18 ~@2 [ab4,c5,d5]@6 ~@2]/4", // F Fm Ab Dm7b5
  B: "[[b4,d5,f5]@6 ~ [bb4,db5,f5]@4 ~ [bb4,db5,f5]@3 ~]/2", C: "[[a4,c5,f5]@2 ~ [a4,c5,f5]@3 ~ [bb4,d5,f5]@5 ~@4]/2",
  D: "[d4,f4,a4]@3 ~ [d4,f4,a4]@3 ~", E: "[[d4,f4,a4]@6 ~ [d4,f4,g4]@7 ~@2]/2", F: "[d4,f4,a4]@3 ~",
  G: "[[d4,f4,a4]@6 ~ [d4,f4,g4]@15 ~@2]/3", H: "[f4,a4,c5]@3 ~ [f4,a4,c5]@10 ~@2", I: "[f4,a4,c5]@3 ~",
  J: "[[g4,bb4,eb5]@3 ~ [g4,bb4,d5]@3 ~ [eb4,g4,c5]@4 ~@2 [eb4,g4,c5]@14 ~@4]/2", // Eb Gm Cm
  K: "[g4,bb4,eb5]@3 ~ [g4,bb4,d5]@10 ~@2", L: "[g4,bb4,c5]@3 ~ [g4,bb4,c5]@3 ~", M: "[a4,c5,e5]@3 ~ [a4,c5,e5]@10 ~@2",
  N: "[a4,c5,e5]@3 ~", O: "[[bb4,c5,eb5]@3 ~ [g4,bb4,c5]@3 ~ [g4,bb4,c5]@4 ~@2 [bb4,c5,eb5]@14 ~@4]/2",
  P: "[[f4,a4,d5]@20 ~@4 [f4,a4,d5] ~ [a4,c5,e5]@2 ~@2 [bb4,d5,f5]@14 ~@4]/3", Q: "[f4,c5,e5] ~@7",
  R: "[[f4,a4,d5]@20 ~@4 [f4,a4,d5] ~ [a4,c5,e5]@2 ~@2 [bb4,d5,f5]@14 ~@2 [g4,bb4,c5]@8 ~@2 [g4,bb4,d5]@6 ~@2]/4", // Dm Am Bb C7 Gm
  S: "[a4,c5,f5]@2 ~ [a4,c5,f5] ~@4", // F
})).s("gm_synth_strings_1").gain(0.25)

// other · cello
const cello = note(`<
  ~@8 A@2 B@2 C@2 D ~ E F@2 G E H@3 I J K@2 I J L M N O P@2 Q@3 R E F@2 G E H@3 I J K@2 I J L M N O P@2 S@4 A@2 B@2 C@2
  D ~ A@2 B@2 C@2 D ~ E F@2 G E H@3 I J K@2 I J L M N O P@2 Q@3 R E F@2 G E H@3 I J K@2 I J L M N O P@2 S@4 A@2 B@2 C@2
  D ~ A@2 B@2 C@2 D ~ A@2 B@2 C@2 D ~ A@2 B@2 C@2 D ~ T
>`.pickRestart({
  A: "[f4@6 ~ f4@4 ~ f4@2 ~ f4]/2", B: "[eb4@3 ~ eb4@18 ~@2 eb4@6 ~@2]/2", C: "[g4@6 ~ gb4@4 ~ gb4@3 ~]/2",
  D: "f4@2 ~ f4@3 ~ g4", E: "bb3@3 ~ bb3@3 ~", F: "[bb3@6 ~ bb3@7 ~@2]/2", G: "bb3@3 ~", H: "[bb3@6 ~ bb3@15 ~@2]/3",
  I: "e4@3 ~ e4@10 ~@2", J: "e4@3 ~", K: "[eb4@3 ~ eb4@3 ~ c4@4 ~@2 c4@14 ~@4]/2", L: "eb4@3 ~ eb4@10 ~@2",
  M: "eb4@3 ~ eb4@3 ~", N: "f4@3 ~ f4@10 ~@2", O: "f4@3 ~", P: "[g4@3 ~ eb4@3 ~ eb4@4 ~@2 g4@14 ~@4]/2",
  Q: "[d4@20 ~@4 d4 ~ e4@2 ~@2 f4@14 ~@4]/3", R: "c4 ~@7", S: "[d4@20 ~@4 d4 ~ e4@2 ~@2 f4@14 ~@2 e4@8 ~@2 e4@6 ~@2]/4",
  T: "f4@2 ~ f4 ~@4",
})).s("gm_cello").gain(0.21)

// other · glockenspiel · "GLOCKENSPL"
const glockenspiel = note("<A B C D E F G H ~@7 H ~@55 H ~@7 H ~@55 H ~@7 H ~@7 H ~@7 H ~>".pickRestart({
  A: "c6 ~ a5@2 f5@2 a5@2 c6@2 a5@2 f5@2 a5@2", B: "c6@2 a5@2 f5@2 a5@2 c6@2 a5@2 f5@2 ab5 ~",
  C: "c6@2 ab5@2 f5@2 ab5@2 c6@2 ab5@2 f5@2 ab5 ~", D: "c6 ab5 f5 ab5 c6 ab5 f5 ab5",
  E: "d6 ~ b5@2 g5@2 b5@2 d6@2 b5@2 g5@2 b5 ~", F: "db6 bb5 gb5 bb5 db6 bb5 gb5 bb5",
  G: "c6 ~ a5@2 f5@2 a5@2 c6@2 a5@2 f5@2 a5 ~", H: "f6 ~ c6 ~ d6 ~ f6 ~ ab6 ~ a6 ~ ab6 ~ a6 ~",
})).s("gm_glockenspiel").gain(0.25)

// other · brass section · "BRASS"
const brass_section = note(`<
  A B@3 C@2 D@2 A E@3 C@2 F@2 ~@20 G@3 H ~@20 I@4 A E@3 C@2 D@2 A E@3 C@2 D@2 ~@20 G@3 H ~@20 J@3 K A E@3 C@2 D@2 A E@3
  C@2 D@2 A E@3 C@2 D@2 A E@3 C@2 F@2 L
>`.pickRestart({
  A: "f5@6 ~ c5", B: "[~@2 c5 ~ c5@2 c5 ~ c5@4 ~@2 c5@5 ~ c5@18 ~@2 c5@6 ~@2]/3", C: "[d5@6 ~ db5@4 ~ db5@3 ~]/2",
  D: "[c5 ~ c5 ~ d5 ~ c5@3 ~ c5 ~ d5 ~ d5@10 ~@8]/2", E: "[~@2 c5 ~ c5@3 ~ c5@4 ~@2 c5@5 ~ c5@18 ~@2 c5@6 ~@2]/3",
  F: "[[f2,c5] ~ [c2,c5] ~ [d2,d5] ~ [f2,c5]@3 ~ [c2,c5] ~ [d2,d5] ~ f2@3 ~ c2 ~ d2 ~ f2 ~ ab2 ~ a2 ~ ab2 ~ a2 ~, ~@7 d5@5 ~@4]/2", // F5 C D F5 C D
  G: "[a4@20 ~@4 a4 ~ c5@2 ~@2 d5@4 ~@2 d5@2 ~@2 d5@2 ~@2 d5@2 ~@2]/3", H: "g5 ~@7",
  I: "[a4@20 ~@4 a4 ~ c5@2 ~@2 d5@4 ~@2 d5@2 ~@2 d5@2 ~@2 d5 ~ bb4@14 ~@4]/4",
  J: "[a4@20 ~@4 a4 ~ c5@2 ~@2 d5@14 ~@4]/3", K: "bb4@3 ~", L: "[f2,c5] ~ [c2,c5] ~ [d2,d5] ~ [f2,c5]@2 ~@8",
})).s("gm_brass_section").gain(0.35)

// other · synth strings 2 · "SYN STRING"
const synth_strings_2 = note(`<
  A B@2 C D@2 E@2 A B@2 C D@2 ~@2 F@2 G@2 F@2 G@2 ~@16 F@2 G@2 F@2 H I ~@32 F@2 G@2 F@2 G@2 ~@73
>`.pickRestart({
  A: "f1@7 ~", B: "[f1@6 ~ f1@8 ~]/2", C: "f1@3 ~", D: "[g1@12 ~@2 gb1@9 ~ gb1@7 ~]/2", E: "[f1@2 ~ f1@3 ~ c1@8 ~]/2",
  F: "bb2@7 ~", G: "c3@7 ~", H: "c3@7 ~ c3@7 ~", I: "c3@3 ~ c3@3 ~ c3@3 ~ c3@3 ~",
})).s("gm_synth_strings_2").gain(0.34)

// bass · synth bass 1 · "SYNTH BASS"
const bass = note(`<
  A B@2 C D@2 E@2 A B@2 C D@2 F G H@2 I@2 H@2 I@2 J@2 K@2 J@2 K@2 J@2 K@2 L M N O H@2 I@2 H@2 I@2 J@2 K@2 J@2 K@2 J@2
  K@2 L M N O P@2 Q@2 R S T U J@2 Q@2 R S T U H@2 I@2 H@2 I@2 J@2 K@2 J@2 K@2 J@2 K@2 L M N O L@2 K@2 L@2 K@2 J@2 K@2
  J@2 K@2 J@2 K@2 L M N O P@2 Q@2 R S T U P@2 Q@2 R S T U P@2 Q@2 R S T U P@2 Q@2 R V F G W
>`.pickRestart({
  A: "f1@7 ~", B: "[f1@6 ~ f1@8 ~]/2", C: "f1@3 ~", D: "[g1@12 ~@2 gb1@9 ~ gb1@7 ~]/2", E: "[f1@2 ~ f1@3 ~ c1@8 ~]/2",
  F: "f1 ~ c1 ~ d1 ~ f1@3 ~ c1 ~ d1 ~ f1@2", G: "~@2 c1 ~ d1 ~ f1 ~ ab1 ~ a1 ~ ab1 ~ a1 ~",
  H: "bb1 ~ bb2 ~ bb1 ~ bb2 ~ bb1 ~ bb2 ~ bb1 ~ bb2 ~", I: "c2 ~ c3 ~ c2 ~ c3 ~ c2 ~ c3 ~ c2 ~ c3 ~",
  J: "[f1,c3] c3 [f2,c3] c3 [f1,c3] c3 [f2,c3] c3 [f1,c3] c3 [f2,c3] c3 [f1,c3] c3 [f2,c3] c3", // F5
  K: "[c2,c3] c3!3 [c2,c3] c3!3 [c2,c3] c3!3 [c2,c3] c3!3", // C
  L: "[bb1,a2] a2 [a2,bb2] a2 [bb1,a2] a2 [a2,bb2] a2 [bb1,a2] a2 [a2,bb2] a2 [bb1,a2] a2 [a2,bb2] a2", // Bbmaj7
  M: "[bb1,a2] a2 [a2,bb2] a2 [bb1,a2] a2 [a2,bb2] a2 [bb1,a2] a2 [a2,bb2] a2 [a1,a2] a2!3", // Bbmaj7 A
  N: "[g1,bb2] bb2 [g2,bb2] bb2 [g1,bb2] bb2 [g2,bb2] bb2 [g1,bb2] bb2 [g2,bb2] bb2 [g1,bb2] bb2 [g2,bb2] bb2", // Gm
  O: "[c2,bb2] bb2 [bb2,c3] bb2 [c2,bb2] bb2 [bb2,c3] bb2 [c2,bb2] bb2 [bb2,c3] bb2 [c2,bb2] bb2 [bb2,c3] bb2", // C7 Bbsus2 C7 Bbsus2 C7 Bbsus2 C7 Bbsus2
  P: "[f1,a2] a2 [f2,a2] a2 [f1,a2] a2 [f2,a2] a2 [f1,a2] a2 [f2,a2] a2 [f1,a2] a2 [f2,a2] a2", // F
  Q: "[f1,ab2] ab2 [f2,ab2] ab2 [f1,ab2] ab2 [f2,ab2] ab2 [f1,ab2] ab2 [f2,ab2] ab2 [f1,ab2] ab2 [f2,ab2] ab2", // Fm
  R: "[g1,g2] g2!3 [g1,g2] g2!3 [g1,g2] g2!3 [g1,g2] g2!3", // G
  S: "[gb1,gb2] gb2!3 [gb1,gb2] gb2!3 [gb1,gb2] gb2!3 [gb1,gb2] gb2!3", // Gb
  T: "[f1,c3] c3 [c1,c3] c3 [d1,c3] c3!5 [c1,c3] c3 [d1,c3] c3!3, ~@6 f1@3 ~@5 f1@2", // F5 C D7 C D7
  U: "c3!2 [c1,c3] c3 [d1,c3] c3 [f1,c3] c3 [ab1,c3] c3 [a1,c3] c3 [ab1,c3] c3 [a1,c3] c3", // C D7 F5 Ab Am Ab Am
  V: "[gb1,gb2] gb2!3 [gb1,gb2] gb2!3 [gb1,gb2] gb2!3 [gb1,gb2] gb2!2 ~", W: "f1 ~ c1 ~ d1 ~ f1@2 ~@8",
})).s("gm_synth_bass_1").gain(0.31)

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

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

// drums · hihat
const hihat = s("hh").struct("<~@8 [x!8]!152 [x!3 ~@5]>").gain(0.52)

// drums · open hat
const open_hat = s("oh").struct("<~@8 [~ x ~ x ~ x ~ x]!152 [~ x ~@6]>").gain(0.29)

stack(synth_strings_1, cello, glockenspiel, brass_section, synth_strings_2, bass, kick, snare, hihat, open_hat)

More by Communards