Strudelify
Oh Carol cover art

Collections

Oh Carol

Neil Sedaka

KeyA majorTempo122 bpm
0:00/0:00
// Oh Carol — Sedaka Neil
// 122 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 75 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(122/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, A@4 for four bars: edit a riff to change every repeat.

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A@2 B@2 C D E F A@2 B@2 C@2 E G A@2 B@2 D H I ~ J K B@2 C@2 L M A@2 B N C E A O A@2 B@2 C@2 E P A@2 B@2 C H I ~ A@2
  B@2 C@2 E Q A@2 B@2 C H R S T U
>`.pickRestart({
  A: "a2@3 e3@3 e2@2", B: "f#2@3 c#3@3 c#2@2", C: "b2@3 f#3@3 f#2@2", D: "b2@6 f#3@6 b2@3 ~", E: "e3@3 b3@3 b2@2",
  F: "e3 ~ e3@2 d3 ~ d3@2 c#3 ~ c#3@2 b2 ~ b2@2", G: "e3@4 d3 ~ d3@2 c#3@2 c#3@2 b2@4", H: "e3@5 ~ b3@6 e3@4",
  I: "a2@3 ~@9 a2@3 ~", J: "a2@5 ~ e3@6 e2@4", K: "a2@5 ~ e3@6 a2@4", L: "e3@6 b3@5 ~ b2@4",
  M: "e3@4 d3@4 c#3 ~ c#3@2 b2@4", N: "f#2@3 c#3@3 f#2@2", O: "e3 d3 c#3 b2", P: "e3@4 d3 ~ d3@2 c#3@4 b2@4",
  Q: "e3 ~ e3@2 d3@4 c#3 ~ c#3@2 b2 ~ b2@2", R: "a2@3 e3@3 a2@2", S: "d3@3 a3@3 d3@2", T: "a2@3 f#3@2 e3 c#3@2",
  U: "a2@2 ~@2 a2 ~ a2 ~ a2@3 ~@5",
})).s("gm_acoustic_bass").gain(0.41)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  A@5 B@2 C D E F@3 G@3 H I J@3 K L@2 M N@7 O P@5 Q@2 R S@7 T U@3 V W X@7 Y@2 Z AA@8 AB@3
>`.pickRestart({
  A: "[~@16 [e3,a3,c#4]@20 ~@12 [f#3,a3,c#4]@23 ~@9, ~@15 a2@21 ~@11 c#3@7 ~@26]/5", // A F#m
  B: "[[b2,f#3]@25 ~@7, [b3,d4]@23 ~@9]/2", C: "[e3,g#3,b3]@7 ~, d4@3 ~",
  D: "[e4,g#4] ~ [e4,g#4]@2 [d4,f#4] ~ [d4,f#4]@2 [c#4,e4] ~ [c#4,e4] ~ [b3,d4] ~ [b3,d4] ~", E: "[a3,c#4], a2@7 ~@9",
  F: "[~@16 [a3,c#4]@17 ~@15, ~@15 [c#3,f#3]@19 ~@14]/3", // A F#5
  G: "[[b2,f#3,b3,d4]@23 ~@9 [g#3,b3,d4]@12 ~@4, ~@31 e3@14 ~@3]/3", // Bm G#dim
  H: "e4@2 [e4,g#4]@2 [d4,f#4] ~ [d4,f#4]@2 [c#4,e4] ~ [c#4,e4] ~ [b3,d4] ~ [b3,d4] ~, e3 ~@3, g#4 ~@15", I: "[a3,c#4]",
  J: "[~@8 [a3,c#4]@9 ~@7, ~@15 f#3@19 ~@14, ~@15 c#3@5 ~@28]/3", K: "[b2,f#3,b3,d4]@13 ~@3",
  L: "[[e3,g#3,b3,d4]@11 ~@5 [e3,a3,c#4]@4 ~@8 [a2,e3,a3,c#4]@2 ~@2, ~@15 a2@5 ~@12]/2", // E7 A
  M: "[e3,g#3,b3,e4]@13 ~@2 c#3, b2 ~@3", // E
  N: "[[e3,a3,c#4]@24 ~@8 [f#3,a3,c#4]@19 ~@13 [b3,d4]@21 ~@11 [g#3,b3,e4]@13 ~@3, ~@31 c#3@6 ~@26 [b2,f#3]@21 ~@11 e3@15 ~@2]/7", // A F#m Bm E B5
  O: "~@15 c#3",
  P: "[[e3,a3,c#4]@24 ~@8 c#4@23 ~@9 [b3,d4]@13 ~@3, ~@31 [f#3,a3]@23 ~@26, ~@31 c#3@2 ~@30 [b2,f#3]@13 ~@4]/5", // A Bm F#m B5
  Q: "[[e3,g#3,b3,d4]@12 ~@4 [e3,a3,c#4]@13 ~@3, ~@15 a2@3 ~@14]/2", // E7 A
  R: "[g#3,e4] ~ [g#3,e4] ~ [f#3,d4] ~ [f#3,d4] ~ [e3,c#4] ~ [e3,c#4]@2 [d3,b3] ~ [d3,b3] ~, e3 ~@7", // C#m D C#m G
  S: "[[e3,a3,c#4]@20 ~@12 [f#3,a3,c#4]@19 ~@13 [d3,f#3,b3,d4]@16 ~@16 [e3,e4]@13 ~@3, ~@31 c#3@19 ~@13 b2@18 ~@14 b2@13 ~@4, ~@96 [g#3,b3]@11 ~@5]/7", // A F#m Bm E G#m
  T: "[e4,g#4] ~ [e4,g#4]@2 [d4,f#4] ~ [d4,f#4]@2 [c#4,e4] ~ [c#4,e4]@2 [b3,d4] ~ [b3,d4] ~, e3 ~@7", // E D C#m Bm
  U: "[[e3,a3,c#4]@19 ~@13 [a3,c#4]@16, ~@31 f#3@16 ~, ~@31 c#3@8 ~@9]/3", V: "~@15 b2",
  W: "[f#3,b3,d4]@13 ~@3, d3@3 ~@13", // Bm
  X: "[[e3,g#3,b3,d4]@12 ~@4 [e3,a3,c#4]@3 ~@9 [a2,e3,a3,c#4]@2 ~@2 [b3,e4]@11 ~@5 [a3,c#4]@23 ~@9 [f#3,a3,c#4]@24 ~@7 b2, ~@15 a2@3 ~@13 [e3,g#3]@12 ~@4 a2@5 ~@60, ~@48 e3@21 ~@10 c#3@5 ~@28]/7", // E7 A E5 A F#m E
  Y: "[[f#3,b3,d4]@3 ~, d3 ~@7]/2", Z: "[e3,g#3,b3,d4]",
  AA: "[~@16 [e3,a3,c#4]@24 ~@8 [f#3,a3,c#4]@19 ~@12 b2 ~ b2 ~@14 [b3,d4]@11 ~@5 [e3,a3,c#4]@13 ~@3, ~@15 a2@26 ~@6 c#3@20 ~@12 f#3@13 ~@3 [e3,g#3]@13 ~@20, ~@80 [b3,d4]@13 ~@35, ~@80 d3@3 ~@28 a2@14 ~@3]/8", // A F#m Bm A E Bm
  AB: "[[d3,f#3,a3,d4]@11 ~@5 [e3,a3,c#4]@13 ~@3 [e3,a3,c#4] ~@3 [a3,c#4,a4] ~ [a3,c#4,a4] ~ [a3,c#4,a4]@2 ~@6, ~@15 a2@14 ~@2 a2@2 ~@15]/3", // D A
})).s("gm_electric_guitar_clean").gain(0.26).pan(0.3)

// other · pizzicato strings · "PIZZICATO"
const pizzicato_strings = note(`<
  ~ A@2 B@2 C@2 D E A@2 B@2 C@2 F G H A B I C J K ~ A@2 B@2 C@2 L M A N B@2 C L O G A P B Q C R L G A@2 B Q S T U ~ A O
  B Q C S L V A O B Q S L O W X Y
>`.pickRestart({
  A: "a4 ~ a4 c#5 e5 ~ a5 ~@3 e5 ~ c#5 ~ e5 ~", B: "f#4 ~ f#4 a4 c#5 ~ f#5 ~@3 c#5 ~ a4 ~ c#5 ~",
  C: "b4 ~ b4 d5 f#5 ~ b5 ~@3 f#5 ~ d5 ~ f#5 ~", D: "e4 ~ e4 g#4 b4@2 e5 ~@3 b4 ~ g#4 ~ e4 ~",
  E: "[e5,g#5] ~ [e5,g#5] ~ [d5,f#5] ~ [d5,f#5] ~ [c#5,e5,f#5] ~ [c#5,e5] ~ [b4,d5] ~ [b4,d5] ~", // E D F#7 C#m Bm
  F: "e4 ~ e4 g#4 b4 ~ e5 ~@3 b4 ~ g#4 ~ e4 ~",
  G: "[e5,g#5] ~ [e5,g#5] ~ [d5,f#5] ~ [d5,f#5] ~ [c#5,e5] ~ [c#5,e5] ~ [b4,d5] ~ [b4,d5] ~", // E D C#m Bm
  H: "[a4,c#5] ~ a4 c#5 e5 ~ a5 ~@3 e5 ~ c#5 ~ e5 ~", I: "f#4 ~ f#4 a4 c#5 ~ f#5 ~@3 c#5 ~ a4 ~ [f#4,c#5] ~",
  J: "e4 ~ e4 g#4 b4@2 d5 ~@3 b4 ~ e4 ~ g#4 ~", K: "[a4,c#5,e5] ~@5 [a4,c#5,e5] ~",
  L: "e4 ~ e4 g#4 b4 ~ d5 ~@3 b4 ~ g#4 ~ e4 ~", M: "e4 ~ e5 ~ e5 ~ e4@9 ~",
  N: "a4 ~ a4 c#5 e5 ~ a5 ~@3 e5 ~ a4 ~ c#5 ~", O: "a4 ~ a4 c#5 e5 ~ a5 ~@3 e5 ~ c#5 ~ a4 ~",
  P: "a4 ~ a4 c#5 e5@2 a5@2 ~@2 e5 ~ c#5 ~ e5 ~", Q: "f#4 ~ f#4 a4 c#5 ~ f#5 ~@3 c#5 ~ a4 ~ f#4 ~",
  R: "b4 ~ b4 d5 f#5 ~ b5 ~@3 f#5 ~ d5 ~@3", S: "b4 ~ b4 d5 f#5 ~ b5 ~@3 f#5 ~ d5 ~ b4 ~",
  T: "e4 ~ e4 g#4 b4 ~ [c#5,d5] ~@3 b4 ~ g#4 ~ e4 ~", U: "a4 ~@11 a4@2 ~@2, ~@12 e5 ~@3",
  V: "e4 ~ e5 ~ e5 ~ e4 ~ e4@5 ~ e4 ~", W: "a4 ~ a4 d5 f#5 ~ a5 ~@3 f#5 ~ d5 ~ a4 ~",
  X: "a4 ~ c#5 ~@3 a5 ~@3 e5 ~ c#5 ~ e5 ~", Y: "a4 ~@3 [c#5,a5] ~ [c#5,a5] ~ [c#5,a5] ~@7",
})).s("gm_pizzicato_strings").gain(0.31).pan(0.6)

// chords · drawbar organ · "ELEC ORGAN"
const drawbar_organ = note("<~ A@4 B@4 C@8 D@7 ~ E@7 F@7 G H A@4 I@3 J K@4 L@3 ~ M@7 N@7 O@3 P>".pickRestart({
  A: "[e4@31 ~ f#4@31 ~, [a4,c#5]@63 ~]/4", // A
  B: "[f#4@30 ~@2 g#4@16 [e5,g#5] ~ [e5,g#5] ~ [d5,f#5] ~ [d5,f#5] ~ [c#5,e5] ~ [c#5,e5] ~ [b4,d5] ~ [b4,d5] ~, b4@3 ~, d5@23 ~@9, ~@32 e4@19 ~@13]/4", // E D C#m Bm
  C: "[e4@31 ~@65 g#4@16 [e5,g#5] ~ [e5,g#5] ~ [d5,f#5] ~ [d5,f#5] ~ [c#5,e5] ~ [c#5,e5] ~ [b4,d5] ~ [b4,d5] ~, [a4,c#5]@63 ~ b4@48 ~@16, ~@32 f#4@64 e4@19 ~@13, ~@32 d5@23 ~@9]/8", // E D C#m Bm A
  D: "[~@2 e4@30 ~@48 g#4@16 [a4,c#5]@4 ~@8 [a3,e4,a4]@3 ~, [a4,c#5]@4 [b4,d5]@2 ~, ~@32 f#4@47 ~ e4@19 ~@13]/7", // A A5 A Bm
  E: "[e4@31 ~@65 [e4,g#4]@16, [a4,c#5]@63 ~ [b4,d5]@48, ~@2 f#4@4 ~]/7", // E A Bm
  F: "[e4@2 e5 ~ e5@2 e4 ~@89 [e4,g#4]@15 ~, ~@8 e4@40 f#4@47 ~@17, ~@16 [a4,c#5]@63 ~ [b4,d5]@32]/7", G: "[e4,a4,c#5]",
  H: "[e5,g#5] ~ [e5,g#5] ~ [d5,f#5] ~ [d5,f#5] ~ [c#5,e5] ~ [c#5,e5] ~ [b4,d5] ~ [b4,d5] ~", // E D C#m Bm
  I: "[f#4@31 ~ e4@15 ~, [b4,d5]@15 ~, ~@32 g#4@9 ~@7]/3", // Bm
  J: "[e5,g#5] ~ [e5,g#5]@2 [d5,f#5] ~ [d5,f#5] ~ [c#5,e5] ~ e5@2 [b4,d5] ~ [b4,d5] ~, ~@10 c#5 ~@5", // E D C#m Bm
  K: "[e4@32 f#4@31 ~, [a4,c#5]]/4", // A
  L: "[f#4@15 ~ g#4@15 ~ [a4,c#5]@4 ~@8 [a3,e4,a4]@3 ~, [b4,d5]@31 ~@17, ~@4 e4@5 ~@3]/3", // A A5 Bm
  M: "[e4@31 ~@65 [e4,g#4]@15 ~, [a4,c#5]@63 ~ [b4,d5]@48, ~@32 f#4@63 ~@17]/7", // E A Bm
  N: "[e4@2 e5 ~ e5@2 ~@90 [e4,g#4]@15 ~, ~@6 e4@42 f#4@47 ~@17, ~@16 [a4,c#5]@63 ~ [b4,d5]@32]/7", // E A Bm
  O: "[[e4,c#5]@16 [d4,f#4,d5]@16 [e4,c#5]@15 ~, a4@47 ~]/3", // C#m D C#m
  P: "[e4,a4,c#5] ~@3 [c#5,e5,a5] ~ [c#5,e5,a5] ~ [c#5,e5,a5] ~@7", // A
})).s("gm_drawbar_organ").gain(0.36).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~ A@15 B A@5 B C ~ A@7 B A@7 B A@7 B A@6 C ~ A@7 B A@9 D>".pickRestart({
  A: "x ~@2 x ~@4", B: "x ~@2 x ~@3 x", C: "x ~@2 x", D: "x",
})).gain(0.51)

// drums · snare
const snare = s("sd").struct("<A B@7 ~ B@7 ~ B@6 ~@2 B@7 ~ B@7 ~ B@7 ~ B@6 ~@2 B@7 ~ B@9 C>".pickRestart({
  A: "~@6 x!2", B: "~@2 x ~@2 x ~@2", C: "~@2 x!3 ~@3",
})).gain(0.51)

// drums · low tom
const low_tom = s("lt").struct("<~@8 A ~@7 A ~@6 B C ~@7 D ~@7 A ~@7 A ~@6 B C ~@7 A ~@10>".pickRestart({
  A: "~@6 x!2", B: "~@3 x", C: "~@7 x", D: "~@5 x!3",
})).gain(0.51)

// drums · hihat
const hihat = s("hh").struct("<~ A@22 B ~ A@30 B ~ A@17 C>".pickRestart({
  A: "x!8", B: "x ~@2 x", C: "x ~ x!3 ~@3",
})).gain(0.46)

// drums · mid tom
const mid_tom = s("mt").struct("<~@8 A ~@7 A ~@7 B ~@7 C ~@7 A ~@7 A ~@7 B ~@7 B ~@10>".pickRestart({
  A: "~@2 x!2 ~@4", B: "~@3 x!2 ~@3", C: "~ x!2 ~@5",
})).gain(0.51)

// drums · high tom
const high_tom = s("ht").struct("<~@8 A ~@7 A ~@7 B ~@7 C ~@7 A ~@7 A ~@7 B ~@7 D ~@10>".pickRestart({
  A: "x!2 ~@2 x!2 ~@2", B: "~ x!2 ~@2 x!2 ~", C: "x ~@2 x!2 ~@3", D: "~ x!2 ~@2 x ~@2",
})).gain(0.51)

// drums · crash
const crash = s("cr").struct("<~ A ~@7 A ~@7 A ~@5 B ~ A ~@7 A ~@7 A ~@7 A ~@5 B ~ A ~@7 A ~@8 A>".pickRestart({
  A: "x", B: "x ~@2 x",
})).gain(0.41)

// drums · cowbell
const cowbell = s("cb").struct("<~ [~@6 x!2]!22 ~@2 [~@6 x!2]!30 ~@2 [~@6 x!2]!17 [~@2 x!3 ~@3]>").gain(0.41)

// drums · claves
const claves = s("clave:2").struct("<~ A@7 B A@7 ~ A@6 B ~ A@7 ~ A@7 B A@7 B A@6 C ~ A@7 D A@9 E>".pickRestart({
  A: "x ~@2 x ~@2 x ~", B: "x", C: "x ~@2 x", D: "x ~@2 x ~@4", E: "x ~ x!3 ~@3",
})).gain(2.01)

stack(
  bass, electric_guitar_clean, pizzicato_strings, drawbar_organ, kick, snare, low_tom, hihat, mid_tom, high_tom, crash,
  cowbell, claves
)

More by Neil Sedaka