Strudelify
(I Left My Heart) In San Francisco cover art

1962 · I Left My Heart In San Francisco

(I Left My Heart) In San Francisco

Bennett

KeyG majorTempo62 bpm
0:00/0:00
// (I Left My Heart) In San Francisco — Bennett
// 62 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 5/4 at bar 4, 4/4 at bar 8, 5/4 at bar 9, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 47 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(62/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.

// chords · piano · "A.PIANO 1"
const piano = note("<A B C@8 D@4 E F G@2 H I J@2 ~ K L@2 M@2 ~@2 N O P@2 Q@2 R@2 ~@9>".pickRestart({
  A: "~@20 b5@3 a5@2 ~ b5@5 a5@3 g5@3 ~ a5@5 g5@3 f5@2, ~@14 [a4,c5,f5,c6]@10 ~ [g4,b4]@12 [f4,a4,d5]@10 ~, ~@25 e5@7 ~@16", // F G Dm
  B: "~@2 g5@4 c5@3 d5@3 ~@5 a5@4 ~@3 a5@16 ~@3 a4@5, ~ [e4,g4]@9 ~@2 [e4,f#4,c5]@27 ~@9, ~ c5@3 ~@9 [a4,e5]@26 ~@9", // Em F#m7b5 A5
  C: "[~ c5@6 ~@12 a4@9 ~@19 g6@17 ~@2 [a3,c4]@18 ~@5 g4@7 ~ [e5,g5]@21 ~@3 e4@4 d4@4 e4@2 ~@7 b3@8 ~@13 d4@5 ~@2 [a3,c4]@13 [e2,e3,g#3,d4]@12 ~@12 e4@2 a4@3 ~@4 c5@3 ~ c5@16 ~@2 e5@6 ~@3 d5@3 ~@7 g5@13 ~@25 c6@32 ~@7 [c4,d4,d#4,g4]@18 ~@4 g4@3 f#4@2 f4@3 d#4@22 ~@2, ~@7 [a3,e4,g4]@21 ~ [g3,b3,g#4]@35 ~ [d2,d3,f3]@19 ~@3 [c3,b3]@32 ~@2 [f2,a2,c3]@9 ~@2 [g2,b2,d3]@17 ~@3 g2@30 ~@9 a2@20 a4@21 ~ c5@3 ~@4 c#5@5 ~@40 d4@36 ~@63, ~@7 e5@7 g5@10 ~@8 e5@31 ~@33 b4@23 ~@12 f4@6 ~@17 e3@24 ~@18 e3@19 ~@19 d5@2 ~@10 e5@8 ~@34 f4@33 ~@63, ~@8 c4@19 ~@3 [f4,b4]@34 ~@24 [g3,e4]@11 ~@36 d4@5 ~@8 c2@33 ~@19 c4@8 c5 [d3,c4,e4,f#4]@23 ~@93 c3@22 ~ [c3,d#3,f#3]@35 ~, ~@46 g5@18 ~@92 g3@2 b3@7 ~@34 a3@16 ~@18 [a3,c4,d4,f4]@11 ~@3 [g3,b3,d4,f4]@21 ~@11 [f3,g#3,c4]@44 ~@25 g#2@28 ~@8]/8", // Am Em Am E7 Cm A7 G Dm …
  D: "[~ f#4@12 ~ d4@4 ~@3 d4@3 ~@2 f4@7 e4@4 ~ [e3,b3,d4]@22 ~@25 e4@18 ~@30 e6@22 ~@37, [g2,b2,d3]@25 d3@17 ~@21 a2@40 ~@19 c6@8 [g4,f5,g#5]@25 ~@37, [e4,f4]@2 ~@16 d5@6 ~ e2@33 ~@12 a3@33 ~@16 g5@12 ~@61, ~@25 [d4,e4]@2 ~@10 g#3@23 ~@7 e3@8 e4@3 c5@25 ~@7 g4@15 g6@12 ~@55, ~@72 c4@30 ~@14 c5@15 [b4,d5]@23 ~@38]/4", // E7 G C# Fmaj7 Dsus2 Bm
  E: "~@11 c5@3 e5@4 g5@2 c6@3 ~ b5@15 ~@3 g5@6", F: "a5@7 ~@17",
  G: "[~@13 d5@3 f5@3 a5@3 d6@3 ~ c6@13 ~@2 a5@6 b5@14 ~@35]/2", H: "~@12 d5@3 f5@3 a5@3 d6@3 ~ c#6@13 ~@4 a5@6",
  I: "c6@19 ~@29", J: "[~@11 c5@3 ~ e5@2 g5@3 c6@3 ~ b5@16 ~@2 g5@5 a5@19 ~@30]/2",
  K: "g5@6 f5@9 ~ e5@3 f5@4 g5@22 ~@3",
  L: "[~@24 b5@6 a5@9 g5@4 a5@4 b5@14 ~@10 c#5@22 ~@3, ~@69 e5@2 ~@25, ~@35 d5 ~@12]/2",
  M: "[~@17 e5@2 g5@2 a5@3 g5@18 e5@5 f#5@35 ~@14, ~@12 a4@5 ~@79, ~@15 c5@5 ~@76]/2",
  N: "~@12 c5@3 e5@3 g5@2 c6@4 b5@18 g5@6", O: "a5@7 ~@9",
  P: "[~@12 d5@3 ~@2 a5@3 d6@4 c6@17 ~ a5@5 b5@14 ~@35, ~@15 f5@4 ~@77]/2",
  Q: "[~@15 f5@3 a5@3 e6@4 d6@16 a5@6 b5@25 ~@24, ~@13 d5@5 ~@78]/2",
  R: "[~@11 b4@3 d5@3 f#5@3 b5@3 a5@14 ~@4 f#5@6 g#5@22 ~@27]/2",
})).s("gm_piano").gain(0.33).pan(0.2)

// bass · acoustic bass · "ACOU BASS"
const bass = note("<~@14 A B C@2 D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE ~>".pickRestart({
  A: "c2@19 ~@5 g2@21 ~@3", B: "e2@7 ~ d#2@7 ~", C: "d2@21 ~@3 g2@20 ~@4", D: "d2@7 ~ a2@7 ~", E: "d2@20 ~@4 g2@21 ~@3",
  F: "c2@22 ~@2 g2@19 ~@5", G: "c3@16 g2@4 c2@4 d2@12 d#2@11 ~", H: "e2@19 ~@5 c2@21 ~@3", I: "c2@23 ~ b1@21 ~@3",
  J: "e2@22 ~@2 b1@17 ~@3 b1@4", K: "e1@23 ~ e2@22 ~@2", L: "g2@22 ~@2 g2@23 ~", M: "d2@22 ~@2 d2@21 ~@3",
  N: "g2@21 ~@3 c#2@17 ~@3 c#2@4", O: "d2@5 ~@43", P: "c2@23 ~ g2@22 ~@2", Q: "e2@23 ~ d#2@22 ~@2",
  R: "d2@23 ~ g2@22 ~@2", S: "d2@8 g1@7 ~", T: "g1@23 ~ g2@21 ~@3", U: "g2@23 ~ g2@24", V: "~@10 b2@2 b1@9 ~ b1@2",
  W: "e2@12 e1@11 ~", X: "a2@17 ~@3 e2@4 a1@17 ~@3 e2@4", Y: "a2@9 ~ e2@2 a1@10 ~@2", Z: "d2@21 ~@3 a2@22 ~@2",
  AA: "d2@21 ~@3 d2@20 ~@4", AB: "g2@15 ~", AC: "g2", AD: "~ c2 a#1@2", AE: "c2",
})).s("gm_acoustic_bass").gain(0.38)

// chords · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note("<~@14 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB ~@5>".pickRestart({
  A: "[g3,c4,e4]@8 ~@4 [g3,c4,e4]@7 ~@5 [g3,b3,e4]@8 ~@4 [g3,b3]@8 ~@4", // C Em G
  B: "[g3,a3,e4]@8 ~@4 [g3,a3,e4]@8 ~@4 [f#3,a3]@8 ~@4 [f#3,a3,d#4]@9 ~@3", // A7 F#m D#dim
  C: "[f3,a3]@7 ~@5 [f3,d4]@8 ~@4 [f3,d4]@8 ~@4 [f3,a3,d4]@8 ~@4", // F Dm
  D: "[f3,a3,d4]@9 ~@3 [f3,a3,d4]@8 ~@4 [f3,g#3,d4]@11 ~ [f3,g3,d4]@10 ~@2", // Dm Ddim G7
  E: "[f3,a3,d4]@8 ~@4 [f3,a3,d4]@9 ~@3 [f3,a3,c#4]@8 ~@4 [f3,a3,c#4]@8 ~@4", // Dm Faug
  F: "[f3,a3,c4]@7 ~@5 [f3,a3,c4]@8 ~@4 [f3,b3,d#4]@10 ~@2 [f3,b3,d#4]@8 ~@4", // F Fm7b5
  G: "[g3,c4]@9 ~@3 [g3,c4]@8 ~@4 [g3,b3]@9 ~@3 [g3,b3]@7 ~@5", // C5 G
  H: "[g3,a3,e4]@8 ~@4 [g3,a3]@7 ~@5 [f3,a3,d4]@9 ~@3 [f#3,a3,d#4]@11 ~", // A7 Gsus2 Dm D#dim
  I: "g3@9 ~@3 [g3,b3,e4]@8 ~@4 [g3,e4]@8 ~@4 [g3,a3]@8 ~@4", // Em C Gsus2
  J: "g3@8 ~@4 [g3,b3]@7 ~@5 [g3,b3]@8 ~@4 [g3,b3,d#4]@7 ~@5, ~@6 d#4 ~@5", // G Gaug
  K: "[g3,b3]@8 ~@4 [g3,b3]@9 ~@3 [g3,b3]@7 ~@5 [g3,b3]@7 ~@5", // G
  L: "[g3,b3,d4]@8 ~@4 [g3,b3,d4]@7 ~ g3@3 ~ [g3,b3,c#4]@8 ~@4 [g3,b3,c#4]@7 ~@5", // G C#m7b5
  M: "[a3,c4]@8 ~@4 a3@7 ~@5 [a3,c4]@7 ~@5 [a3,c4,e4]@7 ~@5", // Am
  N: "[f#3,d4]@9 ~@3 f#3@7 ~@5 [f#3,c4,d4]@8 ~@4 [f#3,c4]@7 ~@5", // D D7 F#dim
  O: "[g3,c4,d4]@9 ~@3 [g3,c4,d4]@7 ~@5 [e3,a#3,c#4]@8 ~@4 e3@8 ~@4, ~@35 [a#3,c#4]@9 ~@4", P: "[f3,a3,d4] ~@11",
  Q: "[g3,c4,e4]@9 ~@3 [g3,c4]@8 ~@4 [g3,b3,e4]@10 ~@2 [g3,b3,e4]@8 ~@4", // C C5 Em
  R: "[g3,a3,e4]@2 ~ [g3,a3,e4]@2 ~ [f#3,a3,d#4]@2 ~ [f#3,a3,d#4]@2 ~", // A7 D#dim
  S: "[f3,d4]@2 ~ [f3,d4]@2 ~ [f3,a3,d4]@2 ~ [f3,d4]@2 ~", // Dm
  T: "[f3,a3,d4]@8 ~@4 [f3,a3,d4]@7 ~@5 [f3,g#3,d4]@11 ~ g3@7 ~@5, ~@9 f3 ~@2", // Dm Ddim
  U: "[g3,b3,c#4]@9 ~@3 [g3,b3,d4]@8 ~@4 g3@7 ~@5 [g3,b3]@7 ~@5", // C#m7b5 G
  V: "[g3,b3,c#4]@8 ~@4 [g3,b3,d4]@8 ~@4 [g3,e4]@8 ~@4 [g3,b3]@7 ~@5", // C#m7b5 G C G
  W: "[a3,d4]@4 ~@2 [a3,d4]@4 ~@2 [a3,f#4]@4 ~@2 [a3,d4]@5 ~", // D5 D D5
  X: "[g#3,d4,e4]@2 ~ [g#3,d4]@2 ~ [g#3,d4]@2 ~ [d4,e4]@2 ~", // E7 G#dim Dsus2
  Y: "[g3,c#4,f4]@8 ~@4 [g3,c#4,f4]@8 ~@4 g3@7 ~@6 g3@6 ~@5, ~@9 [c#4,e4]@2 ~", // Gm7b5 C#m
  Z: "[g3,f4]@8 ~@5 g3@7 ~@4 [g3,c#4]@7 ~@5 [g3,e4]@7 ~@5, ~@12 [c#4,f4]@8 ~@15 c#4@8 ~@5", // G7 Gdim C C#
  AA: "[a3,d4]@9 ~@3 [a3,d4]@11 ~ [b3,d4,g4]@7 ~@5 [b3,d4]@8 ~@4", // D5 G Bm
  AB: "[b3,d4]@7 ~@5 [b3,d4,g#4]@9 ~@3 [b3,d4]@8 ~@4 [b3,d4]@10 ~@2", // Bm G#dim Bm
})).s("gm_acoustic_guitar_nylon").gain(0.22).pan(0.8)

// chords · acoustic guitar nylon · "NYLON GTR" · soft notes
const acoustic_guitar_nylon_2 = note("<~@14 A ~ B ~@3 C D E F G ~ H I ~@2 J ~ K L M N O P Q R S T ~@5>".pickRestart({
  A: "~@6 e4 ~", B: "~@3 a3@2 ~ a3@2 ~@4", C: "e4@9 ~@3 e4@8 ~@4 e4@9 ~@3 e4@7 ~@5", D: "~@12 e4@7 ~@29",
  E: "[b3,e4]@9 ~@15 a3@8 ~@4 e4@8 ~@4", F: "[b3,e4]@8 ~@4 e4@7 ~@29", G: "~@12 e4@9 ~@15 d#4@4 ~@8",
  H: "e4@8 ~@4 [c4,e4]@7 ~@5 e4@7 ~@17", I: "c4@11 ~ [c4,d4]@7 ~@29", J: "~@3 e4@2 ~@7", K: "a3@2 ~ a3@2 ~@4 a3@2 ~",
  L: "~@36 d4@5 ~@7", M: "~@24 b3@7 ~@5 e4@7 ~@5", N: "~@24 b3@8 ~@4 e4@7 ~@5", O: "f#4@2 ~ f#4@2 ~ d4@2 ~@4",
  P: "~@9 g#3@2 ~", Q: "~@24 [c#4,e4]@7 ~@17", R: "c#4 ~@5", S: "f#4@9 ~@3 f#4@11 ~@13 g4@8 ~@4",
  T: "g#4@7 ~@17 a4@8 ~@4 a4@10 ~@2",
})).s("gm_acoustic_guitar_nylon").gain(0.11).pan(0.8)

// other · vibraphone
const vibraphone = note("<~@14 A B C D E F@2 G ~ H I J K L M N O P C D Q R S T U V W X Y Z AA AB ~>".pickRestart({
  A: "c4@23 ~ b3@24", B: "d4@23 ~ c4@21 ~@3", C: "c4", D: "b3@11 ~", E: "d4@23 c#4@24 ~", F: "c4@24 b3@23 ~",
  G: "a3@25 ~@23", H: "b3@23 ~ a3@23 ~", I: "e4@23 ~ d#4@24", J: "d4@12 c#4@11 ~", K: "g4@47 ~", L: "f#4@23 ~",
  M: "[f4,a4]@24 [c#4,e4]@23 ~", N: "[d4,f4] ~@11", O: "c4 b3", P: "d4@23 ~ c4@22 ~@2", Q: "c#4@12 d4@24 e4@11 ~",
  R: "c#4@3 d4@8 ~", S: "f#4@15 ~", T: "e4@5 ~", U: "f4@23 ~ e4@24", V: "f4@8 e4@7 ~", W: "f#4 g4", X: "g#4@6 a4@5 ~",
  Y: "a4@43 ~@5", Z: "g#4", AA: "~ e4 g4@2", AB: "a4@23 ~",
})).s("gm_vibraphone").gain(0.33).pan(1)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<~@14 A B@3 C@4 D E F@2 G@2 H I J K@3 L M N@2 ~@2 O@4 P Q ~>".pickRestart({
  A: "c4 b3, [g3,e4]", B: "[[a3,g4] [d#4,f#4] ~@2 b3@2, c4@97 ~@47, ~ [d4,f4]@2]/3",
  C: "[d4@23 c#4@25 c4@24 [b3,d#4]@24 c4@23 b3@25 a3@23 ~@25, [a3,f4]@72 g3@97 ~@23, ~@4 e4@3 ~]/4", // B Dm
  D: "b4 a4, [c4,g4]", E: "[c4,e4] [b3,d#4], g3", F: "[[g3,e4]@24 d#4@24 d4@24 c#4@23 ~, b3@95 ~, ~ g4@3]/2",
  G: "[c4@24 ~@24 d4@47 ~, a3, [e4,g4]@47 f#4@48 ~, ~@24 c4@71 ~]/2", H: "[c4,d4,f4]@23 ~ e4@24, ~@23 c#4@25",
  I: "[d4,f4]@5 ~@43", J: "c4@23 b3@25, [g3,e4]",
  K: "[[a3,g4]@24 [d#4,f#4]@23 ~@49 b3@48, c4@2 ~, ~@47 d4@96 ~, ~ f4@2]/3", L: "c#4 d4@2 e4, [g3,b3]",
  M: "c#4@11 d4@36 ~, [g3,b3]", N: "[[f#4,a4]@47 [e4,g#4]@35 ~@14, d4@83 ~@13]/2",
  O: "[~@11 [f5,g#5]@6 [f#5,a5]@6 [b5,d6]@6 [a5,c6]@6 [g#5,b5]@6 [a5,c6]@6 ~@39 g4 a4 [b4,c5] [d5,e5] [f5,g5] a5 b5 [d6,e6] [f6,g6] [c6,a6]@49 ~ b5@47, ~@47 e6@45 ~@52 g#6@48, ~@24 c6@22 c6 ~@49]/4", // Fm F#m Bm Am G#m Am Cmaj7 Dsus2 …
  P: "~@12 c6@5 ~ e4@5 [a4,g6]@6 [g4,f6]@6 [d4,d6]@7 [g4,c6]@6, ~@11 d4@6 d6@7 ~@24", Q: "[a4,d6]@15 ~",
})).s("gm_string_ensemble_1").gain(0.22).pan(0.4)

// other · flute
const flute = note("<~@23 A B C D@2 E F ~@17>".pickRestart({
  A: "g4@7 f4@8 ~ e4@3 f4@5 g4@21 ~@3", B: "~@24 b4@6 ~ a4@8 g4@4 a4@5",
  C: "b4@21 ~@2 e4 c#4@23 ~, ~@21 a4@2 f4@2 ~@23, ~@11 g4 ~@12",
  D: "[~@11 a3@3 c4@3 ~@2 g4@3 a4@3 g4@16 e4@6 f#4@37 ~@12, ~@17 e4@4 ~@75]/2",
  E: "~@11 a4@8 ~@4 c#4@25, ~@19 g4@2 e4@2 ~@25, ~@10 f4 d4 ~@12", F: "d4@7 ~@41",
})).s("gm_flute").gain(0.27).pan(0.8)

// chords · trombone
const trombone = note("<~@38 A@4 B@2 C D ~>".pickRestart({
  A: "[f4@23 e4@24 f4@25 e4@23 f#4@24 g4@25 g#4@23 a4@22 ~@3, [a2,a3,c#4]@95 [d3,d4]@95 ~@2]/4", // A D
  B: "[[c4,a4]@24 [b3,g#4]@23 ~, f4@47 ~]/2", C: "~@12 [g3,c4,e4]@11 [f3,a#3,d4]@25", D: "[g3,c4,e4]@47 ~",
})).s("gm_trombone").gain(0.27).pan(0.7)

// drums · hihat
const hihat = s("hh").struct("<~@14 A B@2 A B@11 C B@7 A B@4 ~@5>".pickRestart({
  A: "x!2 ~ x", B: "~ x ~ x", C: "x",
})).gain(0.38)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@14 A B@2 A B@11 C B@7 A ~@9>".pickRestart({
  A: "~ x", B: "x!2", C: "x",
})).gain(0.22)

// drums · ride
const ride = s("rd").struct("<~@38 [x ~@2 x ~ x!2 ~@2 x ~ x]!4 x ~@4>").gain(0.27)

stack(
  piano, bass, acoustic_guitar_nylon, acoustic_guitar_nylon_2, vibraphone, string_ensemble_1, flute, trombone, hihat,
  hihat_soft, ride
)

More by Bennett