Strudelify

1000 Oceans

Tori Amos

KeyB♭ majorTempo68 bpm
0:00/0:00
// 1000 Oceans — Amos, Tori
// 68.4 bpm, 4/4, key A# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 72 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(68.4/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 A B A C D E F G H I J K L M E F N O J P Q R S T U V S T U V W C D X F Y Z I J S T U V S T U V AA C D E AB Y H I J
  AA L AC E AB AD O AE P Q P AF AG ~
>`.pickRestart({
  A: "[bb3,f4]@3 [bb3,f4]@3 [bb3,f4]@2", B: "[c4,f4]@3 [c4,f4]@3 [c4,f4]@2", C: "[a3,f4]@3 [a3,f4]@3 [a3,f4]@2",
  D: "[g3,d4]@3 [g3,d4]@3 [g3,d4]@2", E: "[a3,f4]@6 [a3,d4,a4]@6 ~ f4 d4@2, ~@3 [a3,a4], ~@6 e4 ~",
  F: "[f4,bb4]@3 [eb4,bb4]@3 ~ bb3, ~@3 [f4,bb4]", G: "[d4,a4]@3 [e4,a4]@3 [d4,a4]@2",
  H: "[c4,g4]@6 [c4,g4]@7 [g4,c5]@3", I: "[f4,c5]@6 [f4,c5]@6 ~ [c4,f4]@3", J: "[c4,f4]@2 [c4,f4]!2",
  K: "[bb3,f4]@3 [c4,f4]@3 [bb3,f4]@2", L: "[a4,d5]@3 [a4,d5]@3 [a4,d5]@2", M: "[eb4,bb4]@3 [f4,bb4]@3 [eb4,bb4]@2",
  N: "[c4,g4]@3 [c4,g4]@3 [c4,g4]@2", O: "[d4,bb4]@3 [d4,bb4]@3 ~ bb3, ~@3 [d4,f4]",
  P: "[bb3,d4]@3 [a3,d4]@3 [g3,d4]@2", Q: "[f3,bb3]@3 [g3,bb3]@3 [f3,bb3]@2", R: "[bb3,f4]@3 ~@5",
  S: "c4@2 ~ bb3@3 d4@2 d4@2 eb4@3 f4@3, ~ d4 ~@6", T: "f4@4 ~@2 c4@2 c4@2 d4@3 eb4@3",
  U: "[eb4,g4]@4 [d4,g4]@4 [eb4,g4]@2 d4 d4@2 [eb4,g4]@3, ~@10 g4@3 ~@3", // Eb G5 Eb
  V: "eb4@2 eb4@2 [eb4,bb4]@4 [eb4,bb4]@2 [eb4,bb4]@3 [bb3,f4]@3, c5 ~@3", W: "[f4,bb4]@3 [bb3,f4]@3 [bb3,f4]@2",
  X: "[a3,f4]@6 [a3,d4,a4]@6 f4@2 d4 eb4, ~@3 [a3,a4]", Y: "[d4,a4]@3 [a4,d5]@3 [d4,a4]@2",
  Z: "[g4,c5]@6 [c4,g4]@7 [g4,c5]@3", AA: "[f4,bb4]@3 [f4,bb4]@3 [f4,bb4]@2",
  AB: "f4 ~ f4@2 [eb4,bb4]@4 [eb4,bb4]@4 ~@2 bb3@2, [g4,bb4] ~@2 [f4,bb4]", AC: "[bb4,eb5]@3 [f4,bb4]@3 [eb4,bb4]@2",
  AD: "[c4,g4]@3 [c4,g4]@3 [c4,g4,bb4]@2, bb4@2 ~ bb4@2 ~@3", AE: "[c4,f4]!2", AF: "[f4,bb4]@3 [g4,bb4]@3 [f4,bb4]@2",
  AG: "~ [bb3,f4]@15", // Bb5
})).s("gm_piano").gain(0.41)

// chords · piano
const piano_2 = note(`<
  A B A B A C D E F G H I J A K F E F L M N O P Q@2 R S T U R S T A C D E F G H I J U R S T U R S T A C D E F V H I J A
  K F E F L M W O P O P X ~
>`.pickRestart({
  A: "[bb2,f3]@3 [bb2,f3]@3 [bb2,f3]@2", B: "[c3,f3]@3 [c3,f3]@3 [c3,f3]@2", C: "[a2,f3]@3 [a2,f3]@3 [a2,f3]@2",
  D: "[g2,d3]@3 [g2,d3]@3 [g2,d3]@2", E: "[a2,d3]@3 a2@2 ~ d3@2, ~@3 d3@3 ~@2, ~@5 [d2,a2]@3",
  F: "[eb2,bb2]@3 [eb2,bb2]@3 [eb2,bb2]@2", G: "[d2,a2]@6 [d2,a2]@6 ~@3 c3, ~@3 [d2,a2], ~@7 d3",
  H: "[c2,g2]@6 [c2,g2]@6 ~@2 e3 f3, ~@3 [c2,g2]", I: "[f2,c3]@6 [f2,c3]@6 c3 ~ d3 eb3, ~@3 f3, ~@13 c3@3",
  J: "[f2,c3]@3 ~@3 f2@2", K: "[a2,d3]@3 [a2,d3]@3 [a2,d3]@2", L: "[e2,c3]@3 [e2,c3]@3 ~ g3, ~@3 [e2,c3]",
  M: "[f2,d3]@3 [f2,d3]@3 [f2,d3]@2", N: "[f2,c3]@2 [f2,c3]!2", O: "[g2,d3]@3 [g2,d3]@3 ~ bb2, ~@3 [g2,d3]",
  P: "[eb2,bb2]@3 [eb2,bb2]@3 ~ eb3, ~@3 [eb2,bb2]", // Eb5
  Q: "[[bb2,f3]@6 ~@6 [f2,f3]@3 ~ [bb2,f3]@3 f3@2 ~ f3@2 f3@2 ~ bb1@2 ~ bb1@2, ~@15 bb1@4 ~@2 [bb1,bb2]@5 [bb2,f3]@3 [bb2,f3]@3]/2", // Bb5 F Bb5 Bb Bb5
  R: "~@4 f3@2 f3@2 [a1,f3]@2 ~@4 a2 bb2, [a1,a2]@8 ~@3 a1@4 ~, f3@4 ~@9 f3@3, ~ c3@2 ~@2 [a2,f3]@2 ~", // Dm A Dm
  S: "[c2,g2]@4 ~@4 g2@3 ~ c3@2 d3 eb3, ~ c2@2 ~, ~@7 c3@2 ~@2 g2@2 ~@3", // C5
  T: "eb3@3 eb2@2 ~ eb2@4 eb2@2 ~@2 f1@2, ~@13 f2@3",
  U: "[bb2,f3]@3 f3@2 ~ f3@2 f3@2 ~ bb1@2 ~ bb1@2, ~@5 [bb1,bb2]@5 [bb2,f3]@3 [bb2,f3]@3", // Bb5 Bb Bb5
  V: "[d2,a2]@6 [d2,a2]@4 ~@5 c3, ~@5 [d2,a2]@3, ~@7 d3", W: "[f2,c3]!2", X: "~ [bb2,f3]@15",
})).s("gm_piano").gain(0.41)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A B A B ~@8 C D E F G H@2 I@2 J@3 D B F K D B F K L M N O ~@4 C D B F K D B F K ~@8 C D E F G H@2 I@2 P@6
>`.pickRestart({
  A: "bb2", B: "c3", C: "f3@2 f3!2", D: "f3", E: "gb3", F: "g3", G: "d3@3 a3", H: "bb3/2", I: "f3/2", J: "bb2/3",
  K: "bb3@2 d3 eb3", L: "bb3@3 ~", M: "a3@3 ~", N: "g3@3 ~", O: "f3@3 ~", P: "[bb2@41 ~@7]/6",
})).s("gm_string_ensemble_1").gain(0.31)

// bass · electric bass finger · "midi come to Chris's"
const bass = note(`<
  A B A B ~@9 A C D E F G H I J K A L M B N O P Q R ~@9 L M B N O P Q S T ~@8 U V W E X Y H I Z K AA F AB@2
>`.pickRestart({
  A: "bb1", B: "c2", C: "d2 gb2", D: "~ eb2@6 ~, bb2", E: "d2", F: "eb2", G: "e2", H: "f2@3 ~@4 d2", I: "f2",
  J: "g2@6 f2 bb1", K: "eb2@3 f2", L: "bb1@14 f2 bb1", M: "a1@7 bb1", N: "eb2@5 eb2@2 f1", O: "bb1@14 ~ bb1",
  P: "a1@6 f2 bb1", Q: "c1@7 d1", R: "eb1", S: "~@7 f1, eb1", T: "bb0", U: "bb0@7 c1", V: "d1@4 gb1@2 a1 d2",
  W: "eb2@6 bb2 eb2", X: "~@7 eb1, eb2", Y: "e1@6 c2 e2", Z: "g3 d3 bb2 a2 g2@2 f2 bb1", AA: "g2@4 bb2@2 c3 g2",
  AB: "[~ bb1@17 ~@14]/2",
})).s("gm_electric_bass_finger").gain(0.41)

// other · flute
const flute = note("<A B A B ~@13 C@2 D@2 E@3 A F B G A F B G ~@9 A F B G A F B G ~@13 C@2 D@2 H@6>".pickRestart({
  A: "bb2", B: "c3", C: "bb3/2", D: "f3/2", E: "bb2/3", F: "a2", G: "eb3@2 f3 g3", H: "[bb2@41 ~@7]/6",
})).s("gm_flute").gain(0.31)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@24 A@2 B@2 A@2 B@2 ~@4 C@3 D@7 E@4 ~@22>".pickRestart({
  A: "~@3 f4@5, c5 c5@3, ~ f4@2 ~@5", B: "~@3 g4@5, c5 c5@3, ~ g4@2 ~@5",
  C: "[[bb3,eb4] [a3,d4] [g3,c4,g4], [f4,bb4], ~ e4@2]/3", // Eb5 D5 C5 Bb5
  D: "[[bb3,c4,f4]@8 [c4,c5]@8 ~@19 g4@5 ~@3 g4@5 ~@3 f4@5, bb4, ~@8 f4@9 f4@2 f4@6 f4@2 f4@22 f4@2 ~@5, ~@8 c5 c5@3 c5 c5@3 c5 c5@3 c5 c5@3 c5 c5@3, ~@33 g4@2 ~@6 g4@2 ~@13]/7", // Bbsus2 C
  E: "[~@11 g4@5 ~@3 g4@5 ~@8, c5 c5@3 c5 c5@3 c5 c5@3 ~@4, ~ f4@2 f4@23 ~@6, ~@9 g4@2 ~@6 g4@2 ~@13]/4",
})).s("gm_electric_guitar_clean").gain(0.31)

// chords · pad warm · "buy "To Venus and Back""
const pad_warm = note("<~@36 A B C D E ~@17 F G H I J K L@2 M N M N ~@2>".pickRestart({
  A: "[bb3,eb4,f4,bb4]", B: "[a3,d4,e4,a4]", C: "[g3,c4,e4,g4]", D: "[f3,bb3,c4,f4]", E: "[c4,f4,c5]", F: "[bb3,f4]",
  G: "[d4,gb4]", H: "[bb3,g4]", I: "[d2,d3]", J: "[eb4,bb4]", K: "[e4,bb4]", L: "[~@3 f4@4 ~, [f2,f3]]/2", M: "[a3,d4]",
  N: "[g3,eb4]", // Cm
})).s("gm_pad_warm").gain(0.31)

// drums · clap
const clap = s("cp").struct("<~@24 [~ x ~@2 x ~@11]!8 ~@9 [~ x ~@2 x ~@11]!8 ~@9 [~ x ~@2 x ~@11]!10 ~@4>").gain(0.1)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@24 [x ~@2 x ~@12]!8 ~@9 [x ~@2 x ~@12]!8 ~@9 [x ~@2 x ~@12]!10 ~@4>").gain(0.05)

// drums · snare
const snare = s("sd").struct(`<
  A B@2 A@2 B@2 A@2 B@2 A B A B@2 A@2 B@2 A@2 B@2 A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A B A B@2 A@2 B@2 A@2 B@2 A@2 B@2 A B A
  B@2 A@2 B@2 A@2 B@2 ~@3
>`.pickRestart({
  A: "~@10 x!3 ~@3", B: "~@5 x!2 ~",
})).gain(0.15)

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  A ~@2 A@2 ~@2 A@2 ~@2 A ~ A ~@2 A@2 ~@2 A@2 ~@2 A ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A ~ A ~@2 A@2 ~@2 A@2 ~@2 A@2 ~@2 A ~ A
  ~@2 A@2 ~@2 A@2 ~@5
>`.pickRestart({
  A: "~@7 x",
})).gain(0.05)

// drums · low tom
const low_tom = s("lt").struct(`<
  A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~ A ~ A ~@2 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~@2 A ~@3 A ~ A ~ A ~ A ~ A ~ A ~@2 A
  ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "x",
})).gain(0.26)

// drums · pedal hat
const pedal_hat = s("hh").struct("<[~@11 x ~@4]!69 ~@3>").gain(0.2)

// drums · pedal hat · soft notes
const pedal_hat_soft = s("hh").struct("<[~@5 x ~@2]!69 ~@3>").gain(0.1)

// drums · open hat
const open_hat = s("oh").struct("<[x!4]!69 x ~@2>").gain(0.15)

stack(
  piano, piano_2, string_ensemble_1, bass, flute, electric_guitar_clean, pad_warm, clap, clap_soft, snare, snare_soft,
  low_tom, pedal_hat, pedal_hat_soft, open_hat
)

More by Tori Amos