Strudelify

No Woman, No Cry

Bob Marley

KeyC majorTempo77 bpm
0:00/0:00
// No Woman, No Cry — Marley Bob
// 77 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 138 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(77/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 · acoustic bass · "A. Bass"
const bass = note(`<
  ~ A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 A B C@2 D E F G H I J K D E F G H I J K A B C@2 A B C@2 D E F G H I J K D E
  F G H I J K L M N O P Q R S ~@2 C@2 T U C@2 A B C@2 A B C@2 A B C@2 A B C@2 D E F G H I J K D E F G H I J K A B C@2 A
  B C@2 A B C@2 A B C@2 A B C@2 A B V@3
>`.pickRestart({
  A: "c2 b1", B: "a1@3 ~ a1 ~ f1@8 g1@2", C: "[c2@8 f2@2 e2 ~ d2 ~ c2@10 g1@2 a1@2 b1@2 g1@2]/2",
  D: "c2@4 c2!2 c2@2 b1@3 ~ b1!2 g1@2", E: "a1@3 a1!3 e1@2 f1@2 ~ f1 f1@2 g1@2",
  F: "c2@3 c2!2 c2@2 c2 b1@2 ~ b1!3 g1 ~", G: "a1@3 a1 a1@2 e1@2 f1@3 f1 f1@2 g1@2", H: "c2@4 c2@3 c2 b1@2 ~ b1!3 g1@2",
  I: "a1@3 a1 a1@4 f1@2 ~ f1 f1@2 g1@2", J: "c2@2 ~ c2!2 c2@3 b1@3 b1 b1@2 g1@2",
  K: "a1@2 ~ a1 e1@2 ~ e1 f1!2 ~ f1 f1@2 g1@2", L: "c2@2 ~@4 c2@2 b1 ~@7", M: "~@2 a1 ~@2 a1 e1@2 f1@2 ~ f1!3 g1 ~",
  N: "c2 ~@4 f1 c2@2 b1 ~@7", O: "~@2 a1@2 ~ a1 e1 ~ f1!2 ~ f1!3 g1 ~", P: "c2 ~@5 c2@2 b1 ~@7",
  Q: "~@2 a1 ~@2 a1 e1@2 f1@2 ~ f1!3 g1@2, ~@14 f1 ~", R: "c2 ~@4 g1 c2 ~ b1 ~@7",
  S: "~@2 a1 ~@2 a1 e1@2 f1!2 ~ f1!2 ~ g1 ~", T: "c3 b2", U: "a2@3 ~ a2 ~ f2@8 g2@2",
  V: "[c2@8 f2@2 e2 ~ d2 ~ c2@21 ~@13]/3",
})).s("gm_acoustic_bass").gain(0.72)

// chords · percussive organ · "Perc. Organ"
const percussive_organ = note(`<
  A@2 B C@2 D E F@2 G B C@2 D E F@2 G B C@2 D E H@2 I J K@2 L M N O P Q@3 I R@2 S G B C@2 D E H@2 I J K@2 L M N O P Q@3
  I R@2 T U V W X Y Z AA AB G B C@2 D E H@2 G B C@2 D E H@2 G B C@2 D E H@2 I J K@2 L M N O P Q@3 I R@2 S G B C@2 D E
  H@2 G B C@2 D E H@2 G B C@2 D E AC@3
>`.pickRestart({
  A: "[~@4 [g3,g4,b4] [a3,a4,c5] [b3,d5] [g3,g4] [c4,c5,e5]@4 [b3,b4,d5]@4, ~ g5@3, ~@12 b4@4 b4 ~@15]/2", // G Am Bm G C Bm
  B: "[a3,a4,e5]@2 [a4,e5] [f3,f4,c5,f5,a5]@4 [g4,c5,f5,a5], c5@3 ~@5, ~@4 a3 ~@11", // A5 F
  C: "[g5@3 g5 [f3,a4,f5,a5] [e3,g4,e5,g5] [d3,f4,d5,f5] [c3,e4,g4,e5]@5 [g3,g4,b4] [a3,a4,c5] [b3,b4,d5] [g3,g4,b4], c5@23 ~ g5@7 ~, [c4,g4,e5] ~@3]/2", // F Em Dm C G Am Bm G …
  D: "[c4,c5,e5] [b3,b4,d5], g5", E: "[a3,a4,e5]@2 [a4,e5] [f3,f4,c5,f5,a5]@4 [g4,c6,f6,a6], c5@3 ~@5, ~@4 a3 ~@11",
  F: "[g6@3 g5 [f3,a4,f5,a5] [e3,g4,e5,g5] [d3,f4,d5,f5] [c3,e4,g4,e5]@5 [g5,b5] [f5,a5] [e5,g5] [d5,f5], c6@23 ~@9, [c4,g4,e6] ~@3]/2", // F Em Dm C G F Em Dm …
  G: "[c4,c5,e5] [b3,b4,d5], g5, b4 ~@15", // C Bm
  H: "[g6@3 g5 [f3,a4,f5,a5] [e3,g4,e5,g5] [d3,f4,d5,f5] ~@3 d6 c6 [g3,b4] [a3,c5] [b3,d5]@2, c6@11 ~@5, [c4,g4,e6]@4 ~@3 [c3,e4,g4,e5]@5 ~@4, ~@5 g5 [g5,b5,d6,g6]@2]/2", // F Em Dm G Am Bm C G
  I: "g4@5 ~@3 [b2,b4,d5]@8, [c3,c5,e5] ~, ~@3 g4@5", // Bm C
  J: "[a2,e4,g4,c5]@4 [a2,g4,c5]@2 [f2,f4,a4,c5]@4 c6 b5 c6 g5 a5 e5, ~@4 e4 ~@5 f2@6, ~@11 f4@4 ~, ~@3 [a4,c5]", // Am7 F Am
  K: "[[c3,c5,e5,g5]@8 [b2,b4,d5]@8 [c5,e5]@4 [g4,e5] ~ f2@4 c6 b5 c6 g5 [f5,a5] e5, g4@19 ~ c5@2 [a4,c5,f5]@7 a4@2 ~, f2 ~@15 a2@6 ~@6 f2@4, ~@15 c5]/2", // C Bm C F
  L: "g4@5 ~@3 [b2,b4,d5]@8, [c3,c5,e5,g5] ~, ~@3 g4@5", // Bm C
  M: "[a2,e4,g4,c5]@4 [a2,g4,c5]@2 [f2,f4,a4,c5]@4 c5 b4 c5 g4 a4 e4, ~@4 e4 ~@5 f2@6", N: "[c3,c5,e5] [b2,b4,d5], g4",
  O: "[a2,g4,c5,e5]@3 ~ [g4,e5] ~ [a4,c5,f5]@4 c7 b6 [c5,f5,c7] g6 a6 e6, ~@3 a2@2 ~ f2@3 ~ f2@4 ~@2, ~@4 c5@2 ~@5 a4@2 ~@3", // Am7 C F F5
  P: "g5@5 ~@3 [b2,b4,d5]@8, [c3,c5,e5,g6] ~, ~@3 g5@5", // Bm C
  Q: "[[a2,e4,g4,c5]@4 [a2,g4,c5]@2 [f2,f4,a4,c5]@4 c6 b5 c6 g5 a5 ~ [c3,c5]@8 [b2,b4,d5]@8 [c5,e5]@4 [g4,e5] ~ c5@4 c5 b4 c5 g4 [a4,f5] e4, ~@4 e4 ~@5 f2@6 g5@16 ~@6 f5@2 ~@8, ~@11 f4@4 e5@9 ~@12 c5@2 ~@8 c5@2, ~@12 [a4,c5]@4 g4@19 ~@13, ~@16 f2 ~@15 a2@6 [f2,a4]@6 f2@4]/3", // Am7 F C Bm C Dm Am F
  R: "[[a2,e4,g4,c5]@4 [a2,g4,c5]@2 [f2,f4,a4,c5]@4 c6 b5 c6 g5 a5 ~ [c3,c5,g5]@8 [b2,b4,d5]@8, ~@4 e4 ~@5 f2@6 ~@16, ~@11 f4@4 e5@9 ~@8, ~@3 [a4,c5] g4@4]/2", // Am7 F C5 Bm Am
  S: "[a2,g4,c5,e5]@3 ~ [g4,e5] ~ [a4,c5,f5]@4 ~@2 [c5,f5] ~@3, ~@3 a2@2 ~ f2@3 ~ f2@4 ~@2, ~@4 c5@2 ~@5 a4@2 ~@3", // Am7 C F F5
  T: "[a2,g4,c5,e5]@3 ~ [g4,e5] ~ [a4,c5,f5]@4 ~@2 [c5,f5] ~ [c5,f5,a5]@2, ~@3 a2@2 ~ f2@3 ~ f2@4 ~@2, ~@4 c5@2 ~@5 a4@2 ~@3", // Am7 C F F5 F
  U: "[c5,e5,g5] ~@2 c4 g4 [c5,e5] [g4,c5,e5] ~ [b3,g4,b4,d5] ~@2 b3 [g4,b4,d5] ~ [d6,g6] ~, ~@7 b5", // C G G5
  V: "[a5,c6,e6] ~ [a3,c5,e5] [a3,g4,c5,e5] ~ [a3,g4] [g4,c5,e5] c5 [f3,a4,c5,f5]!2 ~ [f3,a4,c5,f5]@2 ~ [f6,a6] ~, ~@7 c6", // Am Am7 A7 C F
  W: "[c6,e6,g6] ~@2 c4 ~ [c5,e5] ~ g4 [b3,g4,b4,d5] ~@2 g4 [b3,g4,b4,d5]!2 [d6,g6] ~, ~@2 g4 ~@4 b5", // C G G5
  X: "[a5,c6,e6]@2 [a3,g4,c5,e5]!2 ~ a3 [g4,c5,e5] c5 [f3,a4,c5,f5]!2 ~ [a4,c5,f5]@2 f3 [a4,c5,f5,a6] ~, ~@11 f3 ~@2 [c6,f6]@2", // Am Am7 C F F5
  Y: "[c6,e6,g6] ~ [c4,g4,c5,e5] [g4,c5,e5] ~ c4 [g4,c5,e5] ~ [b3,g4,b4,d5] ~@2 b3 [g4,b4,d5]!2 [b5,d6]@2, ~@14 g6 ~", // C G Bm
  Z: "[a5,c6]@2 [a3,g4,c5,e5]!2 ~ a3 [g4,e5] ~ [f3,a4,c5,f5]@4 ~@2 [c5,f5,a5]@2, e6 ~@5 c5@2 ~@8", // Am Am7 C F
  AA: "[c5,e5,g5] ~ [c4,g4,c5,e5] ~@2 c4 [g4,c5,e5] ~ [b3,g4,b4,d5] ~@2 b3 [g4,b4,d5]!2 [d6,g6] ~, ~@7 b5", // C G G5
  AB: "[a5,c6,e6] ~ [a3,g4,c5,e5] ~@2 a3 [g4,c5,e5] ~ [f3,a4,c5,f5]!2 ~ [f3,a4,c5,f5]@2 f3 [c6,f6,a6]@2, ~@14 [a4,c5,f5] ~", // Am Am7 C F
  AC: "[g6@6 g5@2 [f3,a4,f5,a5]@2 [e3,g4,e5,g5]@2 [d3,f4,d5,f5]@2 [c3,e4,g4,e5]@21 ~@13, c6@35 ~@13, [c4,g4,e6] ~@5]/3", // F Em Dm C
})).s("gm_percussive_organ").gain(0.22).pan(0.6)

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

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

// drums · clap
const clap = s("cp").struct(`<
  ~@5 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@4
>`.pickRestart({
  A: "~@3 x",
})).gain(0.35)

// drums · snare
const snare = s("sd").struct("<~@16 [~@3 x] ~@23 [~@12 x!2 ~@2] ~@23 [~@8 x!3 ~ x!3 ~] ~@73>").gain(0.69)

// drums · low tom
const low_tom = s("lt").struct("<~@24 A ~@40 B@8 ~@7 C ~@15 D ~@41>".pickRestart({
  A: "~ x", B: "~ x ~@2", C: "~@5 x ~@3 x ~@2 x ~@3", D: "~@11 x!2 ~@3",
})).gain(0.55)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct(`<
  ~ A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C
  ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@4 A ~ B C ~@5
>`.pickRestart({
  A: "~@7 x ~@5 x ~@2", B: "~@7 x ~@8", C: "~@5 x ~@10",
})).gain(0.28)

// drums · mid tom
const mid_tom = s("mt").struct("<~@16 [~ x!3 ~@12] ~@7 [~@5 x ~ x ~@8] ~@55 [~@3 x!2 ~@3 x ~@7] ~@57>").gain(0.69)

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

// drums · high tom
const high_tom = s("ht").struct("<~@16 A ~@7 B ~@23 C ~@19 D B ~@2 E ~@7 F ~@31 G ~@15 H ~@9>".pickRestart({
  A: "~@4 x!2 ~ x!2 ~@7", B: "~ x ~@2", C: "~@7 x!3 ~@2 x!2 ~@2", D: "~@9 x!2 ~ x!3 ~", E: "~@12 x!2 ~ x", F: "~ x ~@6",
  G: "~@8 x!3 ~ x!3 ~", H: "~@9 x!4 ~@2 x",
})).gain(0.69)

// drums · crash
const crash = s("cr").struct(`<
  ~@16 A ~@7 A ~@16 B ~@7 B ~@15 B ~@3 C ~@3 B ~@7 B ~@7 B ~@7 B ~@15 B ~@7 B ~@6 D ~@6 E ~@2
>`.pickRestart({
  A: "~@3 x", B: "x", C: "~ x ~@2", D: "~@15 x", E: "~@7 x",
})).gain(0.55)

// drums · tambourine
const tambourine = s("tb").struct("<~ [~ x ~ x ~ x ~ x]!134 [~ x ~ x ~ x ~@2] ~@2>").gain(0.48)

// drums · congas
const congas = s("conga:13").struct(`<
  ~ A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3
  B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C A@2 D A@3 B C
  A@2 ~@2
>`.pickRestart({
  A: "~ x ~@3 x ~@2", B: "~@3 x!2 ~@6 x ~ x ~ x", C: "~@4 x ~@4 x ~@6", D: "~@2 x ~@6 x ~ x!2 ~@3",
})).gain(1.33)

// drums · congas · soft notes
const congas_soft = s("conga:13").struct(`<
  ~@4 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@7 A ~@5
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(0.66)

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~ A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B
  C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E F G H A B C D E
  F G H A B C D E F G H A B C D E F G ~@2
>`.pickRestart({
  A: "x!2 ~@2 x ~@2 x ~@4 x ~@3", B: "x!2 ~@2 x ~@2 x ~ x ~@2 x ~@3", C: "x!2 ~@2 x ~@2 x!2 ~@3 x ~@3",
  D: "x ~@7 x!2 ~@6", E: "x ~ x ~@4 x ~@3 x!2 ~@3", F: "x ~@3 x ~@2 x!3 ~@2 x ~@3", G: "x!2 ~@2 x ~@2 x!3 ~@2 x ~@3",
  H: "x!2 ~@2 x ~@2 x!3 ~ x!2 ~@3",
})).gain(1.33)

// drums · congas · soft notes
const congas_soft_2 = s("conga:18").struct(`<
  ~ A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B
  C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E ~@3 A B C D E
  ~@4
>`.pickRestart({
  A: "~@8 x!2 ~@6", B: "~@5 x ~@2 x ~@6 x", C: "~@9 x ~@6", D: "~ x ~@3 x ~ x ~@8", E: "~@8 x ~@6 x",
})).gain(0.66)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [~ x ~ x ~ x ~ x]!135 ~@2>").gain(2.45)

// drums · shaker
const shaker = s("sh").struct("<~@65 A B C D E F G H ~@65>".pickRestart({
  A: "~ x!2 ~@10 x!2 ~", B: "~@5 x!2 ~@6 x!2 ~", C: "~@5 x!2 ~@7 x!2", D: "~@7 x ~@6 x!2", E: "~@6 x!2 ~@6 x!2",
  F: "~@6 x!2 ~@4 x!2 ~@2", G: "~@4 x ~@5 x ~@2 x!3", H: "~@5 x!3 ~@5 x ~@2",
})).gain(0.55)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@66 [~@15 x] [~@13 x ~@2] [~@5 x!2 ~@6 x ~@2] ~@2 [~@3 x ~@5 x ~@2 x ~@3] ~@66>")
  .gain(0.28)

stack(
  bass, percussive_organ, rim, kick, clap, snare, low_tom, hihat, hihat_soft, mid_tom, open_hat, high_tom, crash,
  tambourine, congas, congas_soft, congas_2, congas_soft_2, cabasa, shaker, shaker_soft
)

More by Bob Marley