Strudelify
If cover art

1971

If

Bread

KeyA majorTempo93 bpm
0:00/0:00
// If — Bread
// 93 bpm, 4/4, key A major. Source: mcgill + midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 64 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(93/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"
const bass = note("<~ A@8 B@8 C@8 D@7 E@2 F G H I J K L M F G H N J K L M O J P Q R S T U V W@2 X@3>".pickRestart({
  A: "[~@12 a2@16 g#2@16 g2@16 f#2@15 ~ f2@16 e2@15 ~ d2@16 e1@4]/8",
  B: "[~@14 a2@16 g#2@16 g2@16 f#2@15 ~ f2@16 e2@15 ~ d2@16 e1@2]/8",
  C: "[~@14 a2@16 g#2@16 g2@16 d2@15 ~ f2@16 e2@15 ~ d2@16 e1@2]/8",
  D: "[~@14 f#2@16 f2@16 e2@16 d2@14 ~@2 c#2@13 ~ c#2@2 f#1@16 b1@2]/7", E: "[~@10 b1@4 e1@15 ~@3]/2", F: "a2",
  G: "g#2", H: "g2", I: "f#2@15 ~", J: "f2", K: "e2@15 ~", L: "d2", M: "e1@13 ~@3", N: "d2@15 ~", O: "f#2", P: "e2",
  Q: "d2@7 ~", R: "c#2@13 ~ c#2@2", S: "f#1", T: "b1@11 ~ b1@4", U: "e1@15 ~", V: "~ a1@5 a2 a1",
  W: "[a2@2 ~ a1@12 a2@2 a1@2 d2@10 ~ d2@2]/2", X: "[~ e2@2 d2@2 a1@32 ~@11]/3",
})).s("gm_acoustic_bass").gain(0.64)

// chords · piano
const piano = note("<~ A@8 B ~@7 C@8 D@3 E@6 ~@8 F G H I J K L M N O P Q R S T U V@6>".pickRestart({
  A: "[~@16 e6@12 ~@4 e6@12 ~@2 b5@14 [f#5,a5,e6]@14 ~@14 d6@3 ~@7 e5@7 ~@9 a4@8 ~@2 [e4,g#4]@3 d5, ~@12 [a4,a5]@16 ~@2 b5@14 ~@32 e6@6 e6@9 ~@3 c#6@11 ~@23, ~@14 [e5,b5]@14 g#5@16 g5@16 ~@16 f5@15 ~ [a4,c#5,d6]@13 ~@3 [d4,a5]@14 ~@6, ~@78 a5@8 a5@5 ~ e5@6 ~@12 f5@12 ~@6, ~@96 a5@9 ~@7 d5@10 ~@6]/8", // F#m7 E A E5 Dmaj7 D5
  B: "~@3 b4@2 b5@7 ~@4, ~ e5@5 ~@10",
  C: "[~@18 e6@12 ~@4 e6@12 ~@2 b5@14 [f#5,a5,e6]@14 ~@14 d6@3 ~@7 e5@7 ~@9 a4@8 ~@2 [e4,g#4]@2, ~@14 [a4,a5]@16 ~@2 b5@14 ~@32 e6@6 e6@9 ~@3 c#6@11 ~@21, ~@16 [e5,b5]@14 g#5@16 g5@16 ~@16 f5@15 ~ [a4,c#5,d6]@13 ~@3 [d4,a5]@14 ~@4, ~@80 a5@8 a5@5 ~ e5@6 ~@12 f5@12 ~@4, ~@98 a5@9 ~@7 d5@10 ~@4]/8", // F#m7 E A E5 Dmaj7 D5
  D: "[~@4 b4@2 b5@6 ~@14 [f#4,a4,c#5]@4 [f4,a4]@6 [f4,a4,c#5]@6 [f4,a4,c#5]@3 ~ e5@2, d5@7 ~@7 f#3@16 f3@15 ~@3, ~@2 e5@5 ~@7 [f#4,a4,c#5]@12 ~@22, ~@4 c#4 ~@3]/3", // F#m F Faug F#m
  E: "[~@8 e5@4 ~@12 d4@5 ~ [g4,e5]@3 ~@9 b4@2 g4 ~@9 a#4@8 ~@4 d5@2 f#5@7 ~@8 e4@2 f#4@2 e4@6 ~@3, c#5@12 ~@2 d5@8 a5@7 ~@11 e5@5 ~ c#5@6 c#5@10 ~@2 f#4@11 ~@21, ~@2 a4@10 ~@2 d4@6 f#5@9 ~@9 g5@7 ~@5 c#4@12 b3@13 ~@6 b3@13 ~@2, ~@4 a5@8 ~@4 a4@13 ~ b4@6 b4@6 ~@4 a#4@8 ~@8 a4@4 ~@30, ~@18 e5@11 ~@5 g4@10 ~@2 [f#3,e4]@16 ~@16 e3@15 ~@3]/6", // C F#7
  F: "~ e6@3, [a4,a5], ~ [e5,b5]@7", G: "~ e6@3, g#5, ~ b5@7", H: "~ b5@7, g5", I: "[f#5,a5,e6]@7 ~",
  J: "~@12 d6@3 ~, f5@15 ~, e6@6 e6@9 ~, ~@2 a5@8 a5@5 ~",
  K: "~@6 e5@7 ~@3, [a4,c#5,d6]@13 ~@3, e5@3 ~@5, ~@2 c#6@11 ~@3, ~@4 a5@9 ~@3", // Dmaj7
  L: "~@3 a4@4 ~, [d4,a5]@7 ~, ~ f5@6 ~, ~@2 d5@5 ~", M: "~@3 b4 b5@3 ~, [e4,g#4]@9 ~@7, ~@2 d5@7 ~@7, ~@4 e5@5 ~@7",
  N: "~@3 [f#4,a4,c#5], f#3, [f#4,a4,c#5]@3 ~, ~@5 c#4@3", O: "[f4,a4]@6 [f4,a4,c#5]@6 [f4,a4,c#5]@3 ~, f3@15 ~",
  P: "e5 ~@4 e5@2 ~, ~ c#5@6 ~, ~@2 a4@5 ~, ~@3 a5@4 ~",
  Q: "~@10 d4@5 ~, d5@8 a5@7 ~, d4@6 f#5@9 ~, ~@2 a4@13 ~, ~@4 e5@11 ~",
  R: "[g4,e5]@3 ~@9 b4@2 g4 ~, b4@3 b4@3 ~@2, ~@2 g4@5 ~, ~@8 g5@7 ~, ~@10 e5@5 ~", // C
  S: "~ a#4, [f#3,e4], a#4 ~, c#5@3 c#5@5, ~ c#4@3", T: "~@4 d5@2 f#5@7 ~@3, b3@13 ~@3, a4 ~@3, ~@2 f#4@11 ~@3",
  U: "~@5 e4@2 f#4@2 e4@6 ~, e3@15 ~, ~@2 b3@13 ~",
  V: "[~@8 a4@2 ~@2 e5@2 ~@2 a4@2 ~@5 a4@2 ~@8 [a4,a5]@2 f4@3 ~@13 f4@2 [a3,e4,a4,c#5,e5]@32 ~@11, ~@2 [a2,a5]@17 ~@2 f#4@14 [d5,a5]@5 a4@6 [d5,a5]@7 ~@43, ~@2 c#5@6 b4@4 c#5@6 ~ a5@6 e5@4 d5@6 f5@7 e5@11 ~@43, ~@2 [a4,e5]@4 a3@13 [d4,f#5]@17 ~@2 f4@11 [a4,f5]@5 ~@42, ~@4 b4@2 e5@4 a4@4 [b4,e5]@4 ~ d5@6 a4@6 [b4,e5]@4 d4@18 ~@43]/6", // A D5 A5 D Dm E5
})).s("gm_piano").gain(0.5).pan(0.4)

// chords · electric guitar clean · "Electric Guitar"
const electric_guitar_clean = note("<~ A@8 B ~@7 C@8 D ~@16 E F G H I J K L ~@8 M N@5>".pickRestart({
  A: "[~@16 e5@12 ~@4 e5@12 ~@2 b4@14 [f#4,a4,e5]@14 ~@14 d5@3 ~@7 e4@7 ~@9 a3@8 ~@2 [e3,g#3]@3 d4, ~@12 [a3,a4]@16 ~@2 b4@14 ~@32 e5@6 e5@9 ~@3 c#5@11 ~@23, ~@14 [e4,b4]@14 g#4@16 g4@16 ~@16 f4@15 ~ [a3,c#4,d5]@13 ~@3 [d3,a4]@14 ~@6, ~@78 a4@8 a4@5 ~ e4@6 ~@12 f4@12 ~@6, ~@96 a4@9 ~@7 d4@10 ~@6]/8", // F#m7 E A E5 Dmaj7 D5
  B: "~@3 b3@2 b4@7 ~@4, ~ e4@5 ~@10",
  C: "[~@18 e5@12 ~@4 e5@12 ~@2 b4@14 [f#4,a4,e5]@14 ~@14 d5@3 ~@7 e4@7 ~@9 a3@8 ~@2 [e3,g#3]@2, ~@14 [a3,a4]@16 ~@2 b4@14 ~@32 e5@6 e5@9 ~@3 c#5@11 ~@21, ~@16 [e4,b4]@14 g#4@16 g4@16 ~@16 f4@15 ~ [a3,c#4,d5]@13 ~@3 [d3,a4]@14 ~@4, ~@80 a4@8 a4@5 ~ e4@6 ~@12 f4@12 ~@4, ~@98 a4@9 ~@7 d4@10 ~@4]/8", // F#m7 E A E5 Dmaj7 D5
  D: "~@2 b3 b4@3 ~@2, d4@7 ~@9, ~@2 e4@5 ~@9", E: "~ e5@3, [a3,a4], ~ [e4,b4]@7", F: "~ e5@3, g#4, ~ b4@7",
  G: "~ b4@7, g4", H: "[f#4,a4,e5]@7 ~", I: "~@12 d5@3 ~, f4@15 ~, e5@6 e5@9 ~, ~@2 a4@8 a4@5 ~",
  J: "~@6 e4@7 ~@3, [a3,c#4,d5]@13 ~@3, e4@3 ~@5, ~@2 c#5@11 ~@3, ~@4 a4@9 ~@3", // Dmaj7
  K: "~@3 a3@4 ~, [d3,a4]@7 ~, ~ f4@6 ~, ~@2 d4@5 ~", L: "~@3 b3 b4@3 ~, [e3,g#3]@9 ~@7, ~@2 d4@7 ~@7, ~@4 e4@5 ~@7",
  M: "~@2 b4 e5 b4 ~ e5 b4, ~ a4@2 ~@2 a4@2 ~",
  N: "[a4@2 ~@7 e5@4 d5@2 b4@2 a4@2 ~@7 e5@4 d5@3 ~@2 f4@2 [a4,c#5]@30 ~@13, ~@3 d4@16 d4@15 ~@46, ~@5 f#4@15 ~@2 f4@11 ~@47, ~@7 a4@8 ~@9 a4@7 ~@2 a4@4 ~@43]/5", // A
})).s("gm_electric_guitar_clean").gain(0.5).pan(0.6)

// chords · acoustic guitar steel · "Acoustic Guitar"
const acoustic_guitar_steel = note(`<
  ~ A@8 B@8 C@8 D@3 E@6 F G H I J K L M F G H I J K L M N O P Q R S T U V@5 ~
>`.pickRestart({
  A: "[~@26 [a2,a3]@2 ~@12 [e3,b3]@2 g#3 ~@13 [e3,b3]@2 g3 ~@13 b3@2 a3 ~@13 d4@2 a3 ~ a3@2 ~@10 c#4@2 e4 ~@15 a3 ~ e2@3 [b2,e3], ~@12 a2@12 b3@4 ~@2 b3@4 e3@4 e4@5 ~@5 e4@4 b3@2 e4@5 ~@3 b3@6 b3@4 ~@4 a3@2 d4@2 a3@2 d4@4 e4@5 ~ e4@4 a3@4 c#4@4 ~@4 f3@4 a3@2 d4@4 e4@6 ~@4, ~@12 a3@6 a3@8 ~@2 [e3,g#3]@6 g#3@8 ~@2 [e3,g3]@6 g3@8 ~@2 f#3@15 ~ f3@6 f3@9 ~@3 e3@8 [e3,a3]@5 ~ d3@16 ~@4, ~@14 [e3,b3]@6 e3@8 g#2@15 ~ b2@15 ~@5 e4@6 e4@5 ~ e4@8 a3@6 ~@4 c#4@4 e4@8 ~@2 e4@8 a3@4 d4@4 ~@4, ~@16 e4@4 b3@2 e4@6 ~@4 e4@4 b3@4 ~@6 b3@4 e3@6 ~@4 [d3,a3]@6 [d3,a3]@9 ~ d3@15 ~ a2@15 ~ a3@2 d4@4 [f3,f4]@10 ~@4]/8", // A E5 E Em A5 E5 D5 F
  B: "[~@3 b3@2 [e2,g#3,b3,e4]@7 ~@16 [a2,a3]@2 ~@12 [e3,b3]@2 g#3 ~@13 [e3,b3]@2 g3 ~@13 b3@2 a3 ~@13 d4@2 a3 ~ a3@2 ~@10 c#4@2 e4 ~@13 d4@2 a3 ~ e2@2, ~ a3@4 ~@9 a2@12 b3@4 ~@2 b3@4 e3@4 e4@5 ~@5 e4@4 b3@2 e4@5 ~@3 b3@6 b3@4 ~@4 a3@2 d4@2 a3@2 d4@4 e4@5 ~ e4@4 a3@4 c#4@4 ~@4 f3@4 a3@2 d4@4 e4@5 ~@3, ~@14 a3@6 a3@8 ~@2 [e3,g#3]@6 g#3@8 ~@2 [e3,g3]@6 g3@8 ~@2 f#3@15 ~ f3@6 f3@9 ~@3 e3@8 [e3,a3]@5 ~ d3@15 ~@3, ~@16 [e3,b3]@6 e3@8 g#2@15 ~ b2@15 ~@5 e4@6 e4@5 ~ e4@8 a3@6 ~@4 c#4@4 e4@8 ~@2 e4@8 a3@6 ~@4, ~@18 e4@4 b3@2 e4@6 ~@4 e4@4 b3@4 ~@6 b3@4 e3@6 ~@4 [d3,a3]@6 [d3,a3]@9 ~ d3@15 ~ a2@15 ~ a3@2 d4@4 [f3,f4]@9 ~@3]/8", // E A E5 E Em A5 E5 D5 …
  C: "[~@4 b3@2 [e2,g#3,b3,e4]@7 ~@15 [a2,a3]@2 ~@12 [e3,b3]@2 g#3 ~@13 [e3,b3]@2 g3 ~@13 b3@2 a3 ~@13 d4@2 a3 ~ a3@2 ~@10 c#4@2 e4 ~@13 d4@2 a3 ~ e2@2, [b2,e3]@6 ~@8 a2@12 b3@4 ~@2 b3@4 e3@4 e4@5 ~@5 e4@4 b3@2 e4@5 ~@3 b3@6 b3@4 ~@4 a3@2 d4@2 a3@2 d4@4 e4@5 ~ e4@4 a3@4 c#4@4 ~@4 f3@4 a3@2 d4@4 e4@5 ~@3, ~@2 a3@4 ~@8 a3@6 a3@8 ~@2 [e3,g#3]@6 g#3@8 ~@2 [e3,g3]@6 g3@8 ~@2 f#3@15 ~ f3@6 f3@9 ~@3 e3@8 [e3,a3]@5 ~ d3@15 ~@3, ~@16 [e3,b3]@6 e3@8 g#2@15 ~ b2@15 ~@5 e4@6 e4@5 ~ e4@8 a3@6 ~@4 c#4@4 e4@8 ~@2 e4@8 a3@6 ~@4, ~@18 e4@4 b3@2 e4@6 ~@4 e4@4 b3@4 ~@6 b3@4 e3@6 ~@4 [d3,a3]@6 [d3,a3]@9 ~ d3@15 ~ a2@15 ~ a3@2 d4@4 [f3,f4]@9 ~@3]/8", // E A E5 E Em A5 E5 D5 …
  D: "[~@4 b3@2 [e2,g#3,b3,e4]@7 ~@15 c#4@2 ~@12 a3@2 ~@2 [e3,a3,e4]@2, [b2,e3]@3 ~@4 f#3@3 f#3 a4@4 ~ c#4@4 c#4@2 ~@2, ~ a3@2 ~@4 a3@5 f#3@3 f3@4 f3@3 ~@2, ~@8 c#4@5 a3@2 a3@2 a3@4 ~@3, ~@9 f#4@6 f4@3 f4@4 ~@2]/3", // E A5 E5
  E: "[~@12 e3@2 ~@14 f#3@2 ~@12 e3@2 g3 ~ a#3@4 ~@8 c#4@2 a#3 ~@13 f#4@4 ~@7 g#3@2 d4@6 ~@3, b3@8 b3@6 ~@6 f#4@6 a3@4 b3@4 g3@10 ~@2 e3@6 e3@9 ~ b2@4 b3@6 f#3@6 ~@3 b2@13 ~@2, ~@2 a3@8 a3@4 ~@2 a3@8 c#4@5 ~ g3@2 e3@8 b3@5 ~ c#4@8 c#4@4 ~@4 d4@2 f#3@4 d4@10 ~@18, ~@4 e4@10 ~@4 d4@4 d4@7 ~ e4@6 b3@2 e4@7 ~ f#4@10 f#4@5 ~ f#4@8 b2@8 e2@15 ~@3, ~@6 e3@6 ~@2 [d3,c#4]@9 d3@6 ~ c#3@15 ~@5 a#3@10 ~@2 a3@16 ~@5 e3@11 ~@2]/6", // Dmaj7
  F: "~@7 [a2,a3], a2@3 b3, a3@3 a3@4 ~, ~ [e3,b3]@3 e3@4, ~@2 e4@2 b3 e4@3", // A E5
  G: "~@12 [e3,b3]@2 g#3 ~, g#2@15 ~, [e3,g#3]@3 g#3@4 ~, ~@2 b3@4 e3@4 e4@5 ~, ~ e4 b3 ~", // E5 E
  H: "~@12 [e3,b3]@2 g3 ~, b2@15 ~, [e3,g3]@3 g3@4 ~, ~@2 b3@4 e3@4 e4@5 ~, ~ e4 b3 ~", // E5 Em
  I: "~@12 b3@2 a3 ~, f#3@15 ~, [d3,a3]@6 [d3,a3]@9 ~, ~ b3@3 b3@2 ~@2, ~@4 e4@6 e4@5 ~", // D5
  J: "~@12 d4@2 a3 ~, d3@15 ~, e4@4 a3@3 ~, f3@4 a3@2 d4@4 e4@5 ~, a3@2 d4@4 f3@9 ~",
  K: "a3@2 ~@10 c#4@2 e4 ~, a2@15 ~, e4 a3 c#4 ~, ~@2 e3@8 [e3,a3]@5 ~, ~ c#4@2 e4@4 ~", // A5
  L: "~@12 d4@2 a3 ~, d3@15 ~, e4@4 a3@3 ~, f3@4 a3@2 d4@4 e4@5 ~, a3@2 d4@4 [f3,f4]@9 ~", // F
  M: "~@6 b3@2 [e2,g#3,b3,e4]@7 ~, e2 ~, ~ [b2,e3]@3 ~@4, ~ a3 ~@2", // E E5
  N: "~@7 c#4, a3@5 f#3@3, f#3@3 f#3 a4@4, ~ c#4@5 a3@2, ~ f#4@3",
  O: "~@6 a3 ~, f3@4 f3@3 ~, f4@3 f4@4 ~, a3 a3@2 ~, ~ c#4@4 c#4@2 ~",
  P: "~@7 e3, e3@4 e3@3 ~, e4@3 e4@5, a3 a3@2 a3, ~ b3@4 b3@3",
  Q: "~@7 f#3, [d3,c#4]@9 d3@3 a3@4, ~@2 a3@8 c#4@5 ~, ~@4 d4@4 d4@7 ~, ~@6 f#4@9 ~", // Dmaj7
  R: "~@12 e3@2 g3 ~, c#3@15 ~, e4@6 b3@2 e4@7 ~, b3@2 g3@5 ~, g3@2 e3@8 b3@5 ~",
  S: "a#3@4 ~@8 c#4@2 a#3 ~, f#4@10 f#4@5 ~, c#4@2 c#4 ~, e3@6 e3@9 ~, ~@2 a#3@5 ~",
  T: "~@3 f#4, a3@5 f#3@3, f#4 b2, b2 b3@3, d4 f#3@2 d4@5", U: "~@7 g#3@2 d4@6 ~, e2@15 ~, ~@2 b2@13 ~, ~@5 e3@11",
  V: "[~@2 a3@2 ~@12 a3@2 ~@15 a3@2 ~@14 d4@3 ~ [a2,e3,a3,c#4]@21 ~@6, ~@2 a2@8 a2@8 ~@11 e4@7 ~@2 f4@14 ~@28, ~@4 e3@8 e4@6 ~@5 b3@8 b3@5 ~@4 d4@6 c#4@6 ~@28, ~@6 a3@8 e3@4 ~ d3@6 d3@11 ~@8 b3@8 ~@28, ~@8 b3@10 ~@3 a3@12 ~@2 f3@7 f3@10 ~@28]/5", // A
})).s("gm_acoustic_guitar_steel").gain(0.43)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note("<~@34 A B C D E A F G H@3 I J K L M N O P Q R S T U V@6>".pickRestart({
  A: "[e4,a4,c#5]", B: "[e4,g#4,b4]", C: "[e4,g4,b4]", D: "[d4,f#4,a4]@15 ~", E: "[d4,f4,a4]", F: "[a4,d5]",
  G: "[b4,e5]@7 ~", H: "[~@8 b5@7 ~@9, [e5,e6]]/3", I: "[d5,d6]@2 [c#5,c#6] [b4,b5]", J: "[a4,a5]@15 ~",
  K: "~@2 e5 a5, ~@4 a4@9 ~@3", L: "[d4,f4,a4,f5]", M: "[e4,b4]@7 ~", N: "[f#2,f#3,a3,c#4,f#4]", O: "[f2,f3,a3,c#4,f4]",
  P: "[a3,c#4,e4]@15 ~", Q: "[d2,a2,d3,a3,f#4]@15 ~", R: "d4@8 e4@7 ~, [e3,g3,b3]@7 ~", S: "[f#2,c#3,f#3,a#3,e4]",
  T: "[b2,d3,f#3,b3,d4]@15 ~", U: "[e3,a3,d4,f#4]@13 g#4@3",
  V: "[~@2 [c#4,e4,a4]@17 [d4,f#4,a4]@16 [d4,f4,a4]@17 ~ [a2,e3,c#4,a4,c#5]@31 ~@12]/6", // A D Dm A
})).s("gm_string_ensemble_1").gain(0.19)

// drums · hihat
const hihat = s("hh").struct("<A B C@7 D E@23 F G@23 H I J K L ~@2>".pickRestart({
  A: "~@3 x", B: "x!3 ~", C: "x!2", D: "~ x ~@7 x ~@6", E: "~ x ~@3 x ~@2", F: "~@3 x ~@7 x ~@4", G: "~ x ~ x",
  H: "~@5 x ~@7 x ~@2", I: "~@3 x ~@3 x", J: "~@7 x ~@7 x", K: "~ x", L: "~ x ~@14",
})).gain(0.71)

stack(bass, piano, electric_guitar_clean, acoustic_guitar_steel, string_ensemble_1, hihat)

More by Bread