Strudelify

Then You Can Tell Me Goodbye

Eddy Arnold

KeyE majorTempo64 bpm
0:00/0:00
// Then You Can Tell Me Goodbye — Eddy Arnold
// 64 bpm, 4/4, key E major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 50 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(64/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 A B C D E F C G H@2 I J C K C L M N O H P Q A R A S A R H T U V W X Y Z A B A S A AA AB T AC AD@2
>`.pickRestart({
  A: "e1@8 b1 ~ c2 ~ c#2@8 e1 ~ f1 ~", B: "f#1@12 b1@5 ~ b1@2 g#1 ~ f#1 ~", C: "e1@8 b1 ~ c2 ~ c#2@12", D: "f#1@2 b1 ~",
  E: "e1@5 ~ c#2@6", F: "f#1@9 ~ f#1@2 b1@7 ~ g#1 ~ f#1 ~", G: "f#1 b1", H: "e1@8 f#1 ~ g#1 ~ a1@12",
  I: "e1@8 f#1 ~ g#1 ~ a1@11 ~", J: "a1@11 ~ b1@8 g#1 ~ f#1 ~", K: "f#1@8 a1 ~ a#1 ~ b1@8 g#1 ~ f#1 ~",
  L: "f#1@4 ~ f#1 b1@3 ~@3", M: "e1@7 ~ b1 ~ c2 ~ c#2@12", N: "f#1@11 ~ b1@8 g#1 ~ f#1 ~",
  O: "e1@7 ~ f#1 ~ g#1 ~ a1@8 g#1 ~ f#1 ~", P: "e1@8 f#1 ~ g#1 ~ a1@10 ~@2", Q: "a1@12 e1@6 b1@2 g#1 ~ f#1 ~",
  R: "f#1@12 b1@8 g#1 ~ f#1 ~", S: "f#1@9 ~ f#1@2 b1@11 ~", T: "e1@8 f#1 ~ g#1 ~ a1@8 g#1 ~ f#1 ~",
  U: "e1@8 f#1 ~ g#1 ~ a1@6 ~@4 a1 ~", V: "a1@12 e1@8 f#1 ~ g#1 ~", W: "a1@9 ~ c#2 ~ e2@6 c#2@6",
  X: "e1@9 ~ g#1 ~ b1@6 g#1@3 ~ b1@2", Y: "f#1@10 a#1@2 c#2@6 f#1@2 g#1 ~ a#1 ~", Z: "b1@9 ~ b1 ~ b1@8 g#1 ~ f#1 ~",
  AA: "f#1@9 ~ f#1@2 b1@8 g#1 ~ f#1 ~", AB: "e1@12 a1@8 g#1 ~ f#1 ~", AC: "e1@8 f#1 ~ g#1 ~ a1@9 ~ a1@2",
  AD: "[f#1@11 ~@3 e1@21 ~@13]/2",
})).s("gm_electric_bass_finger").gain(0.57)

// chords · epiano2 · "chorused"
const epiano2 = note(`<
  ~ A B A B A C D E A B F@3 B A G D B A B F@3 H A B A B A B F@3 H I J K L A C M C M B F@3 N@2
>`.pickRestart({
  A: "[e3,g#3,b3] [g#3,b3,c#4,e4]", B: "[a3,c#4,e4,f#4] [f#3,b3,d#4]",
  C: "[a3,c#4,e4,f#4]@6 ~@3 [e2,g#3] [f#2,a3] [g#2,b3], ~ [f#3,d#4], ~@6 b3@5 ~", D: "[e2,e3,g#3,b3] [g#3,b3,c#4,e4]",
  E: "[a3,c#4,e4,f#4] [d#3,f#3,b3]", F: "[e3,g#3,b3] [e3,a3,c#4]",
  G: "[a3,c#4,e4,f#4]@6 ~@3 [e2,g#3] [f#2,a3] [g#2,b3], ~ [f#3,d#4], ~@6 b3@5 ~, ~@20 g#2 ~@3", // F#m7 E F#m G#m D#m
  H: "[a3,c#4,e4,f#4] [e3,g#3,b3]", I: "c#4@7 ~ e4 a4 e4 c#4, [e3,a3]@23 ~, ~@7 c#4@4 ~",
  J: "~@4 [e3,g#3,b3]@6 [e3,g#3,b3]@2 [e3,g#3,b3]@3 ~ [e3,g#3,b3]@4 [g#3,e4,b4]@3 ~, e2, ~ b2@11", // E
  K: "a#3@7 ~@2 f#4 c#4 a#3, f#3@23 ~, c#4@4 c#4 ~, ~@7 a#3@4 ~", L: "[f#3,b3,d#4]",
  M: "[e3,g#3,b3] [g#3,b3,c#4,e4], e2@5 ~@7", N: "[[e3,a3,c#4]@11 ~@3 [e3,g#3,b3]@27 ~@7]/2",
})).s("gm_epiano2").gain(0.36).pan(0.2)

// chords · electric guitar clean · "clean gui"
const electric_guitar_clean = note(`<
  ~ A B A B A B A B A B C@3 B A B A B A B C@3 D A B A B A B C@3 D E F G H A B A B A B C@3 ~@2
>`.pickRestart({
  A: "~@6 [g#3,e4] ~@11 [e3,b3] ~@5", B: "~@6 [e3,a3] ~@11 [f#3,d#4] ~@5", C: "~@6 [g#3,e4] ~@11 [e3,c#4] ~@5",
  D: "~@6 [e3,a3] ~@11 [g#3,e4] ~@5", E: "~@6 [e3,c#4] ~@11 [e3,c#4] ~@5", F: "~@6 [g#3,e4] ~@11 [g#3,e4] ~@5",
  G: "~@6 [c#3,a#3] ~@11 [c#3,a#3] ~@5", H: "~@6 [f#3,d#4] ~@11 [f#3,d#4] ~@5",
})).s("gm_electric_guitar_clean").gain(0.36)

// chords · epiano1 · "rhodes pi"
const epiano1 = note(`<
  ~ A B A B A B A B A B C@3 B A B A B A B C@3 D A E A B A B C@3 D F G H I A B A B A B C@3 ~@2
>`.pickRestart({
  A: "[e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [g#3,b3,c#4,e4] ~ [g#3,b3,c#4,e4] ~ [g#3,b3,c#4,e4] ~ [g#3,b3,c#4,e4] ~ [g#3,b3,c#4,e4] ~ [g#3,b3,c#4,e4] ~", // E C#m7
  B: "[a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~", // F#m7 B
  C: "[e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~", // E A
  D: "[a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~", // F#m7 E
  E: "[a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [a3,c#4,e4,f#4] ~ [d#3,f#3,b3] ~ [d#3,f#3,b3] ~ [d#3,f#3,b3] ~ [d#3,f#3,b3] ~ [d#3,f#3,b3] ~ [d#3,f#3,b3] ~", // F#m7 B
  F: "[e3,a3,c#4] ~ [e3,a3,c#4]!3 ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~ [e3,a3,c#4] ~", // A
  G: "[e3,g#3,b3] ~ [e3,g#3,b3]!3 ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~ [e3,g#3,b3] ~", // E
  H: "[f#3,a#3,c#4] ~ [f#3,a#3,c#4]!3 ~ [f#3,a#3,c#4] ~ [f#3,a#3,c#4] ~ [f#3,a#3,c#4] ~ [f#3,a#3,c#4] ~ [f#3,a#3,c#4] ~ [f#3,a#3,c#4] ~ [f#3,a#3,c#4] ~ [f#3,a#3,c#4] ~ [f#3,a#3,c#4] ~", // F#
  I: "[f#3,b3,d#4] ~ [f#3,b3,d#4]!3 ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~", // B
})).s("gm_epiano1").gain(0.2).pan(0.8)

// other · electric guitar jazz · "jazz guit"
const electric_guitar_jazz = note("<~ A@2 B@2 ~@10 C D C D ~@26 C E F ~@2>".pickRestart({
  A: "[~@4 e3 ~ b3@7 ~@3 e3 ~ b3@9 ~@3 b3@2 a3 ~ f#3 ~ b2@11 ~]/2",
  B: "[~@4 e3 ~ b3@8 ~@2 e3 ~ b3@9 ~@3 b3@2 a3 ~ f#3 ~ b2@11 ~]/2", C: "~@18 e4@2 f#4 ~ g#4 ~", D: "c#4@5 ~@7",
  E: "e4@12 ~@6 e4@2 f#4 ~ g#4 ~", F: "e4 ~",
})).s("gm_electric_guitar_jazz").gain(0.51).pan(0.8)

// chords · electric guitar jazz · "pedal ste"
const electric_guitar_jazz_2 = note("<~@2 A B C ~@6 D@4 ~@6 E@4 ~@6 E@4 ~@15>".pickRestart({
  A: "[e3,a3] [f#3,b3]", B: "[e3,g#3] ~", C: "[e3,a3]@12 [f#3,b3]@11 ~",
  D: "[~@18 e3@17 ~@37 f#3@24, ~@42 e3@29 ~@25, ~@5 a3@3]/4",
  E: "[~@18 e3@18 ~@36 f#3@12 [e3,g#3]@11 ~, ~@7 e3@5 ~@4, ~@5 a3@2 ~]/4", // E
})).s("gm_electric_guitar_jazz").gain(0.35)

// other · electric guitar jazz · "pedal ste"
const electric_guitar_jazz_3 = note("<~@2 A@2 ~@7 B@3 A@2 ~@5 C@3 ~@7 B@3 ~@16>".pickRestart({
  A: "[~@3 a3@5]/2", B: "[~@18 a3@17 ~@7 a3@17 ~@13]/3", C: "[~@3 a3@3 ~ a3@3 ~@2]/3",
})).s("gm_electric_guitar_jazz").gain(0.4)

// chords · string ensemble 2 · "strings"
const string_ensemble_2 = note("<~@16 A B C@2 D ~@3 E ~@2 F@2 G@2 H@3 I ~@5 A B C@2 D ~@3 J@2>".pickRestart({
  A: "f#3@10 g#3 a3", B: "g#3 b3", C: "[b3 f#3 ~ c#4, ~ b3@2 ~, ~ g#3]/2", D: "a3 b3, f#3",
  E: "[f#3,a3,c#4]@13 ~ [e3,g#3]@10", F: "b4/2", G: "[e4@3 f#4]/2", H: "[~ a4 g#4 a4 g#4 a4, e4]/3", I: "a4 g#4, e4",
  J: "[[a3,c#4]@14 [g#3,b3]@33 ~, e3@23 ~]/2", // A G#m
})).s("gm_string_ensemble_2").gain(0.46)

// drums · kick
const kick = s("bd").struct("<A B@3 C B@3 C B@5 C B@3 C B@9 C B@5 C@5 B@3 C B@5 D ~>".pickRestart({
  A: "~@11 x", B: "x!2", C: "x ~@4 x!2 ~@4 x", D: "x ~@6 x ~@4",
})).gain(0.46)

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~ A@3 ~ A@3 ~ A@5 ~ A@3 ~ A@9 ~ A@5 ~@5 A@3 ~ A@5 ~@2>".pickRestart({
  A: "~@5 x ~@5 x",
})).gain(0.31)

// drums · rim
const rim = s("rim").struct("<~ [~ x ~ x]!24 ~@6 [~ x ~ x]!17 ~@2>").gain(0.51)

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

// drums · hihat
const hihat = s("hh").struct("<~ A B A@5 ~ A@2 B A@6 B A@8 B@2 A B A@4 ~@4 A@3 B A@3 B@2 ~@2>".pickRestart({
  A: "x!12", B: "x!11 ~",
})).gain(0.41)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A ~@9 A ~@19 A ~@3 A ~@11>".pickRestart({
  A: "~@10 x!2",
})).gain(0.46)

// drums · open hat
const open_hat = s("oh").struct("<~@2 A ~@8 A ~@6 A ~@8 A@2 ~ A ~@11 A ~@3 A@2 ~@2>".pickRestart({
  A: "~@11 x",
})).gain(0.46)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A ~@9 A ~@19 A ~@3 A ~@11>".pickRestart({
  A: "~@7 x!3 ~@2",
})).gain(0.46)

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

// drums · ride
const ride = s("rd").struct("<~@35 [~ x!11] [x!12]!3 ~@11>").gain(0.46)

stack(
  bass, epiano2, electric_guitar_clean, epiano1, electric_guitar_jazz, electric_guitar_jazz_2, electric_guitar_jazz_3,
  string_ensemble_2, kick, kick_soft, rim, snare, hihat, mid_tom, open_hat, high_tom, crash, ride
)

More by Eddy Arnold