Strudelify

Toccato und Fuge F-Dur BWV 540

Bach Johann Sebastian

KeyD minorTempo60 bpm
0:00/0:00
// Toccato und Fuge F-Dur BWV 540 — Bach Johann Sebastian
// 60 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (4/4 at bar 1, 8/4 at bar 3, 6/4 at bar 9, 4/4 at bar 12, ...) are rendered on a constant 4/4 grid of one bar per cycle
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 31 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(60/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.

// chords · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<A B ~@2 C D E@3 ~ F G H@5 I@2 J@3 K@4 L@5>".pickRestart({
  A: "[a4,a5] [g4,g5] [a4,a5]@10 [g4,g5] [f4,f5] [e4,e5] [d4,d5]", B: "[db4,db5] [d4,d5]@2 ~@5",
  C: "[a2,a3] [g2,g3] [a2,a3]@10 [g2,g3] [f2,f3] [e2,e3] [d2,d3]", D: "[db2,db3]@4 [d2,d3]@17 ~@11",
  E: "[~@4 db3@4 e3@4 g3@4 bb3@4 db4@4 e4@19 ~@5 g3@8 e3@8 gb3@32, d2 [d2,a2,d4]]/3", F: "~@28 g5 bb5 e5 ~",
  G: "g5 bb5 ~@3 f5 ~ d5 ~ f5 a5 ~@2 e5 ~@3 e5 ~@4 d5 ~@3 d5 ~@3 c5 e5",
  H: "[~@2 c5 ~ e5 ~@2 bb4 d5 ~@2 [a2,a4] [db3,db5] ~@7 [db3,bb3]@15 db4@3 a3@2 db4@2 ~ e4 g4 f4@7 ~ e4@2 [d2,a2,d4,f4]@17 ~@3 d5 ~ a4 e5 a4 f5 ~ a4 d5 a4 e5 ~ a4 f5 a4 g5 ~ a4 e5 a4 d5@2 ~ a4@2 bb4@2 ~ g4@2 a4@3 f4@2 g4@3 e4@2 f4@3 d4@2 g4@3 e4@2 f4@3 d4@2 e4@3 db4@2 [d3,f3,d4]@20 ~@5, ~@3 d2@4 ~@12 d4@4 a3@4 ~@5]/5", // A Db Gb Dm
  I: "[~@20 [f4,bb4]@5 ~@5 [e4,a4]@5 ~@5 [d4,g4]@5 ~ [a1,a2,db4]@10 ~@8, ~@15 [d2,d3]@10 c3@10 ~@10 a4@10 ~@9, ~@13 c2@5 [bb1,bb2]@5 ~@9]/2", // Bb5 A5 G5 A D Bb
  J: "[~@16 [f4,bb4]@5 ~@5 [e4,a4]@5 ~@5 [d4,g4]@4 ~@2 [db4,a4]@11 ~ [ab1,ab2,f4,b4]@23 [g1,g2,e4,a4,db5]@11 g5@3 f5@3 e5@2, ~@11 [d2,d3]@10 [c2,c3]@10 [bb1,bb2]@10 [a1,a2]@12 d4@23 ~@20]/3", // Bb5 A5 G5 Gbm Fdim A7 D C …
  K: "[d5@3 [bb4,e5]@16 g3@4 db4@4 bb4@4 e5@15 ~ [g2,g3,db5,a5]@11 [f2,f3,d5,a5]@11 ~ [bb1,bb2]@17 [a1,a2]@3 [g1,g2]@3 [a1,a2,g4,db5,g5]@16 [e2,e3]@4 ~ [f2,f3]@4 [d2,d3]@4 [e2,e3]@3 [db2,db3]@3, ~@70 [g4,g5]@23 ~@35]/4", // Bbdim A7 Dm Bb A G A7 E …
  L: "[~ [d2,d3]@3 [b1,b2]@3 [db2,db3]@3 [a1,a2]@3 [bb1,bb2]@4 [ab1,ab2]@4 [a1,a2]@4 [g1,g2,e5,a5,bb5,db6]@4 ~ [d5,d6]@10 [d2,d3,d5,f5]@11 ~@12 db5@11 [g3,g4]@12 ~@2 [f3,f4]@7 [e3,e4]@9 [f3,f4]@37 ~@19, ~@29 [f1,f2]@11 ~@11 e5@23 [d2,d5]@66 ~@20, ~@52 [a1,a2]@23 ~@85]/5", // D B Db A Bb Ab A A7 …
})).s("gm_string_ensemble_1").gain(0.22).pan(0.3)

// chords · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note("<~@11 A B@2 ~@17>".pickRestart({
  A: "~@2 e5 ~@3 a5 ~@4 d5 ~@2 g5 c5 ~@2 g5 ~ c5@2 ~ f5 bb4 ~@2 f5 bb4 ~@3",
  B: "[a4 ~@4 a4@2 ~@2 g4@2 ~@2 db2 ~@6 g3@15 ~@29]/2",
})).s("gm_string_ensemble_1").gain(0.13).pan(0.3)

// other · piano · "A.PIANO 1"
const piano = note("<~ A B C ~ D E F@2 G H I J K@4 L@2 M N@2 O P@3 Q@5>".pickRestart({
  A: "db5 d5@2 ~@5", B: "~@7 db4", C: "d4@29 ~@3", D: "db3@4 d3@5 ~@23", E: "~@20 db5@3 ~@9, d3@23 ~@9, ~@16 bb4@7 ~@9",
  F: "[~@16 [d3,a3]@47 ~]/2", G: "~@3 db4 ~@3 db4 ~@3 db4 ~@8 e4 ~@3 e4 ~@4 e4 ~@2", H: "~@5 g4 ~@3 g4 ~@4 g4 ~@16 e4",
  I: "~@3 e4 ~@3 d4 ~@4 d4@2 ~@2 c4 ~@3 c4@2 ~@3 bb3 ~@3 bb3 ~@2", J: "~ a3@2 ~@2 a3@2 ~@3 g3@2 ~@3 d3@17, ~@7 db3 ~@8",
  K: "[~@24 [d3,a3]@19 a3@20 d4@20 a3@20 [d3,f3]@20 d4@5]/4", // D5 Dm
  L: "[c4@5 bb3@5 a3@5 d3@10 c3@10 bb2@10 ~ a2@9 d4@5 c4@4]/2", M: "~ bb3@5 a3@5 d3@10 c3@10 ~",
  N: "[bb2@10 a2@12 ab2@23 g2@11 ~@8]/2", O: "~@3 g3@16 ~@4 db4@5 ~@4, ~@3 db4@20 ~@9, ~@19 g3@9 ~@4",
  P: "[~@15 g3@11 f3@12 bb3@17 a3@3 g3@2 a3@17 e3@5 f3@4 d3@4 e3@3 db3@3]/3",
  Q: "[~ d3@3 b2@3 db3@3 a2@3 bb2@4 ab2@4 a2@4 g2@5 f2@10 d3@12 a2@22 d2@65 ~@21]/5",
})).s("gm_piano").gain(0.43)

// other · clarinet
const clarinet = note("<~@2 A B ~@5 C D E F ~@18>".pickRestart({
  A: "a4 g4 a4@8 e4@2 f4@2 db4@2", B: "d4@15 ~", C: "~@3 db3 ~@3 db3 ~@3 db3 ~@8 e3 ~@3 e3 ~@4 e3 ~@2",
  D: "~@5 g3 ~@3 g3 ~@4 g3 ~@16 e3", E: "~@3 e3 ~@3 d3 ~@4 d3@2 ~@2 c3 ~@3 c3@2 ~@3 bb2 ~@3 bb2 ~@2",
  F: "~ a2@2 ~@2 a2@2 ~@3 g2@2 ~@20",
})).s("gm_clarinet").gain(0.25).pan(0.7)

// other · bassoon
const bassoon = note("<~@2 A B ~@5 C D E F ~@18>".pickRestart({
  A: "a3 g3 a3@8 e3@2 f3@2 db3@2", B: "d3@15 ~",
  C: "d3 e3 ~@2 d3 ~ e3 ~@2 d3 e3 ~@2 d3@2 e3@2 f3 ~ g3 ~ f3 ~ g3 ~@2 f3 g3 ~@2 f3@2",
  D: "g3 ~ a3 ~ bb3 ~@2 a3 bb3 ~@2 a3 bb3 ~@2 a3@11 ~@2 g3 bb3 ~@2",
  E: "g3 ~ bb3 ~@2 f3 a3 ~@2 f3 a3 ~@2 e3 ~ g3 ~ e3 ~ g3 ~@2 d3 f3 ~@2 d3 f3 ~@2 c3 ~",
  F: "e3 ~@2 c3 e3 ~@2 bb2 d3 ~@2 a2 db3 ~@19",
})).s("gm_bassoon").gain(0.18).pan(0.2)

// other · trombone
const trombone = note("<~@4 A B C@3 ~@3 D@3 ~ E F@2 G@3 ~ H@3 I@5>".pickRestart({
  A: "[a2,a3] [g2,g3] [a2,a3]@10 [g2,g3] ~@3", B: "[db2,db3]@2 [d2,d3]@9 ~@5",
  C: "[~@4 db3@4 e3@4 g3@4 bb3@4 db4@4 e4@19 ~@5 g3@8 e3@8 gb3@32, d2 [d2,a2,d4]]/3", // D5
  D: "[~@11 a2 db3 ~@7 [db3,bb3]@11 ~@25 [d2,d3]@17 ~@23, ~@15 d2@20 ~@20 [a2,f3]@17 ~@24]/3", // Gb D Dm
  E: "~@2 [d2,d3]@5 ~, ~@7 f2@20 ~@5", F: "[~@16 d2@9 [c2,c3]@10 [bb1,bb2]@10 [a1,a2]@10 ~@9, ~@15 d3@10 ~@39]/2",
  G: "[~@11 [d2,d3]@10 [c2,c3]@10 [bb1,bb2]@11 [a1,a2]@11 ~ [ab2,d3,f3,b3]@22 [g2,e3,a3,db4]@12 ~@8]/3", // D C Bb A Abdim A7
  H: "[~@15 [g2,g3]@11 [f2,f3]@11 ~ [bb1,bb2]@17 [a1,a2]@3 [g1,g2]@2 ~ a2@16 [e2,e3]@5 [f2,f3]@4 [d2,d3]@4 [e2,e3]@3 [db2,db3]@3, ~@15 a1@4 ~@5]/3", // G F Bb A G E F D …
  I: "[~ [d2,d3]@3 [b1,b2]@3 [db2,db3]@3 [a1,a2]@3 [bb1,bb2]@4 [ab1,ab2]@4 [a1,a2]@4 [g1,g2]@5 ~@10 [d2,f4]@11 ~@12 db4@11 ~@14 f3@7 e3@9 f3@36 ~@20, ~@15 [f1,f2,a3,d4]@11 [a1,a2,e4]@11 [d2,d4]@33 ~@10]/5", // D B Db A Bb Ab A G …
})).s("gm_trombone").gain(0.32).pan(0.4)

// other · trombone · soft notes · F E D
const trombone_soft = note("<~@4 [~@13 [f2,f3] [e2,e3] [d2,d3]] ~@7 [~@14 db2 ~@5 g3@11 ~] ~@18>")
  .s("gm_trombone").gain(0.2).pan(0.4)

// other · flute
const flute = note(`<
  ~@10
  [~@28 g6 bb6 ~ e5]
  [g6 ~ bb6 e5 ~ f6 a6 d5 ~ f6 a6 ~@2 e6 ~ g6 c5 e6 ~ g6 c5@2 d6 f6 ~ bb4 d6 f6 ~ bb4 c6 ~, ~@6 d5 ~@9]
  [e6 a4@2 c6 e6 a4@2 bb5 d6 ~@2 a5 ~ db6 ~@18, ~@5 g4 ~@10]
  ~@18
>`).s("gm_flute").gain(0.25).pan(0.7)

// chords · orchestral harp · "HARP"
const orchestral_harp = note("<~@16 A B@2 C D ~@10>".pickRestart({
  A: "~@29 f4 bb4 f4, ~@7 d4",
  B: "[~@2 e4 a4 e4 ~@2 d4 g4 d4 ~@2 db4 ~ a4 ~@5 [f4,bb4]@4 ~@6 [e4,a4]@4 ~@6 [d4,g4]@3 ~@3 [a2,db4,a4]@9 ~@2 f4 bb4 f4 ~@2 e4 a4, c4@5 bb3@5 a3@5 d3@10 c3@10 ~ bb2@10 ~@18, ~@13 e4@2 ~@40 d4@5 c4@4]/2", // Bb5 A5 G5 A
  C: "e4 ~@2 d4 g4 d4 ~@2 db4 e4 a4 ~@5 [f4,bb4]@4 ~@6 [e4,a4]@4 ~@2, ~ bb3@5 a3@5 d3@10 c3@10 ~", // Bb5 A5
  D: "~@4 [d4,g4]@3 ~@3 [db4,a4]@8 ~@14, bb2@5 a2@6 ~@5", // G5 Gbm
})).s("gm_orchestral_harp").gain(0.3).pan(0.2)

stack(
  string_ensemble_1, string_ensemble_1_soft, piano, clarinet, bassoon, trombone, trombone_soft, flute, orchestral_harp
)

More by Bach Johann Sebastian