Strudelify

The Happy Organ

Dave "Baby" Cortez

KeyC majorTempo184 bpm
0:00/0:00
// The Happy Organ — Dave "Baby" Cortez
// 184 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: sustain pedal (CC 64) lengthens the held notes
// note: Full arrangement: all 96 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(184/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 E@11 ~@8 E@8 ~@8 E@8 ~@8 F@4 G@2 F@2 H G F@2 E@8 ~@8 E@11 I>".pickRestart({
  A: "[[g2,g3,g4,d5,g5]!3 [g2,g3,d5] [g2,g3,b4,d5,b5]!3 [g2,g3,d5] [g2,g3,d5,g5,d6]!3 [g2,g3] [g2,g3,f5,b5,f6]!3 [g3,b5,f6], ~@3 g4@13, ~@3 g5@5 ~@3 [d5,g5,d6]@5, ~@14 b4@17 ~, ~@14 b5@10 ~@6 [g2,f5] ~]/2", // G5 G G5 G G7 G5 G7
  B: "[g2,g3,a5,d6,a6]!8", // Gsus2
  C: "[g2,g3,g5,d6,g6]@2 [g2,g3,g5,g6] ~ [f2,f3,f5,c6,f6]@2 [f2,f3,f5,c6,f6] ~ [e2,e3,e5,b5,e6]@2 [e2,e3,e5,b5,e6] ~ [d2,d3,d5,a5,d6]@2 [d2,d3,d5,a5,d6] ~, ~ d6 ~@6", // G5 G F5 E5 D5
  D: "[c2,c3,g5,c6]@2 [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~, c5 ~@15", // C5 C
  E: "[c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~", // C
  F: "[e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~ [e5,g5,c6] ~", // C
  G: "[a5,c6,f6] ~ [a5,c6,f6] ~ [a5,c6,f6] ~ [a5,c6,f6] ~ [a5,c6,f6] ~ [a5,c6,f6] ~ [a5,c6,f6] ~ [a5,c6,f6] ~", // F
  H: "[b5,d6,g6] ~ [b5,d6,g6] ~ [b5,d6,g6] ~ [b5,d6,g6] ~ [b5,d6,g6] ~ [b5,d6,g6] ~ [b5,d6,g6] ~ [b5,d6,g6] ~", // G
  I: "[c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~ [c5,e5,g5] ~@7", // C
})).s("gm_piano").gain(0.29).pan(0.7)

// bass · acoustic bass
const bass = note(`<
  ~@3 A B C D C D C D C D C D E F G H I G J K@2 D C D C D C D E F G H I G J K@2 D C D C D C D E F G H I G J K@2 H I H L
  M N H I G J H I D C D C D C D E F G H I G J K@2 H I H I H I H I H I H O
>`.pickRestart({
  A: "g2@2 g2@2 f2@2 f2 ~ e2@2 e2 ~ d2@2 d2@2", B: "c2@3 ~@13", C: "~@3 g2", D: "c2 ~@3", E: "~@3 c2",
  F: "d2 f#2 a2 f#2", G: "g2 b1 d2 b1", H: "c2 e2 g2 a2", I: "c3 a2 g2 e2", J: "f2 a1 c2 a1", K: "c2 e2 g2 e2",
  L: "a#2 a2 g2 e2", M: "f2 c2 d#2 a1", N: "f1 a1 a#1 b1", O: "c3 a2 g2 ~",
})).s("gm_acoustic_bass").gain(0.38)

// chords · drawbar organ
const drawbar_organ = note(`<
  ~@4 A B A B C D E F G D E F H@2 I J K@2 I J L M L N L M L O H@2 I J K@2 I J P Q P Q R S T U H@2 I J K@2 I J ~@12 A B A
  B C D E F H@2 I J K@2 I J V@2 P W P W V@2 P W P W
>`.pickRestart({
  A: "~@6 [c5,f5,a5]@3 ~ [c5,f5,a5]@2 ~@2 [c5,f5,a5]@2", B: "[c5,e5,g5]@4 [c5,f5,a5]@3 ~@9", C: "~@2 c6 a5 g5@2 a5 c6",
  D: "~@2 c6@3 ~ a5@2 g5@4 a5@2 ~@2", E: "c6@2 ~@2 c6@2 a5@2 g5@3 ~ a5@2 e5@2", F: "~@2 e5@3 ~ d5@2 c5@3 ~@5",
  G: "c6 ~ c6 a5 g5@2 a5 c6",
  H: "[~ a5 ~ f#5 ~ a5 ~ f#5 ~ a5 ~ f#5 d6 a5@2 ~@2 d6 ~ b5 ~ d6 ~ b5 ~ d6@2 b5 ~ d6 ~ b5, d6@2 ~@2 d6@2 ~@2 d6@2 ~@5 f#5@2 ~@15, ~@8 g6 ~ g6 ~ g6 ~ g6 ~]/2",
  I: "[e5,g5,a5,c6]@2 ~@6 [e5,g5,c6] ~@3 e5 ~@3, ~@4 a5 ~@3", J: "[e5,g5,a5,c6] ~@3 e5 ~ [e5,g5,a5,c6]@5 ~@5",
  K: "[~ d6 ~ b5 ~ d6 ~ b5 ~ d6 ~ b5 g6 d6@2 ~@2 c6 ~ a5 ~ c6 ~ a5 ~ c6@2 a5 ~ c6 ~ a5, g6@2 ~@2 g6@2 ~@2 g6@2 ~@5 b5@2 ~@15, ~@8 f6 ~ f6 ~ f6 ~ f6 ~]/2",
  L: "~@6 c6@2 ~@2 c6@2 ~@2 a5 ~", M: "g5 ~ g5 ~ a5 ~@3 g5 ~@3 a5@2 ~@2", N: "g5 ~ g5 ~ e5@2 ~@2 d5@2 ~@2 c5@2 ~@2",
  O: "g5 ~ g5 ~ a5@2 ~@2 e5@2 ~@2 c5@2 ~@2", P: "~@6 [c5,f5,a5] ~@3 [c5,f5,a5] ~@3 [c5,f5,a5] ~",
  Q: "[e5,g5] ~@15, c5 ~@7", R: "c6@2 ~@2 c6@2 a5@2 g5@3 ~ a5@2 c6@2", S: "~@2 c6@2 ~@2 a5 ~ g5@2 ~@2 a5@2 ~@2",
  T: "c6@2 ~@2 c6@2 a5 ~ g5@3 ~ a5 ~ e5@2", U: "~ e5 ~ d5 c5 ~@3",
  V: "[~@6 [c5,f5,a5] ~@3 [c5,f5,a5] ~@3 [f5,a5] ~ [e5,g5]@4 [c5,f5,a5]@3 ~@9, ~@14 c5@5 ~@13]/2", // F Em F
  W: "[c5,e5,g5] [c5,f5,a5] ~@2", // C F
})).s("gm_drawbar_organ").gain(0.5)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@4 A@12 B C A@2 C D A@10 B C A@2 C D A@10 B C A@2 C D A@2 E F@2 G H I J K L M N O A@8 B C A@2 C D A@2 P Q R@2 S T U@4
  S V
>`.pickRestart({
  A: "[c4,e4]!6 [c4,e4,c5]!2, [g3,c5]!3 g3", B: "[d4,f#4]!6 [d4,f#4,a4]!2, [a3,a4]!3 a3",
  C: "[d4,g4]!6 [d4,g4,b4]!2, [g3,b4]!3 g3", D: "[c4,f4]!6 [c4,f4,a4]!2, [f3,a4]!3 f3",
  E: "~@3 d#5@5 [a#4,c5,d#5]@4 [a#4,c5,d#5]@4, ~@2 [a#4,c5]@5 ~@9", F: "[a#4,c5,d#5]!4",
  G: "[a#4,c5,d#5]@4 a#4@2 g4@2 f4@2 d#4@2 c4@2 d#4 ~", H: "g4@2 g4@2 f4 d#4 c4 d#4",
  I: "g4@4 g4@4 f4@2 d#4@2 c4@2 d#4 ~",
  J: "[g4,a#4,c5,e5]@2 [g4,a#4,c5,e5]@2 [g4,a#4,c5,e5]@2 ~@2 [g4,a#4,c5,e5]@3 ~@5", // C7
  K: "~@3 [f4,d#5], ~ [g4,a#4] f#4 ~, ~@3 e5@2 a4@2 ~", L: "d5 b4 g4 f4 d4 c4 b3 d4", M: "g4@2 g4@2 f4 d#4 c4 a#3",
  N: "c4 d#4 g4@2 f4 d#4 c4 a#3", O: "c4 a#3 g3@2 ~@4", P: "~@2 [g4,a#4,c5,e5]@5 ~ [a#4,c5,e5]@4 g4 ~@3, ~@8 g4@3 ~@5",
  Q: "[e4,g4,a#4,c5]@4 [e4,g4,a#4,c5]@4 [e4,g4,a#4,c5]@7 ~", // C7
  R: "[e4 ~@2 c5@3 e4 ~ [g4,a#4]@4 e4 ~@2 c5@2 ~ e4 ~ [g4,a#4,c5,e5]@4 ~@2 e4 ~ [g4,a#4,c5]@2 e4@2, ~@2 [e4,g4,a#4]@4 ~@2 [e4,c5]@3 ~@3 [e4,g4,a#4]@2 ~@8 [g4,a#4,c5,e5]@4 ~@4]/2", // Gm C7 Edim C Edim C7
  S: "~@2 e4@2 [g4,a#4]@3 ~ [g4,a#4]@3 ~@3 e4 ~, ~@8 e4@5 ~@3", // Gm
  T: "[e4,g4,a#4]@3 ~ e4 ~ e4@2 ~@2 e4 ~ [g4,a#4]@2 e4@2, ~@4 [g4,a#4]@4 ~@4 e4 ~@3", // Edim Gm
  U: "[~@2 [g4,a#4,c5]@3 ~ e4 ~ [g4,a#4,e5]@2 [e4,g4,a#4,c5]@4 ~ c5@2 ~ [e4,g4]@4 [e4,g4,a#4,c5]@2 ~@2 e4@2 ~@2 e4@4 ~ c5@3 e4 ~ [g4,a#4]@4 e4 ~@2 c5@2 ~ e4 ~ [g4,a#4,c5,e5]@4 ~@2 e4 ~ [g4,a#4,c5]@2 e4@2, ~@14 [e4,g4,a#4]@3 ~@11 [g4,a#4,c5,e5]@4 ~@2 [e4,g4,a#4]@4 ~@2 [e4,c5]@3 ~@3 [e4,g4,a#4]@2 ~@8 [g4,a#4,c5,e5]@4 ~@4]/4", // C7 Edim C7 Em C7 Gm C7 Edim …
  V: "[e4,g4,a#4]@3 ~ e4 ~ e4@2 ~@8, ~ [g4,a#4] ~@2", // Edim Gm
})).s("gm_electric_guitar_clean").gain(0.2).pan(0.4)

// drums · kick
const kick = s("bd").struct("<~@4 [x!2]!92>").gain(0.42)

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

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

// drums · open hat
const open_hat = s("oh").struct(`<
  ~@4 A B A@3 B A@5 C A@5 B A D A B A@5 C A@5 B A@3 B A@5 E A@5 B A C F@2 G@10 A B A@5 C A@5 B A@2 ~ A@11
>`.pickRestart({
  A: "x", B: "x!2", C: "~ x ~@2", D: "x ~@2 x", E: "~ x", F: "~ x ~ x", G: "x!4",
})).gain(0.26)

// drums · crash
const crash = s("cr").struct("<~@56 x ~@27 x ~@11>").gain(0.26)

stack(piano, bass, drawbar_organ, electric_guitar_clean, kick, snare, hihat, open_hat, crash)