Strudelify

Wunderland Bei Nacht

Kaempfert

KeyC majorTempo134 bpm
0:00/0:00
// Wunderland Bei Nacht — Kaempfert
// 134 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(134/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 guitar jazz
const bass = note(`<
  A B C B C D E@2 C F A F G F A B C D H@2 C B A F A I@2 J@2 D K@2 L M N O P Q R S T U V W U R X P Y F Z@2 AA@2 AB@2 AC
  AD AE AD AC AD AC AD AF AG AC AH P X AI AJ X U S AK AL AM AN AO U S P AH X U AP AQ AR U AS AT X AU AV@2 U AW AU AH X
  AX AY AZ AX U BA BB X BC BD@2 U BE AR BF BG
>`.pickRestart({
  A: "c2", B: "g1@15 ~", C: "c2@15 ~", D: "f2 g2", E: "[c2@25 ~@7]/2", F: "g1@7 ~", G: "c2@7 ~", H: "[c2@5 ~@3]/2",
  I: "[~@16 c2@15 ~, g1]/2", J: "[~ c2, g1]/2", K: "[~@18 g1@2 a1@2 g1 ~@3 g1@2 a1@2 g1 ~, c2]/2",
  L: "c2@3 ~@2 g1 a1@2, ~@3 c2@5", M: "c2@3 ~@2 g1 a1 c2, ~@3 c2@4 ~", N: "f1@5 ~ f1 ~@5 d1@4",
  O: "f1@5 ~ f1 ~@5 f1@2 g1@2", P: "c2@5 ~ c2 ~@3 g1@2 a1@2 ~@2", Q: "c2@5 ~ c2@2 ~@2 g1@2 a1@2 c2@2",
  R: "g1@6 g2 ~@3 g1@2 a1@4", S: "g1@6 g2 ~@5 g1@2 a1@2", T: "c2@4 ~@2 c2 ~@3 g1@2 a1@4",
  U: "c2@5 ~ c2 ~@3 g1@2 a1@2 c2@2", V: "a1@6 c2 ~@5 g1@2 a1@2", W: "f1@5 ~ f1@2 ~@4 g1@2 a1@2",
  X: "c2@5 ~ c2 ~@3 g1@2 a1@4", Y: "c2@13 ~@3", Z: "[~@8 g1@7 ~, c2]/2", AA: "[~@2 f2 g2, c2]/2",
  AB: "[~@2 g1 b1, c2]/2", AC: "c2@5 ~ c2 ~@9", AD: "g1 b1", AE: "c2@5 ~ c2 ~@7 c2@2", AF: "c2@5 ~ c2 ~@5 e1@4",
  AG: "f1 g1", AH: "~ g1 a1 g1 ~ g1 a1 g1", AI: "f1@4 ~@2 f1 ~@5 g1@2 c2@2", AJ: "f1@5 ~ f1 ~@3 d1@2 f1@2 g1@2",
  AK: "g1@5 ~ g1 ~@3 g1@2 a1@2 d2@2", AL: "c2@6 c2 ~@5 g1@2 a1@2", AM: "c2@5 ~ c2@2 ~@2 g1@2 a1@2 d2@2",
  AN: "a1@5 ~ a1@2 ~@4 a1@2 c2@2", AO: "f1@5 ~ f1 ~@5 g1@2 a1@2", AP: "f1@5 ~ f1 ~@5 d1@3 ~",
  AQ: "f1@5 ~ g1@2 ~@2 a1 ~@3 g1@2", AR: "c2@5 ~ c2 ~@3 g1@2 a1@3 ~", AS: "g1@5 ~ g1 ~@5 d1@2 e1@2",
  AT: "g1@5 ~ f1 ~@3 e1 ~@3 d1@2", AU: "c2@5 ~ c2 ~@3 g1@2 a1@2 c2 ~",
  AV: "[a1@10 g1@3 ~ f1@7 ~ f1 ~@3 g1@2 ~@2 a1@2]/2", AW: "g1@5 ~ g1 ~@3 g1@2 a1@2 g1 ~", AX: "c2@5 ~ c2 ~@5 g1@2 a1@2",
  AY: "f1@5 ~ f1 ~@3 d1 ~@3 d1@2", AZ: "f1@6 g1 ~@3 a1 ~@3 g1@2", BA: "g1@6 d2 ~@5 d1@2 e1@2",
  BB: "g1@2 f1 ~@3 e1 ~@3 f1 ~@3 g1@2", BC: "c2@5 ~ c2 ~@3 g1@2 a1@2 d2@2",
  BD: "[a1@5 ~@5 g1 ~@3 f1@7 ~ f1 ~@3 e1@2 f1@2 g1@2]/2", BE: "g1@4 ~@2 g1 ~@5 g1@2 a1@2", BF: "c2 ~@4 g1 a1 g1",
  BG: "c2@3 ~",
})).s("gm_electric_guitar_jazz").gain(0.71)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  A@4 B C D ~ E@2 F@2 A@2 D G@4 ~ H@2 I@2 D J D K L@3 ~ M@4 N@4 O@2 P@2 A@2 Q@2 R@4 S@3 ~ T@4 H@2 U@2 V@4 M@4 O@2 W@2
  X@2 P@2 E@2 Y@2 Z@4 AA@4 AB@2 AC@2 AD@4 Z@4 AE@4 AB@2 P@2 H@2 AF@3
>`.pickRestart({
  A: "[[c4,e4] [b3,d4], g3@15 ~]/2", B: "[g3,c4,e4]", C: "[a3,c4,f4]@7 ~ [b3,d4]@8, ~@4 g4@3 ~", D: "[g3,c4,e4]@15 ~",
  E: "[[c4,e4] [b3,d4], g3@31 ~]/2", F: "[[c4,e4]@16 [b3,d4]@15 ~, g3@31 ~]/2",
  G: "[[b3,d4]@15 ~@17 f3@7 ~ [b3,d4]@8 [c4,e4]@12 ~@4, g3@30 ~ a3@7 ~@2 g3@19 ~@5, ~@2 [c4,e4]@3 ~@3]/4", // Bm C
  H: "[[c4,e4]@16 [b3,d4]@15 ~, g3@15 ~]/2", I: "[[c4,e4]@15 ~ [b3,d4]@15 ~, g3@15 ~]/2", J: "[g3,b3,d4]@15 ~",
  K: "[g3,b3,d4]@7 ~", L: "[g3@14 ~@2 [f3,a3]@7 ~ [b3,d4]@8 [c4,e4]@14 ~@2, [c4,e4] g3]/3",
  M: "[g3@30 ~@2 [f3,a3]@31 ~, [c4,e4]@63 ~]/4", N: "[e4@32 ~@15 b3@15 ~@2, g3@31 ~, c4@3 ~, ~@32 d4@31 ~]/4",
  O: "[[g3,c4,e4]@31 ~]/2", P: "[[a3,c4,f4]@31 ~]/2", Q: "[[g3,c4,e4]@5 ~@3]/2",
  R: "[[c4,e4]@16 [b3,d4]@16 [c4,e4]@16 [b3,d4]@15 ~, g3@63 ~]/4", // C Bm C Bm
  S: "[g3@15 ~ [f3,a3]@7 ~ [b3,d4]@8 [c4,e4]@15 ~, [c4,e4]@24 g3@23 ~]/3", // F Bm C
  T: "[[c4,e4]@16 [b3,d4]@16 [c4,e4]@15 ~ [b3,d4]@15 ~, g3@31 ~]/4", U: "[[c4,e4]@15 ~ [b3,d4]@14 ~@2, g3@15 ~]/2",
  V: "[g3@15 ~ [f3,a3]@6 ~@2 [b3,d4]@8 [c4,e4]@18 ~@14, [c4,e4]@23 ~ g3@25 ~@15]/4", // F Bm C
  W: "[c4@15 b3@16 ~, d4, g3@15 ~]/2", X: "[[c4,e4], g3@29 ~@3]/2", Y: "[[g3,c4,e4]@11 ~@5]/2",
  Z: "[g3@31 ~ [f3,a3]@31 ~, [c4,e4]@63 ~]/4", AA: "[e4@32 ~@16 b3@15 ~, g3@63 ~, c4@3 ~, ~@32 d4@31 ~]/4",
  AB: "[g3,c4,e4]/2", AC: "[[a3,c4,f4]@15 ~]/2", AD: "[[c4,e4]@2 [b3,d4]@2 [c4,e4]@3 ~, g3@55 ~@9]/4",
  AE: "[e4@32 ~@16 b3@15 ~, g3@31 ~, c4@3 ~, ~@32 d4@31 ~]/4", AF: "[e4@22 d4@9 ~ e4@14 ~@2, [g3,c4]@23 ~]/3",
})).s("gm_string_ensemble_1").gain(0.24).pan(0.3)

// chords · vibraphone
const vibraphone = note(`<
  A B C D A E F D ~@12 G H I J K L M N O P Q D ~@32 R S T D ~@4 U V ~@6 V ~@7 W ~@7 V ~@7 V ~@7 V ~ X Y ~
>`.pickRestart({
  A: "~@2 [c5,g5] ~ [d5,g5] ~ [e5,g5] ~ [d5,g5] ~@3 [c5,g5] ~@3", B: "~@2 d5 ~@3 g4 ~@3 c5 ~ d5 ~ g5 ~",
  C: "~@2 [c5,g5] ~ [d5,g5] ~ [e5,g5] ~ [d5,g5] ~@5 [c5,g5] ~", D: "~@2 g4 ~@3 [b4,d5] ~@3 g4 ~@3 [c5,e5] ~",
  E: "[d5,g5] ~@5 g4 ~@3 c5 ~@3 c5 ~", F: "~@2 [c5,g5] ~ [d5,g5] ~ [e5,g5] ~ [d5,g5] ~@5 [c5,e5] ~",
  G: "~@4 [e5,g5] ~ [d5,g5] ~@3 [c5,g5] ~@5", H: "~@2 [d5,g5] ~@7 g4 ~ d5 ~ g5 ~",
  I: "~@2 [e5,g5] ~ [d5,g5] ~ [c5,g5] ~@7 [c5,g5] ~", J: "[d5,g5] ~@9 g4 ~ d5 ~ g5 ~",
  K: "~@6 [c5,g5] ~ [d5,g5] ~ [e5,g5] ~@5", L: "~@2 g4 ~@7 g4@2 d5@2 g5 ~",
  M: "~@2 [e5,g5] ~ [d5,g5] ~ [c5,g5] ~@3 [d5,g5] ~ [e5,g5] ~@3", N: "~@2 [d5,g5] ~@7 g4@2 d5 ~ g5 ~",
  O: "~@4 [c5,g5] ~ [d5,g5] ~@3 [c5,g5] ~@5", P: "~@2 [d5,g5] ~@3 [c5,f5] ~@3 d5 ~ c5 ~@3",
  Q: "~@6 [e5,g5] ~ [d5,g5] ~@5 [c5,g5] ~", R: "~@2 g4 ~ c5 ~@5 g4 ~@5", S: "~@2 a4 ~ c5 ~@5 g4 ~ d5 ~@3",
  T: "~@6 [e5,g5] ~ [d5,g5] ~@5 [c5,e5] ~", U: "~@14 [g4,d5] ~", V: "~@10 [g5,d6] ~@5", W: "~@14 [g5,d6] ~",
  X: "~@4 [e5,g5] ~@3 [d5,g5] ~@5 [c5,e5] ~", Y: "~@2 g4 ~@3 [c5,d5] ~@3 g4 ~@3 [c5,e5] ~",
})).s("gm_vibraphone").gain(0.28).pan(0.7)

// other · string ensemble 1
const string_ensemble_1_2 = note("<~@48 A B A B C D C E ~@61>".pickRestart({
  A: "~@4 c3 ~@5 c3 ~@5", B: "~@4 g2 ~@5 g2 ~@3 g2 ~", C: "~@4 c3 ~@5 c3 ~@3 c3 ~", D: "~@4 f3 ~@5 g2 ~@3 g2 ~",
  E: "g2 ~@15",
})).s("gm_string_ensemble_1").gain(0.28).pan(0.6)

// other · pizzicato strings
const pizzicato_strings = note(`<
  A B A C A D E ~@41 A B A C A D E ~ A B A C F G F H A D E ~@33 I@2 J K I@2 L B I@2 J@2 I B I@2 M
>`.pickRestart({
  A: "c5 ~@5 d5 ~@5 e5 ~@3", B: "d5 ~@5 b4 ~@5 g4 ~@3", C: "d5 ~@15", D: "d5 ~@5 c5 ~@5 b4 ~@3", E: "c5 ~@15",
  F: "g5 ~@5 e5 ~@5 g5 ~@3", G: "f5 ~@5 d5 ~@5 b4 ~@3", H: "f5 ~@15", I: "e5 ~@5 c5 ~@5 g4 ~@3",
  J: "f5 ~@5 c5 ~@5 a4 ~@3", K: "c5 ~@5 a4 ~@5 f4 ~@3", L: "d5 ~@5 c5 ~@5 g4 ~@3", M: "e5 ~@15",
})).s("gm_pizzicato_strings").gain(0.36).pan(0.2)

// other · pizzicato strings
const pizzicato_strings_2 = note(`<
  ~@32 A B@5 C D B@2 E@2 B D B@2 ~@20 B@6 C D B@2 E@2 B D B@2 ~@8 B@2 E@2 B D B@2 ~@8 B@2 E@2 B D B F G
>`.pickRestart({
  A: "e5@2 c5 ~ g4 ~ e5 ~ c5 ~ g4 ~ e5 ~ c5 ~", B: "e5 ~ c5 ~ g4 ~ e5 ~ c5 ~ g4 ~ e5 ~ c5 ~",
  C: "d5 ~ c5 ~ g4 ~ d5 ~ c5 ~ g4 ~ d5 ~ c5 ~", D: "d5 ~ b4 ~ g4 ~ d5 ~ b4 ~ g4 ~ d5 ~ b4 ~",
  E: "f5 ~ c5 ~ a4 ~ f5 ~ c5 ~ a4 ~ f5 ~ c5 ~", F: "e5 ~ c5 ~ g4 ~ e5 ~ c5 ~ g4 ~ d5 ~ c5 ~", G: "e5 ~@15",
})).s("gm_pizzicato_strings").gain(0.19).pan(0.6)

// other · music box
const music_box = note(`<
  ~@8 A B A C D E D F A G H ~ A B A C I E D F A G H ~@25 A B A C D E D F A G H ~@50
>`.pickRestart({
  A: "c5 ~@5 d5 ~@5 e5 ~@3", B: "d5 ~@5 b4 ~@5 g4 ~@3", C: "d5 ~@15", D: "g5 ~@5 e5 ~@5 g5 ~@3",
  E: "f5 ~@5 d5 ~@5 b4 ~@3", F: "f5 ~@15", G: "d5 ~@5 c5 ~@5 b4 ~@3", H: "c5 ~@15", I: "g5@2 ~@4 e5 ~@5 g5 ~@3",
})).s("gm_music_box").gain(0.28).pan(0.2)

// drums · kick
const kick = s("bd").struct(`<
  ~@20 A B C D E D B F D F G H I F J K F L C F J K M N O P I Q ~@7 H C D F ~ B R S T B D U V W ~ B@2 X B@3 Y Z AA AB B S
  B AC B L F ~ B L AD AE P B@2 AF B@2 AG AH C M AD AI M AJ AK AL AB AD AG AM C AN AO AP ~
>`.pickRestart({
  A: "x ~ x ~@11 x!2", B: "x!2 ~@6", C: "x!2 ~@5 x", D: "x!2 ~ x ~@4", E: "x ~ x!2 ~@3 x", F: "x!2 ~@4 x!2",
  G: "~@2 x!3 ~@3", H: "~@14 x!2", I: "x!3 ~@4 x", J: "x!3 ~@3 x!2", K: "~ x ~@4 x!2", L: "~ x ~@6", M: "~@7 x",
  N: "~@6 x!2", O: "x!3 ~@2 x ~@2", P: "x!3 ~@5", Q: "~@2 x!2", R: "x ~ x ~ x ~@9 x!2", S: "x", T: "x ~ x ~@3 x!2",
  U: "x ~ x!2 ~@4", V: "x ~@10 x ~@4", W: "x ~ x!2 ~@2 x!2", X: "x ~@2 x!2 ~ x ~@9", Y: "x!4 ~@4", Z: "x!2 ~@3 x ~ x",
  AA: "x ~ x!2 ~@2 x ~", AB: "~ x ~@2", AC: "~ x ~ x ~@4", AD: "x ~@6 x", AE: "~@2 x ~@2 x ~@2", AF: "x!2 ~@2 x ~@3",
  AG: "~ x ~@4 x ~", AH: "~ x", AI: "~@2 x ~@11 x!2", AJ: "~@10 x!2 ~@4", AK: "~@5 x ~@2", AL: "~ x!2 ~@2 x!2 ~",
  AM: "~@10 x ~@4 x", AN: "~@2 x ~@2 x ~ x", AO: "x!4 ~@2 x!2", AP: "~ x!3 ~@2 x ~",
})).gain(0.35)

// drums · rim
const rim = s("rim").struct("<~@58 [~ x] ~@58>").gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  ~@20 A B C D ~ C E F C G ~@2 C@5 E C H C I C@2 F ~@2 J ~@8 C E C E@2 A K C E L A ~ C E C E D E@3 D F E@5 M E@2 C E@3 C
  K E@3 D E@2 C L C@4 H F N ~ E A O F C F C@2 J
>`.pickRestart({
  A: "~@5 x ~@2", B: "~@5 x!2 ~", C: "~ x", D: "~@7 x", E: "~@4 x ~@2 x", F: "~@3 x ~@4", G: "~@3 x!2 ~@3",
  H: "~@3 x ~ x ~@2", I: "~@8 x ~@2 x ~@4", J: "x", K: "~@3 x ~@3 x", L: "~@3 x", M: "~@6 x!2", N: "x ~@2 x ~@4",
  O: "~@7 x!2 ~@7",
})).gain(0.35)

// drums · hihat
const hihat = s("hh").struct("<A@7 ~ B@11 ~ B@11 ~ C@15 D C@7 D C@11 D E F@47 ~>".pickRestart({
  A: "~@3 x", B: "~ x ~@2", C: "x!4", D: "x", E: "x!2 ~ x", F: "~ x ~ x",
})).gain(0.25)

// drums · crash
const crash = s("cr").struct("<A ~@7 A ~@11 A ~@11 A ~@7 A ~@7 A ~@7 A ~@11 A ~@15 A ~@15 A ~@15 A>".pickRestart({
  A: "x",
})).gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@19 A ~@27 A ~@7 B ~@11 A ~@8 A ~@6 A ~@8 A ~@6 A ~@8 A ~@6 A ~>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.35)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~@32 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A B ~
>`.pickRestart({
  A: "~ x", B: "~@3 x",
})).gain(0.35)

// drums · congas
const congas = s("conga:33").struct(`<
  ~@20 A B A C D ~ A E@3 F ~ B A B A@4 E B A G H I J@2 ~@9 A ~ A K A B L B A M D N ~ O A@2 D A@3 ~ P ~ Q A@3 M A B A G
  A@3 R B A@2 B A@2 S T A H@2 A U V P W X B Y Z A AA ~ Y ~
>`.pickRestart({
  A: "~@2 x!2 ~@4", B: "~@3 x ~@4", C: "~@4 x!3 ~", D: "~ x", E: "~ x ~@2", F: "x", G: "x!4 ~@4", H: "~ x!3 ~@4",
  I: "~@7 x", J: "~@3 x!2 ~@3", K: "~ x ~ x ~@4", L: "~ x!2 ~@5", M: "~@4 x!2 ~@2", N: "~@6 x!2", O: "x!2 ~ x ~@4",
  P: "~@3 x", Q: "x!2 ~@6", R: "x!2 ~@4 x ~", S: "~@2 x!2 ~@3 x", T: "~ x ~ x ~ x ~@2", U: "x!3 ~@5",
  V: "x ~ x ~@3 x!2", W: "~@3 x!2 ~ x!2", X: "x ~@2 x ~@4", Y: "x ~@6 x", Z: "x!2 ~@4 x!2", AA: "x ~@2 x",
})).gain(1.11)

// drums · claves
const claves = s("clave:2").struct("<~@56 [~@2 x ~@2 x ~@2]!10 [~ x ~@2] ~@50>").gain(1.7)

stack(
  bass, string_ensemble_1, vibraphone, string_ensemble_1_2, pizzicato_strings, pizzicato_strings_2, music_box, kick,
  rim, snare, hihat, crash, ride, tambourine, congas, claves
)

More by Kaempfert