Strudelify

Ka-Ching!

Shania Twain

KeyB♭ minorTempo76 bpm
0:00/0:00
// Ka-Ching! — Shania Twain
// 76 bpm, 4/4, key A# minor. 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 59 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(76/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 · synth bass 2
const bass = note("<~@15 A B ~@13 C D ~@17 C D ~@8>".pickRestart({
  A: "~@24 f3@5 ~ eb3@5 ~ db3@5 ~ c3@5 ~", B: "gb3@11 ~@13", C: "~@25 f3@5 ~ eb3@5 ~ db3@5 ~ c3@5", D: "~ gb3@22 ~@25",
})).s("gm_synth_bass_2").gain(0.12)

// bass · electric bass finger
const bass_2 = note(`<
  ~@2 A B C D E D E F G H I J K L M J K N O E D P Q R S T U V W X U V Y Z AA AB AC AD AE AB AC AF AG S T U V W X U V AH
  AI AC AE AC AJ
>`.pickRestart({
  A: "~@15 bb1", B: "bb1@6 ~@39 a1@2 ~", C: "a1@7 ~@10 f3@13 ~@3 f1@3 db2@8 ~@4", D: "bb1@2 ~@9 bb1 db2 eb2 ~ bb1",
  E: "a1@2 ~@9 f1 db2 eb2 ~ a1", F: "bb1@5 ~@28 bb1@3 eb2@3 f2@4 ~@2 f2@3", G: "f1@6 ~@27 f1@3 eb2@3 f2@4 ~@2 f2@3",
  H: "f1@7 ~@26 f1@3 eb2@2 ~ f2@4 ~@2 f1@3",
  I: "gb1@2 ~ gb1@2 ~ gb1@2 ~ gb1@3 ~@9 gb1@2 ~ gb1@2 ~ gb2@2 ~ gb1@2 ~ gb2@4 ~@8 gb2@2 ~",
  J: "db2@2 ~ db2@2 ~ db2@2 ~ db2@3 ~@9 ab1@2 ~ db2@2 ~ ab1@2 ~ db2@2 ~ db2@4 ~@8 db2@2 ~",
  K: "eb1@2 ~ eb1@2 ~ eb1@2 ~ eb1@3 ~@9 bb1@2 ~ eb2@2 ~ bb1@2 ~ eb2@2 ~ eb2@4 ~@8 eb2@2 ~",
  L: "eb1@2 ~@4 f1@3 ~@15 f1@3 f2@3 eb1@3 eb2@3 db1@3 db2@3 c1@3 c2@3",
  M: "~@3 gb1@2 ~ gb1@2 ~ gb1@3 ~@9 gb1@2 ~ gb1@2 ~ gb2@2 ~ gb1@2 ~ gb2@4 ~@8 gb2@2 ~", N: "eb1@2 ~@4 f1@3 ~@36 bb1@3",
  O: "bb1 ~@10 bb1 db2 eb2 ~ bb1", P: "a1@6 ~@27 f1@3 db2@3 eb2@3 ~@4 a1@2",
  Q: "~ bb1@5 ~@28 bb1@3 eb2@3 f2@4 ~@2 f2@2", R: "~ f1@6 ~@27 f1@3 eb2@3 f2@4 ~@2 f2@2",
  S: "~ f1@7 ~@26 f1@3 eb2@2 ~ f2@4 ~@2 f1@2",
  T: "~ gb1@2 ~ gb1@2 ~ gb1@2 ~ gb1@3 ~@9 gb1@2 ~ gb1@2 ~ gb2@2 ~ gb1@2 ~ gb2@4 ~@8 gb2@2",
  U: "~ db2@2 ~ db2@2 ~ db2@2 ~ db2@3 ~@9 ab1@2 ~ db2@2 ~ ab1@2 ~ db2@2 ~ db2@4 ~@8 db2@2",
  V: "~ eb1@2 ~ eb1@2 ~ eb1@2 ~ eb1@3 ~@9 bb1@2 ~ eb2@2 ~ bb1@2 ~ eb2@2 ~ eb2@4 ~@8 eb2@2",
  W: "~ eb1@2 ~@4 f1@3 ~@15 f1@3 f2@3 eb1@3 eb2@3 db1@3 db2@3 c1@3 c2@2",
  X: "~@4 gb1@2 ~ gb1@2 ~ gb1@3 ~@9 gb1@2 ~ gb1@2 ~ gb2@2 ~ gb1@2 ~ gb2@4 ~@8 gb2@2", Y: "~ eb1@2 ~@4 f1@3 ~@38",
  Z: "~ bb1@3 ~@44", AA: "~ bb1@3 ~@30 bb1@3 db2@3 eb2@3 ~@3 bb1@2",
  AB: "~ a1@6 ~@27 bb1@3 db2@3 eb2@3 ~@3 bb1@2, ~ bb1@3 ~@44", AC: "~ a1@6 ~@27 f1@3 db2@3 eb2@3 ~@3 a1@2",
  AD: "~ bb1@6 ~@27 f1@3 db2@3 eb2@3 ~@3 a1@2", AE: "~ bb1@6 ~@27 bb1@3 db2@3 eb2@3 ~@3 bb1@2",
  AF: "~ bb1@6 ~@27 f1@3 eb2@3 f2@4 ~@2 f2@2", AG: "~ f1@7 ~@26 f1@3 eb2@3 f2@4 ~@2 f2@2",
  AH: "~ eb1@2 ~@4 f1@3 ~@36 bb1@2", AI: "~@34 bb1@3 db2@3 eb2@3 ~@3 bb1@2", AJ: "~ bb1@5 ~@42",
})).s("gm_electric_bass_finger").gain(0.66)

// other · alto sax
const alto_sax = note(`<
  ~@4 A B C D E F G H I J K ~ L J K ~ B C D M N O P Q R S ~ T R S ~@10 U P Q R S ~ T R S ~ V W X Y Z
>`.pickRestart({
  A: "~@9 bb3@2 ~", B: "~@24 eb4@3 f4@3 db4@2 ~ db4@2 ~ db4@3 eb4@3 bb3@5 ~",
  C: "a3@6 ~@15 f3@3 eb4@3 f4@3 db4@2 ~ db4@2 ~ db4@3 eb4@3 a3@6",
  D: "bb3@8 ~@10 bb3@2 ~ bb3@3 eb4@3 f4@2 ~ db4@2 ~ db4@2 ~ db4@3 eb4@3 bb3@3 bb3@3",
  E: "a3@5 ~@13 f3@2 ~ f3@2 ~ eb4@3 f4@3 db4@2 ~ db4@2 ~ db4@3 eb4@3 a3@3 a3@3",
  F: "bb3@6 ~@24 bb4@3 ~@3 bb4@3 bb4@2 ~ bb4@2 ~ bb4@3",
  G: "a4@3 f4@4 ~@20 bb3@3 bb4@3 bb4@3 bb4@2 ~ bb4@2 ~ bb4@2 ~ bb4@3",
  H: "a4@3 f4@4 ~@20 a3@2 ~ a4@2 ~ a4 ~@2 a4@2 ~ a4@2 ~ a4@3 a4@2 ~", I: "bb4@16 ~@5 bb4@2 ~ db5@6 c5@6 bb4@11 ~",
  J: "f4@16 ~@5 f4@3 ab4@6 gb4@6 f4@6 ab4@6", K: "gb4@19 ~@29", L: "~@21 bb4@2 ~ db5@6 c5@6 bb4@11 ~",
  M: "a3@5 ~@13 f3@2 ~ f3@2 ~ eb4@3 f4@3 db4@2 ~ db4@2 ~ db4@3 eb4@3 ~ a3@3 a3@2",
  N: "~ bb3@6 ~@23 bb4@4 ~@3 bb4@3 bb4@2 ~ bb4@2 ~ bb4@2",
  O: "~ a4@3 f4@4 ~@20 bb3@3 bb4@3 bb4@3 bb4@2 ~ bb4@2 ~ bb4@2 ~ bb4@2",
  P: "~ a4@3 f4@4 ~@20 a3@2 ~ a4@2 ~ a4 ~@2 a4@2 ~ a4@2 ~ a4@3 a4@2", Q: "~ bb4@16 ~@5 bb4@2 ~ db5@6 c5@6 bb4@11",
  R: "~ f4@16 ~@5 f4@3 ab4@6 gb4@6 f4@6 ab4@5", S: "~ gb4@19 ~@28", T: "~@22 bb4@2 ~ db5@6 c5@6 bb4@11",
  U: "~@4 f4@4 ~@20 bb3@3 bb4@3 bb4@3 bb4@3 bb4@2 ~ bb4@2 ~ bb4@2",
  V: "~@25 eb4@3 f4@3 db4@2 ~ db4@2 ~ db4@3 eb4@3 bb3@5",
  W: "~ a3@6 ~@15 f3@3 eb4@3 f4@3 db4@2 ~ db4@2 ~ db4@3 eb4@3 a3@5",
  X: "~ bb3@8 ~@10 bb3@2 ~ bb3@3 eb4@3 f4@2 ~ db4@2 ~ db4@2 ~ db4@3 eb4@3 bb3@3 bb3@2",
  Y: "~ a3@5 ~@13 f3@2 ~ f3@2 ~ eb4@3 f4@3 db4@2 ~ db4@2 ~ db4@3 eb4@3 a3@3 a3@2", Z: "~ bb3@6 ~@41",
})).s("gm_alto_sax").gain(0.72)

// other · alto sax · soft notes
const alto_sax_soft = note(`<
  A B@2 C D ~ E ~@2 F ~@2 G ~@3 G ~@4 H ~@2 I ~@2 G ~@3 G ~@14 G ~@3 G ~@4 H ~@3
>`.pickRestart({
  A: "~@24 c-1 ~@23", B: "c-1 ~@23 c-1 ~@23", C: "c-1 ~@15 c-1 ~@15 c-1 ~@15", D: "c-1 ~@47", E: "~@46 b3 ~",
  F: "~@33 bb4@2 ~@13", G: "~@45 b4 ~@2", H: "~@47 b3", I: "~@17 bb4 ~@6",
})).s("gm_alto_sax").gain(0.08)

// chords · electric guitar clean
const electric_guitar_clean = note("<~@4 A ~@2 B C ~@2 D ~@10 B E ~@2 F ~@18 F ~@10 G H ~>".pickRestart({
  A: "~@27 [a3,c4,f4] ~@2 [a3,c4,f4] ~@2 [a3,c4,f4]@4 ~@2 [a3,c4,f4] ~@2 [c4,f4,a4]@2 ~ [a3,c4,f4]@2 ~", // F
  B: "~@27 [bb3,db4,f4] ~@2 [bb3,db4,f4] ~@2 [bb3,db4,f4]@3 [bb3,db4,f4]@3 [bb3,db4,f4]@6 [bb3,db4,f4] ~@2", // Bbm
  C: "~@12 [f3,a3,c4,eb4]@14 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~@4 [f3,a3,c4,eb4]@2 ~", // F7
  D: "~@27 [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~@2 [f3,a3,c4,eb4]@3 ~@2 [f3,a3,c4,eb4]@3 [f3,a3,c4,eb4]@3 [f3,a3,c4,eb4]@2 ~", // F7
  E: "~@12 [f3,a3,c4,eb4]@14 ~@2 [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~@5 [f3,a3,c4,eb4]@2", // F7
  F: "~@28 [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@3 ~@3 [f3,a3,c4,eb4]@3 [f3,a3,c4,eb4]@3 [f3,a3,c4,eb4]@2", // F7
  G: "~@28 [bb3,db4,f4] ~@2 [bb3,db4,f4] ~@2 [bb3,db4,f4]@3 [bb3,db4,f4]@3 [bb3,db4,f4]@6 [bb3,db4,f4] ~", // Bbm
  H: "~@13 [f3,a3,c4,eb4]@14 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~ [f3,a3,c4,eb4]@2 ~@4 [f3,a3,c4,eb4]@2", // F7
})).s("gm_electric_guitar_clean").gain(0.23).pan(0.4)

// other · distortion guitar
const distortion_guitar = note(`<
  ~@9 A B C D E F@2 G E H@2 ~@4 I J K L M N@2 O M P@2 ~@9 Q J L M N@2 O M P@2 ~@4 R
>`.pickRestart({
  A: "bb2 ~@2 [bb2,f3,bb3]@3", B: "f2@4 ~@8 [f2,c3,f3]@11 ~", C: "f2@9 ~@15 [f2,c3,f3]@22 ~@2", D: "gb2!4 gb3@12",
  E: "db2!4 db3@12",
  F: "[eb2@3 eb2@9 eb3@16 ~@19 f3@25 f2@3 ~@3 eb2@3 eb3@3 db2@3 db3@3 c2@3 c3@3, ~@47 c3@36 ~@13, ~@75 f3@7 ~@14]/2",
  G: "~ gb2!3 gb3@12", H: "[eb2@3 eb2@9 eb3@16 ~@19 [c3,f3]@7 [c3,f3]@3 ~@39]/2", I: "~ bb2@8 ~@16 [bb2,f3,bb3]@23",
  J: "~ f2@8 ~@16 [f2,c3,f3]@22 ~", K: "~ f2@9 ~@15 [f2,c3,f3]@22 ~", L: "~ gb2@3 gb2@3 gb2@3 gb2@3 gb3@35",
  M: "~ db2@3 db2@3 db2@3 db2@3 db3@35",
  N: "[~ eb2@3 eb2@9 eb3@16 ~@18 f3@26 f2@3 ~@3 eb2@3 eb3@3 db2@3 db3@3 c2@3 c3@2, ~@47 c3@36 ~@13, ~@76 f3@7 ~@13]/2",
  O: "~@4 gb2@3 gb2@3 gb2@3 gb3@35", P: "[~ eb2@3 eb2@9 eb3@16 ~@18 [c3,f3]@8 [c3,f3]@3 ~@38]/2",
  Q: "~@25 [f2,c3,f3]@22 ~", R: "~ bb2@8 ~@39",
})).s("gm_distortion_guitar").gain(0.28).pan(0.4)

// chords · distortion guitar
const distortion_guitar_2 = note("<~@16 A B C ~@8 D E F ~ D E F ~@16 D E F ~@6>".pickRestart({
  A: "[db3,gb3]@43 ~@5", B: "[db3,f3]@43 ~@5", C: "[eb3,bb3]@43 ~@5", D: "~ [db3,gb3]@43 ~@4", E: "~ [db3,f3]@43 ~@4",
  F: "~ [eb3,bb3]@43 ~@4", // Eb5
})).s("gm_distortion_guitar").gain(0.36).pan(0.2)

// chords · string ensemble 1
const string_ensemble_1 = note("<~@12 A B C@2 ~ B D@2 ~@7 E F G@2 ~ F H@2 ~@11 E F G@2 ~ F H@2 ~@5>".pickRestart({
  A: "[bb4,db5,gb5]", B: "[ab4,db5,f5]", C: "[[bb4,eb5,gb5]@29 ~@18 [a4,c5,f5]@36 ~@13]/2",
  D: "[[bb4,eb5,gb5]@29 ~@18 [a4,c5,f5]@8 ~@41]/2", E: "~ [bb4,db5,gb5]@47", F: "~ [ab4,db5,f5]@47",
  G: "[~ [bb4,eb5,gb5]@29 ~@17 [a4,c5,f5]@36 ~@13]/2", H: "[~ [bb4,eb5,gb5]@29 ~@17 [a4,c5,f5]@8 ~@41]/2",
})).s("gm_string_ensemble_1").gain(0.1).pan(0.7)

// chords · synth strings 2
const synth_strings_2 = note("<~@36 A B@2 A@2 B@2 A B@2 C D E B C D E ~@6>".pickRestart({
  A: "~ [bb3,db4,f4]@47", B: "~ [a3,c4,f4]@47", C: "~ [bb3,db4,gb4]@47", D: "~ [ab3,db4,f4]@47",
  E: "~ [bb3,eb4,gb4]@47", // Ebm
})).s("gm_synth_strings_2").gain(0.12).pan(0.6)

// other · alto sax
const alto_sax_2 = note(`<
  ~@10
  [~@12 a4@3 f4@4 ~@5 a4@3 f4@2 ~@19]!2
  ~@13
  [~@13 a4@3 f4@4 ~@5 a4@3 f4@2 ~@18]!2
  ~@17
  [~@13 a4@3 f4@4 ~@5 a4@3 f4@2 ~@18]!2
  ~@13
>`).s("gm_alto_sax").gain(0.48)

// other · string ensemble 1
const string_ensemble_1_2 = note(`<
  ~@36
  [~@4 bb2 ~@2 db3 ~@2 f3 ~@2 eb3 ~@2 f3 ~@2 bb2 ~@2 f3 ~@25]
  [~@4 a2 ~@2 c3 ~@2 f3 ~@2 eb3 ~@2 f3 ~@2 a2 ~@2 f3 ~@25]!2
  [~@4 bb2 ~@2 db3 ~@2 f3 ~@2 eb3 ~@2 f3 ~@2 db3 ~@2 f3 ~@25]
  [~@4 bb2 ~@2 db3 ~@2 f3 ~@2 eb3 ~@2 f3 ~@2 bb2 ~@2 f3 ~@25]
  [~@4 a2 ~@2 c3 ~@2 f3 ~@2 eb3 ~@2 f3 ~@2 a2 ~@2 f3 ~@25]!2
  [~@4 bb2 ~@2 db3 ~@2 f3 ~@2 eb3 ~@2 f3 ~@2 db3 ~@2 f3 ~@25]
  ~@15
>`).s("gm_string_ensemble_1").gain(0.64)

// other · piano
const piano = note("<A@4 B C B C D ~@50>".pickRestart({
  A: "[bb2@191 ~]/4", B: "a2", C: "bb2", D: "~ a2@47",
})).s("gm_piano").gain(0.3)

// drums · kick
const kick = s("bd").struct("<~@5 A@6 B C@7 D A@3 E F@3 G@7 H I G@8 F@2 G@7 J K F@3 L>".pickRestart({
  A: "x ~@6 x!2 ~@2 x ~ x ~ x", B: "x ~@20 x ~@2 x ~@9 x ~@4 x ~@5 x ~@2", C: "x ~ x ~@4 x!2 ~ x ~@2 x ~ x",
  D: "x ~ x ~@12 x", E: "~ x ~@19 x ~@2 x ~@8 x ~@5 x ~@6 x ~", F: "~ x ~@20 x ~@2 x ~@8 x ~@5 x ~@5 x ~",
  G: "~ x ~@5 x ~@14 x ~@2 x ~@5 x ~@8 x ~@5 x ~", H: "~ x ~@5 x ~@40", I: "~ x ~@20 x ~@2 x ~@5 x ~@8 x ~@5 x ~",
  J: "~ x ~@5 x ~@38 x ~", K: "~@22 x ~@2 x ~@8 x ~@5 x ~@5 x ~", L: "~ x ~@46",
})).gain(0.8)

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

// drums · clap
const clap = s("cp").struct("<~@5 A@6 B A@7 ~ A@4 C@2 D C@7 ~ C@10 D C@7 ~ C@4 ~>".pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2", C: "~@13 x ~@23 x ~@10", D: "~@13 x ~@23 x ~@5 x ~@2 x ~",
})).gain(0.64)

// drums · hihat
const hihat = s("hh").struct("<~@12 A@7 B ~@7 C@7 D E C@8 F ~ C@7 D ~@5>".pickRestart({
  A: "x!7 ~", B: "x!2 ~@6", C: "~ x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@10", D: "~ x ~@5 x ~@40",
  E: "~@7 x ~@5 x ~@5 x ~@5 x ~@5 x ~@5 x ~@10", F: "~ x ~@46",
})).gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@12 A@7 ~@8 B@7 ~ B@9 ~@2 B@7 ~@6>".pickRestart({
  A: "~@7 x", B: "~@43 x ~@4",
})).gain(0.32)

// drums · high tom
const high_tom = s("ht").struct("<~@35 [~@43 x ~@4] ~@7 [~@43 x ~@4] ~@5 [~@41 x ~ x ~@4] ~@9>").gain(0.72)

// drums · crash
const crash = s("cr").struct("<~@9 A@4 ~@3 A ~@7 B@4 ~@3 B ~@4 B ~@7 B@3 ~@3 B ~@7 B>".pickRestart({
  A: "x", B: "~ x ~@46",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@5 A@14 B C A@2 D E@10 F G E@17 F H E@3 I>".pickRestart({
  A: "x!3 ~ x!3 ~ x!3 ~ x!4", B: "x!3 ~@13", C: "~ x!2 ~ x!3 ~ x!3 ~ x!4",
  D: "~ x ~ x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~@2 x ~@3 x ~@2 x ~",
  E: "~ x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@2 x ~", F: "~ x ~@2 x ~@2 x ~@40",
  G: "~@4 x ~@8 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@2 x ~",
  H: "~@4 x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@5 x ~@2 x ~@2 x ~@2 x ~", I: "~ x ~@46",
})).gain(0.32)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@5 A@6 B A@7 ~ A@4 C@10 ~ C@18 ~ C@4 ~>".pickRestart({
// … 14 more lines

More by Shania Twain