Strudelify
Puff cover art

1969 · Peter, Paul and Mommy

Puff

Peter, Paul & Mary

KeyG majorTempo145 bpm
0:00/0:00
// Puff — Peter, Paul & Mary
// 145 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 6 "Strings (BB)" named as a string part, played on string ensemble 1 (its acoustic guitar steel patch is not one)
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 120 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(145/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.

// bass · acoustic bass · "Bass    (BB)"
const bass = note(`<
  ~@2 A B C D C E F G A H C A I J K L D H I D C M F G A H C A C M N L A B I D C M F O D B I A I P N Q A B I D C M F G A
  H C D I J K R D B C D I M S O A H C A C M K Q D B C D I M S O A H C A C M K Q A B I D C M T O A H C D C P N L S U V D
  L W
>`.pickRestart({
  A: "g2 d3", B: "b1@3 b1 f#2@3 f#2", C: "c2 g2", D: "g2@3 g2 d2@3 d2", E: "g2@3 g2 e2@3 e2", F: "a1 e2",
  G: "d2@6 d2@2 e2@3 ~ f#2@4", H: "b1 f#2", I: "c2@3 c2 g2@3 g2", J: "g2@4 e2@3 e2", K: "a1 d2", L: "g2 d2", M: "g2 e2",
  N: "a1@3 a1 d2@4", O: "d2 a2", P: "g2@3 g2 e2@4", Q: "g2@4 d2@3 d2", R: "g2@3 g2 d2@4", S: "a1@3 a1 e2@3 e2",
  T: "a1@3 a1 e2@2 c#2@2", U: "a1@6 a1@2 b1@3 ~ c#2@4", V: "d2@3 d2 d2@3 d2", W: "g2@2 g2 ~ d2@4 g2@8",
})).s("gm_acoustic_bass").gain(0.48)

// chords · epiano1 · "Piano   (BB)"
const epiano1 = note(`<
  ~@2 A B C A C D E F ~@3 A C D G H A I C A C D E F ~@3 A C D J ~ A B C A C D E F A B C A C D J H A B C A C D E F A B C
  A C D J H A B C A C D E F ~@3 A C D J H A B C A C D E F ~@3 A C D J H A B C A C D E F ~@3 A C D J ~ E@2 K A L@2
>`.pickRestart({
  A: "[g3,b3,d4]", B: "[f#3,b3,d4]", C: "[g3,c4,e4]", D: "[g3,b3,d4] [g3,b3,e4]", E: "[c#4,e4,g4,a4]", F: "[a3,d4,f#4]",
  G: "[c#4,e4,g4,a4] [f#3,a3,d4]", H: "[g3,b3,d4] [c4,d4,f#4,a4]", I: "[b3,d4,f#4]", J: "[c#4,e4,g4,a4] [a3,d4,f#4]",
  K: "[a3,d4,f#4] [a3,c4,d4,f#4]", L: "[[g3,b3,d4]@7 ~]/2",
})).s("gm_epiano1").gain(0.32)

// chords · acoustic guitar nylon · "Guitar  (BB)"
const acoustic_guitar_nylon = note(`<
  ~@2 A B C D E F G H I J C A C K L M I B E D E F N H O J P I C K L Q D B C A E R S H A T C D U F V W I X U I C R S Y D
  T U Z U AA V W D X U A C K G H AB AC C A E K V AD D X U A C K G H AB AC C A E K V AD A B C D E AA N Y AE J AF I E F L
  AG N@2 AH AI@3
>`.pickRestart({
  A: "~@12 b3@3 b4, [g2,b4] d2, ~@4 b3@7 g4@5", // G
  B: "~@7 f#3, b2@5 ~@3, f#4@3 ~ f#4@3 ~, ~ f#3@2 f#3@2 f#3@2 ~, ~ b3 ~ b3",
  C: "~@7 g3, c3@5 ~@3, g4@3 ~ g4@3 ~, ~ g3@2 g3@2 g3@2 ~, ~ c4 ~ c4",
  D: "~@7 b3, g2@5 ~@3, b4@3 ~ b4@3 ~, ~ b3@2 b3@2 b3@2 ~, ~ d4 ~ d4", E: "~@12 g3@3 g4, [c3,g4] g2, ~@4 g3@7 e4@5",
  F: "~@2 b3@2 ~@3 g3, [g2,b4] e2, ~@4 g4@3 ~, ~@5 g3@2 ~, ~@3 b3", // G
  G: "~@7 e3, a2@3 ~@3 a3@2, ~ c#4@2 a3@2 e3@2 ~, ~ e3 c#3@2",
  H: "~@7 a3, d3@5 ~@3, a4@3 ~ a4@3 ~, ~ a3@2 a3@2 a3@2 ~, ~ d4 ~ d4",
  I: "~@2 b4 ~@2 b4 b4@2, b3 ~, d5@3 b4@2 ~@3, ~ g4@3 g4@4", J: "~@3 d4, b2, ~@3 d4@3 ~@2, ~ f#3, ~@5 f#4@3",
  K: "~@3 b3 ~@3 g3, g2 e2, b4@3 ~ g4@3 ~, ~ b3@2 ~@2 g3@2 ~, ~ d4 ~ b3",
  L: "~@3 e3 ~@2 a3@2, a2 ~, c#4@3 ~@5, ~ e3@2 ~ [d3,a4]@4, ~ g3 ~@2", M: "~ b3 ~ a3, [g2,b4] [d3,f#4]",
  N: "~@12 e3@3 c#4, [a2,c#4] e2, ~@4 e3@7 a3@5", O: "~@7 b4, [g2,b4]@2 b3!2, ~@2 g4@3 g4@2 ~",
  P: "~@7 g4, [c3,g4]@2 g3!2, ~@2 e4@3 e4@2 ~", Q: "~@3 g4 ~@3 d4, g2 d3, ~@2 b4@2 ~ f#4@2 ~, ~@3 a3",
  R: "~@3 b3 ~@2 g3@2, g2 [e2,g4], b4@3 ~@5, ~ b3@2 ~@5, ~ d4 ~@2", // Em
  S: "~@7 e3, a2@5 ~@3, c#4@3 ~ e4@3 ~, ~ e3@2 e3@2 e3@2 ~, ~ g3 ~ g3",
  T: "~@7 f#3, b2@3 ~ d3@4, ~ d4@2 d4@2 ~ d4@2, ~@2 f#3@2 ~ f#3@2 ~",
  U: "~@7 g3, c3@3 ~@2 g3@2 ~, ~ e4@2 e4@2 ~ e4@2, ~ g3 e3@2",
  V: "~@3 e3 ~@3 a3, a2@2 ~ d4, c#4@3 ~ a4@3 ~, ~ e3@2 ~ d3@4, ~@2 g3@2 ~ a3@2 ~",
  W: "~@3 b3 ~@2 a3@2, g2 [d3,f#4], b4@3 ~@5, ~ b3@2 ~@5, ~ d4 ~@2", X: "~@12 f#3@3 f#4, [b2,f#4] f#2, ~@4 f#3@7 d4@5",
  Y: "~@12 a3@3 a4, [d3,a4] a2, ~@4 a3@7 f#4@5", Z: "~@7 b3, g2@3 ~@3 g4@2, ~ g4@2 g4@2 b3@2 ~, ~ b3 g3@2",
  AA: "~ b3 ~ g3, [g2,b4] [e2,g4]", AB: "~@3 g4, g2, ~@3 g4@3 ~@2, ~ b3, ~@5 b4@3",
  AC: "~@7 f#4, [b2,f#4]@2 f#3!2, ~@2 d4@3 d4@2 ~", // B5
  AD: "~@3 b3 ~@3 a3, g2 d3, b4@3 ~@3 c4@2, ~ b3@2 ~@2 a3@2 ~, ~@2 d4@2 f#4@3 ~",
  AE: "~@7 b3, g2@4 ~ b3@2 ~, ~ g4@2 g4@3 g4@2, ~ b3 g3@2", AF: "~@3 e4, c3, ~@3 e4@3 ~@2, ~ g3, ~@5 g4@3",
  AG: "~@2 g4@2 ~@3 d4, [g2,b4] d3, ~@3 a4", AH: "~@3 a3 ~@2 a3@2, d3 [d3,f#4], a4@3 ~@5, ~ a3@2 ~@5, ~ d4 ~@2",
  AI: "[~@2 b4 ~@2 b4 b4@2 ~@7 b3 ~@3 b3 [g2,b3,g4,b4]@4, b3 ~ [g2,b4]!2 [g2,b4] ~, d5@3 b4@2 ~@4 b3@2 b3@2 b3@2 ~@2 b3@2 ~@5, ~ g4@3 g4@6 g4@4 g4@4 g4@2 ~@4]/3", // G
})).s("gm_acoustic_guitar_nylon").gain(0.4)

// chords · string ensemble 1 · "Strings (BB)"
const string_ensemble_1 = note(`<
  ~@2 A B C A C D E F G H I G I J K L A B C A I D M F G B I G I J N O G B I G I J M F A B C A I J P Q G H C A C R E S G
  H C A I R N Q A H I G I J E F G B C A I D K L A H I G I J E F G B C A I D K L A B I A C D M S A H C A C D K O M E T G
  U V
>`.pickRestart({
  A: "[b3,g4,b4]@2 g4 [b3,g4] [g4,b4] [b3,g4,b4]!3, ~ b4 ~@2", // Em G Em
  B: "[f#3,d4,f#4]@2 [f#3,f#4] f#3 [f#3,d4,f#4]!2 [f#3,d4]!2, ~ d4 ~ f#4", // D F# D
  C: "[g3,e4,g4]@2 [g3,g4] g3 [g3,e4,g4]!2 [g3,e4]!2, ~ e4 ~ g4", // C G C
  D: "[b3,g4,b4]@2 g4 [b3,g4] [g3,e4,g4]@2 [g3,g4] g3, ~ b4 ~ e4", // Em C G
  E: "[g3,c#4,e4]@2 [g3,e4] g3 [g3,c#4,e4]!2 [g3,c#4]!2, ~ c#4 ~ e4", // C#dim C C#dim Gdim
  F: "[a3,f#4,a4]@2 f#4 [a3,f#4] [f#4,a4] [a3,f#4,a4]!3, ~ a4 ~@2", // D F#m D
  G: "[b3,g4,b4]@2 [b3,b4] b3 [b3,g4,b4]!2 [b3,g4]!2, ~ g4 ~ b4", // Em B Em
  H: "[f#3,d4,f#4]@2 d4 [f#3,d4] [d4,f#4] [f#3,d4,f#4]!3, ~ f#4 ~@2", // D
  I: "[g3,e4,g4]@2 e4 [g3,e4] [e4,g4] [g3,e4,g4]!3, ~ g4 ~@2", // C Em C
  J: "[b3,g4,b4]@2 [b3,b4] b3 [g3,e4,g4]@2 [g3,g4] g3, ~ g4 ~ e4", // Em B C G
  K: "[g3,c#4,e4]@2 [g3,e4] g3 [a3,f#4,a4]@2 f#4 [a3,f#4], ~ c#4 ~ a4", // C#dim C D
  L: "[b3,g4,b4]@2 [b3,b4] b3 [a3,d4,f#4]@2 d4 [a3,d4], ~ g4 ~ f#4", // Em B D D5
  M: "[e3,a3,c#4]@2 a3 [e3,a3] [a3,c#4] [e3,a3,c#4]!3, ~ c#4 ~@2", // A A5 A
  N: "[e3,a3,c#4]@2 a3 [e3,a3] [a3,f#4,a4]@2 f#4 [a3,f#4], ~ c#4 ~ a4", // A A5 D
  O: "[b3,g4,b4]@2 g4 [b3,g4] [c4,f#4,a4]@2 [c4,a4] c4, ~ b4 ~ f#4", // Em F#dim F
  P: "[e3,a3,c#4]@2 a3 [e3,a3] [a3,f#4,a4]@2 [a3,a4] a3, ~ c#4 ~ f#4", // A A5 D A
  Q: "[b3,g4,b4]@2 g4 [b3,g4] [a3,d4,f#4]@2 d4 [a3,d4], ~ b4 ~ f#4", // Em D D5
  R: "[b3,g4,b4]@2 g4 [b3,g4] [g3,e4,g4]@2 e4 [g3,e4], ~ b4 ~ g4", // Em C
  S: "[a3,f#4,a4]@2 [a3,a4] a3 [a3,f#4,a4]!2 [a3,f#4]!2, ~ f#4 ~ a4", // D A D
  T: "[a3,f#4,a4]@2 f#4 [a3,f#4] [c4,f#4,a4]@2 [c4,a4] c4, ~ a4 ~ f#4", U: "[g2,b3,g4,b4]!3 [b3,g4,b4] [g2,b3,g4,b4]!4",
  V: "[g2,b3,g4,b4]@7 ~", // G
})).s("gm_string_ensemble_1").gain(0.16)

// chords · string ensemble 1 · "Strings (BB)" · soft notes
const string_ensemble_1_soft = note(`<
  ~@2 A B C A C D E F G H I G I J K L A B C A I D M F G B I G I J N O G B I G I J M F A B C A I J P Q G H C A C R E S G
  H C A I R N Q A H I G I J E F G B C A I D K L A H I G I J E F G B C A I D K L A B I A C D M S A H C A C D K O M E T G
  U ~
>`.pickRestart({
  A: "~@2 b3 ~ b3 ~@3", B: "~@3 f#4 ~@4", C: "~@3 g4 ~@4", D: "~@2 b3 ~@4 g4", E: "~@3 e4 ~@4", F: "~@2 a3 ~ a3 ~@3",
  G: "~@3 b4 ~@4", H: "~@2 f#3 ~ f#3 ~@3", I: "~@2 g3 ~ g3 ~@3", J: "~@3 b4 ~@3 g4", K: "~@3 e4 ~@2 a3 ~",
  L: "~@3 b4 ~@2 a3 ~", M: "~@2 e3 ~ e3 ~@3", N: "~@2 e3 ~@3 a3 ~", O: "~@2 b3 ~@4 a4", P: "~@2 e3 ~@4 a4",
  Q: "~@2 b3 ~@3 a3 ~", R: "~@2 b3 ~@3 g3 ~", S: "~@3 a4 ~@4", T: "~@2 a3 ~@4 a4", U: "~@3 g2 ~@4",
})).s("gm_string_ensemble_1").gain(0.04)

// drums · rim
const rim = s("rim").struct("<[x!2] [x!4] ~@118>").gain(0.28)

// drums · congas
const congas = s("conga:13").struct(`<
  ~@2 A@2 B A@4 B A@5 B A B A@2 B A@4 B A@5 B@2 A@3 B A@4 B A@2 B A@2 B A B A@2 B A@4 B A@2 B A@2 B@3 A@2 B A@4 B A@5 B
  A B A@2 B A@4 B A@5 B A B A@2 B A@4 B A@5 B@2 A B@2 A@3 C
>`.pickRestart({
  A: "~ x", B: "~@2 x!2", C: "~ x!2 ~",
})).gain(0.39)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~@2 A@2 B A@4 B A@5 B A B A@2 B A@4 B A@5 B@2 A@3 B A@4 B A@2 B A@2 B A B A@2 B A@4 B A@2 B A@2 B@3 A@2 B A@4 B A@5 B
  A B A@2 B A@4 B A@5 B A B A@2 B A@4 B A@5 B@2 A B@2 A@3 C
>`.pickRestart({
  A: "x!4 ~ x!3", B: "x!4 ~ x ~ x", C: "x!2 ~ x!2 ~@3",
})).gain(0.39)

stack(bass, epiano1, acoustic_guitar_nylon, string_ensemble_1, string_ensemble_1_soft, rim, congas, congas_2)

More by Peter, Paul & Mary