Strudelify

To Sir With Love

Lulu

KeyA majorTempo100 bpm
0:00/0:00
// To Sir With Love — Lulu
// 100 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 67 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 · string ensemble 1 · "STRINGS"
const string_ensemble_1 = note(`<
  A@4 ~@7 B C D ~ E F G H G I J K L M N O P Q R S T ~@7 B C D ~ E F G H G I J K L M N O P Q R S T A@4 U@3
>`.pickRestart({
  A: "[[c#5,e5,a5]@34 [b4,e5,g#5]@29 ~]/4", // A E
  B: "~@2 [e4,a4,e5] [a4,c#5,a5] [c#5,e5,c#6] [a4,c#5,a5] [b4,d5,b5] [c#5,e5,c#6]", C: "[d#5,b5], b4@7 ~",
  D: "[d5,f#5,a5]", E: "~ e4 a4 b4 c#5 e5 f#5 a5", F: "[c5,d#5,g#5]", G: "~@2 f#5 g#5 a5 g#5 f#5 e5", H: "d#5",
  I: "f#5@3 ~", J: "~@2 g#5 e5 d#5 c#5 d#5 e5", K: "[b4,d#5]", L: "[c#5,f#5]", M: "[b4,d#5,b5]",
  N: "[a4,c#5,a5]@2 [c#5,c#6] [d#5,d#6] [e5,e6]@2 [c#5,c#6]@2", O: "[d#5,d#6], f#5@7 ~",
  P: "~@2 [e5,e6] [f#5,f#6] [g#5,g#6]@2 [e5,e6]@2", Q: "[f#5,f#6]@2 [g#5,g#6] [a5,a6]",
  R: "[b5,b6]@2 [g#5,g#6] [e5,e6]", S: "[f#5,f#6]", T: "f#4 e4 ~ c#4 ~ b3@3", U: "[~@2 [c#5,e5,a5]@15 ~@7]/3",
})).s("gm_string_ensemble_1").gain(0.24)

// other · piano
const piano = note("<A B@3 ~@56 A B@3 C@3>".pickRestart({
  A: "~@3 b2@2 c#3 a2@2", B: "[~@2 e2@2 g#2@2 a2@4 c#3@8 ~@5 c#3@3 d3@2 ~ b2@5 e2@2 a2@2 b2@3 e3@6 ~]/3",
  C: "[~@2 a1@15 ~@7]/3",
})).s("gm_piano").gain(0.32)

// chords · electric guitar clean · "CHINK GUITAR"
const electric_guitar_clean = note("<~@2 A@2 B@2 C D B@4 C D B@2 ~@16 B@2 C D B@4 C D B@2 ~@18 A@2 E@3>".pickRestart({
  A: "[~@3 [b3,e4]@16 ~@13, ~ [e2,g#3]@8 ~@7]/2", B: "~@4 [c#5,e5,a5] ~@11", C: "[b2,b3,d#4] f#4 ~@14",
  D: "[d3,f#4,a4] d5 ~@14", E: "[~@5 [a3,c#4,e4]@30 ~@13, ~@2 a2@15 ~@7]/3",
})).s("gm_electric_guitar_clean").gain(0.35)

// bass · electric bass finger · "BASS"
const bass = note(`<
  A B@3 C D E F G H C I E J C K L M N O P Q R S T@5 U V W C D E F G H C I E J C K L M N O P Q R S T@5 U V W A B@3 X@3
>`.pickRestart({
  A: "~@3 b1@2 c#2 a1@2", B: "[~@2 e1@2 g#1@2 a1@4 c#2@8 ~@5 c#2@3 d2@2 ~ b1@5 e1@2 a1@2 b1@3 e2@6 ~]/3",
  C: "a1@3 a1@3 e1@2", D: "a1@3 e2@2 c#2 a1@2", E: "b1@3 f#1@3 b1@2", F: "d2@3 f#2 a2@2 d2 e2", G: "a1@3 a1 a1@4",
  H: "a1@3 a1@2 a1 e1 f#1", I: "a1@3 c#2 f#2 e2 c#2 a1", J: "d2@3 d2 b1 a1 f#1 a1", K: "a1@3 a1@2 a1!3",
  L: "g#1@3 g#1@2 g#1!3", M: "c#2@3 c#2 b1@2 a1@2", N: "g#1@3 g#1 d#2@2 g#1@2", O: "c#2@3 c#2 c#2@2 g#1 c#2",
  P: "b1@3 b1 b1@2 b1@2", Q: "e1@3 e1!3 g#1 a1", R: "b1@3 b1!3 a1 g#1", S: "f#1!2 f#1@2 f#1!2 g#1 a#1",
  T: "[b1@4 b1@2 f#1@2 b1 ~ b1@2 f#1@2 a1@4 a1 ~ a1@4 a1 ~ a1@4 b1@4 b1@2 g#2@2 f#2@2 d#2@2 c#2@2 b1@2 a1@4 a1 ~ a1@4 a1 ~ a1@4 b1@6 b1 ~ b1@4 b1 ~ b1@4]/5",
  U: "e2@6 e2@2 b1 ~ b1@2 e2@4", V: "f#1", W: "f#2 e2 ~ c#2 ~ b1@3", X: "[~@2 a1@15 ~@7]/3",
})).s("gm_electric_bass_finger").gain(0.49)

// chords · electric guitar muted · "MUTE GUITAR"
const electric_guitar_muted = note(`<
  ~@4 A B C D A B A B C D A B E F E F C G C H C A C A C G I ~ A B C D A B A B C D A B E F E F C G C H C A C A C G I ~@8
>`.pickRestart({
  A: "[a3,c#4]!8", B: "[a3,c#4]!3 [a3,c#4]@2 [a3,c#4]!2 ~", C: "[b3,d#4]!8", D: "[a3,d4]!8", E: "[g#3,c4]!8",
  F: "[g#3,c#4]!8", G: "[b3,e4]!8", H: "[c#4,f#4]!8", I: "[c#4,f#4] ~@7",
})).s("gm_electric_guitar_muted").gain(0.1)

// chords · drawbar organ · "ORGAN"
const drawbar_organ = note(`<
  ~@4 A@2 B C A@4 B C A@2 D E F E G H B I B J B J B H I ~ A@2 B C A@4 B C A@2 D E F E G H B I B J B J B H I ~@5 K@3
>`.pickRestart({
  A: "[a3,c#4,e4]/2", B: "[b3,d#4,f#4]", C: "[a3,d4,f#4]", D: "[g#3,c4]", E: "e4", F: "c4", G: "[b3,d#4]",
  H: "[b3,e4,g#4]", I: "[a#3,c#4,f#4]", J: "[a3,c#4,e4]", K: "[~@2 a3@15 ~@7]/3",
})).s("gm_drawbar_organ").gain(0.08)

// chords · drawbar organ · "ORGAN" · soft notes
const drawbar_organ_soft = note("<~@16 A B C B D ~@23 A B C B D ~@15 E@3>".pickRestart({
  A: "d#4", B: "[g#3,c#4]", C: "[g#3,d#4]", D: "f#4", E: "[~@2 [c#4,e4]@15 ~@7]/3",
})).s("gm_drawbar_organ").gain(0.05)

// drums · kick
const kick = s("bd").struct("<~@4 A@20 B@6 C ~ A@20 B@6 C ~@8>".pickRestart({
  A: "x!2", B: "x!4", C: "x",
})).gain(0.28)

// drums · rim
const rim = s("rim").struct("<~@4 [~ x ~ x]!20 ~@8 [~ x ~ x]!20 ~@15>").gain(0.4)

// drums · snare
const snare = s("sd").struct("<~@24 [x!4]!6 x ~@21 [x!4]!6 x ~@8>").gain(0.24)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@20 B@6 C ~ A@20 B@6 C ~@8>".pickRestart({
  A: "x!8", B: "x!4", C: "x",
})).gain(0.24)

stack(
  string_ensemble_1, piano, electric_guitar_clean, bass, electric_guitar_muted, drawbar_organ, drawbar_organ_soft, kick,
  rim, snare, hihat
)