Strudelify

Air

Ekseption

KeyD majorTempo69 bpm
0:00/0:00
// Air — Ekseption
// 69 bpm, 4/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 14 "AIR               7" harpsichord (copy of ch 3 "AIR               3" string ensemble 1); ch 15 "AIR               8" harpsichord (copy of ch 4 "AIR               4" string ensemble 1)
// note: Full arrangement: all 38 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(69/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.

// other · string ensemble 1 · "AIR               2"
const string_ensemble_1 = note("<~@2 A@4 B@2 C@2 D E ~ F G H ~ I J K L@2 M N O P@6 Q@7>".pickRestart({
  A: "[~@36 b4@24 a4@59 c5@6 b4@7 c5@11 a5@6 c5@6 b4@8 ~@29]/4",
  B: "[~@11 b4@13 e5@5 d5@6 e5@6 f#5@6 g5@6 e5@6 a4@8 ~@29]/2", C: "[~@12 a4@59 g#4@7 a4@7 b4@11]/2",
  D: "g#4@12 a4@35 ~", E: "~ g#4@14 ~@33", F: "~@3 b4 c5@3 b4", G: "a4 g4 f#4@6", H: "d#5@13 ~@35",
  I: "~@18 d5@6 c#5@5 b4@7 a#4@6 b4@6", J: "c#5@13 b4@35", K: "~ a#4@13 ~@34", L: "[~@6 f#4@4 b3@2 e4 f#4 g#4 a4]/2",
  M: "b4 a4", N: "g#4 ~@3", O: "~@24 b4@6 c5@5 b4@7 c#5@6",
  P: "[d5@24 c#5@6 b4@6 ~@5 d#5@6 e5@24 d#5@6 c#5@6 d#5@6 e5@6 f#5@19 d#5@5 e5@7 b4@5 e4@32 c#4@5 e4@5 a4@6 c#5@12 a4@25 c#5@6 d5@6 d4@30 e4@18 f#4@12, ~@9 c#5@2 ~@61]/6",
  Q: "[~@13 g4@59 b4@11 e5@31 d5@6 c#5@6 b4@6 ~@25 a4@29 g4@8 f#4@11 ~ g4@30 ~@3 f#4@72 ~@25, ~@132 a4@13 ~@191, ~@133 a3@60 ~@143]/7",
})).s("gm_string_ensemble_1").gain(0.51).pan(0.7)

// other · string ensemble 1 · "AIR               2" · soft notes
const string_ensemble_1_soft = note("<A@3 ~@8 B@3 ~ C@3 ~ D@2 ~@2 E@2 ~@5 F ~@7>".pickRestart({
  A: "[~ d5@10 ~]/3", B: "[~@13 e4@46 ~@3 a4@53 ~@29]/3", C: "[~@2 e5@17 ~@5]/3", D: "[~@13 f#4@46 e4@25 ~@12]/2",
  E: "[~@12 a4@61 ~@23]/2", F: "~@21 d4 ~@26",
})).s("gm_string_ensemble_1").gain(0.31).pan(0.7)

// other · string ensemble 1 · "AIR               3"
const string_ensemble_1_2 = note("<A@6 B@2 C D E F@6 G@2 H@2 I@3 J@2 K L M@6 N@2 O@2>".pickRestart({
  A: "[~@12 a4@48 b4@48 b3@24 e4@84 d#4@23 e4@12 f#4@13 ~@24]/6", B: "[~@11 e4@14 b3@22 e4@20 ~@29]/2", C: "~ d4@3",
  D: "e4@12 f#4@11 d4@13 b3@12", E: "e4@2 f#4 b3",
  F: "[e4@12 c#4@45 ~@4 e5@59 d#5@6 e5@6 f#5@30 g5@5 a5@6 f#5@6 d#5@12 b5@12 b5@24 b4@25 c#5@6 d5@6 e5@6 f#5@6 g5@6 f#5@6]/6",
  G: "[g5@6 e5@6 f#5@11 e5@6 d5@6 c#5@12 f#5@25 e5@6 d5@7 g5@11]/2",
  H: "[~ f#5@5 e5@7 d5@45 ~ b4@13 b5@11 a5@7 g#5@6]/2", I: "[a5@11 g#5@18 f#5@7 e5@48 f#5@11 e5@30 d5@7 c#5@6 d5@6]/3",
  J: "[e5@6 c#5@6 a4@11 ~@25 b4@23 e5@24 ~, ~@23 d5@40 ~@33]/2", K: "c#5@23 f#5@24 ~", L: "d#5@11 ~ b4@30 b5@6",
  M: "[g5@6 e5@6 a5@11 g5@12 f#5@12 e5@12 d5@25 a5@35 g5@12 a5@25 d5@48 e5@6 b4@5 e5@6 g5@6 b5@6 a5@6 g5@7 f#5@6 e5@12 a5@24]/6",
  N: "[~ g5@12 f#5@30 e5@18 ~ a4@13 ~@21]/2", O: "[a4@3 ~]/2",
})).s("gm_string_ensemble_1").gain(0.51)

// other · string ensemble 1 · "AIR               4"
const string_ensemble_1_3 = note(`<
  A B C D E F G@2 H@2 I J@2 K@4 L M N@2 O@2 P Q R S T U@2 V W@2 X Y@2 Z@2
>`.pickRestart({
  A: "~@12 d3@7 ~@5 d4@6 ~@6 c#4@8 ~@4", B: "c#3@6 ~@6 b2@7 ~@5 b3@7 ~@4 a3@7 ~@6",
  C: "a2@7 ~@4 g2@8 ~@5 g3@10 ~@2 g#2@9 ~@3", D: "g#3@7 ~@5 a2@11 ~ a3@7 ~@5 g3@8 ~@4",
  E: "g2@7 ~@5 f#2@7 ~@4 f#3@8 ~@4 e3@10 ~@3", F: "e2@8 ~@4 d#2@8 ~@4 d#3@7 ~@4 b2@7 ~@6",
  G: "[b3@7 ~@4 e2@8 ~@5 e3@7 ~@4 d3@8 ~@4 d2@7 ~@5 c#2@7 ~@5 c#3@7 ~@5 a2@8 ~@5]/2",
  H: "[a3@7 ~@5 d3@9 ~@3 d4@7 ~@4 c#4@8 ~@4 c#3@9 ~@3 b2@11 ~ b3@11 ~@2 g#3@10 ~@2]/2",
  I: "e3@9 ~@3 a3@8 ~@5 d3@8 ~@3 e3@8 ~@4",
  J: "[e2@6 ~@6 a2@6 b2@6 c#3@6 d3@6 e3@5 g3@6 f#3@7 e3@6 ~ a2@10 ~ a3@8 ~@3 g3@10 ~@3]/2",
  K: "[g2@10 ~ f#2@10 ~@2 f#3@9 ~@4 e3@9 ~@2 e2@8 ~@4 d#2@9 ~@4 d#3@8 ~@4 f#3@10 ~ b2@9 ~@3 e3@10 ~@2 e4@9 ~@3 d4@10 ~@2 d3@12 ~ c#3@10 ~@2 c#4@9 ~@3 b3@9 ~@3]/4",
  L: "b2@10 ~@2 a#2@8 ~@4 b2@10 ~ c#3@10 ~@3", M: "a#2@8 ~@4 b2@7 ~@5 g3@12 e3@8 ~@4",
  N: "[f#3@10 ~@2 b2@11 ~ b3@9 ~@2 a3@8 ~@4 a2@8 ~@5 g#2@11 g#3@8 ~@4 f#3@8 ~@5]/2",
  O: "[f#2@9 ~@3 e2@7 ~@4 e3@8 ~@4 d3@10 ~@2 d2@8 ~@4 c#2@9 ~@4 c#3@8 ~@4 d3@11 ~]/2",
  P: "e3@9 ~@3 a2@8 ~@4 a3@7 ~@5 g3@8 ~@4", Q: "g2@7 ~@5 f#2@8 ~@4 f#3@9 ~@3 g3@9 ~@3",
  R: "g2@9 ~@3 g#2@9 ~@3 g#3@9 ~@3 a3@8 ~@4", S: "a2@10 ~@3 a#2@9 ~ a#3@9 ~@4 b3@10 ~@2",
  T: "b2@8 ~@5 e3@11 e4@8 ~@4 d4@9 ~@3",
  U: "[~ d3@9 ~@2 c#3@8 ~@4 c#4@8 ~@4 a3@9 ~@2 c#4@10 ~@3 d4@9 ~@3 d3@9 ~@3 c3@9 ~@3]/2",
  V: "c4@9 ~@3 b3@9 ~@3 b2@8 ~@4 a2@8 ~@4",
  W: "[a3@9 ~@3 g3@8 ~@4 g2@7 ~@4 f#2@9 ~@3 f#3@9 ~@4 e3@10 ~@2 e2@8 ~@4 d2@8 ~@4]/2",
  X: "d3@9 ~@3 c#3@10 ~@2 a2@10 ~@2 d3@8 ~@4", Y: "[~ g3@11 ~ a3@11 ~@4 g3@11 ~@4 a3@14 ~@6 a2@22 ~@11]/2",
  Z: "[~ d2@24 ~@7]/2",
})).s("gm_string_ensemble_1").gain(0.51)

// other · string ensemble 1 · "AIR               5"
const string_ensemble_1_4 = note(`<
  A B C D E F G@2 H@2 I J@2 K@4 L M N@2 O@2 P Q R S T U@2 V W@2 X Y@2 Z@2
>`.pickRestart({
  A: "~@12 d2@7 ~@5 d3@6 ~@6 c#3@8 ~@4", B: "c#2@6 ~@6 b1@7 ~@5 b2@7 ~@4 a2@7 ~@6",
  C: "a1@7 ~@4 g1@8 ~@5 g2@10 ~@2 g#1@9 ~@3", D: "g#2@7 ~@5 a1@11 ~ a2@7 ~@5 g2@8 ~@4",
  E: "g1@7 ~@5 f#1@7 ~@4 f#2@8 ~@4 e2@9 ~@4", F: "e1@7 ~@5 d#1@8 ~@4 d#2@7 ~@4 b1@7 ~@6",
  G: "[b2@7 ~@4 e1@8 ~@5 e2@7 ~@4 d2@8 ~@4 d1@7 ~@5 c#1@7 ~@5 c#2@7 ~@5 a1@8 ~@5]/2",
  H: "[a2@7 ~@5 d2@9 ~@3 d3@7 ~@4 c#3@8 ~@4 c#2@9 ~@3 b1@11 ~ b2@11 ~@2 g#2@10 ~@2]/2",
  I: "e2@9 ~@3 a2@8 ~@5 d2@8 ~@3 e2@9 ~@3",
  J: "[e1@6 ~@6 a1@6 b1@6 c#2@6 d2@6 e2@5 g2@6 f#2@7 e2@6 ~ a1@10 ~ a2@7 ~@4 g2@10 ~@3]/2",
  K: "[g1@9 ~@2 f#1@9 ~@3 f#2@9 ~@3 e2@9 ~@3 e1@8 ~@4 d#1@9 ~@4 d#2@8 ~@4 f#2@10 ~ b1@9 ~@3 e2@10 ~@2 e3@9 ~@3 d3@10 ~@2 d2@12 ~ c#2@10 ~@2 c#3@9 ~@3 b2@8 ~@4]/4",
  L: "b1@10 ~@2 a#1@8 ~@4 b1@10 ~ c#2@10 ~@3", M: "a#1@8 ~@4 b1@7 ~@5 g2@12 e2@8 ~@4",
  N: "[f#2@10 ~@2 b1@11 ~ b2@9 ~@2 a2@8 ~@4 a1@8 ~@5 g#1@10 ~ g#2@7 ~@5 f#2@8 ~@5]/2",
  O: "[f#1@9 ~@3 e1@7 ~@4 e2@8 ~@4 d2@10 ~@2 d1@8 ~@4 c#1@9 ~@4 c#2@8 ~@4 d2@11 ~]/2",
  P: "e2@9 ~@3 a1@8 ~@4 a2@7 ~@5 g2@8 ~@4", Q: "g1@7 ~@5 f#1@8 ~@4 f#2@9 ~@3 g2@9 ~@3",
  R: "g1@9 ~@3 g#1@9 ~@3 g#2@9 ~@3 a2@8 ~@4", S: "a1@10 ~@3 a#1@9 ~ a#2@9 ~@4 b2@10 ~@2",
  T: "b1@8 ~@5 e2@11 e3@8 ~@4 d3@9 ~@3",
  U: "[~ d2@9 ~@2 c#2@9 ~@3 c#3@8 ~@4 a2@9 ~@2 c#3@10 ~@3 d3@9 ~@3 d2@9 ~@3 c2@9 ~@3]/2",
  V: "c3@9 ~@3 b2@9 ~@3 b1@8 ~@4 a1@8 ~@4",
  W: "[a2@9 ~@3 g2@8 ~@4 g1@7 ~@4 f#1@9 ~@3 f#2@9 ~@4 e2@10 ~@2 e1@8 ~@5 d1@8 ~@3]/2",
  X: "d2@9 ~@3 c#2@10 ~@2 a1@10 ~@2 d2@8 ~@4", Y: "[~ g2@11 ~ a2@11 ~@4 g2@10 ~@5 a2@14 ~@6 a1@22 ~@11]/2",
  Z: "[~ d1@24 ~@7]/2",
})).s("gm_string_ensemble_1").gain(0.51)

// chords · harpsichord · "AIR               6"
const harpsichord = note("<A@6 B@5 C D@2 E F G H I J K@6 L M@4 N@7>".pickRestart({
  A: "[~@11 f#5@108 b5@6 g5@7 f#5@4 ~@2 d5@6 c#5@6 d5@6 c#5@24 b4@6 a4@19 ~@10 c5@6 b4@7 c5@11 a5@6 c5@6 b4@6 f#5@6 c5@6 b4@6 ~ e5@5 d#5@6 a5, ~@132 b4@26 ~@47 a5@34 ~@49, ~@68 e5@2 ~@8 a4@15 ~@51]/6",
  B: "[~@5 g5@6 b4@13 e5@5 d5@6 e5@6 f#5@6 g5@6 e5@6 a4@7 e5@5 b4@6 a4@6 ~ d5@6 c#5@5 g5@7 f#5@5 ~ f#5@35 g#5@6 a5@7 d5@11 ~@30 d5@6 ~@7 b4@9 c#5@4 d5@17, ~@11 g5@36 ~@61 a4@59 [g#4,d5]@7 a4@7 b4@13 ~@9 c#5@8 ~@29, ~@172 e5@5 ~@9 e5@12 ~@42, ~@175 f#5@11 ~@6 g#4@12 a4@35 ~]/5", // G#dim
  C: "~@3 b4@4 ~@17, c#5@7 ~@41, ~ g#4@14 ~@33",
  D: "[~@13 c#5@29 d5@3 ~@2 b4@3 c#5@3 a4@6 ~@7 b4@6 c5@18 b4@6, ~@45 c#5@4 ~@12 a5@35]/2",
  E: "a4@6 g4@5 ~@31 a5@6, c5@11 b4@12 ~@25, ~ f#4@3", F: "g5@5 f#5@8 g5@26 f#5@3 e5@3 d5@3, d#5@13 ~@35",
  G: "c#5@6 b4@6 a#4@6 b4@7 c#5@17 d5@6", H: "e5@17 ~ d5@5 ~ c#5@5 b4@7 a#4@6 b4@6, ~@17 f#5@6 g5@25",
  I: "[c#5,f#5]@11 ~@6 d5@6 c#5@6 b4@6 c#5@7 d5@3 e5@3, ~@11 e5@7 ~@30, ~@13 b4@16 ~@19", J: "~ [a#4,d5]@13 ~@34",
  K: "[~@42 f#5@6 e5@6 d5@6 b3@12 e4@6 f#4@6 g#4@6 a4@5 ~@6 g#5@7 f#5@3 e5@3 a5@6 a4@11 ~@19 c#5@3 d5@3 c#5@17 ~ b4@6 a4@20 ~@16 b4@6 c5@5 b4@7 c#5@5 ~@6 e5@5 ~@14 c#5@6 b4@6 ~@5 d#5@6 e5, ~@36 f#4@24 b5@35 a5@7 ~@42 g#4@12 ~@84 d5@25 ~@11 c#5@8 ~@4, ~@96 b4@25 ~@10 b4@19 ~@53 d5@36 f#5@6 ~@6 e5@36 ~]/6",
  L: "g5@6 f#5@6 ~@11 d#5@6 c#5@6 d#5@6 e5@6 [f#5,a5], ~@12 f#5@35 ~", // F#m
  M: "[~@6 g5@6 ~@6 d#5@5 e5@7 b4@5 ~@32 c#4@5 e4@5 a4@6 c#5@6 c#5@6 e5@6 ~@13 e5@6 c#5@6 d5@6 ~@20 a5@4 ~@6 e4@18 ~@6 f#5@6, ~@12 g5@47 ~ a4@17 ~@18 a4@26 ~@11 d4@32 ~@16 f#4@12, ~@35 e4@33 ~@52 f#5@30 g5@4 ~@2 d5@32 ~@4]/4",
  N: "[a5@6 c6@6 ~@35 d5@12 c#5@6 e5@6 ~ b4@11 ~@13 b4@11 ~@7 d5@5 ~ c#5@5 ~@13 f#5@12 e5@7 ~ d5@4 c#5@4 b4@12 c#5@7 ~ g4@8 f#4@11 ~ c#5@12 ~@2 d5@19 ~ d5@72 ~@24, ~@12 b5@34 ~@25 g5@25 ~@11 a4@13 ~@5 f#5@3 g5@11 ~@46 d5@19 ~@132, ~@13 g4@60 ~@10 e5@32 ~@4 e5@7 b4@6 a4@13 ~@12 a4@30 ~@19 g4@30 ~@3 f#4@72 ~@25, ~@133 a3@60 ~@143]/7",
})).s("gm_harpsichord").gain(0.51).pan(0.6)

// chords · harpsichord · "AIR               6" · soft notes
const harpsichord_soft = note("<A@3 ~@6 B ~ C@3 ~ D ~@3 E@2 ~@2 F ~@5 G H ~@7>".pickRestart({
  A: "[~ d5@10 ~]/3", B: "~@24 a5 ~@23", C: "[~@13 e4@46 ~@3 a4@39 ~@43, ~ a4@4 ~@7]/3", D: "~@2 e5@5 ~",
  E: "[~@13 f#4@46 ~ d5@30 ~@6, ~@12 b4@44 ~@3 e4@25 ~@12]/2", F: "~ a4@2 ~", G: "~@5 g5@14 ~@29", H: "~@21 d4 ~@26",
})).s("gm_harpsichord").gain(0.26).pan(0.6)

stack(
  string_ensemble_1, string_ensemble_1_soft, string_ensemble_1_2, string_ensemble_1_3, string_ensemble_1_4, harpsichord,
  harpsichord_soft
)