Strudelify

De vogeltjesdans

De Electronica's

KeyG majorTempo190 bpm
0:00/0:00
// De vogeltjesdans — De Electronica's
// 190 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 120 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(190/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.

// bass · electric bass finger · "FINGERDBAS"
const bass = note(`<
  ~@6 A B C D E F G H A I J F@3 K L A I M I@2 N F@2 O C P F Q F R L I@3 A S B Q T C U V U T W X Y Z AA O E V E A@2 AA AB
  O E U C X L AC I A@3 I O AD C F O@2 E Q R L AC@2 AA Z AC I C F@5 AE AF X AG AA@2 O V@2 O I AH@2 Z E@2 AD@2 X AI@3
>`.pickRestart({
  A: "g1@5 ~@3 d1@6 ~@2", B: "g1@7 ~ d1@6 ~@2", C: "a1@3 ~ d1@3 ~", D: "a1@6 ~@2 d1@5 ~@3", E: "a1@2 ~@2 d1@3 ~",
  F: "a1@4 d1@3 ~", G: "g1@3 ~ d1@4", H: "g1 ~@3 d1@4", I: "g1@3 ~ d1@3 ~", J: "a1@7 ~ d1@7 ~", K: "g1 e2 d2 b1",
  L: "g1 ~@3 d1@4 e1@4 f#1@4", M: "g1@6 ~@2 d1@7 ~", N: "g1@8 d1@7 ~", O: "a1@5 ~@3 d1@6 ~@2", P: "a1@8 d1@7 ~",
  Q: "a1@7 ~ d1@6 ~@2", R: "g1@7 ~ d1@8", S: "g1@4 d1@3 ~", T: "a1@5 ~@3 d1@8", U: "a1@5 ~@3 d1@5 ~@3",
  V: "a1@4 ~@4 d1@5 ~@3", W: "a1 ~@3 d1@3 ~ e1@3 ~ f#1@4", X: "g1 ~ e2@2 d2@2 b1@2", Y: "g1 ~@3",
  Z: "g1@4 ~@4 d1@5 ~@3", AA: "g1@2 ~@2 d1@3 ~", AB: "g1@3 ~@5 d1@6 ~@2", AC: "g1@6 ~@2 d1@5 ~@3",
  AD: "a1@3 ~@5 d1@5 ~@3", AE: "a1@7 ~ d1@8", AF: "a1@4 d1@3 ~ e1@2 ~@2 f#1@2 ~@2", AG: "g1@3 ~@13",
  AH: "g1@5 ~@3 d1@5 ~@3", AI: "[g1@3 ~@5 g1@28 ~@12]/3",
})).s("gm_electric_bass_finger").gain(0.5)

// chords · marimba
const marimba = note(`<
  ~@5 A B C D E F G H I J C K F@2 L M N ~@31 A B C O F@2 G P Q B C R F S T U V ~@31 A B C W F@2 G X Y B C Z F@2 T AA AB
  ~@2
>`.pickRestart({
  A: "~@4 [b4,d5] ~ [b4,d5] ~ [b4,e5] ~ [b4,e5] ~ [g4,b4] ~ [g4,b4] ~", // Bm E5 G
  B: "[b4,d5] ~@3 [b4,d5] ~ [b4,d5] ~ [b4,e5] ~ [b4,e5] ~ [g4,b4] ~ [g4,b4] ~", // Bm E5 G
  C: "[b4,d5] ~@3 [b4,d5] ~ [b4,d5] ~ [b4,e5] ~ [b4,e5] ~ [b4,g5] ~ [b4,g5] ~", // Bm E5 Em
  D: "[c5,f#5] ~@3 [c5,f#5] ~@3 [c5,e5] ~@3 d5 ~@3", // Cdim C
  E: "c5 ~@3 [a4,c5] ~ [a4,c5] ~ [a4,d5] ~ [a4,d5] ~ [f#4,a4] ~ [f#4,a4] ~", // Am D5 F#m
  F: "[a4,c5] ~@3 [a4,c5] ~ [a4,c5] ~ [a4,d5] ~ [a4,d5] ~ [f#4,a4] ~ [f#4,a4] ~", // Am D5 F#m
  G: "[a4,c5] ~@3 [a4,d5] ~ [a4,d5] ~ [c5,e5] ~ [c5,e5] ~ [d5,f#5] ~ [d5,f#5] ~", // Am D5 C D
  H: "~@4 [c5,e5]@4 [b4,d5] ~@3 [a4,c5] ~@3, ~@4 d5 ~@11", // C Bm Am
  I: "b4@2 ~@2 [b4,d5] ~ [b4,d5] ~ [b4,e5] ~ [b4,e5] ~ [g4,b4] ~ [g4,b4] ~, g4 ~@15", // Bm E5 G
  J: "[b4,d5] ~@3 [b4,d5] ~ [b4,d5,e5] ~ [b4,e5] ~ [b4,e5] ~ [g4,b4] ~ [g4,b4] ~", // Bm E7 E5 G
  K: "~@4 [c5,f#5] ~@3 [c5,e5] ~@3 [c5,d5] ~@3", L: "[a4,c5] ~@3 d5 ~ d5 ~ e5 ~ e5 ~ [c5,f#5] ~ [c5,f#5] ~",
  M: "[b4,g5] ~@3 e5 ~@3 d5 ~@3 b4 ~@3", N: "g4 ~@15", O: "[c5,f#5] ~@3 [c5,f#5] ~@3 [c5,e5] ~@3 [c5,d5] ~@3",
  P: "[c5,e5] ~@3 [c5,e5] ~@3 [b4,d5] ~@3 [a4,c5] ~@3", // C Bm Am
  Q: "[g4,b4] ~@3 [b4,d5] ~ [b4,d5] ~ [b4,e5] ~ [b4,e5] ~ [g4,b4] ~ [g4,b4] ~", // G Bm E5 G
  R: "~@4 [c5,f#5] ~@3 [c5,e5] ~@3 [a4,b4,d5] ~@3", // Cdim C Bm7
  S: "[a4,c5] ~@3 [a4,c5] ~ [a4,c5] ~ [a4,d5] ~ [a4,d5] ~ [f#4,a4] ~ [f#4,a4,c5] ~", // Am D5 F#m F#dim
  T: "[a4,c5] ~@3 [a4,d5] ~ [a4,d5] ~ [a4,e5] ~ [a4,e5] ~ [a4,f#5] ~ [a4,f#5] ~", // Am D5 A5 D
  U: "g5 ~@3 e5 ~@3 [b4,d5] ~@3 [g4,b4] ~@3", V: "[d4,g4] ~@15", W: "~@4 [c5,f#5] ~@3 [c5,e5] ~@3 [b4,d5] ~@3",
  X: "~@4 e5@2 ~@2 d5@2 ~@2 c5 ~@3", Y: "b4 ~@3 [b4,d5] ~ [b4,d5] ~ [b4,d5,e5] ~ [b4,e5] ~ [g4,b4] ~ [g4,b4] ~",
  Z: "~@4 [c5,f#5] ~@3 e5 ~@3 d5 ~@3", AA: "g5@2 ~@2 e5 ~@3 d5 ~@3 b4 ~@3", AB: "g4 ~@7 g4 ~ g4 ~@5",
})).s("gm_marimba").gain(0.5)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  ~@21 A B C D@2 E F G H I J K@2 L@2 M N B O@3 P Q G H R J S@2 T@2 U ~@16 V B C W@2 B F G H X Q Y@2 Z@2 M AA AB AC AD AE
  AF AG G H R J AH@2 AI@2 U AJ AK AL AM AN@2 AO AP AQ AR AL AS AT AU AO AV AW@2 ~
>`.pickRestart({
  A: "~ [b4,d5] [a#4,c#5] [a4,c5]", B: "[g4,b4]@11 ~ [b4,d5]@2 ~@2", C: "[d5,b5]@11 ~ [c5,a5]@3 ~",
  D: "[[c5,a5]@4 [b4,g5]@14 ~@2 [b4,d5]@3 ~ [a#4,c#5]@3 ~ [a4,c5]@2 ~@2]/2", E: "[g4,b4]@11 ~ [b4,d5]@3 ~",
  F: "[c5,a5]@11 ~ [b4,g5]@4", G: "[c5,f#5]", H: "~@2 [c5,e5]@2 d5@2 [a#4,c#5] ~, ~@4 b4 ~@3",
  I: "[a4,c5]@3 f#4, ~@6 d5 ~", J: "[c5,a5]@11 ~ [b4,g5]@2 ~@2",
  K: "[[b4,g5]@3 ~ [c5,f#5]@2 ~@2 [c5,f#5]@12 [f#5,a5]@3 ~ [f#5,a5]@4 [e5,g5]@3 ~]/2", // Em Cdim F#m Em
  L: "[[e5,g5]@4 [d5,f#5]@16 [c5,e5]@3 ~ [b4,d5]@2 ~@2 [a4,c5]@3 ~]/2", M: "[g4,b4]",
  N: "~@4 [b4,d5]@4 [a#4,c#5]@3 ~ [a4,c5]@2 ~@2", // Bm A#m Am
  O: "[[d5,b5]@11 ~ [c5,a5]@7 ~ b4@14 ~@2 [b4,d5]@4 [a#4,c#5]@3 ~ [a4,c5]@2 ~@2, ~@5 g5@3 ~@4]/3", // G F Bm A#m Am
  P: "[g4,b4]@6 [b4,d5] ~", Q: "[c5,a5]@11 ~ [b4,g5]@3 ~", R: "c5@3 f#4, a4@5 ~ d5 ~",
  S: "[[b4,g5]@4 [c5,f#5]@2 ~@2 [c5,f#5]@11 ~ [f#5,a5]@3 ~ [f#5,a5]@4 [e5,g5]@2 ~@2]/2", // Em Cdim F#m Em
  T: "[[e5,g5]@4 [d5,f#5]@2 ~@2 [d5,f#5]@10 ~@2 [d5,f#5]@4 [e5,g5]@4 [c5,a5]@3 ~, ~@28 f#5 ~@3]/2", U: "[b4,g5]",
  V: "~@4 [b4,d5]@4 [a#4,c#5]@3 ~ [a4,c5]@3 ~", W: "[[c5,a5]@4 [b4,g5]@14 ~@2 [b4,d5]@4 [a#4,c#5]@3 ~ [a4,c5]@3 ~]/2",
  X: "[a4,c5]@11 ~ f#4@4, ~@6 d5 ~", Y: "[g5@2 c5@8 [f#5,a5]@4 [e5,g5] ~, b4 ~ f#5@7 ~@7]/2",
  Z: "[[e5,g5]@4 [d5,f#5]@15 ~ [c5,e5]@4 [b4,d5]@2 ~@2 [a4,c5]@2 ~@2]/2", // Em D C Bm Am
  AA: "~@4 [b4,d5]@3 ~ [a#4,c#5]@2 ~@2 [a4,c5]@2 ~@2", AB: "g4@12 [b4,d5]@3 ~, b4@5 ~@3",
  AC: "[d5,b5]@11 ~ [c5,a5]@2 ~@2", AD: "[c5,a5]@3 ~ [b4,g5]@12", AE: "~@2 [b4,d5]@2 [a#4,c#5] ~ [a4,c5] ~",
  AF: "[g4,b4]@12 [b4,d5]@3 ~", AG: "[c5,a5]@5 ~ [b4,g5]@2",
  AH: "[g5@4 [c5,f#5]@2 ~@2 [c5,f#5]@11 ~ [f#5,a5]@3 ~ [f#5,a5]@3 ~ [e5,g5]@3 ~, b4 ~@15]/2", // Cdim F#m Em
  AI: "[[e5,g5]@4 [d5,f#5]@14 ~@2 [d5,f#5]@3 ~ [e5,g5]@3 ~ [c5,a5]@4]/2", AJ: "~@4 d5 ~ d5 ~ e5 ~ e5 ~ b4 ~ b4 ~",
  AK: "d5 ~@3 d5 ~ d5 ~ e5 ~ e5 ~ b4 ~ b4 ~", AL: "d5 ~@3 d5 ~ d5 ~ e5 ~ e5 ~ g5 ~ g5 ~", AM: "~ f#5 e5 d5",
  AN: "c5 ~@3 c5 ~ c5 ~ d5 ~ d5 ~ a4 ~ a4 ~", AO: "c5 ~@3 d5 ~ d5 ~ e5 ~ e5 ~ f#5 ~ f#5 ~", AP: "~ e5 d5 c5",
  AQ: "b4@3 ~ d5 ~ d5 ~ e5 ~ e5 ~ b4 ~ b4 ~", AR: "d5@2 ~@2 d5 ~ d5 ~ e5 ~ e5 ~ b4 ~ b4 ~", AS: "~@4 f#5@4 e5@4 d5@3 ~",
  AT: "c5@2 ~@2 c5 ~ c5 ~ d5 ~ d5@2 a4 ~ a4 ~", AU: "c5@2 ~@2 c5 ~ c5 ~ d5 ~ d5 ~ a4 ~ a4 ~",
  AV: "g5@4 e5@3 ~ d5@3 ~ b4@4", AW: "[g4 ~@7 [b3,d4,e4,g4]@22 ~@2]/2",
})).s("gm_string_ensemble_1").gain(0.45)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note(`<
  ~@6 A@2 B@3 C D@4 B@4 E F D@6 B@5 G B@2 D H D@3 I J D B@8 D K D@2 B@4 D@4 B@4 D K D@6 B@8 D J D@6 B@8 D K D@2 B@4 E
  D@3 L B@3 D M@2 ~
>`.pickRestart({
  A: "~@4 [b3,d4,g4] ~ [b3,d4,g4]@2 ~@4 [b3,d4,g4]@2 ~@2", B: "~@4 [c4,d4,f#4] ~ [c4,d4,f#4] ~@5 [c4,d4,f#4] ~@3",
  C: "~@4 [c4,d4,f#4] ~ [c4,d4,f#4] ~@5 [c4,d4,f#4]@2 ~@2", D: "~@4 [b3,d4,g4] ~ [b3,d4,g4] ~@5 [b3,d4,g4] ~@3",
  E: "~@4 [b3,d4,g4] ~@7 [b3,d4,g4] ~@3", F: "[b3,d4,g4] ~@7",
  G: "~@4 [c4,d4,f4,f#4] ~ [c4,d4,f#4] ~@5 [c4,d4,f#4] ~@3", H: "~@4 [b3,d4,g4] ~ [b3,d4,g4] ~@5 [d4,g4] ~@3",
  I: "~@4 [b3,d4,g4,a4] ~ [b3,d4,g4] ~@5 [b3,d4,g4] ~@3", J: "~@4 [b3,d4,g4] ~ [b3,d4,g4]@2 ~@4 [b3,d4,g4] ~@3",
  K: "[b3,d4,g4] ~@15", L: "~@4 [c4,d4,f#4] ~@7 [c4,d4,f#4] ~@3", M: "[[b3,d4,g4] ~@7 [b3,d4,e4,g4]@20 ~@4]/2",
})).s("gm_electric_guitar_muted").gain(0.4).pan(0.4)

// chords · trumpet
const trumpet = note(`<
  ~@21 A B C D@2 B E F@2 G H I@2 J@2 K@2 L M N@2 B E O@2 P H I@2 Q@2 R ~@16 S T U V W X E Y Z G H I@2 AA@2 AB AC B AD
  AE@2 AF AG Y AH P AG I@2 AI@2 AJ ~@19
>`.pickRestart({
  A: "~@4 [b4,d5]@4 [a#4,c#5]@4 [a4,c5]@3 ~", B: "[g4,b4]@11 ~ [b4,d5]@3 ~", C: "[d5,b5]@10 ~@2 [c5,a5]@3 ~",
  D: "[[c5,a5]@4 [b4,g5]@2 ~@2 [b4,g5]@10 ~@2 [b4,d5]@3 ~ [a#4,c#5]@4 [a4,c5]@4]/2", E: "[c5,a5]@5 ~ [b4,g5]@2",
  F: "[c5@18 ~@2 [c5,e5]@4 [b4,d5]@4 [a#4,c#5]@3 ~, f#5 ~]/2", G: "[a4,c5]@11 ~ [f#4,d5]@3 ~",
  H: "[c5,a5]@11 ~ [b4,g5]@3 ~", I: "[[b4,g5]@4 [c5,f#5]@2 ~@2 [c5,f#5]@11 ~ [f#5,a5]@3 ~ [f#5,a5]@3 ~ [e5,g5]@3 ~]/2",
  J: "[[e5,g5]@4 [d5,f#5]@3 ~ f#5@12 [c5,e5]@3 ~ [b4,d5]@4 [a4,c5]@3 ~, ~@4 d5@5 ~@7]/2", // Em D C Bm Am
  K: "[g4@19 ~ d5@4 [a#4,c#5]@4 [a4,c5]@4, b4@17 ~@3 b4@3 ~@9]/2", L: "[g4,b4]@11 ~ [b4,d5]@3 ~, a4 ~@15",
  M: "[d5,b5]@10 ~@2 [c5,a5]@3 ~, a5 ~@15", // G F
  N: "[[c5,a5]@4 [b4,g5]@3 ~ b4@11 ~ [b4,d5]@4 [a#4,c#5]@4 [a4,c5]@3 ~, ~@8 g5@9 ~@15]/2", // F Em Bm A#m Am
  O: "[[c5,f#5]@18 ~@2 [c5,e5]@4 d5@4 [a#4,c#5]@3 ~, ~@12 b4 ~@3]/2", P: "[a4,c5]@11 ~ [f#4,d5]@4",
  Q: "[[e5,g5]@4 [d5,f#5]@3 ~ [d5,f#5]@11 ~ [d5,f#5]@3 ~ [e5,g5]@3 ~ [f#5,a5]@4]/2", R: "g5@15 ~, b4@13 ~@3",
  S: "~ [b4,d5] [a#4,c#5] [a4,c5]", T: "b4@3 [b4,d5], g4", U: "[d5,b5]@11 ~ [c5,a5]@3 ~", V: "[c5,a5] [b4,g5]@3",
  W: "~@4 [b4,d5]@4 [a#4,c#5]@3 ~ [a4,c5]@3 ~", X: "b4@3 b4, g4, ~@6 d5 ~", Y: "[c5,f#5]",
  Z: "~@2 [c5,e5]@2 [b4,d5]@2 [a#4,c#5] ~", // C Bm A#m
  AA: "[[e5,g5]@4 [d5,f#5]@3 ~ [d5,f#5]@12 [c5,e5]@4 [b4,d5]@3 ~ [a4,c5]@3 ~]/2", AB: "[g4,b4]",
  AC: "~@4 [b4,d5]@3 ~ [a#4,c#5]@4 [a4,c5]@4", AD: "[d5,b5]@5 ~ [c5,a5] ~, a5 ~@15",
  AE: "[[c5,a5]@4 b4@14 ~@2 [b4,d5]@4 [a#4,c#5]@3 ~ [a4,c5]@3 ~, ~ g5@3 ~@4]/2", AF: "[g4,b4]@11 ~ [b4,d5]@2 ~@2",
  AG: "[c5,a5]@10 ~@2 [b4,g5]@3 ~", AH: "~@4 [c5,e5]@4 [b4,d5]@4 [a#4,c#5]@3 ~",
  AI: "[[e5,g5]@2 [d5,f#5] ~ [d5,f#5]@5 ~ [d5,f#5]@2 [e5,g5]@2 [f#5,a5]@2]/2", AJ: "[b4,g5]",
})).s("gm_trumpet").gain(0.32).pan(0.7)

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1_2 = note(`<
  A B C D@2 E@7 F@4 G@4 H@2 I@5 J@8 ~ K@2 I@5 J@8 ~ H@2 L@8 ~ M@5 N@2 O@6 P@8 Q@7 R@8 ~ H@2 S@2 T@4 U@4 V@4 W X@2 ~
>`.pickRestart({
  A: "d5@2 ~@6 d6 ~@7", B: "d5 ~@7 d6 ~@7", C: "d5 ~@3 d6 ~@3 d5 ~@7", D: "d5/2",
  E: "[~@4 d5@4 e5@4 ~@3 g4@28 ~@4 [f#4,a4]@63 ~@2, ~@12 b4@34 ~ c5@65, ~@15 d5@97]/7", F: "[[g4,b4]@31 ~]/4",
  G: "[[f#4,c5]@63 ~, a4@61 ~@3]/4", H: "[[g4,b4]@9 ~@7]/2", I: "[g4,b4,d5]/5", J: "[~@15 [f#4,a4,c5]@113]/8",
  K: "[[g4,b4]@21 ~@11]/2", L: "[g4@30 ~ [f#4,a4,c5]@63 ~ [g4,b4]@33, d5, b4@7 ~@25]/8",
  M: "[~@16 [f#4,c5]@63 ~, ~@15 a4@62 ~@3]/5", N: "[[g4,b4]@19 ~@13]/2", O: "[d5, g4@47 ~, b4@91 ~@5]/6",
  P: "[[f#4,c5]@63 ~, a4@31 ~]/8", Q: "[g4,b4]/7", R: "[~ [f#4,a4]@7, ~@15 c5@113]/8", S: "[[g4,b4,d5]@15 ~]/2",
  T: "[[f#4,a4,c5,d5]@61 ~@3]/4", U: "[[g4,b4]@15 ~, d5@31 ~]/4", V: "[[a4,c5,d5]@31 ~, f#4@15 ~]/4", W: "[g4,b4,d5]",
  X: "[~ [b4,d5,e5,g5]@3]/2", // Em7
})).s("gm_string_ensemble_1").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@6 A@15 B A@31 B A@15 B A@31 B A@16 ~@2>".pickRestart({
  A: "x!2", B: "x",
})).gain(0.45)

// drums · snare
const snare = s("sd").struct("<~@4 A B C@14 D ~ C@15 D C@14 D ~ C@15 ~ C@15 D C@14 D ~ C@15 ~@3>".pickRestart({
  A: "x!8", B: "x", C: "~ x ~ x", D: "~@2 x ~@3 x!2",
})).gain(0.5)

// drums · clap
const clap = s("cp").struct("<~@4 A B C@14 D ~ C@15 D C@14 D ~ C@15 ~ C@15 D C@14 D ~ C@15 ~@3>".pickRestart({
  A: "x!8", B: "x", C: "~ x ~ x", D: "~@2 x ~@3 x!2",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<A@5 B C@15 D C@31 E C@15 E C@31 E C@15 B ~@2>".pickRestart({
  A: "x!2", B: "x", C: "x!8", D: "x ~@2 x", E: "x ~@6 x",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@6 A ~@14 A@2 ~@15 A ~@14 A@2 ~@14 A@2 ~@15 A ~@14 A@2 ~@14 B ~@2>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.4)

// drums · cowbell
const cowbell = s("cb").struct("<~@6 A@15 B A@31 B A@15 B A@31 B A@16 ~@2>".pickRestart({
  A: "x!2", B: "x",
})).gain(0.4)

// drums · shaker
const shaker = s("sh").struct("<~@6 [~@6 x!2]!15 ~@33 [~@6 x!2]!15 ~@33 [~@6 x!2]!15 ~@3>").gain(0.4)

stack(
  bass, marimba, string_ensemble_1, electric_guitar_muted, trumpet, string_ensemble_1_2, kick, snare, clap, hihat,
  crash, cowbell, shaker
)