Strudelify
KeyE minorTempo160 bpm
0:00/0:00
// Bossa Boys — Luke Cain and Max Reich
// 160 bpm, 4/4, key E minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/2345181; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 108 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(160/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.

// chords · piano
const piano = note(`<
  A@2 B C D@2 B C A@2 E C ~@27 F ~@6 G@2 H@2 I J K@2 L@2 M@2 I J N@2 O@2 P Q O@2 R@2 S@2 T@2 O@2 R@2 O@2 U@2 V@2 W@2 V@2
  X@2 Y Z AA AB AC Z AD@2 AE@2 AD@2 AF AG AH@4
>`.pickRestart({
  A: "[[e2,e3,g3,b3,d4,f#4]@15 ~]/2", B: "[c2,c3,e3,g3,a3,c4]@15 ~", C: "[b1,b2,e3,g3,b3] [b1,d#3,f#3,a3]",
  D: "[[e2,e3,g3,b3,d4]@15 ~]/2", E: "[c2,c3,e3,g3,a3]@15 ~",
  F: "[e4,g4,b4,d5,f#5] ~ [e4,g4,b4,d5,f#5] ~ [e4,g4,b4,d5,f#5] ~ [e4,g4,b4,d5,f#5] ~ [e4,g4,b4,d5,f#5] ~ [e4,g4,b4,d5,f#5] ~ [e4,g4,b4,d5,f#5]@3 ~", // Em7
  G: "[[e3,g3,b3,d4,g4]@8 ~@2 [e3,g3,b3,d4,g4]@2 b2@2 [e3,g3,b3,d4,g4]@9 ~@3 a2@2 c3@2 d3@2, ~@13 [e3,g3,b3,d4,g4]@2 ~]/2", // Em7
  H: "[[c3,a#3,e4,a4]@8 ~@2 [c3,a#3,e4,a4]@2 b2@2 [a#3,e4,a4]@4 ~@2 [c3,a#3,e4,a4]@4 ~@2 [c3,a#3,e4,a4]@2 c3@2 b2 a2, ~@7 c3@3 g3 ~@5]/2", // Am A Am
  I: "[b1,b2,a3,b3,d#4,f#4,g4]@11 ~ b1@2 a#1@2, ~@3 [b2,a3,b3,d#4,f#4,g4]", // B7
  J: "[b1,b2,a3,b3,d#4,f#4,g4]@3 c2 [b1,b2,a3,b3,d#4,f#4]@4", // B7
  K: "[[e3,g3,b3,d4,g4]@8 ~@2 [e3,g3,b3,d4,g4]@2 b2@2 [e3,g3,b3,d4,g4]@9 ~ a2@2 b2@2 c3@2 d3@2, ~@13 [e3,g3,b3,d4,g4]@2 ~]/2", // Em7
  L: "[[e3,g3,b3,d4,g4]@8 ~@2 [e3,g3,b3,d4,g4]@2 d3@2 [e3,g3,b3,d4,g4]@9 ~@3 [a2,a3]@2 [c3,c4]@2 [b2,b3]@2, ~@13 [e3,g3,b3,d4,g4]@2 ~]/2", // Em7 A C B Em7
  M: "[[c3,a#3,c4,e4,a4]@8 ~@2 [c3,a#3,e4,a4]@2 b2@2 [a#3,e4,a4]@4 ~@2 [c3,a#3,e4,a4]@4 ~@2 [c3,a#3,e4,a4]@2 c3@2 b2 a2, ~@7 c3@3 g3 ~@5]/2", // Am A Am
  N: "[[e3,g3,b3,d4,g4]@8 ~@2 [e3,g3,b3,d4,g4]@2 b2@2 [e3,g3,b3,d4,g4]@9 ~ e4@2 ~@2 c4@2 b3@2, ~@13 [e3,g3,b3,d4,g4]@2 ~]/2", // Em7
  O: "[[e3,g3,d4,f#4]@2 ~ [e3,g3,d4,f#4]@2 ~ [e3,g3,d4,f#4]@4 ~@6]/2", // Em7
  P: "[a2,g3,c4,e4]@2 ~ [a2,g3,c4,e4]@2 ~ [d3,g3,c4,e4]@2", Q: "[d3,f#3,c#4,e4]@11 ~@5",
  R: "[[a2,g3,c4,e4]@4 ~@2 [a2,g3,c4,e4]@4 ~@2 [g3,c4]@4 [f#3,c#4]@11 ~@5, ~@12 [d3,e4]@15 ~@5]/2", // Am7 C5 F#5 Dsus2
  S: "[[g3,b3,d4,f#4]!2 e3 [g3,b3,d4,f#4]@2 e3 [g3,d4,f#4]@4 ~@2 e3 d3 c3 b2, ~@3 b3 ~@4]/2", // Gmaj7
  T: "[a2@2 a2@2 ~@2 [a2,g3,c4,e4]@4 a2@2 [g3,c4]@4 [f#3,c#4]@11 ~@5, [g3,c4,e4]@4 ~@8 [d3,e4]@15 ~@5]/2", // Am7 C5 F#5 C Dsus2
  U: "[[a2,g3,c4,e4]@4 ~@2 [a2,g3,c4,e4]@4 ~@6 [f#3,c#4]@11 ~@5, ~@12 [d3,e4]@15 ~@5, ~@3 [g3,c4]@2 ~@3]/2", // Am7 F#5 Dsus2 C5
  V: "[[e3,d4,f#4]@2 ~ [e3,g3,d4,f#4]@2 ~ [e3,g3,d4,f#4]@4 ~@6]/2", // D Em7
  W: "[[a2,g3,e4]@4 ~@2 [a2,g3,c4,e4]@4 ~@6 [f#3,c#4]@11 ~@5, ~@12 [d3,e4]@15 ~@5, ~@3 [g3,c4]@2 ~@3]/2", // A7 Am7 F#5 Dsus2 C5
  X: "[[a2,g3,e4]@4 ~@2 [a2,g3,c4,e4]@4 ~@6 [f#3,c#4]@11 ~@5, ~@12 [d3,e4]@15 ~@5, ~@12 [g3,c4]@7 ~@13]/2", // A7 Am7 F#5 Dsus2 C5
  Y: "[e3,d4,f#4]@2 ~@2 [e3,g3,d4,f#4]@2 b2@2 b2@2 [e3,g3,d4,f#4]@3 ~@3", // D Em7
  Z: "[e3,g3,d4,f#4]@3 ~ [e3,g3,d4,f#4]@2 b2@2 b2@2 [e3,g3,d4,f#4]@3 ~@3", // Em7
  AA: "[a2,g3,e4]@3 ~ [a2,g3,c4,e4]@2 g3@2 [a2,g3,c4,e4]@2 [a2,g3,c4,e4]@2 ~@2 [d3,f#3,c4,e4]@2", // A7 Am7 D7
  AB: "[d3,f#3,c4,e4] ~ [d3,f#3,c4,e4] ~ [d3,f#3,c4,e4]!2 ~@2", // D7
  AC: "[e3,g3,d4,f#4]@2 ~@2 [e3,g3,d4,f#4]@2 b2@2 b2@2 [e3,g3,d4,f#4]@3 ~@3", // Em7
  AD: "[[a2,g3,c4,e4]@3 ~ [a2,g3,c4,e4]@2 g3@2 [a2,g3,c4,e4]@2 [a2,g3,c4,e4]@2 ~@2 [d3,f#3,c4,e4]@4 ~@2 [d3,f#3,c4,e4]@2 ~@2 [d3,f#3,c4,e4]@2 [d3,f#3,c4,e4]@2 ~@4]/2", // Am7 D7
  AE: "[[g2,f3,b3,e4] ~ [g2,f3,b3,e4] ~ [g2,f3,b3,e4]!2 ~ [c3,e3,a#3,d4]@2 ~ [c3,e3,a#3,d4] ~ [c3,e3,a#3,d4]!2 ~@2]/2", // Em C7
  AF: "[g2,f3,b3,e4] ~ [g2,f3,b3,e4] ~ [g2,f3,b3,e4]!2 ~ [c3,e3,a#3,d4]", // Em C7
  AG: "[c3,e3,a#3,d4] ~ [c3,e3,a#3,d4] ~ [c3,e3,a#3,d4]!2 ~@2", // C7
  AH: "[[b2,d#3,a3,d4]@4 ~@2 [b2,d#3,a3,d4]@4 ~@2 [b2,d#3,a3,d4]@11 ~@9]/2", // B7
})).s("gm_piano").gain(0.46)

// chords · piano · soft notes
const piano_soft = note("<~@12 A@2 B C D@2 E F D@2 E G ~@8 H@2 I@5 J K@2 L@2 M N ~@62>".pickRestart({
  A: "[[e2,g3,b3,d4,f#4]@15 ~]/2", B: "[c2,g3,a3,c4,e4]@15 ~", C: "[b1,b2,g3,b3,e4] [b1,b2,f#3,a3,d#4]",
  D: "[e3,g3,b3,d4,f#4]!2 ~@6", E: "[c3,g3,a3,c4,e4]!2 ~@6", F: "[b2,a3,d#4,g4]@2 ~ b2 [b2,f#3,a3,d#4,f#4]@2 ~@2",
  G: "[b2,a3,d#4,g4] [b2,f#3,a3,d#4,f#4]", H: "[[e2,e3]@15 ~]/2",
  I: "[~@16 g4@15 ~ [e4,g4,b4,d5]@4 [e4,g4,b4,d5]@4, [e2,e3]@33 ~@7, e4@61 ~@19]/5", J: "~@7 [e2,e3]", K: "[e2,e3]!8",
  L: "[e2,e3,e4,g4]!8", M: "[e2,e3,e4,g4,b4]!8",
  N: "[e2,e3,e4,g4,b4,d5]@3 [e2,e3,e4,g4,b4,d5]@2 [e2,e3,e4,g4,b4,d5]@3 [e4,g4,b4,d5,e5]@4 ~@4", // Em7
})).s("gm_piano").gain(0.2)

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

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@12 A@3 B C@4 A@3 D E@3 F E F@3 E F E F E F@2 G E@5 H I ~@61>".pickRestart({
  A: "x!2 ~@6", B: "x!2 ~@2 x!2 ~@2", C: "x!2 ~ x ~@4", D: "x!5 ~@3", E: "x!4", F: "x ~ x ~ x ~ x!2",
  G: "x ~ x ~ x ~@2 x", H: "x ~@2 x ~ x ~@10", I: "x",
})).gain(0.24)

// drums · snare
const snare = s("sd").struct("<~@45 A B@7 C B@6 D E ~@6 F G H@7 I H@10 A J K@12 L M N ~ O P>".pickRestart({
  A: "~@2 x!2", B: "~ x ~@2", C: "~ x!2 ~@2 x!3", D: "~@4 x ~ x ~ x ~ x ~ x ~ x!2", E: "~ x!3 ~ x!3 ~ x!3 ~@4",
  F: "~@12 x!4", G: "x!3 ~ x ~@3", H: "~ x", I: "~@8 x ~@3 x!2 ~@2", J: "~@4 x ~ x!2", K: "~ x ~ x",
  L: "x ~ x ~ x!2 ~ x", M: "x ~@3 x ~@3 x ~@3 x!4", N: "x ~@11 x!2 ~@2", O: "x ~@5 x!3 ~@2 x ~ x ~@2", P: "x",
})).gain(0.35)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@16 A@3 B ~@3 C ~@15 D ~@4 E F ~@62>".pickRestart({
  A: "~ x", B: "~@4 x!4", C: "~@6 x ~ x!8", D: "~@7 x", E: "x!4", F: "x ~@2 x ~ x ~@10",
})).gain(0.24)

// drums · low tom
const low_tom = s("lt").struct("<~@23 [~ x!2 ~@5] ~@45 [~@6 x!2] ~@18 x ~@19>").gain(0.35)

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

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@8 A@3 B@5 C@2 D@2 E@3 ~@4 F G H@3 G H G H G H@2 I D@2 J@3 K ~@62>".pickRestart({
  A: "x", B: "x!2", C: "x!4", D: "x!8", E: "x!2 ~@6", F: "~@7 x", G: "x!2 ~ x!2 ~ x!2", H: "~ x!2 ~ x!2 ~ x",
  I: "~ x!2 ~ x ~ x!2", J: "x!16", K: "x ~@2 x ~ x ~@10",
})).gain(0.24)

// drums · mid tom
const mid_tom = s("mt").struct("<~@104 [~@8 x!2 ~ x ~@4] ~ [~@5 x ~@10] ~>").gain(0.35)

// drums · open hat
const open_hat = s("oh").struct("<~@58 A ~@12 B ~@3 B ~ A ~ B ~@3 B ~@3 B ~@12 A C ~@6>".pickRestart({
  A: "~@7 x", B: "~@3 x", C: "x",
})).gain(0.35)

// drums · crash
const crash = s("cr").struct("<~@23 A ~@22 A ~@3 B C A C ~@7 D A ~@7 A ~@3 A ~@7 A ~@7 A ~ A ~@11 A@4>".pickRestart({
  A: "x", B: "x ~@4 x ~ x", C: "~ x", D: "x ~ x ~ x ~ x!2",
})).gain(0.35)

// drums · high tom
const high_tom = s("ht").struct("<~@104 [~@4 x!2 ~ x ~@8] ~ [~ x ~@2] ~>").gain(0.35)

// drums · ride
const ride = s("rd").struct("<~@46 A B@3 C B@2 C D@4 B@2 C ~@47>".pickRestart({
  A: "~@2 x ~@2 x!2 ~", B: "~ x!2 ~@2 x!2 ~", C: "~ x!2 ~@5", D: "~ x!2 ~@2 x!3",
})).gain(0.35)

// drums · ride · soft notes
const ride_soft = s("rd").struct("<~@3 [~@12 x!3 ~] x ~@41 [~ x ~@6] ~@61>").gain(0.24)

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

// drums · cowbell
const cowbell = s("cb").struct("<~@46 A B@3 C D A E F@5 ~@49>".pickRestart({
  A: "~@3 x!2 ~@2 x", B: "x ~@2 x!2 ~@2 x", C: "~@3 x!2 ~@3", D: "x ~@2 x ~@3 x", E: "x ~@2 x ~@4", F: "~@3 x ~@4",
})).gain(0.35)

stack(
  piano, piano_soft, bass, kick, kick_soft, snare, snare_soft, low_tom, hihat, hihat_soft, mid_tom, open_hat, crash,
  high_tom, ride, ride_soft, tambourine, cowbell
)