Strudelify
KeyD minorTempo72 bpm
0:00/0:00
// Almaz — Randy Crawford
// 72 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: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 73 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(72/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 · piano
const piano = note(`<
  A B C D A B C E F G H I J K@2 L M N O P Q R S T B C U F V W X J Y Z AA AB AC AD AE AF AG AH AI B C AJ AK AL AM AN AO
  AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD B C BE@5
>`.pickRestart({
  A: "[f4,a4]@3 ~@3 [g4,bb4]@2 f4@4 [d4,f4]@4, ~@3 [f4,a4]@5 a4@8", // F Gm Dm F
  B: "[e4,g4] ~@2 [f4,a4] e4@2 [db4,e4]@2, ~@2 b3@3 b3@3 ~@8, ~@3 [e4,g4]@5 g4@8", // Em F Dbm Em
  C: "[c4,f4] ~@2 [e4,g4] ~ bb3!3, ~@2 a3@3 a3@3 d4@4 d4@4, ~@3 [c4,f4]@5 f4@8", // F5 Em F5
  D: "~@3 d4 ~@3 [e4,g4], e4@4 e4@3 ~, ~@2 b3@3 b3@3 db4@8, ~@3 a4@5 ~@4 [d4,f4]@4", // Em Dm
  E: "~@3 d4 [db4,e4]@4, e4 ~, ~@2 b3@3 b3@3 ~@8, ~@3 a4@5 ~@8", // Dbm
  F: "~@3 d4 [bb4,d5]@4, [g4,bb4] ~, ~ d4@2 ~@5, ~ [a4,c5] ~@2", // Bb Gm Am
  G: "~@3 [e4,g4] [d4,f4]@4, a4 ~, f4 f4@3 ~@4, ~ c4@7 ~@8, ~@3 c5@5 ~@8", // Em Dm
  H: "~@3 d4 db4@2 [db4,e4]@2, [e4,g4] ~, ~@2 b3@3 b3@3 a3@8, ~@3 a4@5 ~@8", // Dbm Em
  I: "a4 ~@2 [d4,e4] [a3,d4,f4]@4, f4 ~, ~@2 a3@3 a3@3 ~@8, ~@3 a4@5 ~@8", // Dsus2 Dm
  J: "~@6 d4@2 ~@7 bb4, [g4,bb4]@4 ~@3 c5, ~@2 d4@4 ~@7 d4@3, ~ [a4,c5] [bb4,d5]@2", // Gm Am Bb
  K: "[~@3 [e4,g4] ~@7 d4 [db4,e4]@2 [db4,e4]@2, a4@8 ~@10 b3@3 b3@3 ~@8, ~ c4@7 d4@14 ~@10, ~ f4@3 f4@8 ~@4, ~@3 c5@5 ~@11 a4@5 ~@8]/2", // Em Dbm
  L: "f4@3 [f4,a4]@3 [d4,f4,a4]@2 [d4,f4,d5]@8", // F Dm
  M: "bb4@2 ~@5 d5 [e4,g4]@4 [c4,e4,g4]@4, g4 ~, ~@2 d4@3 d4@3 ~@8, ~@3 [bb4,d5]@5 ~@8, ~@3 c5 c5@4", // Em C Bb
  N: "c5 ~@2 g4 ~@3 bb3, [f4,a4] f4, ~@2 c4@3 c4@3 d4@4 d4@4, ~@3 c5@5 ~@2 bb3@4 ~@2", // F
  O: "~@3 a4 db4@2 [db4,e4]@2, g4 ~, ~@3 d4@5 ~@8, ~@5 b3@3 a3@8", // Dbm
  P: "~@3 a4 ~@3 g4 ~@6 c5@2, f4@4 g4@3 ~ a4@3 a4@5, d4!2 ~ e4 ~ d4@3, ~ a3@3 ~ a3@3 ~ a3@7, ~@3 bb4",
  Q: "[bb4,d5]@3 ~@4 [d5,f5] c5@4 [g4,c5]@4, ~@3 [bb4,d5]@5 ~@8, ~@5 d4@3 ~@8, ~@3 [c5,e5] e5@4", // Bb Dm C5 Bb C
  R: "c4@2 ~ c5@2 ~ a4@2 ~@6 bb3@2, e4@4 ~ bb3@2 ~, a4@5 c5@3 ~@8, ~ c4@3 [a3,d4,f4]@2 [a3,d4,f4]@2", // Dm
  S: "~@6 d4@2 [db4,e4]@4 [db4,e4]@3 a4, [e4,g4] ~, ~@2 b3@3 b3@3 ~@8, ~@3 a4@5 ~@8", // Dbm Em
  T: "~@3 d4@2 ~ [g4,bb4]@2 f4@4 ~@2 bb3@2, [d5,f5,a5] ~, ~ a3@3 ~@4, ~@3 f4@5 a4@8, ~@5 d4@3 ~@4 [d4,f4]@4", // Gm Dm
  U: "~@3 d4 [a3,db4,e4,e5,e6]@4, e4 ~, ~@2 b3@3 b3@3 ~@8, ~@3 a4@5 ~@8", // A
  V: "a4 ~@2 [e4,g4] d4@3 d4, f4@5 f4@3 f4@8, ~ c4@3 ~@4, ~@3 a4@5 ~@8", // Em
  W: "g4 ~@2 d4 ~@3 a3, e4@4 ~ a3@2 ~, ~@2 b3@3 b3@3 db4@8, ~@3 g4@5 ~@4 e4@4",
  X: "~@3 [d4,e4] [d4,f4]@4, d4@3 ~@5, ~@2 a3@3 a3@3 ~@8, ~@3 f4@5 ~@8", // Dsus2 Dm
  Y: "a4 ~@2 [e4,g4] ~@2 f4 [d4,f4], f4@5 f4@3 f4@4 a4@4, ~ c4@3 d4@3 ~, ~@3 a4@5 ~@2 a3@6", // Em Dm
  Z: "~@3 d4 ~@3 a3, [e4,g4]@4 ~ a3@2 ~, ~@2 b3@3 b3@3 [db4,e4]@8, ~@3 a4@5 ~@4 [d4,f4]@4", // Em Dbm Dm
  AA: "f4@2 ~@2 [e4,g4]@2 ~ [e4,g4] ~@2 a3@2 ~@2 [a3,f4]@2, ~ a3@2 a3 ~@4, ~@3 f4@5 [f4,a4]@4 e4@4", // Em Dm F
  AB: "~@7 [bb4,d5] [e4,g4,c5]@8, [g4,bb4]@3 g4@2 g4@3 ~@8, ~ d4@3 ~@4, ~@2 bb4 f4 ~@4", // Bb C Gm
  AC: "[f4,a4]@3 [f4,a4,c5] [f4,a4]@2 [f4,a4]@2, c4 d5", AD: "[e4,g4]@3 [e4,g4] [db4,e4]@2 [db4,e4]@2",
  AE: "~@3 f4 ~@2 e4 [e4,g4] [f4,a4]@2 [f4,a4]@2 ~@2 [a4,c5]@2, f4@2 d4@2 [e4,g4]@3 ~@5 [g4,bb4]@4, ~ a3@3 ~ a3@3 ~@8", // Em F Am Em Gm
  AF: "[bb4,d5]@2 ~ d5@2 ~ [d5,f5]@2 c5@4 [g4,c5]@4, ~ f4@3 ~@4, ~@3 bb4@5 ~@8, ~@5 [c5,e5]@3 e5@8", // Bb Dm C5 C
  AG: "c4@2 ~@3 c4 [c4,a4]@2 ~@6 bb3@2, e4@4 ~ bb3@2 ~, a4@3 ~@5, ~@2 c4@3 ~@3 [a3,d4,f4]@4 [a3,d4,f4]@4, ~@3 c5@5 ~@8", // F Dm
  AH: "g4 ~@2 [d4,a4] [db4,e4]@2 [db4,e4]@2, e4 ~, ~@2 b3@3 b3@3 ~@8, ~@3 g4@5 ~@8", // D5 Dbm
  AI: "~@3 d4@2 ~ [g4,bb4]@2 f4@4 ~@2 bb3@2, [a4,d5,f5,a5] a4, ~ a3@3 ~@4, ~@3 f4@5 ~@8, ~@5 d4@3 ~@4 [d4,f4]@4", // Gm Dm
  AJ: "~@3 d4 [a3,db4,e4]@4, e4 ~, ~@2 b3@3 b3@3 ~@8, ~@3 a4@5 ~@8", // A
  AK: "~@6 [a4,c5]!2 ~@6 [bb4,d5]@2, [g4,bb4] [g4,bb4]@3 ~@2 [a4,c5]@2, ~ d4@3 [a4,c5]@2 ~@2 [bb4,d5]@6 ~@2, ~@5 d4@3 ~@3 d4@5", // Am Bb Gm Am Bb
  AL: "a4 ~@2 [g4,e5] [f4,a4]@2 [d4,f4,a4]@2, [c4,f4] ~, ~@2 a4@3 a4@3 ~@8, ~@3 f5@5 d5@8", // C F Dm F5
  AM: "~@3 d4 [db4,e4]@2 [db4,e4]@2, [e4,g4] ~, ~@2 b3@3 b3@3 ~@8, ~@3 a4@5 ~@8", // Dbm Em
  AN: "~@2 d5 [d5,f5] ~@3 [e5,g5] ~@6 [e7,f7]@2, [d5,f5]@3 ~ [e5,g5]@2 d5@2 [f5,a5]@2 [c5,d5,e5,f5]@3 [a6,b6,c7,d7]@3, ~ a4@3 ~ a4@3 ~ [a4,b4]@7, ~@11 [g5,a5,b5,c6]@5, ~@3 [d6,e6,f6,g6]", // Dm Em Fmaj7 Dm Em F Dm7 D7 …
  AO: "~@3 d4 ~@3 [g4,bb4,d5], [g4,bb4]@2 ~ [a4,c5], ~ d4@2 ~@5, ~@2 [a4,c5]@2 [bb4,d5]@3 ~", // Gm Am Bb
  AP: "[f4,a4] ~@2 [e4,g4] ~@3 a3, ~@2 c4@3 c4@3 ~@2 a3@4 ~@2, ~@3 [f4,a4]@5 [f4,a4]@4 [f4,a4]@4", // F Em F
  AQ: "~@3 d4 ~@3 a3, [e4,g4]@4 ~ a3@2 ~, ~@2 b3@3 b3@3 [db4,e4]@4 [db4,e4]@4, ~@3 a4@5 ~@8", // Em Dbm
  AR: "~@2 d4 [d4,f4] ~@2 e4 [e4,g4] ~@3 a4 ~@2 [a4,c5]@2, f4@3 ~ [e4,g4]@3 ~ [f4,a4]@2 f4@2 [g4,bb4]@4, ~ a3@3 ~ a3@3 ~ a3@3 ~@4", // Dm Em Am Em F Gm
  AS: "~@7 [d5,f5] ~@4 g4@2 [e4,g4]@2, [bb4,d5]@2 c5!2, ~@5 d4@3 ~@2 [bb4,d5]@6, ~@3 [c5,e5] e5@4", // Dm Em Bb C
  AT: "f4@2 ~@3 c4 [c4,e4,g4]@2 ~@6 bb3@2, a4@2 ~ a3, ~@2 c4@3 ~@3 [d4,f4]@8, ~@3 [f4,c5]@5 ~@2 f3@6", // C Dm F5
  AU: "g4 ~@2 a4 [db4,e4]@2 [db4,e4]@2, e4 ~, ~@2 b3@3 b3@3 ~@8, ~@3 g4@5 ~@8", // Dbm
  AV: "~@3 f4 ~@2 e4 [e4,g4] ~@2 f4 [f4,a4] g4@2 [g4,c5]@2, f4@2 d4@2 [e4,g4]@3 ~ [f4,a4]@3 ~ bb4@4, ~ a3@3 ~ a3@3 ~ a3@3 ~@4", // Em F C5 Em F
  AW: "[bb4,d5]@3 ~@4 [d5,f5] c5@4 [g4,c5]@4, ~@3 f4@5 ~@8, ~ [bb4,d5] ~@2, ~@3 [c5,e5] e5@4", // Bb Dm C5 Bb C
  AX: "~@2 c4!2 ~@3 bb3, [c4,a4]@2 a4@2 ~ bb3@2 ~, ~ e4@3 [a3,d4,f4]@2 [a3,d4,f4]@2", // F Dm
  AY: "[e4,g4]@2 ~ e4@2 ~ [e4,a4]@2 db4@4 [db4,f4]@4, ~@2 b3@3 b3@3 ~@8, ~@3 g4@5 e4@8", // Em A5 Db
  AZ: "[d4,f4]@3 ~@3 [e4,g4]@2 ~@6 [f4,a4]@2, ~@3 [d4,f4]@5 [f4,a4]@6 ~@2, ~@5 d4@3, ~@3 [g4,bb4]", // Dm Em F Dm F Gm
  BA: "[e4,g4] ~@2 a4 db4@2 [db4,f4]@2, ~@2 b3@3 b3@3 ~@8, ~@3 [e4,g4]@5 e4@8", // Em Db Em
  BB: "f4@3 ~@3 [e4,g4]@2 ~@6 f4@2, d4!2, ~@3 [f4,a4]@5 f4@6 ~@2, ~@3 g4", // Em F
  BC: "~@6 a4@2 ~@5 f4@3, [e4,g4] ~, ~@3 b3@5 [db4,e4]@8", // Em Dbm
  BD: "~@2 d4 ~ f4@2 ~ bb3, ~@3 a3@5 a4@8, ~@4 f4@3 [g4,bb4]@2 ~@7, ~@6 d4@3 ~@3 [d4,f4]@4", // Gm Dm
  BE: "[~@7 d4@2 ~@7 [e4,g4]@2 ~@5 d5@4 f5@5 [f5,a5]@4 ~ [a5,d6]@32 ~@11, e4@9 e4@7 ~@7 a4@32 ~@25, ~@2 b3@3 ~ b3@3 db4@9 ~@9 d5@9 [d5,f5]@32 ~@12, ~@3 a4@5 ~@5 [d4,f4]@5 [d4,f4]@32 ~@30]/5", // Em F D5 Dm
})).s("gm_piano").gain(0.4).pan(0.8)

// other · piano
const piano_2 = note(`<
  A B C B A B D E F G H I J K B L M N E O P Q R D B D E F S E T F S U T V W X O Y Z R C B D E F AA AB O F S AC O P AD AE
  AF Y AG AH AI AJ AK E AL B C AM@2 AN@2 ~
>`.pickRestart({
  A: "d3@2 a3@3 a3@3 bb2@2 bb3@4 bb3@2", B: "e3@4 a2 a3@2 a3", C: "d3 bb2", D: "d3@7 ~ bb2@8", E: "e3 a2", F: "g3",
  G: "f3@2 ~ e3 d3@4", H: "e3@7 ~ a2@2 a3@4 a3@2", I: "d3@15 ~", J: "g3@15 ~", K: "f3@6 e3 ~ d3@7 ~",
  L: "d3@2 a3@3 a3@3 a3@7 ~", M: "g3@7 ~ c3@2 g3@3 ~ g3@2", N: "f3@5 f3 a2@2 bb2@8", O: "d3@2 e3@2 f3@2 g3 a3",
  P: "g3@4 c3 g3@2 g3", Q: "f3@5 ~ c3@2 bb2@4 bb2@4", R: "e3@5 e3@3 a2@6 a2@2", S: "f3@3 e3 d3@4", T: "d3",
  U: "e3@7 ~ a2@8", V: "g3@4 c3 g3 c3 g3", W: "f3@3 a2 bb2@2 a3@2", X: "e3@3 e3 a2 a3@2 a3", Y: "g3@4 c3 g3 e4 g3",
  Z: "f3@3 f3 bb2@4", AA: "f3@3 e3 d3 a3@2 a3", AB: "e3@4 a2 a3 e3 a3", AC: "e3@4 a2@3 ~", AD: "f3@3 a2 bb2@4",
  AE: "e3@5 e3@3 a2@2 e3@2 a3@2 e3@2", AF: "d3@4 e3@3 ~ f3@4 g3@2 a3@2", AG: "f3@3 c3 bb2@4",
  AH: "e3@5 e3@3 a2@2 e3@2 a3@4", AI: "d3@3 a3!2 a3@3 a3@8", AJ: "e3@4 a2 e3 a3 e3", AK: "d3@2 a3@3 a3@3 d3@2 a3@6",
  AL: "~ d3@7 bb2@7 ~", AM: "[e3@8 ~ a2@2 a3@7 d2@2 a2@2 ~ d3@2 a3@4 d2@3]/2", AN: "[~@2 d2@2 d2@19 ~@9]/2",
})).s("gm_piano").gain(0.4).pan(0.2)

// bass · acoustic bass
const bass = note(`<
  ~@27 A B C D E B F G H I F J K L F M F M F ~@4 A B F N H I F J H O F G F G ~ P F M Q R@3 ~
>`.pickRestart({
  A: "g2", B: "f2@3 e2 d2@4", C: "e2@8 a1@7 ~", D: "d2@15 ~", E: "g2@15 ~", F: "e2 a1", G: "d2", H: "g2 c2",
  I: "f2@3 a1 bb1@4", J: "d2@2 e2@2 f2@2 g2 a2", K: "g2@4 c2@3 g2", L: "f2@5 ~ f2@2 bb1@8", M: "d2 bb1",
  N: "d2@4 e2@4 f2@3 ~ g2@2 a2@2", O: "f2@3 c2 bb1@4", P: "~ d2@7 bb1@8", Q: "e2@8 ~ a1@7", R: "[~ d2@19 ~@4]/3",
})).s("gm_acoustic_bass").gain(0.45)

// other · string ensemble 2
const string_ensemble_2 = note("<~@46 A B C D A B C D E F C D E G C H C H C I C J K@4 ~>".pickRestart({
  A: "g3", B: "f3@3 e3 d3@4", C: "e3 a2", D: "d3@2 e3@2 f3@2 g3 a3", E: "g3 c3", F: "f3@3 a2 bb2@4", G: "f3@3 c3 bb2@4",
  H: "d3", I: "~ d3@7 bb2@8", J: "d3 bb2", K: "[e3@9 a2@9 d2@38 ~@8]/4",
})).s("gm_string_ensemble_2").gain(0.4).pan(0.2)

// other · string ensemble 2
const string_ensemble_2_2 = note(`<
  ~@22 A B C D E F G H I J K L I M N H O P Q R B C D E S G H O T K U O V W U O P Q X I Y I Z@2 AA AB AC@4 ~
>`.pickRestart({
  A: "~@3 a4", B: "a5@15 g5", C: "g5@15 f5, f5 ~@15", D: "f5@15 e5, e5 ~@15", E: "e5, d5 ~@15", F: "g4 a4 bb4@2",
  G: "f4", H: "g4 e4", I: "d4", J: "g4@4 a4@4 bb4@5 d4 c5 bb4", K: "a4@3 g4 f4@2 d4@2", L: "d4@2 db4 d4",
  M: "f4@4 e4@3 g4", N: "f4@3 c5 d5@2 a4@2", O: "d4@2 e4@2 f4@2 g4 a4", P: "f4 g4", Q: "a4@3 g4 a4@4",
  R: "g4@4 e4@3 a4", S: "g4", T: "bb4@2 a4@2 bb4@2 a4 bb4", U: "e4 db4", V: "bb4@4 c5@3 g4", W: "a4@3 e4 d4@4",
  X: "g4@2 e4 f4", Y: "b3@2 db4 f4", Z: "[b3@8 db4@6 ~ a4@2 a5@14 g5]/2", AA: "g5@15 [e5,f5], f5 ~@15", AB: "f5@15 e5",
  AC: "[e5@9 [d4,f5]@19 ~@4, d5 ~@63]/4", // Dm
})).s("gm_string_ensemble_2").gain(0.4).pan(0.8)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@22 A B C D E F G H I J K L M N O H P Q R S B C D E T G H P U K H P V W H P Q R X Y Z M AA@2 AB AC AD@4 ~
>`.pickRestart({
  A: "~@3 a4", B: "a5@15 g5", C: "g5@15 f5, f5 ~@15", D: "f5@15 e5, e5 ~@15", E: "e5, d5 ~@15", F: "bb4 c5 d5@2",
  G: "a4", H: "g4 e4", I: "d4", J: "bb4@4 c5@4 d5@5 d4 c5 bb4", K: "f5@3 e5 d5@2 a4@2", L: "d4@2 e4 f4", M: "f4",
  N: "d5@4 c5@3 g4", O: "a4@3 c5 d5@2 a4@2", P: "f4@2 g4@2 a4@2 bb4 c5", Q: "d5 e5", R: "c5@3 e5 f5@4",
  S: "g5@4 e5@3 a4", T: "bb4", U: "d5@2 c5@2 d5@2 c5 d5", V: "d5@4 e5@3 g4", W: "c5@3 g4 f4@4", X: "g5@2 e5 f5",
  Y: "d5", Z: "g4@2 e4 f4", AA: "[g4@8 e4@6 ~ a4@2 a5@14 g5]/2", AB: "g5@15 [e5,f5], f5 ~@15", AC: "f5@15 e5",
  AD: "[e5@9 [a4,a5]@19 ~@4, d5 ~@63]/4", // A
})).s("gm_string_ensemble_1").gain(0.4)

// other · french horn
const french_horn = note("<~@35 A B ~@2 C D ~@11 E F A B ~@2 G H ~@13>".pickRestart({
  A: "~@4 c4@4 c5@7 g4", B: "a4", C: "~@4 c4@4 e5@7 d5", D: "c5@7 g4 a4@8, f4", E: "d4 db4",
  F: "[d4,f4]@2 [e4,g4]@2 [f4,a4]@2 [g4,bb4] [a4,c5]", G: "d5@8 e5@7 d5", H: "c5@7 g4 a4@8",
})).s("gm_french_horn").gain(0.4).pan(0.7)

// other · oboe
const oboe = note("<~@34 A B ~@12 C D ~@14 E F G H I@4 ~>".pickRestart({
  A: "~@3 a4 a5 g5 e5 d5", B: "c5@3 ~", C: "~ e5", D: "d5", E: "~@13 a4@3", F: "~ a5@14 g5",
  G: "g5@15 [e5,f5], f5 ~@15", H: "f5@15 e5", I: "[e5@9 d5@19 ~@4, d5 ~@63]/4",
})).s("gm_oboe").gain(0.4).pan(0.3)

// drums · ride
const ride = s("rd").struct("<~@3 A ~@3 A ~@18 B ~@18 B ~@19 C D E ~@5>".pickRestart({
  A: "~@3 x", B: "~@3 x!2 ~@3", C: "x!2 ~@10 x ~ x!2", D: "x ~@11 x ~ x!2", E: "x",
})).gain(0.4)

// drums · triangle
const triangle = s("triangles:35").struct(`<
  A ~ A ~ A ~ A ~@4 B ~@3 B C D C E C F G ~@7 B ~@3 B C D C H G D C I J ~@9 B ~@3 B ~@3 A ~ K ~ L M N ~@5
>`.pickRestart({
  A: "~@3 x", B: "x ~ x!3 ~ x!3 ~@7", C: "~ x", D: "~@6 x!3 ~@7", E: "~ x!2 ~", F: "~@3 x!2 ~@3", G: "x!2",
  H: "x ~ x ~ x!4", I: "x ~@2 x!2 ~@3", J: "~@5 x!2 ~@9", K: "~@3 x ~@2 x ~@9", L: "x!2 ~@10 x ~ x!2",
  M: "x ~@11 x ~ x!2", N: "x",
})).gain(2.16)

// drums · rim
const rim = s("rim").struct("<~@46 A@3 B A@3 ~ A@3 ~ A@3 ~@12>".pickRestart({
  A: "~@3 x!2 ~ x ~@9", B: "~@7 x ~@2 x ~@5",
})).gain(0.3)

stack(
  piano, piano_2, bass, string_ensemble_2, string_ensemble_2_2, string_ensemble_1, french_horn, oboe, ride, triangle,
  rim
)

More by Randy Crawford