Strudelify

sonic forces - theme of infinite

Tomoya Ohtani and Jun Sunoe

KeyC♯ minorTempo140 bpm
0:00/0:00
// sonic forces - theme of infinite — Tomoya Ohtani and Jun Sunoe
// 140 bpm, 4/4, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: ch 2 "Piano, FL Keys #5" named as a piano, played on piano (its choir aahs patch is not one)
// note: Transcription provider: pdmx. https://musescore.com/score/4552506; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 77 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(140/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.

// bass · pad sweep · "Contrabass, FL Keys"
const bass = note(`<
  [c#1@3 c#1@3 c#1@2]
  [c#2@3 c#2@3 c#2@2 c#2@2 c#2@2 c#2@2 c#2@2]
  [c#1@3 c#1@3 c#1@2]
  [c#2@3 c#2@3 c#2@2 c#2@2 c#2@2 c#2@2 c#2@2]
  [a1@3 a1@3 a1@2]
  [a1@3 a1@3 a1@2 a1@2 a1@2 a1@2 a1@2]
  [a1@3 a1@3 a1@2]
  ~@70
>`).s("gm_pad_sweep").gain(0.5)

// chords · piano · "Piano, FL Keys #5"
const piano = note(`<
  A B A B A B A ~@25 C D E@2 C D E@2 ~ F@2 G@2 H@2 I@2 F@2 G@2 H@2 I@2 J@2 K@2 L@2 M@2 J@2 K@2 L@2 M@2 ~@4
>`.pickRestart({
  A: "[g#3,c#4,e4,g#4]@15 ~ [a3,c#4,e4,a4]@15 ~", B: "[g#3,c#4,e4,g#4]@15 ~ [f#3,c#4,e4,f#4]@15 ~", C: "e5", D: "d#5",
  E: "c#5/2", F: "[c#5@3 e5]/2", G: "d#5/2", H: "e5/2", I: "f#5/2", J: "[c#4@3 e4@3 c#4@2 a4@4 [g#4,e5]@4, c#5@3 ~]/2",
  K: "[c#4@3 e4@3 c#4@2 a4@4 g#4@4, d#5]/2", L: "[c#4@3 e4@3 c#4@2 a4@4 g#4@4, e5]/2", M: "[f#4,f#5]/2",
})).s("gm_piano").gain(0.4)

// other · lead 1 square · "Mallet Synthesizer, FL Keys #6"
const lead_1_square = note(`<
  ~@7 A ~@6 B@2 ~@15 C D@2 E F G@2 H ~ I J@2 K@2 L@2 M@2 J@2 N@2 O P Q R S T S T S T U@2 S T S T S T U@2 V@4
>`.pickRestart({
  A: "c#5 ~@2 [c#2,c#3] ~ [c#2,c#3] ~@2 [c#2,c#3] ~@2 [c#2,c#3] ~ [c#2,c#3] ~ c#3 c#5 ~@2 [c#2,c#3]!3 ~@2 [c#3,c#4]@8", // C#
  B: "c#5/2", C: "~@10 c#4 ~ c#4 ~ c#4 ~", D: "[c#4@3 g#4@3 f#4@4 g#4 ~ g#4 ~ e4 ~]/2", E: "c#4 ~",
  F: "~@12 c#4 ~ c#4 ~", G: "[c#4@3 g#4@3 f#4@4 g#4 ~ a4 ~ g#4 ~]/2", H: "g#4 ~",
  I: "c#3 ~@2 [c#0,c#1] ~ [c#0,c#1] ~@2 [c#0,c#1] ~@2 [c#0,c#1] ~ [c#0,c#1] ~ c#1 c#3 ~@2 [c#0,c#1]!3 ~@2 [c#4,e4]@4 [c#4,e4,f#4]@4, ~@5 [c#4,e4] [c#2,c#3]@2", // C# C#m F#7 C#m C#
  J: "[[c#4,e4,g#4]@3 [c#4,f#4,a4]@3 [c#4,e4,g#4]@3 [c#4,e4,f#4]@3 [c#4,e4,g#4]@3 [c#4,e4,a4]]/2", // C#m F#m C#m F#7 C#m A
  K: "[[b3,d#4,f#4]@14 [b3,c#4,e4] [b3,d#4,f#4]]/2", // B C#m7 B
  L: "[[a3,e4,g#4]@3 [a3,f#4,a4]@3 [a3,e4,g#4]@3 [a3,c#4,e4]@3 [a3,g#4,b4]@2 [a3,e4,g#4]@2]/2", // Amaj7 D Amaj7 A E Amaj7
  M: "[[b3,d#4,f#4]@14 [b3,c#4,e4] [b3,e4,f#4]]/2", N: "[[b3,d#4,f#4]@7 e4]/2", O: "c#4 e4 c#4 e4",
  P: "c#4@2 e4@2 c#4@2 ~ f#4", Q: "f#4@2 f#4!2 f#4@2 g#4 a4", R: "a4@2 g#4 g#4@5", S: "c#4@3 e4@3 c#4@2", T: "a4 g#4",
  U: "f#4/2", V: "c#4/4",
})).s("gm_lead_1_square").gain(0.4)

// other · lead 1 square · "Mallet Synthesizer, FL Keys #6" · soft notes
const lead_1_square_soft = note("<A B A B A B A C ~@32 D ~@36>".pickRestart({
  A: "g#5 ~ c#5 ~ a5 ~ c#5 ~", B: "g#5 ~ c#5 ~ f#5 ~ c#5 ~", C: "~@3 [b2,c3,d3,d#3,b3,c4,d4,d#4]",
  D: "~@3 [b1,c2,d2,d#2,b2,c3,d3,d#3]",
})).s("gm_lead_1_square").gain(0.25)

// drums · kick
const kick = s("bd").struct(`<
  ~@8 A B A B A B C D A B A B@4 E A B A B@4 E F G H I F G H J ~ K@3 L K@3 M K@3 L K@3 M K@3 L K@3 M K@3 L K@3 M ~@4
>`.pickRestart({
  A: "x ~@2 x ~@4", B: "x ~@2 x ~@2 x!2 ~@8", C: "x ~@2 x ~@2 x ~@4 x ~@2 x ~", D: "x ~@2 x ~@2 x ~@3 x ~@3 x ~",
  E: "x ~@2 x ~@2 x!2 ~@6 x ~", F: "x ~@2 x ~ x ~ x", G: "x ~@5 x ~@3 x ~@2 x ~@2", H: "x ~ x ~ x!3 ~@9",
  I: "x ~ x ~ x!3 ~@3 x ~@3 x ~", J: "x!3 ~ x!3 ~@3 x ~@3 x ~", K: "x!4 ~@4", L: "x!4 ~ x!2 ~",
  M: "~@2 x!3 ~ x ~@5 x ~@3",
})).gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  ~@8 A@7 B A@17 C A@3 C A B ~ A@3 D A@3 E A@3 D A@3 E A@3 D A@3 E A@3 D A@3 E ~@3 F
>`.pickRestart({
  A: "~ x", B: "~@8 x ~@3 x!2 ~@2", C: "~@8 x ~@2 x ~@2 x ~", D: "~@8 x!2 ~@6", E: "x!2 ~@4 x!2 ~@8", F: "~@3 x",
})).gain(0.4)

// drums · clap
const clap = s("cp").struct("<[~ x]!6 ~@71>").gain(0.4)

// drums · low tom
const low_tom = s("lt").struct("<~@19 A ~@7 A ~@11 A ~@8 B ~@7 B ~@7 B ~@7 B ~@4>".pickRestart({
  A: "~@15 x", B: "~@3 x!3 ~@3 x!2 ~ x!4",
})).gain(0.5)

// drums · hihat
const hihat = s("hh").struct("<A B A B A B ~@2 C@12 ~@4 C@4 ~@4 C@7 D E ~@36>".pickRestart({
  A: "~@2 x ~@2 x!2 ~ x ~@3 x ~ x ~", B: "x ~@3 x ~ x ~@3 x ~ x ~@3 x ~@5 x ~ x ~@3 x!4",
  C: "x ~@3 x ~@3 x!9 ~@3 x ~@3 x!8", D: "x ~@3 x ~@3 x!9 ~@3 x ~@3 x!7 ~", E: "x",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<~@19 A ~@7 A ~@11 B ~@8 C ~@7 C ~@7 C ~@7 C ~@4>".pickRestart({
  A: "~@13 x!2 ~", B: "~@15 x", C: "~ x!2 ~@4 x!2 ~@2 x ~@4",
})).gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@8 A@12 B@4 A@4 B@4 ~@9 C@7 ~ C@7 ~ B@7 ~ B@7 ~@5>".pickRestart({
  A: "~ x ~ x", B: "x!4", C: "x!2",
})).gain(0.25)

// drums · open hat · soft notes
const open_hat_soft = s("oh").struct("<~@41 [~ x ~ x]!7 ~ [~ x ~ x]!7 ~@21>").gain(0.1)

// drums · high tom
const high_tom = s("ht").struct("<~@19 A ~@7 A ~@20 B ~@7 B ~@7 B ~@7 B ~@4>".pickRestart({
  A: "~@3 x", B: "x ~@2 x ~@4",
})).gain(0.5)

// drums · crash
const crash = s("cr").struct(`<
  ~@8 A ~@3 A ~@3 A ~@3 B@4 A ~@3 B@4 A ~@3 A ~@4 C@7 ~ C@7 ~ C@7 ~ C@7 ~ A ~@3
>`.pickRestart({
  A: "x", B: "x!4", C: "x!2",
})).gain(0.25)

// drums · shaker
const shaker = s("sh").struct("<A B A B A B ~@2 C@12 ~@4 C@4 ~@4 C@7 D E ~@36>".pickRestart({
  A: "~@2 x ~@2 x!2 ~ x ~@3 x ~ x ~", B: "x ~@3 x ~ x ~@3 x ~ x ~@3 x ~@5 x ~ x ~@3 x!4",
  C: "x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x!8", D: "x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x ~@3 x!7 ~", E: "x",
})).gain(0.3)

stack(
  bass, piano, lead_1_square, lead_1_square_soft, kick, snare, clap, low_tom, hihat, mid_tom, open_hat, open_hat_soft,
  high_tom, crash, shaker
)