Strudelify

A Sailor's Odyessy by David Bobrowitz

David Bobrowitz (B.M.I)

KeyF majorTempo105 bpm
0:00/0:00
// A Sailor's Odyessy by David Bobrowitz — David Bobrowitz (B.M.I)
// 105 bpm, 2/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/37337; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 144 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/2)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [...]/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 · flute
const flute = note(`<
  A B C D C D E F G H E F I J K L M N K O I J ~@8 P@4 Q R P@2 S T P@2 U V A W ~@14 X@2 Y Z AA AB Y AC AD AE Y Z AA AB Y
  AC AD AE AD AE AD AF ~@22 AG D AG D AH ~ AH ~ AI ~ AJ J AH ~ AI ~ AH ~ AK AL AM AN A B A B AO@6 AP ~ Y Z Y Z AQ ~
>`.pickRestart({
  A: "c6 a5", B: "f5 c5", C: "~@2 a5 ~@3 a5 ~", D: "~@2 g5 ~ a5@4", E: "a5 ~@3 a5 ~@3", F: "a5 ~@5 a5 ~",
  G: "g5 ~@3 g5 ~@3", H: "g5 ~@5 g5 ~", I: "c6 ~ a5 ~ g5 ~ d5 ~", J: "d5!2", K: "a5@4 a5@3 a5",
  L: "a5 ~ d5 ~ f5 ~ a5 ~", M: "g5@4 g5@3 g5", N: "g5 ~ c5 ~ e5 ~ g5 ~", O: "a5 ~ b5 ~ c6 ~ d6 ~",
  P: "g5 ~ g5 ~ a5 ~ a5 ~", Q: "a5 g5 f5 e5", R: "d5 e5 f5 g5", S: "g5 f5 e5 d5", T: "c5 d5 e5 f5",
  U: "a5 ~ d5 ~ b5 ~ d5 ~", V: "c6 ~ a5 ~ d6 ~ bb5 ~", W: "g5 d5", X: "f5 ~ f5 ~ g5 ~ g5 ~", Y: "a5!2 ~ a5",
  Z: "~ g5 a5@2", AA: "g5!2 ~ g5", AB: "~ f5 g5@2", AC: "~ b5 c6@2", AD: "bb5 g5 ~ f5", AE: "~ g5 f5@2", AF: "~ g5 ~@2",
  AG: "a5 ~ a5 ~@3 a5 ~", AH: "a5 ~ f5 g5 a5 ~@3", AI: "g5 ~ e5 f5 g5 ~@3", AJ: "c6 ~ a5 ~ g5 ~ e5 ~", AK: "c6",
  AL: "a5", AM: "f5", AN: "d5", AO: "d6 e6 d6 e6 d6 e6 d6 e6 d6 e6 d6 e6 d6 e6 d6 e6", AP: "d6 e6 d6 e6 ~@12",
  AQ: "a5 ~@3",
})).s("gm_flute").gain(0.3)

// other · flute · soft notes
const flute_soft = note("<~@54 A B A B ~@23 C@3 D E F G H I J@3 K L F M@2 N@3 ~@43>".pickRestart({
  A: "~@2 a5 ~ b5@4", B: "~@2 c6 ~ b5@4", C: "[~ f5@5]/3", D: "~ d5", E: "f5 g5", F: "a5", G: "c6", H: "b5 g5",
  I: "e5 c5", J: "[d5@5 a4]/3", K: "d5 e5", L: "f5", M: "[c6@3 c6]/2", N: "f5/3",
})).s("gm_flute").gain(0.2)

// other · clarinet · "Clarinet 2"
const clarinet = note(`<
  A B C@2 ~@2 D E F G D E H I ~@19 J K ~@2 J L ~@2 J M N A O ~@14 P@2 Q R S T Q R U V Q R S T Q R U V U V U W ~@22 X Y X
  Y Z AA AB AC Z AA H AD Z AA AB AC Z AA AE AF AG AH AI AJ AI AJ ~ AK AL@2 AM@2 ~@2 Q R Q R AN AO
>`.pickRestart({
  A: "c4 a3", B: "f3 c4", C: "d4/2", D: "f4 ~@3 f4 ~@3", E: "f4 ~@5 f4 ~", F: "e4 ~@3 e4 ~@3", G: "e4 ~@5 e4 ~",
  H: "c4 ~ a3 ~ g4 ~ e4 ~", I: "f4!2", J: "c4 ~ c4 ~ d4 ~ d4 ~", K: "f4 ~@7", L: "e4 ~@7", M: "f4 g4", N: "c4 d4",
  O: "g4 e4", P: "d4 ~ d4 ~ c4 ~ c4 ~", Q: "f4!2 ~ f4", R: "~ e4 f4@2", S: "e4!2 ~ e4", T: "~ d4 e4@2", U: "g4 e4 ~ d4",
  V: "~ e4 d4@2", W: "~ e4 ~@2", X: "f4 ~ f4 ~@3 f4 ~", Y: "~@2 e4 ~ f4@4", Z: "~@6 d4 e4", AA: "f4 ~ d4 e4 f4 ~ a3 ~",
  AB: "~@6 c4 d4", AC: "e4 ~ c4 d4 e4 ~ g4 ~", AD: "d4!2", AE: "g3", AF: "a3", AG: "bb3", AH: "c4", AI: "g3 a3",
  AJ: "bb3 c4", AK: "d4", AL: "e4/2", AM: "c4/2", AN: "f4@2 ~@2 d4!2 d4@2", AO: "d4 ~@3",
})).s("gm_clarinet").gain(0.3)

// other · clarinet · "Clarinet 2" · soft notes
const clarinet_soft = note("<~@54 A B A B ~@23 C@3 ~@2 D E F@2 E G H ~@3 I J K@3 ~ L M ~@40>".pickRestart({
  A: "~@2 d4 ~ c4@4", B: "~@2 bb3 ~ c4@4", C: "[~ d4@5]/3", D: "f4@4 f4 ~ f4@2", E: "f4@4 f4 ~ f4 ~", F: "g4/2",
  G: "f4 e4", H: "d4", I: "~@4 e4 ~ d4 ~", J: "e4", K: "d4/3", L: "d4@4 d4 ~ d4 ~", M: "d4 c4",
})).s("gm_clarinet").gain(0.2)

// other · alto sax
const alto_sax = note(`<
  A B C D C D ~@8 E@2 F@2 G H E ~@8 I ~@3 I J ~@2 I K ~@2 I L M ~@2 N ~@3 O P ~@6 H@4 ~@8 Q@2 R@2 S@2 T U@3 ~@20 V T W@2
  ~@2 X Y Z ~ Z ~ AA ~ AB AC Z ~ AA ~ Z ~ AD AE AF AG AB AH AB AH ~ AI AJ@2 AK@2 AL@4 AM AN AO AP
>`.pickRestart({
  A: "c5 a4", B: "f4 c4", C: "~@2 a4 ~@3 a4 ~", D: "~@2 g4 ~ a4@4", E: "f4 ~ f4 ~ f4 ~ f4 ~", F: "g4 ~ g4 ~ g4 ~ g4 ~",
  G: "bb3 ~ bb3 ~ c4 ~ c4 ~", H: "d4 ~ d4 ~ e4 ~ e4 ~", I: "e4 ~ e4 ~ f4 ~ f4 ~", J: "a4 ~@7", K: "g4 ~@7", L: "f4 g4",
  M: "a4 b4", N: "c5 ~ a4 ~ g4 ~ e4 ~", O: "~@2 d4 ~ e4@4", P: "~@2 f4 ~ e4@4", Q: "[d4@5 g4 d4 f4]/2",
  R: "[e4@5 d4 e4 f4]/2", S: "[f4@5 g4 f4 e4]/2", T: "d4 c4", U: "d4/3", V: "d4@4 d4 ~ d4 ~", W: "d4/2",
  X: "d4 ~ d4 ~@3 d4 ~", Y: "~@2 c4 ~ d4@4", Z: "a4 ~ f4 g4 a4 ~@3", AA: "g4 ~ e4 f4 g4 ~@3", AB: "bb3 c4", AC: "d4!2",
  AD: "bb3", AE: "c4", AF: "d4", AG: "e4", AH: "d4 e4", AI: "f4", AJ: "g4/2", AK: "e4/2", AL: "f4/4", AM: "a4!2 ~ a4",
  AN: "~ g4 a4@2", AO: "a4@2 ~@2 d4!2 d4@2", AP: "d4 ~@3",
})).s("gm_alto_sax").gain(0.3)

// other · trumpet · "Trumpet 1"
const trumpet = note(`<
  A B C@2 ~@2 D E F G D H I J ~@8 K L M N K L ~ O ~@12 P Q ~@2 I ~@3 R S ~@6 T@4 U V W X U Y Z AA U V W X U Y Z AA Z AA
  Z AA ~@24 AB AC AD AE AF AG AD AE I J AD AE AF AG AD AE AH AI AJ AK A AL A AL ~ AJ AM@2 AN@2 AO@4 AP Y AQ AR
>`.pickRestart({
  A: "c5 a4", B: "f4 c4", C: "d4/2", D: "a4 ~ a4!3 ~ a4!2", E: "a4 ~ d4 ~ f4 ~ a4 ~", F: "g4 ~ g4!3 ~ g4!2",
  G: "g4 ~ c4 ~ e4 ~ g4 ~", H: "a4 ~ b4 ~ c5 ~ d5 ~", I: "c5 ~ a4 ~ g4 ~ e4 ~", J: "d4!2", K: "a4 ~@5 a4 ~", L: "~ a4",
  M: "b4 ~@5 b4 ~", N: "~ b4", O: "g4 ~ g4 ~ a4 ~ a4 ~", P: "a4 b4", Q: "c5 d5", R: "~@2 a4 ~ b4@4", S: "~@2 c5 ~ b4@4",
  T: "a4 ~ a4 ~ b4 ~ b4 ~", U: "f4!2 ~ f4", V: "~ e4 f4@2", W: "e4!2 ~ e4", X: "~ d4 e4@2", Y: "~ g4 a4@2",
  Z: "b4 g4 ~ f4", AA: "~ g4 f4@2", AB: "a4 ~ a4 ~@3 a4 ~", AC: "~@2 g4 ~ a4@4", AD: "~@6 d4 e4",
  AE: "f4 ~ d4 e4 f4 ~ a4 ~", AF: "~@6 c4 d4", AG: "e4 ~ c4 d4 e4 ~ g4 ~", AH: "c5", AI: "a4", AJ: "f4", AK: "d4",
  AL: "f4 d4", AM: "g4/2", AN: "e4/2", AO: "a4/4", AP: "a4!2 ~ a4", AQ: "a4@2 ~@2 d4!2 d4@2", AR: "d4 ~@3",
})).s("gm_trumpet").gain(0.4)

// other · trumpet · "Trumpet 2"
const trumpet_2 = note(`<
  A B C@2 ~@2 D E F G D H I J ~@8 K L M N K L ~ O ~@12 P Q ~@2 R ~@3 S T ~@6 U@4 V W X Y V Z AA AB V W X Y V Z AA AB AA
  AB AA AB ~@24 AC AD AE AF AG AH AE AF R J AE AF AG AH AE AF AI AJ AK AL A AM A AM ~ AL AN@2 AO@2 AP@4 AQ Z AR AS
>`.pickRestart({
  A: "c5 a4", B: "f4 c4", C: "d4/2", D: "a4 ~ a4!3 ~ a4!2", E: "a4 ~ d4 ~ f4 ~ a4 ~", F: "g4 ~ g4!3 ~ g4!2",
  G: "g4 ~ c4 ~ e4 ~ g4 ~", H: "f4 ~ g4 ~ a4 ~ b4 ~", I: "a4 ~ f4 ~ e4 ~ c4 ~", J: "d4!2", K: "f4 ~@5 f4 ~", L: "~ f4",
  M: "g4 ~@5 g4 ~", N: "~ g4", O: "e4 ~ e4 ~ g4 ~ g4 ~", P: "f4 g4", Q: "a4 b4", R: "c5 ~ a4 ~ g4 ~ e4 ~",
  S: "~@2 f4 ~ g4@4", T: "~@2 a4 ~ g4@4", U: "f4 ~ f4 ~ g4 ~ g4 ~", V: "d4!2 ~ d4", W: "~ c4 d4@2", X: "c4!2 ~ c4",
  Y: "~ bb3 c4@2", Z: "~ e4 f4@2", AA: "g4 e4 ~ d4", AB: "~ e4 d4@2", AC: "f4 ~ f4 ~@3 f4 ~", AD: "~@2 e4 ~ f4@4",
  AE: "~@6 d4 e4", AF: "f4 ~ d4 e4 f4 ~ a4 ~", AG: "~@6 c4 d4", AH: "e4 ~ c4 d4 e4 ~ g4 ~", AI: "c5", AJ: "a4",
  AK: "f4", AL: "d4", AM: "f4 d4", AN: "e4/2", AO: "c4/2", AP: "f4/4", AQ: "f4!2 ~ f4", AR: "f4@2 ~@2 d4!2 d4@2",
  AS: "d4 ~@3",
})).s("gm_trumpet").gain(0.4)

// other · trombone · "Low Brass/ Bassoon"
const trombone = note(`<
  ~@2 A ~ A ~ B C D E B F G H ~@8 I J K L I J M ~@3 N@2 O P Q@2 R S Q@2 T U ~@3 V W X ~@9 Y@3 Z AA AB AC Z AC AD AE Z AA
  AB AC Z AC AD AE AD AE AD AE ~@20 AF AG ~@4 B ~ D ~ A ~ G H B ~ D ~ A ~ AH AI AJ AK G AL G AL ~ AJ AM@2 AN@2 AO AP AO
  AP AO AP AQ AR
>`.pickRestart({
  A: "d3 ~@3 d3 ~@3", B: "f3 ~@3 f3 ~@3", C: "f3 ~@5 f3 ~", D: "e3 ~@3 e3 ~@3", E: "e3 ~@5 e3 ~", F: "d3 ~@5 d3 ~",
  G: "d3 e3", H: "f3!2", I: "f3 ~ e3 ~ d3 ~ f3 ~", J: "e3 ~ d3 ~ f3@4", K: "e3 ~ d3 ~ c3 ~ e3 ~", L: "d3 ~ c3 ~ e3@4",
  M: "g3 ~ g3 ~ a3 ~ a3 ~", N: "a3@2 a3!2", O: "a3 d3", P: "f3 a3", Q: "g3@2 g3!2", R: "g3 c3", S: "e3 g3", T: "a3 b3",
  U: "c4 d4", V: "c4 ~ a3 ~ g3 ~ e3 ~", W: "d3@2 e2 ~ e2 ~ e2 ~", X: "e2 ~ e2 ~ e2 ~ e2 ~", Y: "~@2 a3 ~ g3 ~ g3 ~",
  Z: "a3!2 ~ a3", AA: "~ bb3 a3@2", AB: "g3!2 ~ g3", AC: "~ a3 g3@2", AD: "g3 b3 ~ a3", AE: "~ g3 a3@2",
  AF: "d3@2 d3!2", AG: "d3 c3", AH: "d3", AI: "e3", AJ: "f3", AK: "g3", AL: "f3 g3", AM: "g3/2", AN: "e3/2",
  AO: "f3!2 ~ f3", AP: "~ e3 f3@2", AQ: "f3@2 ~@2 f3!2 f3@2", AR: "f3 ~@3",
})).s("gm_trombone").gain(0.41)

// other · trombone · "Low Brass/ Bassoon" · soft notes
const trombone_soft = note("<~@50 A B C@4 D@2 E ~@85>".pickRestart({
  A: "e2 ~ a3 ~ g3@4", B: "~@2 f3 ~ g3@4", C: "e2 ~ e2 ~ e2 ~ e2 ~", D: "e2/2", E: "~@2 a3 ~ g3 ~ g3 ~",
})).s("gm_trombone").gain(0.28)

stack(flute, flute_soft, clarinet, clarinet_soft, alto_sax, trumpet, trumpet_2, trombone, trombone_soft)