Strudelify

That's The Way I've Always Heard It Should Be

Carly Simon

KeyG majorTempo70 bpm
0:00/0:00
// That's The Way I've Always Heard It Should Be — Carly Simon
// 70 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 75 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/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(`<
  ~@9 A B A C D E F G H I J K L M N O ~@8 A B A C D E F G H I J K L M N O ~@8 A B A C D E F G H I J K L M N P@2 ~
>`.pickRestart({
  A: "d3", B: "g2", C: "g2@13 ~@3", D: "d2", E: "c2@11 ~@5", F: "g2@3 d#2", G: "g1@7 ~", H: "f1@5 ~ f1 c2 f2@6 f2@2",
  I: "e2@5 ~ e2 b1 e1@2 e2@4 e1@2", J: "d2@7 a1 d2 ~ d2@4 a1@2", K: "c2@7 g1 c2 ~ c2@4 g1 ~",
  L: "f1@4 f2@3 c2 f2 c2 f1@4 f2@2", M: "e2@5 ~ e2 b1 e2 ~ e2@2 b1@2 e1 e2", N: "a1@7 ~", O: "d2@13 ~@3",
  P: "[d2@21 ~@11]/2",
})).s("gm_acoustic_bass").gain(0.5).pan(0.6)

// chords · piano
const piano = note(`<
  ~ A B C D E F G H A B C D E F I J K L M N O P Q R A B C D E F G H A B C D E F I J K L M N O P Q R A B C D E F G H A B
  C D E F I J K L M N O P Q S@2 ~
>`.pickRestart({
  A: "~@7 b3, b2, b3@2 [c#4,f#4] b3 [c#4,f#4] b3 [c#4,f#4]@2, [d4,f#4] d4@3, ~ f#3@3 f#3@4", // F#5 D
  B: "b3 ~@13 b3@2, g2, [d4,f#4]!2 d3@2, ~ b3@2 b3@2 b3@2 ~, ~@2 [d4,f#4] [d4,f#4,b5,b6]", // D Bm
  C: "~@2 b3@2 b3@2 b3@2 f#4@2 ~@2 [c#4,f#4]@2 b3 ~, b2@15 ~, [c#4,f#5,f#6]@2 c#4 ~, f#4@2 [d4,f#4]@2 ~ b3@2 ~, ~@2 f#3@6 f#3@7 ~", // F#5 D
  D: "~@12 [g2,c#4,d4,f#4]@2 [b3,a4,a5] ~, g2@5 b3@2 ~, b3@2 [d4,f#4] b3 [d4,f#4]@2 ~@2, [d4,f#4] c#4@2 ~, ~@2 g3@6 g3@7 ~", // Gmaj7 B7 D
  E: "~@12 [d4,f4,a4]@2 c4 ~, [a3,e5,e6]@15 ~, [d4,f4,a4]!3 ~, ~ c4@2 c4@2 c4@2 ~", // Dm A5 Dm
  F: "~@4 e4@2 ~@6 [g4,b4]@2 e4 ~, c3@15 ~, [e4,g4,b4] [g4,b4]!2 ~, ~@2 b3@6 b3@7 ~, ~@3 e4@2 e4@2 ~", // G Em G
  G: "a3@2 ~@6 a3@2 c4 ~ [g#2,g#3,c4,d#4]@2 g#3 ~, [f2,f3]@11 ~@5, e4@6 e4@5 ~@5, c4@2 c4@3 ~@3, ~ a3@3 ~@4", // G# F
  H: "~@12 d4@2 b3 ~, g2@15 ~, g4@6 d4@4 g3@5 ~, d4@2 b3@5 ~, b3@2 g3@6 g4@7 ~",
  I: "a3 ~@9 a3@2 [d#3,g#3,c4,d#4]@3 ~, e4@3 e4@3 ~@2, c4!3 ~, ~ a3@4 ~@3", // G#
  J: "g3 ~@5 b3 ~, d4@4 d4@3 ~, b3@3 b3@2 g4@2 ~, g2@2 g2@5 ~, ~ g3@6 ~",
  K: "[c4,e4,a4]@2 c4 ~ c4 ~@2 c4, f2, c3@5 c4 c3@2, f3@6 c4 f3@9, ~@2 [e4,a4]@3 [e4,a4]@3", // Am A5
  L: "~@2 b3@4 ~@8 d5 [b4,d5], e2@3 [e2,e4]@2 [b3,d5] c5 [e3,g3,b3,a4], ~ d4@7, ~@6 b3@3 e5@7, ~@4 [d5,a5] [g4,a5]@3", // Bm E Bm Em D5 Gsus2
  M: "c4@2 c4@3 ~@2 f4 [f4,a4]@2 ~@2 a3@4, [d3,f3], a4@4 ~ [d4,f4,a4]@3, f4@3 c4@5, [a3,d5]@4 ~ a3@7 ~@4", // F Dm D5
  N: "g3@2 g6 ~ g6@2 d6 ~ [d6,e6] ~ d4 ~@2 c4@3, e3, c3@3 g3, [e4,g4]@3 a6 g3@4 ~@3 e4@5, b3 ~ b3@4 [b3,e4,g4]@4 [g4,c6]@6", // Dsus2 Em C5
  O: "d5 ~ e4@4 [f3,a3,c4]@4 ~@2 [e4,a4]@4, [f3,a3,c4]@3 [e4,a4]@3 ~@2, ~ e5@5 ~@4 [f3,a3,c4]@6", // F A5 F A5 F
  P: "d4 ~@4 e3@3, g3, e3 e2, g4 b3@3, b3 d4@2 [d4,g4,b4]@5", Q: "[a2,a3,c#4,e4]@7 ~, e3@3 ~", R: "[f#3,d4,f#4,a4]@7 ~",
  S: "[[d3,f#3,d4,f#4,a4]@7 ~@9, d2@19 ~@13]/2", // D
})).s("gm_piano").gain(0.3).pan(0.8)

// chords · acoustic guitar nylon · "Guitar"
const acoustic_guitar_nylon = note("<~@17 A B C D E F G ~@17 A B C D E F G ~@17 A B C D E F G ~@3>".pickRestart({
  A: "e4!2 [c4,e4] ~@4 e4, [f3,a3,c4] a3@2 a3, ~@2 f3@3 f3@3, ~@3 e4 e4@3 ~, ~@7 c4@6 c4@3", // C F
  B: "[e3,g3,b3,d4]@2 [e3,g3,b3,d4] [e3,g3,b3,d4]@2 [e3,g3,b3,d4]@2 [e3,g3,b3,d4]", // Em7
  C: "[d3,f3,a3] ~ c4 [d3,f3,a3,c4]@2 [d3,f3,a3,c4]@2 [d3,f3,a3,c4], c4 ~ c4@2 ~@12, ~@3 [d3,f3,a3]@3 ~@10", // Dm Dm7 Dm
  D: "b3@2 ~ [c3,e3,g3]@2 [c3,e3,g3,b3]@2 [c3,e3,g3,b3], [c3,e3,g3]@3 ~@5, ~@2 b3@3 ~@3", // C Cmaj7 C
  E: "[f3,a3,c4]@3 ~ [f3,a3,c4]@2 [f3,a3,c4,e4]@4 [f3,a3,c4,e4]@4 [f3,a3,c4,e4]@2, e4@3 g3@5", // F Fmaj7
  F: "[e3,g3,b3,d4]@2 [e3,g3,b3,d4] [e3,g3,b3,d4]@2 [e3,g3,b3,d4]@3", G: "[e3,a3,c#4] ~, [a2,e4]@5 ~@3",
})).s("gm_acoustic_guitar_nylon").gain(0.3).pan(0.2)

// chords · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@9 A B C D E F G H I J K L I M N O ~@8 A B C D E F G H I J K L I M N O P Q R S T U V W A B C D E F G H X Y Z AA X AB
  AC AD@2 ~
>`.pickRestart({
  A: "d4", B: "g3@3 a3", C: "f#3@15 ~", D: "g3@12 d4@3 ~", E: "f3", F: "c4@3 ~", G: "a3@3 g#3", H: "g3@7 ~",
  I: "[f3,a3,c4,e4,c5]", J: "[e3,g3,b3,d4,b4]", K: "[d3,f3,a3,c4,a4]", L: "[c3,e3,g3,b3]@7 ~, b4",
  M: "[e3,g3,b3]@7 ~, [d4,d5]", N: "[e3,a3,c#4] ~@3, c#5@3 ~, a2 ~", O: "d4@5 ~@11", P: "d4@3 b3", Q: "g3@15 ~",
  R: "f#3", S: "g3@8 ~@2 f#4@2 [f#4,c#5]@2 b4 ~, ~@2 d4 ~", T: "f4", U: "e4@7 ~", V: "c4", W: "[b3,d4]",
  X: "[f3,a3,c4,e4,c5,a5]", Y: "[e3,g3,b3,d4,b4,g5]", Z: "[d3,f3,a3,c4,a4,f5]", AA: "[c3,e3,g3,b3]@7 ~, [b4,e5]",
  AB: "[d4,d5,g5,b5], [e3,g3,b3]@7 ~", AC: "[e3,a3,c#4] ~@3, [c#5,e6]@13 ~@3, a2 ~", AD: "[[a5,f#6]@15 ~]/2",
})).s("gm_string_ensemble_1").gain(0.25)

// chords · string ensemble 1 · "Strings" · soft notes
const string_ensemble_1_soft = note("<~@23 A B ~@22 A C ~@22 D E@2 ~>".pickRestart({
  A: "a4@13 ~@3", B: "[f#4,a4]@13 ~@3", C: "[f#4,a4,d5,d6]@7 ~", D: "[a4,a5]@13 ~@3", E: "[d5@27 ~@5, d4@5 ~@3]/2",
})).s("gm_string_ensemble_1").gain(0.15)

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

// drums · snare
const snare = s("sd").struct("<~@16 A B@6 ~@17 A B@6 ~@17 A B@6 ~@4>".pickRestart({
  A: "~@9 x ~ x ~@2 x ~", B: "~ x ~ x",
})).gain(0.5)

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@7 B ~ C ~@13 A ~@7 B ~ C ~@13 A ~@7 B ~ C ~@8>".pickRestart({
  A: "~@7 x", B: "~@7 x ~@8", C: "~@15 x",
})).gain(0.4)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@17 A B C@2 A B ~@18 A B C@2 A B ~@18 A B C@2 A B ~@4>".pickRestart({
  A: "~@3 x ~ x ~ x", B: "~@3 x ~ x ~@2", C: "~ x ~ x ~ x ~ x",
})).gain(0.25)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@7 B ~ C ~@13 A ~@7 B ~ C ~@13 A ~@7 B ~ C ~@8>".pickRestart({
  A: "~@12 x!2 ~@2", B: "~@7 x ~@8", C: "~@13 x!2 ~",
})).gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@8 A ~@7 B ~ A ~@13 A ~@7 B ~ A ~@13 A ~@7 B ~ A ~@8>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@4",
})).gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@17 x ~@23 x ~@23 x ~@9>").gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@9 A ~@13 A ~@9 A ~@13 A ~@9 A ~@13 A ~@3>".pickRestart({
  A: "x",
})).gain(0.45)

stack(
  bass, piano, acoustic_guitar_nylon, string_ensemble_1, string_ensemble_1_soft, kick, snare, low_tom, hihat,
  hihat_soft, mid_tom, high_tom, crash, ride
)

More by Carly Simon