Strudelify

Josephine

Tori Amos

KeyD♭ majorTempo63 bpm
0:00/0:00
// Josephine — Amos, Tori
// 63.3 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (3/4 at bar 1, 4/4 at bar 1) are rendered on a constant 4/4 grid of one bar per cycle
// note: pitch bends are ignored
// note: Full arrangement: all 40 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(63.3/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("<~@3 A@2 B C D E F G H I J K L M N O P Q R G H I J K L M S T U E F G V@2 W@2 ~>".pickRestart({
  A: "[ab3,db4]", B: "ab3@12 ~ eb4@3, db4, ~@3 ab3", C: "[eb4,bb4]@2 [eb4,bb4] [db4,gb4]!2 [bb3,db4]!2 [ab3,db4]",
  D: "[ab3,db4]@2 [gb3,db4]@3 [f3,db4]@3 [eb4,ab4]@4 ~ [eb4,bb4]@3, ~@3 ab3", // Db5 Gb5 Db Ab5 Eb5
  E: "[eb4,bb4]@4 ~ [db4,bb4]@2 ~ [db4,gb4]@2 ~@2 [ab3,db4]@2 ~@2", // Eb5 Gb Gb5 Db5
  F: "[gb3,db4]@2 [f3,db4]@2 [ab3,db4]@4 [db4,ab4]@4 ab3 ~ [db4,ab4]@2, ~@13 bb3@2 ~", // Gb5 Db Db5
  G: "[eb4,bb4]@2 [eb4,bb4] [db4,gb4,bb4]!2 [bb3,db4,gb4] [bb3,db4] [ab3,db4], ~@3 gb4", // Eb5 Gb Bbm Db5
  H: "[c4,f4,ab4]@4 ~@8 ab3 [c4,f4,ab4]@3, ~@4 c4@4 f4@3 c4@2 ~@3, ~@3 f3@2 ab3 ~@2", // Fm
  I: "[bb3,eb4,bb4]@4 eb3@4 ~@5 ab3@3, ~@5 bb3!2 ~, ~@11 db4@2 ~@3", // Eb5
  J: "[c4,f4,ab4]@4 ~@8 f3 [c4,f4,ab4]@3, ~@4 [c4,f4,ab4]@4 f4@3 c4@2 ~@3, ~@3 f3@2 ab3 ~@2", // Fm
  K: "bb3 [eb3,eb4,bb4] ~ [db4,bb4]", L: "[c4,ab4] ab4 [c4,ab4]!2",
  M: "[c4,ab4]@4 c4@2 ~@9 db4, ~@4 ab4@3 db4@2 db4@2 db4@2 db4@2 ~, ~@3 c4 gb3@4, ~@4 c4!4", // Fm
  N: "[ab3,db4]@2 [gb3,db4]@2 [f3,db4]@3 ~ [eb4,ab4]@4 [eb4,ab4]@4", // Db5 Gb5 Db Ab5
  O: "[eb4,bb4]@2 [eb4,bb4] [gb4,bb4] [db4,gb4] [bb3,db4]!2 [ab3,db4]", // Eb5 Gb Gb5 Bbm Db5
  P: "[ab3,db4]@2 [gb3,db4]@2 [f3,db4]@3 [ab3,db4]@2 [ab3,eb4]@2 [ab3,f4]@2 [ab3,eb4]@2 ~", // Db5 Gb5 Db Db5 Ab5 Db Ab5
  Q: "[eb4,bb4]@3 [eb4,bb4]@2 [db4,bb4]@2 ~ [db4,gb4]@2 ~ gb3 ~ gb3 ~ gb3, ~@6 [ab3,db4]!2", // Eb5 Gb Gb5 Db5
  R: "[f3,db4]@4 [ab3,db4]@4 [db4,ab4]@4 ab3 ~ [db4,ab4]@2, ~@13 bb3@2 ~", // Db Db5
  S: "[ab3,db4]@2 [gb3,db4]@2 [f3,db4]@4 [eb4,ab4]@4 ~ eb4@3, ~@3 ab3", // Db5 Gb5 Db Ab5
  T: "[eb4,bb4]@2 [eb4,bb4] [db4,gb4,bb4]!2 [bb3,db4]!2 [ab3,db4]", // Eb5 Gb Bbm Db5
  U: "[ab3,db4]@2 [gb3,db4]@2 [f3,db4]@4 [eb4,ab4]@3 ~@2 [eb4,bb4]@3, ~@11 [eb4,ab4]@2 ~@3, ~@3 ab3", // Db5 Gb5 Db Ab5 Eb5 Ab5
  V: "bb3@2 c4@2 f4@2 db4@2 eb4@2 bb3@2 g3 ab3 bb3@2, db4 bb3 ~@2",
  W: "[[bb3,db4]@2 [ab3,db4]@2 [ab3,db4]@4 [gb3,db4]@5 [bb3,db4]@5 ~@14]/2", // Bbm Db5 Gb5 Bbm
})).s("gm_piano").gain(0.41).pan(0.3)

// chords · piano
const piano_2 = note("<~@3 A@2 B C@2 D@2 E F G F G H@2 I C@2 D@2 E F G F G H@2 I C@2 D@2 E J@2 K@3>".pickRestart({
  A: "[db2,ab2]", B: "[db2,ab2]@10 ~ eb3@4 ~, ~@5 ab2@2 ~",
  C: "[~@2 bb2@4 ~@2 gb2@2 ~ gb2@3 ~@2 db2@2 ~ db3@4 ~@3 eb3@4 ~ [db3,eb3], eb2@7 bb2@2 ~ db3@4 db3@4 ab2@2 ~@4 ab2@4 ~@4, ~@15 gb2@4 ~@13]/2", // Dbsus2
  D: "[~@7 gb2 gb2@2 ~@6 db2@2 ~ db3@4 ~@3 eb3@4 db3 eb3, eb2@4 ~@3 gb2@2 ab2 ~@2 ab2@2 ~@2, ~@2 bb2@4 ~@4 db3@4 ~ db3@4 ~@13, ~ eb3@2 gb3 ~@4]/2",
  E: "~@2 bb2@4 ~@2 gb2@2 ~ gb2@3 ~ gb2, eb2@7 bb2@2 ~ db3@4 db3@2", F: "~ c3@2 ~@2 c3@2 ~, f2!2",
  G: "~@2 bb2@4 ~@3 bb2@4 ~ bb2@2, eb2@7 bb2@2 ~@7, ~@4 eb2@3 ~",
  H: "[~@10 eb3@4 ~@4 eb3@4 ~ eb3@2 ~@3 bb2@2 ~ bb1, ab2 c4 gb2 ~ ab2 ~@3, ~ eb3@2 eb3@2 ~@2 eb3@2 ~@6 db3]/2",
  I: "db2@2 ~ db3@4 ~@4 eb3@4 ~, ~ ab2 ~@3 ab2@2 ~",
  J: "[f2,bb2]@4 [ab2,f3]@3 ~ eb2@3 ~ bb2@2 ~ eb2, ~@7 bb2@4 eb2@3 bb2@2", // Bb5 Db
  K: "[gb2@4 ~@2 db2@4 ~ gb2@4 [gb1,gb2]@2 ~ [db2,db3]@20 ~@10, db3 ~@5]/3", // Gb Db
})).s("gm_piano").gain(0.41).pan(0.3)

// other · overdriven guitar
const overdriven_guitar = note("<~@3 A B ~@9 C D@2 ~@9 E D@2 ~@11>".pickRestart({
  A: "~@3 db5", B: "ab4", C: "~@3 a3 bb3@2 ~@2", D: "[f4 ab4@2 ~]/2", E: "g3 ab3 bb3 ~",
})).s("gm_overdriven_guitar").gain(0.2)

// bass · acoustic bass
const bass = note("<~@5 A B C B C B D E D E F@2 G B C B C B D E D E F@2 H B C B C B I J K@2 ~>".pickRestart({
  A: "~@15 db2", B: "eb2@6 ~ eb2 gb2@6 ~ gb2", C: "db2@6 ~ db2 ab1@6 ~ ab1", D: "f2@6 ~ f2 f2@6 ~ f2",
  E: "eb2@6 ~ eb2 eb2@6 ~ eb2", F: "ab2@6 ~ ab2 gb2@7 ~", G: "db2@6 ~ db2 ab2@7 db2, ~@4 ab1@3 ~",
  H: "db2@6 ~ db2 ab1@6 ~ db2", I: "bb1@6 ~ bb1 eb2@6 ~ eb2", J: "bb1@6 f2 bb2 eb2@6 ~ eb2", K: "[gb2@9 ~@7]/2",
})).s("gm_acoustic_bass").gain(0.41)

// chords · rock organ
const rock_organ = note("<~@9 A ~ B C B D E@2 ~ F@2 ~ A ~ B C B D E@2 G@3 H I H J K L@3>".pickRestart({
  A: "~ [eb5,ab5]", B: "f3 f5", C: "~ eb5@2 ~, eb4 ~", D: "~@3 a5 bb5@2 ~@2, eb4 ~", E: "[f5 ab5@2 ~]/2",
  F: "[~@15 ab4@6 ~@11, ~@6 db6 gb5@2 ~@7, ~@13 db5@2 ~@17]/2", G: "[~@2 [ab4,eb5]@4 ~ [db5,ab5]@2 ~ [eb5,ab5]@2]/3",
  H: "[eb5,bb5] [gb4,db5]", I: "[ab4,db5] [eb5,ab5]", J: "bb4@2 c5@2 f5@2 db5@2 eb5@2 bb4@2 g4 ab4 bb4@2, ~@6 eb5 ~",
  K: "bb4!2 f5 db5 eb5 bb4 eb5 bb4", L: "[gb4@9 [ab5,db6]@10 ~@5, db5 ~@5]/3",
})).s("gm_rock_organ").gain(0.2).pan(0.6)

// chords · electric guitar clean · "brilliant new album"
const electric_guitar_clean = note("<~@11 A B A B ~@8 A B A B ~@8 C D E@2 ~>".pickRestart({
  A: "~@2 f4 ~, ab3 ~, ~ c3@2 f3@2 ~@3, ~ c4 ~@2", B: "~ eb4 ~@2, eb3 ~, ~ bb3@2 ~@5",
  C: "bb3@2 c4@2 f4@2 db4@2 eb4@2 bb3@2 ~ ab3 bb3@2, ~@6 [g3,eb4] ~", D: "bb3!2 f4 db4 eb4 bb3 eb4 bb3",
  E: "[gb3@9 ~@7, db4 ~@3]/2",
})).s("gm_electric_guitar_clean").gain(0.31).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~ A B@3 A B@3 A B@5 C D A B@3 A B@3 A B C D A B@3 A B@3 E ~@2>".pickRestart({
  A: "x ~@2 x ~@2 x ~ x ~@5 x ~", B: "x ~@6 x!2 ~@6 x", C: "x ~@2 x!2 ~@2 x", D: "x ~@2 x!2 ~ x ~", E: "x ~@2 x!2 ~@11",
})).gain(0.41).pan(0.7)

// drums · snare
const snare = s("sd").struct("<~ A@3 B A@3 B A@3 B A B C D A@3 B A@3 B A@2 C D A@3 B A@3 B E ~@2>".pickRestart({
  A: "x ~@2 x!2 ~ x!4 ~ x!5", B: "x ~ x!3 ~ x!4 ~ x!5", C: "x ~@3 x ~@2 x ~ x ~@2 x ~@3",
  D: "x ~@3 x ~@2 x ~ x ~ x!4 ~", E: "x",
})).gain(0.2).pan(0.7)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~ A@14 ~ B A@10 ~ B A@8 C ~@2>".pickRestart({
  A: "~ x!2 ~@2 x ~@4 x ~@5", B: "~@15 x", C: "~ x!2 ~@13",
})).gain(0.1).pan(0.7)

// drums · hihat
const hihat = s("hh").struct(`<
  ~
  [~@3 x ~@5 x ~@2 x ~@3]!14
  ~@2
  [~@3 x ~@5 x ~@2 x ~@3]!10
  ~@2
  [~@3 x ~@5 x ~@2 x ~@3]!8
  ~@3
>`).gain(0.41).pan(0.7)

// drums · open hat
const open_hat = s("oh").struct("<~@15 [x!4]!2 ~@10 [x!4]!2 ~@9 [~ x!2 ~@13] ~>").gain(0.2).pan(0.7)

// drums · china
const china = s("cr").struct("<~ A ~ A ~ A ~@3 A ~@5 A ~ A ~@3 A ~@5 A ~ A ~@3 A ~ A ~ B ~@2>".pickRestart({
  A: "x", B: "x ~@3 x ~@3 x ~@4 x ~@2",
})).gain(0.41).pan(0.7)

stack(
  piano, piano_2, overdriven_guitar, bass, rock_organ, electric_guitar_clean, kick, snare, snare_soft, hihat, open_hat,
  china
)

More by Tori Amos