Strudelify
Roses of Red cover art

Over The Hump

Roses of Red

The Kelly Family

KeyA majorTempo96 bpm
0:00/0:00
// Roses of Red — The Kelly Family
// 96 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 96 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(96/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, A@4 for four bars: edit a riff to change every repeat.

// bass · fretless bass · "FRETLESS"
const bass = note(`<
  ~ A@12 B A B A@4 C A@8 B A B A D E F G D E F C H I F D@2 E F D J K L M N O E P A@7 C D E F D@2 E Q D R D S D T E R D F
  E R D R D R D@3 A@2 D@2 U
>`.pickRestart({
  A: "a1@4 ~@2 a1@7 ~@3", B: "e1@4 ~@2 e1@7 ~@3", C: "a1@2 ~ a1@2 e1 f#1 e1", D: "a1@5 ~ a1@9 ~", E: "f#1@5 ~ f#1@9 ~",
  F: "e1@4 ~@2 e1@9 ~", G: "a1@5 ~ a1@4 e1@2 f#1@2 e1@2", H: "a1@4 ~@2 a1@9 ~", I: "f#1@4 ~@2 f#1@9 ~",
  J: "a1@4 ~@2 a1@5 ~ a1@3 ~", K: "e1@5 ~ e1@5 ~ e1@2 ~@2, ~@6 d1 ~@9", L: "f#1@5 ~ f#1@6 ~@4",
  M: "e1@4 ~@2 e1@4 f#1@2 [e1,f#1] ~ e1 ~, ~@10 e1 ~@5", N: "a1@5 ~ a1@6 ~@2 a1@2", O: "e1@5 ~ e1@7 ~ e1@2",
  P: "e1@5 ~ e1@4 f#1@2 e1@2 ~@2", Q: "d2@5 ~ d2@5 ~ d2@4", R: "d2@5 ~ d2@10", S: "d2@5 ~ d2@9 ~", T: "e1@2 ~ e1@5",
  U: "a1@2 ~ a1@3 ~@2",
})).s("gm_fretless_bass").gain(0.4)

// other · accordion
const accordion = note(`<
  ~@13 A B C D E@2 ~ F G H I B H@2 J K L@2 M N@4 O P@3 Q R S@2 T R U@3 ~@4 V W X Y Z@2 AA@4 AB@2 AC AD AE@2 AF AG AH AI
  AC AF AJ@2 AF@2 ~ AF AK@2 ~@13
>`.pickRestart({
  A: "b4@5 a4 g#4 ~", B: "e4", C: "b4@5 a4 ~@2", D: "~@5 a4 b4 ~, e4@7 ~",
  E: "[~@2 a5@2 g#5@2 e5@4 a4@2 ~@6 a5@2 g#5@2 e5@5 ~@5, ~@7 a4@7 ~@2]/2", F: "~@2 a5@2 g#5@2 e5@5 ~@5",
  G: "a4@2 a4@2 b4@2 a4@9 ~", H: "a4@2 b4 a4@5", I: "e4@4 e4@2 e4@9 ~", J: "g#4@4 e4@2 e4@9 ~", K: "e4@13 ~@3",
  L: "[b4@5 a4 g#4 f#4@2 a4@5 a4@2, ~@9 e4@7]/2", M: "b4@5 a4 g#4 f#4",
  N: "[a4@5 a4 b4 ~@2 a5 g#5 ~@2 a4 b4 ~@2 a5 g#5 e5@11 [g#4,b4]@2, e4@7 a4@6 ~@2 a4@6 ~@11, ~@18 b5 ~@3 e5@10 ~@32]/4", // G#m
  O: "a4@5 a4 b4 ~, c#5", P: "[~ a5 g#5 ~@2 a4 b4 ~@2 a5 ~ e5@11 b4@2, ~@3 e5@5 ~@16, ~@7 a4@8 ~@9]/3",
  Q: "[a4,c#5]@15 ~", R: "~ a4 g#4 e4@5", S: "[~ a4 g#4 e5@11 b4@2]/2", T: "c#5",
  U: "[~@2 a4@2 g#4@2 e5@18 ~@2 c#5@2 b4@2 a4@17 ~]/3", V: "a4@3 c#5", W: "e5@7 b4@8 ~, d#5 ~@15", X: "a4@7 a4 ~@8",
  Y: "b4 a4 b4 a4 b4 e4@2 ~", Z: "[a4, e4@15 ~]/2", AA: "[g#4@8 c#4@7 ~ a4@16, e4]/4",
  AB: "[g#4@16 ~@2 a5@2 g#5@2 e5@7 ~@3, e4@15 ~, ~@8 c#4@7 ~]/2", AC: "~ a5 g#5 e5@4 ~", AD: "~ a5 g#5 e5@5",
  AE: "[~@12 b4@2 c#5@11 ~@7]/2", AF: "~ a5 ~@6", AG: "~ a5 ~ e5@3 ~@2", AH: "~@2 a5@2 ~@2 e5@7 ~@3",
  AI: "~@2 a5@2 ~@2 e5@9 ~", AJ: "[~@2 a5@2 g#5@2 ~@6 f#5@2 e5@17 ~]/2", AK: "[e5 d5 c#5 b4@2 a4 ~ a4@9]/2",
})).s("gm_accordion").gain(0.24).pan(0.3)

// other · accordion · soft notes
const accordion_soft = note(`<
  ~@13 A ~ B C@2 ~@5 D E ~@3 F G@2 H ~@4 I@2 J ~@15 K L ~ M@2 ~@10 N J@3 ~ N O ~ P Q R N S ~@14
>`.pickRestart({
  A: "~@7 f#4", B: "~@6 g#4 f#4", C: "[~@14 a4@11 ~@3 b4@2 ~@2]/2", D: "g#4 ~@3", E: "[a3,c#4]", F: "c#4@13 ~@3",
  G: "[g#4@5 ~@2 b4@2 ~@7]/2", H: "g#4@5 ~@3", I: "[~@7 a4@5 ~@4]/2", J: "~@2 g#5 ~@5", K: "~@8 c#5 ~@7", L: "~ f#4",
  M: "[c#4@31 ~]/2", N: "~@4 g#5@2 e5@7 ~@3", O: "~@6 e5@5 ~@5", P: "~@2 g#5 e5@2 ~@3", Q: "~@2 g#5 e5@4 ~",
  R: "~@2 a5@2 g#5@2 e5@5 ~@5", S: "~@6 b4 ~",
})).s("gm_accordion").gain(0.16).pan(0.3)

// chords · string ensemble 2 · "SLOWSTRING"
const string_ensemble_2 = note("<~@49 A@2 B C A@2 B D ~@8 E@2 F G@8 H F I@2 J K@3 L M N O P@4 ~@4>".pickRestart({
  A: "e4/2", B: "f#4", C: "e4", D: "e4@7 ~", E: "[e6 f#6, [c#6,g#6,a6]]/2", F: "[e6,g#6]",
  G: "[~@32 f#6@16 d6@15 ~ [c#6,g#6]@15 ~ [d6,f#6]@16 [c#6,g#6]@15 ~ [d6,e6,f#6]@16, c#6@3 ~@5, e6@33 ~@15 e6@30 ~@2 e6@30 ~@18, ~ a6@7, ~@24 g#6@23 ~ f#6 ~@79]/8", // C#5 D C#5 D
  H: "c#6@15 ~", I: "[c#6@16 d6@15 ~, f#6]/2", J: "c#6, e6@7 ~", K: "[e6@16 c#6@16 d6@15 ~, g#6@2 ~, ~ f#6@2]/3",
  L: "[c#6,e6]", M: "~@4 e6@3 ~, [d6,f#6]", N: "[c#6,e6]@15 ~", O: "[d6,e6,f#6]", P: "[c#6,e6]/4",
})).s("gm_string_ensemble_2").gain(0.18)

// chords · synth strings 1 · "+SYN STR 3"
const synth_strings_1 = note(`<
  ~ A@5 B@7 C D C D A@5 B@7 C D C D A@5 E@8 F@4 C G C H@2 I C A@5 J@8 K@2 D L@2 M@2 N I L@2 O@2 P@5 Q@8
>`.pickRestart({
  A: "[e3@16 f#3@15 ~@17 [a3,c#4]@32, [a3,c#4]@31 [g#3,b3]@17 ~@32, ~@2 e3@3]/5", // A G#m
  B: "[f#3@15 ~@49 f#3@15 ~@17 [a3,c#4]@16, ~@15 [g#3,b3]@17 a3@46 ~ [g#3,b3]@17 ~@16, ~ e3@3 ~ e3@2, ~@16 c#4@21 ~@19]/7", // A G#m
  C: "[e3,g#3,b3]", D: "[e3,a3,c#4]",
  E: "[f#3@15 ~@49 f#3@15 ~@17 [a3,c#4]@32, ~@15 [g#3,b3]@17 [a3,c#4]@47 [g#3,b3]@17 ~@32, ~ e3@3 ~ e3@3]/8", // A G#m A G#m
  F: "[f#3@15 ~@17 [a3,c#4]@31 ~, ~@15 [g#3,b3]@17 ~@32, ~ e3@3]/4", G: "[a3,c#4], f#3@7 ~",
  H: "[[a3,c#4] [g#3,b3], e3]/2", I: "[f#3,a3,c#4]",
  J: "[f#3@15 ~@49 f#3@15 ~@17 [a3,c#4]@32, ~@15 [g#3,b3]@17 [a3,c#4]@47 [g#3,b3]@17 ~@32, ~@4 e3@15 ~ e3@12]/8", // A G#m A G#m
  K: "[f#3@15 f#3 d3@16, ~@15 a3@16 ~]/2", L: "[[f#3,d4] [e3,c#4], a3@31 ~]/2",
  M: "[[f#3,d4]@15 ~ [e3,c#4]@16, a3@29 ~@3]/2", N: "[g#3,b3], e3@13 ~@3", O: "[[e3,g#3,b3]@15 [f#3,a3,c#4]@16 ~]/2",
  P: "[[f#3,d4]@16 [e3,c#4]@16 [f#3,d4]@16 [e3,c#4]@15 [f#3,d4]@16 ~, a3]/5", Q: "[[e3,c#4]@61 ~@3]/8",
})).s("gm_synth_strings_1").gain(0.2)

// other · pad new age · "FANTASIA"
const pad_new_age = note(`<
  ~@17 A@2 ~ B ~@12 C A ~ D C@2 ~ E ~@19 F ~@3 C@2 G ~ F A G@2 F A G@2 F A G@2 F A G@2 F A G@2 F A G@2 A@2 G H
>`.pickRestart({
  A: "~@2 a5@2 g#5@2 e5@7 ~@3", B: "~ a5 g#5 e6@2 ~@3", C: "~@2 a5@2 g#5@2 e5@5 ~@5", D: "~@4 g#5@2 e6@9 ~, ~ a5@3 ~@4",
  E: "~@2 g#5 e6@4 ~, ~@2 a5@5 ~@9", F: "~ a5 g#5 e6@4 ~", G: "~@2 a5@2 g#5@2 e5@9 ~", H: "~ a5 g#5 ~@5",
})).s("gm_pad_new_age").gain(0.19).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~ [x ~@2 x ~@4]!95>").gain(0.45)

// drums · snare
const snare = s("sd").struct("<[~@3 x] [~ x ~ x]!94 [~ x ~@2]>").gain(0.45)

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

// drums · hihat
const hihat = s("hh").struct("<~ [x!2]!95>").gain(0.52)

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

// drums · high tom
const high_tom = s("ht").struct(`<
  ~@2 A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A@2 ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A@2 ~ A ~ A ~ A@2 ~ A ~ A ~ A ~
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(0.39)

// drums · shaker
const shaker = s("sh").struct("<~ [~ x ~ x ~ x ~ x]!94 [~ x ~ x ~@4]>").gain(0.39)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~ [~ x ~ x]!94 [~ x ~@2]>").gain(0.19)

// drums · claves
const claves = s("clave:2").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~@2 A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~@2 A ~ A ~ A ~ A@2 ~ A ~ A ~ A ~@2 A ~ A ~ A ~@2 A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@5 x ~@2",
})).gain(2.21)

stack(
  bass, accordion, accordion_soft, string_ensemble_2, synth_strings_1, pad_new_age, kick, snare, clap, hihat, mid_tom,
  high_tom, shaker, shaker_soft, claves
)

More by The Kelly Family