Strudelify

The Picture I View

The Cranberries

KeyE minorTempo84 bpm
0:00/0:00
// The Picture I View — The Cranberries
// 84 bpm, 6/8, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 61 bars on a 24-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 30.
setcpm(84/3)

// 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.

// other · pad poly
const pad_poly = note(`<
  ~@6 A@2 B@2 C D E F E G H I J K J K J K L M N O P Q N R S T U L V W X Y@2 W X Z@2 Y@2 ~ AA@2 B@2 C D E F E G E G ~
>`.pickRestart({
  A: "[a4@3 ~ b4@2 c5@3 ~ d5@6 e5@2 d5@3 ~ b4@6 b4@18 ~@2]/2",
  B: "[d5@2 c5@3 ~ b4@3 ~ d5@5 ~ d5@2 e5@3 ~ b4@5 ~ b4@18 ~@2]/2", C: "c5@8 c5@2 c5@5 ~ b4@3 ~ a4@3 ~",
  D: "b4@3 ~ d5 g4@5 g4!2", E: "c5@3 ~ b4@3 ~ a4@2 g4@2 a4@3 ~ b4@5 ~ a4@2", F: "g4@5 ~@5 g4!2", G: "g4@5 ~@7",
  H: "~@5 c5", I: "e5@10 ~@2 f5@5 ~ f5@2 e5@3 ~", J: "d5@5 ~ g5@5 ~ d5@5 ~ c5@2 c5@3 ~",
  K: "e5@8 d5@2 e5@2 f5@5 ~ f5@2 e5@3 ~", L: "d5@5 ~ d5@5 ~", M: "d5@5 ~@7", N: "a5@3 ~ b5@6 ~@2 g5@3 ~ a5@6 ~@2",
  O: "e5@3 ~ g5@5 ~ d5@2 d5@3 ~ c5@2 b4@6", P: "a4@5 c5", Q: "b4@19 ~@5", R: "e5@3 ~ g5@5 ~ d5@2 d5@3 ~ e5@2 f5@6",
  S: "e5@10 ~@2 f5@6 ~@2 c5@3 ~", T: "d5@10 ~@2 g5@6 ~@2 f5@3 ~", U: "e5@6 ~@2 d5@2 e5@2 f5@6 ~@2 c5@3 ~",
  V: "d5@5 ~ e5@5 ~", W: "a5@5 ~ a5@2 b5@3 ~ g5@5 ~ g5@2 a5@3 ~", X: "e5@2 d5@3 ~ e5@9 ~@5 d5@3 ~",
  Y: "[c5@3 ~ d5@8 c5@6 ~@2 g4@2 g4@12 ~@14]/2", Z: "[c5@3 ~ d5@8 c5@6 ~@2 g4@2 g4@12 ~@6 d5@3 ~ d5@3 ~]/2",
  AA: "[b4@3 ~ c5@2 c5@3 ~ d5@6 e5@2 d5@3 ~ b4@6 b4@18 ~@2]/2",
})).s("gm_pad_poly").gain(0.48)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note(`<
  ~ A B A B C A B A B A B A B A B D E F E F E F E F G E F E F E F E F E F H E F E F E F E F E F H A B A B A B A B A B A
  I@2
>`.pickRestart({
  A: "[a3,c4,e4]@3 ~ [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@3 ~ [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@2 [a3,c4,e4]@2", // Am
  B: "[g3,b3,e4]@3 ~ [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@3 ~ [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2", // Em
  C: "[g3,b3,e4]@3 ~ [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [e3,g3,b3,e4]@10 ~@2", // Em
  D: "[g3,b3,e4]@3 ~ [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [e3,g3,b3,e4]@12", // Em
  E: "[e3,a3,c4]@3 ~ [e3,a3,c4]@2 [e3,a3,c4]@2 [e3,a3,c4]@2 [e3,a3,c4]@2 [e3,a3,c4]@3 ~ [e3,a3,c4]@2 [e3,a3,c4]@2 [e3,a3,c4]@2 [e3,a3,c4]@2", // Am
  F: "[e3,g3,b3]@3 ~ [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@3 ~ [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@2", // Em
  G: "[e3,g3,b3]@3 ~ [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3,e4]@12", // Em
  H: "[e3,g3,b3]@3 ~ [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@2 [e3,g3,b3]@10 ~@2", // Em
  I: "[[g3,b3,e4]@3 ~ [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@2 [g3,b3,e4]@31 ~@5]/2", // Em
})).s("gm_acoustic_guitar_nylon").gain(0.29)

// chords · distortion guitar
const distortion_guitar = note("<A@2 ~@16 B ~ B ~ B ~@38>".pickRestart({
  A: "[~ c4@3]/2", B: "~@7 [g3,b3,e4] ~@4",
})).s("gm_distortion_guitar").gain(0.12)

// chords · epiano1
const epiano1 = note(`<
  ~@6 A B A B A B A B A B ~@10 C D C D C D C D C D E F G F H F G F I F J@2 A B A B A B A B A B A K@2
>`.pickRestart({
  A: "a4@3 ~ e5@3 ~ a4@3 ~ c5@3 ~ e5@3 ~ a4@3 ~", B: "~ [g4,b4]@19 ~@4, e4@19 ~@5",
  C: "~@4 [e4,g4,c5,g5]@3 ~ [e4,g4,c5,g5]@3 ~@5 [e4,g4,c5,g5]@3 ~ [e4,g4,c5,g5]@3 ~", // C
  D: "~@4 [g4,b4,e5,b5]@3 ~ [g4,b4,e5,b5]@3 ~@5 [g4,b4,e5,b5]@3 ~ [g4,b4,e5,b5]@3 ~", // Em
  E: "~@4 [g4,b4,e5,b5]@3 ~ [g4,b4,e5,b5]@3 ~@13", F: "[a4,c5,e5]@5 ~ [c5,e5,g5]@5 ~",
  G: "[g4,b4,e5]@5 ~ [e4,g4,b4]@5 ~", H: "[g4,b4,e5,b5]", I: "[e4,g4,b4,e5]",
  J: "[[e4,g4,b4,e5]@34 ~@3 [b3,e4]@10 ~, ~@18 g4@5 ~]/2", K: "[~ [g4,b4]@43 ~@4, e4@43 ~@5]/2",
})).s("gm_epiano1").gain(0.07)

// bass · acoustic bass
const bass = note(`<
  ~@6 A B A C A D A E A F@2 G H G H G H G I@2 G H G H G H G H G I@2 G J G J G J G J G I@2 A K A E A L A B A B A M@2
>`.pickRestart({
  A: "a1@10 ~@2 c2@6 ~@2 d2@3 ~", B: "e2@19 ~@5", C: "e2@8 b2@2 a2@2 g2@3 ~ e2@6 ~@2",
  D: "e2@8 b2@2 a2@2 g2@3 ~ e2@4 b1@3 ~", E: "e2@16 d2@3 ~ b1@3 ~", F: "[e2@10 ~@2 b1@31 ~@5]/2",
  G: "a1@3 ~ a1@6 ~@2 c2@3 ~ c2@6 ~@2", H: "b1@3 ~ b1@6 ~@2 b1@3 ~ b1@3 ~ b1@3 ~", I: "[b1@43 ~@5]/2",
  J: "b1@3 ~ b1@6 ~@2 e2@3 ~ d2@3 ~ b1@3 ~", K: "e2@3 c2 b1@2", L: "e2@5 ~ b1@5 ~", M: "[e2@43 ~@5]/2",
})).s("gm_acoustic_bass").gain(0.48)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@6 A ~ A ~ A ~ A ~@12 B ~@10 B ~@10 B A ~ A ~ A ~ A ~@6>".pickRestart({
  A: "~@4 x!2 ~@6", B: "~@3 x!2 ~@7",
})).gain(0.09)

// drums · hihat
const hihat = s("hh").struct("<~@6 A@9 B C D@7 E@2 D@9 E@2 D@9 ~@2 A@11 B C>".pickRestart({
  A: "x!6", B: "x!3 ~ x!2", C: "~ x!2 ~@3", D: "x!12", E: "x!2",
})).gain(0.14)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@15 [x!6 ~ x!5] [~ x!5 ~@6] ~@42 [x!6 ~ x!5] [~ x!5 ~@6]>").gain(0.09)

// drums · low tom
const low_tom = s("lt").struct("<~@21 x ~@39>").gain(0.14)

// drums · mid tom
const mid_tom = s("mt").struct("<~@9 A ~@10 B ~@8 B ~@3 B ~@6 B ~@3 B ~@6 A ~@9>".pickRestart({
  A: "~@2 x", B: "~@10 x!2",
})).gain(0.14)

// drums · open hat
const open_hat = s("oh").struct("<~@13 A@2 B C ~@38 A@2 B A B C>".pickRestart({
  A: "~@5 x", B: "~ x", C: "x!2",
})).gain(0.14)

// drums · high tom
const high_tom = s("ht").struct("<~@7 A ~@3 A ~@8 B ~@8 B ~@3 B ~@6 B ~@3 B ~@4 A ~@3 A ~@7>".pickRestart({
  A: "~ x", B: "~@3 x",
})).gain(0.14)

// drums · crash
const crash = s("cr").struct(`<
  ~@13 A@2 ~@2 B C B C B C B D ~ B C B C B C B C B D ~ B C B C B@3 C B D ~@11 A ~@2
>`.pickRestart({
  A: "~@5 x", B: "x!2 ~ x!2 ~", C: "x!2 ~ x ~@2", D: "x",
})).gain(0.14)

// drums · ride
const ride = s("rd").struct("<~@6 A@10 B ~@7 C ~@10 C ~@12 A@12 B>".pickRestart({
  A: "x!6", B: "x!4 ~@2", C: "x",
})).gain(0.14)

stack(
  pad_poly, acoustic_guitar_nylon, distortion_guitar, epiano1, bass, kick, snare, snare_soft, hihat, hihat_soft,
  low_tom, mid_tom, open_hat, high_tom, crash, ride
)

More by The Cranberries