Strudelify

California Sun

The Rivieras

KeyG majorTempo174 bpm
0:00/0:00
// California Sun — The Rivieras
// 174 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 102 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(174/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@9 A B C D E F G D G B H I J ~@8 F G D G F K D G B H I J ~@8 F G D G B G D K B H I J F@5 G D G F G D G B H I J ~@8 F
  G D G F G D C B H I J B H I L
>`.pickRestart({
  A: "e1@2 ~@2 e1@3 ~ f1@3 ~ f#1@3 ~", B: "g1@3 ~ b1@3 ~ d2@4 b1@3 ~", C: "c2@4 e2@3 ~ g2@3 ~ e2@3 ~",
  D: "g1@3 ~ b1@2 ~@2 d2@3 ~ b1@3 ~", E: "c2@3 ~ e2@3 ~ g2@4 e2@3 ~", F: "g1@3 ~ b1@3 ~ d2@3 ~ b1@3 ~",
  G: "c2@3 ~ e2@3 ~ g2@3 ~ e2@3 ~", H: "e2@3 ~ e2 ~ e2@3 ~ e2 ~ e2 ~ e2 ~", I: "c2@3 ~ c2@3 ~ d2@3 ~ d2@3 ~",
  J: "g1@3 ~ g1 ~ g1@4 g1 ~ g1 ~ g1 ~", K: "c2@4 e2@3 ~ g2@4 e2@3 ~", L: "g1@3 ~ g1 ~ g1 ~ g1@2 ~@6",
})).s("gm_acoustic_bass").gain(0.8)

// chords · rock organ · "ORGAN 3"
const rock_organ = note(`<
  ~@3 A B C ~ A B D E F G H I F G J K L M K ~@8 I F G J E F G H N L M K ~@8 E F G H O F G P K L M K Q R S T E F G H E F
  G H K L M U ~ A B C ~@4 E F G V W F G J K L M K@2 L M X
>`.pickRestart({
  A: "~@12 g5 ~ g5@2", B: "b5@3 ~ d6@3 ~ d6@3 ~ d6 ~ d6 ~", C: "e6@3 ~ g6@2 d6@2 ~@8", D: "e6",
  E: "[g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5] ~ [g5,b5,d6] ~, ~@6 d6 ~", // G
  F: "[e5,g5,c6]@4 [e5,g5,c6] ~ [e5,g5]@4 c6@2 g5@2 [e5,c6] ~, ~@6 c6@3 ~ g5 ~ e5 ~@3", // C Em C
  G: "[g5,b5,d6]@3 ~ [g5,d6] ~ [g5,d6]@3 ~ [g5,d6] ~ [b5,d6]@2 g5 ~, ~@6 b5@6 g5 ~@3", // G G5 Bm
  H: "[e5,g5,c6]@3 ~ [e5,g5,c6] ~ [e5,g5,c6]@3 ~ [e5,g5] ~ g5 ~ g5@2, ~@5 c6@3, ~@3 e5", // C Em
  I: "[g5,b5,d6]@3 ~ [g5,d6] ~ [g5,b5,d6]@3 ~ [g5,b5,d6] ~ [b5,d6]@2 [g5,b5,d6] ~, ~@4 b5@2 ~@6 g5 ~@3", // G G5 G Bm G
  J: "[e5,g5,c6]@4 [e5,g5,c6] ~ [e5,g5,c6]@3 ~ [e5,g5] ~ g5 ~ g5@2, ~@5 c6@3, ~@3 e5", // C Em
  K: "[g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5,d6] ~ [g5,b5,d6] ~", // G
  L: "[g#5,b5,e6]@3 ~ [g#5,b5,e6] ~ [g#5,b5,e6]@3 ~ [g#5,b5,e6] ~ [g#5,b5,e6] ~ [g#5,b5,e6] ~", // E
  M: "[e5,g5,c6]@3 ~ [e5,g5,c6] ~ [e5,g5,c6] ~ [f#5,a5,d6] ~ [f#5,a5,d6]@4 ~@2", // C D
  N: "[g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5,d6]@3 ~ [g5,b5] ~ [g5,b5,d6] ~ [g5,b5,d6] ~, ~@5 d6 ~@2", // G
  O: "[g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5,d6]@3 ~ [g5,b5,d6] ~ [b5,d6]@2 [g5,b5,d6] ~, ~@12 g5 ~@3", // G Bm G
  P: "[e5,g5,c6]@4 [e5,g5,c6] ~ [e5,g5,c6]@4 [e5,g5] ~ g5 ~ g5@2, ~@5 c6@3, ~@3 e5", // C Em
  Q: "[g5,b5]@3 ~ [b5,d6] ~ b5 ~ [b5,d6]@4 [b5,d6] ~ [b5,d6] ~", // G Bm
  R: "[c6,e6] ~ e6@2 [e6,g6] ~ [b5,d6]@3 ~@3 g5 ~ g5 ~, ~@2 c6 ~@13", // C Em Bm
  S: "[g5,b5]@3 ~ [b5,d6]@3 ~ [b5,d6]@3 ~ [b5,d6] ~ [b5,d6] ~", // G Bm
  T: "e6@2 [c6,e6] ~ g6 ~ [b5,d6]@3 ~@3 [c6,e6] ~ [c6,e6]@2, c6 ~@15", U: "[g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5,d6]@10",
  V: "[e5,g5,c6]@3 ~ [e5,g5,c6] ~ [e5,g5,c6]@4 [e5,g5] ~ g5 ~ g5@2, ~@5 c6@3, ~@3 e5", // C Em
  W: "[g5,b5,d6]@3 ~ [g5,d6] ~ [g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5] ~ [g5,b5,d6] ~, ~@2 b5 ~@3 d6 ~", // G G5 G
  X: "[g5,b5,d6]@3 ~ [g5,b5,d6] ~ [g5,b5,d6] ~ [g5,b5,d6]@2 ~@6", // G
})).s("gm_rock_organ").gain(0.56)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note("<~@66 A B C D E F G F H I J K ~@23 L>".pickRestart({
  A: "d5@3 ~ [d5,g5] ~ [d5,g5]@3 ~ [d5,g5] ~ [d5,g5] ~ g5 ~", // G5
  B: "[e5,g5]@3 ~ e5 ~ [e5,g5]@3 ~ e5 ~ [e5,g5] ~ [e5,g5] ~", // Em
  C: "[d5,g5]@3 ~ g5 ~ [d5,g5]@3 ~ [d5,g5] ~ [d5,g5] ~ g5 ~", // G5
  D: "[e5,g5]@3 ~ e5 ~ [e5,g5]@3 ~ [e5,g5] ~ [e5,g5] ~ e5 ~", E: "[d5,g5]@3 ~ g5 ~ [d5,g5]@3 ~ [d5,g5] ~ g5 ~ g5 ~",
  F: "[e5,g5]@3 ~ [e5,g5] ~ [e5,g5]@3 ~ [e5,g5] ~ [e5,g5] ~ [e5,g5] ~", // Em
  G: "[d5,g5]@3 ~ [d5,g5] ~ [d5,g5]@3 ~ [d5,g5] ~ [d5,g5] ~ g5 ~", // G5
  H: "[d5,g5]@3 ~ [d5,g5] ~ [d5,g5]@3 ~ [d5,g5] ~ [d5,g5] ~ [d5,g5] ~", // G5
  I: "[e5,g#5]@3 ~ [e5,g#5] ~ [e5,g#5]@3 ~ [e5,g#5] ~ [e5,g#5] ~ e5 ~", // E
  J: "[e5,g5]@4 [e5,g5]@3 ~ [f#5,a5]@3 ~ [f#5,a5]@3 ~", K: "[d5,g5]@2 [d5,g5] ~ [d5,g5] ~ [d5,g5]@8 ~@2",
  L: "~@4 [d5,g5] ~ [d5,g5] ~ [d5,g5]@2 ~@6", // G5
})).s("gm_percussive_organ").gain(0.48)

// chords · percussive organ · "ORGAN 2" · soft notes
const percussive_organ_soft = note("<~@66 A B C D E ~ F ~@2 G ~@26>".pickRestart({
  A: "g5@2 ~@12 d5 ~", B: "~@4 g5 ~@5 g5 ~@5", C: "~@4 d5 ~@9 d5 ~", D: "~@4 g5 ~@9 g5 ~", E: "~@4 d5 ~@7 d5 ~ d5 ~",
  F: "~@14 d5 ~", G: "~@14 g#5 ~",
})).s("gm_percussive_organ").gain(0.32)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@10 A B C B A B C B D E F G ~@8 A B C B A B C B D E H G ~@8 A B C B A B C B D E H G ~@4 I@9 J K L ~@8 A B C B A B C B
  D E H G D E F M
>`.pickRestart({
  A: "[g3,d4] ~ [g3,d4] ~ [g3,e4] ~ [g3,e4] ~ [g3,d4] ~ [g3,d4] ~ [g3,e4] ~ [g3,e4] ~", // G5 C G5 C
  B: "[c4,g4] ~ [c4,g4] ~ [c4,a4] ~ [c4,a4] ~ [c4,g4] ~ [c4,g4] ~ [c4,a4] ~ [c4,a4] ~", // C5 F C5 F
  C: "[g3,g#3,d4] ~ [g3,d4] ~ [g3,e4] ~ [g3,e4] ~ [g3,d4] ~ [g3,d4] ~ [g3,e4] ~ [g3,e4] ~", // G G5 C G5 C
  D: "[g3,d4]@3 ~ [g3,d4] ~ [g3,d4]@3 ~ [g3,d4] ~ [g3,d4] ~ [g3,d4] ~", // G5
  E: "[e4,b4]@3 ~ [e4,b4] ~ [e4,b4]@3 ~ [e4,b4] ~ [e4,b4] ~ [e4,b4] ~", // E5
  F: "[c4,g4]@3 ~ [c4,g4] ~ [c4,g4] ~ [d4,a4]@3 ~ a4@2 d4 ~, ~@12 d4 ~@3", // C5 D5
  G: "[g3,d4]@3 ~ [g3,d4] ~ [g3,d4]@4 [g3,d4] ~ [g3,d4] ~ [g3,d4] ~", // G5
  H: "[c4,g4]@3 ~ [c4,g4] ~ [c4,g4] ~ [d4,a4]@3 ~ [d4,a4]@2 d4 ~", I: "g5@3 ~ g5 ~ g5@3 ~ g5 ~ g5 ~ g5 ~",
  J: "b5@5 ~ [b5,e6]@3 ~ [b5,e6] ~ e6@2 b5 ~, e6@3 ~@9 b5 ~@3", // E5
  K: "[g5,c6]@3 ~ [g5,c6] ~ [g5,c6] ~ [a5,d6]@3 ~ [a5,d6]@2 ~@2", L: "~@2 [d6,g6] ~ [d6,g6] ~ [d6,g6] ~ [d6,g6]@6 ~@2",
  M: "[g3,d4]@3 ~ [d5,g5] ~ [d5,g5] ~ [d5,g5]@2 ~@6", // G5
})).s("gm_electric_guitar_muted").gain(0.53)

// drums · kick
const kick = s("bd").struct("<[x!4]!101 [x ~ x!3 ~@3]>").gain(0.62)

// drums · snare
const snare = s("sd").struct("<A@9 B A@19 B A@19 B A@27 C A@7 B A@11 D A@3 ~>".pickRestart({
  A: "~@2 x!2 ~@2 x ~", B: "~@2 x!14", C: "~@4 x ~ x ~@3 x!3 ~ x ~", D: "~@2 x!2 ~ x!3",
})).gain(0.69)

// drums · low tom
const low_tom = s("lt").struct("<[x!8]!101 ~>").gain(0.55)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!101 [x!5 ~@3]>").gain(0.62)

// drums · crash
const crash = s("cr").struct("<~@22 x ~@19 x ~@35 x ~@22 [x ~ x!3 ~@3]>").gain(0.62)

stack(
  bass, rock_organ, percussive_organ, percussive_organ_soft, electric_guitar_muted, kick, snare, low_tom, hihat, crash
)