Strudelify

Shide no Tori

Satoru Kosaki

KeyG majorTempo70 bpm
0:00/0:00
// Shide no Tori — Satoru Kosaki
// 70 bpm, 4/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/4 at bar 1, 4/4 at bar 1) are rendered on a constant 4/4 grid of one bar per cycle
// note: ch 1 "Violin" named as a string part, played on violin (its clarinet patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/6217325; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 39 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(70/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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.

// other · violin
const violin = note("<A B C D E B C F G H I J K H L M N ~@3 O P Q R S P T U V H I J K W@2 X@2 ~@2>".pickRestart({
  A: "~@6 e4 g4", B: "a4 b4 e4 g4 a4@2 e4 g4", C: "a4 b4 d4 g4 g4@3 d4", D: "e4@2 g4 b4 a4@2 g4 a4",
  E: "b4@4 ~@2 e4 g4", F: "e4@2 g4 b4 a4@3 g4", G: "g4@4 ~@2 [e4,e5] [g4,g5]",
  H: "[a4,a5] [b4,b5] [e4,e5] [g4,g5] [a4,a5]@2 [e4,e5] [g4,g5]", // A B E G A E G
  I: "[a4,a5] [b4,b5] [d4,d5] [g4,g5] [g4,g5]@3 [d4,d5]", J: "[e4,e5]@2 [g4,g5] [b4,b5] [a4,a5]@2 [g4,g5] [a4,a5]",
  K: "[b4,b5]@4 ~@2 [e4,e5] [g4,g5]", L: "[a4,a5] [b4,b5] [d5,d6] [a4,a5] [g4,g5]@3 [d4,d5]",
  M: "[e4,e5]@2 [g4,g5] [b4,b5] [a4,a5]@3 [g4,g5]", N: "[g4,g5]@3 ~", O: "~@7 [d4,d5]",
  P: "[e4,e5] ~@2 [d4,d5] [e4,e5] ~@2 [d4,d5]", Q: "[e4,e5] [g4,g5] [a4,a5] [b4,b5] [a4,a5]@2 ~ [g4,g5]",
  R: "[a4,a5] ~@2 [g4,g5] [a4,a5] ~@2 [g4,g5]", S: "[a4,a5] [g4,g5] [e4,e5] [g4,g5] [g4,g5]@2 ~ [d4,d5]",
  T: "[e4,e5] [g4,g5] [a4,a5] [b4,b5] [d5,d6] [b4,b5] [a4,a5] [g4,g5]", // E G A B D B A G
  U: "[e4,e5] [g4,g5] ~ [d4,d5] [e4,e5] [g4,g5] ~ [g4,g5]", // E G D E G
  V: "[a4,a5] [g4,g5] [a4,a5] [g4,g5] [g4,g5]@2 [e4,e5] [g4,g5]", // A G A G E G
  W: "[[a4,a5]@4 [b4,b5]@4 [e4,e5]@4 [g4,g5]@4 ~ [a4,a5]@8 [e4,e5]@4 ~ [g4,g5]@4 [a4,a5]@4 ~ [b4,b5]@4 [d5,d6]@5 [a4,a5]@4 [g4,g5]@12]/2", // A B E G A E G A …
  X: "[~@2 d5@5 e5@10 g5@4 b5@4 a5@12 g5@4 [g4,g5]@23]/2", // G
})).s("gm_violin").gain(0.4)

// chords · tremolo strings · "Viola"
const tremolo_strings = note("<~@8 A B C B D B C E F G H@2 G@3 H G@3 H I J K J L ~@6>".pickRestart({
  A: "~@6 [e3,e4] [g3,g4]", B: "[c4,g4] ~ [c4,g4] ~ [d4,a4] ~ [d4,a4] ~",
  C: "[d4,f#4] ~ [d4,f#4] ~ [e4,g4] ~ [e4,g4] ~", D: "[e4,g4] ~ [e4,g4] ~ [e4,g4] ~ [d4,f#4] ~",
  E: "[c4,g4] ~ [c4,g4] ~ [d4,f#4] ~ [d4,f#4] ~", F: "[e3,g3]!3 ~",
  G: "[e3,g3]@2 [e3,g3] ~ [e3,g3]@2 [e3,g3] ~ [e3,g3]@2 [e3,g3] ~ [e3,g3]@2 [e3,g3] ~", // Em
  H: "[f#3,a3] ~ [f#3,a3] ~ [f#3,a3] ~ [f#3,a3] ~ [f#3,a3] ~ [f#3,a3] ~ [f#3,a3] ~ [f#3,a3] ~", // F#m
  I: "[e3,g3]@2 [e3,g3] ~ [e3,g3]@2 [e3,g3] ~ [e3,g3]@2 [e3,g3] ~ [e3,e4]@2 [g3,g4]@2", // Em E G
  J: "[c3,g3] ~ [c3,g3] ~ [d3,a3] ~ [d3,a3] ~", K: "[d3,f#3] ~ [d3,f#3] ~ [e3,g3] ~ [e3,g3] ~",
  L: "[e3,g3] ~ [e3,g3] ~ [e3,g3] ~ [d3,f#3] ~", // Em D
})).s("gm_tremolo_strings").gain(0.3)

// chords · tremolo strings · "Viola" · soft notes
const tremolo_strings_soft = note("<~ A B A C A B A D ~@26 E@2 ~@2>".pickRestart({
  A: "[c3,g3] [d3,a3]", B: "[d3,f#3] [e3,g3]", C: "[e3,g3]@12 f#3 [e3,b3] g3@2", D: "[e3,g3]@3 ~",
  E: "[~@7 c3@18 d3@16 e3@23]/2",
})).s("gm_tremolo_strings").gain(0.2)

// other · cello · "Violoncello"
const cello = note("<~@9 A B A C A B A D E F G H E@2 G H E@2 G H I J I C K L@3 ~@2>".pickRestart({
  A: "[c2,c3] [d2,d3]", B: "[d2,f#3] [e2,e3]", C: "[e2,e3]@3 [d2,d3]", D: "[e2,e3]", E: "c3 ~ c3 ~ c3 ~ c3 ~",
  F: "d3 ~ d3 ~ d3 ~ d3 ~", G: "b2 ~ b2 ~ b2 ~ b2 ~", H: "e2 ~ e2 ~ e2 ~ e2 ~", I: "[c2,c3]!2 [d2,d3]!2",
  J: "[d2,f#3]!2 [e2,e3]!2", K: "[e2,e3]@17 [d#2,d#3]@15", L: "[~@2 [d2,d3]@18 [c#2,c#3]@19 c3@18 d3@16 e3@23]/3",
})).s("gm_cello").gain(0.3)

// bass · contrabass
const bass = note("<~@9 A B A C A B A D A E A D A@3 D A@3 D A B A C F G@2 ~@3>".pickRestart({
  A: "c1", B: "d1 e1", C: "e1@3 d1", D: "e1", E: "d1", F: "[e1,e2]@17 [d#1,d#2]@15",
  G: "[~@2 [d1,d2]@18 [c#1,c#2]@19 ~@25]/2", // D C#
})).s("gm_contrabass").gain(0.4)

// other · orchestral harp · "Harp"
const orchestral_harp = note(`<
  ~@8
  [~@8 e3 g3 a3 b3 e4 g4 a4 e5 g3 a3 b3 e4 g4 a4 e5 g5 a3 b3 e4 g4 a4 e5 g5 b5]
  ~@19
  [~@8 e3 g3 a3 b3 e4 g4 a4 e5 g3 a3 b3 e4 g4 a4 e5 g5 a3 b3 e4 g4 a4 e5 g5 b5]
  ~@3
  [~@8 e3 g3 a3 b3 e4 g4 a4 e5 g3 a3 b3 e4 g4 ~ e5 g5 a3 b3 e4 g4 a4 e5 g5 b5]
  ~@6
>`).s("gm_orchestral_harp").gain(0.35)

// other · flute
const flute = note("<~@20 A B C D E B F G H I J K L M@2 N ~@3>".pickRestart({
  A: "~@7 d5", B: "e5 ~@2 d5 e5 ~@2 d5", C: "e5 g5 a5 b5 a5@2 ~ g5", D: "a5 ~@2 g5 a5 ~@2 g5",
  E: "a5 g5 e5 g5 g5@2 ~ d5", F: "e5 g5 a5 b5 d6 b5 a5 g5", G: "e5 g5 ~ d5 e5 g5 ~ g5", H: "a5 g5 a5 g5 g5@2 e5 g5",
  I: "a5 b5 e5 g5 a5@2 e5 g5", J: "a5@4 b5@4 d5@4 g5@4 g5@11 ~ d5@4", K: "e5@2 g5 b5 a5@2 g5 a5",
  L: "b5@15 ~@9 e5@4 g5@4", M: "[a5@4 b5@4 e5@4 g5@4 ~ a5@8 e5@4 ~ g5@4 a5@4 ~ b5@4 d6@4 ~ a5@4 g5@12]/2",
  N: "~@2 d5@5 ~@25",
})).s("gm_flute").gain(0.45)

// other · flute · soft notes
const flute_soft = note("<~@35 A@2 ~@2>".pickRestart({
  A: "[~@7 e5@9 ~ g5@4 b5@4 a5@11 ~ g5@4 g5@23]/2",
})).s("gm_flute").gain(0.25)

// other · french horn · "Horn in F"
const french_horn = note("<~@29 A B A C D E@2 ~@3>".pickRestart({
  A: "c3!2 d3!2", B: "f#3!2 e3!2", C: "e3!3 ~", D: "e2@17 d#2@15", E: "[~@2 d2@18 c#2@19 ~@25]/2",
})).s("gm_french_horn").gain(0.4)

// drums · kick
const kick = s("bd").struct("<~@9 x!8 [x!4]!12 [x!2]!4 [x ~@16 x ~@14] [~ x ~@8 x ~@5] ~@4>").gain(0.25)

// drums · rim
const rim = s("rim").struct("<~@9 A ~@3 A ~@3 A ~@11 A ~@3 A ~@5>".pickRestart({
  A: "x",
})).gain(0.5)

// drums · tambourine
const tambourine = s("tb").struct("<~@11 x ~@3 x ~@23>").gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@8 A B ~@2 A B ~@2 A B ~@10 A B ~@2 A B ~@5>".pickRestart({
  A: "~@18 x!14", B: "x",
})).gain(0.25)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@8 A ~@3 A ~@3 A ~@11 A ~@3 A ~@3 B C ~>".pickRestart({
  A: "~@16 x!2 ~@14", B: "~@9 x!23", C: "x!9 ~@23",
})).gain(0.05)

// drums · claves
const claves = s("clave:2").struct("<~@9 [~ x]!24 [~@17 x ~@14] [~@5 x ~@2] ~@4>").gain(2.43)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct("<~@11 x ~@3 x ~@15 x ~@7>").gain(2.14)

stack(
  violin, tremolo_strings, tremolo_strings_soft, cello, bass, orchestral_harp, flute, flute_soft, french_horn, kick,
  rim, tambourine, crash, crash_soft, claves, jingle_bells
)