Strudelify

Physical Fascination

Roxette

KeyD minorTempo136 bpm
0:00/0:00
// Physical Fascination — Roxette
// 136 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 117 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 27.
setcpm(136/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 · overdriven guitar
const overdriven_guitar = note(`<
  ~@4 A B ~@2 A B ~@2 C D C E ~@3 F@2 C E ~@3 F@2 C E ~@2 A B ~@2 A B ~@2 C D C E ~@4 F@2 C E ~@3 F@2 C E ~@2 A B ~@2 A
  B ~@2 G H@3 G H@3 ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@3 I ~ I ~ I ~ I ~ I ~ I ~ I ~ I ~@6
>`.pickRestart({
  A: "[d3,a3,c4,g4]@2 ~ [a3,c4,gb4]@5", B: "[g3,d4]@2 ~ [f3,g3,c4]@5", C: "d3@3 ~@3 d3@2 c3@2 ~@4 c3@2",
  D: "g2@3 ~@11 c3@2", E: "g2@3 ~@13", F: "[~@17 f4@15, ~@15 bb2@16 ~, ~ [f3,bb3,c4]]/2", G: "~ d3 g3@2 gb3@2 d3 a2",
  H: "[eb3@2 d3@9 ~@5]/3", I: "~@2 [bb2,f3] [c3,g3]",
})).s("gm_overdriven_guitar").gain(0.28).pan(0.6)

// bass · electric bass finger
const bass = note(`<
  ~@8 A B C D E F G H I J K L M E F I J K L M E N O P A B C Q A B C R E F G S T I U V L M E F I U I W M E N O P A B C Q
  A B C R ~@8 O P A B C Q A B C R A B C Q A B C R X Y X Y X Y X Y X Y X Y X Y X Y ~@6
>`.pickRestart({
  A: "d2@4 ~@2 d2 ~ d2@4 ~@2 d2@2", B: "g2@5 ~ g2@2 f2@4 ~@2 c2@2", C: "d2@2 ~ d2 c2@2 ~ c2",
  D: "g2@2 ~ g2 ~ g1 g2@2 f2@5 ~@3", E: "d2@4 ~@2 d2@2 c2@3 ~@3 c2@2", F: "g1 ~@6 c2", G: "d2@3 ~@3 d2@2 c2@3 ~@3 c2@2",
  H: "g1@3 ~@13", I: "d2 ~@2 d2 c2 ~@2 c2", J: "g1@2 ~@4 g1 ~ g1@3 ~ c2@2 g1@2", K: "d2@3 ~@3 d2@2 c2@2 ~@4 c2@2",
  L: "g1@4 ~@2 g1 ~ g1@2 ~ g1@3 a1@2", M: "bb1@4 ~@2 bb1 ~ bb1@8", N: "g1@2 ~@9 g1 c2@2 b1@2", O: "bb1@5 ~@3 bb1@5 ~@3",
  P: "c2@4 ~@4 c2 ~ c2@6", Q: "g2@2 ~ g2 ~ g1 g2@2 f2@5 ~ c2@2", R: "g2@2 ~ g2 ~@2 g2@2 f2@5 ~@3",
  S: "g1@3 ~ g2@3 g1 g2!2 g1 ~ g2@2 g1 ~", T: "~@7 c2", U: "g1@2 ~@4 g1 ~ g1@3 ~ c2@2 g1 c2",
  V: "d2 ~@5 d2 ~ c2@2 ~@4 c2@2", W: "g1@2 ~ g1@3 g1 ~ g1@2 ~@2 g1@2 a1@2", X: "d2@2 d2 d2@2 d2!2 ~ f2@2 d2@4 d2@2",
  Y: "d2 ~ d2 d2@2 d2!2 ~ bb1@4 c2@4",
})).s("gm_electric_bass_finger").gain(0.49)

// other · clarinet
const clarinet = note(`<
  ~@18 A ~ B C ~@3 D ~ B E ~@3 F G@2 ~ F G@2 ~@6 H ~@3 B C ~ I ~@2 J B C ~ K L F G@2 ~ F G@2 ~@9 K L F G@2 ~ F G@2 ~ F
  G@2 ~ M N@2 O ~@22
>`.pickRestart({
  A: "~ d4 ~@2", B: "f4@3 f4@2 f4@3 f4@3 g4@2 g4@3", C: "a4@5 ~@11", D: "~ d3@2 ~", E: "a4@3 ~@5",
  F: "g4@3 c5 a4@2 g4 gb4", G: "[[g2,g4]!2 [g2,g4]@2 [g2,g4]@2 [f2,f4] [f2,f4]@2 [d2,d4]@2 ~@5]/2",
  H: "[a2,a4]@4 a4@2 [ab3,ab4]@2 g4@5 ~@3", I: "~@5 d5!2 c5 d5@2 d5 d5@4 ~",
  J: "[g2,c4] [g2,d4]!2 [f2,c4] [g2,d4]@2 [f2,c4]@2", K: "d4@2 d4 d4@4 d4", L: "e4@2 e4 f4@2 e4@3", M: "d5@3 c5 d5!4",
  N: "[[f3,f5]!2 [f3,f5]@2 [e3,e5]@2 [f3,f5] [e3,e5]@2 [d3,d5] [c3,c5] [a2,a4]@5]/2", O: "g4@3 g4@2 g4@3 g4@2 f4@6",
})).s("gm_clarinet").gain(0.02)

// other · pan flute
const pan_flute = note("<~@81 A B@2 ~ A C@2 ~ A D E ~@25>".pickRestart({
  A: "~@7 d4", B: "[g4@2 g4 ~ g4@3 ~ g4@4 d4@2 g4@4 gb4@11 ~@3]/2",
  C: "[d5@2 g4 ~ g4@2 f4 ~ g4@4 d4 ~ d4@4 f4@10 ~@4]/2", D: "g4 ~ g4 ~ g4@2 f4 ~ g4@4 f4@2 a4@2", E: "~ a4@6 ~",
})).s("gm_pan_flute").gain(0.32)

// bass · synth bass 2
const bass_2 = note(`<
  ~@8 A B C D C E F G ~@5 F H ~@5 F I J K A B C L A B C D C E F M ~@6 F H ~@5 F I J N A B C L A B C D ~@7 O J K A B C L
  A B C D A B C L A B C D P Q P Q P Q P Q P Q P Q P Q P Q R@5 ~
>`.pickRestart({
  A: "[d1,d2]@4 ~@2 [d1,d2] ~ [d1,d2]@5 ~ [d1,d2]@2", B: "[g1,g2]@4 ~@2 [g1,g2]@2 [f1,f2]@5 ~ [c1,c2]@2",
  C: "[d1,d2]@2 ~ [d1,d2] [c1,c2]@2 ~ [c1,c2]", D: "[g1,g2]@2 ~ [g1,g2]@2 ~ [g1,g2]@2 [f1,f2]@4 ~@4",
  E: "[g0,g1]@4 g1@2 g0 g1@2 g0 g1@2 ~@2 [c1,c2]@2", F: "[d1,d2]@3 ~@3 [d1,d2]@2 [c1,c2]@3 ~@3 [c1,c2]@2",
  G: "[g0,g1]@4 g1@2 g0 g1@2 g0 g1@3 ~@3", H: "[g0,g1]@4 g1@2 g0 g1@2 g0 g1@2 ~@4",
  I: "[g0,g1]@3 ~@8 [g0,g1] [c1,c2]@2 [b0,b1]@2", J: "[bb0,bb1]@5 ~@3 [bb0,bb1]@5 ~@3",
  K: "[c1,c2]@5 ~@3 [c1,c2] ~ [c1,c2]@6", L: "[g1,g2]@2 ~ [g1,g2]@2 ~ [g1,g2]@2 [f1,f2]@4 ~@2 [c1,c2]@2",
  M: "[g0,g1]@3 ~ g2@3 g1 g2!2 g1 ~ g2@2 g1 ~", N: "[c1,c2]@5 ~@3 [c1,c2] ~ [c1,c2]@4 ~@2", O: "~@8 g2 ~ g2 ~ g2 f2@3",
  P: "[d1,d2]@2 [d1,d2] [d1,d2]@2 [d1,d2]!2 ~ [f1,f2]@2 [d1,d2]@4 [d1,d2]@2", // D F D
  Q: "[d1,d2] ~ [d1,d2] [d1,d2]@2 [d1,d2]!2 ~ [bb0,bb1]@4 [c1,c2]@4", R: "d1/5",
})).s("gm_synth_bass_2").gain(0.41)

// other · lead 5 charang
const lead_5_charang = note(`<
  ~@11 A B C B D ~@5 B D ~@5 B D ~@5 A ~@3 A B C B D ~@6 B E ~@5 B D ~@5 A ~@3 A F G@3 F G@3 ~@5 A ~@3 A ~@3 A ~@3 A H ~
  I ~ H ~ I ~ H ~ I ~ H ~ I ~@7
>`.pickRestart({
  A: "[g3,g4] ~@2 [g3,g4] ~ g2 [g3,g4]@2 [f3,f4]@8", B: "d3@3 ~@3 d3@2 c3@2 ~@4 c3@2", C: "g2@3 ~@11 c3@2",
  D: "g2@3 ~@13",
  E: "g2@2 [g3,c4] [e3,a3] ~ [e3,a3] [g3,c4] [e3,a3] [ab3,db4] [e4,a4] [e3,a3]!3 [b3,e4] [e3,a3] [a3,d4]", // C5 A5 C5 A5 Db5 A5 E5 A5 …
  F: "~@2 d3 g3@2 gb3@2 d3", G: "[~ a2@2 eb3@5 d3@27 ~@13]/3", H: "~@7 f4, ~@5 d2@3, ~@3 d3",
  I: "~@7 d4, ~@5 d2@3, ~@3 d3",
})).s("gm_lead_5_charang").gain(0.19).pan(0.7)

// other · woodblock
const woodblock = note("<~@13 A ~ A ~@6 A ~@18 A ~@75>".pickRestart({
  A: "~@2 eb6 ~@4 d4 eb5 d4 f7 ~@5",
})).s("gm_woodblock").gain(0.15)

// other · agogo
const agogo = note("<A B C D A E C F G ~@60 A B C D A E C D ~@40>".pickRestart({
  A: "d4 ~@5 c4 ~@7 c4 ~", B: "g4 ~@5 g4 ~ f4 ~@7", C: "d4 ~@5 d4 ~ c4 ~@5 c4 ~", D: "g4 ~@2 g4 ~@2 g4 ~ f4 ~@7",
  E: "g4 ~@5 g4 ~ f4 ~@5 c4 ~", F: "g4 ~@2 g4 ~@2 g4 ~ f4 ~@5 d4 ~", G: "~@2 c4 ~@3 g4 ~@9",
})).s("gm_agogo").gain(0.16)

// chords · tinkle bell
const tinkle_bell = note("<~@20 A ~@6 A ~@21 A ~@6 A ~@60>".pickRestart({
  A: "[g4,g5]@5 ~@3, c6@3 ~@5", // G
})).s("gm_tinkle_bell").gain(0.13)

// chords · pad warm
const pad_warm = note("<~@19 A@2 ~@5 A@2 ~@20 A@2 ~@5 A@2 ~@12 B C D E B F G H ~@26 I@2 J@2 K@2 L@7 ~>".pickRestart({
  A: "[~@15 [bb2,f3,bb3,c4,f4,c5]@16 ~]/2", B: "[d5,d6]", C: "[g5,g6]@2 [f5,f6] [c5,c6]",
  D: "[d5,d6]@7 ~ c5@8, ~@7 c6@8 ~", E: "[g5,g6]@4 [f5,f6]@3 [c5,c6]", F: "[g5,g6]@7 ~ f5@4 [c5,c6]@4, ~@7 f6@4 ~@5",
  G: "[d5,d6] [c5,c6]", H: "[g5,g6]@7 ~ f5@4 ~@4, ~@7 f6@4 ~@5", I: "[[a5,a6]@6 [g5,g6] [c6,c7]]/2",
  J: "[[a5,a6]@6 [f5,f6] [g5,g6]]/2", K: "[[a5,a6]@23 ~ g5@4 [c6,c7]@4, ~@23 g6@4 ~@5]/2",
  L: "[[a5,a6]@24 [g5,g6]@4 [f5,f6]@3 ~ [d2,d3,f3,a3,c4,e4,a4,d7]@80, ~@31 [d5,a5,d6]@81]/7", // A G F Dm7 D5
})).s("gm_pad_warm").gain(0.15)

// chords · pad sweep
const pad_sweep = note(`<
  ~@32 A B ~@2 A B ~@23 A B ~@2 A B ~@12 A B ~@2 A B ~@2 A B ~@2 C B ~@2 D ~ E ~ D ~ E ~ D ~ E ~ D ~ E ~@7
>`.pickRestart({
  A: "[d3,a3,d4,g4]@4 ~@2 [d3,a3,d4,gb4]@9 ~", B: "[d3,g3,c4,d4]@4 ~@2 [f3,c4,f4,g4]@9 ~",
  C: "[d3,a3,d4,g4]@2 ~ [d3,a3,d4,gb4]@5", D: "~ [a3,d4,f4]", E: "~ [f3,a3,d4]",
})).s("gm_pad_sweep").gain(0.29)

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

// drums · rim
const rim = s("rim").struct("<x ~@116>").gain(0.55)

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@13 A@3 ~@18 A@4 ~@25 A@4 ~@14 A@4 ~@4 A@4 ~@2 B ~ C ~ B ~ C ~ B ~ C ~ B ~ C ~@7
>`.pickRestart({
  A: "~@3 x ~@12", B: "~@7 x", C: "~@3 x ~@4",
})).gain(0.05)

// drums · clap
const clap = s("cp").struct("<~@35 A ~@3 A ~@24 A ~@3 A ~ B ~@11 A ~@3 A ~@3 A ~@3 A ~@22>".pickRestart({
  A: "~@5 x ~@2", B: "~@7 x",
})).gain(0.49)

// drums · hihat
const hihat = s("hh").struct(`<
  A@3 B A@3 C D@36 ~ D@13 E D@10 A@3 B A@3 F D@18 G H I J K L M N M O P@2 Q O P R ~@6
>`.pickRestart({
  A: "x!8", B: "x!5 ~ x!2", C: "x ~ x!4 ~ x", D: "x!2 ~ x ~ x ~ x", E: "x ~ x!5 ~@2 x!2 ~@3 x ~", F: "x!5 ~ x ~",
  G: "x ~ x!3 ~ x ~@3 x!6", H: "x ~ x!5 ~@3 x ~@2 x!3", I: "x ~ x!3 ~ x!7 ~ x ~", J: "x ~ x ~ x!3 ~ x ~ x!6",
  K: "x ~ x!6 ~ x!7", L: "x!9 ~ x!5 ~", M: "x!5 ~ x!7 ~ x!2", N: "x!16", O: "x ~ x!7 ~ x!6", P: "x!9 ~ x!6",
  Q: "x ~ x!14", R: "x!15 ~",
})).gain(0.33)

// drums · low tom
const low_tom = s("lt").struct("<A@2 B@2 A@2 B ~ A@4 ~@20 A@7 ~@22 A@15 ~@2 C A@7 ~ A@7 ~ A@15 ~@7>".pickRestart({
  A: "~@7 x", B: "~@2 x ~@2 x ~ x", C: "~@15 x",
})).gain(0.33)

// drums · mid tom
const mid_tom = s("mt").struct("<A@7 ~ A@4 ~@20 A@7 ~@10 B ~@6 B ~@4 A@15 ~@2 C A@7 ~ A@7 ~ A@15 ~@7>".pickRestart({
  A: "~@3 x", B: "~@14 x!2", C: "~@7 x",
})).gain(0.33)

// drums · open hat
const open_hat = s("oh").struct("<~@3 A ~@3 B ~@64 A ~@3 A ~@40>".pickRestart({
  A: "~@5 x ~@2", B: "~ x ~@6",
})).gain(0.38)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@6 B ~@3 B ~@17 B ~ B ~@6 A B ~@3 C ~@7 B ~@5 D ~@2 B ~@7 B ~@7 E F B ~@6 A B ~@7 G H I@3 H I ~ J I@6 D B ~@5
>`.pickRestart({
  A: "~@7 x", B: "x", C: "~@4 x!7 ~@5", D: "~@7 x ~@8", E: "x!2 ~@2", F: "x ~@6 x", G: "x ~@14 x", H: "~@15 x",
  I: "~@7 x ~@7 x", J: "x ~@6 x ~@7 x",
})).gain(0.16)

// drums · crash · soft notes
const crash_soft = s("cr").struct("<~@44 [~@2 x!2 ~@12] ~@55 [~@7 x ~@8] ~ [~@7 x ~@7 x] ~@14>").gain(0.11)

// drums · congas
const congas = s("conga:13").struct("<~@10 A@6 ~@16 A@8 ~@21 A@16 ~@2 A@32 ~@6>".pickRestart({
  A: "~@2 x!2 ~@12",
})).gain(1.22)

// drums · congas
const congas_2 = s("conga:33").struct("<~@10 A@6 ~@16 A@8 ~@21 A@16 ~@2 A@32 ~@6>".pickRestart({
  A: "~ x ~@2",
})).gain(1.22)

// drums · ht
const ht = s("ht").struct("<~@15 A ~@53 B C ~@2 B C ~@23 D A ~@2 E ~@7 D ~@6>".pickRestart({
  A: "~@14 x!2", B: "~@3 x", C: "~@12 x ~ x!2", D: "~@10 x!4 ~ x", E: "~@8 x!2 ~@4 x!2",
})).gain(0.33)

// … 14 more lines

More by Roxette