Strudelify

The Speak Up Mambo (Cuentame)

The Manhattan Transfer

KeyF minorTempo130 bpm
0:00/0:00
// The Speak Up Mambo (Cuentame) — The Manhattan Transfer
// 130 bpm, 4/4, key F minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 98 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/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 · piano · "A.Piano"
const piano = note(`<
  ~ A B C B D E F G H I@2 H@2 I@2 J@2 K L K M N O N O N P K L K M N O N O Q P R@3 ~ S T U V W X Y Z AA AB S T U V W X D
  E F G H I@2 H@2 I@2 J@2 K L K M N O N O N P R@3 ~ S T U V W X Y ~@2 AC@4
>`.pickRestart({
  A: "[f2,f3] ~@5 [c3,c4]@2 ~@2 [c3,c4]@2 ~@2 [g2,g3]@2", B: "~@2 [g2,g3] ~@3 [c3,c4]@2 [bb2,bb3]@3 ~ [c3,c4]@3 ~",
  C: "[f2,f3] ~@2 [c3,c4] ~ [c3,c4] ~ [g2,g3]", // F C G
  D: "[f2,f3,f4,f5]@2 ~@4 [c3,c4,c5,c6] ~@3 [c3,c4,c5,c6] ~@3 [g2,g3,g4,g5]@2", // F C G
  E: "~ [g2,g3,g4,g5] ~ [c3,c4,c5,c6] [bb2,bb3,bb4,bb5] ~ [c3,c4,c5,c6] ~", // G C Bb C
  F: "[f2,f3,f4,f5] ~@2 [c3,c4,c5,c6] ~ [c3,c4,c5,c6] ~ [g2,g3,bb4,bb5]", // F C Gm
  G: "~@2 [g2,g3,bb4,bb5]@2 ~@2 [c3,c4,c5,c6]@2 [bb2,bb3,bb4,bb5]@3 ~ [c3,c4,c5,c6]@3 ~", // Gm C Bb C
  H: "~@2 [f4,ab4,c5]@2 c4@2 ~@2 f4@2 c4@2 [c2,bb3]@2 c4 ~, f2@3 c3@3 ~@2", // Fm C7
  I: "g2@2 [e4,g4,c5]@2 c4@2 c3@2 e4@2 c4@2 [c2,bb3]@2 c4 ~", // C C7
  J: "[[f2,f3]@2 e3@2 ~@2 [eb2,eb3]@2 ~@2 [d2,d3]@2 ~@2 [db2,db3]@14 [c4,e4,g4,bb4] ~@3, ~@2 e2 ~@25 [c2,c3]@2 ~@2]/2", // F Eb D Db C7 C
  K: "[f2,f3]@2 ~@2 [ab2,ab3,ab4]@2 [f3,f4]@2 ~@2 [ab2,ab4] ~@3 [g2,g3,g4]@2, f4 ~@5 f2 ~@3 ab3@2 ~@4", // F Ab F Ab G
  L: "~@2 [db3,db4,db5]@2 ~@2 [c3,c5]@2 ~@2 [c2,c3,c4,e4,g4] ~ [c2,c3,c4,e4,g4] ~@3, ~@6 c4 ~@9", // Db C
  M: "~@2 [db3,db4,db5]@2 ~@2 [c3,c5]@2 ~@2 [c5,c6] ~ [c3,c4]@2 ~@2, ~@6 c4 ~@9", // Db C
  N: "[ab4,c5,f5] ~@3 [c3,c4] ~ [c3,c4] ~ [ab4,c5,f5,ab5] ~@3 [c3,c4] ~ [c3,c4] ~, ab5 ~@7", // Fm C Fm C
  O: "[c5,e5,g5,bb5] ~@3 [c3,c4] ~ [c3,c4] ~ [g4,c5,e5,g5]@3 ~ [c3,c4] ~ [c3,c4] ~", // C7 C
  P: "[c5,e5,g5,bb5] ~@3 [c3,c4] ~ [c4,g4,c5,e5,g5,bb5] ~@3 [c3,c4,c5,c6] ~ [c3,c4,c5,c6] ~@3", // C7 C C7 C
  Q: "[ab4,c5,f5] ~@3 c5 ~ f5 ~ [c5,f5,ab5] ~@3 [c3,c4] ~ [c3,c4] ~, ab5 ~@7", // Fm C
  R: "[[f4,f5]@2 [g4,g5]@2 [ab4,ab5]@2 [e4,e5]@4 [g4,g5]@2 [ab4,ab5]@2 [eb4,eb5]@4 [g4,g5]@2 [ab4,ab5]@2 [d4,d5]@4 [g4,g5]@2 [ab4,ab5] ~ [db4,ab4,db5,ab5,b5]@9 ~@9]/3", // F G Ab E G Ab Eb G …
  S: "[f3,f4]@2 [ab3,ab4]@2 [c4,c5] ~ [f3,f4]@2 ~@2 [ab3,ab4] ~@3 [e3,e4,e5]@2", // F Ab C F Ab E
  T: "~ [g3,g4,g5] ~ [g3,g4,g5] ~@4, ~@2 a4 ~@13", // G
  U: "f3@2 ab3@2 [c4,c5] ~ [ab3,ab4] ~@3 [f3,f4] ~@3 g4@2, f4 ~ ab4 ~@11 g3 ~", // C Ab F
  V: "~@2 c5@2 ~@2 e4@2 ~@2 [g3,g4]@2 [c4,c5]@2 [e3,e4] ~, ~@2 c4 ~@3 e3 ~@9", // G C E
  W: "ab3@2 [c4,c5]@2 [f4,f5] ~ [ab3,ab4] ~@3 [f3,f4]@2 ~@2 [e3,e4] ~, ab4 ~@15", // C F Ab F E
  X: "~@2 [g3,g4] ~@3 [g3,g4]@2 ~@6 [g3,g4]@2", Y: "[f3,f4] ~@15", Z: "~@6 [c2,c3] ~", AA: "~@2 [c2,c3] ~@3 [c2,c3] ~",
  AB: "~@2 [c2,c3] ~@5", AC: "[[c5,f5,ab5,c6]@3 ~, [f2,f3]@13 ~@3]/4",
})).s("gm_piano").gain(0.43)

// bass · electric bass finger · "Fing.Bass"
const bass = note(`<
  ~ A B A C A B A C D E F G D E F H@2 I J I J D K L K D K I J I J D K L K D K M@3 N O P O P O P Q R S T O P O P U V A B
  A C D E F G D E F H@2 I J I J D K L K D K M@3 N O P O P O P Q ~@2 W X ~@2
>`.pickRestart({
  A: "f2 ~@2 c3 ~ c3 ~ g2", B: "~@2 g2@2 ~@2 c3@2 bb2@4 c3@3 ~", C: "~ g2 ~ c3 bb2@2 c3 ~",
  D: "f2@2 ~@2 c3 ~ c2@4 c2 ~ c3@2 c2 ~", E: "g2@2 bb2@2 c3 ~ c2@5 ~ c3 ~ c3 ~", F: "g2@2 bb2@2 c3@2 c2@6 c3 ~ c3 ~",
  G: "f2@3 ~ c3@2 c2@5 ~ c3 ~ c3 ~", H: "[f2 ~ e2 ~@3 eb2@2 ~@2 d2 ~@3 db2@14 c2 ~@3]/2", I: "f2 ~ ab2 f2 ~ ab2 ~ g2",
  J: "~@2 db3@2 ~@2 c3@2 ~@2 c2 ~ c2@2 ~@2", K: "g2@2 bb2@2 c3 ~ c2@4 c3 ~ g2 ~ c2 ~",
  L: "f2@2 ~@2 c3 ~ c2@4 ~@2 f2@2 gb2@2", M: "[f2@6 e2@8 eb2@8 d2@8 db2@13 ~@5]/3", N: "~@10 c2 ~ c2@2 ~@2",
  O: "f2@2 ~@2 c3@2 c2@4 ~@2 f2 ~ gb2 ~", P: "g2@2 ~@2 c3@2 c2@2 ~@2 d2 ~ eb2 ~ e2 ~", Q: "f2 ~@7", R: "~@6 c2 ~",
  S: "~@2 c2 ~@3 c2 ~", T: "~@4 c2@2 ~@4 c2 ~ c2@2 ~@2", U: "f2@2 ~@2 c3@2 c2@4 e2 ~ f2 ~ gb2 ~",
  V: "g2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~ c2 ~", W: "f1@9 ~@7", X: "~@12 f1 ~@3",
})).s("gm_electric_bass_finger").gain(0.57)

// bass · electric bass finger · "Fing.Bass" · soft notes
const bass_soft = note("<~@94 [~@9 f1!7] [f1!12 ~ f1 f1@2] [~ f1@3 ~@12] ~>").s("gm_electric_bass_finger").gain(0.29)

// other · tremolo strings · "#Susp.Str"
const tremolo_strings = note("<~@71 A@2 B@2 ~@23>".pickRestart({
  A: "[c4@7 ~]/2", B: "[c4@31 ~]/2",
})).s("gm_tremolo_strings").gain(0.24)

// chords · brass section · "Brass Sec"
const brass_section = note(`<
  ~@5 A B A B ~@4 C ~@2 D@2 ~ E ~@7 F ~ E ~@5 G ~ F H@3 I J K L M N O P ~@2 Q J K L M L R S T U V ~@4 C ~@2 D@2 ~ E ~@7
  F H@3 I J K L M N O P ~@2 W@2 ~@2
>`.pickRestart({
  A: "~@2 [f4,f5]@4 [ab4,ab5]@2 [g4,ab4,g5,ab5] [g4,g5] [f4,f5] [g4,g5] [ab4,ab5]@4", // F Ab Abmaj7 G F G Ab
  B: "~@2 [g4,g5]@3 ~ [g4,g5]@2 [bb4,bb5] ~ [bb4,bb5] ~ [ab4,ab5] ~ [ab4,ab5] ~", C: "f4",
  D: "[f4@2 e4 ~@3 eb4 ~@3 d4 ~@3 [db4,f4]@14 [c4,e4] ~@3]/2", E: "~@10 c4 ~ c4 ~@3", F: "~@10 [e4,c5]@2 [e4,c5] ~@3",
  G: "~@3 c3@5",
  H: "[[f3,f4] [g3,g4] [ab3,ab4] [e3,e4]@2 [g3,g4] [ab3,ab4] [eb3,eb4]@2 [g3,g4] [ab3,ab4] [d3,d4]@2 [g3,g4] [ab3,ab4] [db3,db4,ab4]@4 ~@5]/3", // F G Ab E G Ab Eb G …
  I: "~@10 c6 ~ c6 ~@3", J: "~@14 f5 ~", K: "e5 ~@13 [g4,bb4]!2", L: "[ab4,c5] ~@15", M: "~@14 [g4,bb4]!2",
  N: "[ab4,c5] ~@13 [ab4,c5]!2", O: "[g4,bb4] ~@13 [g4,bb4] g4", P: "[ab4,f5] ~@15", Q: "~@10 [e5,c6] ~ [e5,c6] ~@3",
  R: "c3@15 ~",
  S: "[c6,db6] c6!6 [c6,db6] [g4,ab4,g5,ab5,c6] [g4,g5,c6] [f4,f5,c6] [g4,g5,c6] c6!2 [c6,db6] c6, ~ [f4,f5]@2 [ab4,ab5] ~@2 [ab4,ab5]@2", // Dbmaj7 Abmaj7 C5 F5 C5 Dbmaj7 F Ab
  T: "c6!5 [c6,db6] c6!2 [bb4,bb5,c6] c6 [bb4,bb5,c6] c6 [ab4,ab5,c6,db6] c6 [ab4,ab5,c6] c6, ~@2 [g4,g5]@3 ~ [g4,g5]@2 ~@8", // Dbmaj7 Bbsus2 Dbmaj7 Ab G
  U: "c6!3 [c6,db6] c6!4 [g4,ab4,g5,ab5,c6] [g4,g5,c6] [f4,f5,c6,db6] [g4,g5,c6] c6!4, ~ [f4,f5]@2 [ab4,ab5] ~@2 [ab4,ab5]@2", // Dbmaj7 Abmaj7 C5 Dbmaj7 C5 F Ab
  V: "c6 [c6,db6] c6!6 [bb4,bb5,c6] [c6,db6] [bb4,bb5,c6] c6 [ab4,ab5,c6] c6 [ab4,ab5,c6] c6, ~@2 [g4,g5]@3 ~ [g4,g5]@2 ~@8", // Dbmaj7 Bbsus2 Dbmaj7 Bbsus2 Ab G
  W: "c6/2",
})).s("gm_brass_section").gain(0.32).pan(0.3)

// chords · brass section · "Brass Sec" · soft notes
const brass_section_soft = note(`<
  ~@58
  [~ db6!6 ~ db6!6 ~ db6]
  [db6!5 ~ db6!6 ~ db6!3]
  [db6!3 ~ db6!6 ~ db6!5]
  [db6 ~ db6!7 ~ db6!6]
  ~@36
>`).s("gm_brass_section").gain(0.2).pan(0.3)

// other · tenor sax · "#Tenor Sa"
const tenor_sax = note(`<
  ~@5 A@4 ~@3 B C@2 ~@4 D ~@2 E F E F ~@3 D ~@2 G H I J ~@2 K@3 ~ L M N O P Q N ~@2 R L M N O N S A@4 ~@3 B C@2 ~@4 D
  ~@2 E F E F ~@2 K@3 ~ L M N O P Q N ~@2 T@2 ~@2
>`.pickRestart({
  A: "c4 c4@15, ~ db4 ~@14", B: "~@4 c4 db4 d4 e4", C: "[f4@21 ~@11]/2", D: "~@10 c3 ~ c3@2 ~@2",
  E: "~@2 ab4@2 bb4@2 c5@9 ~", F: "~@4 c5@2 bb4@9 ~", G: "~ [c4,f4,ab4] [eb4,g4,bb4] [f4,ab4,c5]@4 ~",
  H: "~@2 [f4,ab4,db5] [e4,g4,c5]@4 ~", I: "~@2 [c4,f4,ab4]@2 [eb4,g4,bb4]@2 [f4,ab4,c5]@9 ~", J: "~@3 c3@5",
  K: "[f4@2 g4@2 ab4@2 e4@4 g4@2 ab4@2 eb4@4 g4@2 ab4@2 d4@4 g4@2 ab4@2 db4@9 ~@9]/3", L: "~@14 f4!2",
  M: "e4 ~@13 bb4!2", N: "c5 ~@15", O: "~@14 bb4!2", P: "c5 ~@13 c5!2", Q: "bb4 ~@13 bb4!2", R: "~@10 c5 ~ c5 ~@3",
  S: "c3@15 ~", T: "f5/2",
})).s("gm_tenor_sax").gain(0.42).pan(0.6)

// other · brass section · "Brass Sec"
const brass_section_2 = note(`<
  ~@5 A B A B ~@4 C ~@2 D@2 ~@9 E ~@7 F ~ E ~ G@2 H I J K L M N K ~@2 O I J K L K P A B A B ~@4 C ~@2 D@2 ~@9 E ~ G@2 H
  I J K L M N K ~@2 Q@3 ~
>`.pickRestart({
  A: "~@2 d5@4 f5@2 [e5,f5] e5 d5 e5 f5@4", B: "~@2 e5@3 ~ e5@2 g5 ~ g5 ~ e5 ~ e5 ~", C: "f4",
  D: "[f5 ~ e5 ~@3 eb5 ~@3 d5 ~@3 [ab4,db5]@14 [bb4,c5] ~@3]/2", E: "~@5 c5!2 ~", F: "~@3 c3@5", G: "[~@14 b4@9 ~@9]/2",
  H: "~@10 [c4,e4,c5,e5] ~ [c4,e4,c5,e5] ~@3", I: "~@14 f5!2", J: "e5 ~@13 [bb3,c4]!2", K: "c4 ~@15", L: "~@14 bb3!2",
  M: "c4 ~@13 c4!2", N: "bb3 ~@13 bb3!2", O: "~@10 c5 ~ c5 ~@3", P: "c3@15 ~", Q: "[[f5,ab5]@11 ~@5]/3",
})).s("gm_brass_section").gain(0.32).pan(0.7)

// other · pizzicato strings · "Pizzicato" · C
const pizzicato_strings = note("<~@72 [~@10 [c5,c6] ~@5] ~@25>").s("gm_pizzicato_strings").gain(0.62)

// chords · acoustic guitar nylon · "Nyl.Str.G"
const acoustic_guitar_nylon = note(`<
  ~@20 A B C D E F G H I J I J C D E F G H K@3 ~@34 C D E F G H K@3 ~@14
>`.pickRestart({
  A: "f2 ~@2 [f3,ab3] c4 ~ ab3 ~@3 c4 ~@3 bb3 ~, ~@2 c3@3 ~@11", B: "~@2 f4 ~@3 e4 ~@9", C: "~@6 [f3,ab3,c4,f4]@7 ~@3",
  D: "~@2 f4 e4@4 ~, ~@3 [c3,g3]@11 ~@2, ~@4 c4@11 ~", E: "~@3 [ab3,c4,f4,ab4,c5]@3 ~@2",
  F: "~@4 f4@2 e4@4 ~@2 db5@3 ~, ~@3 c3@12 ~, ~ [g3,c4]@3, ~@11 [e4,g4,bb4]@4 ~", // C5 Edim
  G: "[f3,c4,f4,ab4,c5]@3 ~ [f3,c4,f4,ab4,c5] ~ [f3,c4,f4,ab4,c5]@3 ~ [f3,c4,f4,ab4,c5] ~ [f3,c4,f4,ab4,c5] ~ [f3,c4,f4,ab4,c5] ~", // Fm
  H: "[g3,c4,e4,g4,bb4]@3 ~@13", I: "f4 ~@3 ab4 ~ f4 ~@3 ab4 ~@3 g4 ~", J: "~@2 db5 ~@3 c5 ~@9",
  K: "[f4@2 g4@2 ab4@2 e4@4 g4@2 ab4@2 eb4@4 g4@2 ab4@2 d4@4 g4@2 ab4@2 db4@5 ~@13]/3",
})).s("gm_acoustic_guitar_nylon").gain(0.24).pan(0.6)

// drums · rim
const rim = s("rim").struct("<[~@5 x ~@2] ~@97>").gain(0.1)

// drums · kick
const kick = s("bd").struct(`<
  ~ A@8 B@7 C ~ D E D E F G F A F G D E D E F G F A F G B H ~ I F@6 J ~@2 K F@5 L A@4 B@7 C ~ D E D E F G F A F G B H ~
  I F@6 J ~@2 G ~ M ~
>`.pickRestart({
  A: "x ~@2 x ~ x ~ x", B: "x ~@2 x ~@3 x", C: "x!2 ~ x ~ x ~@2", D: "x ~@4 x ~@2", E: "~ x ~@3 x ~ x",
  F: "x ~@4 x ~ x", G: "x ~@2 x ~@4", H: "~@3 x ~@3 x", I: "~@4 x ~@2 x", J: "x", K: "~@7 x", L: "x!8", M: "~ x ~@14",
})).gain(0.45)

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

// drums · low tom
const low_tom = s("lt").struct("<~ A@8 ~@36 B ~@9 B ~@2 A@4 ~@8 C ~@17 B ~@5 D ~@3>".pickRestart({
  A: "~@6 x!2", B: "~@5 x!3", C: "~@3 x", D: "~@3 x!3 ~@2 x!3 ~@2 x!3",
})).gain(0.25)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~ A@8 ~@8 B C@4 ~@6 C@4 ~@5 D E@2 ~@12 F G ~@4 A@4 ~@8 B C@4 ~@6 E@2 ~@11 H I ~@2
>`.pickRestart({
  A: "~ x ~@2", B: "~@3 x", C: "~ x ~ x", D: "~ x", E: "~@2 x!2 ~@6 x!2 ~@4", F: "~@3 x ~@12", G: "~@14 x!2",
  H: "~@5 x!3 ~@8", I: "~@7 x ~ x ~ x ~@4",
})).gain(0.25)

// drums · open hat
const open_hat = s("oh").struct("<~@16 A ~@10 B ~@9 B ~ C ~@29 A ~@10 B ~ C ~@15>".pickRestart({
  A: "~ x ~ x ~ x ~@2", B: "~@5 x!2 ~", C: "~@3 x",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct(`<
  A B ~@2 A ~@3 C ~@7 D ~@4 A B ~@8 A B ~@8 E ~@9 E ~ F ~@7 C ~@7 D ~@4 A B ~@8 E ~@9 G H B ~
>`.pickRestart({
  A: "~@8 x ~@3 x!4", B: "x", C: "x ~@2 x ~@3 x ~@2 x ~ x ~@3", D: "~@7 x", E: "~@5 x!2 ~", F: "~@7 x!2 ~@2 x!2 ~@3",
  G: "x ~@3 x!4 ~@2 x!3 ~ x ~", H: "~ x!2 ~ x!3 ~@6 x ~@2",
})).gain(0.25)

// drums · crash
const crash = s("cr").struct(`<
  ~@5 A ~@3 A ~@3 A ~@2 B ~@5 A ~@3 A ~@5 A ~@3 A ~@2 B ~@6 A ~@9 A ~ A ~@3 A ~@3 C D@2 B ~@5 A ~@3 A ~@2 B ~@6 A ~@4 A
  ~@3
>`.pickRestart({
  A: "x", B: "~@7 x", C: "x!3 ~@5", D: "~ x!2 ~@5",
})).gain(0.3)

// drums · tambourine
const tambourine = s("tb").struct(`<
  ~ A@3 B A@3 B A@8 ~@10 C ~@9 C A D ~@2 E@6 ~@4 E@6 A@3 B A@8 ~@10 C A D ~@2 E@6 ~@7
>`.pickRestart({
  A: "x!3 ~ x!3 ~", B: "x!3 ~ x!4", C: "~@5 x!2 ~", D: "x ~ x ~ x!3 ~", E: "x ~ x!3 ~ x!2",
// … 90 more lines

More by The Manhattan Transfer