Strudelify

I Never Felt Like This Before

Mica Paris

KeyF minorTempo98 bpm
0:00/0:00
// I Never Felt Like This Before — Mica Paris
// 98 bpm, 4/4, key F minor. 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: Full arrangement: all 106 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(98/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 · synth bass 2
const bass = note(`<
  A B C D E B C D E B C D F B C D F B C D F B C D F B C D F B C D F B C D F B C D F B C D F B C D F B C D F B C D F B C
  D F B C D F B C D F B C D F G H I J G H I K B C D F B C D F B C D F B C D F B C D F B C D F L
>`.pickRestart({
  A: "~@10 g1@4 c1 ~", B: "f1 g1 a1 bb1@3 ~@2", C: "~@2 bb1 ~@3 eb2@4 bb1@2 eb2@2 f1 g1", D: "ab1 bb1 c2 db2@3 ~@2",
  E: "~@2 ab1 ~@3 c2@3 ~ g1@4 c1 ~", F: "~@2 ab1 ~@3 c2@3 ~ g1@4 c1 d1", G: "d2 ~@3 d2@2 a1@3 ~ a1@2 c2@2 a1 c2",
  H: "~@2 d2 ~ d2@2 a1@3 ~ a1 c2 d2@2 c2 a1", I: "g1@4 g2@2 g1@3 ~ g1@2 a1@2 g1 a1", J: "bb1@4 f2 d2 a1@6 c2@4",
  K: "bb1 db2 e2 g2", L: "f1 ~@15",
})).s("gm_synth_bass_2").gain(0.4)

// chords · piano
const piano = note(`<
  A B C D E F C D E G H I J K H I L G H I M G H I N F C D E F C O P F C O P F C O P G H I Q R H S L G H I M G H S N F C
  O T F C U T F C U T F C U T V W X Y V W Z AA F C U T F C U T F C U T F C U T F C U T F C U AB AC
>`.pickRestart({
  A: "~@10 [d7,e7,f7] [e6,f6,g6,a6,b6,c7] [b5,c6,d6,d7,e7,f7] [e6,f6,g6,a6,b6,c7] [f5,g5,a5,b5,c6,d6] [b4,c5,d5,e5]", // Dm Cmaj7 Bdim Cmaj7 Dm7 Cmaj7
  B: "[c4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~", // C5 C Bb
  C: "[bb3,d4,f4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [eb4,g4,bb4] ~ [eb4,g4,bb4] ~", // Bb Db Eb
  D: "[ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~", // Abmaj7 Db
  E: "[ab3,db4,f4] ~ [ab3,c4,eb4,g4] ~ [ab3,c4,eb4,g4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~", // Db Abmaj7 Bb C
  F: "[c4,e4,g4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~", // C Bb
  G: "[c4,e4,g4] ~@2 [bb3,d4,f4] ~@4", H: "~@2 [db4,f4,ab4] ~@3 [db4,f4,ab4]@6 [eb4,g4,bb4]@3 ~",
  I: "[ab3,c4,eb4,g4] ~@2 [ab3,db4,f4] ~@4", J: "~@2 [ab3,c4,eb4,g4] ~@3 [bb3,d4,f4]@6 [c4,e4,g4]@3 ~",
  K: "[c4,e4,g4,c5] ~@2 [bb3,d4,f4] ~@4", L: "~@2 [ab3,c4,eb4,g4] ~@3 [bb3,d4,f4]@6 [c4,e4,g4]@2 ~@2",
  M: "~@2 [ab3,c4,eb4,g4] ~@3 [bb3,d4,f4]@6 [g3,c4,e4]@2 ~@2", // Abmaj7 Bb C
  N: "~@2 [ab3,c4,eb4,g4] ~@3 [bb3,d4,f4]@5 ~ [bb3,d4,f4]@3 ~", // Abmaj7 Bb
  O: "[c4,eb4,g4] ~ [c4,eb4,g4] ~ [c4,eb4,g4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~", // Cm Db
  P: "[ab3,db4,f4] ~ [c4,eb4,g4] ~ [c4,eb4,g4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~", // Db Cm Bb C
  Q: "~@2 [ab3,c4,g4] ~@3 [bb3,d4,f4]@6 [c4,e4,g4]@3 ~", R: "[e4,g4,c5] ~@2 [bb3,d4,f4] ~@4",
  S: "[c4,eb4,g4] ~@2 [ab3,db4,f4] ~@4", // Cm Db
  T: "[ab3,db4,f4] ~ [c4,eb4,g4] ~ [ab3,eb4,g4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [c4,e4,g4] ~ [c4,e4,g4] ~", // Db Cm Abmaj7 Bb C
  U: "[c4,eb4,g4] ~ [ab3,eb4,g4] ~ [c4,eb4,g4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~", // Cm Abmaj7 Cm Db
  V: "[d4,f4,a4] ~@5 [c4,e4,g4]@9 ~", W: "~@2 [d4,f4,a4] ~@3 [c4,e4,g4]@5 ~ [c4,e4,g4]@3 ~",
  X: "[bb3,d4,f4] ~@5 [bb3,d4,f4]!2 ~@8", Y: "[d4,f4,a4] ~@5 [bb3,db4,e4,g4]@9 ~",
  Z: "[bb3,d4,f4] ~@5 [bb3,d4,f4]!2 ~@2 [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~", AA: "[bb3,db4,e4,g4]@15 ~",
  AB: "[ab3,db4,f4] ~ [c4,eb4,g4] ~ [ab3,eb4,g4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~", // Db Cm Abmaj7 Bb
  AC: "[f4,a4,c5] ~@15", // F
})).s("gm_piano").gain(0.35)

// chords · lead 2 sawtooth
const lead_2_sawtooth = note(`<
  ~ A B C D A B C D E ~@7 E ~@3 E ~@2 F A B C D A B G D A B H D A B C D E ~@7 E ~@3 E ~@2 F A B C D A B C D A B C D A B
  C D I J K L I J M ~ A B C D A B C D A B C D A B C D A B C D A B C N O
>`.pickRestart({
  A: "[c5,e5,g5] ~@2 [bb4,d5,f5] ~@4", B: "~@2 [db5,f5,ab5] ~@3 [db5,f5,ab5]@6 [eb5,g5,bb5]@3 ~",
  C: "[ab4,c5,eb5,g5] ~@2 [ab4,db5,f5] ~@4", D: "~@2 [ab4,c5,eb5,g5] ~@3 [bb4,d5,f5]@6 [c5,e5,g5]@2 ~@2",
  E: "[c5,e5,g5,c6] ~@15", F: "~@2 [ab4,c5,eb5,g5] ~@3 [bb4,d5,f5]@5 ~ [bb4,d5,f5]@3 ~",
  G: "[ab4,c5,g5] ~@2 [ab4,db5,f5] ~@4", H: "[c5,eb5,g5] ~@2 [ab4,db5,f5] ~@4", I: "[d5,f5,a5] ~@5 [c5,e5,g5]@9 ~",
  J: "~@2 [d5,f5,a5] ~@3 [c5,e5,g5]@9 ~", K: "[bb4,d5,f5] ~@15", L: "[d5,f5,a5] ~@5 [bb4,db5,e5,g5]@9 ~",
  M: "[bb4,d5,f5]", N: "~@2 [ab4,c5,eb5,g5] ~@3 [bb4,d5,f5]@9 ~", O: "[a4,c5,f5] ~@7",
})).s("gm_lead_2_sawtooth").gain(0.3)

// other · epiano2
const epiano2 = note(`<
  ~ A ~ B ~ C ~ B ~@9 C ~ D E C ~ B ~ C ~ B ~ C ~ B ~ C ~ B ~ C ~ B ~@9 C ~ D E C ~ B ~ C ~ B ~ C ~ B ~ C ~ B ~ C ~ B
  ~@9 C ~ B ~ C ~ B ~ C ~ B ~ C ~ B ~ C ~ B ~ C ~ B F G
>`.pickRestart({
  A: "~@2 [c6,c7]@2 [g5,g6]@2 [f5,f6] ~@9", B: "[eb5,eb6]@2 [c6,c7]@2 [g5,g6]@2 [f5,f6] ~@9",
  C: "[g5,g6]@2 [c6,c7]@2 [g5,g6]@2 [f5,f6] ~@9", D: "[eb4,eb5]@2 [c5,c6] [f4,f5] ~@4", E: "~@12 [c4,c5]@3 ~",
  F: "~@10 [d4,d5]@2 [bb3,bb4]@2 [d4,d5] ~", G: "[a3,c4,f4,a4,c5] ~@15",
})).s("gm_epiano2").gain(0.4)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~ A@4 B@4 C D E F C D E F G H I J K H L M B@16 ~ D E F C D E F G N O J K H L M B@4 A@12 ~@7 P A@4 B@16 Q@5
>`.pickRestart({
  A: "[~@3 f6@29]/4", B: "[~@3 [f5,f6]@29]/4", C: "[e3,g3,c4] ~@7", D: "~@6 [db4,f4,ab4]@6 [eb4,g4,bb4]@3 ~",
  E: "[ab3,c4,eb4]@5 ~ [ab3,db4,f4]@2 ~@8", F: "~@6 [bb3,d4,f4]@5 ~ [c4,e4,g4]@4", G: "f5",
  H: "~@2 [ab4,ab5] ~@3 [db4,f4,ab5]@6 [eb4,g4,g5]@3 ~", I: "[ab3,c4,eb5]@5 ~ f5@4 c5 f5 c6 f6 c7 f6, ~@3 f4@5",
  J: "c6 f5 [c4,c5] ~@3 [bb3,d4,f5]@5 ~ [c4,e4,g5]@3 ~", K: "~@6 f6 c7 f7 c7 f6 c6!2 f6 c7 f7, f5",
  L: "[ab3,c4,eb5]@5 ~ [ab3,db4,f5]@10", M: "~@2 [c4,c5] ~@3 [bb3,d4,f5]@5 ~ [bb3,d4,f5]@4",
  N: "~@2 ab5 ~@3 [db4,f4,ab5]@6 [eb4,g4,g5]@3 ~", O: "[ab3,c4,eb5]@5 ~ f5@4 c5 f5 c6 f6 c7 f6, ~@3 ab3@5",
  P: "[bb3,db4,e4,g4]@15 ~", Q: "[~@6 [f5,f6]@59 ~@15]/5",
})).s("gm_string_ensemble_1").gain(0.3)

// other · rock organ
const rock_organ = note(`<
  ~ A ~@3 A ~ B ~@17 A ~@3 A ~ B ~ A ~@3 A ~ B ~@17 A ~@3 A ~ B ~ A ~@3 A ~ B ~@9 A ~@3 A ~ B ~ A ~@3 A ~ B ~ A ~@3 A ~
  B C D
>`.pickRestart({
  A: "~@8 a6@2 c7 ~@5, ~@8 g6 ~@7", B: "f5@2 eb5 ~@13", C: "~@2 f6 g6 [bb6,c7] ~ bb6@2 g6 f6 d6 c6 bb5 c6 [g6,ab6] g6",
  D: "f6 ~@15",
})).s("gm_rock_organ").gain(0.4)

// other · alto sax
const alto_sax = note(`<
  ~@9 A B@3 A C@3 D E@3 F G@2 H ~@7 I J ~ K L@2 M@2 N O P@3 Q R@2 S D T@3 D U V@2 ~@3 W ~@3 X ~@3 Y Z ~@2 AA AB@4 AC AD
  AE@2 AF@2 ~ AG AH@2 ~ AI ~@17
>`.pickRestart({
  A: "~@2 a3@3 g3 f3 g3 a3@2 g3@2 ~@4",
  B: "[~@2 c4!2 c4@2 bb3 ~ bb3@2 ab3 ~ ab3@2 bb3@4 g3@7 ~ c3@2 f3 eb3 f3@8 ~@10]/3",
  C: "[~@2 c4!2 c4@2 bb3 ~ bb3@2 ab3 ~ ab3@2 f3 bb3@7 g3@2 eb3@2 c3@2 f3 eb3 f3@8 ~@10]/3", D: "~ c4 d4 f4 g4 f4@3",
  E: "[~@2 ab4 ~ ab4@2 g4 ~ g4@2 f4 ~ f4 ~ f4@4 eb4 ~ eb4@2 c4 ~ c4@2 bb3@2 c4 bb3 c4@8 ~@10]/3",
  F: "~@2 c4@2 d4@2 f4@2 g4@2 f4@5 ~",
  G: "[~@2 ab4 ~ ab4@2 g4 ~ g4@2 f4 ~ f4 ~ bb4@4 bb4@2 ab4@2 c5@2 bb4 ~@3 ab4 ~ c5 bb4]/2",
  H: "c5@6 ~@2 eb5@2 c5 ~ bb4 ab4 f4 ~", I: "~@8 c5@2 eb5 ~ c5@2 bb4 ~", J: "~@2 c5@2 bb4 ab4 f4@4 ~@6",
  K: "~@14 ab4 bb4", L: "[c5@2 ~ c5 bb4@2 ~ bb4 ab4@2 bb4 ~ c5 bb4 c5@6 ~@4 f5@2 c5 ~ bb4@2 ab4 f4]/2",
  M: "[~@10 c4@2 f4@2 eb4@4 f4@2 ~@6 c4 bb3@3 c4 ~]/2", N: "~@2 c4 ab3 bb3@6 ~@6", O: "~@2 a3@3 g3 f3 g3 a3@2 g3 ~@5",
  P: "[~@2 c4!2 c4@2 bb3 ~ bb3@2 ab3 ~ ab3@2 bb3@4 g3@4 eb3@4 c3@2 f3 eb3 f3@9 ~@9]/3",
  Q: "~@2 d4 bb3 c4 g3 bb3 ~ a3@2 g3@6", R: "[~@2 c4!2 c4@2 bb3 ~ bb3@2 ab3 ~ ab3@2 bb4@4 g4@2 f4@2 eb4@4 ~@6]/2",
  S: "~@2 c4 ~ c4@2 bb3 ~ c4 bb3 c4@5 ~",
  T: "[~@2 ab4!2 ab4@2 g4 ~ g4@2 f4 ~ f4@2 bb4@4 g4@3 ~ eb4@4 c4 ~ f4 eb4 f4@7 ~@11]/3",
  U: "~@2 ab4 ~ ab4@2 g4 ~ g4@2 f4 ~ f4 ~ bb4@2",
  V: "[~@2 ab4 ~ ab4@2 bb4 ~ ab4@2 bb4@2 c5 bb4 c5@6 ~@2 f5@3 eb5 c5 eb5 c5 bb4 ab4 ~]/2",
  W: "~@2 eb5 c5@2 ~ c5@2 bb4 ab4 f4@4 ~@2", X: "~@6 eb5 f5@2 eb5 c5 eb5 bb4 ab4 f4@2",
  Y: "~@6 eb5 f5@2 ~ eb5 ~ c5 bb4 ab4 f4", Z: "f4 eb4 c4 bb3 c4 ab3 bb3@4 ~@6", AA: "~@6 eb5 f5@6 ~@3",
  AB: "[~@2 d5 ~ d5 ~ d5 ~ d5@2 c5@2 a4@2 d5@4 c5 ~ c5@2 a4 ~ a4@2 g4 ~@3 a4@6 g4@2 f4 ~ f4@2 g4@2 d4 c4 d4@8 ~@4 a3 f3 g3 a3 ~@2]/4",
  AC: "~@2 f5 ~ f5@2 e5 ~ e5@2 d5@2 c5@2 d5@2", AD: "~@4 c5 g4 a4 ~ a4@2 ~@4 a4 ~",
  AE: "[a4@2 g4 ~@5 g4 ~ f4 ~ bb4@6 a4 bb4 c5@3 d5 c5 bb4 a4 bb4!2 a4 bb4 c5]/2",
  AF: "[g4@2 f4 ~@3 eb5 f5@5 eb5 c5 ~ eb5@3 c5@6 ~@8]/2", AG: "bb4 ab4 bb4 ab4 bb4@2 ab4@2 c5 ~ ab4@2 f4@4",
  AH: "[~@12 ab4 bb4 ~ c5@3 bb4 ab4 f4@2 ~@10]/2", AI: "~ ab5@2 f5@2 eb5 f5@2",
})).s("gm_alto_sax").gain(0.64)

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

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

// drums · hihat
const hihat = s("hh").struct("<[~@4 x!4] [x!8]!104 x>").gain(0.45)

// drums · crash
const crash = s("cr").struct("<A B ~@7 B ~@3 B ~@7 B ~@19 B ~@3 B ~@7 B ~@19 C D ~@2 C D ~@26 B>".pickRestart({
  A: "~@3 x", B: "x", C: "x ~@2 x ~@4", D: "~@3 x ~@4",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<~ [x!16]!8 ~@16 [x!16]!16 ~@16 [x!16]!48 x>").gain(0.3)

// drums · triangle
const triangle = s("triangles:30").struct("<~@9 [~@9 x ~@6]!96 ~>").gain(2.16)

// drums · triangle
const triangle_2 = s("triangles:35").struct("<~@9 [~ x]!96 ~>").gain(2.16)

stack(
  bass, piano, lead_2_sawtooth, epiano2, string_ensemble_1, rock_organ, alto_sax, kick, snare, hihat, crash, tambourine,
  triangle, triangle_2
)

More by Mica Paris