Strudelify

I Feel the Earth Move

Martika

KeyD minorTempo127 bpm
0:00/0:00
// I Feel the Earth Move — Martika
// 127 bpm, 4/4, key D 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 126 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(127/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 · piano
const piano = note("<~@88 A B A B A B A B A B A B A B ~@24>".pickRestart({
  A: "[d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~ [d3,a3,d4] ~", // D5
  B: "[d3,g3,d4] ~ [d3,g3,d4] ~ [d3,g3,d4] ~ [d3,g3,d4] ~ [d3,g3,d4] ~ [d3,g3,d4] ~ [d3,g3,d4] ~ [d3,g3,d4] ~", // G5
})).s("gm_piano").gain(0.4)

// bass · synth bass 1
const bass = note(`<
  A B C@2 D E D E D E D F D E D@2 E@2 D G H I E J H I E K D E D@2 E@2 D@3 L H I E M H I E K D E D E D E D N D E D@2 E@2
  D@3 O D P Q P Q P Q R H I E M H I E K D E D E D E D N D E D E D E D E D E D E D E D S D E D E D E D E D E D E D E D E
  D E D E D T
>`.pickRestart({
  A: "d1", B: "~@4 g1 a1 c2@2", C: "[d1@12 g1 a1 c2 d2]/2", D: "d1 d2 d1 d2 d1 d2 d1 d2", E: "g1 g2 g1 g2 g1 g2 g1 g2",
  F: "a1 ~ a1 ~ a1 ~ a1 ~ a1@2 ~@6", G: "c2 ~ c2 ~ c2 ~ c2 ~ c2@2 ~@6", H: "f1 f2 f1 f2 f1 f2 f1 f2",
  I: "bb1 bb2 bb1 bb2 bb1 bb2 bb1 bb2", J: "c2 ~ c2 c1@2 ~ c1@2 ~@2 c1@2 ~@2 c1@2", K: "c2 c3 c2 c3 a1 a2 a1 a2",
  L: "c2 ~ c2 ~ c2 ~ c2 ~ c2 ~@7", M: "c2@2 c3!2 c2@2 c2@2 c2@2 c2@2 c2@2 c2@2",
  N: "a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~ a1 ~", O: "~@2 g1 ~ g1 ~ ab1 ~ ab1 ~ a1@6",
  P: "g1@2 g2@2 g1@2 g2@2 g1@2 d2 g1 a1 bb1 c2 db2", Q: "d1 d2 d1 d2 d1 d2 d1 d2, d2 ~@15",
  R: "g1 g2 g1 g2 c2 c3 c2 c3", S: "g1 g2 g1 g2 a1 a2 a1 a2", T: "g1 g2 g1 ~@5",
})).s("gm_synth_bass_1").gain(0.47)

// chords · pad poly
const pad_poly = note(`<
  ~@20 A B C D A B C E ~@6 F G H ~ A B C D A B C E ~@14 F G H I ~@8 A B C D A B C E ~@22 A J ~@22
>`.pickRestart({
  A: "[a3,c4,f4]", B: "[bb3,d4,f4]", C: "[d4,f4,g4]", D: "[c4,e4,g4]", E: "[c4,e4,g4] [db4,e4,g4,a4]",
  F: "[d4,f4,a4]@15 ~", G: "[c4,e4,g4]@15 ~", H: "[a3,d4,f4]@15 ~",
  I: "~@2 [g3,d4,g4] ~@3 [ab3,eb4,ab4] ~@3 [a3,e4,a4]@6", J: "[b3,d4,g4] [db4,e4,a4]",
})).s("gm_pad_poly").gain(0.35)

// other · overdriven guitar
const overdriven_guitar = note("<~@2 A@2 B ~@42 C D@2 ~ E@3 ~@27 F D@2 ~ E@3 ~@32 G@6>".pickRestart({
  A: "[[d5,d6]@26 ~@4 d6!2]/2", B: "d6 ~@7", C: "d5@4 d5@3 ~ d5@3 ~ d5@3 ~", D: "[d5@3 ~ d5@3 ~ d5@6 d6@18]/2",
  E: "[~@2 f4 a4 c5 d5 c5@21 a4 c5 d5 c5@10 a2@3 ~@5]/3", F: "d5@4 d5@3 ~ d5@4 d5@3 ~",
  G: "[~ a4@2 d5@2 gb5@2 d4@2 g4@2 b4@2 f5@2 d4@2 a4@2 d5@2 gb5@2 d4@2 g4@2 b4@2 f5@2 d4@2 a4@2 d5@2 gb5@2 d4@2 ~@7]/6",
})).s("gm_overdriven_guitar").gain(0.35).pan(0)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@4 A B A B A B A C A B A@2 B@2 A D E F G H E F G I A B A@2 B A@2 B A D E F G H E F G I J K J K J K L M A B A@2 B A@2
  B A N ~@8 E F G H E F G I J K J K J K L O ~@16 A B A B A B A B A B A B A B A B A B A B A P
>`.pickRestart({
  A: "~@2 [d3,a3,d4] ~@3 [d3,a3,d4] ~", B: "~@2 [d3,g3,d4] ~@3 [d3,g3,d4] ~",
  C: "[a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~@9", // A5
  D: "[c3,g3,c4] ~ [c3,g3,c4] ~ [c3,g3,c4] ~ [c3,g3,c4] ~ [c3,g3,c4] ~@7", E: "~@2 [f3,c4,f4] ~@3 [f3,c4,f4] ~",
  F: "~@2 [f3,bb3,f4] ~@3 [f3,bb3,f4] ~", G: "~@2 [g3,d4,g4] ~@3 [g3,d4,g4] ~", H: "~@2 [c3,g3,c4] ~@3 [c3,g3,c4] ~",
  I: "~@2 [g3,c4,g4] ~@3 [a3,e4,a4] ~", J: "[d3,a3,d4]", K: "[g2,d3,g3]", L: "[d3,a3,d4]@15 ~",
  M: "[a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~", // A5
  N: "~ [g2,d3,g3] ~ [ab2,eb3,ab3] ~ [a2,e3,a3]@3", // G5 Ab5 A5
  O: "[a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~ [a2,e3,a3] ~@7", P: "~@2 [d3,g3,d4] ~@5",
})).s("gm_electric_guitar_clean").gain(0.3).pan(1)

// other · clavinet
const clavinet = note(`<
  ~@65
  [~@10 d3 g2 a2 bb2 c3 db3]
  [d3 ~@15]
  [~@10 d3 g2 a2 bb2 c3 db3]
  [d3 ~@15]
  [~@10 d3 g2 a2 bb2 c3 db3]
  [d3 ~@15]
  ~@55
>`).s("gm_clavinet").gain(0.45)

// chords · brass section
const brass_section = note(`<
  ~@7 A B ~@3 C ~@6 D ~@8 C ~@8 D ~@16 C ~@9 E F G H@3 G F ~@32 C ~@3 C ~@3 C ~@3 C ~@3 C ~@3 C ~
>`.pickRestart({
  A: "~@2 [e5,g5,c6] [d5,g5,b5]", B: "~@4 [a4,d5,a5]@3 ~", C: "~@4 [d5,f5,a5]@3 ~@5 [d5,f5,a5]@3 ~",
  D: "[e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~@7", // C
  E: "~@2 [a4,d5,f5] ~ [a4,d5,f5] ~ [a4,d5,f5] ~ [a4,d5,f5] ~ [a4,d5,f5] ~ [a4,d5,f5] ~ [a4,d5,f5] ~", // Dm
  F: "[g4,c5,e5]@2 [g4,b4,d5] ~@3 [g4,b4,d5] ~@9", // C G
  G: "~@2 [a4,d5,f5] ~ [a4,d5,f5] ~ [a4,d5,f5] ~ [a4,d5,f5] ~ [a4,d5,f5] ~ [b4,d5,g5]@2 [a4,d5,f5] ~", // Dm G Dm
  H: "[[g4,c5,e5]@2 [g4,b4,d5] ~@3 [g4,b4,d5] ~@8 [e5,g5,c6]@2 ~ [d5,g5,b5] ~ [d5,f5,a5] ~@2 [e5,g5,c6]@2 ~ [d5,g5,b5] ~ [d5,f5,a5] ~@2 [e5,g5,c6]@2 ~ [d5,g5,b5] ~ [d5,f5,a5] ~@2 [e5,g5,c6]@2 ~ [d5,g5,b5] ~ [c5,f5,a5] ~@3]/3", // C G C G Dm C G Dm …
})).s("gm_brass_section").gain(0.78)

// other · synth brass 1
const synth_brass_1 = note("<~@96 A B A B A B ~@6 A B A B A B A B A B A B A B A B C D>".pickRestart({
  A: "~@14 d5 f5", B: "g5!2 ~ f5 ~ d5 c5 ~ g5!2 ~ f5 ~ d5 c5 ~", C: "~@14 c5 d5", D: "g5!2 ~ f5 ~@12",
})).s("gm_synth_brass_1").gain(0.4)

// other · pad new age
const pad_new_age = note(`<
  A B A B ~@2 A B ~@2 A ~@4 B ~@3 C D E F G D E F H ~@3 B ~@5 C D E F G D E F H ~@4 I J I K ~@3 B ~@14 D E F G D E F H
  ~@4 I J I K ~@18 A B ~@2 A B ~@2 A B ~@2 A B ~@2 A B ~@2
>`.pickRestart({
  A: "~@4 c7 ~ a6 ~ g6 ~ f6 ~@5", B: "c7 ~ a6 ~ g6 ~ f6 ~@9", C: "c7 ~ c7 ~ c7 ~ c7 ~ c7 ~@7", D: "f7 ~@7",
  E: "d7 ~@5 f7 ~", F: "g7 ~@7", G: "~@4 e7 ~@3", H: "g7 ~@3 a7 ~@3", I: "~@2 c5 d5 a5 g5 ~ c5 d5 ~ f5 ~ a5@4",
  J: "~@2 c5 d5 a5 g5 ~ c5 d5 ~ f5 ~ a5@2 g5 ~", K: "~@2 c5 d5 a5 g5 ~ a5 ~@8",
})).s("gm_pad_new_age").gain(0.4)

// drums · kick
const kick = s("bd").struct(`<
  ~@4 A@7 B A@7 B A@17 B A@11 C A@3 C A@9 D A@7 B A@11 C A@3 C ~@4 A@11 C A@21 E
>`.pickRestart({
  A: "x!4", B: "x!3 ~", C: "x ~ x ~ x ~ x ~ x ~ x ~ x!3 ~", D: "x!6 ~ x", E: "x!2 ~@2",
})).gain(0.45)

// drums · rim
const rim = s("rim").struct("<[x ~ x ~@3 x ~ x ~@2 x!5]!2 [x ~ x ~@5 x ~@2 x!5]!86 ~@38>").gain(0.4)

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

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

// drums · low tom
const low_tom = s("lt").struct("<~@3 [~@14 x!2] ~@83 [~@4 x!2 ~ x ~@8] ~@15 [~@4 x!2 ~ x ~@8] ~@22>").gain(0.45)

// drums · hihat
const hihat = s("hh").struct("<A@20 B@8 A@10 B@8 A@26 B@8 A@8 ~@16 A@21 C>".pickRestart({
  A: "x!16", B: "x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2", C: "x!5 ~@11",
})).gain(0.45)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 [~@12 x!2 ~@2] ~@49 [~@4 x!4 ~@8] ~@72>").gain(0.45)

// drums · open hat
const open_hat = s("oh").struct("<~@20 [~ x ~ x ~ x ~ x]!8 ~@10 [~ x ~ x ~ x ~ x]!8 ~@26 [~ x ~ x ~ x ~ x]!8 ~@46>")
  .gain(0.45)

// drums · crash
const crash = s("cr").struct("<~@8 A ~@3 A ~@15 A ~@25 A ~@9 A ~@39 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~>".pickRestart({
  A: "~ x ~@2",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct(`<
  ~@8 A ~@3 A ~ A ~ A ~ A ~@9 A ~ A ~ A ~ A ~ A ~@17 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@33 A ~@3 A ~@3 A ~@3 A ~@3 A
  ~@3 A ~
>`.pickRestart({
  A: "x",
})).gain(0.45)

// drums · cowbell
const cowbell = s("cb").struct("<~@46 A B A B A B A B ~@26 A B A B A B A B ~@38>".pickRestart({
  A: "x ~@2 x ~@2 x ~@7 x!2", B: "x ~@2 x ~@2 x ~@9",
})).gain(0.4)

// drums · congas
const congas = s("conga:13").struct("<A B A C D E B F D E B G D E B F D E B G ~@106>".pickRestart({
  A: "x!2 ~@2 x ~@3", B: "~ x ~@2 x ~@3", C: "~ x ~@2 x ~ x ~", D: "x!2", E: "x!2 ~ x!2 ~@3", F: "x!2 ~@2 x ~ x ~",
  G: "x!5 ~@3",
})).gain(1.27)

stack(
  piano, bass, pad_poly, overdriven_guitar, electric_guitar_clean, clavinet, brass_section, synth_brass_1, pad_new_age,
  kick, rim, snare, clap, low_tom, hihat, mid_tom, open_hat, crash, ride, cowbell, congas
)