Strudelify
Fur Elise cover art

Beethoven Best Piano Pieces

Fur Elise

Ludwig van Beethoven

KeyA minorTempo105 bpm
0:00/0:00
// Fur Elise — Ludwig van Beethoven
// 105 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 62 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/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 · fretless bass · "FRETLESS"
const bass = note("<~ A B@2 C D@2 A E@2 F@7 G@3 H@2 I@8 J@2 K L@2 M N O P Q R@3 ~ S@7 T@3 U@8>".pickRestart({
  A: "~@9 a1@23", B: "[~ e1@22 ~@2 a1@23 ~@16]/2", C: "~@4 a1@11 ~", D: "[e1@23 ~@2 a1@15 ~@24]/2",
  E: "[~@2 e1@23 ~@2 a1@25 ~@12]/2",
  F: "[~@13 a1@22 ~@2 e1@23 ~@3 a1@11 ~ g1@11 c2@21 ~@4 g1@10 ~@2 g#1@10 ~@2 a1@16 ~@4 a1@4 e1@48 ~@17]/7",
  G: "[~@7 a1@24 e1@22 ~@3 a1@24 ~@16]/3", H: "[~@8 a1@22 ~ e1@22 ~@2 a1@9]/2",
  I: "[~@3 g1@11 ~ c2@21 ~@3 g1@10 ~@2 g#1@10 ~@2 a1@16 ~@4 a1@3 e1@48 ~@25 a1@24 e1@22 ~@3 a1@24 ~@24]/8",
  J: "[a1@22 ~@2 e1@22 ~@2 a1@11 ~ a#1@2 ~@2]/2", K: "a1@3 ~ g1@3 ~ f1@16 ~@4 f1@4",
  L: "[a#1@16 ~@4 a#1@3 ~ f1@17 ~@3 f1@3 ~ f1@16]/2", M: "~@4 f1@3 ~ f2@18 ~@2 f2@4", N: "e2@11 ~ d2@9 ~@3 c2@8",
  O: "~@4 g1@10 ~@2 c2@7 ~@5 f2@3 ~", P: "e2@2 ~@2 d2@2 ~@2 c2@6 ~@2 f1@7 ~ g1@6 ~@2", Q: "a1@9 ~@2 d2@10 ~@2 c2@9",
  R: "[~@3 g1@7 ~ g1@4 c2@7 ~@5 f2@3 ~ e2@2 ~@2 d2@2 ~@2 c2@6 ~ f1@6 ~@2 g1@6 ~@2 e1@24 ~@10]/3",
  S: "[~@29 a1@23 ~ e1@23 ~@2 a1@25 ~@24 a1@22 ~@2 e1@22 ~@3 a1@11 ~@2 g1@11 ~ c2@21 ~@2]/7",
  T: "[~ g1@10 ~@2 g#1@10 ~@3 a1@16 ~@4 a1@4 e1@46]/3",
  U: "[~@25 a1@24 e1@22 ~@3 a1@25 ~@24 a1@22 ~@2 e1@22 ~@3 a1@53 ~@31]/8",
})).s("gm_fretless_bass").gain(0.35)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@6 A@4 B@6 C@4 D@6 E@3 F@7 G@2 H I@2 J@2 K@8 L@3 ~ M@2 N@4 ~>".pickRestart({
  A: "[~@9 e5@4 d#5@4 e5@4 d#5@4 e5@4 ~@3 d5@5 c5@4 [c4,a4]@25 b4@23 ~ a4@27 ~@11, ~@29 b4@5 ~@7 e4@75 ~@12, ~@33 g#4@13 ~@18, ~@89 a3@27 ~@12]/4", // F
  B: "[~@13 [a3,a4]@24 [e3,g#4,b4]@24 [a3,c4,a4]@14 [g3,d4,g4,b4]@11 [c4,g4,c5]@24 ~ g3@11 [g#3,g#4]@12 [a3,a4,c5]@23 ~ e3@25 ~@9, ~@13 e4@60 ~@13 e4@22 ~@2 g4@11 ~@36 g#4@25 ~@10, ~@37 d5@8 ~@19, ~@37 b4@7 ~@20]/6", // A E Am G C5 G# Am
  C: "[~@6 e5@4 d#5@5 e5@4 d#5@4 e5@3 b4@4 d5@5 c5@4 [c4,a4]@24 [g#4,b4]@23 ~ a4@20 ~@21, ~@39 e4@67 ~@22, ~@43 a3@10 ~@11]/4", // F G#m
  D: "[~@8 [a3,c4]@22 ~ [g#4,b4]@23 [a3,c4,a4]@13 [g3,d4,g4,b4]@12 [c4,e4,g4,c5]@24 [g3,g4]@11 ~ g#4@11 [a3,a4,c5]@23 [e3,g#4]@25 ~@18, ~@7 e4@58 ~@38 d5@24 ~@65, ~@7 a4@23 e3@23 ~@50 b4@21 ~@68, ~@19 g#3@2 ~@11]/6", // Am G#m Am G C G Am E
  E: "[~@31 [a3,c5,a5]@24 ~ [b4,b5]@23 [a3,c5,c6]@15 ~@2, ~@31 e4@64 ~, ~@55 g#3@24 ~@17]/3", // Am B Am
  F: "[~@19 [b2,b3]@5 ~@4 c4@3 ~ [a3,e4,c5,a5]@24 [g#3,b5]@23 ~ [a4,a5]@12 ~ [a#3,a#4]@4 [a3,a4]@3 [g3,g4]@4 [a4,c5]@23 [a#4,d5]@24 [c5,e5]@25 [c4,f4,a4]@22 ~@25 e4, ~@24 [d3,d4]@5 ~@2 a2@22 ~@3 [e2,b4]@22 ~ [a2,a3]@12 ~@13 f3@94 ~@26, ~@27 c3@5 ~@24 e4@36 ~ f4@83 ~@48]/7", // B Am G#m A A# A G Am …
  G: "[c5@12 [f4,d5]@12 [g4,c5]@12 [d4,g4,b4]@11 [e4,g4,c5]@13 ~@4, a4@23 ~ e4@10 ~@30]/2", // Dm C5 G C
  H: "~@14 [f4,a4,c5]@9 [g4,b4,d5]@8 ~", // F G
  I: "[[e4,a4,c5]@11 [f4,a4]@11 [e4,c5]@12 ~ [d4,b4]@12 [e4,g4,c5]@13 ~@4, ~@11 d4@9 ~@2 g4@23 ~@19]/2", // Am F C G C
  J: "[~@6 [e4,g4,c5]@7 ~@2 [a4,c5]@7 [d4,g4,b4,d5]@6 ~@2 [g#4,b4]@21 ~@13, ~@14 f4@7 ~@9 e4@26 ~@8]/2", // C Am G G#m
  K: "[~@29 e5@4 d#5@4 e5@4 d#5@4 e5@3 b4@4 d5@4 c5@5 [c4,a4]@24 [g#4,b4]@23 ~ a4@27 ~@23 [a3,a4]@24 [e3,g#4,b4]@24 [a3,c4,a4]@14 [g3,d4,g4,b4]@11 [c4,e4,g4,c5]@24, ~@61 e4@74 ~@24 e4@60 ~@37, ~@108 a3@27 ~@121]/8", // F G#m A E Am G C
  L: "[~@13 [g#3,g#4]@12 [a3,a4,c5]@23 [e3,g#4]@25 ~@23, ~ b4@21 ~@74, ~ [g3,g4]@12 ~@83, ~ d5@12 ~@35]/3", // G# Am E G
  M: "[~@17 [b3,g#4,b4]@24 ~ [c4,a4]@18 ~@4, ~@41 c5@18 ~@5]/2", // E F
  N: "[~@27 [c4,a4]@24 [b3,g#4,b4]@25 [a3,c4,a4]@52, ~@27 e4@101]/4", // F E Am
})).s("gm_string_ensemble_2").gain(0.17)

// chords · string ensemble 2 · "SLOWSTRING" · soft notes
const string_ensemble_2_soft = note("<~@7 A B@2 C@2 ~@2 D@2 ~ E@3 ~@3 F@3 ~@18 G@3 ~ H ~@2 I@3 J@3 ~@5>".pickRestart({
  A: "~@9 a3@21 ~@2", B: "[~@2 e3@24 c5@21 ~@17]/2", C: "[~@20 c4@17 ~@27]/2", D: "[~@6 e4@20 ~@3 [e4,b4]@25 ~@10]/2",
  E: "[~@7 a3@20 ~@4 e3@23 c5@20 ~@22]/3", F: "[~@30 e4@20 ~@3 [e4,b4]@25 ~@18]/3", G: "[~@29 a3@20 ~@4 e3@23 c5@20]/3",
  H: "~@6 c4@17 ~@9", I: "[~@25 e4@20 ~@3 [e4,b4]@25 ~@23]/3", J: "[~@13 [c4,a4]@12 ~@23, ~@13 e4@33 ~@2]/3",
})).s("gm_string_ensemble_2").gain(0.09)

// drums · kick
const kick = s("bd").struct(`<
  ~@7 A B ~ C D E F G ~@2 H I ~ J E F G K ~ L E M ~ I M N I M N I M O P F Q ~@2 R S T L U M V W X ~ Y Z AA AB AC AD ~@2
>`.pickRestart({
  A: "~@9 x ~@20 x ~", B: "~@3 x ~@20 x ~@3 x ~@3", C: "~@13 x ~@18", D: "~@2 x ~@3 x ~@19 x ~@4 x",
  E: "~@19 x ~@3 x ~@8", F: "~@11 x ~@3 x ~@16", G: "~@3 x ~@3 x ~@19 x ~@3 x", H: "~@7 x ~@20 x ~@3", I: "x ~@4 x!2 ~",
  J: "~@8 x ~@19 x ~@2 x", K: "~@9 x ~ x ~@4", L: "~@31 x", M: "~@3 x!2 ~@3", N: "~ x!2 ~@4 x", O: "~ x!2 ~ x ~ x ~",
  P: "x ~@19 x ~@2 x ~@8", Q: "~@3 x ~@3 x ~@6 x ~@7 x ~@7 x ~", R: "~@29 x ~@2", S: "~@17 x ~@3 x ~@10",
  T: "~@5 x ~ x ~@8", U: "~@5 x!2 ~", V: "~@5 x ~@3 x ~@19 x ~@2", W: "~ x ~@19 x ~@3 x ~@6", X: "~@13 x ~@3 x ~@14",
  Y: "~@25 x ~@6", Z: "~@7 x ~ x ~@6", AA: "~@3 x ~ x ~@10", AB: "~@27 x ~@4", AC: "~@4 x!2 ~@2", AD: "~@2 x!2 ~@4",
})).gain(0.35)

// drums · rim
const rim = s("rim").struct(`<
  ~@7 A B ~ C D E F G ~@2 G H ~ I E F G J ~@2 E K ~ H K ~@13 L M ~ H N O P Q ~@2 R ~@2 S T ~@2
>`.pickRestart({
  A: "~@11 x ~@4", B: "~@15 x ~@16", C: "~@25 x ~@6", D: "~@9 x ~@6", E: "~@11 x ~@20", F: "~@3 x ~@23 x ~@4",
  G: "~@19 x ~@12", H: "~@3 x ~@4", I: "~@5 x ~@2", J: "~@5 x ~@10", K: "~ x ~@6", L: "~@9 x ~@22", M: "~ x ~@14",
  N: "~@4 x ~@24 x ~@2", O: "~@21 x ~@10", P: "~@13 x ~@18", Q: "~@5 x ~@26", R: "~@3 x ~@11 x", S: "~ x ~@2", T: "x",
})).gain(0.35)

// drums · snare
const snare = s("sd").struct("<~@32 A B C A B C A B D E ~@20>".pickRestart({
  A: "~@5 x ~@2", B: "~@3 x ~@4", C: "~ x ~@5 x", D: "~@3 x ~@23 x ~@4", E: "~@9 x ~@6",
})).gain(0.35)

// drums · low tom
const low_tom = s("lt").struct("<~@32 [~ x ~@6] ~@5 [~ x ~@6] ~@2 [~@3 x ~@28] ~@20>").gain(0.18)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@7 A B ~ C D E@2 F ~@2 G H ~ I E@3 J ~ K F L ~ M N O M@4 P O Q R S ~@2 T U V K W X Y@2 Z ~ AA AB AC AD W AE ~@2
>`.pickRestart({
  A: "~@9 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~", B: "~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@4 x ~@7",
  C: "~@13 x ~@3 x ~@3 x ~@3 x ~@4 x ~", D: "~@2 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@4 x",
  E: "~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x", F: "~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@4",
  G: "~@7 x ~@3 x ~@3 x ~@3 x ~@4 x ~@3 x ~@3", H: "x!6 ~@2", I: "~@8 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2 x",
  J: "~@3 x ~@2 x ~@3 x ~@3 x ~@3 x ~@13", K: "~@31 x", L: "x!4 ~@4", M: "x!8", N: "x!7 ~", O: "~@3 x!5",
  P: "x!4 ~@2 x ~", Q: "x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2 x ~@3 x ~@3 x", R: "~@3 x ~@3 x ~@3 x ~@11 x ~@8",
  S: "~@5 x ~ x ~ x ~ x ~ x ~@2", T: "~@29 x ~@2", U: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@4 x ~",
  V: "~ x ~ x ~ x ~@10", W: "~@3 x ~@4 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3",
  X: "x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@4 x ~@2", Y: "~ x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@2",
  Z: "~ x ~@3 x ~@3 x ~@3 x ~@18", AA: "~@25 x ~@4 x ~", AB: "~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x", AC: "~ x ~ x ~@12",
  AD: "~@27 x ~@3 x", AE: "x!3 ~@5",
})).gain(0.18)

// drums · mid tom
const mid_tom = s("mt").struct("<~@32 x ~@5 x ~ [~@31 x] ~@21>").gain(0.29)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@8 A ~@5 B ~@3 C ~@5 D ~@3 E ~@2 A ~@5 E ~@2 F G ~@4 H ~@5 I ~@3 J ~@2 K ~@2
>`.pickRestart({
  A: "~@7 x", B: "~@31 x", C: "~@3 x", D: "~@11 x ~@4", E: "~ x", F: "~@15 x ~@16", G: "~@15 x", H: "~@7 x ~@8",
  I: "~@17 x ~@14", J: "~@5 x ~@10", K: "~@3 x ~@4",
})).gain(0.24)

// drums · high tom
const high_tom = s("ht").struct("<~@31 [~@7 x] ~@30>").gain(0.18)

// drums · crash
const crash = s("cr").struct("<~@38 [~ x ~@2] ~@2 [~@7 x ~@24] ~@20>").gain(0.18)

// drums · ride
const ride = s("rd").struct("<~@3 [~@14 x!4 ~@14] ~@58>").gain(0.18)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  ~@7 A B ~ C D E F G ~@2 H I ~ J K L H M ~@2 K N ~ I O P I Q ~@6 R M S ~ T U ~ I V W S X ~@2 Y ~@2 Z AA ~@2
>`.pickRestart({
  A: "~@11 x ~@4", B: "~@15 x ~@16", C: "~@25 x ~@6", D: "~@9 x ~@6", E: "~@11 x ~@3 x ~@2 x ~@13",
  F: "~@3 x ~@23 x ~@4", G: "~@19 x ~@11 x", H: "~@19 x ~@12", I: "~@3 x ~@4", J: "~@5 x ~@2", K: "~@11 x ~@20",
  L: "~@3 x ~@3 x ~@3 x ~@15 x ~@4", M: "~@5 x ~@5 x ~@4", N: "~ x ~@6", O: "~ x ~@5 x", P: "x!2 ~@3 x ~@2",
  Q: "~ x ~@2 x ~@3", R: "~@15 x", S: "~@13 x ~@18", T: "~@9 x ~@22", U: "~ x ~@14", V: "~@4 x ~@24 x ~@2",
  W: "~ x ~@3 x ~@15 x ~@10", X: "~@5 x ~@11 x ~@14", Y: "~@3 x ~@11 x", Z: "~ x ~@2", AA: "x",
})).gain(1.54)

stack(
  bass, string_ensemble_2, string_ensemble_2_soft, kick, rim, snare, low_tom, hihat, mid_tom, open_hat, high_tom, crash,
  ride, triangle
)

More by Ludwig van Beethoven