Strudelify

Plastic Love

Mariya Takeuchi

KeyF majorTempo105 bpm
0:00/0:00
// Plastic Love — Mariya Takeuchi
// 105 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5964598; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 63 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(105/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 · flute
const flute = note(`<
  A B C D A B C D A B C D A B C D E F G H I J K ~ D C D C L M N O G P G Q R S T ~@8 A B C D A B C D A B C D A B C U
>`.pickRestart({
  A: "[bb3,f4,a4]@15 ~", B: "[bb3,db4,g4]@15 ~", C: "[a3,c4,g4]@15 ~", D: "[a3,c4,f4]@15 ~", E: "[bb3,d4,f4]@15 ~",
  F: "[bb3,db4,f4]@15 ~", G: "[a3,d4,f4]@15 ~", H: "[b3,d4,f4]@15 ~", I: "[a3,bb3,d4,f4]@15 ~", J: "[bb3,db4,e4]@15 ~",
  K: "[a3,c4,f4] [a3,db4,f4]", L: "[d4,g4,b4] [e4,g4,bb4]", M: "[d4,f4,a4]@15 ~",
  N: "~@2 [d4,f4]@2 ~ [d4,f4]@2 ~@3 [d4,g4]@2 ~ [d4,g4]@2 ~", // Dm G5
  O: "~@2 [d4,g4]@2 ~ [d4,g4]@2 ~@3 [d4,f4]@2 ~ [d4,f4]@2 ~", P: "[a3,e4,g4]@15 ~", Q: "[c4,e4,g4]@15 ~",
  R: "[a3,d4,f4]@2 ~ [a3,d4,f4]@4 ~ [a3,e4,g4]@2 ~ [a3,e4,g4]@4 ~", S: "[a3,d4,gb4]@15 ~",
  T: "[d4,d5]!2 [d4,d5]@2 ~@12", U: "[d4,d5]!2 [d4,d5]@4 ~@10",
})).s("gm_flute").gain(0.15)

// other · piccolo
const piccolo = note("<~@22 A B C D C D E C@2 D C D C D C D F ~@6 A B ~@15 G>".pickRestart({
  A: "~@14 e6 f6", B: "e6 d6 c6 ~ d6@2 a5 a5@5 ~@4, ~@4 c6 ~@11", C: "d6 ~ a5 ~ c6 ~ g5 ~ a5 ~ f5 ~ g5 ~ a5 ~",
  D: "e6 ~ a5 ~ c6 ~ f5 ~ a5 ~ e5 ~ g5 ~ a5 ~", E: "d6 ~ a5 ~ b5 ~ g5 ~ a5 ~ f5 ~ g5 ~ a5 ~",
  F: "[d5,d6]!2 [d5,d6]@2 ~@12", G: "[d5,d6]!2 [d5,d6]@4 ~@10",
})).s("gm_piccolo").gain(0.25)

// other · electric guitar clean · "Electric Guitar"
const electric_guitar_clean = note("<~@38 A@3 B C D@2 E F G ~@15>".pickRestart({
  A: "[~@5 ab3 a3 c4 d4 f4 g4 f4 [ab4,a4]@2 c5 a4@9 ~@3 c5 ~ d5@2 [g4,ab4]@2 f4 g4@8 ~@3 a4 c5 d5]/3", // Amaj7 Abmaj7
  B: "e5@4 c5@4 a4 c5@2 [db5,d5]@2 ~ c5 a4, eb5 ~@15", C: "[gb4,g4] f4 d4 c4 g3 f3 d3@2 [ab3,a3]@2 f4 d4@4 ~",
  D: "[~@5 [ab4,a4,f5]@2 ~ [bb4,f5]@2 ~ [b4,f5] ~ [c5,f5] ~ [a4,f5]@2 ~ g4 [d4,f4] [c4,g4]@2 ~ f4@3 ~@4 [gb4,g4] [ab4,a4]]/2", // Db Bb5 Bdim F5 Dm C5 Gmaj7 Amaj7
  E: "f5@2 g5 f5 a5@6 g5@4 ~ f5, ~@4 ab5 ~@11", F: "~ d5 ~ a4@2 ~ g4 d4 f4 ~ e4 ~ c4 a3 g3 f3", G: "g3 d3@4 ~@11",
})).s("gm_electric_guitar_clean").gain(0.3)

// bass · electric bass finger · "Electric Bass"
const bass = note(`<
  A B C D A B C E A B C F G B C F H I J K L M N O P Q P R S T U V W X P Y Z AA AB AC AD AE AF AG AH AI O A B C D A B C D
  A B C D A B C AJ
>`.pickRestart({
  A: "g1@2 ~@5 f2 g2 f2 d2 bb1@3 b1@2", B: "c2@2 ~@5 bb1 c2!2 bb1 ~ a1 ~ g1 ~", C: "a1@2 ~@5 ab1 a1 ~ b1 ~ c2 ~ db2 ~",
  D: "d2@2 ~ d2 e2 ~@2 e2 f2 a1@3 c2@2 d2@2", E: "d2@2 ~ g2 a2 c3!2 a2 d3!2 e3@2 c3@4",
  F: "d2@2 ~@5 db2 d2!2 e2 ~ f2 ~ gb2 ~", G: "g2@2 ~@5 f2 g2 f2 d2 bb1@3 b1@2", H: "g2@2 ~@5 f2 g2@2 a1 ~ c2 ~ d2 ~",
  I: "eb2@2 ~@5 bb2 bb2@2 eb2 ~ eb2 ~ bb2@2", J: "d2@2 ~@5 a2 d2@2 d2@2 ~@2 a1@2",
  K: "d2 g2 f2 e2 d2 c2 bb1 a1 g1@2 ~ g1@2 ~ f1@2", L: "g1@2 ~@5 f2 g2 a1@3 d2@2 db2@2",
  M: "c2@2 ~@5 g1 c2 ~ c2@2 db2 ~ db2@2", N: "d2@2 ~@5 f1 d2 ~ d2@2 ~@2 e3 f3",
  O: "e3 d3 c3 ~ d3@2 a2 a2@5 ~@4, ~@4 c3 ~@11", P: "bb1@2 ~@5 f1 bb1 ~ bb1 ~@3 b1@2",
  Q: "c2@2 ~@4 g2 c3 ~ c3@2 g2 c3 g2 c2@2", R: "c2@2 ~@3 g2 c3 d3 ~@2 g2 ~ c2@2 ~@2",
  S: "e2@2 ~@4 b1 ~ a1@2 ~ a2 ~ a1 e2@2", T: "d2@2 ~ d2 d3!2 ~ c3 ~ d2 g2!2 a2 f2 d2@2",
  U: "bb1@2 ~@4 bb1 b1 c2@2 ~ c2 ~@2 c2 ~", V: "a1@2 ~@3 e2 eb2 d2!2 ~ a2 ~ g1@2 c2@2",
  W: "bb1@2 ~@4 bb2!2 ~ bb1 e2 a1 bb1@2 b1@2", X: "c2@2 ~@4 g2 c3!2 c3@2 g2 c3 g2 c2@2",
  Y: "c2@2 ~@4 g2@2 d3@3 c3@5, ~@8 c3 ~@7", Z: "bb1@2 ~ bb1@2 ~ g1 ab1 a1@2 ~ a1@2 ~ e2 eb2", AA: "d2",
  AB: "d2!2 d2@2 ~@12", AC: "g1@2 ~@5 g1 g1@2 ~@6", AD: "eb2@2 ~@5 eb2!2 ~ eb2@2 ~@2 eb2@2",
  AE: "d2@2 ~@5 c2 d2 c2 a1 ~ c2 a1 g1 f1", AF: "g1 ~@4 g1 ~ f1", AG: "g1@2 ~@5 g1!4 ~ d2 ~ db2 ~",
  AH: "c2@2 ~@5 a1 c2@2 ~ a1 c2 ~ db2 ~", AI: "d2 ~@6 c2 d2@2 ~@4 e3 f3", AJ: "d2!2 d2@4 ~@10",
})).s("gm_electric_bass_finger").gain(0.4)

// drums · kick
const kick = s("bd").struct("<[x!2]!62 ~>").gain(0.3)

// drums · clap
const clap = s("cp").struct("<[~ x ~ x]!38 [~@5 x ~ x ~@2 x ~ x ~@3] ~@24>").gain(0.3)

// drums · clap · soft notes
const clap_soft = s("cp").struct("<~@38 [~@6 x ~ x!2 ~ x ~@3 x] ~@24>").gain(0.15)

// drums · snare
const snare = s("sd").struct("<[~ x ~ x]!38 [x!3 ~@13] [~ x ~ x]!23 ~>").gain(0.3)

// drums · hihat
const hihat = s("hh").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B ~ A B A B A B A B A B A B A B A B A B A B
  A B A ~
>`.pickRestart({
  A: "~@6 x!2 ~ x!2 ~@5", B: "~@6 x!2 ~ x ~@2 x ~@3",
})).gain(0.3)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~@2
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@38 x ~@23 x>").gain(0.3)

stack(flute, piccolo, electric_guitar_clean, bass, kick, clap, clap_soft, snare, hihat, open_hat, crash)