Strudelify

Gipsy Woman

Crystal Waters

KeyD minorTempo120 bpm
0:00/0:00
// Gipsy Woman — Crystal Waters
// 120 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 224 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~@66 A@2 B C A@2 B D A@2 B C A@2 B D A@2 B C A@2 B D A@2 B C A@2 B D A@2 B C A@2 B D A@2 B C A@2 ~@44 B C A@2 B D A@2
  B C A@2 B D A@2 B C A@2 B D A@2 B C A@2 B D A@2 B C A@2 B D A@2 ~@28
>`.pickRestart({
  A: "[d3,a3,c4,e4]@3 ~ [d3,a3,c4,e4]@3 [d3,a3,c4,d4]@3 [d3,a3,c4,d4]@3 [d3,a3,c4,d4]@3", // Am D7
  B: "[a2,g3,c4,e4]@3 ~ [a2,g3,c4,e4]@3 [bb2,a3,d4,f4]@3 [bb2,a3,d4,f4]@3 [bb2,a3,d4,f4]@3", // Am7 Bbmaj7
  C: "[e3,g4,b4,d5]@3 ~ [e3,g4,b4,d5]@3 [eb3,g4,bb4,d5]@3 [eb3,g4,bb4,d5]@3 [eb3,g4,bb4,d5]@3", // Em7 Ebmaj7
  D: "[g2,bb3,d4,f4]@3 ~ [g2,bb3,d4,f4]@3 [c3,bb3,db4,e4]@3 [c3,bb3,db4,e4]@3 [c3,bb3,db4,e4]@3", // Gm7 Bbdim
})).s("gm_piano").gain(0.29).pan(0.3)

// bass · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~@48 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 ~@8 A B C@2 A D C@2 A B C@2 A D
  C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 ~@4 A B C@2 A D C@2 A B C@2 A D C@2 A B A B A D C@2 A B C@2 A D C@2 A B
  C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 ~@8
>`.pickRestart({
  A: "a1@2 e2@2 bb1@2 f2 bb1", B: "g1@2 d2@2 c2@2 g1 c2", C: "a1@2 d2@2 a1@2 f2 d2", D: "e2@2 e2@2 eb2@2 bb1 eb2",
})).s("gm_acoustic_bass").gain(0.12)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B
  C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A
  D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2 ~@24 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D
  C@2 A B C@2 A D C@2 A B C@2 A D C@2 A B C@2 A D C@2
>`.pickRestart({
  A: "[a3,g4,c5,e5]@3 ~ [a3,g4,c5,e5]@3 [bb3,a4,d5,f5]@3 [bb3,a4,d5,f5]@3 [bb3,a4,d5,f5]@3", // Am7 Bbmaj7
  B: "[g3,bb4,d5,f5]@3 ~ [g3,bb4,d5,f5]@3 [c4,bb4,db5,e5]@3 [c4,bb4,db5,e5]@3 [c4,bb4,db5,e5]@3", // Gm7 Bbdim
  C: "[d4,a4,c5,e5]@3 ~ [d4,a4,c5,e5]@3 [d4,a4,c5,d5]@3 [d4,a4,c5,d5]@3 [d4,a4,c5,d5]@3", // Am D7
  D: "[e4,g5,b5,d6]@3 ~ [e4,g5,b5,d6]@3 [eb4,g5,bb5,d6]@3 [eb4,g5,bb5,d6]@3 [eb4,g5,bb5,d6]@3", // Em7 Ebmaj7
})).s("gm_percussive_organ").gain(0.12).pan(0.8)

// bass · tuba
const bass_2 = note("<~@167 [~@10 d3@3 ~ a2 e3]!9 ~@8 [~@10 d3@3 ~ a2 e3]!8 ~@32>").s("gm_tuba").gain(0.22).pan(0.8)

// drums · rim
const rim = s("rim").struct("<~@120 A@12 ~@16 A@16 ~@8 A@33 ~ A@2 ~@16>".pickRestart({
  A: "~@3 x ~@4",
})).gain(0.27)

// drums · kick
const kick = s("bd").struct(`<
  ~@30 A@32 B ~@3 A@25 B ~@4 A@17 B A@18 B ~ A@18 B ~@3 A@9 B A@39 B A@4 B ~ A@4 B ~@7
>`.pickRestart({
  A: "x!4", B: "x",
})).gain(0.34)

// drums · kick · soft notes
const kick_soft = s("bd").struct(`<
  ~@48 A@15 B@3 A@22 ~@8 A@16 ~@8 A@13 B A@2 ~@12 A@5 B@3 A@49 ~ A@2 C@2 ~@14
>`.pickRestart({
  A: "~ x ~ x ~ x ~@2", B: "x!2 ~ x ~ x ~@2", C: "~ x ~@6",
})).gain(0.14)

// drums · clap
const clap = s("cp").struct("<~@30 A@32 ~@4 A@25 ~@5 A@17 ~ A@51 ~ A@39 ~ A@4 ~@2 A@4 ~@8>".pickRestart({
  A: "~ x ~ x",
})).gain(0.27)

// drums · snare
const snare = s("sd").struct("<~@48 A@40 ~@8 A@16 ~@8 A@16 ~@12 A@57 ~ A@2 B@2 ~@14>".pickRestart({
  A: "~@4 x ~@2 x!3 ~@2 x!2 ~@2", B: "~ x ~@2",
})).gain(0.2)

// drums · hihat
const hihat = s("hh").struct(`<
  ~@30 A@32 ~@4 A@6 B@16 A@3 ~@5 B@36 A@2 B@30 A ~ A@2 B@37 ~ B@2 A@2 ~@2 A@4 ~@8
>`.pickRestart({
  A: "~@4 x ~@2 x!3 ~@6", B: "x!16",
})).gain(0.24)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~@30 A@32 B ~@3 A@6 ~@16 A@3 C ~@40 A@2 ~@30 A ~ A@2 ~@37 A ~@2 A@3 B A@4 B ~@7
>`.pickRestart({
  A: "~@3 x ~@3 x ~@3 x ~@3 x", B: "~@3 x ~@12", C: "~@3 x ~@3 x ~@3 x ~@4",
})).gain(0.03)

// drums · open hat
const open_hat = s("oh").struct("<~@30 A@32 B ~@3 A@14 ~@8 A@3 C ~@12 A@9 ~ A@51 ~ A@45 B A@4 B ~@7>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~@6", C: "~ x ~ x ~ x ~@2",
})).gain(0.27)

// drums · cowbell
const cowbell = s("cb").struct("<~@88 [~ x ~@2]!3 ~@73 [~ x ~@2]!4 ~@56>").gain(0.27)

// drums · bongos
const bongos = s("bongo:18").struct("<~@96 A@16 ~@8 A@44 ~@8 A@33 ~ A@2 ~@16>".pickRestart({
  A: "~@2 x ~ x ~@2 x!2 ~ x ~@2 x!3",
})).gain(0.45)

// drums · congas
const congas = s("conga:18").struct("<~@48 A B@13 ~@10 A B@7 A B@7 ~@136>".pickRestart({
  A: "x ~@2 x ~@11 x", B: "~@3 x ~@11 x",
})).gain(0.65)

// drums · triangle
const triangle = s("triangles:30").struct(`<
  ~@48 A@14 B ~@9 A@16 ~@8 A@16 ~@8 A@12 ~@2 A@2 ~@12 A@16 ~@8 A@33 ~ A@2 ~@16
>`.pickRestart({
  A: "x!16", B: "x!4 ~@12",
})).gain(2.36)

stack(
  piano, bass, percussive_organ, bass_2, rim, kick, kick_soft, clap, snare, hihat, hihat_soft, open_hat, cowbell,
  bongos, congas, triangle
)

More by Crystal Waters