Strudelify

If You Could Read My Mind

Gordon Lightfoot

KeyA majorTempo120 bpm
0:00/0:00
// If You Could Read My Mind — Gordon Lightfoot
// 120 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 113 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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.

// other · flute · "Solo"
const flute = note(`<
  ~@4 A@2 B C D@2 B E F@2 G@3 H@2 I@2 J@3 ~ A@2 B C D@2 K@2 L@3 M@2 N@2 O P Q@3 ~@7 R@2 S T@2 U@2 V@2 W@3 X@2 Y Z AA AB
  AC@2 AD AE ~@2 A@2 B C D@2 B E F@2 G@3 AF@2 AG@2 AH@3 X@2 Y Z AA AB AC@2 AD AI@2 ~@6
>`.pickRestart({
  A: "[~@3 a4 g#4 a4@2 b4@2 a4 a4@2 e4 a4 a4@2]/2", B: "~@2 g4!3 f#4!3", C: "e4 e4@2 e4@3 ~@2",
  D: "[~@2 a4@2 g#4@2 a4 b4@2 a4 a4@2 e4 a4!2 ~]/2", E: "f#4 e4@2 e4@2 ~@3",
  F: "[~@2 e4!2 e4@2 f#4 g4@3 ~@3 f#4 g4 b4]/2", G: "[a4 a4@2 ~@3 b4 c#5@3 b4 a4@2 a4 b4 a4@3 ~@5 a4]/3",
  H: "[g#4 f#4@2 f#4@2 e4!2 e4@3 ~@5 a3]/2", I: "[g#4@2 a4 a4@2 a4@2 g#4@2 a4@2 a4@2 ~@2 a4]/2",
  J: "[g#4 a4@2 a4@3 b4 c#5@2 b4 ~@2 a4!2 b4 a4@4 ~@5]/3", K: "[~@2 g4 g4@2 f#4!2 f#4@2 e4@2 e4@3 ~@2]/2",
  L: "[~@2 e4!2 e4@2 f#4 g4@3 ~@3 f#4 g4 b4@2 a4@2 a4@2 ~@2 b4]/3", M: "[c#5 b4@2 a4@2 a4 b4 a4@3 ~@5 a3]/2",
  N: "[g#4 f#4@3 ~ f#4 e4 e4@5 ~@3 a3]/2", O: "g#4 a4@2 a4@3 a4@2", P: "g#4 a4@2 a4@2 ~@2 a4",
  Q: "[g#4@2 a4 a4@2 b4@2 c#5@2 b4 b4@2 a4@2 b4 a4@4 ~@5]/3", R: "[~@2 c#4@2 c#4@2 d4 e4@4 ~@2 f#4 g4 b4]/2",
  S: "a4 a4@2 ~@3 a4 b4", T: "[c#5 b4!2 a4!3 b4 a4@2 ~@7]/2", U: "[g#4 f#4@3 ~ f#4!2 e4@6 ~@2 a3]/2",
  V: "[g#4 a4@2 a4@3 a4 g#4@3 a4 a4@3 a4@2]/2", W: "[g#4 a4@2 a4@3 b4 c#5@2 b4 b4@2 a4!2 b4 a4@5 ~@2 a4!2]/3",
  X: "[g#4 f#4 f#4@3 f#4!2 e4@3 ~@5 a3]/2", Y: "g#4 a4@2 a4@2 a4@2 a4", Z: "g#4 a4@2 a4@3 a4!2",
  AA: "g#4@2 a4 a4@3 a4 b4", AB: "c#5@2 b4@2 a4 b4 ~@2", AC: "[~ g#4 a4 a4@2 a4@2 g#4@2 a4@2 a4@3 a4!2]/2",
  AD: "g#4 a4@2 a4@2 ~ a4 b4", AE: "c#5@2 b4@2 a4!2 b4 a4", AF: "[g#4 f#4@4 f#4 e4 e4@5 ~@3 a3]/2",
  AG: "[g#4 a4@2 a4@2 a4@2 g#4@2 a4@2 a4@2 ~@2 a4]/2", AH: "[g#4 a4@2 a4@3 b4 c#5@2 b4!2 a4@2 a4 b4 a4@4 ~@4 a4]/3",
  AI: "[c#5@2 b4@2 a4!2 b4 a4@3 ~@6]/2",
})).s("gm_flute").gain(0.52)

// other · string ensemble 1 · "Tenor 1"
const string_ensemble_1 = note(`<
  ~@2 A@3 B C D E F G H@3 I J K L M N O P@2 Q@4 R@2 S@2 T@4 U V@2 L M N O P@2 W@2 X Y@4 Z@2 ~ AA AB@2 ~@4 AC@3 ~@2 AD AE
  AF AG AH@2 AI AJ A@3 B C D E F G H@3 AK@3 L M N O P@2 AL AM E AD AE AF AG AH@2 AI AN@3 AO@5
>`.pickRestart({
  A: "[~@5 e3 a3 b3@6 b3 c#4 e3@6 e3 a3@2]/3", B: "b3@5 b3 c#4@2", C: "e3@3 ~", D: "~@4 e4 c#4!2 d4", E: "e4",
  F: "~@4 c#4 d4 e4 c#4", G: "b3", H: "[~@4 e3 f#3 e3 a3@3 c#3@2 e3@12]/3", I: "g4 f#4", J: "a4 g#4",
  K: "~ a3 b3 c#4, a4", L: "e4 d4", M: "c#4 ~", N: "g#3@3 a3@5", O: "b3@3 c#4@5", P: "[c#4@3 d4@7 e4@2 f#4@2 g#4@2]/2",
  Q: "[~@5 e3 a3 b3@6 b3 c#4 e3@6 e3 ~ b3@6 b3 c#4@2, a4@8 ~@3 a3 ~@4]/4", R: "[[b3,d4]@4 b3@8 e4 c#4!2 d4]/2",
  S: "[~@4 c#4@8 c#4 d4 e4 c#4, e4 ~]/2", T: "[~@4 d4@8 e3 f#3 e3 a3@3 c#3@2 e3@12, b3 ~@3]/4", U: "g3 f#3",
  V: "[a3@2 g#3@3 a3 b3 c#4]/2", W: "a4/2", X: "~@2 e4!3 d4!3", Y: "[d4 c#4!4 b3 c#4 a3@3 ~@3 e3 a3 e4@11 e4!3 d4!3]/4",
  Z: "[d4 c#4!4 b3 c#4 a3@9]/2", AA: "~@6 c#4 d4", AB: "[e4 d4!2 c#4!3 d4 c#4@3 ~@6]/2",
  AC: "[~@3 c#4@3 d4 e4@2 d4 d4@2 c#4!2 d4 c#4@5 ~@4]/3", AD: "d4 d4@2 d4@2 d4@2 d4", AE: "e4 e4@2 e4@3 e4!2",
  AF: "e4@2 e4 e4@3 c#4 d4", AG: "e4@2 d4@2 c#4 d4 ~@2", AH: "[~ c#4 d4 d4@2 d4@2 c#4@2 e4@2 e4@3 e4!2]/2",
  AI: "e4 e4@2 e4@2 ~ c#4 d4", AJ: "e4@2 d4@2 c#4!2 d4 c#4",
  AK: "[g4@4 ~@2 d4 ~@3 d4 ~@2 c#4 d4 ~@3 a3@2 b3@2 c#4@2, ~ f#4 a4 g#4 a4@2, ~@7 e4@3 ~ c#4@2 ~@2 c#4@3 ~@6]/3",
  AL: "a4", AM: "g#4 f#4", AN: "[e4@2 d4@2 c#4!2 d4 c#4@3 a3@2 ~ g#3 a3 b3@2 a3 a3@2 e3 a3 a3@2]/3",
  AO: "[~@2 e4@2 e4@2 e4@2 e4@2 ~ d4@2 d4@2 d4@2 ~ d4@2 c#4@3 c#4@3 c#4@2 c#4@3 b3@3 a3@3 b3@3 ~ c#4@38 ~]/5",
})).s("gm_string_ensemble_1").gain(0.52).pan(1)

// chords · acoustic guitar steel · "Combined Tracks"
const acoustic_guitar_steel = note(`<
  A@2 B@2 C D E F G H I J K@2 L M N O P Q R S@2 T@2 U@2 V@2 W@2 X@2 K@2 Y Z@2 O P Q R S@2 AA@2 AB AC@4 AD@2 AE AF AG@2
  AH AI AJ AK AL@3 AM AN AO AP AQ AR AS@2 AT AU A@2 C D E F G H I J K@2 AV AW@2 O P Q R S@2 AX AY AZ AO AP AQ AR AS@2 AT
  BA@3 BB@5
>`.pickRestart({
  A: "[e3 c#4 a3 e3 c#4 [e3,a3] [a3,c#4] a3 e3 c#4 a3 e3 c#4 [a3,b3] c#4 [e3,a3], ~@7 b3@6 ~@3]/2", // A5 A Asus2 A5
  B: "[~ c#4 a3 ~ c#4 [e3,a3] [a3,c#4] a3 e3 c#4 a3 e3 c#4 [a3,b3] c#4 [e3,a3], e3@3 e3@2 ~@2 b3@6 ~@3]/2", // A5 A Asus2 A5
  C: "~ c#4 a3 ~ c#4 [e3,a3] [a3,c#4] a3, e3@3 e3@2 ~@3", D: "e3 c#4 a3 e3 c#4 [a3,b3] ~ a3, b3@5 ~ c#4@2",
  E: "~ c#4 a3 ~ c#4 a3 c#4 a3, e3@3 e3@3 ~@2", F: "e3 c#4 a3 e3 [c#4,e4] [a3,c#4] c#4 [a3,d4]",
  G: "e3 c#4 a3 e3 c#4 a3 c#4 a3, e4", H: "e3 c#4 a3 e3 c#4 [a3,d4] [c#4,e4] [a3,c#4]",
  I: "e3 c#4 a3 e3 c#4 a3 c#4 a3, b3", J: "e3 c#4 a3 e3 [e3,c#4] [f#3,a3] [e3,c#4] a3", K: "[a3!8 a3!8, ~ c#3 e3@6]/2",
  L: "d4!8, g4 f#4", M: "e4!8, a4 g#4", N: "e3 c#4 ~ e3 c#4 a3 ~ a3, a4, ~ a3 b3 c#4", O: "e3 d4!7, e4 ~",
  P: "[e3,c#4] ~ a3 e3 c#4 a3 c#4 a3, ~ c#4@3 ~@4", Q: "e3 d4!7, g#3@3 a3@5", R: "c#4!8, b3@3 ~@5",
  S: "[b3!8 e4!8, c#4@3 d4@7 ~@2 f#4@2 g#4@2]/2",
  T: "[c#4!5 [e3,c#4] [a3,c#4] c#4 c#4!5 [b3,c#4] c#4 [e3,c#4], a4, ~@7 b3@6 ~@3]/2", // C#m A Bsus2 C#m
  U: "[~ c#4 a3 ~ c#4 [e3,a3] [a3,c#4] a3 e3 c#4 a3 e3 c#4 [a3,b3] ~ a3, e3@3 e3@2 ~@2 b3@6 ~ c#4@2]/2", // A5 A Asus2
  V: "[e3 c#4 a3 e3 c#4 a3 c#4 a3 e3 c#4 a3 e3 [c#4,e4] [a3,c#4] c#4 [a3,d4], [b3,d4] b3@2 ~]/2", // C#m A D5 Bm
  W: "[e3 c#4 a3 e3 ~ a3 ~ a3 e3 ~ a3 e3 c#4 [a3,d4] [c#4,e4] [a3,c#4], e4 ~, ~@4 c#4@2 c#4@3 c#4@3 ~@4]/2", // D5 C#m A
  X: "[e3 c#4 a3 e3 c#4 a3 c#4 a3 e3 c#4 a3 e3 [e3,c#4] [f#3,a3] [e3,c#4] a3, b3 ~, ~ d4@2 ~]/2", Y: "d4!8, g3 f#3",
  Z: "[e4!8 e3 c#4 ~ e3 c#4 a3 ~ a3, a3@2 g#3@3 a3 b3 c#4]/2", AA: "[~@2 a3@2 ~ g#3 a3 b3 ~ a3 a3@2 e3 a3!2 ~, a4]/2",
  AB: "~ g3 [g3,e4]!3 [f#3,d4]!3", // C D
  AC: "[[f#3,d4] [e3,c#4]!4 [d3,b3] [e3,c#4] [c#3,a3]@3 a3@2 ~ [e3,g#3] a3 b3@2 a3 a3@2 e3 a3 a3@2 ~ g3 [g3,e4]!3 [f#3,d4]!3, ~@15 e4@11 ~@6]/4", // D C#m G C#m F#m E C D
  AD: "[[f#3,d4] [e3,c#4]!4 [d3,b3] [e3,c#4] [c#3,a3]@9]/2", AE: "~ c#4 d4 e4", AF: "g4@4 ~@2 c#4 d4, ~ f#4",
  AG: "[e4 d4!2 c#4!3 d4 ~@3 a3@2 b3@2 c#4@2, a4 g#4 a4@2, ~@7 c#4@3 ~@6]/2", AH: "e4 d4", AI: "c#4", AJ: "g#3@3 a3@5",
  AK: "b3@3 c#4@5",
  AL: "[c#4@3 [c#4,d4]@3 ~ e4@2 d4 [d4,e4]@2 c#4!2 d4 ~ a4@8, ~@6 d4@3 ~@3 f#4@2 g#4@2 ~@8, ~@15 c#4@5 ~@4]/3", // Dmaj7 Dsus2
  AM: "g#4 f#4", AN: "e4", AO: "d4 d4@2 d4@2 d4@2 d4, g#3@3 a3@5", AP: "e4 e4@2 e4@3 e4!2, b3@3 c#4@5",
  AQ: "e4@2 e4 e4@3 c#4 d4, c#4@3 d4@4 ~", AR: "e4@2 [d4,e4]@2 c#4 d4 g#4@2, ~@2 f#4 ~",
  AS: "[~ c#4 d4 d4@2 d4@2 ~@2 e4@2 e4@3 e4!2, g#4@3 a4@5 b4@3 a4@5, ~@7 c#4@2 ~@7]/2",
  AT: "e4 e4@2 e4@2 ~ c#4 d4, g#4@3 a4@5", AU: "e4@2 [d4,g#4]@2 c#4!2 d4 c#4, ~@2 f#4 g#4", AV: "d4!7 [d4,e4], g4 f#4",
  AW: "[e4!2 [d4,e4] e4!2 [c#4,e4] [d4,e4] e4 e3 c#4 ~ e3 c#4 a3 ~ a3, a4 g#4 a4@2, ~@3 c#4@2 ~@2 c#4@2 ~ a3@2 b3@2 c#4@2]/2", // Dsus2 C#m Dsus2
  AX: "c#4!8, a4", AY: "[e4,g#4] [d4,f#4]", AZ: "[c#4,e4]",
  BA: "[e4@2 [d4,g#4]@2 c#4!2 d4 ~@3 a3@2 ~ g#3 a3 b3@2 a3 a3@2 e3 a3 a3@2, ~@2 f#4 g#4 a4@2 ~@6, ~@7 c#4@3 ~@14]/3", // Ddim
  BB: "[~@2 [g3,e4]@2 [g3,e4]@2 [g3,e4]@2 [g3,e4]@2 ~ [f#3,d4]@2 [f#3,d4]@2 [f#3,d4]@2 ~ [f#3,d4]@2 [e3,c#4]@3 [e3,c#4]@3 [e3,c#4]@2 [e3,c#4]@3 [d3,b3]@3 [c#3,a3]@3 [d3,b3]@3 ~ [e3,c#4]@38 ~]/5", // C D C#m G F#m G C#m
})).s("gm_acoustic_guitar_steel").gain(0.55).pan(0.2)

// other · acoustic guitar nylon · "Baritone"
const acoustic_guitar_nylon = note(`<
  A B@11 C@2 D E C D C F G H G I B@9 C@2 D E C D C F G H G J K ~@2 L K ~@2 C@2 D E C D C D C M N C D C D C D N D C D N
  B@10 C@2 D E C D C F G H G C D C D C D N D C D N B O ~@5
>`.pickRestart({
  A: "a2@3 e3@3 e3@2", B: "e3@3 e3@3 e3@2", C: "~@2 c#3 ~@2 c#3@3", D: "~@2 d3 ~@2 d3@3", E: "~@2 e3 ~@2 e3@3",
  F: "f#3@2 f#3 f#3@2 f#3@3", G: "e3@2 e3 e3@2 e3@3", H: "d3@2 d3 d3@2 d3@3", I: "c#3", J: "~@2 c#3@2 ~ g#2 a2 b2",
  K: "~ a2 a2@2 e2 a2!2 ~", L: "~@2 a2@2 ~ g#2 a2 b2", M: "~@2 b2 ~@2 b2@3", N: "e3@2 e3@2 e3 e3@3", O: "a2@3 a2 a2@4",
})).s("gm_acoustic_guitar_nylon").gain(0.55).pan(0.2)

// bass · fretless bass · "Bass 2"
const bass = note(`<
  ~@2 A@4 B@2 A@2 B@2 A@2 C D E C E C E F G E@2 A@2 B@2 A@2 B@2 A@2 C D E C E C E F G E A B@2 A@2 B@2 A@2 C D E C E C E
  F G E C E C E F D C E F G A@4 B@2 A@2 B@2 A@2 C D E C E C E F G E C E C E F D C E F G A ~ H@3 ~@2
>`.pickRestart({
  A: "a1@3 a1 a1@4", B: "g1@3 g1 g1@4", C: "d2@3 d2 d2@4", D: "e2@3 e2 e2@4", E: "c#2@3 c#2 c#2@4", F: "b1@3 b1 b1@4",
  G: "e2@2 e2@2 e2 e2@3",
  H: "[~@2 e1@2 e1@2 e1@2 e1@2 ~ f#1@2 f#1@2 f#1@2 ~ f#1@2 g#1@3 g#1@3 g#1@2 g#1@3 b1@3 c#2@3 b1@3 ~ a1@5 ~@2]/3",
})).s("gm_fretless_bass").gain(0.53).pan(0.6)

stack(flute, string_ensemble_1, acoustic_guitar_steel, acoustic_guitar_nylon, bass)

More by Gordon Lightfoot