Strudelify

Orpheus

Bob James

KeyG majorTempo114 bpm
0:00/0:00
// Orpheus — Bob James
// 114 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 73 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(114/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 · electric guitar muted
const electric_guitar_muted = note(`<
  ~@5 A B C D E F G H A B C D E F G H I J K L A B C D E F G H I J K L A B C D E F G M@2 N ~@4 A B C D E F G H I J K L A
  B C D E F G M@2 N
>`.pickRestart({
  A: "~@2 [e4,g4,b4]@2 e4 [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4]@2 ~ [e4,g4,b4] ~ [e4,g4,b4] ~", // Em
  B: "~@2 [e4,g4,b4]@2 ~ [e4,g4,b4] ~ [e4,g4,b4] ~ [e4,g4,b4] ~ e4 [e4,g4,b4] ~ [e4,g4,b4] ~", // Em
  C: "~@2 [e4,g4,b4]@2 e4!2 ~ [e4,g4,b4] ~ [e4,g4,b4]@2 e4 [e4,g4,b4] ~ [e4,g4,b4] ~", // Em
  D: "~@2 [f4,a4,c5]@2 f4!2 ~ [f4,a4,c5] ~ [f4,a4,c5]@2 f4 [f4,a4,c5] ~ [f4,a4,c5] ~", // F
  E: "~@2 [f4,a4,c5]@2 f4!2 ~ [f4,a4,c5] ~ [f4,a4,c5] ~@2 [f4,a4,c5] ~ [f4,a4,c5] ~", // F
  F: "~@2 [f4,a4,c5]@2 f4!2 ~ [f4,a4,c5] ~ [f4,a4,c5] ~ f4 [f4,a4,c5] ~ [f4,a4,c5] ~", // F
  G: "~@2 [d4,g4,b4] ~@2 [d4,b4] ~ [d4,g4,b4] ~ [d4,g4,b4] ~ g4 [d4,g4,b4] ~ [d4,g4,b4] ~", // G
  H: "~@2 [e4,g4,b4]@2 e4 [e4,g4,b4] ~ [e4,g4,b4] ~@8", // Em
  I: "~@2 [e4,g4,a#4] ~@2 e4 ~ [e4,g4,a#4] ~ [e4,g4,a#4] ~@2 [e4,g4,a#4] ~ [e4,g4,a#4] ~", // Edim
  J: "~@2 [c4,f4,a4] ~@2 c4 f4 [c4,f4,a4] ~ [c4,f4,a4] ~ f4 [c4,f4,a4] ~ [c4,f4,a4] ~", // F
  K: "~@2 [c4,f4,g#4] ~@4 [c4,f4,g#4] ~ [c4,f4,g#4]@2 ~ [c4,f4,g#4] ~ [c4,f4,g#4] ~", // Fm
  L: "~@2 [b3,d4,g4] ~@2 [b3,d4,g4] ~ [b3,d4,g4] ~@8", // G
  M: "[e4,g4,c5] ~ [e4,g4,c5] ~@2 [e4,c5] ~ [e4,g4,c5] ~ [e4,g4,c5] ~ g4 [e4,g4,c5] ~ [e4,g4,c5] ~", // C
  N: "[e4,g4,c5] ~ [e4,g4,c5] ~@2 [e4,c5] ~ [e4,g4,c5] ~@8", // C
})).s("gm_electric_guitar_muted").gain(0.11)

// chords · electric guitar muted · soft notes
const electric_guitar_muted_2 = note(`<
  ~@7 A B@3 C ~@3 A B@3 C ~@3 D ~@3 A B@3 C ~@3 D ~@3 A B@3 C@4 ~@6 A B@3 C ~@3 D ~@3 A B@3 C@4
>`.pickRestart({
  A: "~@5 b4 ~@10", B: "~@5 [a4,c5] ~@10", C: "~@5 g4 ~@10", D: "~@5 c4 ~@10",
})).s("gm_electric_guitar_muted").gain(0.05)

// bass · fretless bass
const bass = note(`<
  ~ A B C D E F G H@2 I J K E F G H@2 I J K L M N O E F G H@2 I J K L M N O E F G H@2 I J P Q K ~@4 E F G H@2 I J K L M
  N O E F G H@2 I J P Q R
>`.pickRestart({
  A: "c2@3 c2 g1@3 ~ d2@3 ~ a1@2 d2@2", B: "e2@3 ~ b1@3 ~ d#2@3 d#2 a#1@3 ~", C: "a1@3 a1 d2@3 ~ g1@3 g1 e2@2 g1 ~",
  D: "c2@3 ~ c2@4 g1@2 g1 ~@5", E: "c2@3 ~ g1@3 ~ c2@2 ~@2 g1@3 ~", F: "c2@3 ~ g1@3 ~ c2@2 ~ c2 g1@3 ~",
  G: "c2@3 ~ g1@3 ~ c2@3 ~ g1@3 ~", H: "d2@3 ~ a1@3 ~ d2@3 ~ a1@3 ~", I: "d2@3 ~ a1@3 ~ d2@3 d2 a1@2 g#1@2",
  J: "g1@3 ~ d2@3 ~ g1@2 ~ g1 d2@2 g1 ~", K: "c2@3 ~ g1@2 ~ c2@2 [a#1,b1] [g#1,a1] g1 [f1,f#1] e1 ~@2",
  L: "c2@3 c2 g1@3 g1 c2@3 g1 g1@2 c2@2", M: "f2@3 f2 c2@3 f1 f1@3 c2 c2@3 f1",
  N: "f1@3 c2 c2@2 ~ f2 f2@3 c2 c2@2 f1 c2", O: "g1 ~ g1@2 ~ g1 ~ g1 ~@8", P: "c2@3 ~ g1@2 ~ c2@2 ~@2 c2 g1@2 b1@2",
  Q: "c2@3 ~ g1@2 ~ c2@2 [a#1,b1] [g#1,a1] g1 g1@2 b1 ~", R: "c2@3 ~ g1@2 ~ c2 ~@8",
})).s("gm_fretless_bass").gain(0.29)

// chords · trombone
const trombone = note(`<
  ~ A B C D ~@8 E F ~ G H I ~ J ~@4 K@2 L M N O P J ~@4 K@2 L M N O P Q R S ~@4 E F ~ G H I ~ J ~@4 K@2 L M N O P Q R S
>`.pickRestart({
  A: "[c3,e3,g3,b3] [d3,f3,a3,c4]", B: "[e3,g3,b3,d4] [d#3,g3,a3,c#4]", C: "[d3,f3,a3,c4] [f3,g#3,b3,e4]",
  D: "[g2,g3]@8 [g2,g3] ~@7", E: "~@4 g4 e4 f4 g4@2 f4 e4 ~@5", F: "~@4 g4 ~ f4 ~@2 [e4,f4] ~@6",
  G: "~@4 a4 ~ g4 a4@3 ~@6", H: "~@4 c5 ~@2 c5@3 ~@6", I: "~@4 e5 ~ d5 e5@3 d5 ~@5",
  J: "~@2 [g4,d5,g5] ~@4 [g4,d5,g5] ~@8", K: "~@2 [e4,g4,b4] ~@4 [e4,g4,b4] ~@8",
  L: "~@2 [e4,g4,b4] ~@3 e4 [e4,g4,b4] ~@8", M: "~@2 [f4,a4,c5] ~@4 [f4,a4,c5] ~@8",
  N: "~@2 [a4,c5,e5] ~@4 [a4,c5,e5] ~@8", O: "~@2 [c5,e5,g5] ~@4 [c5,e5,g5] ~@8",
  P: "[d4,e4,g4] [c#4,d#4,f#4] [c4,d4,f4] [d4,f4,g#4,b4]", // Em7 D#m7 Dm7 Ddim
  Q: "[e4,g4,a4,d5]@8 [e4,f#4,a#4,c5] [a3,b3,c4,d4,d#4,f4,f#4,g#4] ~@6", // Em7 C7
  R: "[e4,g4,a4,d5]@7 [e4,g4,a4,d5] [e4,f#4,a#4,c5] [a3,b3,c4,d4,d#4,f4,f#4,g#4] ~@6", // Em7 C7
  S: "[e4,g4,a4,d5]@7 [e4,g4,a4,d5] ~@8", // Em7
})).s("gm_trombone").gain(0.4).pan(0.4)

// chords · trombone · soft notes
const trombone_soft = note("<~@13 A B ~ C D E ~@32 A B ~ C D E ~@16>".pickRestart({
  A: "~@10 d4 [b3,c4] ~@4", B: "~@5 e4 ~ g4@2 ~ d4 [b3,c4] ~@4", C: "~@5 f4 ~@4 [f4,g4] e4 c4 ~@3",
  D: "~@5 a4 b4 ~@2 b4 [f4,g4,a4] [d4,e4] ~@4", E: "~@5 c5 ~@4 c5 [g4,a4,b4] f4 e4 ~@2",
})).s("gm_trombone").gain(0.22).pan(0.4)

// chords · trumpet
const trumpet = note(`<
  ~ A B C D ~@8 E F ~ G H I ~ J K L M N ~@7 J K L M N ~@14 E F ~ G H I ~ J K L M N ~@10
>`.pickRestart({
  A: "[e4,g4] [f4,a4]", B: "[g4,b4] [a4,c#5]", C: "[c5,e5]@7 ~ [g#4,e5]@8", D: "[g3,g4,d5]@8 [g3,g4,g5] ~@7",
  E: "~@4 b4 ~ a4 b4@3 a4 ~@5", F: "~@4 b4 g4 a4 b4@3 a4 g4 ~@4", G: "~@4 c5 a4 b4 c5@2 ~@7",
  H: "~@4 e5 c5 d5 e5@3 [c5,d5] ~@5", I: "~@4 g5 e5 ~ g5@2 f5 ~@6", J: "~@2 [c3,g3,c4] ~@4 [c3,g3,c4] ~@8",
  K: "[d4,e4,f#4,a#4]@8 g4 [g3,a#3,c4,e4]@3 [g#3,b3,d4,f4]@2 [a#3,c4,e4,g4]@2", L: "e4@2 d4 ~, [c4,a4]@3 ~, f4 ~@15",
  M: "[d5,g5]@8 f5@7 ~, [g#4,c5]@7 ~", N: "[g4,d5,g5] ~ [g4,d5,g5] ~@2 [g3,g4,d5,g5] ~ [g3,g4,d5,g5] ~@8",
})).s("gm_trumpet").gain(0.34).pan(0.6)

// chords · trumpet · soft notes
const trumpet_soft = note("<~@13 A B ~ C D E ~@32 A B ~ C D E ~@16>".pickRestart({
  A: "~@5 g4 ~@4 g4 [d4,e4,f4] [b3,c4] ~@3", B: "~@11 [e4,f4] [c4,d4] ~@3", C: "~@9 b4 [g4,a4] [d4,e4,f4] ~@4",
  D: "~@10 b4 [g4,a4] ~@4", E: "~@6 f5 ~@3 [c5,d5,e5] b4 g4 ~@3",
})).s("gm_trumpet").gain(0.17).pan(0.6)

// other · string ensemble 2
const string_ensemble_2 = note("<~@21 A B C@2 ~@8 A B C@2 ~@14 D@8 A B C@2 ~@7 E@3>".pickRestart({
  A: "[f#5,f#6] [g5,g6]", B: "[a5,a6]", C: "[[d5,d6]@7 [c5,c6]@4 [g#4,g#5]@4 [g4,g5]@12 ~@5]/2", D: "[g5@15 ~]/8",
  E: "[~@4 c5 ~, g5@5 ~, ~@2 g6@3 ~]/3",
})).s("gm_string_ensemble_2").gain(0.15)

// drums · snare
const snare = s("sd").struct("<A B@3 C B@7 D B@7 D B@3 E B@11 E B@9 F B@15 G B@9 H>".pickRestart({
  A: "~@11 x!2 ~ x!2", B: "x!16", C: "x!9 ~ x ~@5", D: "x!8 ~@8", E: "x!4 ~ x ~ x ~@3 x!5", F: "x!8 ~@4 x ~@2 x",
  G: "x!4 ~ x ~ x ~@8", H: "x!6 ~ x ~@8",
})).gain(0.17)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<[~@13 x ~@2] ~@45 [~@13 x!2 ~] ~@26>").gain(0.09)

// drums · splash
const splash = s("cr").struct("<~@50 x!2 ~@21>").gain(0.43)

// drums · bongos
const bongos = s("bongo:4").struct("<~ A@3 B A@7 C A@7 C A@3 D A@7 C A@3 D A@9 C A@11 C A@3 D A@9 C>".pickRestart({
  A: "x ~ x ~ x ~@4 x ~ x ~@4", B: "x!3 ~ x!2 ~@2", C: "x ~ x ~ x ~@2 x ~@8", D: "x ~ x ~ x ~@3 x!3 ~@5",
})).gain(0.68)

// drums · bongos · soft notes
const bongos_soft = s("bongo:4").struct(`<
  ~@2 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ A ~ A ~ B ~ A ~ A ~ A ~ A@2 ~@2 A ~ A ~ A ~ A ~ A ~ A ~
  A ~ B ~ A ~ A ~ A ~ A@2 ~
>`.pickRestart({
  A: "~@15 x", B: "~@11 x!5",
})).gain(0.45)

// drums · bongos
const bongos_2 = s("bongo:18").struct(`<
  ~ A B A C A B A B A B A D A B A B A B A D A B A C A B A B A B A D A B A C A B A B A B A B@2 E A B A B A B A B A B A D
  A B A C A B A B A B A B@2 E
>`.pickRestart({
  A: "~@7 x ~@5 x!2 ~", B: "~@6 x!2 ~@6 x ~", C: "~@6 x!2 ~@8", D: "~@3 x ~@3 x", E: "~@3 x ~@4",
})).gain(0.68)

// drums · bongos · soft notes
const bongos_soft_2 = s("bongo:18").struct(`<
  ~ A B A ~ A B A B A B A B A B A B A B A B A B A ~ A B A B A B A B A B A ~ A B A B A B A B@2 ~ A B A B A B A B A B A B
  A B A ~ A B A B A B A B@2 ~
>`.pickRestart({
  A: "~@3 x ~@4", B: "~@13 x ~@2",
})).gain(0.45)

// drums · congas
const congas = s("conga:13").struct("<~@47 A B A C A B A C A B A D ~@14>".pickRestart({
  A: "~@4 x ~@4 x ~@6", B: "~ x!2 ~", C: "~@2 x ~ x ~@2 x", D: "~@2 x ~@4 x",
})).gain(0.96)

// drums · congas · soft notes
const congas_soft = s("conga:13").struct("<~@47 A ~ A ~ A ~ A ~ A ~ A ~@15>".pickRestart({
  A: "~@13 x ~@2",
})).gain(0.55)

// drums · congas
const congas_2 = s("conga:18").struct("<~@47 A B A B A B A B A B A C ~@14>".pickRestart({
  A: "x!4 ~ x!4 ~ x ~@5", B: "x!4 ~ x ~@3 x!4 ~ x!2", C: "x!4 ~ x ~@5 x!2 ~ x!2",
})).gain(0.96)

// drums · congas · soft notes
const congas_soft_2 = s("conga:18").struct("<~@48 A ~ A ~ A ~ A ~ A ~ B ~@14>".pickRestart({
  A: "~@13 x ~@2", B: "~@10 x ~@2 x ~@2",
})).gain(0.55)

// drums · congas
const congas_3 = s("conga:33").struct("<~@47 A B A B A B A B A B A B ~@14>".pickRestart({
  A: "~@11 x!2 ~ x ~", B: "~@6 x!2 ~@8",
})).gain(0.96)

// drums · congas · soft notes
const congas_soft_3 = s("conga:33").struct("<~@48 A ~ A ~ A ~ A ~ A ~ A ~@14>".pickRestart({
  A: "~@13 x ~@2",
})).gain(0.55)

// drums · agogo bells
const agogo_bells = s("agogo:2").struct("<~ A@3 B ~@16 A@3 C ~@8 A@3 C ~@10 D@4 ~@8 A@3 C ~@10>".pickRestart({
  A: "x ~@5 x!3 ~@5 x!2", B: "x ~@5 x!3 ~@7", C: "x ~@5 x!2 ~@8", D: "x ~ x ~@4 x ~ x ~ x ~@4",
})).gain(1.92)

// drums · agogo bells
const agogo_bells_2 = s("agogo:4").struct("<~ A@3 B ~@16 A@3 C ~@8 A@3 C ~@10 D@3 E ~@8 A@3 C ~@10>".pickRestart({
  A: "~@2 x!3 ~@4 x ~ x!2 ~@3", B: "~@2 x!3 ~@5 x ~@5", C: "~@2 x!3 ~@11", D: "~@4 x!2 ~@6 x ~ x ~",
  E: "~@4 x!2 ~@6 x ~ x!2",
})).gain(1.92)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ A@3 B A@7 C A@7 C A@3 D A@7 C A@3 D A@9 C A@11 C A@3 D A@9 C>".pickRestart({
  A: "x!16", B: "x!9 ~ x ~@5", C: "x!8 ~@8", D: "x!8 ~@6 x!2",
})).gain(1.3)

// drums · whistle
const whistle = s("ballwhistle:1").struct(`<
  ~@46
  [~@15 x]
  [~@5 x!3 ~@5 x!3]
  [x!7 ~@4 x!2 ~ x!2]
  [~@5 x!3 ~@5 x!3]
  [~@3 x ~ x!5 ~ x!5]
  ~@22
>`).gain(0.33)

// drums · whistle
const whistle_2 = s("ballwhistle:0").struct("<~@46 [~@3 x] [~ x] [~@7 x ~ x ~@6] [x!2] x ~@22>").gain(0.33)

// drums · triangle
const triangle = s("triangles:30").struct(`<
// … 32 more lines