Strudelify

marble machine

Martin Molin

KeyB minorTempo145 bpm
0:00/0:00
// marble machine — Martin Molin
// 145 bpm, 4/4, key B 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/2372586; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 88 bars on a 24-step grid, each part at one level. Source detail keeps the original performance.
setcpm(145/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.

// other · glockenspiel
const glockenspiel = note(`<
  ~ A B@2 C@2 D@2 E@2 B@2 F@4 G@2 B@2 C@2 D@2 E@2 B@2 F@4 H ~@10 I J ~ K ~ L M@2 N ~@11 O P@4 Q@2 R@2 S@6 T U P@4 Q@2
  V@2
>`.pickRestart({
  A: "e7@2 e6 b6@4 a6", B: "[g6 a6@2 b6@2 e6 g6 d7@4 a6@4 g6]/2", C: "[f#6 g6@2 a6@2 f#6 g6 d7@3 f#6 a6@4 d7]/2",
  D: "[c7 b6@2 a6@2 g6 b6 e6@2 e6 a6 b6 ~@3 d7]/2", E: "[c7 b6@2 a6@2 e6 b6 e7@3 e6 b6@4 a6]/2",
  F: "[f#6 g6@2 a6@2 f#6 g6 d7@4 b6@4 e7@2 b6@2 a6@2 g6 f#6 e6@2 e6 f#6 g6 f#6 g6 a6 g6]/4",
  G: "[a6 b6!2 c7 e7 e6 a6 e7@3 e6 b6@4 a6]/2", H: "a6 b6!2 c7 e7 e6 a6 e7", I: "~@3 b6", J: "e7 b6 ~@2",
  K: "d7 a6 ~@2", L: "d7 g6 ~@2", M: "[~@15 a6@8 b6@8 ~@9 b6@8]/2", N: "~ e7@10 ~@13", O: "~@3 e7",
  P: "[e6 b6@4 a6 g6 a6@2 b6@2 e6 g6 d7@4 a6@4 g6 f#6 g6@2 a6@2 f#6 g6 d7@3]/4",
  Q: "[f#6 a6@4 d7 c7 b6@2 a6@2 g6 b6 e6@2 e6]/2", R: "[a6 b6 ~@3 d7 c7 b6@2 a6@2 e6 b6 e7@3]/2",
  S: "[e6 b6@4 a6 g6 a6@2 b6@2 e6 g6 d7@4 a6@4 g6 f#6 g6@2 a6@2 f#6 g6 d7@4 b6@4 e7@2 b6@2 a6@2 g6 f#6 e6@2 e6]/6",
  T: "f#6 g6 f#6 g6 a6 g6 a6 b6", U: "b6 c7 e7 e6 a6 e7 e7@2", V: "[a6 b6 ~@3 d7 c7 b6@2 a6@2 e6 b6 e7 ~@2]/2",
})).s("gm_glockenspiel").gain(0.4)

// chords · vibraphone
const vibraphone = note(`<
  ~ A@7 B C@6 D E A@7 B C@6 D E ~@3 F@2 G@2 H@2 I@2 F@2 G@2 J@3 K ~@12 L@2 M@2 N O@2 P L@2 M@2 N Q R S L@2 M@2 N O@2 P
>`.pickRestart({
  A: "[~@2 [b4,e5]@4 [b4,e5]@4 [b4,e5]@4 [b4,e5]@4 [a4,d5]@4 [a4,d5]@4 [a4,d5]@4 [a4,d5]@4 [b4,f#5]@4 [b4,f#5]@4 [b4,f#5]@4 [b4,f#5]@6 b4 c5 d5 ~]/7", // E5 D5 B5
  B: "~ [b4,f#5]@2 [b4,e5]", // B5 E5
  C: "[~ [b4,e5]@2 [b4,e5]@2 [b4,e5]@2 [b4,e5]@2 [a4,d5]@2 [a4,d5]@2 [a4,d5]@2 [a4,d5]@2 [b4,f#5]@2 [b4,f#5]@2 [b4,f#5]@2 [b4,f#5]]/6", // E5 D5 B5
  D: "~ e4 f#4 g4 f#4 g4 a4 g4", E: "a4 b4!2 c5 e5 e4 a4 e5", F: "[b4,e5]/2", G: "[a4,d5]/2", H: "[g4,d5]/2",
  I: "[a4,c5]/2", J: "[[g4,d5]@55 e4@9 b4@8]/3", K: "~ e5@10 ~@13", L: "[b4,e5]!2", M: "[a4,d5]!2", N: "[b4,f#5]!2",
  O: "[[b4,f#5]@4 [b4,f#5]@6 b4 c5 d5 ~@3]/2", P: "[b4,f#5]@2 [b4,e5] ~", Q: "[b4,f#5]@4 [b4,f#5]@2 ~ e4",
  R: "f#4 g4 f#4 g4 a4 g4 a4 b4", S: "b4 c5 e5 e4 a4 e5 ~@2",
})).s("gm_vibraphone").gain(0.3)

// chords · marimba
const marimba = note("<~@9 A@4 ~@2 B C D@7 E@8 C ~@11 F@2 G@2 H@2 I@2 ~@11 J K@4 L@2 M@2 N@6 O P ~@8>".pickRestart({
  A: "[~ [b3,e4,b4,e5]@2 [b3,e4,b4,e5]@2 [b3,e4,b4,e5]@2 [b3,e4,b4,e5]@2 [a3,d4,a4,d5]@2 [a3,d4,a4,d5]@2 [a3,d4,a4,d5]@2 [a3,d4,a4,d5]]/4", // E5 D5
  B: "~ e4 f#4 g4 f#4 g4 a4 g4", C: "a4 b4!2 c5 e5 e4 a4 e5",
  D: "[e5@2 ~@5 a4 g4 ~@2 b4@2 e4 g4 ~@8 g4 f#4 ~@2 a4@2 f#4 g4 d5@3 ~@5 d5 c5 ~@2 a4@2 g4 b4 e4@2 e4 a4 b4 b3 c4 d4 d5, ~ [b3,e4]@2 [b3,e4]@2 b3@2 [b3,e4]@2 [a3,d4]@2 [a3,d4]@2 [a3,d4]@2 [a3,d4]@2 [b3,f#4]@2 [b3,f#4]@2 [b3,f#4]@2 [b3,f#4]@2 ~@3, ~@3 b4@4 ~@2 a4@2 ~@4 d5@4 a4@4 ~@2 g4@2 ~@8 a4@4 ~@2 b4@2 ~@13, ~@10 e4@3 ~@43]/7", // E5 D5 B5
  E: "[c5 ~@2 a4@2 e4 b4 e5@3 ~@5 a4 g4 ~@2 b4@2 e4 g4 ~@8 g4 f#4 ~@2 a4@2 f#4 g4 ~@8 e5@2 ~@2 a4@2 g4 ~ e4@2 e4 f#4 g4 f#4 g4 a4 g4, ~ b4@2 ~@8 b4@4 ~@2 a4@2 ~@4 d5@4 a4@4 ~@2 g4@2 ~@4 d5@4 b4@4 ~@2 b4@2 ~@13, ~ [b3,f#4]@2 [b3,e4] ~ [b3,e4]@2 [b3,e4]@2 b3@2 [b3,e4]@2 [a3,d4]@2 [a3,d4]@2 [a3,d4]@2 [a3,d4]@2 [b3,f#4]@2 [b3,f#4]@2 [b3,f#4]@2 [b3,f#4] ~@4, ~@18 e4@3 ~@43]/8", // B5 E5 D5 B5
  F: "[b3,e5]!24", G: "[a3,d5]!24", H: "[g3,d5]!24", I: "[[g3,d5]!7 [e3,e4] [e3,e4]@36 ~@4]/2", J: "~@3 e5",
  K: "[~@5 a4 g4 ~@2 b4@2 e4 g4 ~@8 g4 f#4 ~@2 a4@2 f#4 g4 d5@3, [b3,e4]!2 b3 [b3,e4] [a3,d4]!2 [a3,d4]!2, ~ b4@4 ~@2 a4@2 ~@4 d5@4 a4@4 ~@2 g4@2 ~@7, ~@8 e4@3 ~@21]/4", // E5 D5
  L: "[~@5 d5 c5 ~@2 a4@2 g4 b4 e4@2 e4, [b3,f#4]!2 [b3,f#4]!2, ~ a4@4 ~@2 b4@2 ~@7]/2", // B5
  M: "[a4 b4 b3 c4 d4 d5 c5 ~@2 a4@2 e4 b4 e5@3, ~@7 b4@2 ~@7, ~@4 [b3,f#4]@2 [b3,e4] ~]/2", // B5 E5
  N: "[~@5 a4 g4 ~@2 b4@2 e4 g4 ~@8 g4 f#4 ~@2 a4@2 f#4 g4 ~@8 e5@2 ~@2 a4@2 g4 ~ e4@2 e4, [b3,e4]@2 [b3,e4]@2 b3@2 [b3,e4]@2 [a3,d4]@2 [a3,d4]@2 [a3,d4]@2 [a3,d4]@2 [b3,f#4]@2 [b3,f#4]@2 [b3,f#4]@2 [b3,f#4] ~, ~ b4@4 ~@2 a4@2 ~@4 d5@4 a4@4 ~@2 g4@2 ~@4 d5@4 b4@4 ~@2 b4@2 ~@7, ~@8 e4@3 ~@37]/6", // E5 D5 B5
  O: "f#4 g4 f#4 g4 a4 g4 a4 b4", P: "b4 c5 e5 e4 a4 e5 ~@2",
})).s("gm_marimba").gain(0.2)

// bass · electric bass pick · "Bass Guitar"
const bass = note(`<
  ~@17 A B C@2 D@2 E F G H I J K@2 L M N@4 ~@16 O@2 P Q R S T U@2 V@2 W X Y Z AA@2 AB AC AD AE AF AG AH AI AJ AK@8 ~
>`.pickRestart({
  A: "e1@3 ~@3 d2@3 ~@3 e2@3 e1 ~@5 e3@3", B: "~ e1 g1 a2 ~ e1 g2 d2",
  C: "[~ g1!2 ~ g1!2 ~ g2@2 g1 g2 g2@2 f2 e2 d#2]/2", D: "[d2 ~ d2 ~ d2 ~ g1 d2@2 c2@2 b1@2 a1@2 e1]/2",
  E: "~ e1!2 ~ e1!2 ~ e1", F: "g2@3 e1@3 g2@3 a2 [g2,g#2] f#2 [e2,f2] [d2,d#2] c#2 [b1,c2] a#1 [g#1,a1] g1@3 a1@3",
  G: "~ e1 e3 e1 f#3 g3 ~ g3", H: "g2@3 g3@3 f#3 f3 ~ e3 d#3 ~ d3@3 e1@3 d3@3 e1@3",
  I: "g1@3 g1@3 ~@3 g2@3 ~@3 g1@6 g2!2 ~",
  J: "f2@3 [d#2,e2] [c2,c#2,d2] [a1,a#1,b1] g1@3 c2@3 d2@3 c2@3 d2@3 g1@3, ~@6 g#1 ~@17", // Emaj7
  K: "[d2@3 c2@3 g1 d2@2 ~ d2 c2 b1 f1 f#1 g1]/2",
  L: "[g1,g#1] [a1,a#1] [b1,c2] [c#2,d2] [d#2,e2] [f2,f#2] g2@6 g2@6 f2@6", M: "f2 e2 c2 d2 a1 b1 c2 g1", N: "e1/4",
  O: "[~@2 e1@5 ~@5 d2@5 ~@6 e2@5 e1@3 ~@7 e3@5 ~@5]/2", P: "e1@5 g1@5 a2@5 ~@5 e1@4", Q: "g2@5 d2@5 ~@4 g1@4 g1@4 ~@2",
  R: "~@3 g1@4 ~ g1@4 ~@4 g2@8", S: "g1@4 ~ g2@4 g2@8 f2@4 e2@3", T: "~ d#2@4 d2@4 ~@3 d2@4 ~@4 d2@4",
  U: "[~@3 g1@4 d2@7 c2@7 b1@7 a1@7 e1@3 ~@4 e1@3 ~ e1@2]/2",
  V: "[~@4 e1@3 e1@3 ~@4 e1@3 g2@3 e1@3 g2@3 ~ [g#2,a2] g2 [f2,f#2] e2 [d2,d#2] [c2,c#2] b1 [a1,a#1] g#1 g1@3 a1@3 e1@3 ~@3]/2", // Amaj7 F#maj7 D#maj7 C#maj7 A#maj7
  W: "d2@3 ~@3 e2@3 e1 ~@5 e3@3 ~@3 e1@3", X: "g1 a2 ~ e1 g2 d2 ~ g1", Y: "g1 ~ g1!2 ~ g2@2 g1",
  Z: "g2 g2@2 f2 e2 d#2 d2 ~", AA: "[d2 ~ d2 ~ g1 d2@2 c2@2 b1@2 a1@2 e1 ~ e1]/2", AB: "e1 ~ e1!2 ~ e1 g2 e1",
  AC: "g2@3 a2 [g2,g#2] [f2,f#2] e2 [d2,d#2] c#2 [b1,c2] a#1 [g#1,a1] g1@3 a1@3 ~@3 e1@3", // G#maj7 F#maj7 D#maj7 Cmaj7 Amaj7
  AD: "e3 e1 f#3 g3 ~ g3 g2 g3", AE: "f#3 f3 ~ e3 d#3 ~ d3@3 e1@3 d3@3 e1@3 g1@3 g1@3",
  AF: "~@3 g2@3 ~@3 g1@6 g2!2 ~ f2@3 e2@3", AG: "g1 c2 d2 c2 d2 g1 d2!2", AH: "~@2 c2!2 ~ d2@2 ~",
  AI: "d2@3 c2@3 b1@3 f1@3 f#1@3 g1@3 [g1,g#1] [a1,a#1] [b1,c2] [c#2,d2] [d#2,e2] [f2,f#2]", AJ: "g2@2 g2@2 f2@2 f2 e2",
  AK: "[c2 d2 a1 b1 c2 g1 e1@16 g1@16 d2@16 e1@10]/8",
})).s("gm_electric_bass_pick").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@9 [~ x ~ x]!6 [~ x] [~ x ~@6] [~ x ~ x]!16 ~@31 [x!2]!16 ~@8>").gain(0.4)

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@17 A B A C A B D E A B A C A B D E ~@30 F G H G I G J K L G H G I G J K M ~@8
>`.pickRestart({
  A: "x ~@3 x ~@2 x", B: "~ x ~@2 x!2 ~@2", C: "~ x ~@2 x!2 ~ x", D: "~ x", E: "~ x ~@2 x ~@2 x", F: "~@3 x",
  G: "~@2 x ~@2 x ~ x", H: "~@2 x!2 ~@2 x ~", I: "~@2 x!2 ~ x!2 ~", J: "~@2 x!2 ~@4", K: "~@2 x ~@4 x",
  L: "~@2 x ~@2 x!2 ~", M: "~@2 x ~@2 x ~@2",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<A@15 ~ B C@16 ~@30 D C@15 E ~@8>".pickRestart({
  A: "~ x ~ x", B: "~ x", C: "x!4", D: "~@3 x", E: "x!3 ~",
})).gain(0.4)

// drums · crash
const crash = s("cr").struct("<~@17 A ~@7 A ~@37 B ~@7 B ~@16>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.4)

stack(glockenspiel, vibraphone, marimba, bass, snare, low_tom, hihat, crash)