Strudelify

Just My Imagination

The Cranberries

KeyF majorTempo100 bpm
0:00/0:00
// Just My Imagination — The Cranberries
// 100 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 82 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(100/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.

// other · piano
const piano = note(`<
  ~@7 A@2 B C@2 D@2 E@2 D@2 E@2 ~@5 F@2 G@2 B H I D@2 E@2 D@2 E@2 ~@12 J@3 ~ D@2 E@2 D@2 E@2 ~@18
>`.pickRestart({
  A: "[g4@3 f4@8 ~@5]/2", B: "~@3 bb4@2 a4@2 f4", C: "[g4@3 bb4@3 g4 f4@3 eb4@2 eb4@16 ~@4]/2", D: "f4",
  E: "[f4@2 eb4@4 d4 eb4@3 f4@16 ~@6]/2", F: "[~@3 bb4@2 a4@2 f4@8 ~]/2", G: "[~@6 f4@2 eb4@3 f4@3 d4@16 ~@2]/2",
  H: "g4@2 bb4 g4 f4 eb4@3", I: "g4@3 f4 eb4@3 d4", J: "[~@3 bb4@6 a4@8 ~@7]/3",
})).s("gm_piano").gain(0.05)

// chords · string ensemble 2
const string_ensemble_2 = note(`<
  ~@3 A B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E
  B C D E B C D E B C D E B C D E B C D E F@2
>`.pickRestart({
  A: "[g3,bb3,d4] [f3,a3,c4], g4", B: "[bb2,d4,f4,bb4]", C: "[f2,c4,f4,a4]", D: "[c3,c4,eb4,g4]",
  E: "[g2,bb3,d4,g4] [f2,c4,f4,a4]", F: "[[bb2,d4,f4,bb4]@3 ~]/2",
})).s("gm_string_ensemble_2").gain(0.34)

// bass · fretless bass
const bass = note(`<
  ~@3 A B C D E B C D E B F G H B F G H B F G I B C D E B C D E B F G H B F G H B F G I B F G I B C D E B C D E B F G H
  B F G H B F G H B F G H B F G H B F G I J@2
>`.pickRestart({
  A: "g1@3 g1 f1@3 f1", B: "bb1@4 bb1@2 ~ bb1 bb1@2 bb1@2 c2@2 d2@2", C: "f2@4 f2@2 ~ f2 f2@2 f2@2 eb2@2 bb1@2",
  D: "c2@4 c2@2 ~ c2 c2@2 c2@2 c2@2 c2@2", E: "g1@4 g1@2 ~ g1 f1@2 f1@2 f1@2 f1@2",
  F: "f2@4 f2@2 ~ f2 f2@2 f2@2 g2@2 bb2@2", G: "c3@4 c3@2 ~ c3 c3@2 c3@2 bb2@2 f2@2",
  H: "g2@4 g2@2 ~ g2 f2@2 f2@2 eb2@2 eb2@2", I: "g2@4 g2@2 ~ g2 f2@2 f2@2 eb2@2 c2@2", J: "[bb1@3 ~]/2",
})).s("gm_fretless_bass").gain(0.64)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@12 A B C D E B C D F ~@3 G H I J G H I J A B C D E B C D E B C D E B C D K H I J G H I J A B C D E B C D A B C D E B
  C D A B C D E B C D ~@2
>`.pickRestart({
  A: "[f4,bb4,d5]@2 [bb4,d5]!14", B: "[a4,c5]!16", C: "[c5,eb5]!16", D: "[bb4,d5]!8 [a4,c5]!8", E: "[bb4,d5]!16",
  F: "[bb4,d5,f5] ~@7", G: "~@2 f4@2 bb4@2 f4@2 d5@2 bb4@2 f4@2 bb4 ~, bb3",
  H: "~@2 f4@2 a4@2 ~@2 f5 ~ a4@2 f4@2 a4@2, f3@15 ~, ~@3 f4@2 ~@3", I: "~@2 g4@2 c5@2 g4@2 eb5@2 c5@2 g4@2 c5 ~, c4",
  J: "~ g4 bb4 g4 ~ f4 a4 f4, g3 f3", K: "[bb4,d5,f5]@2 f4@2 bb4@2 f4@2 d5@2 bb4@2 f4@2 bb4 ~, bb3",
})).s("gm_electric_guitar_clean").gain(0.41).pan(0.2)

// chords · acoustic guitar steel
const acoustic_guitar_steel = note(`<
  A B C D E F G H E F G I J K L M J K L M J K L M E F G H E F G I J K L M J K L M J K L M J K L M E F G H E F G I J K L
  M J K L M J K L M J K L M J K L M J K L M N@2
>`.pickRestart({
  A: "[bb2,bb3,d4,f4,bb4]@4 [bb2,bb3,d4,f4,bb4]!4 ~@8", B: "[c3,f3,c4,f4,a4]@4 [c3,f3,c4,f4,a4]!4 ~@8",
  C: "[c3,g3,bb3,eb4,g4]@4 [c3,g3,bb3,eb4,g4]!3 [c3,g3,bb3,eb4,g4]@2 [c3,g3,bb3,eb4,g4]!7", // Cm7
  D: "[g3,bb3,d4,g4]@2 [g3,bb3,d4,g4]!6 [f3,a3,c4,g4]@2 [f3,a3,c4,g4]!6", // Gm F
  E: "[bb3,d4,f4]@2 [bb3,d4,f4]@2 [bb3,d4] ~ [bb3,d4] [bb3,d4,f4] [bb3,d4,f4]@2 [bb3,d4,f4]@2 [bb3,d4,f4]@2 [bb3,d4,f4]@2, ~@2 f4 ~@5", // Bb
  F: "[a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4] ~ [a3,c4] [a3,c4,f4] [a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4,f4]@2, ~@2 f4 ~@5", // F Am F
  G: "[c4,eb4,g4]@2 [c4,eb4,g4]@2 [c4,eb4] ~ [c4,eb4] [c4,eb4,g4] [c4,eb4,g4]@2 [c4,eb4,g4]@2 [c4,eb4,g4]@2 [c4,eb4,g4]@2, ~@2 g4 ~@5", // Cm
  H: "[bb3,d4,g4]@2 [bb3,d4,g4]@2 [bb3,d4] ~ [bb3,d4] [bb3,d4,g4] [a3,c4,g4]@2 [a3,c4,g4]!6, ~@2 g4 ~@5", // Gm Bb Gm Am7
  I: "[bb3,d4,g4]@2 [bb3,d4,g4]@2 [bb3,d4] ~ [bb3,d4] [bb3,d4,g4] [a3,c4,f4]@2 [a3,c4,f4]!6, ~@2 g4 ~@5", // Gm Bb Gm F
  J: "[bb3,d4,f4]@2 [bb3,d4,f4]@2 [bb3,d4] ~ [bb3,d4] [bb3,d4,f4]@2 [bb3,d4,f4] [bb3,d4,f4]@2 [bb3,d4,f4]@2 [bb3,d4,f4]@2, ~@2 f4 ~@5", // Bb
  K: "[a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4] ~ [a3,c4] [a3,c4,f4]@2 [a3,c4,f4] [a3,c4,f4]@2 [a3,c4,f4]@2 [a3,c4,f4]@2, ~@2 f4 ~@5", // F Am F
  L: "[c4,eb4,g4]@2 [c4,eb4,g4]@2 [c4,eb4] ~ [c4,eb4] [c4,eb4,g4]@2 [c4,eb4,g4] [c4,eb4,g4]@2 [c4,eb4,g4]@2 [c4,eb4,g4]@2, ~@2 g4 ~@5", // Cm
  M: "[bb3,d4,g4]@2 [bb3,d4,g4]@2 [bb3,d4] ~ [bb3,d4] [a3,c4,g4]@2 [a3,c4,g4] [a3,c4,g4]@2 [a3,c4,g4]!4, ~@2 g4 ~@5", // Gm Bb Am7
  N: "[[bb3,d4,f4]@3 ~]/2", // Bb
})).s("gm_acoustic_guitar_steel").gain(0.46).pan(0.3)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct(`<
  ~@4 A B C D E@2 B D A E ~@2 F A F ~@2 G ~ D C G D@2 E ~ B D@2 G ~@3 B ~@2 D ~ G ~@2 G@2 ~ D G D ~ D A D@2 ~@26
>`.pickRestart({
  A: "~@9 x ~@6", B: "~@2 x ~@12 x", C: "~@2 x ~@6 x ~@6", D: "~ x ~@6", E: "~@2 x ~@6 x ~@5 x", F: "~@9 x ~@5 x",
  G: "~@15 x",
})).gain(0.24)

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

// drums · low tom
const low_tom = s("lt").struct(`<
  ~@7 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@2
>`.pickRestart({
  A: "~@15 x",
})).gain(0.4)

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~@7 A ~@3 A ~@3 A ~@3 B ~@3 A ~@3 A ~@3 A ~@3 A ~@3 B ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 B ~@3 A ~@3 B ~@3 A ~@3 B ~@2
>`.pickRestart({
  A: "~@11 x!3 ~@2", B: "~@6 x ~@4 x!3 ~@2",
})).gain(0.48)

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

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

// drums · ride
const ride = s("rd").struct("<~@4 [x!8]!76 x ~>").gain(0.4)

stack(
  piano, string_ensemble_2, bass, electric_guitar_clean, acoustic_guitar_steel, kick, snare, snare_soft, hihat, low_tom,
  mid_tom, open_hat, crash, ride
)

More by The Cranberries