Strudelify

hatikvah hope

Samuel Cohen

KeyA minorTempo132 bpm
0:00/0:00
// hatikvah hope — Samuel Cohen
// 132 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: Transcription provider: pdmx. https://musescore.com/score/5357174; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 110 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(132/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · contrabass · "Contrebasse"
const bass = note(`<
  A B C D E F G H I J K L M N O L P N Q R S T U V W X ~@26 Y@7 Z@2 AA@6 AB@3 AC AD@4 AE AF@4 AG@7 AH@2 AI AJ AK@5 AL@3
  AM@2 AN AO AP ~ AQ@2 AR AS@2
>`.pickRestart({
  A: "~@3 a2@6 a2@3 a2@3 b2 ~@2 c3 ~@2 b2 ~@2", B: "~@3 a2@6 a2@3 a2@3 g2 ~@2 a2@6",
  C: "~@3 a2@6 b2@3 d3@3 c3 ~@2 b2 ~@2 a2 ~@2", D: "e3@12 d#3 e3@11", E: "~@3 d3@6 c3@3 d3@3 e3 ~@2 d3@6",
  F: "~@3 c3@6 b2@3 c3@3 d3 ~@2 c3@6", G: "b2@6 a2@6 d3 ~@2 c3 ~@2 b2 ~@2 a2 ~@2", H: "g#2@12 g2 g#2@11",
  I: "~@6 d#2 e2@5 ~@6 d#2 e2@5", J: "~@3 d#2 e2@2 ~@3 d#2 e2@2 ~@6 d#2 e2@5", K: "~ a2@2 a2 c3@2 c3@2",
  L: "~ a2@2 a2 f2@4", M: "~ a2@2 a2 ~ c3@2 c3", N: "~ e2 e3 e2 ~ e2 e3 e2", O: "~ b2@2 b2 d3@2 d3@2", P: "d3!2",
  Q: "g#2@3 e2 g#2@3 e2", R: "g#2@3 a2 ~@2 g#2 ~@2 f2 ~@2 e2@3 f2@3 g#2@6", S: "b2@3 g#2 b2@3 g#2",
  T: "b2@3 c3 ~@2 b2 ~@2 a2 ~@2 b2 ~@2 a2 ~@2 g#2@6", U: "~ e3@2 c3 e3 c3 e3@2", V: "~ d3@2 b2 d3 b2 d3@2",
  W: "f3 d3 f3 d3", X: "e3 e2 ~ f2 ~@2 e2 ~@2 d2 ~@2 c2 ~@2 d2 ~@2 c2 ~@2 b1 ~@2",
  Y: "[~@13 [c2,a2]@8 [c2,a2]@8 [c2,a2]@8 [c2,a2]@8 [b1,g2]@16 [g1,e2]@16 [a1,f2]@16 [c2,a2]@15 [b1,g2]@16 [g#1,e2]@16 d2@8 d2@8 c2@8 c2@4]/7", // F Em C Dm F Em C#m
  Z: "[~@4 d2@8 g2@4 f2@4 [g1,e2]@16 d2@7 d2@5]/2", // C
  AA: "[~@3 c2@4 d2@4 e2@8 [c2,a2]@8 [b1,g#2]@8 [c2,a2]@16 [d2,b2]@8 [d2,b2]@8 [e2,c3]@8 [e2,c3]@4 [e2,c3]@4 [f2,d3]@7 [f2,d3]@8 [e2,c3]@16 [g#2,f3]@8 [g#2,f3]@8 [a2,e3]@8 [a2,e3]@4 [a2,e3]@2]/6", // F E F G C Dm C C# …
  AB: "[~@2 [b2,g#3]@8 [b2,g#3]@24 [a2,a3]@9 d#2 e2@9 ~@10 d#2 e2@8]/3", AC: "~@6 d#2 e2@4 ~@5 d#2 e2@4 ~@3",
  AD: "[~@7 d#2 e2@9 ~@5 a2@10 a2@5 c3@9 c3@10 ~@5 a2@10 a2@5 f2@20]/4", AE: "~@5 a2@10 a2@5 ~@4",
  AF: "[~ c3@10 c3@5 ~@5 e2@4 e3@5 e2@5 ~@5 e2@5 e3@5 e2@5 ~@5 b2@10 b2@5 d3@10 d3@10 ~]/4",
  AG: "[~@4 a2@10 a2@5 f2@19 d3@20 d3@20 ~@5 e2@5 e3@5 e2@5 ~@5 e2@5 e3@5 e2@5 g#2@14 e2@5 g#2@15 e2@5 g#2@5 a2@2 ~@3 g#2]/7",
  AH: "[~@4 f2@2 ~@3 e2@5 f2@5 g#2@10 b2@15 g#2@4]/2", AI: "~ b2@14 g#2@5 b2@4",
  AJ: "~ c3@2 ~@3 b2@2 ~@3 a2@2 ~@3 b2@2 ~@3 a2@2 ~",
  AK: "[~@2 g#2@10 ~@5 e3@10 c3@5 e3@5 c3@5 e3@10 ~@5 d3@9 b2@5 d3@5 b2@5 d3@10 f3@10 e3@10 d3@9]/5",
  AL: "[~ c3@10 b2@10 a2@10 g2@9 f#2@10 [d#2,a2]@10 ~@12]/3", AM: "[~@9 [e2,e3]@5 ~@10]/2", AN: "~@10 c3@5 e2@9",
  AO: "a2@5 d#3 e3@2 ~@2 a2@2 ~@3 e2@9", AP: "~ [c2,f2]@20 ~@3", AQ: "[~@3 a1@10 c2@10 e2@9 [c2,a2]@10 ~@6]/2",
  AR: "~@2 [e2,e3]@5 ~@5", AS: "[a2@10 a1@10 a1@10 a1@10 a1@5 ~@3]/2",
})).s("gm_contrabass").gain(0.4)

// bass · contrabass · "Contrebasse" · soft notes
const bass_soft = note("<~@26 A B C D E F G H I J I K L M N O P Q R@5 S@4 ~@57>".pickRestart({
  A: "~ e2@2 e2 f2@2 e2@2", B: "~ c2@2 c2 d2@2 c2@2", C: "~ a2@2 a2 c3@2 c3@2", D: "~ a2@2 a2 b2@4",
  E: "~ f2@2 f2 e2@4", F: "~ d2@2 d2 c2@4", G: "g2 g1 g2 g1", H: "f#2!2", I: "~ c2@2 c2 d2@2 d2@2", J: "~ c2@2 c2 c2@4",
  K: "e2 [c2,a2]", L: "~ a2@2 a1 a2 a1 a2@2", M: "~ e2@2 a1 e2 a1 e2@2", N: "[a1,f2] [a1,a2]", O: "[g#1,e2] [b1,g#2]",
  P: "[c2,a2]@2 c2 d2 e2@2", Q: "c2@2 f2@2 f2 d2",
  R: "[e2@15 d2@16 c2@4 d2@4 e2@4 c2@4 b1@8 e2@8 c2@16 [c2,a2]@8 c2@4 d2@4 e2@7 c2@8 f2@8 f2@2]/5", // F
  S: "[~@2 d2@4 e2@16 d2@16 c2@4 d2@4 e2@8 b1@8 e2@8 c2@15 ~@11]/4",
})).s("gm_contrabass").gain(0.2)

stack(bass, bass_soft)