Strudelify

Love Is in the Air

Steve Allen

KeyC majorTempo120 bpm
0:00/0:00
// Love Is in the Air — Steve Allen
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 128 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/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 · music box
const music_box = note(`<
  ~@5 A@4 B@4 C D C E@4 F G@8 H D I@5 J@7 K@2 L@2 M ~@3 A@4 N@4 H O C P@4 Q@5 R@4 S T H U@4 V@7 K@2 W@2 X@6 Y@2 Z@2 X@6
  K@2 AA@2 AB@4 AC AD K@2 Z@2 AE@5
>`.pickRestart({
  A: "[g4@31 ~ [f4,a4]@31 ~, [c5,e5]@63 ~]/4", B: "[g4@31 ~ [f4,a4]@30 ~@2, [c5,e5]]/4", C: "[e4,g4,b4,d5]",
  D: "[f4,a4,c5,e5]", E: "[[a4,e5]@16 [g#4,d#5]@15 ~@17 [a#4,c#5]@15 d5, c5@47 ~@17, ~@32 [g4,e5]@31 ~]/4",
  F: "a4 [g4,b4], f4@7 ~@9", G: "[~@32 [f4,a4]@32 g4@30 ~@2 [f4,a4]@31 ~, [c5,e5]]/8", H: "[e4,b4,d5], g4@7 ~",
  I: "[[b4,d5]@15 ~ a4@15 ~ [g#4,d#5]@16 ~@16 [a#4,c#5]@16, e4@5 ~@7 [g4,e5]@8, g4@14 ~ c5@47 ~@18, ~@15 e5@16 ~@49]/5", // Bm G#5 A#m C
  J: "[a4@6 ~@2 g#4@8 ~@8 e5@8 f5@8 g5@8 a5@8 b5@8 c6@8 d6@8 ~@16 [f4,a4]@15 ~, d5@25 ~@87, f4@16 g4@79 ~@17, ~@8 b4@72 [c5,e5]@31 ~]/7", // F C
  K: "[g4@15 ~ [f4,a4]@15 ~, [c5,e5]]/2", L: "[b4@6 ~@2 [a4,e5]@4 [g#4,d#5]@3 ~, [e4,g4,d5] ~, ~@3 c5@5]/2",
  M: "g4, b4@13 ~@3, d5@5 ~@3", N: "[g4@30 ~@2 [f4,a4]@31 ~, [c5,e5]]/4", O: "[f4,c5,e5], a4@7 ~",
  P: "[[a4,e5]@16 [g#4,d#5]@15 ~@17 [a#4,c#5]@16, c5@23 ~@9, ~ e5, ~@16 g4@15 ~]/4", // A5 G#5 A#m
  Q: "[a4@8 b4@8 ~@32 [f4,a4]@31 ~, d5@16 [c5,e5]@63 ~, f4@6 ~@2 g4@39 ~@33]/5", R: "[g4@31 ~ [f4,a4]@31 ~, [c5,e5]]/4",
  S: "~ e4@3, [g4,b4,d5]", T: "[d4,c5], [f4,a4]@7 ~",
  U: "[[a4,e5]@16 [g#4,d#5]@15 ~@17 [a#4,c#5]@16, c5@23 ~@9, ~ [g4,e5]]/4", // A5 G#5 A#m C
  V: "[a4@6 ~@2 g#4@7 ~@9 e5@8 f5@8 g5@8 a5@8 b5@8 c6@8 d6@8 ~@16 a4@16, d5@25 ~@87, f4@16 g4@79 ~ f4@14 ~@2, ~ b4@9 [c5,e5]@4]/7", // C
  W: "[[b4,d5]@12 ~@4 [a4,e5]@8 [g#4,d#5]@7 ~, e4@17 ~@15, g4@15 ~@17, ~@3 c5@5]/2", // Bm A5 G#5
  X: "[d5@8 e5@8 f5@8 g5@8 a5@8 b5@8 c6@8 d6@8 ~@16 [f4,a4]@15 ~, g4@79 ~@17, b4@64 [c5,e5]@31 ~]/6", // F C
  Y: "[g4@14 ~@2 [f4,a4]@15 ~, [c5,e5]]/2", Z: "[b4@12 ~@4 [a4,e5]@8 [g#4,d#5]@7 ~, [e4,g4,d5] ~, ~@3 c5@5]/2",
  AA: "[b4@3 ~ [a4,e5]@2 [g#4,d#5]@2, [e4,d5]@17 ~@15, g4@15 ~@17, ~@3 c5@5]/2", AB: "[[g4,b4,d5]@61 ~@3]/4",
  AC: "[g4,c5,e5]@15 ~", AD: "[f4,a4,c5,e5]@15 ~", AE: "[[b4,d5]@32 [c5,e5]@5 ~@3, g4@37 ~@3]/5",
})).s("gm_music_box").gain(0.46)

// other · synth brass 1
const synth_brass_1 = note(`<
  A B@2 C D B E F G B E F@2 H F H I J K L M B E F N O P F@2 Q F Q R S T U V W X Y Z B AA AB F AC AD AE AF AE AG B@2 F AA
  D@2 F@2 Q F Q AH J W AI AJ P B F AA D B F@2 Q F Q AK S AL AM AN AE@2 X AG B AA AO F AP AQ AE@2 AF Z B AA B F AP AR
  AE@3 AG AS AA B F AP AQ AT@2 AF AE B AA AU F AP AQ AT AE@3 AV
>`.pickRestart({
  A: "~@7 g2", B: "c3 ~@2 c3 ~@2 g2@2 c3 ~@2 c3 ~@2 g2@2", C: "c3@2 ~ c3@2 ~ g2@2 c3@2 ~ c3 ~@2 g2@2",
  D: "c3 ~@2 c3@2 ~ g2@2 c3 ~@2 c3 ~@2 g2@2", E: "c3 ~@2 c3 ~@2 g2@2 c3 ~@2 c3 ~@2 c3@2",
  F: "f3 ~@2 f3 ~@2 c3@2 f3 ~@2 f3 ~@2 c3@2", G: "f3 ~@2 f3 ~@2 c3@2 f3 ~@2 f3 ~@2 f3@2",
  H: "g3 ~@2 g3 ~@2 d3@2 g3 ~@2 g3@2 ~ d3@2", I: "a2 ~@2 a2@2 ~ e2@2 a2 ~@2 a2 ~@2 a2@2",
  J: "g#2 ~@2 g#2 ~@2 d#2@2 g#2 ~@2 g#2 ~@2 d#2@2", K: "g2 ~@2 g2 ~@2 d2@2 g2 ~@2 g2 ~@2 g2@2",
  L: "g2@2 ~ g2@2 ~ g2 ~ g2 ~@2 g2@2 ~ g2@2", M: "d3 ~@2 d3@2 ~ d3@2 g2 ~@2 g2 ~@2 g2@2",
  N: "f3 ~@2 f3 ~@2 c3@2 f3 ~@2 f3 ~@2 c3 ~", O: "c3@2 ~ c3 ~@2 g2@2 c3 ~@2 c3@2 ~ g2@2",
  P: "c3 ~@2 c3 ~@2 g2@2 c3 ~@2 c3@2 ~ g2@2", Q: "g3 ~@2 g3 ~@2 d3@2 g3 ~@2 g3 ~@2 d3@2",
  R: "a2 ~@2 a2@2 ~ e2@2 a2 ~@2 a2 ~@2 e2@2", S: "g#2 ~@2 g#2 ~@2 d#2@2 g#2 ~@2 g#2@2 ~ d#2@2",
  T: "g2 ~@2 g2 ~@2 d2@2 g2 ~@2 g2 ~@2 g2 ~", U: "g2 ~@2 g2@2 ~ g2 ~ g2 ~@2 g2@2 ~ g2@2",
  V: "d3@2 ~ d3@2 ~ d3@2 g#2@2 ~ g#2@2 ~ g#2@2", W: "g2 ~@2 g2 ~@2 d2@2 g2 ~@2 g2@2 ~ g2 ~",
  X: "g2 ~@2 g2@2 ~ g2 ~ g2 ~@2 g2@2 ~ g2 ~", Y: "g2 ~@2 g2 ~@2 g2 ~ g2@2 ~ g2@2 ~ g2 ~",
  Z: "g2 ~@2 g2 ~@2 g2 ~ g2 ~@2 g2@2 ~ g2@2", AA: "f3 ~@2 f3 ~@2 c3@2 f3 ~@2 f3 ~@2 g2@2",
  AB: "c3 ~@2 c3@2 ~ g2@2 c3 ~@2 c3@2 ~ g2@2", AC: "e3 ~@2 e3 ~@2 b2@2 e3 ~@2 e3 ~@2 b2@2",
  AD: "a2@2 ~ a2 ~@2 e2@2 g#2 ~@2 g#2 ~@2 d#2@2", AE: "g2 ~@2 g2 ~@2 g2 ~ g2 ~@2 g2 ~@2 g2 ~",
  AF: "g2 ~@2 g2 ~@2 g2 ~ g2 ~@2 g2@2 ~ g2 ~", AG: "g2 ~@2 g2 ~@2 g2 ~ g2 ~@2 g2 ~@2 g2@2",
  AH: "a2@2 ~ a2@2 ~ e2@2 a2 ~@2 a2 ~@2 e2@2", AI: "g2 ~@2 g2@2 ~ g2 ~ g2@2 ~ g2@2 ~ g2@2",
  AJ: "d3 ~@2 d3 ~@2 d3 ~ g2 ~@2 g2 ~@2 g2@2", AK: "a2 ~@2 a2@2 ~ e2@2 a2 ~@2 a2@2 ~ e2@2",
  AL: "g2 ~@2 g2 ~@2 g2@2 g2 ~@2 g2@2 ~ g2 ~", AM: "g2 ~@2 g2@2 ~ g2 ~ g2 ~@2 g2 ~@2 g2@2",
  AN: "d3 ~@2 d3 ~@2 d3@2 g#2 ~@2 g#2 ~@2 g#2@2", AO: "c3@2 ~ c3@2 ~ g2@2 c3 ~@2 c3 ~@2 g2@2",
  AP: "e3 ~@2 e3 ~@2 b2@2 e3 ~@2 e3 ~@2 e2@2", AQ: "a2 ~@2 a2 ~@2 a2 ~ g#2 ~@2 g#2 ~@2 d#2@2",
  AR: "a2@2 ~ a2 ~@2 a2 ~ g#2 ~@2 g#2 ~@2 d#2@2", AS: "c3 ~@2 c3 ~@2 g2 ~ c3 ~@2 c3 ~@2 g2@2",
  AT: "g2@2 ~ g2 ~@2 g2 ~ g2 ~@2 g2 ~@2 g2 ~", AU: "c3@2 ~ c3 ~@2 g2@2 c3 ~@2 c3 ~@2 g2@2", AV: "c3 ~@3 c3 ~ c3!2 ~@8",
})).s("gm_synth_brass_1").gain(0.31)

// chords · piano
const piano = note(`<
  ~@5 A@2 B@2 C@2 D@2 E F G H I J K L A@2 M@2 A@2 M@2 N O P Q I R S T@5 U V U W X Y Z@2 ~@2 AA@2 M@2 AA@2 AB@2 AC AD AE
  AF AG AH AI AJ AK@2 M@2 AL@2 AM@2 AC AN AE AF I AO AP AQ AR@4 U AS AT AU AV AW AX@4 AT AY AT AU AZ AW BA@4 AT BB AT BC
  BD BE BF@2 BG@2 BH BI BH BJ BK BL BM@4 BN
>`.pickRestart({
  A: "[[c3,g3,c4,e4]@27 ~ [c3,g3,c4,e4]@4]/2", B: "[[f2,f3,a3,c4,e4]@29 ~@3]/2",
  C: "[[c3,g3,c4,e4]@27 ~ [c3,g3,c4,e4]@3 ~]/2", D: "[[f2,f3,a3,c4,e4]@27 ~ [f2,f3,a3,c4,e4]@4]/2",
  E: "[e2,e3,g3,b3,d4]@7 ~", F: "[d3,f3,a3]@9 ~@2 c#4 [f2,f3,a3,c4,e4]@4, [d2,c4]@11 ~@5", G: "[e2,e3,g3,b3,d4]@15 ~",
  H: "[a3,c4,e4]@13 ~@3, a2@15 ~", I: "[g#2,g#3,c4,d#4]@15 ~", J: "[g3,c4,e4]@13 ~@3, g2@15 ~",
  K: "[g3,a#3,c#4,e4]@7 ~, g2", L: "[f3,a3,d4]@7 ~ [g2,g3,b3,d4]@7 ~, d3@13 ~@3", M: "[[f2,f3,a3,c4,e4]@15 ~]/2",
  N: "[e3,g3,b3,d4]@13 ~@3, e2@15 ~", O: "[d3,f3,a3,c4]@7 ~ [d3,f3,a3,c4]@3 ~ [f3,a3,c4,e4]@3 ~",
  P: "[g3,b3,d4]@15 ~, e3 ~", Q: "[a2,a3,c4,e4]@15 ~", R: "[g2,g3,c4,e4]@15 ~, a#3 ~@15", S: "[g2,g3,a#3,c#4,e4]@7 ~",
  T: "[[d3,f3,a3,d4]@7 ~ [g#2,g#3,b3,d4]@6 ~@2 [b3,d4]@5 ~@3 [e4,e5]@7 ~ [f4,f5]@7 ~ [g4,g5]@7 ~ [a4,a5]@7 ~ [b4,b5]@7 ~ [c5,c6]@7 ~ [d5,d6]@8, ~@15 g2@58 ~@7, ~@16 d3@39 ~@25, ~@16 g3@31 ~@33]/5", // Dm G#dim Bm E F G A B …
  U: "[g3,c4,e4]@13 ~@3", // C
  V: "[e5,e6]@2 ~ [d5,d6] ~@2 [c5,c6] ~ [e5,e6]@2 ~ d6@2 ~ [c5,c6]@2, [f3,a3,c4,e4]@7 ~, ~@11 d5 ~@4", // E D C E C Fmaj7
  W: "[e5,e6]@2 ~ [d5,d6] ~@2 [c5,c6] ~ [e5,e6] ~@2 [d5,d6] ~@2 c6@2, [f3,a3,c4,e4]@13 ~@3, f#3 ~@13 c5 ~", // E D C E D Fmaj7
  X: "[b3,d4]@11 ~ [c5,c6]@2 ~@2, [e3,g3]@15 ~, ~@3 c4", Y: "[e3,a3]@7 ~ [g#3,c4,d#4,g#4]@7 ~, [a4,a5]@5 ~@11",
  Z: "[[g3,b3,d4,g4]@21 ~@11]/2", AA: "[[c3,g3,c4,e4]@31 ~]/2", AB: "[[f3,a3,c4,e4]@31 ~, f2@27 ~@5]/2",
  AC: "[e3,g3,b3,d4]@7 ~", AD: "[d3,f3,a3,c4]@11 ~ [f3,a3,c4,e4]@3 ~", AE: "[e3,b3,d4], g3@7 ~",
  AF: "[a2,a3,c4,e4]@7 ~", AG: "[g#3,c4,d#4]@13 ~@3, g#2@15 ~", AH: "[g2,g3,c4,e4]@13 ~@3",
  AI: "[g3,a#3,c#4]@7 ~, [g2,e4]", AJ: "[f3,a3,d4]@7 ~ [g2,g3,b3,d4]@8, d3@7 ~, ~@8 a2 ~@7",
  AK: "[[g3,c4]@29 ~@3, c3@31 ~]/2", AL: "[[c3,g3,c4,e4]@15 ~]/2", AM: "[[f3,a3,c4,e4]@15 ~, f2@7 ~]/2",
  AN: "[d3,f3,a3,c4]@10 ~@2 [f3,a3,c4,e4]@3 ~", AO: "[g2,g3,c4,e4]@15 ~", AP: "[g2,c#4,e4]@15 ~, [g3,a#3]@13 ~@3",
  AQ: "[f3,a3,d4]@3 ~ [g#2,b3,d4]@3 ~, d3@2 g#3 ~", // Dm G#dim
  AR: "[[d4,d5]@7 ~ [e4,e5]@7 ~ [f4,f5]@7 ~ [g4,g5]@7 ~ [a4,a5]@7 ~ [b4,b5]@7 ~ [c5,c6]@7 ~ [d5,d6]@8, g2@57 ~@7, ~@8 d3@17 ~@39]/4", // D E F G A B C D
  AS: "[e5,e6]@2 ~ [d5,d6]@2 ~ [c5,c6] ~ [e5,e6] ~@2 [d5,d6] ~@2 [c5,c6] ~, [f3,a3,c4,e4]@7 ~", AT: "[g3,c4,e4]@7 ~",
  AU: "[e5,e6]@2 ~ [d5,d6] ~@2 [c5,c6] ~ e5@2 ~ [d5,d6] ~@2 [c5,c6] ~, [f3,a3,c4,e4]@7 ~, ~@8 e6 ~@7", // E D C D C Fmaj7
  AV: "[e3,g3,b3,d4]@6 [c5,c6] ~, [b4,b5]@5 ~@3", AW: "[e3,a3,c4]@7 ~ [g#3,c4,d#4,g#4]@7 ~, [a4,a5]@5 ~@11",
  AX: "[d4@8 [e4,e5]@7 ~ [f4,f5]@7 ~ [g4,g5]@7 ~ [a4,a5]@7 ~ [b4,b5]@6 ~@2 [c5,c6]@7 ~ [d5,d6]@8, g3@61 ~@3, b3 ~@3, g4@5 ~@59]/4", // E F G A B C D
  AY: "[e5,e6]@2 ~ d5@2 ~ [c5,c6] ~ e5@2 ~ [d5,d6]@2 ~ [c5,c6]@2, [f3,a3,c4,e4]@7 ~, ~@3 d6 ~@4 e6 ~@7", // E C D C Fmaj7
  AZ: "[e3,g3,b3,d4]@6 [c5,c6] ~, [b4,b5]@9 ~@7", // Em7 C B
  BA: "[[d4,g4]@8 e4@5 ~@3 [b3,f4,f5]@8 [g4,g5]@7 ~ [a4,a5]@7 ~ [b4,b5]@6 ~@2 [c5,c6]@7 ~ [d5,d6]@8, g3@61 ~@3, b3@5 ~@11 d4@15 ~@33]/4", // G5 Bdim G A B C D
  BB: "e5@2 ~ d5@2 ~ [c5,c6] ~ e5@2 ~ d6@2 ~ [c5,c6]@2, [f3,a3,c4,e4]@7 ~, e6 ~@2 d6 ~@4 e6 ~@2 d5 ~@4", // C Fmaj7
  BC: "[e5,e6]@2 ~ d5@2 ~ [c5,c6] ~ [e5,e6] ~@2 [d5,d6] ~@2 [c5,c6] ~, [f3,a3,c4,e4]@7 ~, ~@3 d6 ~@12", // E C E D C Fmaj7
  BD: "[b4,b5]@5 ~ [c5,c6] ~, [e3,g3,b3]@7 ~", BE: "[e3,a3,c4]@8 [g#3,c4,d#4,g#4]@7 ~, [a4,a5]@3 ~@5",
  BF: "[[b3,d4,g4]@6 ~@2 [e4,e5]@7 ~ [d4,f4,f5]@8 [g4,g5]@7 ~, g3@31 ~, ~ b3@3]/2", // G E Dm G
  BG: "[[a4,a5]@7 ~ [b4,b5]@7 ~ [c5,c6]@7 ~ [d5,d6]@7 ~, g3@29 ~@3, ~@16 d5 ~@15]/2", BH: "[c4,e4]@15 ~, g3@13 ~@3",
  BI: "[e5,e6]@2 ~ d5@2 ~ [c5,c6] ~ [e5,e6]@2 ~ [d5,d6]@2 ~ c6@2, [f3,a3,c4,e4]@7 ~, ~@3 d6 ~@9 c5@2 ~", // E C E D Fmaj7
  BJ: "[e5,e6]@2 ~ [d5,d6]@2 ~ c6@2 [e5,e6]@2 ~ d6@2 ~ [c5,c6]@2, [f3,a3,c4,e4]@7 ~, ~@6 c5 ~@4 d5 ~@4", // E D E C Fmaj7
  BK: "[b4,b5]@5 ~ [c5,c6] ~, [e3,g3,b3,d4]@15 ~", BL: "[e3,a3,c4,a4]@7 ~ [g#3,c4,d#4,g#4]@7 ~, a5@5 ~@11",
  BM: "[[g4,d5]@6 ~@2 [e4,e5]@7 ~ [f4,f5]@7 ~ [g4,g5]@6 ~@2 [a4,a5]@6 ~@2 [b4,b5]@7 ~ [c5,c6]@7 ~ [d5,d6]@5 ~@3, [g3,b3]@61 ~@3, d4 ~@7]/4", // G5 E F G A B C D …
  BN: "[g3,c4,e4,e5,e6]@3 ~", // C
})).s("gm_piano").gain(0.31)

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

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

// drums · hihat
const hihat = s("hh").struct("<[x!3 ~] [x!2 ~ x!2 ~ x!4 ~ x!2 ~ x!2]!126 [x ~ x ~ x ~ x!2 ~@8]>").gain(0.2)

// drums · mid tom
const mid_tom = s("mt").struct("<~@40 A ~@45 B ~@9 C ~@9 D ~@9 C ~@8 E F ~>".pickRestart({
  A: "~@6 x!3 ~ x ~@5", B: "~@6 x ~ x!3 ~@5", C: "~@6 x ~ x!2 ~ x ~@4", D: "~@3 x!2 ~ x ~ x!3 ~@5", E: "~@11 x!2 ~@3",
  F: "~@10 x!3 ~@3",
})).gain(0.31)

// drums · high tom
const high_tom = s("ht").struct("<~@39 A B ~@44 A B ~@8 A C ~@8 D E ~@8 F C ~@7 F G H ~>".pickRestart({
  A: "~@14 x!2", B: "x!3 ~@5", C: "x!2 ~ x ~@12", D: "~@10 x ~ x!4", E: "x!2 ~@14", F: "~@15 x",
  G: "x!2 ~ x ~@2 x ~ x ~@7", H: "x!2 ~ x!2 ~ x ~ x ~@7",
})).gain(0.31)

// drums · crash
const crash = s("cr").struct("<~@41 A ~@45 A ~@9 A ~@9 A ~@9 A ~@9 B>".pickRestart({
  A: "x", B: "x ~@6 x ~@8",
})).gain(0.31)

// drums · tambourine
const tambourine = s("tb").struct("<~@3 [x!16]!64 [x ~ x!14] [x!16]!59 [x ~ x ~ x ~ x!2 ~@8]>").gain(0.15)

// drums · claves
const claves = s("clave:2").struct(`<
  ~@21 A B A B A B A B A B A B A@3 B A C A@2 D@6 E C@3 A@3 B C A C B A B A B A B A B A@3 B A B A B A B A B A B A B@2 C@2
  A D F G D G D G@3 D B G C B@3 G@2 C B C B C D G D G@3 D@11 H
>`.pickRestart({
  A: "x ~@2 x ~@2 x ~@9", B: "x ~@2 x ~@2 x ~ x ~@7", C: "x ~@2 x ~@2 x ~@7 x ~", D: "x ~@2 x ~@2 x ~ x ~@2 x ~@2 x ~",
  E: "x ~@2 x ~@2 x ~@3 x ~@3 x ~", F: "x ~@2 x ~@2 x ~ x ~@3 x ~ x ~", G: "x ~@2 x ~@2 x ~ x ~@5 x ~", H: "x!2 ~@2",
})).gain(0.75)

stack(music_box, synth_brass_1, piano, kick, low_tom, hihat, mid_tom, high_tom, crash, tambourine, claves)