Strudelify

Together Again

Glen Campbell

KeyD majorTempo80 bpm
0:00/0:00
// Together Again — Glen Campbell
// 80 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 71 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(80/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 · electric bass finger · "Bass"
const bass = note(`<
  ~ A B C D E F B A B@2 D C F@2 B@2 A@2 D@2 E@2 A B@2 A C@2 E F A B@3 D@2 E@2 A@4 D@2 F@2 A B A@2 D@2 E@2 A B A B C@2 E
  F A B E@2 B G H ~
>`.pickRestart({
  A: "d2@8 ~@2 d2@2 a2@5 ~ d2@3 ~ a2@2", B: "d2@5 ~@5 f#2@2 a2@5 ~ f#2@5 ~", C: "g2@8 ~@2 g2@2 d3@5 ~ g2@3 ~ d3@2",
  D: "g2@5 ~@5 b2@2 d3@5 ~ b2@5 ~", E: "a1@8 ~@2 a1@2 e2@5 ~ a1@3 ~ e2@2", F: "a1@5 ~@5 c#2@2 e2@5 ~ c#2@5 ~",
  G: "d2@4 ~ a1 d2@4 ~ a1", H: "d2",
})).s("gm_electric_bass_finger").gain(0.32).pan(0.3)

// chords · piano
const piano = note(`<
  ~ A@2 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@2 C@2 A D E ~
>`.pickRestart({
  A: "[d4,f#4,a4]!12", B: "[g3,b3,d4]!12", C: "[a3,c#4,e4]!12",
  D: "d3@3 ~ [d4,f#4,a4]@2 a2@3 ~ [a3,d4,f#4]@2 d3@3 ~ [d4,f#4,a4]@2 a2@3 ~ [a3,d4,f#4]@2", E: "[d3,a3,f#4,d5]",
})).s("gm_piano").gain(0.16).pan(0.7)

// chords · acoustic guitar nylon · "Guitar"
const acoustic_guitar_nylon = note(`<
  ~ A@2 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@2 C@2 A D E ~
>`.pickRestart({
  A: "d3@5 ~ [a3,d4,f#4]@2 ~@4 a2@5 ~ [a3,d4,f#4]@2 ~@4", B: "g2@5 ~ [d3,g3,b3]@2 ~@4 d2@5 ~ [d3,g3,b3]@2 ~@4",
  C: "a2@5 ~ [e3,a3,c#4]@2 ~@4 e2@5 ~ [e3,a3,c#4]@2 ~@4", D: "d3@5 ~ [f#3,a3,d4]@2 ~@4 a2@5 ~ [a3,d4,f#4]@2 ~@4",
  E: "[d3,f#3,a3,d4]", // D
})).s("gm_acoustic_guitar_nylon").gain(0.24).pan(0.3)

// chords · electric guitar muted · "guitar"
const electric_guitar_muted = note(`<
  ~ A@2 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@4 B@2 C@2 A@2 C D A@2 E ~
>`.pickRestart({
  A: "[a3,f#4,a4]@5 ~ [d3,f#3,a3]@5 ~", B: "[d3,b3,d4]@5 ~ [g2,b2,d3]@5 ~", C: "[e3,c#4,e4]@5 ~ [a2,c#3,e3]@5 ~",
  D: "[c#3,e3,a3]@5 ~ [a2,c#3,e3]@5 ~", E: "[f#3,a3,d4]@5 ~ [d3,f#3,a3]@5 ~",
})).s("gm_electric_guitar_muted").gain(0.16).pan(0.8)

// chords · acoustic guitar steel · "Steel"
const acoustic_guitar_steel = note(`<
  A B C D@2 E F G H@2 I J K E L M@2 N O P Q R S T U V W X@2 Y Z AA AB AC@2 AD@2 AE@2 AF AG@3 AH AI E AJ AK@2 AL AM AN AO
  AP AQ AR AS AT AU AV@2 AW AX AY AZ BA BB@5
>`.pickRestart({
  A: "~@10 d4@2 ~ g4@3 f#4@4 a3@4", B: "[d4,f#4]@12 ~ [d4,f#4]@11", C: "d4@6 d4@3 d4@2 ~ e4@3 ~ d4@4 c4@3 ~",
  D: "[b3@30 d4@3 d4@2 ~ d4@3 ~ e4@4 [d4,e4] d4@2 ~]/2", E: "c#4", F: "~@3 a3@3 b3@2 a3@2 g3@2", G: "f#3@23 ~",
  H: "[~@6 a3@5 g4@3 ~ f#4@3 ~@6 f#4@24, ~@19 a3@24 ~@5]/2", I: "~@6 d4@5 ~ e4@4 d4@4 c4@3 ~", J: "b3",
  K: "~@6 d4@3 d4@2 ~ d4@4 e4@4 d4 [d4,e4]@2 ~", L: "~@8 a3@2 c#4@2 f#4@4 f#4@4 e4 f#4 e4@2",
  M: "[d4@11 ~@12 d4@17 ~@5 [a#3,c#4,f4]@2 ~, ~@13 e3@10 ~@25, ~@17 a3@17 ~@14, ~@7 f#3@5 ~@4]/2", // A#m
  N: "[b3,d4]@12 d4@3 ~@5 b3@3 ~, ~@12 f#4@11 ~, ~@12 b3@7 ~@5, ~@17 d4@6 ~", // Bm
  O: "[a3,e4]@3 ~@2 e4, c4@15 ~ c4@6 ~@2, a#3 ~@11 a3@10 ~@2", P: "~ b3@11 b3@2 c4@10, g4@11 ~ [d4,g4]@12",
  Q: "g4@10 ~@2 d4@9 ~ d4@2, b3@9 ~ b3@10 ~ b3@3", R: "~ c#4@15 ~@2 [g3,b3]@5 ~",
  S: "~@9 [g3,c#4,a4]@2 ~, [g3,b3]@6 b3@5 ~, c#4@9 c#4@8 ~@7, ~ a4@2 ~", // A7 G
  T: "[a3,d4,f#4]@11 ~ d4 [d#4,e4] ~@2 a4@3 ~ b4@4, ~@13 f#4@3 ~@8", U: "a4@6 a4@6 g5@4 f#5@5 a4@3",
  V: "~ f#5@17 ~ f5@5, d5@17 ~ c#5@5 ~", W: "[c5,e5]@6 ~ e5@2 ~ e5@3 [c5,e5]@8 ~ e5@2, ~@2 c5@2 ~@3 c5",
  X: "[~ d5@11 ~@12 g4@12 g4@3 ~ g4@3 ~ [g4,d5]@4, g4@19 ~@29, b4@12 b4@11 ~@25, ~@16 d5@19 ~ d5@6 ~@6]/2", // G5
  Y: "[e4,c#5]@12 ~ c#5@5 ~ c5@5, ~@12 e4@6 d#4@5 ~", Z: "[d4,b4] ~@3", AA: "~@5 e4@3 a4@2 b4@2",
  AB: "d5@2 c#5 [a#4,b4,c5] [g#4,a4] g4 ~@3 a3@2 ~ g4@3 ~ [f#4,g4] f#4 ~@2 a3@4", // Amaj7 Gmaj7
  AC: "[f#4@27 ~@5 d4 ~ e4@2 f4@4 e4@4 d4@4, ~@36 e4 ~@11]/2", AD: "[g3@27 ~@3 d4@3 d4@3 d4@4 e4@4 d4@4]/2",
  AE: "[~ c#4@27 ~@2 b3@6 b3@4 a3@4 ~ g3@3]/2", AF: "f#3@5 f#4@3",
  AG: "[~@6 a3@3 ~ a3@2 g4@3 ~ f#4@4 ~@4 f#4@27 ~@3 d4@3 ~ d4@2 e4@3 ~ d4@4 c4@3 ~, ~@21 a3@13 ~@38]/3", AH: "b3@23 ~",
  AI: "~@3 c#4@3 d4@2 e4@2 d4@2", AJ: "~@6 a3@3 ~ a3@2 a4@4 f#4@4 ~ e4@3",
  AK: "[d4@11 ~ e3 f#3@5 ~@6 [f#3,d4]@10 ~@2 g4@4 ~ f#4@4 d4@3, ~@18 a3@15 ~ a3@4 ~@10]/2", // D
  AL: "~@3 b3, f#4@17 ~@7, ~@4 d4@3 ~", AM: "~@7 f#3@3 d4@3 e4@3 d4@4 c4@3 ~, a3@3 ~@5",
  AN: "b3@10 ~@3 b4@9 [g#4,a4,a#4,b4,c5,c#5,d5] ~, ~@4 g4@3 ~",
  AO: "~ d5@9 [b4,d5]@3 [b4,d5]@3 ~ e5@3 ~ d5@3, b4@9 ~@7 b4@3 ~ b4@3 ~", AP: "~ c#5@17 [g#4,c5]@6, a4@3 ~",
  AQ: "[g4,b4]@6 a4@3 a4@3 b4@3 ~ a4@4 g4@4", AR: "f#4@11 ~ f#4 g4@10 ~, ~@12 d5@11 ~",
  AS: "[f#4,d5]@9 ~@4 f#5@4 d5@4 a4@3, ~@10 d4@5 ~@9", AT: "f#5@16 ~@2 [f#4,b4,d5]@2 ~ [f4,a#4,c#5]@2 ~, f#4@7 ~@5",
  AU: "[e4,a4,c5]@6 ~ [f#4,b4]@2 [c#4,f4,a#4]@2 ~ [c4,e4,a4]@5 ~ [a3,d4,f#4]@3 [e4,a4]@2 ~", // Am B5 A#m Am D A5
  AV: "[[b3,d4]@9 ~@3 a#2 c3@8 ~@9 d4@6 ~ f3@8 e4@3, g4@12 ~ b2 ~@8 b2@14 b2@6 ~@6, ~@24 [f3,a3]@12 d4@8 ~ d#4 ~@2]/2", // Bm F
  AW: "~ c#4@8 ~@3 c#4 d4@8 ~ [g3,b3]@2, ~@4 [g3,b3]@3 d4", // G
  AX: "[g3,b3]@5 ~@7 a4@6 f#4@3 e4@3, c#4@7 ~, ~@7 g3@17, ~@9 b3@7 ~@8", // G
  AY: "~ [f#3,a3,d4]@9 ~@10 g3@4, ~@12 d4@11 ~, ~@2 a3", // D
  AZ: "[f#3,a3,d4]@11 ~ [f#3,d4]@3 ~ [f#3,e4]@3 ~ [f#3,d4]@2 ~@2", // D F#7 D
  BA: "[g3,c#4]@10 ~@2 c#4 d4@2 ~@2 d4 ~@2 [g3,b3,c#4,d4]@2 ~@2, ~@12 [g3,b3]@3 ~ [g3,b3,c#4]@2 ~@6", // Gdim G C#m7b5
  BB: "[g3@6 g3@4 ~@3 a4@4 f#4@3 e4@3 ~ d4@12 e3 f#3@4 ~@37 d6@29 ~@13, c#4@16 ~@26 a3@18 f#3@7 ~@8 a4@22 ~@23, b3@10 b3@6 ~ d3@19 ~@10 f#3@8 ~ d3@9 ~@3 d2@9 d5@25 ~@19, ~@48 d4@13 a3@11 b3@23 ~@25, ~@62 d4@10 ~@2 e4@23 ~@23]/5",
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.6)

// chords · acoustic guitar steel · "GUITAR"
const acoustic_guitar_steel_2 = note(`<
  ~ A B C D E F G H I J K L@2 M N O P Q R S T U V@2 W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO@3 AP AQ AR AS
  AT AU@2 AV@2 AW ~ AX AY AZ BA BB BC BD BE BF BG BH BI@3
>`.pickRestart({
  A: "~@6 [b3,d4,f#4]@6 [b3,d4,f#4]@6 ~ [a#3,c#4,f4]@5", B: "~ [c4,e4]@23, ~ a3@21 ~@2",
  C: "~@5 b3 c4@4 [f3,a3] c4, ~@3 f3@7 ~@2, ~@8 a3@12 b3 ~@3", D: "[f3,a3]@3 ~, b3@11 ~",
  E: "~@2 b3 g3@2 [g3,b3], ~ [g3,c#4] d4@2, ~@12 b3@5 ~@7", F: "~ b3@10 g3@5 b3@2 c#4@3 ~ b3@2, g3@3 ~@5, ~ c#4@14 ~@9",
  G: "g3@5 ~ e3 f3 f#3@4 a3@6 f#4@5 ~", H: "d4@11 ~@13, a3 ~@3", I: "~ [f#4,b4,d5]!2 [f4,a#4,c#5]",
  J: "~ c5@21 ~@2, e4@3 ~, ~ a4@18 ~@5", K: "~@3 [b4,e5,g5]@15 ~ e5@5, ~@3 b4",
  L: "[b4@11 ~@7 g5@12 ~@6 a4@4 a4@4 [f4,g#4,c5]@3 ~, ~@6 [b4,e5]@5 ~@6 f#4@5 ~@2, ~@9 c#5@2 ~]/2", // Fm E5
  M: "[e4,g4,b4]@9 ~@3 a3@4 ~ g#3 ~@3 e4@3, ~@17 g3@7", N: "[f#3,d4]@10 ~@2 g3@6 a3@5 ~, ~@12 d4@11 ~",
  O: "[f#3,a3]@6 ~@4 a4@3 g5@3 f#5@4 a4@4, d4 ~@2", P: "f#5@12 [d5,f#5]@8 [c#5,f5]@3 ~", Q: "e5@17 ~ e5@4 c5@2, c5@7 ~",
  R: "d5@17 ~ [f#4,a#4]@6", S: "[g4,b4]@12 ~ b4@2 c5 [g#4,a4,a#4] ~@4 d5@3, ~@12 g4@3 ~ [b4,d5]@4 b4@3 ~",
  T: "[a4,c#5]@11 ~ [f#4,a4,c#5]@7 ~ [f4,g#4,c5]@4", U: "e4@8 ~@9 e4@5 g4@2, [g4,b4]@6 g4@5 ~, ~@9 e4@7 ~@8",
  V: "[~ f#4@11 d5@25 ~@11]/2", W: "~@13 [d4,f#4]@11, ~@5 b3@7", X: "[a3,c4,e4]@19 ~@5",
  Y: "~@4 b3 d4 [b3,e4]@6, ~@2 f3@2 f3@3 ~", Z: "f3@9 ~@9 f3@3 ~ f3@2, d4@17 ~ d4@6, ~@9 f3@8 ~@7, ~@4 b3@3 ~",
  AA: "[g3,c#4]@12 ~@4 b3@2 ~@2 [g3,b3,d4] ~@3, ~@15 [g3,c#4]@2 ~@7", // Gdim G Gdim
  AB: "[g3,b3,c#4]@5 ~ a3@6 [d4,g4]@4 [c#4,f#4]@4 [b3,e4]@4", AC: "d4@7 ~@5, a3@11 ~@13",
  AD: "~@6 a4@6 g5@5 f#5@3 a4@3 ~", AE: "~ [d5,f#5]@17 ~ [c#5,f5]@5", AF: "~ e5@23, c5@23 ~",
  AG: "~ d5@17 [f#4,a#4]@6, b4@5 ~@3", AH: "[g4,b4]@12 [g4,b4]@6 ~ b4@5, ~@18 g4@5 ~",
  AI: "~ c#5@17 [g#4,c5]@6, a4@17 ~@7", AJ: "~ e4, b4@5 ~, g4@7 ~@5", AK: "d4@12 d5@6 d5 d#5 e5@4", AL: "d5@5 ~",
  AM: "~@6 [d4,d5]@6 ~ d5@5 ~ c#5@5, ~@12 d4@6 d4@5 ~", AN: "~ d4@12 d4@10 ~, c5 ~",
  AO: "[~@19 b3 c4@4 b3@7 ~@5 b3@6 a3@9 ~@3 [c#4,f#4,a4]@12 ~ g#4@5, ~@4 f3@11 ~@9, ~@19 a3@23 ~@24 [c4,f4]@6]/3", // F#m F5
  AP: "~ g4@15 a4@3 g4@2 c#4@3, [b3,e4]@7 ~", AQ: "~ d4@11 e3 ~ f#3@4 a3@6", AR: "[f#3,d4]@19 ~@5", AS: "~ [f#4,b4]",
  AT: "[a4,c5]@12 ~@7 [e4,a4]@4 ~, e4@19 ~@5, ~@12 c5@11 ~", // Am A5
  AU: "[~ b4@17 ~@6 b3@11 ~ f3@8 ~ f3@3, ~ e4@15 ~@5 f3@14 ~ [b3,d4]@11 ~]/2", // Bm
  AV: "[~ a3@22 a2@7 c#4@6 a3@6 g3@5 ~, [e3,c#4]@23 ~@25]/2", AW: "[f#3,d4]@3 ~",
  AX: "~@6 [b4,d5,f#5]@5 ~ [b4,d5,f#5]@6 [a#4,c#5,f5]@6", AY: "a4@2 ~ [c5,e5], [c5,e5]@3 ~, ~@3 a4@2 ~",
  AZ: "b4@11 ~ [f4,a4,c5]@4 ~@2 [f4,a4,c5]@4 ~@2, g4@3 ~@5", // F
  BA: "[e4,b4]@11 ~ [e4,b4]@6 [e4,g4,b4]@3 [f4,g#4] [f#4,a4,c5,c#5]@2, a4@3 ~@5", // E5 Em Fm F#m
  BB: "[f#4,a4]@2 ~ [c#4,f#4,a4]@2 [c4,f4,g#4], c#5@5 ~@7", BC: "[b3,g4]@11 ~ a3@5 ~ f#4@3 e4@3, e4@9 ~@3 g#3 ~@11",
  BD: "d4@5 ~ d4@6 ~ d5@5 d5 e5@5, ~@19 d#5 ~@4", BE: "d5@11 ~",
  BF: "~@6 a4@3 ~@4 f#4@5 ~ [f4,g#4]@5, ~ c#5@2 c5, ~ f#4 ~@2, ~@10 a4@9 ~@5", // Fm
  BG: "g4@9 ~ a3@2 ~ [a3,g4]@3 [a3,f#4]@4 [g3,e4]@3 ~, e4@7 ~@17", BH: "d4@6 ~@5 d4, f#3@5 ~ g3@6, ~@3 a3",
  BI: "[~@13 d3@10 ~@3 d5@34 ~@12, f#3@12 ~@13 a4@27 ~@20, ~ a3@18 ~@4 b3@25 ~@24, ~@2 d4@17 ~@5 e4@24 ~@24]/3",
})).s("gm_acoustic_guitar_steel").gain(0.36).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~ A@7 B A@7 B A@7 B A@7 C A@7 D A@7 ~ A@7 B A@7 D A@2 C E F ~>".pickRestart({
  A: "x ~@4 x!2 ~@4 x", B: "x", C: "x ~ x!2 ~@8", D: "x ~@10 x", E: "x ~@4 x!2 ~@5", F: "~@2 x!2 ~@2 x ~@5",
})).gain(0.28)

// drums · rim
const rim = s("rim").struct("<~ A@7 ~ A@7 ~ A@7 ~ A@7 ~ A@7 ~ A@7 ~ A@7 ~ A@7 ~ A@2 ~ B ~@2>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.32)

// drums · snare
const snare = s("sd").struct("<~@8 A ~@7 A ~@7 A ~@15 B ~@7 C ~@7 A ~@7 D ~@3 E F ~>".pickRestart({
  A: "x ~@8 x!3", B: "~@6 x!4 ~ x", C: "x!2 ~ x ~@3 x ~ x!2 ~", D: "~@6 x!4 ~@2", E: "~@3 x", F: "x",
})).gain(0.32)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@8 A ~@7 A ~@7 A ~@23 B ~@7 A ~@14>".pickRestart({
  A: "~@7 x!2 ~@3", B: "~ x!3 ~@2",
})).gain(0.16)

// drums · low tom
const low_tom = s("lt").struct("<~@32 [~@9 x ~ x] ~@15 [~@5 x ~@5 x] ~@18 [~@9 x ~ x] [~@11 x] ~@2>").gain(0.36)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~@32 [~@5 x ~@2 x!3 ~] ~@15 [~@2 x] ~@18 [~@5 x ~@2 x!3 ~] [~@5 x] ~@2>").gain(0.36)

// drums · mid tom · soft notes
const mid_tom_soft = s("mt").struct("<~@32 [~ x!2 ~] ~@34 [~ x!2 ~] ~@3>").gain(0.24)

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

// drums · high tom
const high_tom = s("ht").struct("<~@32 [~@3 x!2 ~ x!2 ~@4] ~@34 [~@3 x!2 ~ x!2 ~@4] ~@3>").gain(0.36)

// drums · crash
const crash = s("cr").struct("<~ A ~@7 A ~@7 A ~@7 A ~@7 A ~@6 A@2 ~@7 A ~@7 A ~@6 A@2 ~@3 B ~>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.28)

// drums · ride
const ride = s("rd").struct("<~@69 [~ x ~@2] ~>").gain(0.32)

stack(
  bass, piano, acoustic_guitar_nylon, electric_guitar_muted, acoustic_guitar_steel, acoustic_guitar_steel_2, kick, rim,
  snare, snare_soft, low_tom, hihat, mid_tom, mid_tom_soft, open_hat, high_tom, crash, ride
)

More by Glen Campbell