Strudelify

the air that i breathe

Albert Hammond & Mike Hazelwood

KeyB♭ majorTempo88 bpm
0:00/0:00
// the air that i breathe — Albert Hammond & Mike Hazelwood
// 88 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Transcription provider: pdmx. https://musescore.com/score/5862253; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(88/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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.

// other · trumpet · "B♭ Trumpet"
const trumpet = note(`<
  ~@19 A@2 B@2 C@2 D@2 ~@8 E F@2 E F@2 E G@2 ~@4 H I J H ~@8 E F@2 E F@2 E G@2 ~@4 E F@2 E F@2 E F@2 E K L@2 ~
>`.pickRestart({
  A: "[a4@5 bb4 c5 d5@2 a4@4 bb4 c5 d5]/2", B: "[eb5@3 eb5 f5@2 eb5 d5@5 ~@4]/2",
  C: "[a4@5 bb4 c5 d5@2 a4 a4@3 d5!3]/2", D: "[eb5@3 f5@3 eb5 d5@3 d5@4 ~@2]/2", E: "bb4@3 bb4@5",
  F: "[~@2 f5!5 f5@2 eb5 d5 c5@3 bb4 a4]/2", G: "[~@2 f5!5 f5@2 eb5 d5 f5@5]/2", H: "~ c4 ~ c4", I: "~ bb3 ~ bb3",
  J: "~ d4 ~ d4", K: "~@13 d4@3", L: "[f4@3 bb4@2 d5@27]/2",
})).s("gm_trumpet").gain(0.35).pan(0)

// other · french horn · "Flügelhorn"
const french_horn = note(`<
  A B C D E F G@2 H I@2 ~ E F J K H L@2 M@2 N@2 M@2 O@2 P Q@2 R S T U@2 V W@2 V W@2 V X@2 Y Z AA AB ~@4 E F J AC AD L@2
  AE V W@2 V W@2 V X@2 Y Z AA AB V W@2 V W@2 V W@2 V AF@3 ~
>`.pickRestart({
  A: "ab4@2 ~@2 c5@2 bb4 ab4", B: "g4@2 ~@2 bb4@2 ab4 g4", C: "f4@2 ~@2 d4@2 c4 bb3", D: "a3", E: "bb4@4 ~@2 a4 bb4",
  F: "c5@2 bb4 a4@3 ~ f4", G: "[gb4@4 ~@2 d5 c5@3 ~@6]/2", H: "g4@6 eb4 f4", I: "[gb4 ab4@2 bb4@2 bb4@2 bb4@5 ~@4]/2",
  J: "gb4@4 ~@2 d5 c5", K: "c5 bb4 a4@6 ~@8", L: "[gb4 ab4@2 bb4@2 c5@2 bb4@5 ~@4]/2", M: "~@2 f4!2 f4@2 f4@2",
  N: "[~@2 bb4!2 bb4@2 bb4 bb4@3 bb4@2 bb4@2 bb4@2]/2", O: "[bb4@3 gb4 gb4@2 gb4 f4@9]/2", P: "f4", Q: "[f4@7 gb4@9]/2",
  R: "gb4", S: "eb4", T: "db4@3 c4", U: "d4", V: "d4@3 d4@5", W: "[~@2 bb4!5 a4@2 a4!2 a4@3 f4!2]/2",
  X: "[~@2 bb4!5 a4@2 a4!2 a4@5]/2", Y: "ab4@4 ab4@3 ab4!2 ~ ab4@6", Z: "g4@4 g4@3 g4!2 ~ g4@6",
  AA: "d4@4 d4@3 d4!2 ~ d4@6", AB: "c4@4 c4@3 c4!2 ~ c4@6", AC: "c5 bb4 a4@10 ~@2 a4@2", AD: "g4@4 ~@2 eb4 f4",
  AE: "bb4", AF: "[bb4@7 f4@9]/3",
})).s("gm_french_horn").gain(0.3).pan(1)

// other · trombone
const trombone = note(`<
  A B C D ~@21 E@2 F G@3 H I J ~ K L@2 K L@2 K M@2 N O P Q R S T U ~@5 V W ~ K L@2 K L@2 K M@2 N O P Q K L@2 K L@2 K L@2
  K X@4
>`.pickRestart({
  A: "~ ab3 c4 ab3 ~ ab3 c4 ab3", B: "~ g3 bb3 g3 ~ g3 bb3 g3", C: "~ bb3 d4 bb3 ~ bb3 d4 bb3",
  D: "~ a3 c4 a3 ~ a3 c4 a3", E: "[~@2 bb2@2 eb3@2 eb3 bb3@9]/2", F: "bb3@5 a3 bb3 c4",
  G: "[~@2 bb3@2 ~@2 a3@2 ~@2 f3@2 ~@2 gb3@10 ~@4 d4@2 c4@5 bb3 a3@3 g3 gb3@4 ~@4]/3", H: "g3@4 ~@2 eb3 f3",
  I: "gb3 ~ ab3@3 ~ bb3@6 ~@2 c4@2", J: "bb3", K: "~ bb3 ~ bb3", L: "[~@2 f4!5 f4@2 eb4 d4 c4@3 bb3 a3]/2",
  M: "[~@2 f4!5 f4@2 eb4 d4 f4@3 ~@2]/2", N: "~@2 c4 bb3 ab3@2 c4!2", O: "bb3@6 g3!2 d4 f4 d4@2 ~@4",
  P: "~@2 bb3 d4 g4 f4 d4 bb3", Q: "d4@2 c4 bb3 c4 ~ c4@10", R: "ab3@4 ab3@3 ab3!2 ~ ab3@6", S: "g3@4 g3@3 g3!2 ~ g3@6",
  T: "bb3@4 bb3@3 bb3!2 ~ bb3@6", U: "a3@4 a3@3 a3!2 ~ a3@6", V: "db3@5 c3@3", W: "f3!2",
  X: "[~@3 f3@2 d4@3 f3@3 bb3@38 ~@15]/4",
})).s("gm_trombone").gain(0.2).pan(0.7)

// other · trombone · soft notes
const trombone_soft = note("<~@4 A B C D E D A B A B C D E D A ~@40 F ~@27>".pickRestart({
  A: "~@4 f3@3 f3 f3@2 f3@2 f3@4", B: "~@4 f3@3 f3 f3@2 f3@2 f3@2 f3@2", C: "~@4 a3@3 a3 a3@2 a3@2 a3@4",
  D: "~@4 gb3@3 gb3 gb3@2 gb3@2 gb3@2 gb3@2", E: "~@4 g3@3 g3 g3@2 g3@2 g3@4", F: "f3",
})).s("gm_trombone").gain(0.13).pan(0.7)

// bass · tuba
const bass = note(`<
  A B A C D@2 E@2 F@2 D G@3 H@2 I@2 J K L M N K L O@2 P Q@2 R S T P@2 U V@2 W V@2 W X@2 Y Z Y@3 Z Y@2 AA@2 H@2 I T P AB
  U V@2 W V@2 W X@2 Y Z Y@2 U V@2 W V@2 W AC Y W AD@3 ~
>`.pickRestart({
  A: "f3@2 f3!2", B: "eb3@2 eb3!2", C: "f3", D: "bb2 ~ bb2 ~", E: "d3 ~ d3 ~", F: "eb3 ~ eb3 ~",
  G: "bb2@4 ~@4 bb2@4 f2 ~ g2 ~", H: "d3@4 ~@4 d3@4 a2 ~ c3 ~", I: "eb3@4 ~@4 eb3@4 bb2 ~ d3 ~", J: "bb2 ~ bb2 bb1",
  K: "d2@8 ~@4 a1 ~ c2 ~", L: "d2@2 ~ d2", M: "eb2@8 ~@4 gb2 ~ eb2 ~", N: "bb1@2 ~ bb1",
  O: "[eb2@6 ~ bb1@2 f2 bb2 d3 f3 d3 bb2 f2]/2", P: "bb2@4 bb2@3 bb2!2 ~ bb2@6",
  Q: "[bb2@4 bb2@3 bb2!2 ~ bb2@4 d3@6 d3@3 d3!2 ~ d3@6]/2", R: "d3@4 d3@3 d3!2 ~ d3@6", S: "eb3@4 eb3@3 eb3!2 ~ eb3@6",
  T: "gb2@4 gb2@3 gb2!2 ~ gb2@6", U: "bb2@4 bb2@3 bb2!2 ~ bb2@4 f2@2",
  V: "[bb2@4 bb2@3 bb2 bb2@4 bb2@2 f2@6 f2@3 f2!2 ~ f2@6]/2", W: "bb2@4 bb2@3 bb2 bb2@2 bb2@2 bb2@2 f2@2",
  X: "[bb2@4 bb2@3 bb2 bb2@4 bb2@2 f2@4 f2@2 f2@2 f2@10]/2", Y: "f2@4 f2@3 f2!2 ~ f2@6", Z: "eb2@4 eb2@3 eb2!2 ~ eb2@6",
  AA: "bb2@4 bb2 ~ bb2 ~ bb2@4 bb2 ~ bb2 ~", AB: "~ bb2!4 ~@2 bb2!4 ~ bb2 ~ bb2 ~",
  AC: "bb2@4 bb2@3 bb2 bb2@4 bb2@2 f2@2", AD: "[bb2@7 bb1@9]/3",
})).s("gm_tuba").gain(0.3)

stack(trumpet, french_horn, trombone, trombone_soft, bass)