Strudelify

Kisah Rumah Tangga

Tan Sri P. Ramlee

KeyC majorTempo120 bpm
0:00/0:00
// Kisah Rumah Tangga — Tan Sri P. Ramlee
// 120 bpm, 4/4, key C major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/5856213; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 48 bars on a 16-step grid, each part at one level. 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.
// 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 B C D E F G H I J K I@2 J K L M N O P M N O P I Q R P I Q R L S T U V W X Y Z AA AB L AC AD AE AF
>`.pickRestart({
  A: "[a3,c4]@2 c4 ~ f4 ~ c4@2, a4@15 ~, f4@8 ~@2 f4@5 ~, ~@3 c4@3 ~@2", // Am
  B: "[g3,c4]@2 c4 ~ e4 ~ c4@2, g4@15 ~, e4@8 ~@2 e4@5 ~, ~@3 c4@3 ~@2", // C5
  C: "[b3,d4]@2 d4 ~ f4 ~ d4@2, [g4,b4]@15 ~, f4@8 ~@2 f4@5 ~, ~@3 d4@3 ~@2", // Bm G
  D: "[c4,e4,g4]@3 [c4,e4]@2 [c4,e4]@3 [c4,e4]@3 [d4,f4]@2 [e4,g4]@3", // C Dm Em
  E: "[f4,a4]@2 ~ [e4,g4] [d4,f4]@2 [f4,a4]@2, c4@15 ~, ~ a4@2 ~, ~ f4 ~@2", // F Em Dm F
  F: "[e4,g4]@2 ~ [d4,f4] e4@2 [e4,g4]@2, c4@8 c4@7 ~, ~ g4@2 ~, ~ e4 ~@2", // Em Dm Em
  G: "[d4,f4]@2 ~ [c4,e4] [b3,d4]@2 [d4,f4]@2, [g4,b4]@15 ~, ~ f4@2 ~, ~ d4 ~@2", // Dm C Bm Dm G
  H: "[c4,e4,g4]@2 ~ [b3,e4] [b3,f4]@2 [b3,f4]@2", I: "[e4,g4]@3 g4@3 [g4,c5]@2, c4@15 ~, ~@6 e4@9 ~",
  J: "[d4,g4]@3 g4@3 [g4,b4]@2, f4@15 ~, b4@3 ~, ~@6 d4@9 ~", // G5 G
  K: "[b3,d4,f4]@3 ~@3 [g4,b4]@2, [g4,b4]@3 ~, ~@6 [d4,f4]@9 ~", // Bdim G Dm
  L: "[c4,e4,g4]@3 [c4,c5,e5]@2 [d4,b4,d5]@3 [e4,g4,c5]@3 [f4,a4]@2 [e4,g4]@3", // C G C F Em
  M: "[f4,a4,c5] [a4,c5] ~ [f4,a4,c5] [f4,a4,c5]@2 [f4,a4,c5]@2, c4@3 ~@5, ~ f4@2 ~@5", // F Am F
  N: "[c4,e4,g4] [c4,e4]@2 [c4,e4,g4] [c4,e4,g4]@2 [c4,e4,g4,c5]@2, ~ g4 ~@6", // C
  O: "[d4,g4,b4] [g4,b4] ~ [d4,g4,b4] [d4,g4,b4]@2 [d4,g4,b4]@2, f4@3 ~@5, ~ d4@2 ~@5", // G
  P: "[c4,e4,g4] [c4,e4]@2 [c4,e4,g4]!3 [c4,e4,g4]@2, ~ g4 ~@6", Q: "[c4,f4,a4]@3 a4@3 [a4,c5]@2, c5@3 ~, ~@6 f4@9 ~",
  R: "[d4,g4]@3 [d4,g4]@3 [g4,b4]@2, [f4,d5]@15 ~, b4@3 ~", S: "[c4,f4,a4,c5]@3 [f4,a4,c5]@3 ~ b4, ~@3 [f4,a4,c5]",
  T: "~ b4 a4 [g4,a4] ~ g4 a4!2, [f4,c5]@3 [f4,c5]@3 [f4,c5]@2, a4 ~ a4 ~", // Gsus2 F5
  U: "[c4,e4,g4]@3 [c4,e4,g4]@3 c5 d5, ~@3 [c4,e4,g4]", // C
  V: "e5 d5 c5 b4 c5 b4 [g4,a4] g4, [c4,e4,g4]@3 [c4,e4,g4]@3 [c4,e4]@2", // Gsus2 C
  W: "[c4,f4,a4,c5]@3 [f4,a4,c5]@3 [f4,a4,c5]@2", // F
  X: "[d4,g4,b4,d5]@3 [d4,g4] [d4,g4]@2 [g4,b4,d5]@2, ~@3 [b4,d5]@3 ~@2", // G G5 G Bm
  Y: "[c4,e4,g4,c5] [c4,e4,g4] [e4,c5] [c4,e4,g4] c4 [c4,c5] [d4,e4,d5] [e4,e5], ~@3 c5@2 ~@3, ~@2 [e4,g4] [c4,g4]", // C Dsus2 E Em C5
  Z: "[f4,f5]@2 [f4,f5] [e4,e5] [d4,d5]@2 [f4,a4,c5,f5]@2, [a4,c5]@3 [f4,a4,c5]@3 ~@2", // F E D F Am F
  AA: "[e4,e5]@2 [e4,e5] [c4,d4,d5] [c4,c5]@2 [c4,e4,g4,e5]@2, [c4,g4]@3 [e4,g4]@3 ~@2", // E Csus2 C C5 Em
  AB: "[d4,d5]@2 [d4,d5] [c4,b4,c5] [b3,b4]@2 [d4,g4,b4,d5]@2, [g4,b4]@3 [g4,d5]@3 ~@2", // D Cmaj7 B G G5
  AC: "[f4,a4]@2 [f4,a4] [e4,f4,g4] [d4,f4]@2 [f4,a4,c5]@2, c5@3 [a4,c5]@3 ~@2", // F Em Dm F Am
  AD: "[e4,g4]@2 [e4,g4] [c4,d4,e4,f4] [c4,e4]@2 [c4,e4,g4]@2, c4@3 g4@3 ~@2", // Em Dm7 C
  AE: "[d4,f4]@2 [d4,f4] [c4,e4] [b3,d4]@2 [d4,f4,g4,b4,d5]@2, [g4,b4,d5]@3 [g4,b4,d5]@3 ~@2", // Dm C Bm G7 G
  AF: "[c4,e4,g4]@2 ~ [g3,d4,g4,b4] [c4,e4,g4] ~@3", // C G C
})).s("gm_piano").gain(0.3)

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

// drums · congas
const congas_2 = s("conga:18").struct(`<
  ~ A B A C A B A D A B A D A B A C A B A D A B A D A B A B A B A C A B A B A B@2 A B A C A B A E
>`.pickRestart({
  A: "x ~@3 x!2 ~@2", B: "~@4 x!2 ~@2", C: "~@3 x ~ x ~@2 x ~@2 x ~ x ~@2", D: "~@3 x!3 ~@2", E: "~ x",
})).gain(0.95)

// drums · congas
const congas_3 = s("conga:33").struct(`<
  ~@2 A ~@3 A ~ B ~ A ~ B ~ A ~@3 A ~ B ~ A ~ B ~ A ~ A ~ A ~@3 A ~ A ~ A@2 ~ A ~@3 A ~ A
>`.pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.95)

// drums · jingle bells
const jingle_bells = s("sleighbells:4").struct(`<
  ~ A@3 B A@3 B A@7 B A@3 B A@3 B A@3 B A@3 C A@3 B A@6 C A@3 D
>`.pickRestart({
  A: "x!2", B: "x", C: "x ~@2 x ~ x ~@2 x ~@2 x ~ x ~@2", D: "x ~@2 x!2 ~@3",
})).gain(0.64)

stack(piano, congas, congas_2, congas_3, jingle_bells)