Strudelify

What Is This Thing Called Love?

Frank Sinatra

KeyA minorTempo70 bpm
0:00/0:00
// What Is This Thing Called Love? — Frank Sinatra
// 70 bpm, 2/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/4 at bar 1, 2/4 at bar 1, 1/16 at bar 2, 2/4 at bar 2) are rendered on a constant 2/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 83 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/2)

// 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@4 B@2 C@3 D E F@2 G H G I J K L@2 M@2 N O P H P Q K H K R@3 S T N O U V W@2 K X@2 Y Z AA AB@2 AC AD AE AF AG AH AI
  ~@3 AJ AK K I J AL AM AN AO@2 ~@12
>`.pickRestart({
  A: "[~@13 a1@27 ~@7 e2@13 ~@3 a2@13 ~@4 e2@26 ~@7 a1@13 ~@2]/4", B: "[e2@9 ~@7 f1@45 ~@3]/2",
  C: "[c2@13 ~@3 f2@27 ~@5 f1@22 ~@18 e2@2 ~@6]/3", D: "e2@9 ~@7 c2@2 ~@7 c2@7", E: "~@4 c2 ~@3 b1 ~@3 b1@4",
  F: "[~@4 b1@2 ~@2 e1@15 ~@9]/2", G: "a1@31 ~", H: "e2", I: "e2@16 a1@15 ~", J: "d1", K: "a1", L: "[d1@31 a1@32 ~]/2",
  M: "[e1@30 ~ b1@27 e2@6]/2", N: "e1", O: "~ b1@31", P: "~ a1@31", Q: "e2 a2",
  R: "[e2@16 a1@14 ~ d1@31 ~ a1@26 ~@2 d2@5]/3", S: "~ d1@31", T: "a1@14 ~ d1@16 ~", U: "~ e1@30 ~", V: "b1 e1",
  W: "[a1@31 e2@32 ~]/2", X: "[e2@15 a1@12 ~@4 d2@28 ~@5]/2", Y: "d2@3 ~ d2@3 ~", Z: "~ d2@26 ~@5",
  AA: "d2@12 ~@4 d2@13 ~@3", AB: "[g1@31 b1@16 d2@17]/2", AC: "~ g1@31", AD: "d2 g1", AE: "f1@7 ~", AF: "f1 c2",
  AG: "f1@5 ~@3", AH: "~ f1", AI: "~ e1@31", AJ: "~ a1@21 ~@5 a1@5", AK: "e2@31 ~", AL: "~ a1@25 d2@6", AM: "d1@15 ~",
  AN: "a1@16 d1@15 ~", AO: "[e1@63 ~]/2",
})).s("gm_acoustic_bass").gain(0.48)

// chords · piano · "Keyboard"
const piano = note("<A@8 ~ B C D ~@71>".pickRestart({
  A: "[~@64 c4@16 c4@31 ~ g4@25 ~@23 [d#5,g5]@31 [g#3,c4,d#4]@3 ~@13 [g#3,c4,e4]@22 ~@12 f4@15, ~@12 a3@64 ~@35 c4@25 ~@7 g3@16 c5@34 ~@63, ~@13 c4@51 f4@64 ~@16 g#3@36 ~@59 [g#3,c4]@17, ~@15 e4@64 ~ f#4@56 ~@9 [c4,d#4]@37 ~@74, ~@157 a#4@35 ~@64]/8", // D# G# G#aug G# Cm
  B: "~@8 [b4,e5]@21 ~@3", C: "[b4,e5]@13 ~@3", D: "[b4,e5]@5 ~@3",
})).s("gm_piano").gain(0.48)

// chords · electric guitar jazz · "Guitar"
const electric_guitar_jazz = note("<~@52 A@3 ~@28>".pickRestart({
  A: "[~@17 d4@6 ~@10 [a3,c4]@38 ~@25, ~@14 g3@9 ~@8 f3@38 ~@27, ~@15 a3@7 ~@10 g3@39 ~@25, ~@16 c4@7 ~@73]/3", // Am
})).s("gm_electric_guitar_jazz").gain(0.22)

// chords · viola · "Strings 1"
const viola = note("<~@8 A B C D@2 ~@20 E@2 F@4 G@2 H@2 I@4 ~@14 J@6 K@2 L@4 ~@10>".pickRestart({
  A: "~@12 [e3,b3,e4] ~@3, ~@23 [a4,e5]@2 ~@7", // E5 A5
  B: "[e3,b3,e4,a4,e5]@12 ~@5 [a#3,e4]@2 ~@5 [a#3,e4,a4,e5]@8, ~@16 [c3,a4,e5]@2 ~@5 c3@9", // Esus4 A#dim A Am
  C: "~@4 [e4,a4] ~@3 a3 ~@3 a3@4, ~@7 [c3,e5]@2 ~@6 [b2,e4,a4,e5]@3 ~@5 [b2,e4,a4,e5]@9, ~@2 a#3 ~@5", // A5 C Esus4
  D: "[~@8 a3@4 ~@4 g#3@23 ~@25, ~@7 [b2,e4,a4,e5]@3 ~@5 [a#2,g#4,e5]@31 ~@18, ~@15 e4@23 ~@26]/2", // Esus4 A#m7b5
  E: "[~@14 e5@4 d5@4 a4@3 ~ f4@4 e5@25 ~ d5@7 ~]/2",
  F: "[e5@4 d5@4 a4@4 f4@4 e5@22 ~ d5@7 a4@7 ~ d4@9 g#4@39 a4@5 b4@4 ~ c5@6 b4@5 a4@5]/4", G: "[g#4@39 ~@25]/2",
  H: "[~@18 a5@4 e5@4 ~ c#5@3 ~ b5@25 a5@7 ~, ~@15 b5@5 ~@44]/2",
  I: "[b5@4 a5@4 e5@4 c#5@4 b4@3 a4@3 ~ e4@3 ~ c#4@2 ~@2 b3@8 c#4@8 e4@7 ~ e5@56 ~@17]/4",
  J: "[[c#4,e4]@37 [c4,d#4]@6 [b3,d4]@5 [a#3,c#4]@5 [b3,d4]@4 ~ d#4@5 ~ c#4@30 ~ [e4,g4]@32 [d4,f4]@48 e4@16 ~, a3@21 ~@36 c4@6 e4@31 ~@98]/6", // C#m Cm Bm A#m Bm Em Dm
  K: "[[d4,f4]@15 e4 e4@15 [d4,f4]@15 ~ e4 e4@16]/2", L: "[b3@63 ~ e4@50 ~@14, ~@63 e3@50 ~@15]/4",
})).s("gm_viola").gain(0.33)

// chords · string ensemble 2 · "Strings 2"
const string_ensemble_2 = note(`<
  A@4 B@6 C D E@4 F@8 G@4 H@4 I@5 J@7 K@3 ~@14 L@2 M@6 N@4 ~ O@2 P@2 Q@3 R@2
>`.pickRestart({
  A: "[~@16 e4@48 f4@15 ~ [d#4,f#4]@29 ~@2 e4@17, ~ a3@7, ~@16 c4@62 ~@31 g4@19]/4", // D#m
  B: "[~@47 d#4@29 ~ e4@32 f4@28 ~@14 e3@5 ~@3 [e3,e4]@12 ~@4 [e3,e4]@3 ~@5 [e3,e4]@9, ~@31 f3@106 ~@55, ~@31 d4@16 ~@104 e4@3 ~@38, ~@8 c4@25 ~@15]/6", // E
  C: "~@7 [e3,e4]@3 ~@5 [e3,e4]@3 ~@5 [e3,e4]@9", D: "~@4 e3 ~@3 e4@8, ~@7 e4@3 ~@5 e3@17", E: "[~@7 e4@25]/4",
  F: "[~@31 f4@128 e4@97]/8", G: "[~@15 c#4@49]/4", H: "[~@15 a3@49]/4",
  I: "[~@47 e6@4 ~@3 a5@4 f5@4 e6@25 ~ d6@7 e6@5 ~@4 a5@4 f5@5 e6@21 d6@8 a5@8 d5@8 ~ g#5, ~@31 d4@127 ~@2, ~@51 d6@5 ~@44 d6@8 ~@52]/5",
  J: "[~@36 a5@6 b5@5 c6@6 b5@5 a5@5 ~ g#5@49 ~@33 a5@5 e5@4 c#5@3 ~ b5@25 a5@7 ~ b5@5 a5@3 e5@3 ~ c#5@4 b4@3 a4@3 ~ e4@3 ~ c#4@2 ~@2 b3, b3@123 ~@4 a3@97, ~@143 b5@5 ~@76]/7",
  K: "[~@7 c#4@8 e4@7 ~ e5@56 ~@17]/3", L: "[[a3,c#4]@38 c4@6 b3@5 a#3@5 b3@5 c4@5]/2",
  M: "[~@30 e4@32 ~@4 d4@44 ~ e4@16 f4@16 e4@16 d4@14 ~ e4@17 ~, ~ c#4@55 ~@7 f4@47 ~@82]/6", N: "[b3@31 e3@27 ~@6]/4",
  O: "[~@15 e4@15 f#4@16 ~ g4@14 ~@3, a2@63 ~]/2", P: "[~@15 d4@15 ~ e4@17 f4@13 ~@3, f2@61 ~@3]/2",
  Q: "[~@8 b3@5 ~@3 b3@70 ~@10, e2@95 ~]/3", R: "[[a2,a3]@49 ~@15, c#4@55 ~@9]/2",
})).s("gm_string_ensemble_2").gain(0.48)

// other · string ensemble 2 · "Strings 3"
const string_ensemble_2_2 = note("<~@12 A@5 B@3 C@7 D@6 E@4 F@2 G@2 H@2 I J ~@38>".pickRestart({
  A: "[~@30 g3@39 ~ f#3@4 ~ f3@4 e3@5 f3@5 f#3@5 ~ g3@48 g3@16 ~]/5", B: "[~ a3@46 b3@16 c4@15 ~ b3@16 a#3]/3",
  C: "[~@15 b3@16 g#3@115 ~@13 e3@48 ~ f#3@16]/7",
  D: "[g#3@15 f#3@16 e3@15 ~ f#3@11 ~@5 e3@38 f3@4 ~ f#3@5 g3@5 f#3@5 f3@6 e3@48 g3@16 ~]/6",
  E: "[d3@31 e3@32 f3@16 e3@16 d#3@16 ~ e3@14 ~@2]/4", F: "[g#3@3 a3]/2", G: "[g#3@51 ~@13]/2", H: "[e3@47 f#3@17]/2",
  I: "g#3@15 f#3@16 ~", J: "e3@15 f#3@8 ~@9",
})).s("gm_string_ensemble_2").gain(0.48).pan(0.7)

// other · tremolo strings · "Strings 4"
const tremolo_strings = note("<~@54 A@3 B@3 ~@14 C@2 D@2 E@3 ~@2>".pickRestart({
  A: "[~@8 c6@8 a5@8 c6@7 d6 d6@62 ~@2, ~@31 f5@62 ~@3]/3",
  B: "[~@16 [b3,b5]@7 ~ a#3@7 ~ g#3@7 ~ f3@7 [e3,e5]@8 ~ d3@7 ~ b4@2 ~@30, ~@8 d6@15 a#5@8 g#5@8 f5@9 ~@7 d5@8 b2@2 ~@31]/3", // B E
  C: "[~@15 e4@15 ~ f#4@16 g4@11 ~@6]/2", D: "[~@15 d4@15 ~ e4@15 ~ f4@15 ~@2]/2", E: "[~@8 e4@25 ~@15]/3",
})).s("gm_tremolo_strings").gain(0.56)

// other · tremolo strings · "Strings 4" · soft notes
const tremolo_strings_soft = note("<~@53 [~@24 c6@7 ~] [~ a5@4 ~@11] ~@2 [~@8 d4@11 ~@13] ~@20 [~@9 e4@2 ~@21] ~@4>")
  .s("gm_tremolo_strings").gain(0.32)

// other · string ensemble 1 · "Strings 5"
const string_ensemble_1 = note("<~@12 A@5 B@3 C D@8 ~@13 E@3 ~@29 F@2 G H I@2 ~@3>".pickRestart({
  A: "[~@31 c#4@38 d4@5 d#4@5 e4@5 d#4@5 ~ d4@5 c#4@48 e4@17]/5", B: "[~ d4@45 ~ e4@16 f4@31 ~@2]/3",
  C: "e4@15 d4@16 ~", D: "[b3@110 ~ e4@15 ~ c#4@35 ~@3 c#4@5 d4@4 ~@2 e4@5 d#4@4 d4@6 c#4@52 ~@13]/8",
  E: "[~@5 c#4@5 ~ d4@5 e4@5 d4@9 c#4@53 ~@13]/3", F: "[~@15 e5@16 f#5@16 g5@13 ~@4]/2", G: "~ d5",
  H: "e5@15 f5@12 ~@5", I: "[~@8 b4@2 ~@7 b4@46 ~]/2",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.4)

// other · string ensemble 1 · "Strings 6"
const string_ensemble_1_2 = note("<~@44 A@5 B@3 C ~@21 D@4 ~@5>".pickRestart({
  A: "[~@31 [c4,e4]@127 ~@2]/5", B: "[~@24 d3@7 f#3@7 e3@7 ~ c#3@9 d3@7 ~ f#3@4 e3@4 ~ c#3@4 d3@4 e3@8 e4@7 ~]/3",
  C: "b3@25 ~@7", D: "[~ [e3,a3]@55 ~@7 [f4,a4]@61 ~@4]/4",
})).s("gm_string_ensemble_1").gain(0.3).pan(0.6)

// other · alto sax · "Sax"
const alto_sax = note(`<
  A B C D E F@2 G@4 ~@6 H I@3 J K L@2 M N O@5 P@4 Q R@4 ~@24 S T U@2 V@2 W@3 X@4 Y Z@2 ~@2
>`.pickRestart({
  A: "~@29 b5@3", B: "~ a5@4 e5@4 c5@3 ~ b5@19", C: "~@9 a5@3 ~@4 b5@4 a5@4 ~@3 c5@3 ~@2, ~@24 e5@5 ~@3",
  D: "b5@22 ~@2 a5@7 ~", E: "e5@8 ~ c5@7 ~@16", F: "[g5@4 f5@4 c5@4 g4@4 ~ g5@22 ~ f5@5 ~@3 g5@3 f5@5 c5@4 g4@4]/2",
  G: "[g5@22 ~@2 f5@6 ~ c5@8 ~ g#4@7 ~@2 e5@52 ~@27]/4", H: "~@4 e5 d5 a4 f4",
  I: "[e5@24 d5@7 e5@4 d5@4 a4@5 f4@4 e5@23 d5@8 a4@8 d4@8 ~]/3", J: "g#4", K: "~@6 g#4@4 ~ a4@4 ~ c5@6 b4@5 a4@4 ~",
  L: "[g#4@3 ~]/2", M: "~@16 b4@4 a4@3 e4@4 c#4@4 ~", N: "b4@26 a4@5 ~",
  O: "[~@5 a4@4 e4@4 c#4@3 b4@8 e5@7 c#5@31 ~@2 e4@37 [d#4,f#4]@5 ~ f4@5 [c#4,e4]@5 ~ d4@4 d#4@4 ~ [e4,g4]@33, ~@2 b4@5 ~@56 g4@38 ~@5 d4@5 ~@6 f4@5 ~@38]/5", // D#m C#m Em
  P: "[~ f#4@15 [e4,g4]@15 [d4,f4]@70 [c#4,e4]@5 ~ c4@5 [b3,d4]@5 [c4,d#4]@5 c#4@5 ~, d#4@15 ~@113]/4", Q: "d4@29 ~@3",
  R: "[d4@61 ~@3, b3@113 ~@15]/4", S: "~@16 e5@4 d5@4 ~@3 f4@4 ~, ~@24 a4@5 ~@3", T: "e5@25 d5@7",
  U: "[~ e5@4 d5@4 ~@3 f4@4 e5@23 d5@8 a4@9 d4@7 ~, ~@9 a4@5 ~@50]/2",
  V: "[f4@31 g5@4 e5@3 c5@4 a4@3 ~ g4@4 e4@5 ~@4 e4@5, ~@55 [d3,d4]@8 ~]/2", // D
  W: "[g4@7 ~ c5@7 ~ e5@46 ~@34, e3@7 ~, ~@16 c5 ~@79]/3",
  X: "[~@16 b5@3 a5@4 e5@4 c#5@4 b5@19 a5@5 e5@4 c#5@4 f5@5 e5@3 d5@6 ~@3 f5@23 ~ e5@7 ~ d5@8 a4@3 ~@5]/4",
  Y: "f4@2 e4@2 f4@2 ~ f4@2 ~@2 f4@2 ~ f4@2 ~ f4@2 e4 f4@2 ~ f4@2 ~ f4@2 e4 f4@2 e4, ~@6 e4@2 ~@2 e4@2 ~ e4@2 ~ e4@2 ~@7 e4@2 ~@5",
  Z: "[f4@2 e4 ~@3 f4@2 e4@2 ~ e4 ~@2 e4 f4@2 e4 f4 ~@3 e4 ~@2 e4@35 ~@4, ~@10 f4@2 ~ f4@2 ~@5 f4@7 ~@37]/2",
})).s("gm_alto_sax").gain(0.39)

// other · alto sax · "Sax" · soft notes
const alto_sax_soft = note("<~@20 A ~@9 B ~@4 C D ~@36 E ~@4 F G ~@3>".pickRestart({
  A: "~@31 g4", B: "~@26 f#4@5 ~", C: "~@11 d#4@5 ~@11 e4@4 ~", D: "f4@31 ~", E: "c6@7 ~", F: "~@11 e4 ~@4",
  G: "~@3 f4@2 e4 ~@14 e4 ~@8 f4@2 ~",
})).s("gm_alto_sax").gain(0.26)

// chords · synth brass 2 · "Brass"
const synth_brass_2 = note("<~@44 A@3 B@2 C@4 D@4 ~@13 E@4 F@2 G@2 H@5>".pickRestart({
  A: "[~@31 [f#3,c4,e4]@50 ~@6 d5@3 ~ c5@4 ~, ~@86 d4@4 c4@5 ~]/3", B: "[[g#3,g#4]@27 ~@5]/2",
  C: "[[g3,e4,g4,b4]@115 ~@13]/4", // Em
  D: "[~@16 c4@8 ~@8 a3@8 ~@7 a3@8 ~@9 [f4,a4,c5,d5]@55 ~@9, ~@16 [d4,f4,a4]@47 d4@51 ~@14, ~@24 c4@16 c4@15 c4@48 ~@25]/4", // Dm7 Dm
  E: "[~@15 c4 [c4,f4]@14 ~ e4 [d4,e4]@8 ~@8 g4@6 ~@2 c5@6 ~@2 e5@34 ~@30, ~@15 f3@16 g#3@94 ~@3, ~@32 e3@55 ~@41, ~@20 e4@43 ~]/4", // F5 Dsus2
  F: "a2/2", G: "[~ f2@63]/2",
  H: "[~@16 f4@2 e4@2 ~ e4@2 f4@2 ~ f4@2 ~ f4@2 ~ f4@2 ~ f4@2 f4@2 ~ f4@2 ~ f4@2 ~ f4@2 e4 f4@2 e4 f4@2 e4 f4@3 e4@33 ~@4 a2@58 ~@7, e2@23 ~@17, ~@10 f4 ~@3 e4 ~@65]/5",
})).s("gm_synth_brass_2").gain(0.17)

// chords · synth brass 2 · "Brass" · soft notes
const synth_brass_2_soft = note("<~@49 A@4 ~@25 B C ~@3>".pickRestart({
  A: "[d4@57 ~@7]/4", B: "~@12 e4 ~@2 e4", C: "~ e4@2 ~ e4@2 ~ e4@2 ~ e4@2 ~ e4@2 ~@17",
})).s("gm_synth_brass_2").gain(0.02)

// chords · orchestral harp · "Harp" · Amaj7 Bsus2 Esus2 Dsus2
const orchestral_harp = note(`<
  ~@54
  [~@15 c#3@2 ~@13 g#5@2, ~@17 d3@2 f#3@2 a3@2 d4@2 [g#4,a4]@2 c#5@2 f#5@2 ~, ~@9 e3 g#3 [b3,c#4] [e4,f#4] b4 [d5,e5] ~]
  [d6 ~@15]
  ~@27
>`).s("gm_orchestral_harp").gain(0.35)

// chords · vibraphone
const vibraphone = note("<~@57 A B@2 ~@23>".pickRestart({
  A: "~ [d5,f5] [b4,d5] [a#4,c#5]", // Dm Bm A#m
  B: "[[g#4,b4]@8 [f4,g#4]@7 [e4,g4]@8 ~@9 [b3,d4]@8 ~@24, ~@12 [d4,f4]@3 g#3@2 ~@15, ~@29 e3@4 ~@31]/2", // G#m Fm Em Bm Dm
})).s("gm_vibraphone").gain(0.3)

// drums · snare
const snare = s("sd").struct("<A B C D ~ C@2 E ~@5 C@44 ~@2 C@11 ~@13>".pickRestart({
  A: "~@13 x ~@18", B: "~@15 x ~@16", C: "~ x", D: "~@11 x ~@5 x ~@14", E: "~@11 x ~@4 x ~@15",
})).gain(0.4)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<[~@11 x ~@20] [~@9 x ~@2 x ~@19] [~ x]!3 [~@11 x ~@4 x ~@15] [~@15 x ~@16]!2 ~@75>")
  .gain(0.16)

// drums · hihat
const hihat = s("hh").struct("<[~@15 x] ~ x!7 ~@4 [x!2]!44 ~@2 [x!2]!11 ~@13>").gain(0.24)

// drums · triangle
const triangle = s("triangles:35").struct("<~@9 [~ x ~@2] x!2 ~@71>").gain(1.39)

stack(
  bass, piano, electric_guitar_jazz, viola, string_ensemble_2, string_ensemble_2_2, tremolo_strings,
  tremolo_strings_soft, string_ensemble_1, string_ensemble_1_2, alto_sax, alto_sax_soft, synth_brass_2,
  synth_brass_2_soft, orchestral_harp, vibraphone, snare, snare_soft, hihat, triangle
)

More by Frank Sinatra