Strudelify

I Saw Her Again Last Night

The Mamas & The Papas

KeyA majorTempo122 bpm
0:00/0:00
// I Saw Her Again Last Night — The Mamas & The Papas
// 122 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 101 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(122/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.

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

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  A@2 B@2 C D B@2 E F G H I J K L B@2 C D B@2 E F G H I J K@2 M@2 N@2 O P Q R S T U V B@2 C D B@2 E F G H I J K L B@2 C
  D B@2 E F G H@2 I J K@2 M@2 N@2 O P Q R S T U A@2 B@2 C D B@2 C D B@2 C D B@2 C D ~
>`.pickRestart({
  A: "[e3,b3,d4,g#4]/2", // E7
  B: "[[c#4,e4,a4]!2 [c#4,e4,a4]@2 [c#4,e4,g4] [c#4,e4,g4]@2 [a3,d4,f#4]@2 [a3,d4,f#4]!2 [b3,d4,g4]!5]/2", // A C#dim D G
  C: "[c#4,e4,a4]!3 ~ [c#4,e4,g#4]!3 ~", D: "[a3,c#4,f#4]!3 [g#3,b3,e4]@3 ~@2", E: "[c#4,e4,a4]!3 ~ [b3,d4,g4]!3 ~",
  F: "[a#3,c#4,f#4]!3 [a#3,c#4,f#4]@2 [a#3,c#4,f#4]!3", G: "[f#3,b3]@2 [d#4,f#4,a4] ~ [d#4,f#4,b4] [d#4,f#4,a4]!2 ~",
  H: "[e3,b3]@2 [e4,g#4,b4] ~ [e4,g#4,b4]!3 ~", I: "[c#4,e4,a4]@2 [c#4,e4,a4]!2 [f4,g#4]@2 [f4,g#4]!2",
  J: "[a3,c#4,f#4]@2 [a3,c#4,f#4]!2 [a3,c4,f4]@2 [a3,c4,f4]!2", // F#m F
  K: "[c#4,e4,a4]@2 [c#4,e4,a4]!2 [c#4,e4,a4]@2 [c#4,e4,a4]!2", L: "[g#3,b3,d4]",
  M: "[d#3,g#3,c4,d#4] ~ [d#3,g#3,c4,d#4] ~ [d#3,g#3,c4,d#4] ~ [d#3,g#3,c4,d#4] ~", // G#
  N: "[a#3,c#4,f4] ~ [a#3,c#4,f4] ~ [a#3,c#4,f4] ~ [a#3,c#4,f4] ~", // A#m
  O: "[a#3,c#4,f#4] ~ [a#3,c#4,f#4] ~ [a#3,c#4,f#4] ~ [a#3,c#4,f#4] ~", // F#
  P: "[c4,d#4,g#4] ~ [c4,d#4,g#4] ~ [c4,d#4,g#4] ~ [c4,d#4,g#4] ~", // G#
  Q: "[b3,d#4,f#4] ~ [b3,d#4,f#4] ~ [b3,d#4,f#4] ~ [b3,d#4,f#4] ~", // B
  R: "[f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~ [f#3,b3,d#4] ~", // B
  S: "[d#3,f#3,a#3] ~ [d#3,f#3,a#3] ~ [d#3,f#3,a#3] ~ [d#3,f#3,a#3] ~", // D#m
  T: "[g#3,b3,d#4] ~ [g#3,b3,d#4] ~ [g#3,b3,d#4] ~ [g#3,b3,d#4] ~", U: "[f#3,b3,d#4]!8", V: "[e3,b3,d4,g#4]",
})).s("gm_electric_guitar_clean").gain(0.4).pan(0.9)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A@2 ~@10 B C D@2 ~@10 B C E F G@2 H@2 I J K@2 L M N O ~@10 B C P Q R@4 S@3 T L U@2 B C E F G@2 H@2 I J K@2 L M N A@2
  ~@17
>`.pickRestart({
  A: "e6/2", B: "a6 g#6", C: "f#6 f6", D: "[c#6@2 a5@2 d6 c#6 a5 e6@6 ~@3]/2", E: "c#6@2 a5@2 d6 c#6 a5 b5",
  F: "~@2 a5@3 ~ a5@3 ~ b5@2 a5@4", G: "[g#5@7 a5]/2", H: "a#5/2", I: "a#5@3 b5", J: "c6", K: "d#6/2", L: "d#6",
  M: "g#5", N: "b5", O: "e6", P: "c#6@4 a5@4 d6 c#6@2 c#6@2 b5 a5@2", Q: "b5 ~",
  R: "[e6@2 c#6 a5 b5 a5 f#5 a5@3 a5!2 d6 c#6 d6 e6@12 c#6 d6 c#6 d6 e6]/4",
  S: "[e6@2 c#6 a5 b5 a5 f#5 a5@3 a5!2 d6 c#6 d6 e6@5 g6@4]/3", T: "f#6@8 c#5 d#5 e5 f#5 g#5 a#5 b5 c#6",
  U: "[e6 d6@3]/2",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.1)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  A@2 ~@10 B C D@2 ~@10 B C E F G@2 H@2 I J K@2 L M N O ~@10 B C P Q R@4 S@3 T M U@2 B C E F G@2 H@2 I J K@2 L M N A@2
  ~@17
>`.pickRestart({
  A: "e5/2", B: "a5 g#5", C: "f#5 f5", D: "[c#5@2 a4@2 d5 c#5 a4 e5@6 ~@3]/2", E: "c#5@2 a4@2 d5 c#5 a4 b4",
  F: "~@2 a4@3 ~ a4@3 ~ b4@2 a4@4", G: "[g#4@7 a4]/2", H: "a#4/2", I: "a#4@3 b4", J: "c5", K: "f#5/2", L: "[d#5,f#5]",
  M: "d#5", N: "f#5", O: "e5", P: "c#5@4 a4@4 d5 c#5@2 c#5@2 b4 a4@2", Q: "b4 ~",
  R: "[e5@2 c#5 a4 b4 a4 f#4 a4@3 a4!2 d5 c#5 d5 e5@12 c#5 d5 c#5 d5 e5]/4",
  S: "[e5@2 c#5 a4 b4 a4 f#4 a4@3 a4!2 d5 c#5 d5 e5@5 g5@4]/3", T: "f#5@8 c#4 d#4 e4 f#4 g#4 a#4 b4 c#5",
  U: "[e5 d5@3]/2",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.9)

// other · string ensemble 1
const string_ensemble_1_3 = note(`<
  A B ~@13 A C D C E C D C F ~@17 A C D C E C D C ~@6 G ~ H@3 ~@3 F ~@18 A B C D C E C D C E C D C E C D C E ~
>`.pickRestart({
  A: "e4 d4 b3 d4 b3 a3 g#3 e3", B: "~ d4 b3 d4 b3 a3 g#3 e3", C: "e6", D: "a5 b5", E: "a5@3 b5@4 ~", F: "c#6",
  G: "~@8 e4 f#4 g#4 a4 b4 c#5 d5 d#5, c#6", H: "[~@7 e4@2 d4 b3 d4 b3 a3 g#3 e3@4 ~@5]/3",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.9)

// other · string ensemble 1
const string_ensemble_1_4 = note(`<
  A B ~@13 A C D C E C D C F ~@17 A C D C E C D C F ~@5 G ~ H@3 ~@3 F ~@18 A B C D C E C D C E C D C E C D C E ~
>`.pickRestart({
  A: "e3 d3 b2 d3 b2 a2 g#2 e2", B: "~ d3 b2 d3 b2 a2 g#2 e2", C: "e5", D: "a4 b4", E: "a4@3 b4@4 ~", F: "c#5",
  G: "~@8 e3 f#3 g#3 a3 b3 c#4 d4 d#4, c#5", H: "[~@7 e3@2 d3 b2 d3 b2 a2 g#2 e3@4 ~@5]/3",
})).s("gm_string_ensemble_1").gain(0.4).pan(0.1)

// other · tenor sax
const tenor_sax = note(`<
  ~ A@4 B@4 C@3 D@3 A@4 B@4 C@3 D@3 ~ E F G H I J K@2 L ~@2 A@4 B@4 C@3 D@3 ~@12 D@3 ~ E F G H I J K@2 L ~@2 M A@4 N@12
  O@2
>`.pickRestart({
  A: "[~@6 d4@2 d4@2 c#4@2 d4@2 e4@8 ~@2 c#4@2 b3@4 a3@4 ~@2 f#3@2 a3@2 d4@2 c#4@2 d4@2 e4@8 ~@2 c#4 b3 a3@4 ~@2]/4",
  B: "[~@3 c#4 d4 c#4 d4 e4@4 ~ c#4 b3@2 a3@2 ~ f#3 a3 d4 c#4 d4 e4@4 ~ e4@4]/4",
  C: "[e4 d4 c#4@3 ~ c#4@2 c#4@2 c4@2 c#4@2 d#4@6 ~@2 d4@2 d#4@2 d4@2 d#4@2 e4@4 ~@14]/3",
  D: "[c#4@2 ~ c#4 b3 b3@2 a3@2 ~ a3@2 b3!2 ~ c#4@3 ~@6]/3", E: "~@2 f#4 e4 d#4@2 c#4@2", F: "c4 a#3@2 g#3@2 ~@2 g#3",
  G: "f4!2 d#4 c4 c#4 c4@2 a#3", H: "a#3@3 g#3 f3@4 ~@8", I: "~@2 f#4 f4 d#4@2 c#4@2",
  J: "d#4@2 c#4@4 c4@3 a#3 g#3@3 ~@3", K: "[d#4 c#4 d#4 c#4 d#4 c#4 b3 d#4@8 ~]/2", L: "~@3 c#4 d#4 c#4 d#4!2",
  M: "~@3 d4!2 c#4 ~@2",
  N: "[~@6 c#4@2 d4@2 c#4@2 d4@2 e4@8 ~@2 c#4@2 b3@4 a3@4 ~@2 f#3@2 a3@2 d4@2 c#4@2 d4@2 e4@8 ~@2 c#4 b3 a3@4 ~@2]/4",
  O: "[~@3 c#4 d4 c#4 d4 e4@4 ~@5]/2",
})).s("gm_tenor_sax").gain(0.45).pan(0.1)

// chords · drawbar organ
const drawbar_organ = note(`<
  ~@2 A@2 B C A@2 D E F G H I ~@2 A@2 B C A@2 D E F G H I ~@14 A@2 B C A@2 D E F G H I ~@2 A@2 B C A@2 D E F G@2 H I J@2
  ~@13 A@2 B C A@2 B C A@2 B C K ~@4
>`.pickRestart({
  A: "[[e4,c#5,a5]@4 [e4,c#5,g5]@3 [d4,a4,f#5]@5 [d4,g4,b4]@4]/2", B: "[e4,c#5,a5] [e4,c#5,g#5]",
  C: "[c#4,a4,f#5]@3 [b3,e4,g#4]@5", D: "[e4,c#5,a5] [d4,b4,g5]", E: "[a#4,c#5,f#5]@3 ~", F: "[b4,d#5,f#5,a5]",
  G: "[e5,g#5,b5]", H: "[e4,a4,c#5] [f4,g#4,c#5]", I: "[f#4,a4,c#5] [f4,a4,c5]", J: "[a4,c#5,e5]/2",
  K: "[e4,c#5,a5]@4 [e4,c#5,g5]@3 ~", // A C#dim
})).s("gm_drawbar_organ").gain(0.1).pan(0.1)

// chords · drawbar organ · soft notes
const drawbar_organ_soft = note("<~@96 A@2 B C ~>".pickRestart({
  A: "[~@7 [d4,a4,f#5]@5 [d4,g4,b4]@4]/2", B: "[e4,c#5,a5] [e4,c#5,g#5]", C: "[c#4,a4,f#5]@3 [b3,e4,g#4]@5",
})).s("gm_drawbar_organ").gain(0.04).pan(0.1)

// other · tenor sax
const tenor_sax_2 = note("<~@11 A B@2 C ~@10 A B@2 C ~@10 D E ~@10 A B@2 C ~@10 F@2 B@2 C ~@10 D E ~@19>".pickRestart({
  A: "~@4 e4!4", B: "[e4@4 e4@4 f4@2 f4@4 f#4@4 e4 c#4@4 ~ f4@3 g4@2 f4@3]/2", C: "e4 a3 ~@2",
  D: "g#4@2 f#4 g#4@2 f#4 g#4@2", E: "f#4", F: "[~@7 e4@5 e4!4]/2",
})).s("gm_tenor_sax").gain(0.64).pan(0.9)

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

// drums · snare
const snare = s("sd").struct(`<
  ~ A B@3 C B@3 D B@5 ~ B@3 C B@3 D B@5 E F@7 G@4 A B@3 C B@3 D B@5 ~ B@3 C B@3 D B@2 H B@3 E F@7 G@4 ~ A B@3 C B@3 C
  B@3 C B@3 C ~
>`.pickRestart({
  A: "~@12 x!4", B: "~ x ~ x", C: "x ~ x ~ x ~@5 x!2 ~@4", D: "x ~ x!3 ~@2 x!9", E: "~@4 x!4 ~@8", F: "x!4",
  G: "~ x ~ x ~ x ~ x", H: "x!8",
})).gain(0.78)

// drums · low tom
const low_tom = s("lt").struct("<~@5 A ~@13 A ~@25 A ~@13 A ~@6 B ~@20 A ~@3 A ~@3 A ~@5>".pickRestart({
  A: "~@12 x!4", B: "x!8",
})).gain(0.78)

// drums · low tom · soft notes
const low_tom_soft = s("lt").struct("<~@99 [~@12 x!4] ~>").gain(0.16)

// drums · mid tom
const mid_tom = s("mt").struct("<~@29 [~@8 x!8] ~@40 [~@8 x!8] ~@30>").gain(0.78)

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A ~@13 A ~@18 B@4 ~@3 A ~@13 A ~@19 B@4 ~@4 A ~@3 A ~@3 A ~@3 A ~@2
>`.pickRestart({
  A: "~@7 x", B: "~ x ~ x ~ x ~ x",
})).gain(0.78)

// drums · crash
const crash = s("cr").struct(`<
  A ~@4 B ~@4 A ~@4 A@2 ~@2 B ~@4 A ~@5 A ~@10 A@2 ~@2 B ~@4 A ~@4 A@2 ~@2 B A ~@3 A ~@2 A ~@14 A ~ A ~@2 B ~@3 B ~@3 B
  ~@3 B ~
>`.pickRestart({
  A: "x", B: "~@3 x ~@4",
})).gain(0.78)

// drums · ride
const ride = s("rd").struct(`<
  A B C@2 D ~ C@3 ~ E C@4 ~ E C D ~ C@3 ~ E C@4 F E C@6 ~@5 E C D ~ C@3 ~ E C@4 ~ E C D ~ E C@2 ~ E C ~ E C@2 F C@7 ~@4
  A B E C D ~ C@2 D ~ C@2 D ~ C@2 D ~@2
>`.pickRestart({
  A: "~@4 x!4", B: "x!6 ~@2", C: "x!8", D: "x!7 ~", E: "~ x!7", F: "x!2 ~@6",
})).gain(0.78)

// drums · tambourine
const tambourine = s("tb").struct("<A ~ B@13 ~ B@14 C@7 D@4 A B@13 ~ B@15 C@7 D@4 A ~ B@16 ~>".pickRestart({
  A: "x", B: "x!4", C: "~ x ~ x ~ x ~ x", D: "~ x ~@5 x",
})).gain(0.78)

stack(
  bass, electric_guitar_clean, string_ensemble_1, string_ensemble_1_2, string_ensemble_1_3, string_ensemble_1_4,
  tenor_sax, drawbar_organ, drawbar_organ_soft, tenor_sax_2, kick, snare, low_tom, low_tom_soft, mid_tom, open_hat,
  crash, ride, tambourine
)

More by The Mamas & The Papas