Strudelify

Ain't No Doubt

Jimmy Nail

KeyB minorTempo102 bpm
0:00/0:00
// Ain't No Doubt — Jimmy Nail
// 102 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 103 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(102/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 · piano
const bass = note(`<
  ~ A B A C A B A C ~@8 C B D B C B E@2 A B A C A B A F ~@8 C B D B C B E@2 A B A C A B A F A B A C A B A F ~@4 C B D B
  C B E@2 A B A C A B A F A B A C A B A F A B A C A B A F G@2
>`.pickRestart({
  A: "b2@31 ~", B: "f#2@31 ~", C: "e2@31 ~", D: "g2@31 ~", E: "[g2@47 ~ a#2@15 ~]/2", F: "e2@23 ~ e2@7 ~",
  G: "[b1@61 ~@3]/2",
})).s("gm_piano").gain(0.45)

// bass · synth bass 1
const bass_2 = note(`<
  A B C D E F C D G H I H I J K J K L M N M O P Q R B C D S B C D G J K J K J K J K L M N M O P Q R B C D E B C D G B C
  D E B C D G ~@3 T L M N M O P Q R B C D E B C D G B U D V B C D G B C D V B C D E W@2
>`.pickRestart({
  A: "~@3 f#2", B: "f2@2 ~@2 e2@2 ~@2 d2 ~@3 b1 ~@3 d2@6 ~ f2@2 ~@7",
  C: "f#1@2 ~@5 f#1@2 ~@3 f#1@2 ~ f#1@2 ~@2 a1 f#1@2 ~@2 f#1@2 ~@2 f#1 ~@3",
  D: "f2@2 ~@2 e2@2 ~@2 d2@2 ~@2 b1@2 ~@2 d2@6 ~ b1@2 ~@3 a1 ~@2 b1",
  E: "e1@2 ~@2 f#1@2 ~@2 g1@2 ~@2 a1@2 ~ a#1 b1@2 ~@2 c#2@2 ~@2 d2 ~@2 e2@4 ~",
  F: "f2@2 ~@2 e2@2 ~@2 d2 ~@3 b1 ~@3 d2@6 ~ f2@4 ~@5",
  G: "e1@2 ~ e1 f#1@2 ~@2 g1@2 ~@2 a1@2 ~ a#1 b1@2 ~@2 c#2@2 ~@2 d2 ~@2 e2@4 ~",
  H: "b1@4 ~@3 b1@4 ~ b1@4 ~@3 d2 b1@8 a1@2 ~ a#1", I: "b1@4 ~@3 b1@2 ~@3 a1@2 ~ b1@4 ~ b1@4 d2@6 ~@2",
  J: "b1@4 ~@3 b1@2 ~@2 b1 a1@2 ~ b1@2 ~@2 d2 b1@4 f#2 ~@2 e2 e2@2 ~ d2",
  K: "b1@4 ~@3 b1 b1@2 ~@2 a1@2 ~ b1@4 ~ b1@4 f#1@6 ~@2",
  L: "e1@5 ~@2 e1 e1@5 ~@2 b1 d2@2 ~ b1 e2 ~@2 e2@4 d2 b1 ~@2 e1",
  M: "f#1@5 ~@2 f#1@5 ~@3 c#2 e2@2 ~ c#2 f#2 ~@2 f#2@4 e2 c#2@2 ~ f#1",
  N: "g1@5 ~@2 g1@4 ~@4 d2 f#2@2 ~ d2 g2 ~@2 g2@4 f#2 d2 ~@2 b1",
  O: "e1@5 ~@2 e1 e1@4 ~@3 b1 d2@2 ~ b1 e2 ~@2 e2@4 d2 b1@2 ~ e1",
  P: "f#1@5 ~@2 f#1@5 ~@3 c#2 e2@2 ~ c#2 f#2 ~@2 f#2@4 e2 c#2 ~@2 f#1",
  Q: "g1@5 ~@2 g1@5 ~@3 d2 f#2@2 ~ d2 g2 ~@2 g2@4 f#2 d2@2 ~ g1", R: "a1@5 ~@2 a1 a1@6 ~@2 a#1@5 ~@2 a#1 a#1@5 ~@3",
  S: "e1@2 ~@2 f#1@2 ~@2 g1@2 ~@2 a1@2 ~ a#1 b1@2 ~@2 c#2@2 ~@2 d2@2 ~ e2@4 ~", T: "~@16 b3@7 ~ f2@7 ~",
  U: "f#1@2 ~@5 f#1@2 ~@3 f#1@2 ~ f#1@2 ~@2 a1 f#1@2 ~@2 f#1@2 ~@6",
  V: "e1@2 ~ e1 f#1@2 ~@2 g1@2 ~@2 a1@2 ~ a#1 b1@2 ~ b1 c#2@2 ~@2 d2 ~@2 e2@4 ~", W: "[b1@61 ~@3]/2",
})).s("gm_synth_bass_1").gain(0.49)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~ A B A C A B A D ~@8 E F G F E F G H I F I E I F I J G K G K G L G M E F ~@6 N F N E N F N J N F N E N F N J ~@4 E F
  G O E F G H N F N E N F N J N F N E N F N J N P N E N F N J Q@2
>`.pickRestart({
  A: "[d4,f#4,a4,f#5]", B: "[c#4,e4,a4,e5]", C: "[b3,d4,g4,d5]", D: "b3", E: "[b3,d4]", F: "[c#4,e4]", G: "[b3,d4,f#4]",
  H: "[b3,d4,g4] [a#3,a#4]", I: "[b3,d4,f#4,a4]", J: "[b3,d4]@24 [b3,d4]@7 ~", K: "[c#4,e4]@20 ~@4 [c#4,e4]@7 ~",
  L: "[c#4,e4]@5 a4 e4@2", M: "[c#4,e4]@10 ~@3 e4@3", N: "[d4,f#4,a4]", O: "e4@15 ~ e4@8 a4@7 ~, c#4",
  P: "~@24 a4@7 ~, [c#4,e4]", Q: "[[b3,d4,f#4]@61 ~@3]/2",
})).s("gm_electric_guitar_clean").gain(0.36)

// chords · clavinet
const clavinet = note(`<
  A ~@16 B C D E B C F G ~@8 H I J K L I J K B C D E B C F G ~@20 B C D E B C F G ~@26
>`.pickRestart({
  A: "~@3 f#2",
  B: "[g4,b4]@3 [g4,b4] [g4,b4]@3 [g4,b4]!2 ~@2 [g4,b4] [g4,b4]@3 ~ [g4,b4] ~@2 [g4,b4]!2 ~@2 [g4,b4] [g4,b4]@3 [g4,b4] [g4,b4]@3 [g4,b4]", // G
  C: "[a4,c#5]@3 [a4,c#5] [a4,c#5]@3 [a4,c#5]!2 ~@3 [a4,c#5] ~@3 [a4,c#5,e5]@4 [a4,c#5,e5]@3 ~ [e5,a5]@2 [e5,a5]@2 [e5,a5]@2 [e5,a5]@2", // A A5
  D: "[b4,d5]@4 ~@7 [b4,d5] [b4,d5]@4 [b4,d5] ~@2 [b4,d5] [b4,d5]@3 [b4,d5] [b4,d5]@3 [b4,d5] [b4,d5]@3 [b4,d5]", // Bm
  E: "[c#5,e5]@4 [c#5,e5]@4 [c#5,e5]@4 [c#5,e5]@4 [c#5,e5]@4 [c#5,e5]@3 [c#5,e5] [e5,a5]@3 [e5,a5] [e5,a5]@3 [e5,a5]", // C#m A5
  F: "[f#4,b4]@2 [f#4,b4]@2 ~@4 [f#4,b4]@2 b4@2 ~@4 [f#4,b4]@2 [f#4,b4]@2 ~@4 [f#4,b4]@2 [f#4,b4]@3 ~@3, ~@10 f#4 ~@21", // B5
  G: "[d4,g4]@2 [d4,g4]@2 ~@4 d5@2 d5 ~@5 a#4@2 a#4@2 ~@4 a#4@2 a#4@2 ~@4", // G5
  H: "~@2 b3 ~@2 b3 ~ b3!2 ~ b3 ~ a3 a#3 b3 ~", I: "~@2 b3 ~@2 b3 ~ b3 b2!4 a3 b3 d4 b3",
  J: "~@2 b3 ~@2 b3 ~@2 b3!4 a3!2 a#3 b3", K: "~@2 b2 ~@2 b2!3 ~@4 a3 b3 d4 b3",
  L: "~@2 b3 ~@2 b3 ~ b3!2 ~ b3 ~ a3 a#3 b3!2",
})).s("gm_clavinet").gain(0.25).pan(0.3)

// other · synth strings 1
const synth_strings_1 = note(`<
  ~@2 A ~ B ~ A ~ B ~@16 C D C D C D C D ~@16 C D C D C D C D C D C D C D C D ~@12 C D C D C D C D C D C D C D C D C D C
  D C D C D E ~
>`.pickRestart({
  A: "a3 ~ b3 ~@3 b3 ~@3 b2 ~ a3 ~ b3 ~@3 f#3 ~ f#3 ~ b2 ~ b2 ~@7",
  B: "a3 ~ b3 ~@3 b3 ~@3 b2 ~ a3 ~ b3 ~@3 b3 ~ b3 ~ b2 ~ b2 ~@7",
  C: "b2 ~ b3 ~@3 b2 ~ b3 ~@3 b2 ~ b3 ~@3 b2 ~ b3 ~@3 b2 ~@3 b3 ~ b2 ~",
  D: "a3 ~ b3 ~@3 b3 ~@3 b2 ~ a3 ~ b3 ~@3 b3 ~@3 b2 ~ b2 ~@7", E: "b2@3 ~@29",
})).s("gm_synth_strings_1").gain(0.35).pan(0.7)

// chords · string ensemble 1
const string_ensemble_1 = note(`<
  ~ A B C@3 B D@3 E F E F E F E G E F E G E H@2 I J K@3 J L@2 F E F E F E F E G E F E G E H@2 I J K@3 J L@2 I J K@3 J
  L@2 ~@4 G E F E G E H@2 I J K@3 J L@2 I J K@3 J L@2 I J K@3 J L@2 M@2
>`.pickRestart({
  A: "b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7, [b3,d4,f#4]", B: "b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7, [a3,c#4,e4]",
  C: "[b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7, [b3,d4], f#4 g3 f#4]/3", // Bm
  D: "[b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 [f#3,d4]@32, b3, [d4,f#4] [e3,g3] ~]/3", // D Em
  E: "[e3,a3,c#4]", F: "[f#3,b3,d4]", G: "[d3,g3,b3]", H: "[f#3@2 g3 [a#3,a#4], [b3,d4]@3 ~]/2",
  I: "b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7, [b3,d4,f#4,b4,d5,f#5]", J: "b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7, [a3,c#4,e4,a4,c#5,e5]",
  K: "[b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7, [b3,d4,b4,d5], [f#4,f#5] [g3,g4] [f#4,f#5]]/3", // Bm F# G F#
  L: "[b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7 b5 ~@7, [b3,b4], [d4,f#4,d5,f#5] [e3,g3,e4,g4]]/2", // B D Em
  M: "[[f#3,b3,d4]@61 ~@3]/2", // Bm
})).s("gm_string_ensemble_1").gain(0.35).pan(0.3)

// other · lead 8 bass lead
const lead_8_bass_lead = note("<~@8 A@8 ~@16 A@8 ~@63>".pickRestart({
  A: "[~@24 e4@29 ~@11]/2",
})).s("gm_lead_8_bass_lead").gain(0.3)

// other · brass section
const brass_section = note(`<
  ~ A B ~ C ~ B ~ D ~@17 B ~ C ~ B ~ D ~@17 B ~ C ~ B ~ E A B ~ C ~ B ~ F ~@13 B ~ C ~ B ~ F A B ~ C ~ B ~ F A G ~ C ~ B
  ~ F ~@2
>`.pickRestart({
  A: "[b4,b5]@3 [f#4,f#5] [e4,f4,e5,f5] ~@27", B: "~@16 b4 ~@3 a4 ~@3 b4 ~ d5@5 ~", C: "~@16 [e4,e5]@14 [d4,d5] ~",
  D: "~ [e4,e5] [d4,d5] [b3,b4] ~@5 [d4,d5] [c#4,c#5] [b3,b4] ~@4 [d4,d5]@4 ~@4 [a3,a4]@4 [b3,b4]@2 ~@2, [f#4,f#5]@3 ~@5 [e4,e5]@3 ~@21", // E D B D C# B D A …
  E: "~ [e4,e5] [d4,d5] [b3,b4] ~@5 [d4,d5] [b3,c#4,b4,c#5] ~@5 [d4,d5]@4 ~@4 [a3,a4]@4 [b3,b4]@2 ~@2, [f#4,f#5]@3 ~@5 [e4,e5]@3 ~@21", // E D B D Bsus2 D A B …
  F: "~ [e4,e5] [b3,d4,b4,d5] ~@6 [d4,d5] [b3,c#4,b4,c#5] ~@5 [d4,d5]@4 ~@4 [a3,a4]@4 [b3,b4]@2 ~@2, [f#4,f#5]@3 ~@5 [e4,e5]@3 ~@21", // E Bm D Bsus2 D A B F# …
  G: "~@24 b4 ~ d5@5 ~",
})).s("gm_brass_section").gain(0.7)

// other · trumpet
const trumpet = note("<~@65 A@2 B C@2 ~@15 D E ~@2 F@2 G ~@2 H I J K ~@5>".pickRestart({
  A: "[~@24 a5@2 a5@2 ~@2 a5@4 ~@22 d5@2 e5@2 c#5@2 e5 d5]/2", B: "c#5@8 b4@2 ~@2 b4@9 ~@2 a5 ~ b5 ~ f#5 ~@2 a5@2",
  C: "[~@2 a5@3 ~@17 f#5 ~ a5 ~ b5 ~ f#5@2 a5@15 ~@19]/2", D: "~@12 a5@2 ~ a5@6 ~ f#5@8 ~@2, ~@7 f#5 ~@8",
  E: "~@8 f5@5 f5@6 ~ e5@2 ~@2 d5 ~ b4@4 ~@2", F: "[~@3 c#6 b5 ~@3 b5 ~@3 b5 ~@11 g#5 ~@3 g#5 ~ e5@6 f#5@2 ~@26]/2",
  G: "~@8 b5@2 ~ b5@2 b5@2 b5@2 ~@15", H: "~@14 f5@2 ~ f5@2 e5 f5 e5 [d5,e5] ~@9", I: "~@24 c#5!4 ~ c#5@2 ~",
  J: "~@26 a5@2 ~@2 a5 ~", K: "a5@4 ~@2 a5 ~@3 a5 a5@5 ~@2 a5 ~@5 a5 ~@2 a5 g#5@2 ~@2",
})).s("gm_trumpet").gain(0.48)

// other · trumpet · soft notes
const trumpet_soft = note("<~@67 A ~@17 B@2 ~@4 C D E F ~@8>".pickRestart({
  A: "~@21 f#5 ~@10", B: "[~@30 g5 ~ e5@5 ~@27, ~@31 f#5@2 ~@31]/2", C: "~@10 b5 ~@21",
  D: "~@12 f#5 ~@3 e5@5 ~@2 d5 ~@3 c#5@2 d5@2 ~", E: "b4 ~@15", F: "~@23 d5@2 ~@7",
})).s("gm_trumpet").gain(0.24)

// other · alto sax
const alto_sax = note(`<
  ~@2 A ~@3 A ~@19 A ~@3 A ~@19 A ~@3 A ~@3 A ~@3 A ~@15 A ~@3 A ~@3 A ~@3 A ~@3 B ~@3 A ~@4
>`.pickRestart({
  A: "~@16 b3 ~@3 a3 ~@3 b3 ~ d4@2 ~@4", B: "~@24 b3 ~ d4@2 ~@4",
})).s("gm_alto_sax").gain(0.45).pan(0.3)

// chords · overdriven guitar · Asus4 A5 Bm
const overdriven_guitar = note("<~@66 [[a3,d4,e4]@16 d4@3 ~ c#4@11 ~, ~ [a3,e4]] [[f#3,b3,d4]@5 ~@3] ~@35>")
  .s("gm_overdriven_guitar").gain(0.35).pan(0.7)

// other · pad new age
const pad_new_age = note("<~@65 [b5 ~@3 f#5 ~ a5 ~@9]!4 ~@34>").s("gm_pad_new_age").gain(0.4)

// other · vibraphone
const vibraphone = note(`<
  ~@23 A B C ~ D ~ E ~ F ~@15 A B C ~ D ~ E ~ F ~ C ~ D ~ E ~ F G ~@10 A B C ~ D ~ E ~ F ~ C ~ D ~ E ~ F ~ C ~ D ~ E ~ F
  ~@3
>`.pickRestart({
  A: "~@6 b3 ~ d4 ~ e4 ~ e4 ~ e4 f4", B: "e4@4 f#4@3 ~", C: "f#4 ~ e4 ~ d4 ~ b3 ~ d4 ~ d4 f#4 ~@4",
  D: "f#4!2 e4 ~ d4 ~ b3 ~ d4 ~ d4 b3 ~@4", E: "f#4 ~ e4 ~ d4!2 b3 ~ d4 ~ d4 f#4 ~@4",
  F: "f#4!2 e4 ~ d4 ~ b3!2 d4 ~ d4 b3 ~@4", G: "~@2 f#4 ~@2 g4 a4 ~ f#4 e4@2 ~@5",
})).s("gm_vibraphone").gain(0.7)

// drums · kick
const kick = s("bd").struct("<~ A B A B A B A B A@92 C ~>".pickRestart({
  A: "x ~@2 x ~@2 x ~@3 x ~@5", B: "x ~@2 x ~ x ~@2", C: "x",
})).gain(0.45)

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

// drums · mid tom
const mid_tom = s("mt").struct("<~ [~@3 x]!100 ~@2>").gain(0.3)

// drums · crash
const crash = s("cr").struct(`<
  ~ A ~@3 A ~@3 A ~@6 B A ~@7 A ~@3 A ~@2 C ~@7 B A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 D E F B A ~@7 A ~@3 A ~@3 A ~@3 A ~@2 G
  A ~@3 A ~@3 A ~
>`.pickRestart({
  A: "x", B: "~@24 x!8", C: "~@15 x", D: "x!2 ~ x ~@3 x", E: "~ x ~ x ~@3 x", F: "~ x ~@5 x", G: "~@7 x",
})).gain(0.45)

// drums · tambourine
const tambourine = s("tb").struct("<~ [x!8]!100 ~@2>").gain(0.35)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~ [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x]!99 [~ x ~ x ~ x ~ x ~ x ~ x ~ x ~@2] ~@2>")
  .gain(0.1)

// drums · bongos
const bongos = s("bongo:4").struct("<~@68 [~@2 x ~ x ~ x ~ x ~ x!3 ~ x!3 ~ x!3 ~ x ~ x ~@3 x ~ x ~] ~@34>").gain(1.17)

// drums · congas
const congas = s("conga:18").struct("<~ [~ x ~@6]!100 ~@2>").gain(1.43)

// drums · congas
const congas_2 = s("conga:33").struct("<~@65 [~@8 x ~@2 x!2 ~@3]!2 [~@6 x ~ x ~@2 x!2 ~@3] ~@35>").gain(1.43)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [x!2 ~@2 x!2 ~ x]!100 ~@2>").gain(1.76)

// drums · claves
const claves = s("clave:2").struct("<~ [~@3 x!2 ~@2 x!2 ~@6 x ~@15 x]!99 [~@3 x!2 ~@2 x!2 ~@6 x ~@16] ~@2>").gain(1.46)
// … 6 more lines