Strudelify

A Certain Smile from "A Certain Smile"

Mathis

KeyF majorTempo88 bpm
0:00/0:00
// A Certain Smile from "A Certain Smile" — Mathis
// 88 bpm, 4/4, key F 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: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 60 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(88/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 · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~@7 A B C@2 D E F@2 G H I J K L@2 ~ A B C@2 D E C M N O P Q R S T@2 U V W@2 X Y W Z AA AB AC AD ~@9
>`.pickRestart({
  A: "~@4 [bb3,d4,f4] ~@7 [g3,bb3,d4,f4] ~@3, ~@7 g3@2 ~@23", B: "~@4 [c4,d4,e4,g4] ~@7 [c4,d4,e4,g4] ~@3",
  C: "~@4 [f3,a3,c4,f4] ~@7 [f3,a3,c4,f4] ~@3", D: "~@4 [g3,bb3,d4,g4] ~@7 [g3,bb3,d4,g4] ~@3",
  E: "~@4 [c4,d4,e4,g4] ~@3 [c4,e4,g4,bb4] ~@7", // C C7
  F: "[~@4 [f3,a3,c4,f4] ~@7 [f3,a3,c4,f4] ~@3 f4 ~@15, ~@15 f3 ~@16, ~@31 [a3,c4]@2 ~@31]/2", // F Am
  G: "~@7 [e4,g4,b4]@2 ~@15 [e4,g4,b4]@2 ~@6", H: "~@4 [a3,db4,e4,g4] ~@3 [b3,e4,g4] ~@3 [a3,db4,e4] ~@3",
  I: "~@4 [a3,d4,f4] ~@7 [a3,d4,f4] ~@3", J: "~@4 [g3,a3,b3,d4] ~@7 [g3,a3,b3,d4] ~@3",
  K: "~@4 [c4,e4,g4] ~@7 [c4,e4,g4] ~@3", // C
  L: "[[d4,f4,a4] ~@7 [b3,d4,f4] ~@7 [bb3,d4,f4] ~@15, ~@15 g3@2 ~@14 g3@2 ~@31]/2", // Dm Bdim Bb
  M: "e4@2 ~@5 [a3,c4]@2 ~@6 [g3,c4,eb4]@2 ~@7 [f3,a3,c4,f4]@2 ~@6, ~@3 f3 ~@12", N: "~@4 [bb3,d4,f4] ~@7 [d4,f4] ~@3",
  O: "~@4 [d4,gb4,a4] ~@3 [eb4,gb4,a4] ~@3 [d4,gb4,a4] ~@3", P: "~@4 [g3,bb3,d4] ~@3 [g3,bb3,d4] ~@3 [g3,bb3,d4] ~@3",
  Q: "[bb3,db4,f4] ~@3 [db4,f4,g4] ~@11, ~@7 bb3@2 ~@23", R: "~@4 [f3,a3,c4,f4] ~@7 [d3,f3,a3,d4] ~@3",
  S: "~@4 [g3,bb3,d4,f4] ~@3 [g3,c4,d4,e4] ~@7", // Gm7 C
  T: "[~@4 [f3,a3,c4,f4] ~@7 [g3,a3,c4,f4] ~@3 f4 ~@15, ~@15 [f3,a3] ~@16, ~@31 c4@2 ~@31]/2", // F
  U: "~@4 [b3,eb4,gb4] ~@7 [ab3,b3,eb4,gb4] ~@3, ~@7 ab3@2 ~@23", V: "~@4 [db4,eb4,f4,ab4] ~@7 [db4,eb4,f4,ab4] ~@3",
  W: "~@4 [gb3,bb3,db4,gb4] ~@7 [gb3,bb3,db4,gb4] ~@3", X: "~@4 [ab3,b3,eb4,ab4] ~@7 [ab3,b3,eb4,ab4] ~@3",
  Y: "~@4 [db4,eb4,f4,ab4] ~@3 [db4,f4,ab4,b4] ~@7", // Db Db7
  Z: "~@7 [bb3,db4]@2 ~@6 [ab3,db4,e4]@2 ~@7 [db4,gb4]@2 ~@6, ~@6 gb3@2 ~@15 [gb3,bb3]@2 ~@7", // Bbm Dbm Gb5 Gb
  AA: "~@4 [b3,eb4,gb4] ~@7 [eb4,gb4] ~@3", AB: "~@4 [eb4,g4,bb4] ~@3 [e4,g4,bb4] ~@3 [eb4,g4,bb4] ~@3",
  AC: "~@4 [ab3,b3,eb4] ~@3 ab3 ~@3 [ab3,b3,eb4] ~@3", AD: "[b3,d4,gb4] ~@3 [d4,gb4,ab4] ~@11, ~@7 b3@2 ~@23",
})).s("gm_acoustic_guitar_nylon").gain(0.22).pan(0.7)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@7 A B C D E F G H I J K L M N O ~ A B C D E F G H P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI ~@9
>`.pickRestart({
  A: "g1@9 ~@7 g1@16", B: "c2@8 ~@8 c2@15 ~", C: "f1@8 ~@8 f1@9 ~@7", D: "f1@13 ~@3 f1@15 ~", E: "g1@13 ~@3 g1@15 ~",
  F: "c2@13 ~@3 c2@14 ~@2", G: "f1@13 ~@3 f1@13 ~@3", H: "f1@3 ~@29", I: "e2@13 ~@3 e2@15 ~",
  J: "a1@14 ~@2 e2@8 a1@7 ~", K: "d2@7 ~ d2@8", L: "g1@7 ~ g1@7 ~", M: "c2@31 ~", N: "d2@15 ~ g1@13 ~@3", O: "g1",
  P: "bb1@7 ~ f2@8", Q: "d2@7 ~ d2@7 ~", R: "g1@15 ~ d2@8 g1@6 ~@2", S: "bb1@5 ~@3 bb1@3 ~@21", T: "f1 d1",
  U: "g1@7 ~ c2@8", V: "f1@7 ~ c2@8", W: "f1 ~@15", X: "ab1@9 ~@7 ab1@16", Y: "db2@8 ~@8 db2@15 ~",
  Z: "gb1@8 ~@8 gb1@9 ~@7", AA: "gb1@13 ~@3 gb1@15 ~", AB: "ab1@13 ~@3 ab1@15 ~", AC: "db2@13 ~@3 db2@14 ~@2",
  AD: "gb1@13 ~@3 gb1@13 ~@3", AE: "gb1@3 ~@29", AF: "b1@7 ~ gb2@8", AG: "eb2@7 ~ eb2@7 ~",
  AH: "ab1@15 ~ eb2@8 ab1@6 ~@2", AI: "b1@5 ~@3 b1@3 ~@21",
})).s("gm_acoustic_bass").gain(0.33)

// chords · piano · "A.PIANO 1"
const piano = note("<~@4 A@3 B@2 C@2 D@2 E@2 ~@22 F@2 ~@21>".pickRestart({
  A: "[~@21 [c5,f5,c6,f6]@3 ~@8, ~@31 c4@31 [a4,a5]@9 ~@25, ~@31 c5@14 [c5,c6]@9 [c5,c6]@9 ~@33, ~@9 [f4,f5]@7 ~@8, ~@41 [a4,a5]@9 [a4,a5]@9 [e5,e6]@5 ~@32]/3", // F5 A C F A E
  B: "[~@8 bb5@7 ~ d6@8 ~@8 e6@25 ~@7, ~@8 g5@49 ~@7, ~@15 bb5@41 ~@8, ~@24 [d6,f6]@33 ~@7, ~@31 c6@26 ~@7]/2", // Dm
  C: "[~@8 a5@8 ~@8 [e6,g6]@7 ~ f6@22 ~@10, ~@8 f5@23 d6@23 ~@10, ~ [a5,c6] ~@2]/2", // Em Am
  D: "[~@8 bb5@8 d6@8 [d6,f6]@7 ~ e6@16 ~@16, ~@7 g5@24 c6@17 ~@16, ~ bb5 ~@2]/2", // Dm
  E: "[~@8 a5@8 ~@8 [e6,g6]@7 ~ f6@9 ~@23, ~@8 f5@23 c6@10 ~@23, ~@16 [a5,c6]@17 ~@31]/2", // Em Am
  F: "[~@8 [f4,f5]@8 [a4,a5]@8 [a4,d5,a5,d6]@7 ~ [a4,c5]@4 ~@28, ~@8 [c4,c5]@23 a5@8 ~@25, ~@16 [f4,f5]@16 c6@7 ~@25]/2", // F A D5 Am C F
})).s("gm_piano").gain(0.33).pan(0.2)

// other · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note("<A@2 B C@3 ~@11 D E F G H I ~@15 J K@2 L@2 M N O P ~ Q R S T@3 U@2 ~@4>".pickRestart({
  A: "[~@7 [bb4,bb5]@4 ~ [d5,d6]@4 [f5,f6]@5 [e5,e6]@5 [c5,c6]@4 [e5,e6]@4 ~ [g5,g6]@5 [f5,f6]@5 [d5,d6]@5 [f5,f6]@4 [a5,a6]@5 [g5,g6]@5]/2", // Bb D F E C E G F …
  B: "[d5,d6]@4 [f5,f6]@5 [a5,a6]@4 ~@10 [a5,a6]@9, ~@7 [c6,c7]@6 ~@3", // D F A C
  C: "[~ [f5,f6]@9 ~ [d5,d6]@9 ~ [c5,c6]@9 [bb4,bb5]@9 [g4,g5]@10 ~@10 [f4,f5]@37, ~@29 c5@19]/3", D: "~ a4 [b3,b4] c4",
  E: "[d4,d5]@8 e4@8 f4@7 ~ [e4,e5]@3 ~ f4@3 ~, ~@27 f5@4 ~", // D E
  F: "gb4@3 ~ g5@2 ~@2 [b4,b5]@3 [c5,c6]@3 ~@2 [g4,g5]@8 gb4@4 g4@4, ~@3 g4@3 ~@26", // B C G
  G: "f5@8 e5@4 d5@4 c5@8 d5@7 ~, f4@11 ~@21", H: "~@4 f5@3 d6 [bb4,f6]@2 [a4,e6]@2 d6@2 c6@2", I: "[e4,bb5] ~@15",
  J: "~@8 [db4,db5]@8 ~ [gb4,gb5]@7 [bb4,bb5]@8", K: "[[ab4,ab5]@5 [db4,db5] [f4,f5] [ab4,ab5]]/2",
  L: "[[gb4,gb5]@39 ~ [db4,db5]@8 [gb4,gb5]@8 [db5,db6]@8]/2", M: "[b4,b5]@8 [b4,b5]@7 ~ [b4,b5]@7 ~ [b4,b5]@7 ~",
  N: "[b4,b5]@7 ~ [bb4,bb5]@3 [b4,b5]@3 ~ [db5,db6]@8 [ab4,ab5]@8 ~", O: "[bb4,bb5] [ab4,ab5] [gb4,gb5] [db4,db5]",
  P: "[bb3,bb4]@2 b4 ~", Q: "~@8 eb4@8 e4@8 eb4@7 ~", R: "gb4@16 ab4@15 ~", S: "gb4@3 ~@5",
  T: "[~@59 [d4,f4]@36 ~, bb3@34 ~@5 b3@56 ~, ~@17 eb4@34 ~@45]/3", // Dm
  U: "[~@8 [db5,db6]@4 ~ [bb5,bb6] ~ [b5,b6]@3 [bb5,bb6]@3 [gb5,gb6]@4 [db5,db6]@3 [e4,e5]@21 ~@15, db4@27 ~@37, ~ bb3@27 ~@36, ~@12 [gb5,gb6]@3 ~@49]/2", // Db Bb B Bb Gb Db E Gb
})).s("gm_string_ensemble_1").gain(0.22).pan(0.2)

// other · string ensemble 1 · "STRINGS" · soft notes
const string_ensemble_1_soft = note("<~@4 A ~@12 B C D E F ~@24 G H@2 ~@5 I@5 ~>".pickRestart({
  A: "~@17 [e4,e5]@9 ~@6", B: "~ [a2,a3] b2 [c3,c5]", C: "d3@8 [e3,e5]@8 [f3,f5]@8 e3@3 ~ f3@3 ~",
  D: "[gb3,gb5]@3 g3@2 ~@3 b3@3 c4@2 ~@11 gb5@4 g5@4, e4@11 ~@5, ~@16 g3@15 ~", // Gb
  E: "f6@2 e6 d6 [a3,a4,c6]@2 [b3,b4,b5]@2, a3@11 ~@21", // Am B
  F: "~@7 c4@6 ~@2 [a4,e6] ~@8 g4@4 f4@4, ~@13 [f4,c6]@3 ~@16, ~@7 g4 ~@8", G: "~@16 b3@7 ~ [db4,db5]@8",
  H: "[[d4,d5] [eb4,eb5]@4 ~@3]/2", // D Eb
  I: "[~@28 e6@21 ~ [eb5,eb6]@18 ~@2 [d5,d6]@18 ~ db4@22 ~@8 [bb4,gb5,gb6]@41, ~@49 eb4@19 d4@20 [db5,db6]@30 [bb3,db4]@42]/5", // Eb D Ebm Db Bbm
})).s("gm_string_ensemble_1").gain(0.11).pan(0.2)

// other · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@4 A@2 ~@11 B ~@30 C D E@4 F@5 ~>".pickRestart({
  A: "[~@13 f2@19]/2", B: "~@8 a3@9 ~@15", C: "~@8 eb3@8 e3@7 eb3@8 ~", D: "gb3@16 ab3@15 ~",
  E: "[gb3@9 ~@23 db3@8 ~@31 ab2@20 d2@37, ~@31 gb2@39 ~@58, ~@31 gb3@33 ~@7 ab3@53 ~@4]/4",
  F: "[~ gb3@24 ~@3 e3@20 ~ eb3@18 ~ d3@21 db3@28 ~ gb2@40 ~@2, gb2@28 ~@89 gb3@23 ~@20]/5",
})).s("gm_string_ensemble_2").gain(0.27).pan(0.7)

// other · piccolo
const piccolo = note("<A@5 ~@24 B C D E F G ~@10 H I J K L M ~@9>".pickRestart({
  A: "[~@20 a2@19 ~ bb2@18 ~ b2@19 c3@38 ~ c3@37 ~@6]/5", B: "~ c4 d4@2", C: "e4@4 c4@3 ~@9", D: "~@3 [bb3,d4]",
  E: "d4 eb4", F: "d4 f4 g4 a4", G: "bb4@7 ~ bb4@3 ~@21", H: "~ db4 eb4@2", I: "f4 db4 ~@2", J: "~@24 [b3,eb4]@7 ~",
  K: "eb4@16 e4@11 ~@5", L: "eb4@7 ~ gb4@8 ab4@7 bb4@8 ~", M: "b4@8 b4@3 ~@21",
})).s("gm_piccolo").gain(0.33).pan(0.2)

// other · piccolo · soft notes
const piccolo_soft = note("<A ~@3 B@2 ~@26 C ~@15 D ~@11>".pickRestart({
  A: "~@2 g2@17 ~@13", B: "[~@26 a3@37 ~]/2", C: "bb3 ~", D: "b3 ~",
})).s("gm_piccolo").gain(0.16).pan(0.2)

// chords · flute
const flute = note(`<
  A@3 B@3 ~@9 C D ~@4 E F G ~ H ~ I J K@2 L M N O ~@3 P Q R S@2 T U V@2 W X Y Z AA@3 AB@5 ~
>`.pickRestart({
  A: "[~@8 bb4@4 d5@5 f5@4 ~ e5@4 c5@4 ~ e5@5 g5@4 ~ f5@4 d5@5 f5@5 a5@4 ~ g5@4 d5@5 f5@5 a5@4 [a4,c6]@10 [f4,a5]@8, ~@2 [f3,bb3,d4]@19 [e3,c4,e4]@19 [d3,d4,f4]@18 ~ [d3,d4,g4]@20 ~@17]/3", // Am F Bb C Dm G5
  B: "[~@2 f5@9 [a3,d5]@9 ~ [bb3,c5]@9 a3@10 g4@10 ~@3 e3@6 [a3,f4]@36 ~, ~ c4@9 ~@10 d4@19 ~ bb3@19 ~@37, ~@20 g3@7 ~@21, ~@50 e4@9 ~@37]/3", // D5 Bbsus2 Dm
  C: "~@5 b4@2 ~ [d5,b5]@6 ~@2 [d5,b5] ~ e5@2 ~ [d5,b5] ~@2 [d5,b5] ~@2 e5@2 [d5,b5] ~@2, ~@18 db6 ~@13", // G
  D: "[db5,a5] ~ db5!2 a5!3 [db5,a5] ~ [db5,a5] db5 [db5,a5]!2 db5 [db5,a5] db5@2 [db5,a5] ~ [db5,a5] a5 ~ db5 a5 [db5,a5]@3 ~ e5 [c5,d5] ~@2", // Gbm Csus2
  E: "~@14 c6 ~ [bb4,f6]@4 [a4,e6]@4 [g4,d6]@4 [f4,c6]@4, ~@15 d6@2 ~@15", F: "[e4,bb5] ~@7",
  G: "~@8 [g4,bb4]@2 ~@6 [bb4,d5]@3 ~@5 [d5,f5] ~@7", H: "~@8 [f4,a4] ~@7 [a4,c5]@6 ~@2 [c5,e5] ~@7",
  I: "~@16 [bb4,d5]@6 ~@2 [d5,f5] ~@7", J: "[c5,e5]@11 ~@21", K: "[~ f4 a4 d5 c5 a4 ~@2, ~ a3@5 ~@2]/2",
  L: "~@3 bb3, ~ d4", M: "[bb3,d4]@16 [a3,eb4]@13 ~@3", N: "[d3,d4] [f3,f4] [g3,g4] [a3,a4]", O: "[bb3,bb4] ~@3",
  P: "~@8 db5@8 gb5@7 ~ bb5@8", Q: "~@8 [ab4,b4] ~@7 [b4,eb5]@5 ~@3 [eb5,gb5] ~@7, ab5", R: "[db5,f5]@2 f5 ab5",
  S: "[~@8 [gb4,bb4] ~@7 [bb4,db5]@6 ~@2 [db5,f5] ~@7 eb5@8 db5@8 gb5@8 db6@8, gb5@39 ~@25]/2", // Gb Bbm Db
  T: "b5@8 b5@7 ~ [eb5,b5]@7 ~ [eb5,gb5] ~@7, ~@8 b4 ~@15 b5@7 ~", // Abm Ebm
  U: "b5@7 ~ bb5@3 ~ b5@3 ~ db6@8 ab5@8, [db5,f5]@9 ~@7", // Db
  V: "[bb5@8 [bb3,gb4,ab5]@8 [bb4,gb5]@8 db5@8 db5@8 bb4@5 ~@11 [bb3,gb4]@8, ~@2 bb3@3 ~@3]/2", // Ebm
  W: "d4@7 ~ eb4@7 ~@9 b3@7 ~, gb3@15 ~ eb4@16", X: "~@2 eb3@2 bb3@3 ~, b3@14 ~@2 e3@7 ~@9",
  Y: "[eb3,eb4]@8 [gb3,gb4]@7 ~ [ab3,ab4]@7 ~ [bb3,bb4]@8", Z: "b3@7 ~ b3@4 ~@20, b4@11 ~@21",
  AA: "[db3@2 ~@8 ab2@5 [d2,d4,f4]@9, gb2@13 ~@19, [gb3,bb3]@34 ~@6 [ab3,b3]@53 ~@3, ~@18 eb4@35 ~@43]/3", // Dm Gb Abm
  AB: "[[gb2,bb3,db4]@14 [e3,e5]@10 ~ eb5@9 ~ d5@9 ~ db5@14 [bb3,db4,gb4]@21, gb3@12 ~@12 eb3@10 d3@10 db3@15 ~@21]/5", // Gb E Gb
})).s("gm_flute").gain(0.22).pan(0.8)

// chords · flute · soft notes
const flute_soft = note("<~@2 A@4 ~@9 B C ~@4 D ~@2 E ~ F G ~@2 H I ~@10 J K ~@2 L M N ~ O ~@9>".pickRestart({
  A: "[~@14 c3@38 ~@10 bb4@9 ~@21 f3@36]/4", B: "~@6 db5 bb5 ~@18 db6@2 ~@4, ~@3 a5 ~@12",
  C: "~@2 a5 ~ db5!2 ~@2 a5 ~ a5 ~@5 a5 ~ a5 ~@2 a5@2 ~@4 g5 [bb4,f5] ab4 b4 [bb3,db4,a4], ~@10 db5 ~@5", // Bb5 Bbm
  D: "~@7 g4 ~@8, ~@14 f4 ~@17", E: "[c5,e5] ~@3", F: "[a4,d5]@5 ~@11", G: "~@8 [g4,bb4] ~@23", H: "~@3 f4",
  I: "db4 d4 ~@2", J: "bb4@17 ~@15", K: "~@8 ab4 ~@7 b4@5 ~@11", L: "~@8 bb3@7 ~ b3@7 ~ [db4,db5]@8", M: "d5 eb5 eb5@2",
  N: "~@3 eb3", O: "[gb3,gb4]@9 ~@23",
})).s("gm_flute").gain(0.11).pan(0.8)

// drums · snare
const snare = s("sd").struct("<~@7 A@7 B A@7 B A@11 C A@3 ~ A@11 C ~@9>".pickRestart({
  A: "~ x ~ x", B: "x", C: "~ x ~@2",
})).gain(0.44)

// drums · hihat
const hihat = s("hh").struct("<~@7 A@7 B A@7 B A@11 C A@3 B A@11 C ~@9>".pickRestart({
  A: "x!4", B: "x", C: "x!2 ~@2",
})).gain(0.38)

stack(
  acoustic_guitar_nylon, bass, piano, string_ensemble_1, string_ensemble_1_soft, string_ensemble_2, piccolo,
  piccolo_soft, flute, flute_soft, snare, hihat
)