Strudelify

lost painting

Michiru Yamane

KeyA majorTempo150 bpm
0:00/0:00
// lost painting — Michiru Yamane
// 150 bpm, 6/8, 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: metre changes (2/4 at bar 1, 4/4 at bar 3, 9/8 at bar 5, 6/8 at bar 7) are rendered on a constant 6/8 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/5457283; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 87 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(150/3)

// 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 · epiano1 · "Piano"
const epiano1 = note(`<
  A B@4 C D@2 E F G H I C D@2 E F G J@2 K@2 L M K@2 N O P@2 Q@2 P@2 R@2 S T@2 U V W@2 X@3 Y@2 Z@3 AA AB@3 AC AD AE@2 AF
  AG AH AI AJ@2 AK@2 AA AL@3 AC AM AN@2 AF AO AP AQ AR AS AT@5
>`.pickRestart({
  A: "~@11 f#5@2 ~ g#5@2",
  B: "[g#5 a5@4 g#5@2 ~ a5@2 g5 g#5@2 e5@2 c#5@9 ~ f5 f#5@13 ~ [c#4,f4,a4,g#5]@23 ~, [d4,f#4,a4]@9 ~ [c#4,e4,g#4]@9 ~@6 [c4,d#4,f#4]@14 ~@25]/4", // C# D C#m Cdim
  C: "~ f#4, [e3,a3,c#4]@15 ~", D: "[[e3,g#3,b3]@15 ~@9 b4@5 c#5@3, c#5@23 ~@9, ~@16 [f#3,a3,e4]@15 ~]/2",
  E: "a4 g#4, [e3,f#3,c#4]@15 ~", F: "f#4@8 g#4@5 a4@3, [d3,f#3,b3]@15 ~", G: "g#4 e4, [e3,b3,c#4]@15 ~",
  H: "[f#3,b3,c#4,f#4]@15 ~", I: "[f#3,a#3,c#4,c#5]@15 ~", J: "[[f#3,b3,c#4]@15 ~ [f#3,a#3,c#4]@15 ~, f#4@15 ~]/2",
  K: "[c#5@8 b4@8 b4@8 a4@5 b4@3, [a3,c#4]@15 ~, f#3@15 ~ e4@15 ~]/2", L: "c#5 g#4, [g#3,b3,c#4]@15 ~",
  M: "g#4 c#4, [f3,g#3,b3]@15 ~", N: "c#5 e5, [g#3,b3,c#4]@15 ~", O: "d5 c#5, [f3,g#3,b3]@15 ~",
  P: "[e3@15 ~@9 g#5@5 a5@3, [a3,c#4]@15 ~, f#5@23 ~@9, ~@16 f#3@15 ~]/2", // A
  Q: "[g#5@5 e5@8 ~@8 c#5@10 ~, [e3,g#3]@15 ~ [f3,g#3,b3]@15 ~, ~@13 e5@8 ~@11]/2", // E Fdim
  R: "[c#6@5 g#5@8 ~@8 c#5@10 ~, [e3,g#3]@15 ~ [e3,g3,a#3]@15 ~, ~@13 g#5@8 ~@11]/2", // E Edim
  S: "c6 c#6@7 b5@5 c#6@3, [f#3,a3,c#4]@15 ~", T: "[[f#3,a3,c4]@15 ~@9 b5@8, a5@23 ~@9, ~@16 [g#3,b3,c#4]@15 ~]/2",
  U: "[g#3,b3,d4,g#5]@15 ~", V: "[a3,a5]@8 [b3,b5]@5 [a3,a5]@3", W: "[[g#3,g#5]@13 [c#3,f3,a3,c#4,c#6]@18 ~]/2",
  X: "[~@8 f#4@5 ~@3 [e3,g#3,b3]@15 ~@9 b4@5 c#5@3, [e3,a3,c#4]@15 ~@17 [f#3,a3,e4]@15 ~, ~@13 c#5@25 ~@10]/3", // E A F#m7
  Y: "[a4@5 g#4@8 ~@11 g#4@5 a4@3, [e3,f#3,c#4]@15 ~ [d3,f#3,b3]@15 ~, ~@13 f#4@10 ~@9]/2", // F#7 Bm
  Z: "[g#4@5 e4@8 ~@19 [f#3,a#3,c#4]@15 ~, [e3,b3,c#4]@15 ~ [f#3,b3,c#4]@15 ~@17, ~@13 f#4@15 ~ c#5@18 ~]/3", // F# C#m7 F#sus4
  AA: "c#5@13 b4@3, [f#3,a3,c#4]@15 ~", // F#m
  AB: "[c#5@8 ~@32 b4@5 f#4@3, [e3,a3,c#4]@15 ~ [e3,g#3,c#4]@15 ~ [e3,g#3,b3]@15 ~, ~@8 e5@13 d#5@18 ~@9]/3", // A C#m E
  AC: "c#5@13 b4@3, [e3,b3,c#4]@15 ~", AD: "c#5 e5, [e3,a#3,c#4]@15 ~",
  AE: "[d#5@5 e5@3 ~@16 f#5@5 g#5@3, [f#3,b3,d#4]@15 ~ [f#3,a3,d#4]@15 ~, ~@8 f#5@15 ~@9]/2", // B D#dim
  AF: "a5@8 g#5@5 a5@3, [f#3,a3,c#4]@15 ~", AG: "g#5@5 e5@3 c#5@8, [e3,b3,c#4]@15 ~",
  AH: "f#5@8 e5@5 f#5@3, [f#3,b3,d4]@15 ~", AI: "e5@5 c#5@3 a4@8, [e3,b3,c#4]@15 ~",
  AJ: "[b4@5 a4@3 b4@13 g#4@3 a4@5 b4@3, [g3,b3,d4]@23 ~ [e3,g#3,c4]@8]/2", // G Eaug
  AK: "[c#5@5 b4@3 ~@8 c#4@5 ~@3 d#4@3 f#4@2 g#4@3, [f#3,g#3,c#4]@15 ~ [f3,g#3]@15 ~, ~@8 c#5@13 c#4@10 ~]/2", // F#sus2 Fm
  AL: "[c#5@5 ~@32 b4@5 ~ f#4@5, [e3,a3,c#4]@15 ~ [e3,g#3,c#4]@15 ~ [e3,g#3,b3]@15 ~, ~@5 e5@13 ~ d#5@18 ~@11]/3", // A C#m E
  AM: "c#5@5 e5@10 ~, [e3,a#3,c#4]@15 ~", // A#dim
  AN: "[d#5@3 e5@2 ~@19 f#5@3 g#5@5, [f#3,b3,d#4]@15 ~ [f#3,a3,d#4]@15 ~, ~@5 f#5@18 ~@9]/2", // B D#dim
  AO: "b5@3 g#5@5 e5@8, [e3,b3,c#4]@15 ~", AP: "f#5@8 g#5@5 a5@3, [f#3,b3,d4]@15 ~",
  AQ: "g#5@3 e5@5 b4@8, [e3,b3,c#4]@15 ~", AR: "a4@8 g#4@5 f#4@3, [f#3,a3,c#4]@15 ~",
  AS: "g#4@3 e4@5 c#4@8, [f3,g#3,b3]@15 ~", AT: "[[e3,a3,c#4,f#4]@13 [c#3,f3,a3,b3,f4,g#4,b4,c#5]@63 ~@4]/5",
})).s("gm_epiano1").gain(0.3)

// bass · fretless bass · "Baixo elétrico"
const bass = note(`<
  ~@5 A B C D E F G H A B C D E I G J K L F M N O P Q R S T U R S T V K W T X Y Z@2 A B C D E F G H AA AB AC AD AA AE AF
  AG K AH AI AJ AK AL D AM AA AB AC AD AA AE AF AG K AH E AN K AM AO@5
>`.pickRestart({
  A: "f#2@13 f#2@3", B: "e2@13 e2@3", C: "d2@13 d2@3", D: "c#2@13 f#2@3", E: "b1@13 c2@3", F: "c#2@13 e2@3", G: "f#2",
  H: "f#1", I: "c#2", J: "f#1@13 c#2@3", K: "d2@13 f#2@3", L: "a2@13 d2@3", M: "g#2 f2", N: "f#2@13 d2@3",
  O: "a1@13 d2@3", P: "e2 g#2", Q: "b2 f2", R: "f#2@13 f2@3", S: "e2@13 g#2@3", T: "c#2@13 g#2@3", U: "f2 c#2",
  V: "e2 c#2", W: "a2 d2", X: "e2 g#1", Y: "a1@8 b1@5 a1@3", Z: "[g#1@13 c#2@19]/2", AA: "f#2@13 c#2@3",
  AB: "f#1@8 f#2@5 g#2@3", AC: "a2@13 e2@3", AD: "a1@8 a2@3 b2@2 g#2@3", AE: "f#1 a#1", AF: "b1@13 f#2@3",
  AG: "d#2@8 b1@5 c#2@3", AH: "c#2@13 c2@3", AI: "b1@13 a#1@3", AJ: "a1@13 g#1@3", AK: "g1@13 d2@3",
  AL: "b1@8 g#1@5 c2@3", AM: "c#2@13 f2@3", AN: "c#2@8 e2@3 c#2@5", AO: "[f#2@13 c#2@67]/5",
})).s("gm_fretless_bass").gain(0.3)

// drums · kick
const kick = s("bd").struct(`<
  ~@5 A B ~ B A B A B A B ~ B A B A ~ C B C ~ C B C ~ C B C ~ C B C ~ C D C ~@4 A B ~ B A B A B C B C ~ C B C ~ C B C ~
  C B C ~ C B C ~ C B C ~ C B C ~@3 A ~@4
>`.pickRestart({
  A: "x ~@12 x ~@2", B: "~@13 x ~@2", C: "x", D: "~ x",
})).gain(0.23)

// drums · rim
const rim = s("rim").struct(`<
  ~@6 A ~ A ~ A ~ A ~ A ~ A ~ A ~@3 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@4 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@7
>`.pickRestart({
  A: "x",
})).gain(0.23)

// drums · snare
const snare = s("sd").struct("<~@4 A ~@15 A ~@20 B ~@38 A@2 ~@5>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.23)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@5 A B C B C B C D A B C B C B C ~@24 E F G F G F G D E G@3 E G@3 E G@3 E G@3 ~@19
>`.pickRestart({
  A: "~@8 x ~@4 x ~@2", B: "x!2", C: "x ~@7 x ~@4 x ~@2", D: "x", E: "~@5 x ~@2 x ~@4 x ~@2", F: "x ~@4 x ~@2 x ~@7",
  G: "x ~@4 x ~@2 x ~@4 x ~@2",
})).gain(0.23)

// drums · mid tom
const mid_tom = s("mt").struct("<~@4 A ~@15 A ~@20 B C ~@37 D E ~@5>".pickRestart({
  A: "~@5 x ~@2 x ~@7", B: "~@13 x ~@2", C: "x", D: "~ x", E: "~@3 x ~@4 x ~@7",
})).gain(0.23)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@5 A B ~ B ~ B ~ C A B ~ B ~ B ~@23 B ~ A B ~ B ~ B ~ C A ~@3 A ~@3 A ~@3 A ~@16 D ~@5
>`.pickRestart({
  A: "x", B: "~@13 x ~@2", C: "~@3 x ~@4 x ~@7", D: "~@11 x ~@4",
})).gain(0.23)

// drums · high tom
const high_tom = s("ht").struct("<~@4 A ~@15 A ~@20 B ~@38 A ~@6>".pickRestart({
  A: "~@3 x ~@12", B: "x",
})).gain(0.23)

// drums · ride
const ride = s("rd").struct("<~@21 A@16 B A@3 ~@27 C B@3 C B@3 C B@3 D ~@6>".pickRestart({
  A: "x ~@7 x ~@4 x ~@2", B: "x ~@4 x ~@2 x ~@4 x ~@2", C: "~@5 x ~@2 x ~@4 x ~@2", D: "~@11 x ~@4",
})).gain(0.23)

// drums · splash
const splash = s("cr").struct("<~@68 A ~@3 A ~@3 A ~@5 B ~@4>".pickRestart({
  A: "x", B: "x ~@12 x ~@2",
})).gain(0.23)

stack(epiano1, bass, kick, rim, snare, hihat, mid_tom, open_hat, high_tom, ride, splash)