Strudelify
Have a Cigar cover art

Wish You Were Here

Have a Cigar

Pink Floyd

KeyF majorTempo120 bpm
0:00/0:00
// Have a Cigar — Pink Floyd
// 120 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (5/4 at bar 26, 4/4 at bar 28) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 53 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// bass · electric bass pick · "Staff-2"
const bass = note(`<
  A B C D E F G H I J K L@3 M@4 N O@3 P@5 Q R S T U V W X Y Z AA AB AC AD AE U V W X Y Z AA AB AC AD ~
>`.pickRestart({
  A: "~@6 e1!2 e1@4 e2@4", B: "~ g1 e2 ~@2 d2 d2@2", C: "g2@2 e2 e3@3 d2 e2", D: "g2@2 e2 ~@2 d2!2 e2",
  E: "~ a1 e2 e3 ~ e3 e2@2", F: "~ g1 e2 ~@3 a1 b1", G: "d2@2 e2 g2@2 g2 e2@2", H: "~ g1 d2 ~@2 e3@2 d3",
  I: "b2 bb2 a2 g2@3 e2 ~", J: "~ g1 e2 ~@2 e2 d2 e2", K: "e2 e1 e2 g2@2 ~ d2 e2",
  L: "[~@4 e2 ~@7 e1@6 gb1@6 g1@4 c2@6 f1 g1 c2@6 bb1@2 bb1@2 c2@2]/3",
  M: "[~ c2!2 g1 ~@2 bb1 c2@3 c2 ~@3 c2@3 g1@3 gb1@2 e1@3 d2 e2 ~@3 e3!2]/4", N: "~ a2 d3 g2@3 e2 ~",
  O: "[~@2 g1@2 e2@2 ~@6 e1@6 gb1@6 g1@4 c2@6 f1 g1 c2@6 bb1@2 bb1@2 c2@2]/3",
  P: "[~ c2!2 g1 ~@2 bb1 c2@3 c2 ~@3 d2@3 a1 d2 a2 c3 ~ g2@3 gb2@3 e2@3 d2@3 db2@2 c2 db2 d2 eb2]/5",
  Q: "e2@2 e2@2 ~@2 g2@2 d3@2 e3@4 e2 ~", R: "e2@2 a1!2 e2!2 ~@2", S: "e2@3 g1 e2 ~@2 d2", T: "d2 e2 g2@2 e2 ~@2 d2",
  U: "e2@2 ~ g1 e2 ~@2 d2", V: "e2@2 ~ g2 e2 g2 e2 d2", W: "e2@3 a1 e2 e3 e3@2", X: "d2 e2 g2@2 e2 ~ g2!2",
  Y: "e2@3 g2 b2@2 e2 d2", Z: "c2", AA: "d2", AB: "e2@4 ~@3 e2", AC: "e1@4 g2@4 e2@3 g2 g2@2 d2@2",
  AD: "e2@2 ~ g2 b2@2 e3@2", AE: "e3 e3@3 e3 ~@2 d2",
})).s("gm_electric_bass_pick").gain(0.56)

// bass · slap bass 2 · "Staff-3"
const bass_2 = note(`<
  A B C B D B C E F B C G@3 ~ H I B C G@3 ~@2 J K@2 L M L N L M L M L ~@2 L M L N L M L M L ~@2 L M L ~
>`.pickRestart({
  A: "~@6 e3!2 [b2,e3]@4 e2@2 [b2,e3]@2", B: "e2 g2 [b2,e3] ~@2 [b2,e3] ~ [b2,e3]",
  C: "e2@2 g2@2 d3@2 g2@5 ~ e2@2 [b2,e3]@2", D: "e2 g2 d3 [b2,e3,a3]@3 e2 [b2,e3]", E: "e2 g2 [b2,e3] ~@2 e3@2 d3",
  F: "b2 bb2 a2 g2@3 e2 [b2,e3]", G: "[e2 g2 [b2,e3] ~@3 e3@3 gb3@3 g3@2 c3@8 ~@2]/3", H: "~@3 c3",
  I: "~@2 g3@5 ~ gb3@3 ~ e2@2 [b2,e3]@2", J: "~@3 g3", K: "[~@2 gb3@5 ~ e3@6 d3@5 ~ db3@3 ~ c3@2 db3@2 d3@2 eb3@2]/2",
  L: "e2 [b2,e3] e2 g2 [b2,e3] ~@2 [b2,e3]", M: "~@2 [b2,e3]@2 e2@2 g2@2 d3@2 g2@5 ~",
  N: "~ [b2,e3] e2 g2 d3 [b2,e3,a3]@3", // E5 Esus4
})).s("gm_slap_bass_2").gain(0.56)

// other · distortion guitar · "Staff-4"
const distortion_guitar = note("<~@7 A B C@2 ~ D@3 E F@2 ~ G@4 ~ H I@2 J K@2 ~@6 L M N@2 ~@7 L M O@2 ~@2>".pickRestart({
  A: "~@5 e4@2 d4", B: "b3@2 bb3@2 a3@2 g3@5 ~@5", C: "[~@5 a5@11]/2",
  D: "[~@12 c3@8 [e3,g3,c4,e4]@10 [c3,e3,g3,c4,e4]@5 ~ c4@2 g3@2 e3@2 g3@2 c3@3 ~]/3", E: "e3@2 g3@2 c4@7 ~ c3@4",
  F: "[~@2 g3@5 ~ gb3@3 ~ e3@7 ~@5 [g4,b4]!4 [g4,b4]@3 ~]/2", // G
  G: "[~@12 e3@6 gb3@6 g3@4 c3@7 ~ [e3,g3,c4,e4]@5 ~ c4@15 ~@7]/4", H: "~@3 g3",
  I: "[~@2 gb3@5 ~ e3@6 d3@5 ~ db3@3 ~ c3@2 db3@2 d3@2 eb3@2]/2", J: "e3@7 ~@9", K: "[~@3 d5@5]/2",
  L: "[c3,e3,g3]@7 ~ c4@2 g3@2 e3@2 g3@2", M: "d3@2 gb3 g3 d4 g3 gb3 g3", N: "[[b2,e3]@3 ~@3 [a4,d5]@13 ~@13]/2",
  O: "[[b2,e3]@3 ~@9 e5@2 d5@14 ~@4]/2", // E5
})).s("gm_distortion_guitar").gain(0.56)

// chords · synth bass 2 · "Staff-6"
const synth_bass_2 = note(`<
  ~@4 A@8 B@2 C D E@2 ~ F@3 G H@2 ~@2 I J@2 K@2 J@2 K@2 L M K@2 J@2 N J@2 K@2 L M K@2 O@2
>`.pickRestart({
  A: "[~@12 e3@7 ~ [b3,e4,b4]@23 ~ e3@7 ~ [b3,e4,b4]@23 ~ e3@7 ~ [b3,e4,b4]@15 ~@5 [b3,e4]@2 [b3,e4,b4]@2 e3@7 ~ [b3,e4,b4]@2 ~@6 e4@4]/8", // E5
  B: "[~ gb4@3 g4@2 [c4,c5]@8 ~@2]/2", C: "~@4 [e4,g4,c5]@7 ~@5", D: "~@4 [e4,c5]@7 ~ c4@4",
  E: "[~@2 g4@5 ~ gb4@3 ~ e4@7 ~@13]/2", F: "[~@6 e4@3 gb4@3 g4@2 [c4,c5]@8 ~@2]/3",
  G: "~@4 [e4,g4,c5]@2 [e4,g4,c5]@2 ~@2 g4@2 e4@3 ~", H: "[g4@2 c5@2 [g4,c5,e5]@3 ~@5 d4@10 [a4,d5,gb5]@5 ~@5]/2",
  I: "e3@15 ~", J: "[e3@7 ~ [b3,e4,b4]@15 ~@5 [b3,e4]@2 [b3,e4,b4]@2]/2", K: "[e3@7 ~ [b3,e4,b4]@23 ~]/2",
  L: "~@8 [c4,e4,g4]@7 ~", M: "~@8 [d4,g4]@7 ~", N: "[b3,e4,b4]@15 ~", O: "[e3@7 ~ [b3,e4,b4]@15 ~@9]/2",
})).s("gm_synth_bass_2").gain(0.48)

// chords · synth strings 1 · "Staff-7"
const synth_strings_1 = note("<~@4 A@8 B@4 C@4 D@5 ~@2 E@9 F G E@9 F G E@3 ~>".pickRestart({
  A: "[~@3 [b3,e4,g4]@4 [b3,e4,g4]@4 [b3,e4,g4]@4 [b3,e4,g4]@4 [b3,e4,g4]@4 [b3,e4,g4]@4 [b3,e4,g4]@4 ~]/8", // Em
  B: "[~@3 [c4,e4,g4]@4 [c4,e4,g4]@4 [c4,e4,g4]@4 ~]/4", C: "[~@3 [b3,e4,g4]@4 [b3,e4,g4]@4 [b3,e4,g4]@4 ~]/4",
  D: "[~@3 [c4,e4,g4]@4 [c4,e4,g4]@4 [c4,e4,g4]@4 [d4,gb4,a4]@4 ~]/5", E: "[b3,e4,g4]", F: "[c4,e4,g4]",
  G: "[c4,d4,gb4]", // D7
})).s("gm_synth_strings_1").gain(0.4)

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

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@6 A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 B ~@3 B ~@2 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@3
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@5 x ~@2",
})).gain(0.56)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 [~@5 x ~@2] ~@25 [~@7 x] ~@22>").gain(0.56)

// drums · high tom
const high_tom = s("ht").struct("<~@4 [~ x] ~@25 [~@3 x] ~@22>").gain(0.56)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~ B ~ A ~ B A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ C D C ~ C D C@2 ~ C ~ C ~ C ~ C ~ C ~ C ~ C D C@2 ~
>`.pickRestart({
  A: "~@3 x", B: "~@3 x ~@2 x ~", C: "x", D: "~@5 x ~@2",
})).gain(0.56)

stack(
  bass, bass_2, distortion_guitar, synth_bass_2, synth_strings_1, kick, snare, hihat, open_hat, mid_tom, high_tom, crash
)

More by Pink Floyd