Strudelify

Say Mama

Showaddywaddy

KeyA majorTempo175 bpm
0:00/0:00
// Say Mama — Showaddywaddy
// 175 bpm, 4/4, key A major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 95 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): STEEL GTR.
setcpm(175/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 finger · "FINGERDBAS"
const bass = note(`<
  A B C D@2 E@2 D@2 F E D G B C D@2 E@2 D@2 F E D G B C D@2 E@2 D@2 F E D G D@3 H E@2 D@2 F E D G D@3 H E@2 D@2 F E D G
  B C D@2 E@2 D@2 F E D G B C D@2 E@2 D@2 F E D@2 F E D@2 F E I J@3
>`.pickRestart({
  A: "~@5 e2 f#2 g#2", B: "a2@3 ~@13", C: "d3@3 ~@7 e2@2 f#2@2 g#2@2", D: "a1!2 c#2!2 e2!2 f#2 e2",
  E: "d2!2 f#2!2 a2!2 b2 a2", F: "e2!2 g#2!2 b2!2 c#3 b2", G: "e1!2 g#1!2 e1!2 f#1 g#1",
  H: "a1@2 ~ a1@2 a#1@3 b1@3 c2@2 c#2@3", I: "a1@3 ~@13", J: "[e2@2 f#2 ~ g#2@2 a2 ~@5 a2@23 ~@5 a2@2 ~@6]/3",
})).s("gm_electric_bass_finger").gain(0.33)

// chords · electric guitar clean · "CLEAN GTR"
const electric_guitar_clean = note(`<
  A B C D@2 E@2 D@2 F E D G B C D@2 E@2 D@2 F E D G B C D@2 E@2 D@2 F E D G D@4 E@2 D@2 F E D G D@4 E@2 D@2 F E D G B C
  D@2 E@2 D@2 F E D G B C D@2 E@2 D@2 F E D@2 F E D@2 F E H I@3
>`.pickRestart({
  A: "~@5 e2 f#2 g#2", B: "a2 ~@7", C: "[d3,f#3,a3]@3 ~@7 e2@2 f#2@2 g#2@2",
  D: "[a2,e3]!2 [a2,f#3]!2 [a2,e3]!2 [a2,f#3]!2", E: "[d3,a3]!2 [d3,b3]!2 [d3,a3]!2 [d3,b3]!2",
  F: "[e3,b3]!2 [e3,c#4]!2 [e3,b3]!2 [e3,c#4]!2", G: "[e2,b2]!6 [f#2,b2] [g#2,b2]", H: "[a2,e3]@3 ~@13",
  I: "[~@12 [a3,c#4,e4,f#4]@25 ~@3 [a3,c#4,e4,f#4]@3 ~@5]/3", // F#m7
})).s("gm_electric_guitar_clean").gain(0.19).pan(0.1)

// chords · acoustic guitar steel · "STEEL GTR"
const acoustic_guitar_steel = note("<~@92 A@3>".pickRestart({
  A: "[~@11 [a2,e3]@27 ~@10]/3", // A5
})).s("gm_acoustic_guitar_steel").gain(0.29).pan(0.9)

// chords · overdriven guitar · "OVERDRIVE"
const overdriven_guitar = note(`<
  ~@37 A B C D E@2 F G H I J K L B C M N@2 F G H I J O P Q R D E@2 F G H I J O P Q R D E@2 F G H I S J H I S J H T@2 ~@3
>`.pickRestart({
  A: "[a2,e3,a3]@4 [a2,f#3,a3] ~ a2 ~ [a2,e3,a3]@2 [f#3,a3] ~ a2 ~ [a2,e3,a3]@2", // A5 D A5 F#m A5
  B: "~@2 a2 ~ [a2,f#3,a3]@2 a2 ~ [a2,e3,a3]@2 [f#3,a3] ~ [a2,a3] ~ [a2,e3,a3]@2", // D A5 F#m A A5
  C: "~@2 [a2,a3] ~ [a2,f#3,a3] ~ a2 ~ [a2,e3,a3]@2 f#3 ~ [a2,a3] ~ [a2,e3,a3]@2", // A D A5 A A5
  D: "a2 ~ [a2,a3] ~ [a2,f#3,a3]@2 a2 ~ [a2,e3,a3]@2 [f#3,a3] ~@3 [d3,a3,d4]@2", // A D A5 F#m D5
  E: "[~@2 d3 ~ [d3,b3,d4] ~ d3 ~ [d3,a3,d4]@2 b3 ~ d3 ~ [a3,d4]@4 d3 ~ [d3,b3,d4]@2 d3 ~ [d3,a3,d4]@2 b3 ~ d3 ~ [a2,e3,a3]@2, ~@7 d3 ~@8]/2", // G D5 G D5 A5
  F: "~@2 a2 ~ [a2,f#3,a3]@2 a2 ~ [a2,e3,a3]@2 f#3 ~ a2 ~ [a2,e3,a3]@2", // D A5
  G: "~@2 [a2,a3] ~ [a2,f#3,a3] ~ a2 ~ [a2,e3,a3]@2 [f#3,a3] ~ e3 ~ [e3,b3,e4]@2", // A D A5 F#m E5
  H: "~@2 [e3,e4] ~ [e3,c#4,e4] ~ e3 ~ [e3,b3,e4]@2 c#4 ~ [e3,e4] ~ [d3,a3,d4]@2", // E C#m E5 E D5
  I: "~@2 [d3,a3,d4] ~ [d3,b3,d4] ~ d3 ~ [d3,a3,d4]@2 b3 ~ d3 ~ [a2,e3,a3]@2", // D5 G D5 A5
  J: "~@2 [a2,a3] ~ [a2,f#3,a3] ~ a2 ~ [a2,e3,a3]@2 f#3 ~ a2 ~ [b2,e3,b3]@2", // A D A5 E5
  K: "~@2 [b2,e3,b3] ~ [b2,e3,b3]@2 b2 ~ [b2,e3,b3]@2 [b2,e3,b3] ~ b2 ~ [a2,e3,a3]@2", // E5 A5
  L: "~@2 a2 ~ [a2,f#3,a3] ~ a2 ~ [a2,e3,a3]@2 [f#3,a3] ~ a2 ~ [a2,e3,a3]@2", // D A5 F#m A5
  M: "a2@2 ~ [a2,e3,a3]@2 [a#2,f3,a#3]@3 [b2,f#3,b3]@2 ~ [c3,g3,c4]@2 [c#3,g#3,c#4]@2 ~", // A5 A#5 B5 C5 C#5
  N: "[[d3,a3,d4]@2 d3 ~ [d3,b3,d4] ~ d3 ~ [d3,a3,d4]@2 b3 ~ d3 ~ [a3,d4]@4 d3 ~ [d3,b3,d4]@2 d3 ~ [d3,a3,d4]@2 b3 ~ d3 ~ [a2,e3,a3]@2, ~@7 d3 ~@8]/2", // D5 G D5 G D5 A5
  O: "~@2 [b2,e3,b3] ~ [b2,e3,b3]@2 b2 ~ [b2,e3,b3]@2 [b2,e3,b3] ~ b2 ~ [b2,e3,b3]@2", P: "[a2,e3,a3] ~@7",
  Q: "[d3,a3,d4] ~@7", R: "[a2,e3,a3]@2 [a2,a3] ~ [a2,f#3,a3] ~ a2 ~ [a2,e3,a3]@2 f#3 ~ [a2,a3] ~ [a2,e3,a3]@2",
  S: "~@2 [a2,a3] ~ [a2,f#3,a3] ~ a2 ~ [a2,e3,a3]@2 f#3 ~ a2 ~ [a2,e3,a3]@2", // A D A5
  T: "[~@2 [d3,a3,d4] ~ [d3,b3,d4] ~ d3 ~ [d3,a3,d4]@2 b3 ~ d3 ~ [a2,e3,a3]@4 ~@14]/2", // D5 G D5 A5
})).s("gm_overdriven_guitar").gain(0.25).pan(0.7)

// chords · piano · "A.PIANO 1"
const piano = note(`<
  A B C D E F@2 D E G F D G H C D E F@2 D E G F D G H C D E I@2 J K G F L M N O P Q R S T U V W X Y ~@12 H C D E F@2 D E
  G F D G H C D E F@2 D E G F D@2 G F D@2 G F Z ~@3
>`.pickRestart({
  A: "~@10 [e3,e4] ~ [f#3,f#4] ~ [g#3,g#4] ~", B: "[a3,a4] ~@7", C: "[a4,d5,f#5,a5]@3 ~@13", D: "[d#5,a5] [e5,a5]!7",
  E: "[e5,a5]!8", F: "[d5,a5]!8", G: "[e5,b5]!8", H: "[a4,a5] ~@7", I: "[d5,c6]!8", J: "[d#5,g5] [e5,g5]!7",
  K: "[e5,g5]!8", L: "[d#5,g#5] [e5,a5]!3 [e5,g#5] [e5,a5]!3",
  M: "~@10 [d7,e7,f7,g7,a7] [g6,a6,b6,c7] [c6,d6,e6,f6] [f5,g5,a5,b5] [b4,c5,d5,e5] a4", // Dm Cmaj7 Dm7 G7 Cmaj7
  N: "~@2 g5 ~@2 g5!2 ~ [a5,e6,a6] ~ [a5,e6,a6] ~ a5 [e6,a6] a5 [d#6,a6], ~@4 d6@3 ~@9, ~@5 g6@2 ~@9", // A5 D#dim
  O: "[a5,e6,a6] ~ [a5,e6,a6] ~ [a5,e6,a6] ~ [a5,d#6,a6] ~ [a5,e6,a6] ~ [a5,e6,a6] ~ [a5,d6,a6] ~ [c#6,a6] ~, ~@7 a5", // A5 Adim A5 D5 F#m
  P: "[a5,e6,a6] ~ [a5,e6,a6] ~ [a5,d6,a6] ~ [a5,d6,a6] ~ [a5,c6,a6] ~ [a5,c#6,a6] ~ [c6,a6]@2 [a5,c#6] ~, ~@12 a5 ~@3", // A5 D5 Am A F A
  Q: "[c6,a6] ~ [a5,a6] ~ a7 [f7,g7,b7] [b6,c7,d7,e7] [f6,g6,a6] [c6,d6,e6] [f5,g5,a5,b5] [c5,d5,e5] [a4,b4] [e4,f4,g4] [c4,d4] b3 ~", // F A G7 Cmaj7 F C G7 C …
  R: "[d4,a4] ~ d4 [d4,a4]!2 d4 [d4,a4] ~ [d4,a4] d4 [d4,a4] d4 [d4,a4] d4 [d4,a4] d4", // D5
  S: "[d4,a4] d4 [d4,a4] d4 [d4,e4,g4,a4] [d4,b4,c5] [d5,e5,f5] [g5,a5,b5,c6,d6] [e6,f6,g6,a6,b6,c7] [d7,e7,f7] [c7,d7] [e6,f6,g6,a6,b6] [b5,c6,d6] [f5,g5,a5] [b4,c5,d5,e5] [g4,a4]", // D5 Dsus4 G Dm G Cmaj7 Dm Csus2 …
  T: "[a4,d#5] ~ a4 ~ [a4,a5]@2 e5 ~ [d#5,a5]@2 a4 ~ d#5 ~ [a4,e5,a5]@2, e5@2 ~@6 a4 ~@5 d#5 ~", // Adim A D#dim A5
  U: "~ a4 [a4,e5,a5]@3 [d#5,e5,a5] ~ [a4,e5,a5] ~ [a4,a5] ~ e5@2 ~@3, ~@9 d#5@2 ~@5, ~@5 [a4,a5] ~@2", // A5 A A5 A
  V: "e4@2 [a#4,b4]@2 e4@2 [a#4,b4]@2 e4@2 e4 ~ e4@2 [b4,d5]@2, ~@10 e5@4 a#4 ~", // Bmaj7 Bm
  W: "[a4,d5]@2 d4 ~ [b4,d5]@2 d4@2 [a4,d5]@2 a4@2 d4 ~ d5 e5, ~@8 g#4 ~ d5@4 ~@2", // D5 Bm D5
  X: "g5 e5 [e5,g5] g5 e5 g5 e5 g5 [e5,g5] e5 g5 e5 g5 e5 [e5,g5] ~", // Em
  Y: "~ [b4,c5,d5] [e5,f5,g5] [a5,b5,c6] [d6,e6,f6,g6] [a6,b6,c7] e7 [a6,b6,c7] [f6,g6] [c6,d6,e6] [g5,a5,b5] [d5,e5,f5] [b4,c5] [g4,a4] [d4,e4,f4] ~, ~@3 d7 ~@4", // Bm Em Am Em7 Am Fsus2 C G …
  Z: "[a4,e5,a5]@3 ~@13", // A5
})).s("gm_piano").gain(0.36).pan(0.6)

// other · overdriven guitar · "OVERDRIVE"
const overdriven_guitar_2 = note("<~@48 A@2 B C D E@2 F@2 G H I J ~@29 K L M@3>".pickRestart({
  A: "[~@10 e4@2 e4@2 e4@4 e4@2 e4@2 e4@2 e4@2 e4@2 g4 e4 d4@2]/2", B: "e4@2 e4@4 e4@2 e4@2 e4@2 g4 e4 d4@2",
  C: "e4@2 e4@2 e4@2 e4@2 e4@2 e4@2 g4 e4 d4@2", D: "e4@2 ~ e4@3 f4@2 f#4@3 g4@2 ~ g#4@2",
  E: "a4@2 a4@2 a4@2 a4@2 a4@2 a4@2 c5 a4 g4@2", F: "a4!8", G: "g#4 b4@2 c#5 b4 g#4 e4 b4, e4@5 ~@11",
  H: "f#4 d5@2 b4 a4 f#4 d4 f#4, d4@7 ~@9", I: "a3 [f#4,a4]@2 [e4,a4]@2 [f#4,a4] [e4,a4]@2",
  J: "d4@2 c4@3 ~ a3@2 g3@4 e3@3 ~", K: "~@7 a4", L: "c5 b4 a4@2 g4@2 e4@2 d4 c4 a3@2 g3@2 f#3@2",
  M: "[e3@2 f#3 g#3@3 a3@2 ~@4 [e3,a3,f#4]@25 ~@3 [a2,e3,a3,f#4]@2 ~@6, ~@11 a2@25 ~@12]/3", // F#m7
})).s("gm_overdriven_guitar").gain(0.38).pan(0.6)

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

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

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@36 [~@5 x ~ x ~ x ~ x ~@4] ~@56 [~@2 x!2 ~@6 x!2 ~@4] ~>").gain(0.23)

// drums · hihat
const hihat = s("hh").struct("<~@2 A ~@11 A ~@11 A ~@35 A ~@11 A ~@19 B>".pickRestart({
  A: "x", B: "~ x",
})).gain(0.45)

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

stack(
  bass, electric_guitar_clean, acoustic_guitar_steel, overdriven_guitar, piano, overdriven_guitar_2, kick, snare,
  snare_soft, hihat, open_hat
)

More by Showaddywaddy