Strudelify

Grease

Frankie Valli

KeyB♭ minorTempo110 bpm
0:00/0:00
// Grease — Frankie Valli
// 110 bpm, 4/4, key A# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 90 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(110/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 · string ensemble 1 · "String Ensemble"
const string_ensemble_1 = note(`<
  ~@6 A B C D E F G H@2 I A B C D E F G J@2 K@2 ~ L@2 M@2 ~ A B C D E F G N@2 K@2 ~ L@2 O P Q@5 A B R D E F G N@2 K@2 ~
  L@2 M@2 ~@6 L@2 M@2 ~ L@2 M@2 S T@3 ~
>`.pickRestart({
  A: "~ [bb3,db4,f4]!6 db4", B: "[g3,bb3,eb4]@2 eb4 [f3,bb3,db4] ~ f4!2 db4",
  C: "~ [g3,bb3,eb4] db4 [f3,bb3,eb4]@2 db4 [f3,bb3,db4] db4", // Eb Ebsus2 Bbm
  D: "[eb3,ab3,eb4]@4 c4@2 [eb3,ab3,c4]@3 bb3 [c3,eb3,ab3]@6", E: "~ [bb3,db4,gb4]!3 [ab3,db4,f4]!3 db4",
  F: "[gb3,b3,eb4]@2 eb4 [f3,bb3,db4]@2 db4 [bb3,db4,f4] f4", // B Bbm
  G: "[g3,bb3,eb4]@2 eb4 [f3,bb3,db4] ~ db4 [f3,bb3,db4] db4", // Eb Bbm
  H: "[[ab3,c4,eb4]@2 c4@2 bb3@2 ab3@4 f4@2 eb4@2 db4 [bb3,eb4]@3 db4@2 [db3,gb3,bb3]@12]/2", I: "[bb2,db3,gb3] ~",
  J: "[[ab3,c4,eb4]@2 c4@2 bb3@2 ab3@4 f4@2 eb4@2 db4 [bb3,eb4]@3 db4@2 [db3,bb3]@4 ~@8]/2", // Ab Eb5 Gb
  K: "[~@10 bb3@2 bb3!2 [gb3,bb3,db4,eb4]@4 db4@2 bb3!2 [gb3,bb3,db4,eb4]@4 f4 eb4 db4@4]/2", // Ebm7
  L: "[[db3,f3,bb3] [f3,bb3,db4] f4 [f3,bb3,eb4]@2 [f3,bb3,db4] f4 [f3,bb3,eb4]@2 [f3,bb3,db4] f4 [f3,bb3,eb4]@2 [f3,bb3,db4]@3]/2", // Bbm Ebsus2 Bbm Ebsus2 Bbm Ebsus2 Bbm
  M: "[[gb3,bb3,db4,eb4] db4 bb3 [gb3,bb3,db4,eb4]@2 db4 bb3 [bb3,eb4]@2 [db3,gb3,bb3,db4]@7]/2", // Ebm7 Eb5 Gb
  N: "[[ab3,c4,eb4]@2 c4@2 bb3@2 ab3@4 f4@2 eb4@2 db4 [bb3,eb4]@3 db4@2 [db3,f3,bb3]@12]/2", // Ab Eb5 Bbm
  O: "[gb3,bb3,db4,eb4] db4 bb3 [gb3,bb3,db4,eb4]@2 db4 bb3 [bb3,eb4]", // Ebm7 Eb5
  P: "[bb3,eb4] [bb3,db4]@3 [eb3,c4]@2 [c3,ab3]@2", // Eb5 Bbm Cm Fm
  Q: "[~@2 db4@2 db4@2 db4@2 db4@2 db4@2 db4@2 [eb3,ab3,eb4]@4 [eb3,ab3,c4]@6 f4@2 eb4@2 db4@2 [bb3,eb4]@4 [db3,gb3,bb3]@6 [bb3,f4]@2 eb4@2 db4@2 f4@2 f4@2 f4@2 f4!2 f4@2 a4@2 a4@2 a4@2 [db4,f4,bb4]@14 ~@4, ~ [db3,gb3]@3 [db3,gb3]@3 ~@16 a3@5 [c4,f4]@3 ~@9]/5", // Ab5 Ab Eb5 Gb Bb5 Bbm Gb5 F5
  R: "[g3,bb3,eb4]@2 db4 [f3,bb3,eb4]@2 db4 [f3,bb3,db4] db4", S: "[bb2,db3,gb3,gb4]@6 [bb3,bb4] ab4",
  T: "[[f3,f4] eb4 db4@2 [f2,bb2,f3,bb3]@32 ~@12]/3", // F Bb5
})).s("gm_string_ensemble_1").gain(0.8)

// bass · fretless bass
const bass = note(`<
  ~@6 A B@2 C D E B F G H A B@2 C D E B F I J K@2 I J L M N A B@2 C D E B F I J K@2 I J L O P C Q R@2 A B@2 C D E B F I
  J K@2 I J L S ~@6 I J L T@2 I J L U V W@2 ~@2
>`.pickRestart({
  A: "ab1 bb1 ~@6", B: "eb2@3 bb1 ~@4", C: "f2@3 f2 f2@2 f2@2", D: "eb2@3 eb2 db2@3 db2", E: "b1!2 bb1@2",
  F: "f2 f2@2 f2", G: "gb2@3 gb2 gb2@3 gb2", H: "gb2@6 gb1@2 ~ eb2 f2@2 eb2@2 db2@2, ~@4 gb1 ~@3",
  I: "ab1 bb1 ~ ab2@2 bb2@3", J: "ab1 bb1 ab2 bb2@3 bb2@2",
  K: "[eb2@3 eb2 eb2@3 [bb2,bb3]@2 [ab2,ab3]@2 [f2,f3]@2 [eb2,eb3]@2 [db2,db3]]/2", L: "eb2@3 eb2 eb2@4",
  M: "gb2@3 gb2!3 gb2@2", N: "gb2@6 gb1@2 ~ eb2 f2@2 eb2@2 db2@2, ~@4 ab1 ~@3", O: "gb2@3 gb2 ab2@3 ab2",
  P: "eb2@3 eb2 eb2@2 eb2@2", Q: "gb2@3 gb2 gb2@2 gb2@2",
  R: "[f2@3 f2 f2@3 [bb2,bb3]@2 [ab2,ab3]@2 [f2,f3]@2 [eb2,eb3]@2 [db2,db3]]/2", S: "gb2@3 gb2!3 ab2@2",
  T: "[gb2@3 gb2!4 [bb2,bb3]@2 [ab2,ab3]@2 [f2,f3]@2 [eb2,eb3]@2 [db2,db3]]/2", U: "gb2@2 ~ gb2 gb2@2 gb2!2",
  V: "gb2!6 bb2 ab2", W: "[f2 eb2 db2@2 [bb1,bb2]@16 ~@12]/2",
})).s("gm_fretless_bass").gain(0.5)

// other · string ensemble 1 · "String Ensemble"
const string_ensemble_1_2 = note(`<
  A B ~ C@2 D ~@18 E@3 F ~@2 G@3 ~@8 E@3 F ~@2 H@3 I J K L ~@8 E@3 F ~@2 M@3 B ~@3 N E@3 ~@4 O@3 P@3 ~
>`.pickRestart({
  A: "bb5", B: "~@4 bb5 ab5 f5 ab5 f5 eb5 f5 eb5 db5 eb5 db5 bb4", C: "[~@10 ab4 bb4 db5@20]/2",
  D: "db5 bb4 ~@2 bb4 ab4 ~@4 f4@2 eb4@2 db4@2", E: "[~@13 [ab5,bb5] c6@16 db6@16 ~@2]/3",
  F: "~@3 [db5,db6] [bb4,bb5]@2 ~@10", G: "[[ab5,bb5] db6@32 ~@3 db6 bb5 ~@2 bb5 ab5 ~@6, ~ c6 ~@46]/3",
  H: "[[ab5,bb5] c6 ~@14 gb4@8 ab4@8 eb4@16, ~ db6@32 ~@15]/3", I: "f4", J: "gb4", K: "f4 a4", L: "[db4,bb4]",
  M: "[[ab5,bb5] c6 ~@14 gb5@8 ~@2 gb5@2 ab5@2 ~@2 bb5@16, ~ db6@32 ~@15]/3", N: "~@5 f4 eb4 db4",
  O: "[[ab5,bb5] db6@32 ~@10 [gb5,g5] [bb5,bb6]@2 [ab5,ab6]@2, ~ c6 ~@42 [ab5,a5] ~@3]/3", // Absus2 Gmaj7 Bb Ab Amaj7
  P: "[[f5,f6] [eb5,eb6] [db5,db6]@2 [bb3,bb4,bb5]@32 ~@12]/3", // F Eb Db Bb
})).s("gm_string_ensemble_1").gain(0.35)

// bass · fretless bass
const bass_2 = note(`<
  A@2 B@2 C D E F@2 G H I F J K L M F@2 G H I F J K N ~@6 L M F@2 G H I F J K N ~@11 E F@2 G H I F J K N ~@5 O A@2 P Q ~
  R ~@14
>`.pickRestart({
  A: "bb1!8", B: "[bb1!2 ab1 bb1 ~@2 ab1 bb1@2 ~ ab1 bb1!5]/2", C: "gb1!8", D: "gb1 ~@4 f3 eb3 db3",
  E: "~ bb1@2 ~@5, ab1 ~@3", F: "eb2@2 ~ bb1@2 ~@3", G: "ab1@2 ~ ab1@2 ~@2 ab2", H: "gb2@2 ~ gb2 f2@2 ~ f2",
  I: "eb2@2 ~ eb2 bb1@2 ~ bb1", J: "ab1@2 ~ ab1@2 ~@3", K: "gb2@2 ~ gb2 gb2@2 ~@2",
  L: "~@5 [f2,f3,f4] [eb2,eb3,eb4] [db2,db3,db4]", M: "[ab2,ab3] [bb2,bb3] ~@6, ab1 ~@3, ~ bb1@2 ~@5",
  N: "~@5 f2 eb2 db2", O: "[gb2,gb3]@2 ~ [ab2,ab3], ~@5 [gb2,gb3]@2 ~", P: "~ bb1!7, ab1 ~@3", Q: "bb1!4 bb1@2 ~@2",
  R: "~@5 f3 eb3 db3",
})).s("gm_fretless_bass").gain(0.64)

// bass · electric bass finger · "Electric Bass"
const bass_3 = note("<~@2 A B@2 C D E ~@7 F G ~@15 F G ~@35 H ~@2 I ~@2 F ~@9 J K@3 ~>".pickRestart({
  A: "[ab2,ab3] [bb2,bb3] [ab3,ab4] [bb3,bb4] [ab2,ab3] [bb2,bb3] [db4,db5] [bb3,bb4]", // Ab Bb Ab Bb Ab Bb Db Bb
  B: "[[eb3,eb4]@2 [db3,db4]@2 [bb2,bb3]@2 [db3,db4]@2 ~@2 [ab2,ab3] [bb2,bb3] [db3,db4]@20]/2", // Eb Db Bb Db Ab Bb Db
  C: "db3 bb2 ~@2 bb2 ab2 ~@4 [f2,f3]@2 [eb2,eb3]@2 [db2,db3]@2", D: "[ab1,ab2] [bb1,bb2] ~@6",
  E: "~@5 b1 ~@2, ~@9 eb2@2 ~@5", F: "~@5 f2 eb2 db2", G: "ab1 bb1 ~@6", H: "~@10 gb2 ~ ab2 ~@3",
  I: "[ab2,ab3] [bb2,bb3]!4 ~@3", J: "~@6 bb2 ab2", K: "[f2 eb2 db2@2 f1@32 ~@12]/3",
})).s("gm_electric_bass_finger").gain(0.4)

// bass · electric bass finger · "Electric Bass" · soft notes · Bb
const bass_soft = note("<~@72 [~@5 [bb2,bb3]!3] ~@17>").s("gm_electric_bass_finger").gain(0.2)

// chords · acoustic bass
const acoustic_bass = note(`<
  ~@7 A@2 ~ B C D ~@4 A@2 ~ B C D ~@11 A@2 ~ B C D ~@15 A@2 ~ B C D ~@24 E F@3 ~
>`.pickRestart({
  A: "[bb4,eb5]@2 ~ [db4,bb4,db5]@2 ~@3", B: "[bb4,gb5] ~ [ab4,f5] ~", C: "[g4,eb5] ~ [f4,db5] ~",
  D: "[g4,eb5]@2 ~ [f4,db5]@2 ~@3", E: "~@6 bb4 ab4", F: "[f4 eb4 db4@2 f3@32 ~@12]/3",
})).s("gm_acoustic_bass").gain(0.23)

// drums · kick
const kick = s("bd").struct("<A@70 B A C D@3 A@9 E F ~@3>".pickRestart({
  A: "x ~@2 x!2 ~@2 x", B: "x ~ x!3 ~@2 x", C: "x ~@7 x ~@4 x ~@2", D: "x ~@3 x ~@5 x ~@2 x ~@2", E: "x ~@2 x!2 ~ x ~",
  F: "~ x ~@2",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct("<A@5 B A@7 C A D E A@6 C A@8 B A@19 F A@16 G E H I J@3 A@9 H K ~@3>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@3 x!3 ~ x ~@3", C: "~@4 x ~@7 x ~ x!2", D: "~@4 x ~@3 x ~ x ~ x ~ x!2", E: "x!2 ~ x",
  F: "~@4 x ~ x!3 ~@3 x ~@3", G: "~@4 x ~ x!3 ~ x ~ x ~@3", H: "~@2 x ~@3 x!2", I: "x ~ x ~@4 x", J: "~@3 x ~@3 x",
  K: "x!3 ~ x ~@11",
})).gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<[x!8]!69 [x!4 ~@4] [x!8]!15 [x!6 ~@2] ~@4>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@55 x ~@16 [~@7 x] ~ [~@3 x] ~@15>").gain(0.4)

// drums · crash
const crash = s("cr").struct("<x ~@69 x ~@15 [~ x ~@2] ~@3>").gain(0.4)

stack(
  string_ensemble_1, bass, string_ensemble_1_2, bass_2, bass_3, bass_soft, acoustic_bass, kick, snare, hihat, open_hat,
  crash
)

More by Frankie Valli