Strudelify

A Nightingale Sang in Berkeley Square

Frank Sinatra

KeyE♭ majorTempo76 bpm
0:00/0:00
// A Nightingale Sang in Berkeley Square — Frank Sinatra
// 76 bpm, 4/4, key Eb major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 85 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(76/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 · epiano1 · "Grand Piano"
const epiano1 = note(`<
  A B C D E F G H I J K L M N E F G H I J K L O P Q R S T Q R S U E F G H I J K L V W X Y G Z AA AB AC AD AE L AF AG AH
  AI AJ AK E AL AM AN AO AP AQ AR AO AS AT AU E F G H I J K L AV AW AX AY AZ BA@2
>`.pickRestart({
  A: "~ bb3 c4 d4 eb4 f4 g4 ab4, [eb3,g3] [c3,bb3]", B: "bb4@2 bb4 ~@4 g4, [f3,eb4] [bb3,d4], ~@3 g4@4 ~",
  C: "[d4,f4]@3 [d4,f4] [c4,eb4]@3 [c4,eb4], [g3,bb3] [gb3,a3]", // Dm Cm Gm Gbm
  D: "[eb3,f3,ab3,c4]@2 [eb3,f3,ab3,c4] [d3,f3,ab3,bb3]@5", E: "[eb3,bb3,d4,g4] [c3,g3,bb3,eb4]",
  F: "[g3,bb3,d4,f4] [f3,ab3,c4,eb4] [eb3,g3,bb3,d4] [eb3,bb3,db4,g4]", G: "[eb3,ab3,c4,g4] [d3,g3,b3,f4]",
  H: "[c3,g3,bb3,eb4] [db3,f3,b3,eb4]", I: "[eb3,bb3,d4,g4] [f3,bb3,d4,ab4]",
  J: "[f3,bb3,db4,ab4] [eb3,bb3,db4,g4] [eb3,ab3,b3,gb4] [db3,ab3,b3,f4]", // Bbm7 Eb7 Abm7 Db7
  K: "[eb3,bb3,d4,g4] [f3,c4,eb4,ab4] [g3,d4,f4,bb4]@2 [c3,g3,bb3,eb4]@4", L: "[f3,c4,eb4,ab4] [f3,bb3,d4,ab4]",
  M: "g4 bb3 c4 d4 eb4 f4 g4 ab4, [eb3,g3] [c3,bb3]", N: "[f3,ab3,eb4,bb4]@2 [f3,ab3,eb4,bb4] [bb2,ab3,d4,g4]@5",
  O: "[eb4,g4] [g3,bb3] [ab3,c4] [bb3,d4] [c4,eb4] [d4,f4] [eb4,g4] [f4,ab4], eb3", // Eb Gm Ab Bb Cm Dm Eb Fm
  P: "[a3,c4,eb4,g4]@2 [a3,c4,eb4,g4] [d3,c4,d4,gb4]@5", Q: "[g3,b3,d4,gb4] [g3,b3,d4,e4]",
  R: "[a3,c4,e4,g4] [d3,c4,d4,gb4]", S: "[gb3,a3,b3,d4] [e3,g3,bb3,db4]", T: "[e3,g3,a3,c4] [d3,gb3,a3,c4]",
  U: "[eb3,f3,ab3,c4] [d3,f3,ab3,bb3]", V: "~ [g3,bb3] [ab3,c4] [bb3,d4] [c4,eb4] [d4,f4] [eb4,g4] [f4,ab4], eb3",
  W: "[f3,ab3,eb4,g4]@2 [f3,ab3,c4,eb4] [bb2,ab3,d4,f4]@5", X: "[eb3,bb3,d4,g4] [eb3,bb3,c4,g4]",
  Y: "[g3,bb3,d4,f4] [g3,bb3,db4,eb4]", Z: "[c3,g3,bb3,eb4] [b2,f3,ab3,eb4]", AA: "[eb3,bb3,d4,g4] [f3,c4,eb4,ab4]",
  AB: "[g3,d4,f4,bb4]@2 [ab3,eb4,gb4,b4] [ab3,db4,gb4,b4]", AC: "[g3,d4,f4,bb4] [c3,g3,bb3,eb4]",
  AD: "[f3,c4,eb4,ab4] [bb2,f3,ab3,d4]", AE: "[eb3,g3,bb3,eb4]@3 [eb3,g3,c4,g4]", AF: "[eb2,bb2,g3,d4] [f2,c3,ab3,eb4]",
  AG: "[g2,d3,bb3,f4] [f2,c3,ab3,eb4] [g3,d4] [g3,db4], ~ [eb2,bb2]", // Gm7 Fm7 G5 Gdim Eb5
  AH: "[g3,c4] [f3,c4] [ab3,c4,d4] [g3,b3,d4], [ab2,eb3] [g2,f3]", // C5 F5 Dm7b5 G Ab5 G7
  AI: "[c3,g3,bb3,eb4] [bb2,g3,c4,eb4] [ab2,gb3,b3,eb4] [db3,f3,b3,db4]", AJ: "[eb2,bb2,g3,d4]!2 [f2,c3,ab3,eb4]!2",
  AK: "[g2,d3,bb3,f4]!2 [ab2,eb3,b3,gb4] [db3,b3,f4]", AL: "[c3,f3,ab3,eb4] [bb2,f3,ab3,d4]",
  AM: "eb4 bb4 g4 f4 eb4 f4 g4@2, [eb3,g3,bb3,c4]", AN: "~ c5 a4 g4 gb4 g4 a4@2, [e3,g3,a3,c4] [d3,gb3,a3,c4]",
  AO: "~ [d4,d5] [e4,e5] [gb4,gb5] [g4,g5] [a4,a5] [b4,b5] [c5,c6]", AP: "[d5,d6]@2 [d5,d6] [b4,b5]@4 [b4,b5]",
  AQ: "[a4,a5]@2 [a4,a5]@2 [gb4,gb5]@3 [gb4,gb5]", AR: "[e4,e5]!2 [d4,d5]@2",
  AS: "[d5,d6]@2 [d5,d6]@2 [b4,b5]@3 [b4,b5]", AT: "[a4,a5]@2 [a4,a5]@2 [g4,g5]@3 [g4,g5]",
  AU: "[c5,c6]@2 [c5,c6]@2 [bb4,bb5]@3 ~", // C Bb
  AV: "[eb3,g3,bb3,c4,eb4]@3 [eb3,g3,c4,eb4] [g3,bb3,c4,eb4,g4]@2 [bb3,c4,eb4,g4,bb4]@2", // Cm7 Cm Cm7
  AW: "[f3,c4,eb4,ab4]@2 [ab3,bb3,d4,g4] [ab3,bb3,d4,f4]", AX: "[db3,f3,ab3,b3,eb4] [c3,e3,g3,bb3,d4]",
  AY: "[f3,ab3,b3,eb4]@2 [f3,ab3,c4,eb4] [f3,ab3,bb3,d4]", AZ: "[g3,bb3,c4,eb4] [f3,ab3,b3,eb4]",
  BA: "[~@2 [eb3,g3,c4,f4] ~ [eb3,g3,c4,f4]!2 ~ [eb3,g3,c4,f4]@7 ~@2]/2", // Cm
})).s("gm_epiano1").gain(0.25).pan(0.9)

// bass · acoustic bass
const bass = note(`<
  A B C D E F G H I J K L M N E F G H I J K L O P Q R S T Q R S L E F G H I J K L O U V W X Y Z AA A AB AC L Z F X AD Z
  AA M N AE P AF R S P AF R S L E F G H I J K L M B AG AH AI AJ AK
>`.pickRestart({
  A: "eb2!2 c2!2", B: "f2!2 bb2 ab2", C: "g2!2 gb2!2", D: "f2!2 bb1 bb2", E: "eb3@2 d3@2 c3@2 bb2 ab2",
  F: "g2 f2 eb2 g2", G: "ab2 g2", H: "c3!2 db3!2", I: "eb3 eb2 f2 bb2", J: "eb2!2 ab2 db2", K: "eb2 f2 g2@2 c3@2 c2@2",
  L: "f2!2 bb2 bb1", M: "eb2 d3 c3!2", N: "f2!2 bb2!2", O: "eb2 d3 c3 bb2", P: "a2!2 d3 d2", Q: "g2!2 e2!2",
  R: "a2!2 d3 c3", S: "b2!2 bb2!2", T: "a2!2 d2 gb2", U: "ab2 g2 f2 bb2", V: "eb2 bb2 c3!2", W: "g2 bb2 eb3 eb2",
  X: "ab2!2 g2!2", Y: "c2!2 db2!2", Z: "eb2!2 f2!2", AA: "g2!2 ab2 db2", AB: "f2!2 bb1!2", AC: "eb2!2 g2 eb2",
  AD: "c3 bb2 ab2 db2", AE: "eb3 d3 c3 bb2", AF: "g2@3 gb2 e2@2 e2@2", AG: "db2!2 c2!2", AH: "f2 b2 bb2 bb1",
  AI: "eb2!2 ab1!2", AJ: "eb2 g2 bb2 g2", AK: "eb2 bb1 eb2 ~",
})).s("gm_acoustic_bass").gain(0.48).pan(0.3)

// other · trombone
const trombone = note(`<
  ~@4 A B C D E F G H I ~ A B C D E F G H I ~ J K L M J K N O A B C D E F G H I ~@5 P Q R S I T U V W X Y Z AA AB AC ~
  AD AE AF AE AD AE AF S A B C D E F G H I AG AH AI AJ AK@2
>`.pickRestart({
  A: "bb3@2 bb3@2 g3@3 bb3", B: "d4 c4 bb3!2", C: "eb4@3 eb4@2 eb4@3 f4@3 f4@2 f4@3", D: "g4 f4",
  E: "eb4@2 d4@2 d4@3 bb3", F: "db4 b3", G: "bb3 c4 d4@2 g3@2 bb3@2", H: "ab3!2", I: "g3", J: "~ g3 b3!2 d4!2 e4!2",
  K: "e4 e4@2 eb4@4 eb4", L: "d4@2 d4@2 g3@3 g3", M: "g3 a3 a3@2", N: "d4@2 d4@2 db4@3 db4", O: "eb4@2 eb4@2 d4@3 ~",
  P: "bb2 c3", Q: "d3 eb3 gb3 f3", R: "g3@3 bb3", S: "ab3", T: "~ f3 ab3 eb4 d4 c4 bb3 ab3", U: "g3@2 g3@2 eb3@3 eb3",
  V: "bb3@2 bb3@2 g3@2 eb3!2", W: "c4@3 c4@2 c4@3 d4@3 d4@2 d4@3", X: "eb4@6 eb4!2", Y: "d4@2 bb3@2 c4@3 ab3",
  Z: "bb3@2 eb3@2 bb3@2 ab3!2", AA: "g3 ab3 bb3@2 eb3@2 eb3@2", AB: "eb3 f3", AC: "eb3", AD: "gb3 e3", AE: "g3 gb3",
  AF: "a3 g3", AG: "~ eb4 d4 c4 ab3@2 ab3@2", AH: "b3 bb3", AI: "ab3 f3 g3 ab3 ab3@2 ab3@2", AJ: "g3 f3",
  AK: "[c4@7 ~]/2",
})).s("gm_trombone").gain(0.35).pan(0)

// other · trumpet
const trumpet = note(`<
  ~@3 A B C D E F G H I J A B C D K F G H I J ~ L M N O L M P Q B C D K F G H I J ~@5 R S T U V ~@5 W X Y ~@10 A B C D K
  F G H I J Z AA AB AC AD@2
>`.pickRestart({
  A: "~@7 bb3", B: "g4@2 g4@2 eb4@3 eb4", C: "bb4@2 bb4@2 g4@2 eb4!2", D: "c5@3 c5@2 c5@3 d5@3 d5@2 d5@3",
  E: "eb5@6 eb5!2", F: "d5@2 bb4@2 c5@3 ab4", G: "bb4@2 eb4@2 bb4@2 ab4!2", H: "g4 ab4 bb4@2 eb4@2 eb4@2", I: "eb4 f4",
  J: "eb4", K: "eb5@3 eb5", L: "~ d4 e4 gb4 g4 a4 b4 c5", M: "d5 d5@2 b4@4 b4", N: "a4@2 a4@2 gb4@3 gb4",
  O: "e4!2 d4@2", P: "a4@2 a4@2 g4@3 g4", Q: "c5@2 c5@2 bb4@3 bb3", R: "g3 ab3", S: "bb3 b3", T: "bb3 d4@2 c4",
  U: "c4 eb4@2 d4", V: "c4", W: "g4 ab4", X: "bb4 b4", Y: "bb4 ~", Z: "~ c5 bb4 ab4 g4@2 f4@2", AA: "g4",
  AB: "~ ab4 g4 f4 eb4@2 d4@2", AC: "eb4@4 f4 g4 d4 eb4", AD: "[bb4@7 ~]/2",
})).s("gm_trumpet").gain(0.27).pan(0)

// other · baritone sax
const baritone_sax = note(`<
  ~@4 A B C D E F G H I ~ A B C D E F G H I ~ J K L M J K L N A B C D E F G H I ~@5 O P Q R I ~@5 O P S ~@3 T U V U T U
  V W A B C D E F G H I X Y Z AA AB@2
>`.pickRestart({
  A: "eb3@3 d3 c3@2 bb2 ab2", B: "g2 g3 f3@2 eb3@2 g3@2", C: "ab3@3 ab3@2 ab3@3 b3@3 b3@2 b3@3", D: "c4 b3",
  E: "bb3@2 g3@2 ab3@3 f3", F: "ab3 g3 ab3 db3", G: "eb3 f3 g3@2 c3@2 c3@2", H: "f2 bb2", I: "eb3",
  J: "~ e3 g3!2 b3!2 d4!2", K: "a3 a3@2 c4@4 c4", L: "b3@2 b3@2 bb3@3 bb3", M: "a3 g3 gb3@2", N: "ab3@2 ab3@2 ab3@3 ~",
  O: "eb2 f2", P: "g2@2 ab2 db3", Q: "eb3 c3", R: "f3 bb2", S: "eb3 ~", T: "g2@3 g2", U: "a2 d3", V: "b2 bb2",
  W: "eb3 d3", X: "~ ab3 g3 f3 bb2@2 bb2@2", Y: "f3 e3", Z: "b2@2 bb2!2", AA: "eb3!2", AB: "[g3@7 ~]/2",
})).s("gm_baritone_sax").gain(0.56).pan(1)

// drums · kick
const kick = s("bd").struct("<[x!2]!83 [x ~ x ~ x!2 ~ x] [~ x!2 ~]>").gain(0.2)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!83 [x ~ x ~ x!2 ~ x] [~ x ~@2 x ~@3]>").gain(0.2)

// drums · open hat
const open_hat = s("oh").struct("<[x!4]!83 [x ~ x ~ x!2 ~ x] ~>").gain(0.2)

stack(epiano1, bass, trombone, trumpet, baritone_sax, kick, snare, open_hat)

More by Frank Sinatra