Strudelify

Criminal

Fiona Apple

KeyC minorTempo90 bpm
0:00/0:00
// Criminal — Fiona Apple
// 90 bpm, 4/4, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 4 "Basses" named as a bass, played on electric bass finger (its french horn patch is not one)
// note: Full arrangement: all 99 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(90/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 · string ensemble 2 · "Sopranos"
const string_ensemble_2 = note(`<
  ~@2 A B C D C E F G F H F I F J K@2 L M N O P Q R S T U R V W X C Y Z Y Z Y Z Y AA AB@2 AC AD N O AE AF R S T U R V W
  AG@2 C D C E AH AI AJ@2 AK@2 AL AM AN R S T U R V W AO S T AP AQ AR V W AG@2 C AS AT AU AV AW AX AY AZ BA@2
>`.pickRestart({
  A: "~@2 [c4,gb4]@5 ~", B: "~@4 gb4 f4 eb4@8 ~@2, ~@2 c4@5 ~", C: "c4@13 ~@3", D: "~@12 c5@3 ~", E: "c5@13 ~@3",
  F: "~@4 [c4,e4]@3 ~ [c4,e4]@2 [c4,e4]@5 ~", G: "~@4 [c5,eb5]@3 ~ d5@2 c5@5 ~", H: "~@4 [c5,eb5]!2 d5 c5",
  I: "~@8 [c5,eb5]@2 eb5@3 ~ [c5,e5]@2", J: "~@2 f4@2 [c5,eb5]@3 ~ [bb4,d5]@2 c5@5 ~",
  K: "[~@4 e4@3 ~ f4@21 ~@3, c4@29 ~@3, ~@4 ab4@3 ~@9]/2", L: "[c4,e4,g4]@3 ~ [c4,d4,f4]@3 ~", M: "[c4,e4]@13 ~@3",
  N: "~@2 c4@2 e4@3 ~ [d4,f4]@8", O: "eb4@6 ~@2 e4@5 ~ [f4,ab4]@2", P: "~@4 c5@3 ~ eb5@2 ~ d5@2 ~ c5@2, a4@13 ~@3",
  Q: "[ab4,c5,eb5]@13 ~@3", R: "~@4 eb5 eb5@2 ~@5 eb5@3 ~, ~@2 c5@5 ~", S: "~@4 eb5@3 ~@5 gb5 ~ eb5@2, ~@2 bb4@5 ~",
  T: "~@4 eb5 eb5@2 ~ f5@3 ~ eb5@3 ~, ~@2 c5@5 ~", U: "eb5 c5 gb5 ~ eb5 c5 gb5 f5",
  V: "~@4 [gb4,gb5]@3 ~ [gb4,gb5]@2 [f4,f5]@2 [eb4,eb5]@2 [f4,f5]@2", // Gb F Eb F
  W: "~@4 [gb4,gb5]@3 ~ [gb4,gb5]@2 [f4,f5]@2 [eb4,eb5]@2 [c4,c5] [bb3,bb4]", X: "[c4,c5]@13 ~@3",
  Y: "~@4 e4@3 ~@2 e4@2 ~@5", Z: "~@4 eb4@3 ~@2 eb4@2 ~ eb4@3 ~", AA: "c5@3 ~ [b4,d5]@3 ~ [c5,eb5]@3 ~ [d5,f5]@3 ~",
  AB: "[g5@2 [e5,g5]@2 g5@2 g5@2 ~@2 d5 d5@2 ~ eb5@4 ~@2 c5@2 ~ [c5,eb5]@2 ~ bb4@2 c5@2 ~@2]/2", // Em Cm
  AC: "~@4 e4@3 ~ [d4,f4]@6 ~@2", AD: "~@4 [a4,c5]@3 ~ b4@3 ~ a4@3 ~",
  AE: "g4 g4@2 g4@3 eb4@2 g4 g4@2 ~@3 [eb4,g4,bb4]@2, [f4,a4]@7 ~", // Eb F
  AF: "g4 f4 g4@2 c5@2 ~ eb5@2 ~ d5@2 c5@2 ab4@2, ab4@13 ~@3, c5@3 ~@13", AG: "[c5@3 ~@13 c5@13 ~@3, c4@29 ~@3]/2",
  AH: "~@4 gb4@3 ~ gb4@3 ~ gb4@3 ~", AI: "gb4@3 ~ gb4@3 ~ gb4@2 bb4@2 gb4@3 ~",
  AJ: "[~@4 bb4 bb4@2 ab4@3 gb4 gb4@3 f4 ~@3 f4 gb4@2 f4 gb4 ~@2 [gb4,gb5]@2 ~ [gb4,gb5] ~ [gb4,gb5] ~, eb4@13 ~@2 gb4@3 ~@14, ~@16 eb4@13 ~@3]/2", // Gb
  AK: "[~@4 [eb4,g4]@6 ~@2 eb4@7 ~ [c4,eb4]@6 ~@2 [eb4,gb4]@2 [f4,ab4]@2]/2", AL: "[g4,bb4]@3 ~ [gb4,b4]@3 ~",
  AM: "[ab4,c5]@5 ab4 [bb4,db5] [b4,d5]", AN: "[c5,eb5]@10 ~@2 [eb5,gb5]@3 ~", AO: "[c4,c5]@4 [c5,eb5]@3 ~",
  AP: "c5@3 ~ c5@3 ~ c5@3 ~ c5@3 ~", AQ: "c5@2 c5@2 c5 eb5 c5 ~", AR: "c5@2 ~ bb4@3 c5@6 bb4@2 c5 ~",
  AS: "~@12 c5@2 c4 d4", AT: "eb4@2 d4 eb4 c4@2 ~ d4 eb4 ~ d4 eb4 c4@2 ~ bb3, c4@2 ~ c4@3 ~@2", AU: "c4@12 c5@3 ~",
  AV: "~@4 [c5,eb5]@3 ~ [b4,d5]@3 ~ [c5,eb5]@3 ~, c4@13 ~@3", // Cm Bm Cm
  AW: "[g4,b4]@3 ~ [ab4,c5]@3 ~ [eb4,g4]@3 ~ [f4,ab4,c5]@3 ~", // G Ab Eb Fm
  AX: "[eb4,g4]@3 ~ [g4,b4]@3 ~ [ab4,c5]@3 ~ [b4,d5]@3 ~, c4@13 ~@3", // Eb G Ab Bm
  AY: "[b4,d5]@3 ~ [c5,eb5]@3 ~ [g4,b4]@3 ~ [ab4,c5]@3 ~", AZ: "~@4 [ab4,c5]@3 ~ [g4,b4]@3 ~ [b4,d5]@3 ~",
  BA: "[c5@29 ~@3]/2",
})).s("gm_string_ensemble_2").gain(0.31)

// chords · string ensemble 2 · "Sopranos" · soft notes
const string_ensemble_2_soft = note(`<
  ~@13 A ~ B C D ~@2 C E F ~ G H ~ I G ~@4 J K J K J K J L M@2 N ~ C E O ~ G H ~ I G ~@12 P@2 ~ Q ~ G H ~ I G ~@3 H ~@10
  R ~@5 S ~@2
>`.pickRestart({
  A: "~@10 c5@3 ~@3", B: "~@10 a4@5 ~", C: "~@4 g4@3 ~@9", D: "a4@13 ~@3", E: "gb4@6 ~@2 g4@5 ~@3", F: "f4@13 ~@3",
  G: "~@8 f5@3 ~@5", H: "~@8 f5@3 ~@2 f5 ~@2", I: "~@3 f5 ~@4", J: "~@4 c4@3 ~@2 c4@2 ~ [c4,e4]@3 ~",
  K: "~@4 c4@3 ~@2 c4@2 ~ c4@3 ~", L: "a4@3 ~@13",
  M: "[e5@2 ~@2 e5@2 e5@2 [d5,f5]@2 f5 f5@2 [d5,f5] c5@4 [bb4,d5]@2 a4@2 ~@4 d5@2 a4@2 [f4,a4]@2]/2", // Dm Bb F
  N: "c4@3 ~ g4@3 ~@9", O: "~@11 g4@3 ~@2", P: "[~@12 gb4@7 ~@13]/2", Q: "~@5 f4 ~@2", R: "~@9 g4 ~@4 c4 ~",
  S: "[eb4,g4]@3 ~@13", // Eb
})).s("gm_string_ensemble_2").gain(0.2)

// chords · reed organ · "Bad, bad Girls"
const reed_organ = note(`<
  ~@2 A B C@2 D@2 E F E F E F E G H I J K L M N@2 O P O P O Q R S T U V W X W X Y Z AA AB AC AD AE AF@2 AG O P O P O Q R
  AH@2 C@2 AI@2 AJ AK AJ AL AM AN AO AP AQ O P O P O Q R AR AS P O P O Q R AH@2 C@8 AT@3
>`.pickRestart({
  A: "~@2 [c4,gb4]@5 ~", B: "~@4 gb4 f4 eb4@8 ~@2, ~@2 c4@5 ~",
  C: "[~@4 gb4 f4 eb4@5 ~ gb4 f4 eb4@5 ~ gb4 f4 eb4@5 ~@5, ~@4 c4@6 ~@2 c4@7 ~ c4@6 ~@6]/2",
  D: "[~@4 gb4 f4 eb4@5 ~ gb4 f4 eb4@5 ~ gb4 f4 eb4@4 c4@2 b3@2 bb3@2, ~@4 c4@6 ~@2 c4@7 ~ c4@6 ~@6]/2",
  E: "~@4 c4 a3 c4 a3", F: "~ a3 c4 ~ [c4,eb4] ~ c4 ~", G: "~@4 [a3,c4]@2 ~ [bb3,d4]@2 ~ eb4@2 d4 [c4,eb4] [bb3,d4] c4",
  H: "~@4 c4@3 ~@5 [bb3,d4]@3 ~", I: "~@4 c4@2 ~ [c4,eb4]@2 ~ d4@2 c4@2 a3@2", J: "~@4 [c4,e4]@3 ~@5 [bb3,d4]@3 ~",
  K: "~@4 [a3,c4]@3 ~@3 [a3,c4]@3 ~ [a3,c4]@2", L: "~@4 [c4,e4]@4 ~@4 [bb3,d4]@3 ~",
  M: "~@4 [c4,eb4]@3 ~@5 [b3,d4]@3 ~", N: "[c4,eb4]@2 ~ d4@2 ~ c4@2 [c4,eb4]@2 ~ d4@2 ~ c4@2",
  O: "~@4 [c4,eb4]@3 ~@2 [c4,eb4]@2 ~ [c4,eb4]@3 ~", P: "~@4 [bb3,eb4]@3 ~@2 [bb3,eb4]@2 ~ [bb3,eb4]@3 ~",
  Q: "~@4 [c4,eb4]@6 ~@2 gb4 f4 eb4@2, ~@12 c4@3 ~", R: "~@2 [c4,eb4]@5 ~",
  S: "~@4 c4@2 ~ [c4,eb4]@2 ~ d4@2 c4 d4 a3 ~", T: "[eb4,g4]@3 ~ [f4,a4]@3 ~ g4@3 ~ ab4@3 ~", U: "~@2 ab4@2 a4@3 ~@9",
  V: "~@7 ab4", W: "a4@2 ab4@2 a4@3 ~@9", X: "~@5 f4 g4 ab4", Y: "c5@2 [ab4,b4]@2 [a4,c5]@3 ~@9",
  Z: "c4 d4 c4 eb4 ~ eb4 g4 ab4 g4 ~ c5 bb4 c5 bb4 c5@2", AA: "~@2 eb4@2 ~ c4@2 ~ d4@3 ~ d4@3 ~", AB: "c4 a3@6 ~@9",
  AC: "~@2 eb4!2 d4 c4 d4 c4", AD: "eb4@2 eb4 d4@2 c4 eb4 d4@2 c4@2 ~@5", AE: "~@4 [c4,e4]!4 ~@4 [bb3,d4]!4",
  AF: "[~@4 gb4 f4 eb4@5 ~ gb4 ~ eb4@5 ~ gb4 f4 eb4@5 ~ c4@2 eb4@2, ~@4 c4@6 ~@2 c4@7 ~ c4@6 ~@2 gb4 ~@3]/2",
  AG: "[c4,eb4]@2 ~ [c4,eb4]@2 ~ [c4,eb4]@2 ~ [c4,eb4]@2 ~ [c4,eb4]@2 [c4,eb4]@2", AH: "[~@4 [c4,gb4]@25 ~@3]/2",
  AI: "[~@4 gb4 f4 eb4@5 ~ gb4 f4 eb4@17 ~, ~@4 c4@6 ~@2 c4@19 ~]/2", AJ: "~@4 [eb4,gb4]@6 ~@2 eb4 [db4,f4] [b3,eb4]@2",
  AK: "~@4 [gb4,bb4]@5 ~ [gb4,bb4]@2 gb4 [f4,ab4] [eb4,gb4]@2", // Gb Fm Ebm
  AL: "[eb4,gb4]@2 ~ [db4,f4]@2 ~ [c4,eb4]@2 [eb4,gb4]@2 ~ db4@2 ~ [b3,eb4]@2", AM: "eb4@4 bb4@4 ab4@3 gb4@3 f4@2",
  AN: "eb4@4 bb4@4 ab4@3 gb4@3 f4 ~", AO: "~@2 bb4 ~ bb4!2 ~ ab4@3 gb4 ~ gb4@2 ~ f4", AP: "gb4 f4@2 gb4@2 f4 bb4@10",
  AQ: "~@5 eb4 gb4!2, ~@4 [bb4,c5]@3 ~", AR: "eb4@2 ~ d4@2 ~ c4@2 eb4@2 ~ d4@2 ~ c4@2",
  AS: "eb4@3 ~ [c4,eb4]@3 ~@2 [c4,eb4]@2 ~ [c4,eb4]@3 ~", AT: "[[c4,eb4]@15 ~]/3",
})).s("gm_reed_organ").gain(0.31)

// chords · reed organ · "Bad, bad Girls" · soft notes
const reed_organ_soft = note("<~@8 A B A B A B A C D ~@16 E ~@5 E F G ~@4 H@2 ~@14 I J I K ~@33>".pickRestart({
  A: "~ a3 [c4,e4] a3 e4 ~ e4 ~", B: "~@2 eb4 a3 ~ a3 eb4 a3", C: "~@10 c4@2 bb3 ~@2 a3", D: "~@4 e4@3 ~@9",
  E: "a4 ~@7", F: "~@4 f4 ~@4 bb4 ~@6", G: "~@4 d4 ~@11", H: "~@13 f4 ~@2", I: "~@12 gb4 ~@3", J: "~@12 bb4 ~@3",
  K: "~@11 f4@2 ~@3",
})).s("gm_reed_organ").gain(0.2)

// chords · piano · "Delicate Men"
const piano = note(`<
  ~@2 A B C@3 D E F E F E F E G@2 H I J K L M N O P O P O P@2 Q R E F E F E F E S T U V W X Y Z AA O P O P O P@2 AB R
  C@3 AC AD AE AF AE AD AE AG AH AI O P O P O P@3 AJ P O P O P@2 AB AK C@5 AL AM AN AO AP AQ
>`.pickRestart({
  A: "~@2 [c3,gb3]@5 ~", B: "~@4 gb3 f3 eb3@8 ~@2, ~@2 c3@5 ~", C: "~@2 [c3,eb3]@5 ~", D: "~@2 [c3,eb3]@3 eb3 d3 db3",
  E: "~@4 [e3,a3]@3 ~@2 [e3,a3]@2 ~ [e3,a3]@3 ~", F: "~@4 [f3,a3]@3 ~@2 a3@2 ~ a3@3 ~",
  G: "[~@7 [f3,bb3]@2 ~ [f3,a3]@2 ~ a3@2 [f3,a3]@2 ~@3 g3@3 ~@5 f3@3 ~]/2", H: "~@2 a3@5 ~", I: "~@4 g3@3 ~@5 f3@3 ~",
  J: "~@4 [e3,g3]@3 ~@3 [e3,g3]@3 ~ g3@2", K: "[e3,g3]!3 [e3,g3]@2 e3 [e3,g3]!2 f3 ~ [d3,f3] [d3,f3]@2 [d3,f3]!2 ~",
  L: "eb3 [c3,eb3]!2 eb3@2 ~ eb3 [c3,eb3] ~@3 d3@2 ~ d3!2", // Cm
  M: "g4@2 ~ g4@2 ~ eb4@2 g4@2 ~ g4@2 ~ eb4@2, [c3,eb3]@13 ~@3", N: "g4@6 ~@4 eb4@2 eb4 ~ eb4@2, ab3@13 ~@3",
  O: "~@4 [c3,f3]@3 ~@5 f3@3 ~", P: "~@4 gb3 f3 eb3@6 eb3 d3 c3@2, ~@2 c3@3 ~ c3 ~",
  Q: "[f3,a3]@2 ~ [f3,a3]@2 ~ [f3,a3]@2 ~ a3@2 ~ [f3,a3]@2 [f3,a3]@2", R: "~@4 c4@2 ~ [c4,eb4]@2 ~ d4@2 c4 d4 a3 ~",
  S: "[f3,a3]@12 eb4 f4 eb4@2, eb4@5 ~@3", T: "~@4 [g3,c4,e4]@3 ~@5 [f3,bb3,d4]@3 ~",
  U: "~@4 [a3,c4]@2 ~ [a3,c4]@2 ~ [f3,a3,c4]@2 ~ [a3,c4]@3", V: "~@4 [g3,c4]@3 ~@5 [f3,bb3]@3 ~",
  W: "~@4 a3@2 ~ a3@2 ~ [e3,a3]@2 ~ a3@3", X: "~@4 [e3,g3]@3 ~@5 [d3,f3]@3 ~", Y: "~@4 [c3,eb3]@3 ~@5 [b2,d3]@3 ~",
  Z: "~@4 [c3,eb3]@2 ~ [c3,eb3]@2 ~ [c3,eb3]@2 ~ [c3,eb3]@2 ~", // Cm
  AA: "[eb3,ab3]@2 ~ [eb3,ab3]@2 ~ [eb3,ab3]@2 ~ [eb3,ab3]@2 ~ [eb3,ab3]@2 [eb3,ab3,f4]@2", // Ab5 Fm7
  AB: "[c4,eb4]@2 ~ [c4,eb4]@2 ~ [c4,eb4]@2 ~ eb4@2 ~ [c4,eb4]@2 [c4,eb4]@2", AC: "~@4 [c3,eb3]@6 g3@2 g3 f3 eb3@2",
  AD: "[eb3,g3,bb3]@3 eb4 [eb3,gb3,b3]@3 db4", AE: "[eb3,ab3,c4]@3 c4 [eb3,gb3,b3]@3 db4",
  AF: "[eb3,g3,bb3]@3 ~ [eb3,gb3,b3]@3 db4", AG: "[eb3,bb3]@3 ~ [gb3,b3]@3 ~",
  AH: "[gb3,bb3]@2 ~ [f3,ab3]@2 ~ [eb3,gb3]@2 ~ [gb3,bb3]@2 ~ [f3,ab3]@2 [eb3,gb3]@2", AI: "~@2 [eb3,gb3]@3 ~@3",
  AJ: "[c3,f3]@3 ~ [c3,f3]@3 ~@5 f3@3 ~", AK: "~@4 c4@2 ~ [c4,eb4]@2 ~ d4@2 c4 d4 c4@2", AL: "~@4 [c3,eb3]@10 c3 d3",
  AM: "eb3@2 d3 eb3 c3@2 c3 d3 eb3 g3 d3 eb3 c3@2 c3 bb2", AN: "c3@13 ~@3",
  AO: "[c3,eb3]@3 ~ [ab3,c4]@3 ~ [g3,b3]@3 ~ [b3,d4]@3 ~", AP: "[c4,eb4]@3 ~ [b3,d4]@3 ~", AQ: "[g3,c4]@13 ~@3",
})).s("gm_piano").gain(0.31)

// chords · piano · "Delicate Men" · soft notes
const piano_soft = note(`<
  ~@9 A ~ A ~ A ~ B ~ C ~ D E F ~ G H ~ H ~ H ~@2 I ~@2 A ~ A ~ A ~@3 J ~ K ~@4 H ~ H ~ H ~@2 L ~@7 M ~@6 H ~ H ~ H ~@3
  H ~ H ~ H ~@2 L ~@12
>`.pickRestart({
  A: "~@9 f3@2 ~ f3@3 ~", B: "~@4 [f3,a3]@2 ~@7 f3@2 ~", C: "~@2 f3@5 ~", D: "~@7 e3",
  E: "~@5 g3 ~@2 d3 [d3,f3] ~@5 [d3,f3]", F: "c3 ~@2 c3@2 [c3,eb3] c3 ~ [b2,d3]!3 b2@2 [b2,d3] b2!2", G: "c4@13 f4 ~@2",
  H: "~@12 c3@3 ~", I: "~@9 f3@2 ~@5", J: "~@4 f3@2 ~ f3@2 ~@4 f3@3", K: "~@4 e3@2 ~ e3@2 ~@4 e3@3", L: "~@9 c4@2 ~@5",
  M: "~@3 eb4 ~@4",
})).s("gm_piano").gain(0.2)

// bass · electric bass finger · "Basses"
const bass = note(`<
  A B A B A B A C D E D E D E F G H I H J H K L M N O N O N H K P@2 D E D E D E F G H I H J Q R L S N T N T N H K U V A
  B A B W X W Y W X W Z AA N T N T N H K U N T N T N H K U V A B A B A B A B A AB@2
>`.pickRestart({
  A: "c3@2 ~ c3@2 c3 g2@2 bb2@2 c3@2 eb3@2 c3 bb2", B: "c3@2 ~ c3@2 c3 g2@2 bb2@2 c3@2 f2 g2 bb2@2",
  C: "c3@2 ~ c3@2 c3 g2@2 c3@2 c3@2 b2@2 bb2@2", D: "a2@2 a2@5 ~ a2@2 a2@3 ~ g2@2",
  E: "f2@2 f2@5 ~ f2@2 f2@2 g2@2 ab2@2", F: "a2@2 a2@5 ~ a2@2 b2@2 c3@2 g2@2", G: "f2@2 f2@5 ~ f2@2 f2@2 g2@2 bb2@2",
  H: "c3@2 c3@3 ~@2 c3 bb2@2 bb2@3 ~@2 bb2", I: "f2@2 f2@3 ~ f2@3 ~ f2@2 g2@2 bb2@2", J: "a2@2 a2@3 ~@2 a2!3 a2@2 a2!4",
  K: "ab2@2 ab2@3 ~@2 ab2 g2@2 g2@3 ~ gb2@2", L: "f2@2 ~ f2@2 ~ f2@2 ~ f2@2 ~ f2@2 f2@2", M: "ab2@5 ~ ab2!2",
  N: "f2@2 f2@3 ~@2 f2!3 f2@3 ~ f2@2", O: "c3@2 c3@3 ~@2 c3!3 c3@2 c3!2 c3@2", P: "f2!12 f2@2 f2@2",
  Q: "c3@2 c3 ~ c3!2 ~ bb2 ~ bb2 ~ bb2 ~ bb2!2 ~", R: "ab2!2 ~ ab2@3 ab2 ~ g2!2 ~ g2@3 gb2@2", S: "ab2!13 ab2@2 ~",
  T: "c3@2 c3@3 ~@2 c3 c3@2 c3@2 c3 eb3 c3@2", U: "f2@2 ~ f2@2 ~ f2@2 ~ f2@2 ~ bb2 c3 eb3@2",
  V: "f2@2 ~ f2@2 ~ f2@2 ~ eb3@2 ~ eb3 d3 c3@2", W: "eb3@2 eb3@5 ~ b2@2 b2@5 ~",
  X: "ab2@2 ab2@5 ~ b2@2 b2@2 b2@2 db3@2", Y: "ab2@2 ab2@2 ~ gb2 g2 ab2@2 gb2 g2 ab2@2 ab2 b2 db3",
  Z: "ab2@2 ~ ab2@2 ~ ab2@2 ~ ab2@2 ~ ab2@2 ab2@2", AA: "[ab2,eb3]@13 ~@3", AB: "[c3@29 ~@3]/2",
})).s("gm_electric_bass_finger").gain(0.31)

stack(string_ensemble_2, string_ensemble_2_soft, reed_organ, reed_organ_soft, piano, piano_soft, bass)