Strudelify

Happy Birthday Sweet Sixteen

Neil Sedaka

KeyD♭ majorTempo161 bpm
0:00/0:00
// Happy Birthday Sweet Sixteen — Sedaka Neil
// 161 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: duplicate parts dropped: ch 4 acoustic guitar nylon (copy of ch 3 piano)
// note: Full arrangement: all 110 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(161/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
const piano = note(`<
  A B C D E B C D E F B G@2 C@2 H I J K L M K@2 N O F B G@2 C@2 H I J K L M P Q R S N@2 L@2 N@2 L@2 T@2 U@2 V@2 N@2 F B
  G@2 C@2 H I J K L M P Q W@2 X@2 Y Z D@2 AA@2 AB AC AD AE AF AG AH AI AJ AF Z AA AK AL Z AA AK AL Z AA AK AL Z AA AK AL
  AM@3
>`.pickRestart({
  A: "~@2 ab2 ~ bb2 ~ c3 ~", B: "~@4 [ab3,db4,f4] ~ [ab3,db4,f4]@2 ~@4 [ab3,db4,f4]@2 ~@2",
  C: "~@4 [bb3,db4,f4] ~ [bb3,db4,f4]@2 ~@4 [bb3,db4,f4]@2 ~@2", // Bbm
  D: "~@4 [bb3,db4,gb4] ~ [bb3,db4,gb4]@2 ~@4 [bb3,db4,gb4]@2 ~@2", // Gb
  E: "~@4 [c4,eb4,ab4] ~ [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~ [c4,eb4,ab4] ~@3", // Ab
  F: "~@4 [ab3,db4,f4] ~ [ab3,db4,f4]@2 ~@4 [ab3,db4]@2 ~@2, ~@12 f4 ~@3", // Db Db5
  G: "~@4 [a3,c4,f4] ~ [a3,c4,f4]@2 ~@4 [a3,c4,f4]@2 ~@2", H: "~@4 [ab3,b3,f4] ~ [ab3,b3,f4]@2 ~@4 [ab3,b3,f4]@2 ~@2",
  I: "~@4 [ab3,b3,f4] ~ [ab3,b3,f4] ~@3 [ab3,b3,f4] ~ [ab3,b3,f4] ~@3", // Fdim
  J: "~@4 [gb3,bb3,db4] ~ [gb3,bb3,db4] ~@5 [gb3,bb3,db4] ~@3", // Gb
  K: "~@4 [g3,bb3,eb4] ~ [g3,bb3,eb4] ~@5 [g3,bb3,eb4] ~@3", L: "~@4 [ab3,db4,f4] ~ [ab3,db4,f4] ~@5 [ab3,db4,f4] ~@3",
  M: "~@4 [bb3,d4,f4] ~ [bb3,d4,f4] ~@3 [bb3,d4,f4] ~ [bb3,d4,f4] ~@3", // Bb
  N: "~@4 [ab3,c4,eb4] ~ [ab3,c4,eb4] ~@5 [ab3,c4,eb4] ~@3", // Ab
  O: "~@4 [ab3,c4,eb4] ~ [ab3,c4,eb4] ~@3 [ab3,c4,eb4] ~ [ab3,c4,eb4] ~@3", // Ab
  P: "~@4 [bb3,eb4,g4] ~ [bb3,eb4,g4] ~@5 [bb3,eb4,g4] ~@3", Q: "~@4 [c4,eb4,ab4] ~ [c4,eb4,ab4] ~@5 [c4,eb4,ab4] ~@3",
  R: "~@4 [db4,f4,ab4] ~ [db4,f4,ab4] ~@5 [db4,f4,ab4] ~@3", S: "~@4 db3@3 ~ c3@3 ~ bb2@3 ~",
  T: "~@4 [bb3,d4,f4] ~ [bb3,d4,f4] ~@5 [bb3,d4,f4] ~@3", U: "~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~@5 [bb3,eb4,gb4] ~@3",
  V: "[bb3,eb4,g4] ~@11 [bb3,eb4,g4] ~@3", // Eb
  W: "[~@4 [f4,ab4,db5,f5,ab5,db6]@2 ~@2 [f4,ab4,db5,f5,ab5,db6] ~ [f4,ab4,ab5,eb6]@2 ~@2 [f4,ab4,db5,f5,ab5,db6]@9 ~@9, ~@5 f5@2 ~@9]/2", // Db Fm7 Db
  X: "[~@4 [db4,e4,a4,db5,e5,a5]@2 ~@2 [db4,e4,a4,db5,e5,a5] ~ [db4,e4,b4,db5,e5,b5]@2 ~@2 [db4,e4,a4,db5,e5,a5]@10 ~@8]/2", // A Dbm7 A
  Y: "~@4 [a3,d4,gb4] ~ [a3,d4,gb4]@2 ~@4 [a3,d4]@2 ~@2, ~@12 gb4 ~@3", // D D5
  Z: "~@4 [a3,d4,gb4] ~ [a3,d4,gb4]@2 ~@4 [a3,d4,gb4]@2 ~@2", // D
  AA: "~@4 [b3,d4,gb4] ~ [b3,d4,gb4]@2 ~@4 [b3,d4,gb4]@2 ~@2", // Bm
  AB: "~@4 [a3,c4,gb4] ~ [a3,c4,gb4]@2 ~@4 [a3,c4,gb4]@2 ~@2", // Gbdim
  AC: "~@4 [a3,c4,gb4] ~ [a3,c4,gb4] ~@3 [a3,c4,gb4] ~ [a3,c4,gb4] ~@3", // Gbdim
  AD: "~@4 [g3,b3,d4] ~ [g3,b3,d4] ~@5 [g3,b3,d4] ~@3", AE: "~@4 [ab3,b3,e4] ~ [ab3,b3,e4] ~@5 [ab3,b3,e4] ~@3",
  AF: "~@4 [a3,d4,gb4] ~ [a3,d4,gb4] ~@5 [a3,d4,gb4] ~@3", // D
  AG: "~@4 [b3,eb4,gb4] ~ [b3,eb4,gb4] ~@3 [b3,eb4,gb4] ~ [b3,eb4,gb4] ~@3", // B
  AH: "~@4 [b3,e4,ab4] ~ [b3,e4,ab4] ~@5 [b3,e4,ab4] ~@3", AI: "~@4 [db4,e4,a4] ~ [db4,e4,a4] ~@5 [db4,e4,a4] ~@3",
  AJ: "~@4 [a3,d4,gb4] ~ [a3,d4,gb4] ~@5 [a3,d4,g4] ~@3", AK: "~@4 [b3,d4,g4] ~ [b3,d4,g4]@2 ~@4 [b3,d4,g4]@2 ~@2",
  AL: "~@4 [db4,e4,a4] ~ [db4,e4,a4] ~@3 [db4,e4,a4] ~ [db4,e4,a4] ~@3", AM: "[[a3,d4,gb4]@15 ~]/3",
})).s("gm_piano").gain(0.4)

// bass · acoustic bass
const bass = note(`<
  ~ A B C D A B C D A E F G B H A E I J K L M@2 N O A E F G B H A E I J K L M N A P N@2 A Q N@2 A Q B@2 M@2 R@2 N S A E
  F G B H A E I J K L M N A T U V W X I Y Z AA W X AB AC AD AE AF AG AH AI W Z AJ AK W Z AJ AK W Z AJ AK W Z AJ AK AL@3
>`.pickRestart({
  A: "db2 ~ ab1 ~", B: "bb1 ~ f1 ~", C: "gb1 ~ bb1 ~", D: "ab1@2 ~@2 ab1 ~ ab1@2 ~@2 ab1 ~ ab1@2 ~@2",
  E: "db2@2 ~@2 ab1 ~ db2 ~", F: "f1 ~ c2 ~", G: "f1@2 ~@2 f1 ~ c2 ~", H: "bb1@2 ~@2 f1 ~ bb1 ~", I: "gb1 ~ db2 ~",
  J: "g1@4 ~@2 eb2@3 ~ g1 ~ bb1@2 ~@2", K: "ab1 ~ db2 ~", L: "bb1@3 ~ bb1@2 bb1@2 ~@2 bb1@2 bb1@2 ~@2",
  M: "eb2 ~ bb1 ~", N: "ab1 ~ eb2 ~", O: "ab1@2 ~@2 ab1 ~ ab1@2 ~@2 ab1 ~ ab1 ~@3",
  P: "db2@3 ~ db2@2 ~@2 c2@2 ~@2 bb1@2 ~@2", Q: "db2@2 ~@2 db2@2 ~@2 c2@2 ~@2 bb1@3 ~", R: "eb2 ~@5 eb2 ~",
  S: "ab1@3 ~ ab1@3 ~ bb1@3 ~ c2@3 ~", T: "db2@4 ~@4 db2@3 ~ b1@3 ~", U: "a1 ~ e1 ~", V: "a1 ~ a1@2 b1@2 db2@2",
  W: "d2 ~ a1 ~", X: "d2@2 ~@2 a1 ~ d2 ~", Y: "gb1@2 ~@2 gb1 ~ db2 ~", Z: "b1 ~ gb1 ~", AA: "b1@2 ~@2 gb1 ~ b1 ~",
  AB: "g1 ~ d2 ~", AC: "ab1@4 ~@2 e1@3 ~ ab1 ~ b1@2 ~@2", AD: "a1 ~ d2 ~", AE: "b1@3 ~ b1@2 b1@2 ~@2 b1@2 b1@2 ~@2",
  AF: "e2 ~ b1 ~", AG: "a1 ~ e2 ~", AH: "d2 ~ db2 ~", AI: "b1 ~ a1 ~", AJ: "g1 ~ b1 ~",
  AK: "a1@2 ~@2 a1 ~ a1@2 ~@2 a1 ~ a1@2 ~@2", AL: "[d2@15 ~]/3",
})).s("gm_acoustic_bass").gain(0.4)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  ~ A B C D A B C D A@2 E@2 B@2 F@2 C G H I J@2 K@2 A@2 E@2 B@2 F@2 C G H I J D A ~ K@2 A@2 K@2 A@2 L@2 M@2 N@2 D@2 A@2
  E@2 B@2 F@2 C G H I J D A@2 O@2 P@2 C@2 Q@2 R@2 S T U V W X P@3 Q S X P Q S X P Q S X P Q S X Y@3
>`.pickRestart({
  A: "~@4 [ab3,db4,f4] ~ [ab3,db4,f4] ~@3 [ab3,db4,f4] ~ [ab3,db4,f4] ~@3", // Db
  B: "~@4 [bb3,db4,f4] ~ [bb3,db4,f4] ~@3 [bb3,db4,f4] ~ [bb3,db4,f4] ~@3", // Bbm
  C: "~@4 [bb3,db4,gb4] ~ [bb3,db4,gb4] ~@3 [bb3,db4,gb4] ~ [bb3,db4,gb4] ~@3", // Gb
  D: "~@4 [c4,eb4,ab4] ~ [c4,eb4,ab4] ~@3 [c4,eb4,ab4] ~ [c4,eb4,ab4] ~@3", // Ab
  E: "~@4 [a3,c4,f4] ~ [a3,c4,f4] ~@3 [a3,c4,f4] ~ [a3,c4,f4] ~@3", // F
  F: "~@4 [ab3,b3,f4] ~ [ab3,b3,f4] ~@3 [ab3,b3,f4] ~ [ab3,b3,f4] ~@3", // Fdim
  G: "~@4 [bb3,db4,g4] ~ [bb3,db4,g4] ~@3 [bb3,db4,g4] ~ [bb3,db4,g4] ~@3", // Gdim
  H: "~@4 [db4,f4,ab4] ~ [db4,f4,ab4] ~@3 [db4,f4,ab4] ~ [db4,f4,ab4] ~@3", // Db
  I: "~@4 [bb3,d4,f4] ~ [bb3,d4,f4]!3 ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~", // Bb
  J: "~@4 [bb3,eb4,g4] ~ [bb3,eb4,g4] ~@3 [bb3,eb4,g4] ~ [bb3,eb4,g4] ~@3", // Eb
  K: "~@4 [c4,eb4,gb4] ~ [c4,eb4,gb4] ~@3 [c4,eb4,gb4] ~ [c4,eb4,gb4] ~@3", // Cdim
  L: "~@4 [bb3,d4,f4] ~ [bb3,d4,f4] ~@3 [bb3,d4,f4] ~ [bb3,d4,f4] ~@3", // Bb
  M: "~@4 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~@3 [bb3,eb4,gb4] ~ [bb3,eb4,gb4] ~@3", N: "[bb3,eb4,g4] ~@11 [bb3,eb4,g4] ~@3",
  O: "~@4 [db4,e4,a4] ~ [db4,e4,a4] ~@5 [db4,e4,a4] ~ [db4,e4,a4] ~", // A
  P: "~@4 [a3,d4,gb4] ~ [a3,d4,gb4] ~@3 [a3,d4,gb4] ~ [a3,d4,gb4] ~@3", // D
  Q: "~@4 [b3,d4,gb4] ~ [b3,d4,gb4] ~@3 [b3,d4,gb4] ~ [b3,d4,gb4] ~@3", // Bm
  R: "~@4 [a3,c4,gb4] ~ [a3,c4,gb4] ~@3 [a3,c4,gb4] ~ [a3,c4,gb4] ~@3", // Gbdim
  S: "~@4 [b3,d4,g4] ~ [b3,d4,g4] ~@3 [b3,d4,g4] ~ [b3,d4,g4] ~@3", // G
  T: "~@4 [b3,d4,ab4] ~ [b3,d4,ab4] ~@3 [b3,d4,ab4] ~ [b3,d4,ab4] ~@3", // Abdim
  U: "~@4 [d4,gb4,a4] ~ [d4,gb4,a4] ~@3 [d4,gb4,a4] ~ [d4,gb4,a4] ~@3", // D
  V: "~@4 [b3,eb4,gb4] ~ [b3,eb4,gb4]!3 ~ [b3,eb4,gb4] ~ [b3,eb4,gb4] ~ [b3,eb4,gb4] ~", // B
  W: "~@4 [b3,e4,ab4] ~ [b3,e4,ab4] ~@3 [b3,e4,ab4] ~ [b3,e4,ab4] ~@3", // E
  X: "~@4 [db4,e4,a4] ~ [db4,e4,a4] ~@3 [db4,e4,a4] ~ [db4,e4,a4] ~@3", Y: "[[gb3,a3,d4]@15 ~]/3",
})).s("gm_acoustic_guitar_steel").gain(0.35).pan(0.7)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@13 A@2 B C D@2 E F ~@4 A@2 G@2 H@2 I@2 D@2 E F ~@8 J@2 K@2 L@2 M@2 ~@5 N O P Q R S@2 D@2 E F ~@3 T U V W@2 X Y Z AA
  AB@2 AC@2 AD AE ~@23
>`.pickRestart({
  A: "db4/2", B: "b3@15 ~", C: "~@4 f4 ~ ab4 ~@3 b4 ~ eb5 ~@3", D: "bb5/2", E: "f6@3 eb6",
  F: "d6@3 ~ d6 ~ d6 ~@3 d6 ~ d6 ~@3", G: "c4/2", H: "bb3/2", I: "[ab3@19 ~ b5 ~ b5 ~@3 db6 ~ b5 ~@3]/2", J: "c6/2",
  K: "db6/2", L: "d6/2", M: "eb6/2", N: "~@4 ab5 ~ ab5 ~@3 db6 ~ f6 ~@3", O: "eb6 ~@7",
  P: "~@4 a5 ~ a5 ~@3 c6 ~ eb6 ~@3", Q: "db6 ~@7", R: "~@4 f5 ~ f5 ~@3 ab5 ~ db6 ~@3",
  S: "[b5@19 ~ b5 ~ b5 ~@3 db6 ~ b5 ~@3]/2", T: "~@4 ab5 ~ ab5 ~@3 db6 ~ eb6 ~@3", U: "db6 ~@15",
  V: "a3 ab3 a3 bb3 b3 c4 db4 d4 eb4 e4 f4 gb4 g4 ab4 a4 db5", W: "[gb6@19 ~ a5 ~ a5 ~@3 d6 ~ gb6 ~@3]/2", X: "e6 ~@7",
  Y: "~@4 bb5 ~ bb5 ~@3 db6 ~ e6 ~@3", Z: "d6 ~@7", AA: "~@4 gb5 ~ gb5 ~@3 a5 ~ d6 ~@3",
  AB: "[c6@19 ~ c6 ~ c6 ~@3 d6 ~ c6 ~@3]/2", AC: "b5/2", AD: "gb6@3 e6", AE: "eb6@3 ~ eb6 ~ eb6 ~@3 eb6 ~ eb6 ~@3",
})).s("gm_string_ensemble_1").gain(0.4)

// other · pizzicato strings
const pizzicato_strings = note("<~@24 A ~ B C D E F G H ~@31 H ~@17 I ~@27>".pickRestart({
  A: "~@4 [ab4,ab5] ~ [ab4,ab5] ~@3 [c5,c6] ~ [eb5,eb6] ~@3", B: "~@4 ab4 ~ ab4 ~@3 db5 ~ f5 ~@3", C: "eb5 ~@15",
  D: "~@4 a4 ~ a4 ~@3 c5 ~ eb5 ~@3", E: "db5 ~@15", F: "~@4 f4 ~ f4 ~@3 ab4 ~ db5 ~@3", G: "b4 ~@15",
  H: "~@4 b4 ~ b4 ~@3 db5 ~ b4 ~@3", I: "~@4 c5 ~ c5 ~@3 d5 ~ c5 ~@3",
})).s("gm_pizzicato_strings").gain(0.45)

// other · marimba
const marimba = note("<~@24 A ~ B C D E F G H ~@31 H ~@17 I ~@27>".pickRestart({
  A: "~@4 [ab3,ab4] ~ [ab3,ab4] ~@3 [c4,c5] ~ [eb4,eb5] ~@3", B: "~@4 ab3 ~ ab3 ~@3 db4 ~ f4 ~@3", C: "eb4 ~@15",
  D: "~@4 a3 ~ a3 ~@3 c4 ~ eb4 ~@3", E: "db4 ~@15", F: "~@4 f3 ~ f3 ~@3 ab3 ~ db4 ~@3", G: "b3 ~@15",
  H: "~@4 b3 ~ b3 ~@3 db4 ~ b3 ~@3", I: "~@4 c4 ~ c4 ~@3 d4 ~ c4 ~@3",
})).s("gm_marimba").gain(0.4)

// other · trumpet
const trumpet = note("<~@40 [~@4 db3@3 ~ c3@3 ~ bb2@3 ~] ~@69>").s("gm_trumpet").gain(0.45)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@3 B A@3 B A@7 B A@3 B A@3 B A@7 B A@3 B A@3 ~ A@12 ~@2 A ~ A@7 B A@3 B A@4 B ~ A@7 B A@3 B A@7 B A@3 B A@3 B A@3 B
  ~@2 C
>`.pickRestart({
  A: "x!2", B: "x", C: "~@13 x ~@2",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct(`<
  ~ A@3 B A@3 B A@7 B A@3 B A@3 B A@7 B A@3 B A@3 C A@3 D A@3 D A@4 E@2 A C A@7 B A@3 B A@5 F A@7 B A@3 B A@7 B A@3 B
  A@3 B A@3 B ~@3
>`.pickRestart({
  A: "x!2 ~ x!3 ~ x", B: "x", C: "x ~ x!3 ~ x!3 ~ x!3 ~ x ~", D: "x!2 ~ x!2 ~ x!2", E: "x ~@2 x",
  F: "~@2 x!3 ~ x!3 ~ x!3 ~ x ~",
})).gain(0.45)

// drums · clap
const clap = s("cp").struct(`<
  ~ A@3 B A@3 B A@7 B A@3 B A@3 C A@7 B A@3 C A@3 D A E A F A E A C A@4 G@2 A D A@7 B A@3 C A@4 H I A@7 B A@3 C A@7 B
  A@3 B A@3 B A@3 B J ~@2
>`.pickRestart({
  A: "~ x ~ x", B: "~@2 x!2 ~ x!2 ~", C: "~@4 x ~ x!3 ~ x ~ x ~ x ~", D: "x ~ x!3 ~ x!3 ~ x!3 ~ x ~",
  E: "~@2 x ~@2 x!2 ~", F: "~@2 x ~@2 x ~ x", G: "x ~@2 x", H: "~@2 x ~ x!2 ~ x", I: "~@2 x!3 ~ x!3 ~ x!3 ~ x ~",
  J: "x",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@109 [~@13 x ~@2]>").gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct("<~@109 [~@3 x]>").gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@109 [~@3 x]>").gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct("<~ A@39 ~ A@3 B A@3 B A@3 B ~@2 A B A@50 ~@3>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.4)

stack(
  piano, bass, acoustic_guitar_steel, string_ensemble_1, pizzicato_strings, marimba, trumpet, kick, snare, clap,
  low_tom, mid_tom, high_tom, tambourine
)

More by Neil Sedaka