Strudelify

There's No Place Like Hawaii

Kalua Beach Boys

KeyD minorTempo120 bpm
0:00/0:00
// There's No Place Like Hawaii — Kalua Beach Boys
// 120 bpm, 4/4, key D minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: duplicate parts dropped: ch 3 "Alto Sax" alto sax (copy of ch 4 "Trumpet" trumpet); ch 6 "Acoustic Bass" acoustic bass (copy of ch 2 "Baritone Sax" baritone sax)
// note: Full arrangement: all 70 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(120/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 · trumpet
const trumpet = note(`<
  ~@3 A B C D C D C E F@2 G H G I J A B C D C D C E K@2 L@2 M@2 N O P Q N O P Q A B C D C D C E F@2 G H G I J R C R C R
  C ~@9
>`.pickRestart({
  A: "~@4 [f4,a4] [e4,g4] [d4,f4] [e4,g4]", B: "[f4,a4] ~ [f4,c5] [g4,e5]", C: "[a4,c5,f5]",
  D: "~@3 c5 [f4,c5]@2 [g4,e5]@2", E: "~@3 d5 [f4,a4,d5]@2 [bb4,f5]@2",
  F: "[[g4,c5,e5]@24 [e4,c5]@3 [f4,d5]@2 [g4,e5]@3]/2", G: "e5@14 f5 e5, [a4,c5]",
  H: "[f4,bb4,d5]@8 [e4,c5]@3 [f4,d5]@2 [g4,e5]@3", I: "d5@3 d5 c5@2 c5@2, [f4,bb4] [d4,g4]", J: "a4 c5@7, [d4,f4]",
  K: "[[g4,c5,e5]@6 d5 e5, ~@3 [g4,c5]]/2", L: "[[bb4,d5,f5]@12 f5 d5@2 f5, ~@3 bb4]/2",
  M: "[d5@6 e5 d5 c5@24, [e4,g4]]/2", N: "~@2 d5 e5 f5@2 g5 f5, ~ [f4,a4] [a4,d5]@2", O: "e5 d5@7, [g4,b4]",
  P: "~@2 f5!2 [f5,a5,c6]@2 a5 g5, ~ [a4,c5] ~@2", Q: "[db5,e5,a5]", R: "~@2 [f4,c5] [g4,e5]",
})).s("gm_trumpet").gain(0.52).pan(0.4)

// chords · trumpet · soft notes
const trumpet_soft = note("<~@61 A B A B A B A B A>".pickRestart({
  A: "~@2 [f4,c5] [g4,e5]", B: "[a4,c5,f5]",
})).s("gm_trumpet").gain(0.2).pan(0.4)

// chords · tenor sax
const tenor_sax = note(`<
  ~@3 A B C D C D C E F@2 G H G I J A B C D C D C E K@2 L@2 M@2 N O P Q N O P Q A B C D C D C E F@2 G H G I J R C R C R
  C ~@9
>`.pickRestart({
  A: "~@4 [f3,a3] [e3,g3] [d3,f3] [e3,g3]", B: "[f3,a3] ~ [f3,c4] [g3,e4]", C: "[a3,c4,f4]",
  D: "~@3 c4 [f3,c4]@2 [g3,e4]@2", E: "~@3 d4 [f3,a3,d4]@2 [bb3,f4]@2",
  F: "[[g3,c4,e4]@24 [e3,c4]@3 [f3,d4]@2 [g3,e4]@3]/2", G: "e4@14 f4 e4, [a3,c4]",
  H: "[f3,bb3,d4]@8 [e3,c4]@3 [f3,d4]@2 [g3,e4]@3", I: "d4@3 d4 c4@2 c4@2, [f3,bb3] [d3,g3]", J: "a3 c4@7, [d3,f3]",
  K: "[[g3,c4,e4]@6 d4 e4, ~@3 [g3,c4]]/2", L: "[[bb3,d4,f4]@12 f4 d4@2 f4, ~@3 bb3]/2",
  M: "[d4@6 e4 d4 c4@24, [e3,g3]]/2", N: "~@2 d4 e4 f4@2 g4 f4, ~ [f3,a3] [a3,d4]@2", O: "e4 d4@7, [g3,b3]",
  P: "~@2 f4!2 [f4,a4,c5]@2 a4 g4, ~ [a3,c4] ~@2", Q: "[db4,e4,a4]", R: "~@2 [f3,c4] [g3,e4]",
})).s("gm_tenor_sax").gain(0.4).pan(0.2)

// chords · tenor sax · soft notes
const tenor_sax_soft = note("<~@61 A B A B A B A B A>".pickRestart({
  A: "~@2 [f3,c4] [g3,e4]", B: "[a3,c4,f4]",
})).s("gm_tenor_sax").gain(0.15).pan(0.2)

// chords · trombone
const trombone = note(`<
  ~@3 A B C D C D C E F@2 G H I J K L B C D C D C M N@2 O@2 P@2 Q R S T Q R S T L B C D C D C E F@2 G H I J K U V W V W
  V ~@9
>`.pickRestart({
  A: "~@4 [f4,a4] [e4,g4] [d4,f4] [e4,g4]", B: "[f4,a4] ~ [f4,c5] [g4,e5]", C: "f3@2 ~ f3 f3@4, [a4,c5,f5]",
  D: "bb3@2 ~ [bb3,c5] [bb3,f4,c5]@2 [g4,e5]@2", E: "d4@3 [d4,d5] [f4,a4,d5]@2 [bb4,f5]@2, ~ d4",
  F: "[c4@6 c4@2 c4@8 c4@8 [a3,e4,c5]@3 [bb3,f4,d5]@2 [c4,g4,e5]@3, [g4,c5,e5]@3 ~]/2", // Am Bb C
  G: "a3@6 a3@2 ~@6 f5 e5, [a4,c5], e5@7 ~, ~ a3", H: "bb3@6 bb3@2 [e4,c5]@3 [f4,d5]@2 [g4,e5]@3, [f4,bb4,d5] bb3",
  I: "f3@6 f3@2 ~@6 f5 e5, [a4,c5], e5@7 ~, ~ f3", J: "[bb3,d5]@3 [bb3,d5] c5@2 c5@2, [f4,bb4] [g3,d4,g4]",
  K: "a4 ~@2 d3 d3@4, [d4,f4], d3@3 ~@5, ~ c5@7", L: "d3 ~@7 [f4,a4]@2 [e4,g4]@2 [d4,f4]@2 [e4,g4]@2",
  M: "d4@2 ~ [d4,d5] [d4,f4,a4,d5]@2 [bb4,f5]@2", N: "[c4@3 c4 c4@4 c4@3 c4 d5@2 e5@2, [g4,c5,e5]@3 [c4,g4,c5]]/2",
  O: "[bb3@3 bb3 bb3@4 bb3@3 bb3 f5 d5@2 f5, [bb4,d5,f5]@3 [bb3,bb4]]/2", // Bb
  P: "[[c4,d5]@6 e5 d5 c4@8 c4@6 c4@2 g3@4 e3@4, [e4,g4], ~@3 c4 c5@12]/2", // Csus2 Em
  Q: "~@2 d5 [d3,e5] f5@2 g5 f5, d3@3 ~ [d3,a4,d5]@4, ~ [f4,a4] ~@2", R: "e5 ~@2 g3 g3@4, [g4,b4], g3@3 ~@5, ~ d5@7",
  S: "~@2 f5 [f3,f5] [f5,a5,c6]@2 a5 g5, f3@3 ~ f3@4, ~ [a4,c5] ~@2", T: "a3@3 a3 a3@4, [db5,e5,a5]",
  U: "d3 ~@7 [f4,c5]@4 [g4,e5]@4", V: "f3@3 f3 f3@4, [a4,c5,f5]", W: "bb3@3 bb3 [f4,c5]@2 [g4,e5]@2, ~ bb3",
})).s("gm_trombone").gain(0.39).pan(0)

// chords · trombone · soft notes
const trombone_soft = note("<~@61 A B A B A B A B A>".pickRestart({
  A: "bb3@3 bb3 [f4,c5]@2 [g4,e5]@2, ~ bb3", B: "f3@3 f3 f3@4, [a4,c5,f5]",
})).s("gm_trombone").gain(0.15).pan(0)

// chords · piano · "Grand Piano"
const piano = note(`<
  A B A C ~ D E D E D E F@2 G H G H I J ~ D E K E K L M@2 N@2 O@2 P Q R S P Q R S J ~ D E D E D E F@2 G H G H I T D U D
  U D ~@9
>`.pickRestart({
  A: "~ e5@11 f5@2 e5@2, [a4,c5]@11 ~@5", B: "~ d5@15, [f4,bb4]", C: "[f4,bb4,d5] ~@15", D: "[a4,c5,f5]",
  E: "[d4,f4] ~", F: "[[g4,c5,e5]@3 ~]/2", G: "[a4,c5]", H: "[f4,bb4,d5] ~", I: "[d4,f4,a4]", J: "[f4,a4,d5] ~@15",
  K: "[f4,a4,c5,f5]", L: "[f4,a4] ~", M: "[g4,c5,e5]/2", N: "[bb4,d5,f5]/2", O: "[e4,g4,c5]/2",
  P: "~ [f4,a4] [a4,d5]@2", Q: "[g4,b4]", R: "~ [a4,c5] [f4,a4,c5] ~", S: "[a4,db5,e5]",
  T: "[d4,f4,bb4] ~@7 [f4,c5]@4 [g4,e5]@4", U: "[d4,f4]@2 [f4,c5] [g4,e5]",
})).s("gm_piano").gain(0.64).pan(0.8)

// chords · piano · "Grand Piano" · soft notes
const piano_soft = note("<~@61 A B A B A B A B A>".pickRestart({
  A: "[d4,f4]@2 [f4,c5] [g4,e5]", B: "[a4,c5,f5]",
})).s("gm_piano").gain(0.24).pan(0.8)

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

// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@61 A B A B A B A B A>".pickRestart({
  A: "x ~@2 x!2 ~ x ~", B: "x ~@2 x!2 ~@3",
})).gain(0.13)

// drums · rim
const rim = s("rim").struct("<[~@3 x]!2 ~@3 [~@3 x]!7 ~ [~@3 x] ~@56>").gain(0.36)

// drums · snare
const snare = s("sd").struct(`<
  ~@2 A B ~@11 C@2 A B ~ C@11 D C A@3 C A@3 B ~ C@7 ~ C ~ C@2 A B C A C A C ~@9
>`.pickRestart({
  A: "~@6 x!2", B: "x", C: "~@3 x", D: "~@2 x!2",
})).gain(0.36)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@61 A B A B A B A B@2>".pickRestart({
  A: "~@6 x!2", B: "~@3 x",
})).gain(0.09)

// drums · hihat
const hihat = s("hh").struct("<~@20 [x!6 ~ x]!11 [x!6 ~@2] ~@38>").gain(0.36)

// drums · mid tom
const mid_tom = s("mt").struct("<~@31 [~@14 x!2] ~@38>").gain(0.36)

// drums · high tom
const high_tom = s("ht").struct("<~@31 [~@12 x!2 ~@2] ~@38>").gain(0.36)

// drums · crash
const crash = s("cr").struct("<~@3 A ~@8 B A B A ~@2 A ~@13 A ~ A@3 ~ A@3 ~@8 B A B A ~@2 A ~@14>".pickRestart({
  A: "x", B: "~@8 x ~@2 x ~ x ~@2",
})).gain(0.36)

// drums · ride
const ride = s("rd").struct("<~@32 [~ x!5 ~ x] [x!8] [~ x!7]!2 [~ x!5 ~ x] [x!8] [~ x!7]!2 ~@30>").gain(0.36)

// drums · tambourine
const tambourine = s("tb").struct("<~@42 [x!8]!13 x ~@14>").gain(0.36)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@3 A ~@14 A ~@13 A ~@3 A ~@18 A ~@14>".pickRestart({
  A: "x",
})).gain(4.21)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@5 [~ x ~ x]!7 [~ x ~@2] [~ x ~ x]!5 ~@38 [~ x ~ x]!5 [~ x ~@2] ~@8>").gain(1.59)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct("<~@61 [~@3 x] [~ x ~ x]!8>").gain(0.45)

// drums · shaker
const shaker = s("sh").struct("<~@5 [x!8]!7 [x!4 ~@4] [x!8]!5 ~@38 [x!8]!5 [x!3 ~@5] ~@8>").gain(0.36)

// drums · shaker · soft notes
const shaker_soft = s("sh").struct("<~@61 [~@3 x!5] [x!8]!7 [x!7 ~]>").gain(0.13)

stack(
  trumpet, trumpet_soft, tenor_sax, tenor_sax_soft, trombone, trombone_soft, piano, piano_soft, kick, kick_soft, rim,
  snare, snare_soft, hihat, mid_tom, high_tom, crash, ride, tambourine, vibraslap, cabasa, cabasa_soft, shaker,
  shaker_soft
)