Strudelify
San Franciscan Nights cover art

1967 · Rock My World

San Franciscan Nights

The Animals

KeyC majorTempo93 bpm
0:00/0:00
// San Franciscan Nights — The Animals
// 93 bpm, 4/4, key C major. Source: mcgill + 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, 2/4 at bar 6, 4/4 at bar 6, 2/4 at bar 19, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 87 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(93/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 · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note(`<
  ~@18 A B A B C D@4 E@2 F A B C G@4 E@2 H ~@5 I J I K L M N O P Q A B C G@4 E@2 H ~@5 I J I K L M N O P F I J I K L R@2
>`.pickRestart({
  A: "c5@9 ~@4 d5 c5@2 b4@8 ~@4 b4@2 [b4,c5] ~, ~@6 c5 ~@9", B: "a4@9 ~@3 a4 ~ b4 ~ g4@7 ~@5 d5@4, ~@15 a4@2 ~@15",
  C: "c5@9 ~@3 c5 ~ d5 c5 b4@9 ~@3 b4@2 c5 b4",
  D: "[a4@9 ~@3 a4 b4 ~ g4@9 ~@8 [f#4,a4]@10 ~@6 [f4,a4,c5]@9 ~@7 c5@28 ~@4 [g4,c5]@11 ~@5 [f#4,a4]@11 ~@5, ~@31 d4@10 ~@22 [e4,g4]@28 ~@4 e4@11 ~@5 d4@11 ~@6]/4", // F#m F C5 F#m Em
  E: "[~ c5@9 ~@6 [e4,g4,c5]@11 ~@5 [f#4,a4]@10 ~@6 f4 [f4,c5]@12 ~@3, [f4,a4]@10 ~@21 d4@10 ~@7 a4@12 ~@4, ~@49 g4 ~@14]/2", // C F#m F5 F
  F: "~@8 g4@4 e4@5 ~@7 c5 d5 ~@3 d5@3, ~@4 c5@7 ~@17 c5@2 ~@2",
  G: "[a4@9 ~@4 b4 ~ g4@9 ~@8 [f#4,a4]@10 ~@6 [f4,a4,c5]@9 ~@7 c5@28 ~@4 [g4,c5]@11 ~@5 [f#4,a4]@11 ~@5, ~@12 a4@3 ~@16 d4@10 ~@22 [e4,g4]@28 ~@4 e4@11 ~@5 d4@11 ~@6]/4", // F#m F C5 F#m Em
  H: "~@8 g4@4 e4@5 ~@15, ~@4 c5@7 ~@21", I: "e5 f5 g5 f5 e5 f5 g5 f5 d5 e5 f5 e5 d5 e5 f5 e5",
  J: "c5 d5 e5 d5 c5 d5 e5 d5 b4@5 ~@3", K: "c5 d5 e5 d5 c5 d5 e5 d5 b4@4 ~@4", L: "~ g5 ~ d5 ~ a5 ~ f5, d5 f#5 f5 g5",
  M: "~@2 f5@2 e5@4 [c5,g5]@7 ~, c5@7 ~@9", N: "f5 e5 g5@2 ~ g5 f#5@2, c5 d5", O: "~ a5 g5@2 ~ f5 e5@2, f5 c5",
  P: "~ g5 f#5@2 ~ a5 g5@2, d5 f5", Q: "~@8 g4@4 e4@5 ~@7 c5 d5@3 c5 d5@3, ~@4 c5@7 ~@21",
  R: "[~ f5 e5@2 [c5,g5]@8 ~@4, c5@7 ~@25]/2", // C5
})).s("gm_acoustic_guitar_steel").gain(0.29).pan(0.6)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  A B C D E F@3 G H I J@3 K L M@2 N O P O Q R S T U V W X P O Q R S T U V W Y Z AA AB AC AD P O Q R S T U V W X P O Q R
  S T U V W Y Z AA AB AC AD P O Q R S T U V W X P O Q R S AE@2
>`.pickRestart({
  A: "e2@12 g2@3 f#2@3 ~@5 e2@6 ~@3", B: "~@15 e2@12 ~ g2@4", C: "f#2@4 ~@4 e2@3 ~@4 c3@14 ~@3",
  D: "~@14 e1@4 ~@3 e1@3 ~@3 e1@5", E: "~ e1@3 ~@4 e1@3 ~@4 e1@4 ~@3 e1@4 ~@2 e1@4",
  F: "[~@3 e1@3 ~@4 e1@3 ~@3 e1@3 ~@4 e1@4 ~@3 e1@5 ~ e1@3 ~@4 e1@3 ~@3 e1@3 ~@4 e1@6 ~ e1@3 ~@3 e1@3 ~@4 e1@4 ~@3 e1@4 ~@2 e1@3 ~@4]/3",
  G: "e1@4 ~@2 e1@4 ~@3 e1@4 ~@3 e1@3 ~@4 e1@4 ~", H: "~ e1@4 ~@3 e1@3 ~@4 e1@3 ~@3 e1@4 ~@3 e1@3 ~",
  I: "~@2 e1@4 ~@3 e1@3 ~@4 e1@4 ~@2 e1@5 ~@2 e1@2 ~",
  J: "[~@3 e1@4 ~@3 e1@5 ~@2 e1@4 ~@3 e1@3 ~@3 e1@4 ~@3 e1@4 ~@3 e1@3 ~@3 e1@4 ~@3 e1@3 ~@3 e1@5 ~@2 e1@4 ~@3 e1@4 ~@3 e1@3 ~@3 e1@4 ~@2]/3",
  K: "~ e1@4 ~@2 e1@3 ~@4 e1@4 ~@2 e1@4 ~@3 e1@3 ~@2", L: "~@2 e1@3 ~@3 e1@4 ~@3 e1@4 ~@3 e1@4 ~@3 e1@3",
  M: "[~@3 e1@3 ~@4 e1@4 ~@2 e1@3 ~@4 e1@17 ~@13 g1@3 a1@4 b1@4]/2", N: "c2@5 ~ d2 c2 b1@5 ~ c2 b1",
  O: "a1@4 ~@2 b1 a1 g1@5 ~ d2@2", P: "c2@5 ~ d2 c2 b1@4 ~@2 c2 b1", Q: "c2@4 ~@2 d2 c2 b1@4 ~@2 c2 b1",
  R: "a1@6 b1 a1 g1@4 a1 b1 c2 c#2", S: "d2@4 ~@2 d2@2 f2@3 ~ f2 e2 d2@2", T: "c2@8 ~@4 c2@4 g1@5 ~@3 g1@2 a1@2 b1@4",
  U: "c2@4 ~@2 c2@2 d2@4 ~ d2 e2@2", V: "f2@4 ~@2 b1@2 c2@4 a1 b1 c2 c#2", W: "d2@5 ~ d2@2 f2@3 ~ f2 e2 d2@2",
  X: "c2@3 ~ c2@3 ~ c2@4 g1 a1 b1@2", Y: "c2@3 ~@3 c2@2 g1@3 ~ c2 d2 e2@2", Z: "f2@4 ~@2 f2 ~ f2@3 c2 f2 c2 c2@2",
  AA: "e2@5 ~ b1@2 e1@3 b1 e2 b1@3", AB: "f2@5 ~ f2@2 c2@4 ~@2 f2@2", AC: "g2 ~ g2@2 f2 ~ f2@2 d2 ~ d2@2 b1 ~ b1@2",
  AD: "g1@2 ~@10 g1 a1 b1@2", AE: "[c2@2 ~ c2 c1@8 ~@4]/2",
})).s("gm_acoustic_bass").gain(0.33)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel_2 = note(`<
  ~@18 A@6 B C D E F G H@4 B C D E F G I@2 J K L H@4 B C D E F G H@4 B C D E F G I@2 J K L H@4 B C D E F G H@4 B M@2
>`.pickRestart({
  A: "[~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4, c4@8 b3@8 a3@8 b3@8 c4@8 b3@8 a3@8 b3@8 c4@8 b3@8 a3@8 b3@7 ~, ~@4 g4@7 ~ g4@7 ~ g4@6 ~@2 g4@6 ~@2 g4@7 ~ g4@6 ~@2 g4@7 ~ g4@7 ~ g4@6 ~@2 g4@6 ~@2 g4@6 ~@2 g4@4]/6",
  B: "~ f#4 ~ f#4 ~ a4 ~ a4, d4 f4, ~@4 a4@5 ~@3 c5@4", C: "~@2 g4 c5 g4 e4 g4 e4, c4@7 ~, ~@2 e4@7 ~@7",
  D: "~ e4 g4 e4 ~ f#4 a4 f#4, c4 d4", E: "~ a4 ~ a4 ~ e4 g4 e4, f4 c4, ~@4 c5@5 ~@7",
  F: "~ f#4 a4 f#4 ~ a4 c5 a4, d4 f4", G: "~@2 g4 c5 g4 e4 g4 e4, c4, ~@2 e4@7 ~@7",
  H: "[~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4 ~ e4, c4@8 b3@8 a3@8 b3@8 c4@8 b3@8 a3@8 b3@7 ~, ~@4 g4@7 ~ g4@6 ~@2 g4@7 ~ g4@7 ~ g4@6 ~@2 g4@6 ~@2 g4@6 ~@2 g4@4]/4",
  I: "[~ g#5 ~ g#5 ~ g#5 ~@3 g5 ~ g5 ~ g5 b5 g5, f5@2 c6@3 ~ c6@3 ~ b5@3 ~@3, ~@6 f5 ~ f5@5 ~ g#5@4 ~@14, ~@16 e5@5 ~@3 e5@5 ~@3]/2",
  J: "~ a5 ~ a5 ~@2 c6 f5, f5@4 c6@6 a5@5 ~, ~@8 f5@5 ~@3",
  K: "g5@2 ~@2 f5 ~ f5@2 d5 ~ d5@2 b4 ~ b4@2, [b5,d6]@9 ~@7, ~@2 g5@7 ~ [g5,b5,d6]@5 ~", L: "[g5,b5,d6] ~@15, g4 ~@7",
  M: "[~@2 g4 c5 c5@8 ~@4, c4@3 ~, ~@2 e4@7 ~@23]/2",
})).s("gm_acoustic_guitar_steel").gain(0.22).pan(0.2)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel_3 = note(`<
  ~@18 A B A B C D@4 E@2 F A B C D@4 E@2 G ~@5 H I H J K L M N O P Q B C D@4 E@2 G ~@5 H I H J K L M N O P H I H J K R@2
>`.pickRestart({
  A: "c6@9 ~@4 d6 c6@2 b5@8 ~@4 b5@2 [b5,c6] ~, ~@6 c6 ~@9", B: "a5@9 ~@3 a5 ~ b5 ~ g5@7 ~@5 d6@4, ~@15 a5@2 ~@15",
  C: "c6@9 ~@3 c6 ~ d6 c6 b5@9 ~@3 b5@2 c6 b5",
  D: "[a5@9 ~@4 b5 ~ g5@9 ~@8 [f#5,a5]@10 ~@6 [f5,a5,c6]@9 ~@7 c6@28 ~@4 [g5,c6]@11 ~@5 [f#5,a5]@11 ~@5, ~@12 a5@3 ~@16 d5@10 ~@22 [e5,g5]@28 ~@4 e5@11 ~@5 d5@11 ~@6]/4", // F#m F C5 F#m Em
  E: "[~ c6@9 ~@6 [e5,g5,c6]@11 ~@5 [f#5,a5]@10 ~@6 f5 [f5,a5,c6]@12 ~@3, [f5,a5]@10 ~@21 d5@10 ~@8 g5 ~@14]/2", // C F#m F
  F: "~@8 g5@4 e5@5 ~@7 c6 d6 ~@3 d6@3, ~@4 c6@7 ~@17 c6@2 ~@2", G: "~@8 g5@4 e5@5 ~@15, ~@4 c6@7 ~@21",
  H: "c5 d5 e5 d5 c5 d5 e5 d5 b4 c5 d5 c5 b4 c5 d5 c5", I: "a4 b4 c5 b4 a4 b4 c5 b4 g4@6 ~@2",
  J: "a4 b4 c5 b4 a4 b4 c5 b4 g4@7 ~", K: "~ g4 ~ d4 ~ a4 ~ f4, d4 f#4 f4 g4", L: "~@2 f4@2 e4@4 [c4,g4]@7 ~, c4@7 ~@9",
  M: "f4 e4 g4@2 ~ g4 f#4@2, c4 d4", N: "~ a4 g4@2 ~ f4 e4@2, f4 c4", O: "~ g4 f#4@2 ~ a4 g4@2, d4 f4",
  P: "d4 ~@7 g5@4 e5@5 ~@7 c6 d6 ~@3 d6@3, c4, ~@4 c6@7 ~ g4@19 ~, ~ e4@3, ~@14 c6 ~",
  Q: "c6@8 ~@5 d6 c6@2 b5@8 ~@4 b5@2 [b5,c6] ~, ~@6 c6 ~@9", R: "[~ f4 e4@2 [c4,g4]@8 ~@4, c4@7 ~@25]/2",
})).s("gm_acoustic_guitar_steel").gain(0.29).pan(0.4)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel_4 = note(`<
  ~@18 A@6 B C D E F G H@4 B C D E F G I@2 J K L H@4 B C D E F G H@4 B C D E F G I@2 J K L H@4 B C D E F G H@4 B M@2
>`.pickRestart({
  A: "[~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5, c5@8 b4@8 a4@8 b4@8 c5@8 b4@8 a4@8 b4@8 c5@8 b4@8 a4@8 b4@7 ~, ~@4 g5@7 ~ g5@7 ~ g5@6 ~@2 g5@6 ~@2 g5@7 ~ g5@6 ~@2 g5@7 ~ g5@7 ~ g5@6 ~@2 g5@6 ~@2 g5@6 ~@2 g5@4]/6",
  B: "~ f#5 ~ f#5 ~ a5 ~ a5, d5 f5, ~@4 a5@5 ~@3 c6@4", C: "~@2 g5 c6 g5 e5 g5 e5, c5@7 ~, ~@2 e5@7 ~@7",
  D: "~ e5 g5 e5 ~ f#5 a5 f#5, c5 d5", E: "~ a5 ~ a5 ~ e5 g5 e5, f5 c5, ~@4 c6@5 ~@7",
  F: "~ f#5 a5 f#5 ~ a5 c6 a5, d5 f5", G: "~@2 g5 c6 g5 e5 g5 e5, c5, ~@2 e5@7 ~@7",
  H: "[~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5 ~ e5, c5@8 b4@8 a4@8 b4@8 c5@8 b4@8 a4@8 b4@7 ~, ~@4 g5@7 ~ g5@6 ~@2 g5@7 ~ g5@7 ~ g5@6 ~@2 g5@6 ~@2 g5@6 ~@2 g5@4]/4",
  I: "[~ g#4 ~ g#4 ~ g#4 ~@3 g4 ~ g4 ~ g4 b4 g4, f4@2 c5@3 ~ c5@3 ~ b4@3 ~@3, ~@6 f4 ~ f4@5 ~ g#4@4 ~@14, ~@16 e4@5 ~@3 e4@5 ~@3]/2",
  J: "~ a4 ~ a4 ~@2 c5 f4, f4@4 c5@6 a4@5 ~, ~@8 f4@5 ~@3",
  K: "g4@2 ~@2 f4 ~ f4@2 d4 ~ d4@2 b3 ~ b3@2, [b4,d5]@9 ~@7, ~@2 g4@7 ~ [g4,b4,d5]@5 ~", L: "[g4,b4,d5] ~@15, g3 ~@7",
  M: "[~@2 g5 c6 g5@8 ~@4, c5@3 ~, ~@2 e5@7 ~@23]/2",
})).s("gm_acoustic_guitar_steel").gain(0.22).pan(0.7)

// other · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<A B C D@2 E F@2 G@2 H I@3 J@2 K@2 ~@69>".pickRestart({
  A: "e3@10 ~@2 g3@3 f#3@3 ~@5 e3@8 ~", B: "~@15 e3@10 ~@4 g3@3", C: "f#3@4 ~@3 e3@3 ~@5 c4@14 ~@3",
  D: "[~@14 e3@4 ~@2 e3@4 ~@3 e3@4 g3@2 ~ a3@4 b2@2 e3@4 ~@3 e3@4 ~@2 e3@4 ~ d3@2 b2@2 ~@2]/2",
  E: "b2@2 ~ e3@4 ~@2 e3@4 ~@3 e3@4 g3@2 ~ a3@4 b2@2 e3@3",
  F: "[~@4 e3@4 ~@3 e3@4 d3@2 b2@2 ~@3 b2@2 e3@4 ~@2 e3@4 ~@3 e3@4 ~ g3@2 a3@4 b2@2 e3@4 ~@3 e3@4 ~@3]/2",
  G: "[e3@4 d3@2 b2@4 ~ d3@2 e3@4 ~@3 e3@4 ~@2 e3@4 ~ g3@2 a3@4 b2@2 ~ e3@4 ~@2 e3@4 ~@3 e3@4 d3@2 ~ b2@2 ~@2]/2",
  H: "b2@2 e3@4 ~@3 e3@4 ~@2 e3@4 ~ g3@2 a3@4 ~ b2@2 e3@3",
  I: "[~@3 e3@4 ~@3 e3@4 d3@2 ~ b2@2 ~@2 b2@2 e3@4 ~@3 e3@4 ~@3 e3@4 g3@2 a3@4 ~ b2@2 e3@4 ~@2 e3@4 ~@3 e3@4 ~ d3@2 b2@2 ~@2 b2@2 e3@4 ~@3 e3@4 ~@3 e3@4 g3@2]/3",
  J: "[a3@4 ~ b2@2 e3@4 ~@3 e3@4 ~@2 e3@4 ~ d3@2 b2@4 d3@2 ~ e3@4 ~@2 e3@4 ~@3 e3@4 g3@2 a3@4 ~ b2@2 e3@4]/2",
  K: "[~@3 e3@4 ~@2 e3@4 ~ d3@2 b2@2 ~@3 b2@2 e3@15 ~@26]/2",
})).s("gm_electric_guitar_muted").gain(0.38).pan(0.4)

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

// drums · rim
const rim = s("rim").struct("<~@18 [~ x ~ x]!22 ~@5 [~ x ~ x]!20 ~@5 [~ x ~ x]!14 ~@3>").gain(0.44)

// drums · snare
const snare = s("sd").struct("<A B C D E F G H I J K L M N O P Q ~@23 R@4 ~@21 R@4 ~@18>".pickRestart({
  A: "x ~@12 x ~ x ~@7 x ~@8", B: "~@8 x ~@6 x", C: "x!3 ~", D: "~@14 x ~@5 x ~@6 x ~@4",
  E: "~ x ~@6 x ~@6 x ~@5 x ~@6 x ~@3", F: "~@3 x ~@5 x ~@6 x ~@6 x ~@5 x ~@2", G: "~@4 x ~@6 x ~@5 x ~@6 x ~@6 x",
  H: "~@5 x ~@6 x ~@5 x ~@6 x ~@6", I: "x ~@5 x ~@6 x ~@6 x ~@5 x ~@5", J: "~ x ~@6 x ~@5 x ~@6 x ~@5 x ~@4",
  K: "~@2 x ~@6 x ~@5 x ~@6 x ~@6 x ~@2", L: "~@3 x ~@6 x ~@6 x ~@5 x ~@6 x ~", M: "~@5 x ~@5 x ~@6 x ~@6 x ~@5 x",
  N: "~@6 x ~@6 x ~@5 x ~@6 x ~@5", O: "x ~@6 x ~@6 x ~@5 x ~@6 x ~@4", P: "~@2 x ~@5 x ~@6 x ~@6 x ~@5 x ~@3",
  Q: "~@3 x ~@5 x ~@6 x ~@6 x ~@8", R: "~ x ~ x",
})).gain(0.38)

// drums · hihat
const hihat = s("hh").struct("<~@18 [x!8]!22 ~@5 [x!8]!20 ~@5 [x!8]!14 ~@3>").gain(0.38)

// drums · ride
const ride = s("rd").struct("<~@3 A B C D E F G H I J K L M N ~@23 O@4 P O@10 P ~@9 O@4 P O@14 P Q ~>".pickRestart({
  A: "~@14 x ~@5 x ~@4 x ~ x ~@3 x", B: "~ x ~@4 x ~ x ~@6 x ~@3 x ~ x ~@4 x ~ x ~@2 x",
  C: "~@3 x ~@5 x ~@4 x ~ x ~@3 x ~@2 x ~@3 x ~ x ~@2", D: "~@4 x ~@3 x ~@2 x ~@3 x ~ x ~@4 x ~ x ~@6 x",
  E: "~@3 x ~ x ~@4 x ~ x ~@3 x ~ x ~@6 x ~@3 x ~@2", F: "x ~@3 x ~ x ~@2 x ~@3 x ~@6 x ~@3 x ~ x ~@4 x",
  G: "~ x ~@3 x ~@2 x ~@5 x ~@4 x ~ x ~@3 x ~ x ~@4", H: "x ~ x ~@6 x ~@3 x ~ x ~@4 x ~ x ~@3 x ~@2 x ~@2",
  I: "~@3 x ~@4 x ~ x ~@3 x ~@2 x ~ x ~@3 x ~@6 x ~", J: "~@2 x ~@2 x ~@3 x ~ x ~@4 x ~ x ~@6 x ~@3 x ~ x",
  K: "~@4 x ~ x ~@3 x ~ x ~@6 x ~@3 x ~@2 x ~@3 x ~", L: "x ~@4 x ~ x ~@6 x ~@3 x ~ x ~@4 x ~ x ~ x ~@2",
  M: "~@2 x ~@5 x ~@4 x ~ x ~@3 x ~@2 x ~@3 x ~ x ~@3", N: "~@3 x ~@3 x ~@2 x ~@3 x ~ x ~@3 x ~@2 x ~@8", O: "x!8",
  P: "x", Q: "~ x",
})).gain(0.38)

stack(
  acoustic_guitar_steel, bass, acoustic_guitar_steel_2, acoustic_guitar_steel_3, acoustic_guitar_steel_4,
  electric_guitar_muted, kick, rim, snare, hihat, ride
)

More by The Animals