Strudelify

Greensleeves

Vaughn

KeyC minorTempo47 bpm
0:00/0:00
// Greensleeves — Vaughn
// 47 bpm, 6/8, key C minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: ch 8 Guitar 2 -> acoustic guitar steel
// note: Full arrangement: all 40 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(47/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.

// bass · fretless bass
const bass = note("<A B C D E F G H I J K L M N G O P Q K R S F G H I Q K L M N G O P Q K T U V W@2>".pickRestart({
  A: "~@12 f1@9 ~ f1@2", B: "f1@11 ~ f1@9 ~ f1 ~", C: "f1@12 f1@9 ~ f1@2", D: "c2@5 ~ c2 ~ c2@4 f1@9 ~ f1 ~",
  E: "f1@11 ~ f2@10 f2@2", F: "bb1@9 bb1 ~ d2 eb2@10 g1@2", G: "ab1@9 c2 ~ eb2 d2@10 ab1@2",
  H: "g1@9 b1 ~ d2 c2@10 g1@2", I: "c2@4 eb2@4 g2@4 f2@9 g2 ~ f2", J: "bb1@5 bb1 g1@2 bb1@2 d2@2",
  K: "c2@11 ~ f2@10 f2@2", L: "c2@9 g2 ~ c2 f2@10 c2@2", M: "f1@6 ab1@5 ab1", N: "bb1@5 bb1 eb2@5 g1",
  O: "g1@10 ~ b1 c2@10 g1@2", P: "c2@3 g2 eb2 c2 ab1@5 ab1", Q: "bb1@10 bb1@2 g1@9 bb1 ~ d2",
  R: "c2@9 ~ c2@2 f1@8 c2@4", S: "f1@6 f2@5 f2", T: "c2@9 ~ c2@2 f1@10 f1@2", U: "bb1@12 f1@9 f1 ~ ab1",
  V: "c2@5 ~ c2@2 c2 ~ c2 ~ f1@7 ~ f1@3 ~", W: "[f1@11 ~ f1@35 ~]/2",
})).s("gm_fretless_bass").gain(0.64)

// other · pan flute
const pan_flute = note("<~@4 A B C D E B F G@2 H C D I H F J@2 ~@7 K H C D I H F L@3 ~@2>".pickRestart({
  A: "~@2 f4 ab4@2 bb4", B: "c5@4 d5 c5 bb4@4 g4@2", C: "eb4@4 f4 g4 ab4@4 f4@2", D: "f4 eb4 f4 g4@2 eb4",
  E: "c4@7 ~ f4@4 ab4@8 bb4@4", F: "eb4@4 f4 g4 ab4@3 g4 f4@2", G: "[e4@4 d4@4 e4@4 f4@21 ~@3 eb5@7 ~ eb5@4]/2",
  H: "eb5 d5 c5 bb4@2 g4", I: "c4@7 ~ [c4,d4] [eb4,f4] [ab4,bb4] [c5,d5] eb5@7 ~ eb5@4", J: "[e4 d4 e4 f4@5 ~@4]/2",
  K: "~@8 [c4,d4] [eb4,f4] [ab4,bb4] [c5,d5] eb5@7 ~ eb5@4", L: "[e4 d4 e4 f4@12 ~@3]/3",
})).s("gm_pan_flute").gain(0.72).pan(0.6)

// other · flute
const flute = note("<A B C D E ~@7 F G@2 H@2 I@2 J@2 ~@7 F G@2 H@2 I@2 J@2 ~@3>".pickRestart({
  A: "~@6 ab5@3 g5 f5@2", B: "e5 eb5 d5 c5@2 bb4", C: "bb4@5 ~@7", D: "~@7 f5 db5 bb4 g4 f4", E: "c5@7 ~@17",
  F: "~ ab5", G: "[ab5 g5 f5 g5@6 ~ ab5 f5]/2", H: "[g5@10 f5@2 g5@23 ~ ab5@11 ~]/2",
  I: "[ab5@4 g5@4 f5@4 g5@23 ~ ab5@12]/2", J: "[g5@3 ab5@5 ~@4]/2",
})).s("gm_flute").gain(0.32).pan(0.7)

// chords · string ensemble 1
const string_ensemble_1 = note("<A@3 B@2 ~@7 C@6 D@3 E F@3 E G@2 H@6 I@2 J@4>".pickRestart({
  A: "[~@12 [c5,ab5]@24 [bb4,g5]@23 ~ [c5,ab5]@6 [bb4,g5]@2 [ab4,f5]@4]/3", // Fm Eb Fm Eb Db
  B: "[[g4,e5]@6 [f4,d5]@2 [g4,e5]@4 bb4@12 a4@11 ~@13, ~@12 f5@23 ~@13]/2", // C Dm C
  C: "[~ ab4@2 g4@2 [d4,f4]@2 [eb4,g4]@2 [ab4,c5]@2 [bb4,d5], ~ eb4@4 ~@7]/6", // Dm Eb Ab Bb
  D: "[[c5,eb5] [ab4,f5] [g4,e5] [ab4,f5]@2 [c5,eb5], ~ c5@4 ~]/3", E: "[bb4,d5]",
  F: "[[ab4,c5] c5 b4 bb4 a4 [c5,eb5], ~ d5@2 c5@2 ~]/3", G: "[[c5,eb5] [ab4,f5] [g4,e5] [ab4,f5], ~ c5@3]/2",
  H: "[f4 g4 ab4 bb4 c5 d5 eb5 d5 c5 bb4 ab4 g4 ab5@24 g5@24 [d5,f5]@24 [c5,eb5]@24 [ab5,c6]@24 [g5,bb5]@12, ~ eb5@4 ~@7]/6", // Dm Cm Ab Gm
  I: "[[eb5,g5] [ab4,f5] [g4,e5] [ab4,f5], ~ c5@3]/2", // Eb Db C Db
  J: "[eb5@2 db5 [ab4,f5]@3 e5 d5 e5 ~@3 g4@3 [f4,a4,c5]@9, [g4,bb4] c5@2 f5@5, ~@2 [g4,g5] [bb4,db5]@2 ~@3]/4", // Db F Gm G Bbm
})).s("gm_string_ensemble_1").gain(0.48)

// other · french horn
const french_horn = note("<A@3 ~@37>".pickRestart({
  A: "[~@12 c5@20 f4@4 g4@23 ~@13]/3",
})).s("gm_french_horn").gain(0.64).pan(0.4)

// chords · synth strings 1
const synth_strings_1 = note("<A@4 B ~@7 C@6 D@3 ~@7 E@8 F@4>".pickRestart({
  A: "[~@3 [c4,ab4]@6 [db4,g4,bb4]@6 ab4@3 [e4,g4]@3 f4@2 g4, ~ f4@5 ~@2, ~@5 c4@2 [db4,bb4]]/4", B: "[c4,f4,a4] ~",
  C: "[~ [ab3,c4,eb4]@2 [bb3,d4] eb4 ab3 b3 bb3 a3 [ab3,c4]@2 [f3,bb3,d4], ~@3 g3@2 d4@2 eb4@4 ~, ~@4 c4@2 g3@3 ~@3]/6", // Ab Bb Ab Bb
  D: "[g3 ab3 [g3,e4] [ab3,f4]@2 ~, eb4 ~@2, ~ c4@4 ~]/3", // C Db
  E: "[~ [ab3,c4,eb4]@2 [bb3,d4] eb4 ab3 b3 bb3 a3 [ab3,c4]@2 [f3,d4] g3 ab3 [g3,e4] [ab3,f4], ~@3 g3@2 d4@2 eb4@4 ~ eb4@2 ~@2, ~@4 c4@2 g3@3 ~@2 bb3@2 c4@3]/8", // Ab Bb Ab Dm C Db
  F: "[[g3,bb3,db4] [ab3,f4] [g3,e4] ~ g3 [f3,a3,c4]@3, ~ c4@2 f4@5, ~@3 [bb3,db4]@2 ~@3]/4", // Gdim Db C F Bbm
})).s("gm_synth_strings_1").gain(0.24)

// chords · epiano1
const epiano1 = note("<~@4 A B C D E F G H I J K L M N O P@2 B C D E F G Q@2 J K L M N O R S T U@2>".pickRestart({
  A: "~@12 [c4,eb4,ab4]@11 ~", B: "[bb3,d4,f4,ab4]@11 ~ [bb3,d4,g4]@11 ~", C: "[c4,eb4,g4]@11 ~ [ab3,c4,d4,f4]@10 ~@2",
  D: "[g3,b3,d4,f4]@11 ~ [g3,bb3,eb4]@11 ~", E: "[g3,a3,eb4]@12 [f4,ab4,c5]@11 ~",
  F: "[d4,f4,bb4]@11 ~ [bb3,d4,f4]@11 ~", G: "[bb3,eb4,g4]@11 ~ [c4,eb4,ab4]@10 ~@2",
  H: "[c4,e4,g4]@11 ~ [c4,f4,ab4]@11 ~", I: "~@4 f5@7 ~ [ab4,c5,eb5]@11 ~, c5@11 ~@13",
  J: "[ab4,c5,eb5]@11 ~ [g4,bb4,d5]@11 ~", K: "[g4,c5,eb5]@10 ~@2 [f4,ab4,c5,d5]@11 ~",
  L: "[f4,g4,b4,d5]@11 ~ [eb4,g4,bb4,c5]@11 ~", M: "[eb4,g4,a4,c5]@12 [ab4,c5,eb5]@11 ~",
  N: "[ab4,c5,eb5]@10 ~@2 [f4,bb4,d5]@11 ~", O: "[g4,bb4,eb5]@11 ~ [ab4,c5,f5]@10 ~@2",
  P: "[[c5,e5,g5]@10 ~@2 [c5,f5,ab5]@23 ~ [c4,eb4,ab4]@11 ~]/2", // C Fm Ab
  Q: "[[c4,e4,g4]@11 ~ [c4,f4,ab4]@23 ~ [ab4,c5,eb5]@11 ~]/2", R: "[c5,e5,g5]@5 ~ [ab4,c5,f5]@6",
  S: "eb5@2 db5 [ab4,c5,f5]@3, [g4,bb4] ~", T: "~ d5 e5 [bb4,db5,f5]@3, [g4,c5] ~", U: "[g4 ab4 bb4 [f4,a4,c5]@9]/2",
})).s("gm_epiano1").gain(0.56).pan(0.3)

// other · epiano1
const epiano1_2 = note("<~@20 A B C D E B F G H ~@11>".pickRestart({
  A: "~@2 f5 ab5@2 bb5", B: "c6@4 d6 c6 bb5@4 g5@2", C: "eb5@4 f5 g5 ab5@4 f5@2", D: "f5@3 eb5 f5@2 g5@4 eb5@2",
  E: "c5@2 f5 ab5@2 bb5", F: "eb5@4 f5 g5 ab5@3 g5 f5@2", G: "e5@2 d5@3 e5 f5@5 ~", H: "f6 ~",
})).s("gm_epiano1").gain(0.72).pan(0.7)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@12 A ~@5 A ~ A ~@5 A ~ A ~@5 A ~@5>".pickRestart({
  A: "~@11 x",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<~@12 [~@3 x!3] [x!6]!6 [x!3 ~@3] ~@20>").gain(0.64)

// drums · ride
const ride = s("rd").struct("<~@20 [~@3 x!3] [x!6]!6 [x!4 ~@2] [~@3 x!3] [x!6]!9 [x!4 ~@2] ~>").gain(0.56)

stack(
  bass, pan_flute, flute, string_ensemble_1, french_horn, synth_strings_1, epiano1, epiano1_2, kick, kick_soft, hihat,
  ride
)

More by Vaughn