Strudelify

Leader of the Pack

The Shangri-Las

KeyD♭ majorTempo138 bpm
0:00/0:00
// Leader of the Pack — The Shangri-Las
// 138 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 80 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(138/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.

// chords · piano · "Ac Piano"
const piano = note(`<
  A@6 B C D@2 E@2 F@2 G ~ H I@7 J K L@2 M@2 N@2 O P Q@2 R@4 S@2 T U@7 V W X@2 Y@2 Z@2 AA ~ AB@2 AC@2 AD AE AD AF AG AH
  AI AJ AK AE AD AL AM@4
>`.pickRestart({
  A: "[[c2,c3]@31 ~]/2", B: "[bb1,bb2]", C: "[g1,g2]", D: "[f1,f2,c4,f4,a4]/2", E: "[e1,e2,b3,e4,g4]/2",
  F: "[g1,g2,d4,g4,b4]/2", G: "[c1,c2,e4,g4,c5] ~@7",
  H: "[g3,c4,e4]@2 [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~", // C
  I: "[g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~ [g3,c4,e4] ~", // C
  J: "[bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~ [bb3,d4,f4] ~", // Bb
  K: "[b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [d4,g4] ~ [b3,d4,g4] ~, ~@6 b3 ~", // G G5 G
  L: "[[f1,f2]@5 ~ [f1,f2] ~ [f1,f2]@7 ~ [f1,f2]@5 ~ [f1,f2] ~ [f1,f2]@7 ~, [c4,f4,a4]@31 ~]/2", // F
  M: "[[e1,e2]@5 ~ [e1,e2] ~ [e1,e2]@7 ~ [e1,e2]@5 ~ [e1,e2] ~ [e1,e2]@7 ~, [b3,e4,g4]@15 ~]/2", // E Em
  N: "[[g1,g2]@5 ~ [g1,g2] ~ [g1,g2]@7 ~ [g1,g2]@5 ~ [g1,g2] ~ [g1,g2]@6 ~@2, [d4,g4,b4]@31 ~]/2", // G
  O: "[c1,c2,e4,g4,b4,c5] ~@15", P: "~@8 [c2,c3]@4 [b1,b2]@3 ~",
  Q: "[[a1,a2]@23 ~ [c2,c3]@3 ~ [b1,b2]@3 ~, ~@28 c2 ~@3]/2", R: "[[a1,a2]@23 ~ [c2,c3]@3 ~ [b1,b2]@3 ~]/2",
  S: "[[a1,a2]@29 ~@3]/2", // A
  T: "[ab3,db4,f4]@2 [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~", // Db
  U: "[ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~ [ab3,db4,f4] ~", // Db
  V: "[b3,eb4,gb4] ~ [b3,eb4,gb4] ~ [b3,eb4,gb4] ~ [b3,eb4,gb4] ~ [b3,eb4,gb4] ~ [b3,eb4,gb4] ~ [b3,eb4,gb4] ~ [b3,eb4,gb4] ~", // B
  W: "[c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [c4,eb4,ab4] ~ [eb4,ab4] ~ [c4,eb4,ab4] ~, ~@6 c4 ~", // Ab Ab5 Ab
  X: "[[gb1,gb2]@5 ~ [gb1,gb2] ~ [gb1,gb2]@7 ~ [gb1,gb2]@5 ~ [gb1,gb2] ~ [gb1,gb2]@7 ~, [db4,gb4,bb4]@31 ~]/2", // Gb
  Y: "[[f1,f2]@5 ~ [f1,f2] ~ [f1,f2]@7 ~ [f1,f2]@5 ~ [f1,f2] ~ [f1,f2]@7 ~, [c4,f4,ab4]@15 ~]/2", // F Fm
  Z: "[[ab1,ab2]@5 ~ [ab1,ab2] ~ [ab1,ab2]@7 ~ [ab1,ab2]@5 ~ [ab1,ab2] ~ [ab1,ab2]@6 ~@2, [eb4,ab4,c5]@31 ~]/2", // Ab
  AA: "[db1,db2,f4,ab4,c5,db5] ~@15", AB: "[[db1,db2]@31 ~]/2", AC: "[[db1,db2]@15 ~]/2",
  AD: "[db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~@7", // Db
  AE: "~@2 [db4,f4,ab4]@2 ~@2 [eb4,gb4,bb4] ~ [f4,ab4,b4]@6 ~@2", // Db Ebm Fdim
  AF: "~@2 [db4,f4,ab4]@2 ~@2 [eb4,bb4] ~ [f4,ab4,b4]@7 ~, ~@3 gb4 ~@4", // Db Eb5 Fdim
  AG: "[db4,f4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4]@2 ~@6, ab4 ~@7", // Db
  AH: "~@2 [db4,f4,ab4]@2 ~@2 [eb4,gb4] ~ [f4,ab4,b4]@6 ~@2, ~@3 bb4 ~@4", // Db Ebm Fdim
  AI: "[db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4]@2 ~@6", // Db
  AJ: "~ [f4,ab4] [gb4,bb4] ~ [f4,ab4,b4]@3 ~, ~@2 db4 ~ eb4 ~@11", // Fm Gb Fdim
  AK: "[db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [db4,f4,ab4] ~ [f4,ab4] ~@7, ~@4 db4 ~@3", // Db Fm
  AL: "~ [db4,f4,ab4] ~ [eb4,bb4] [f4,ab4,b4]@3 ~, ~@6 gb4 ~@9", AM: "[[db2,db3,ab4,db5,f5]@51 ~@13]/4",
})).s("gm_piano").gain(0.26)

// bass · acoustic bass · "Ac Bass"
const bass = note(`<
  ~@16 A B@2 C@2 D E F G H I@2 J@2 K@2 L M N O P O P Q P R S T@2 U@2 V W X Y Z AA@2 AB@2 AC@2 AD ~ AE@4 AF AG AF AH AF@8
  AI@3 ~
>`.pickRestart({
  A: "c2@5 ~ c2@6 g1@3 ~", B: "c2@5 ~ c2@5 ~ g1@3 ~", C: "c2@4 ~@2 c2@6 g1@3 ~", D: "c2@5 ~ c2@6 g1@4",
  E: "c2@2 ~ c2@3 g1@2", F: "c2@4 ~@2 c2@6 a1@3 ~", G: "bb1@4 ~@2 bb1@5 ~ bb1 ~ a1@2", H: "g1@4 ~@2 g1@5 ~ e1@3 ~",
  I: "[f1@15 ~]/2", J: "[e1@7 ~]/2", K: "[g1@31 ~]/2", L: "c2 ~@7", M: "~@8 c2@4 b1@3 ~", N: "a1@4 ~@2 a1 ~ a1@7 ~",
  O: "a1@5 ~ a1 ~ c2@3 ~ b1@3 ~", P: "a1@5 ~ a1 ~ a1@7 ~", Q: "a1@5 ~ a1 ~ c2@3 ~ b1@4", R: "a1 ~@15",
  S: "db2@5 ~ db2@6 ab1@3 ~", T: "db2@5 ~ db2@5 ~ ab1@3 ~", U: "db2@4 ~@2 db2@6 ab1@3 ~", V: "db2@5 ~ db2@6 ab1@4",
  W: "db2@2 ~ db2@3 ab1@2", X: "db2@4 ~@2 db2@6 bb1@3 ~", Y: "b1@4 ~@2 b1@5 ~ b1 ~ bb1@2",
  Z: "ab1@4 ~@2 ab1@5 ~ f1@3 ~", AA: "[gb1@15 ~]/2", AB: "[f1@7 ~]/2", AC: "[ab1@31 ~]/2", AD: "db2 ~@7",
  AE: "[db2@31 ~]/2", AF: "db2@5 ~ db2 ~ db2@7 ~", AG: "db2@5 ~ db2 ~ db2@6 ~@2", AH: "db2@6 db2 ~ db2@6 ~@2",
  AI: "db2/3",
})).s("gm_acoustic_bass").gain(0.4)

// other · string ensemble 1 · "Strings"
const string_ensemble_1 = note(`<
  ~@8 A B C D E F G ~@3 H I J ~ K L M ~ N O P Q R S T ~@11 U V W ~ X Y Z ~ AA AB AC AD AE AF AG ~@5 AH AI AJ AK AJ AK AJ
  AL AM AK AJ AN ~@4
>`.pickRestart({
  A: "~@6 a4@2 a4 ~ a4 ~ a4 ~ a4 ~", B: "bb4@3 ~ a4 ~ bb4@4 a4@3 ~@3", C: "~@6 g4 ~ g4 ~ g4 ~ g4 ~ g4 ~",
  D: "g4@2 a4 ~@13", E: "~@6 d4@2 ~@2 d4@4 e4 ~", F: "f4@2 g4@2 ~@2 g3@2 e4 ~ d4 ~ c4@2 d4@2", G: "c4 ~@7",
  H: "~@6 c4@2 ~@2 c4@3 ~ d4 ~", I: "f4@3 ~ e4 ~ d4@3 ~ c4 ~ d4@3 ~", J: "d4@2 e4@13 ~", K: "~@6 c4@3 ~ c4 ~ d4@3 ~",
  L: "f4@4 e4 ~ d4@3 ~ c4 ~ d4@3 ~", M: "d4@11 ~@5", N: "~@6 a4 ~ a4@3 ~ a4@3 ~", O: "bb4@2 a4@3 ~ bb4@4 a4@5 ~",
  P: "g4@3 ~ g4@3 ~ g4@5 ~ g4 ~", Q: "a4@2 g4@3 ~ f4@4 e4@5 ~", R: "~@3 d4 ~ d4 e4 f4",
  S: "~@2 g4@4 g3 ~ e4@2 d4 ~ c4@2 d4 ~", T: "c4 ~@15", U: "~@6 db4@3 ~ db4 ~ eb4@3 ~",
  V: "gb4@3 ~ f4 ~ eb4@3 ~ db4@2 eb4@2 ~@2", W: "eb4@2 f4@13 ~", X: "~@6 db4@3 ~ db4@4 eb4 ~",
  Y: "gb4@3 ~ f4 ~ eb4@3 ~ db4@2 eb4@3 ~", Z: "eb4", AA: "~@6 bb4 ~ bb4@3 ~ bb4@3 ~",
  AB: "b4@2 bb4@2 ~@2 b4@3 ~ bb4@5 ~", AC: "ab4@3 ~ ab4@3 ~ ab4@5 ~ ab4 ~", AD: "bb4@2 ab4@3 ~ gb4@2 ~@2 f4@5 ~",
  AE: "~@6 eb4@2 ~@2 eb4@2 f4 ~ gb4@2", AF: "~@2 ab4@3 ~ ab3 ~ f4 ~ eb4 ~ db4@2 eb4 ~", AG: "db4 ~@7",
  AH: "db4 ~ db4 ~ db4 ~ db4 ~ db4 ~@7", AI: "~@2 db4@2 ~@2 eb4 ~ eb4@2 f4@5 ~",
  AJ: "db4 ~ db4 ~ db4 ~ db4 ~ db4@2 ~@6", AK: "~@2 db4@2 ~@2 eb4@2 f4@7 ~", AL: "~@2 db4@2 ~@2 eb4 ~ eb4@2 f4@6",
  AM: "db4@2 db4 ~ db4 ~ db4 ~ db4@2 ~@6", AN: "~@2 db4@2 ~@2 eb4 ~ eb4 ~ f4@5 ~",
})).s("gm_string_ensemble_1").gain(0.45)

// chords · brass section · "Brass"
const brass_section = note(`<
  ~@21 A ~@2 B C ~@4 D E F ~@14 G ~@2 H I ~@4 J@2 K ~@5 L@2 M@2 N@2 O@2 P@2 Q@2 R@3 ~
>`.pickRestart({
  A: "[c4,c5,e5,g5] ~@5 [c4,c5,e5,g5] ~@9", B: "[bb3,bb4]", C: "[g3,g4]@7 ~", D: "~@3 d4 ~ d4 e4 f4",
  E: "~@2 g4@4 g3 ~ e4 ~ d4 ~ c4@2 d4 ~", F: "c4 ~@15", G: "[db4,ab4,db5,f5] ~@5 [db4,ab4,db5,f5] ~@9", H: "[b2,b3]",
  I: "[ab2,ab3]@13 ~@3", J: "[ab2@21 ~ ab3 ~ f4 ~ eb4 ~ db4@2 eb4 ~]/2", K: "db4 ~@15", L: "[db3@31 ~]/2",
  M: "[[db3,ab3]@31 ~]/2", N: "[[db3,db4]@31 ~]/2", O: "[[db3,db4,ab4]@31 ~]/2", P: "[[ab3,db4,ab4]@31 ~]/2",
  Q: "[ab3,db4,ab4]/2", R: "[db2@3 ~]/3",
})).s("gm_brass_section").gain(0.35)

// other · electric guitar clean · "E Guitar"
const electric_guitar_clean = note(`<
  ~@16 A B A B@2 A B C D E F@2 G@2 H@2 I J ~@8 K L K L@2 K L M N O P@2 Q@2 R@2 S ~@5 T@3 U V W T X@4 W Y ~@3
>`.pickRestart({
  A: "c3 ~ c3!3 ~ c3 ~ c3 ~ c3@2 g2 ~ g2 ~", B: "c3 ~ c3!3 ~ c3 ~ c3 ~ c3 ~ g2 ~ g2 ~",
  C: "c3 ~ c3!3 ~ c3 ~ c3 ~ c3@2 g2 ~ a2 ~", D: "bb2 ~ bb2!3 ~ bb2 ~ bb2 ~ bb2@2 f3 ~ bb2 ~",
  E: "g2 ~ g2!2 g2@2 g2 ~ g2 ~ g2 ~ d3 ~ g2 ~", F: "[~ a4@27 ~@4, [f3,c4,f4]@7 ~]/2",
  G: "[~ [e4,g4]@28 ~@3, [e3,b3]@7 ~]/2", H: "[~ [d4,g4]@28 ~@3, [g2,b3]@29 ~@3]/2", I: "c4 ~@15",
  J: "~@8 c3@3 ~ b2@3 ~", K: "db3 ~ db3!3 ~ db3 ~ db3 ~ db3@2 ab2 ~ ab2 ~",
  L: "db3 ~ db3!3 ~ db3 ~ db3 ~ db3 ~ ab2 ~ ab2 ~", M: "db3 ~ db3!3 ~ db3 ~ db3 ~ db3@2 ab2 ~ bb2 ~",
  N: "b2 ~ b2!3 ~ b2 ~ b2 ~ b2@2 gb3 ~ b2 ~", O: "ab2 ~ ab2!2 ab2@2 ab2 ~ ab2 ~ ab2 ~ eb3 ~ ab2 ~",
  P: "[~ bb4@27 ~@4, [gb3,db4,gb4]@7 ~]/2", Q: "[~ [f4,ab4]@28 ~@3, [f3,c4]@7 ~]/2",
  R: "[~ [eb4,ab4]@28 ~@3, [ab2,c4]@29 ~@3]/2", S: "db4 ~@15", T: "db3@5 ~ db3 ~ db3@4 ab2@3 ~",
  U: "db3 ~ db3@3 ~ db3 ~ db3@3 ~ ab2@3 ~", V: "db3@4 ~@2 db3 ~ db3@4 ab2@3 ~", W: "db3@4 ~@2 db3 ~ db3@3 ~ ab2@3 ~",
  X: "db3@5 ~ db3 ~ db3@4 ab2@4", Y: "db3!14 ~@2",
})).s("gm_electric_guitar_clean").gain(0.28)

// other · electric guitar clean · "E Guitar" · soft notes
const electric_guitar_clean_2 = note("<~@76 [~@14 db3!2] [db3!12 ~@4] ~@2>").s("gm_electric_guitar_clean").gain(0.12)

// other · timpani
const timpani = note("<~@16 A@2 B ~@14 C D C D C D C D ~ E@2 ~@20 F G H I J I K@3 I K@2 L ~@3>".pickRestart({
  A: "c3 ~@5 c3 ~@5 g2 ~@3", B: "c3 ~@15", C: "~@8 c3 ~@3 b2 ~@3", D: "a2 ~@15", E: "db3 ~@5 db3 ~@9",
  F: "db3@4 ~@2 db3 ~ db3@2 ~@2 ab2@2 ~@2", G: "db3@2 ~@4 db3 ~ db3 ~@3 ab2@2 ~@2",
  H: "db3@2 ~@4 db3 ~ db3@2 ~@2 ab2 ~@3", I: "db3@2 ~@4 db3 ~ db3 ~@3 ab2 ~@3", J: "db3 ~@5 db3 ~ db3@2 ~@2 ab2@2 ~@2",
  K: "db3 ~@5 db3 ~ db3 ~@3 ab2 ~@3", L: "db3 ~@15",
})).s("gm_timpani").gain(0.54)

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

// drums · snare
const snare = s("sd").struct("<~@16 [~ x ~ x]!10 ~@8 [~ x ~ x]!7 [x!5 ~ x ~ x!5 ~ x ~] [~ x ~ x]!10 ~@28>").gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<~@19 [~@3 x] ~@15 [~@3 x] ~@9 [~@3 x] ~@34>").gain(0.4)

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

// drums · open hat
const open_hat = s("oh").struct("<~@16 A B@9 ~@8 B@7 ~ A B@9 ~@28>".pickRestart({
  A: "~ x!7", B: "x!8",
})).gain(0.3)

// drums · crash
const crash = s("cr").struct("<~@16 A ~@25 A ~@21 A ~@11 A ~@3>".pickRestart({
  A: "x",
})).gain(0.3)

// drums · ride
const ride = s("rd").struct("<~@60 x ~ x ~@17>").gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<~@16 A@10 ~@8 B@8 A@10 C@6 D ~@5 A@12 ~@4>".pickRestart({
  A: "x!16", B: "~ x ~ x", C: "~@3 x", D: "x",
})).gain(0.35)

// drums · congas
const congas = s("conga:33").struct("<~@59 x ~@20>").gain(1.43)

// drums · ht
const ht = s("ht").struct("<~@14 [~ x ~@2] ~@43 [~ x ~@2] ~@21>").gain(0.5)

// drums · mt
const mt = s("mt").struct("<~@59 [~@7 x ~@8] ~@20>").gain(0.45)

stack(
  piano, bass, string_ensemble_1, brass_section, electric_guitar_clean, electric_guitar_clean_2, timpani, kick, snare,
  low_tom, hihat, open_hat, crash, ride, tambourine, congas, ht, mt
)

More by The Shangri-Las