Strudelify
KeyE♭ majorTempo135 bpm
0:00/0:00
// Fame — BOWIE DAVID
// 135 bpm, 4/4, key D# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 106 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(135/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 · electric bass finger
const bass = note(`<
  A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4 B A@4
  B C@3 ~@3
>`.pickRestart({
  A: "[eb2@2 f2@3 ~ eb2@2 f2@3 eb2@2 f2@4 eb2@2 ~ eb2@2 f2@4 ab2@4 eb2@2 f2@4 eb2@2 f2@3 eb2@2 f2@4 eb2@2 f2@2 eb2 c2@5 ~@3 eb2@2 f2@3 ~ eb2@2 f2@3 eb2@2 f2@4 eb2@2 ~ eb2@2 f2@4 ab2@4 eb2@2 f2@4, ~@19 f2@2 ~@58 f2@2 ~@15]/4",
  B: "eb2@2 f2@3 eb2@2 f2@4 eb2@2 f2@2 eb2 c2@5 ~@3",
  C: "[eb2@2 f2@3 ~ eb2@2 f2@3 eb2@2 f2@4 eb2@2 ~ eb2@2 f2@4 ab2@4 eb2@2 f2@4 eb2@2 f2@3 eb2@2 f2@4 eb2@2 f2@2 eb2 c2@5 ~@15, ~@19 f2@2 ~@51]/3",
})).s("gm_electric_bass_finger").gain(0.36)

// other · string ensemble 1
const string_ensemble_1 = note(`<
  ~@10 A@5 B@5 ~@17 C@3 ~@2 D@3 E@3 ~@7 F@3 ~@2 G@5 ~@12 C@3 ~@2 D@3 E@3 ~@7 F@3 ~@2 G@5 ~
>`.pickRestart({
  A: "[c5@56 bb4@2 ab4@2 bb4@2 ab4@5 f4@39 ~@3 f4 ~ bb4@2 c5@4 ~@3, ~@55 ab4 ~@4]/5",
  B: "[c5@56 ~@2 ab4@2 bb4@2 ab4@5 f4@40 ~@2 f4 ~ bb4@2 c5@6 ~, ~@57 bb4@2 ~@51 ab4@2 ~@8]/5",
  C: "[~@20 c5@7 bb4@45]/3", D: "[~@19 f5@7 eb5@46]/3", E: "[~@8 c5@7 bb4@42 ~@15]/3", F: "[~@8 c5@7 bb4@45 ~@12]/3",
  G: "[~@7 f5@7 eb5@46 ~@8 c5@7 bb4@42 ~@3]/5",
})).s("gm_string_ensemble_1").gain(0.4)

// other · accordion
const accordion = note("<~@10 A@5 B@5 ~@50 C@2 D@3 E@5 F@5 G@5 C@2 H@3 I@5 J@5 ~>".pickRestart({
  A: "[c6@56 bb5@2 ab5@2 bb5@2 ab5@5 f5@39 ~@3 f5 ~ bb5@2 c6@4 ~@3, ~@55 ab5 ~@4]/5",
  B: "[c6@56 ~@2 ab5@2 bb5@2 ab5@5 f5@40 ~@2 f5 ~ bb5@2 c6@6 ~, ~@57 bb5@2 ~@51 ab5@2 ~@8]/5",
  C: "[~@8 [f4,f5]@7 [eb4,eb5]@29 ~@4]/2", D: "[~@20 [f4,f5]@7 [eb4,eb5]@29 ~@16]/3",
  E: "[~@8 [f4,f5]@7 [eb4,eb5]@39 ~@14 [c4,c5]@7 ~ bb4@44, ~@68 d4 ~@6 bb3@44 ~]/5", // F Eb C
  F: "[~@9 [c5,f5]@7 [bb4,eb5]@38 ~@13 [c5,f5]@8 [bb4,eb5]@41 ~@4]/5", // F5 Eb5 F5 Eb5
  G: "[~@7 [c5,f5]@8 [bb4,eb5]@40 ~@12 [f4,f5]@8 [eb4,eb5]@30 ~@15]/5", H: "[~@20 [f4,f5]@7 [eb4,eb5]@39 ~@6]/3",
  I: "[~@8 [c4,c5]@7 ~ bb4@44 ~@9 [c5,f5]@7 [bb4,eb5]@38 ~@6, ~@8 d4 ~@6 bb3@44 ~@61]/5", // C F5 Eb5
  J: "[~@7 [c5,f5]@8 [bb4,eb5]@41 ~@11 [c5,f5]@8 [bb4,eb5]@40 ~@5]/5", // F5 Eb5 F5 Eb5
})).s("gm_accordion").gain(0.16)

// other · synth brass 1
const synth_brass_1 = note(`<
  ~@20 A B@4 A C D@3 E@2 F G@2 H@2 I@3 J@5 K@2 ~ L M N@2 O P@2 Q@3 R S T@5 U@4 V W@2 F G@2 H@2 I@3 J@5 K@2 ~ L M N@2 O
  P@2 Q@3 R S T@5 ~
>`.pickRestart({
  A: "~@4 f5@5 ~ f5@4 ~ f5@5 ~ f5 ~ f5",
  B: "[~ f5 f5@5 ~@3 g5@5 ~ g5@4 ~ g5@5 g5 ~ g5 ~ g5 ~ g5@5 ~@3 ab5@4 ~ ab5@5 ~ ab5@5 ab5 ~ ab5 ~ ab5 ~ ab5@5 ~@3 g5@5 ~ g5@4 ~ g5@5 ~ g5 ~ g5!2 ~ g5@4]/4",
  C: "~ f5 ~ f5@5 ~@2 g5@5 g5@4 ~@2 g5@3",
  D: "[~@2 g5 ~ g5 ~ g5 ~ g5@5 ~@3 ab5@5 ab5@5 ~ ab5@4 ~ ab5 ~ ab5 ~ ab5 ~ ab5@4 ~@4 bb5@4 ~@2 bb5@4 ~ bb5@5 bb5 ~ bb5 ~ bb5 ~ bb5@4]/3",
  E: "[~@23 eb6@3 d6@3 ~ eb6@3 ~ d6@3 eb6@3 ~ d6@2 eb6@5]/2", F: "~ f6@12 ~@11",
  G: "[~@10 eb6@4 d6@4 eb6@4 d6@4 eb6@3 d6@2 ~ eb6@5 c6@11]/2",
  H: "[~@23 eb6@3 d6@3 ~ eb6@3 ~ d6@3 eb6@3 ~ d6@2 eb6@4 ~]/2", I: "[~ f6@10 ~@9 c6@7 ~ bb5@37 ~@7]/3",
  J: "[~@15 eb6@4 d6@2 eb6@6 ~@3 eb6@3 d6@2 ~ eb6@7 d6@2 eb6@2 d6@2 ~ d6@2 eb6@2 d6@2 c6@2 bb5@2 ~@7 f6@7 eb6@38 ~@8, ~@49 eb6@2 ~@69]/5",
  K: "[~@8 c6@7 bb5@28 ~@5]/2", L: "~@11 eb6@3 d6@3 ~ eb6@3 ~ d6@2", M: "~ eb6@3 ~ d6@2 eb6@5 ~ f6@11",
  N: "[~@22 eb6@4 d6@4 eb6@4 d6@4 eb6@3 d6@2 ~ eb6@4]/2", O: "~ c6@11 ~@12",
  P: "[~@11 eb6@3 d6@3 ~ eb6@3 ~ d6@3 eb6@3 ~ d6@2 eb6@4 ~@2 f6@10 ~]/2", Q: "[~@8 c6@7 ~ bb5@37 ~@19]/3",
  R: "~@3 eb6@4 d6@2 eb6@6 ~@3 eb6@3 d6@2 ~", S: "eb6@7 d6@2 eb6@2 d6@2 ~ d6@2 eb6@2 d6@2 c6@2 bb5@2, ~@13 eb6@2 ~@9",
  T: "[~@7 f6@7 eb6@38 ~@16 c6@7 bb5@28 ~@17]/5",
  U: "[g6@8 gb6@7 e6@7 d6@8 db6@8 b5@7 a5@8 g5@7 gb5@8 e5@7 d5@7 db5@8 b4@6]/4", V: "~ a4@8 g4@7 gb4@8",
  W: "[~@8 [d6,f6]@8 ~@7 eb6@3 d6@3 ~ eb6@3 ~ d6@3 eb6@3 ~ d6@2 eb6@5]/2", // Dm
})).s("gm_synth_brass_1").gain(0.4)

// other · clavinet
const clavinet = note("<~@30 A@8 B@5 C@5 D@5 E@5 F@8 G@3 H I@8 B@5 C@5 D@5 E@5 F@8>".pickRestart({
  A: "[~@8 f5@7 eb5@53 f5@8 eb5@51 f5@8 eb5@53 c5@4]/8", B: "[~@3 bb4@53 f5@7 eb5@52 f5@5]/5",
  C: "[~@3 eb5@53 f5@8 eb5@52 f5@4]/5", D: "[~@3 eb5@53 f5@8 eb5@51 f5@5]/5", E: "[~@3 eb5@53 c5@7 bb4@53 f5@4]/5",
  F: "[~@3 eb5@52 f5@8 eb5@53 f5@8 eb5@52 ~@16]/8", G: "[~@6 db4@8 b3@7 a3@8 g3@7 gb3@8 e3@7 d3@7 db3@8 b2@6]/3",
  H: "~ a2@8 g2@7 gb2@8", I: "[~@15 eb5@53 f5@8 eb5@51 f5@8 eb5@53 c5@4]/8",
})).s("gm_clavinet").gain(0.56)

// other · clavinet · soft notes
const clavinet_soft = note("<~@65 A@2 ~@39>".pickRestart({
  A: "[g4@8 gb4@7 e4@7 d4@8 ~@18]/2",
})).s("gm_clavinet").gain(0.32)

// chords · brass section
const brass_section = note("<~@70 A@2 B@3 C@5 D@5 E@5 A@2 F@3 G@5 H@5 ~>".pickRestart({
  A: "[~@8 [f4,f5]@7 [eb4,eb5]@29 ~@4]/2", B: "[~@20 [f4,f5]@7 [eb4,eb5]@29 ~@16]/3",
  C: "[~@8 [f4,f5]@7 [eb4,eb5]@39 ~@14 [c4,c5]@7 ~ bb4@44, ~@68 d4 ~@6 bb3@44 ~]/5", // F Eb C
  D: "[~@9 [c5,f5]@7 [bb4,eb5]@38 ~@13 [c5,f5]@8 [bb4,eb5]@41 ~@4]/5", // F5 Eb5 F5 Eb5
  E: "[~@7 [c5,f5]@8 [bb4,eb5]@40 ~@12 [f4,f5]@8 [eb4,eb5]@30 ~@15]/5", F: "[~@20 [f4,f5]@7 [eb4,eb5]@39 ~@6]/3",
  G: "[~@8 [c4,c5]@7 ~ bb4@44 ~@9 [c5,f5]@7 [bb4,eb5]@38 ~@6, ~@8 d4 ~@6 bb3@44 ~@61]/5", // C F5 Eb5
  H: "[~@7 [c5,f5]@8 [bb4,eb5]@41 ~@11 [c5,f5]@8 [bb4,eb5]@40 ~@5]/5", // F5 Eb5 F5 Eb5
})).s("gm_brass_section").gain(0.24)

// drums · kick
const kick = s("bd").struct(`<
  A B C D E F G H I E J B K L M N G O P Q F R S P M T U V P E W G H X M T G K Y Z AA B S D AB N R AC AD M AE G AF L M N
  AG K P AH N G K AI AJ AK B K L AL A G H X M T G K Y Z AA B S D AB N R AC AD M AE G AF L M N AG K P AH N G AM ~@3
>`.pickRestart({
  A: "~@8 x ~@4 x ~ x ~ x ~ x!2 ~ x ~", B: "~@4 x ~ x ~@7 x ~@5 x!2 ~ x", C: "~ x!2 ~@2 x ~@5 x!2 ~@7 x ~@3",
  D: "~@2 x!2 ~ x ~ x ~ x!2 ~@5 x ~ x ~@5", E: "~@2 x ~@5 x!2 ~ x ~ x ~ x ~ x ~@4 x ~",
  F: "x ~@7 x ~@5 x!2 ~ x ~ x ~ x ~ x", G: "~@5 x!2 ~@7 x ~@5 x!2 ~ x", H: "~ x ~ x ~ x ~@5 x ~ x ~@6 x ~@3",
  I: "~@2 x!2 ~ x ~ x!2 ~ x ~@6 x ~@6", J: "x ~@7 x ~@5 x!2 ~ x ~ x!2 ~ x ~", K: "~ x ~ x ~ x ~@5 x!2 ~@7 x ~@3",
  L: "~@2 x!2 ~ x ~ x ~ x ~ x ~@4 x ~ x ~@5", M: "~@2 x ~@5 x!2 ~ x ~ x ~ x ~ x ~@5 x",
  N: "x ~@7 x ~@5 x!2 ~ x ~ x ~ x!2 ~", O: "~ x ~ x!2 ~@5 x ~ x ~@7 x ~@3", P: "~@2 x!2 ~ x ~ x ~ x ~ x ~@5 x!2 ~@5",
  Q: "~@2 x ~@5 x!2 ~ x ~ x!2 ~@2 x ~@5 x", R: "~@4 x ~ x ~@7 x ~@4 x ~ x ~ x", S: "~ x!2 ~ x ~@5 x ~ x ~@7 x ~@3",
  T: "~ x ~@6 x ~@5 x!2 ~ x ~ x ~ x!2 ~", U: "~@4 x ~ x ~@6 x ~@5 x ~ x ~ x", V: "~ x!2 ~ x ~@6 x ~ x ~@6 x ~@3",
  W: "x ~@7 x ~@4 x ~ x ~ x ~ x!2 ~ x ~", X: "~@2 x!2 ~ x ~ x!2 ~ x ~@6 x!2 ~@5",
  Y: "~@2 x!2 ~ x ~ x ~ x ~ x ~@6 x ~@5", Z: "~@2 x ~@5 x!2 ~ x ~ x ~ x!2 ~@5 x ~",
  AA: "x ~@7 x ~@5 x ~ x!2 ~ x ~ x!2 ~", AB: "~@2 x ~@4 x ~ x ~ x ~ x!2 ~ x ~@6 x",
  AC: "x ~ x ~@2 x ~@5 x ~ x ~@6 x ~@3", AD: "~@2 x!2 ~ x ~ x!2 ~ x ~@5 x ~ x ~@5",
  AE: "x ~@7 x ~@5 x ~ x ~ x!2 ~ x ~ x", AF: "~ x ~ x ~ x ~@4 x ~ x ~@7 x ~@3", AG: "~@4 x ~ x ~@6 x ~@6 x!2 ~ x",
  AH: "~@2 x ~@5 x ~ x!2 ~ x ~ x ~ x ~@5 x", AI: "~@2 x!2 ~@2 x!2 ~ x ~ x ~@5 x!2 ~@5",
  AJ: "~@2 x ~@5 x ~ x ~ x!2 ~ x ~ x ~@5 x", AK: "x ~@6 x ~@5 x ~ x ~ x ~ x!2 ~ x ~",
  AL: "~ x ~@5 x ~ x ~ x ~ x ~ x ~ x ~@5 x", AM: "~ x ~ x ~ x ~@5 x ~@4 x ~@7",
})).gain(0.43)

// drums · low tom
const low_tom = s("lt").struct(`<
  A B C D E F B C D E F B C G H I B C G J F K C L H F B C G H I B M G H I B C G H I B C G H F B C G E F B C G H I B C G
  E F K C G N O P Q R S T B M G H I B C G H I B C G H F B C G E F B C G H I B C G E F K ~@4
>`.pickRestart({
  A: "~@13 x ~ x ~@8", B: "~@4 x ~ x ~@12 x ~ x ~@2", C: "~@5 x!2 ~@5", D: "~@2 x!2 ~@12 x ~ x ~@5",
  E: "~@7 x ~ x ~@13 x", F: "x ~@13 x!2 ~@8", G: "~ x ~ x ~@12 x ~ x ~@5", H: "~@7 x ~ x ~@12 x ~",
  I: "x ~@12 x ~ x ~@8", J: "~@7 x!3 ~@12 x ~", K: "~@5 x!2 ~@12 x ~ x ~@2", L: "~ x ~ x ~@13 x!2 ~@5",
  M: "~@11 x!2 ~@11", N: "~@7 x ~ x ~@12 x!2", O: "x ~ x ~ x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~",
  P: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~ x ~ x ~ x ~ x", Q: "~ x ~ x ~ x!2 ~ x ~ x!3 ~ x ~ x!2 ~ x ~ x ~ x",
  R: "~ x ~ x ~ x ~ x ~ x!2 ~ x ~ x ~ x!3 ~ x ~ x ~", S: "x ~ x!2 ~ x ~ x!3 ~ x ~ x ~ x ~ x!2 ~ x ~ x ~",
  T: "x ~ x ~ x ~@8 x ~ x ~@8",
})).gain(0.21)

// drums · pedal hat
const pedal_hat = s("hh").struct(`<
  A B C D E F G H I J K L H M N O P H I N F P C I J Q R H I S T L H I S U V H I W X L C I Y U Z C I Y T AA H I S AB B H
  I W F L H AC W F G AD I Y T L H I S U V H I W X L C I Y U Z C I Y T AA H I S AB B H I W F L AE ~@3
>`.pickRestart({
  A: "~@7 x ~@16", B: "~@6 x ~@4 x ~ x ~@7 x ~@2", C: "~@3 x ~ x", D: "~@3 x ~@14 x ~@4 x", E: "~ x ~@7 x ~@14",
  F: "x ~@5 x ~ x ~@6 x ~@8", G: "~@6 x ~@5 x!2 ~@7 x ~@2", H: "~@6 x ~@2 x!2 ~", I: "~ x ~@4 x ~", J: "~ x ~@22",
  K: "x ~@2 x!2 ~@7", L: "~@6 x ~@5 x ~ x ~@6 x ~@2", M: "~@3 x", N: "~ x ~@10", O: "x!2 ~", P: "~@3 x ~@3 x ~@4",
  Q: "~ x ~@4 x ~ x ~@15", R: "~@3 x ~@2 x!2 ~@4", S: "x ~ x ~@6 x ~@14", T: "x ~@7 x ~@6 x ~@8", U: "x!3",
  V: "~@6 x ~@4 x ~@2 x ~@6 x ~@2", W: "x!2 ~@7 x ~@14", X: "x ~@2 x!2 ~@3 x ~@3", Y: "~@2 x ~@6 x ~@14",
  Z: "~@6 x ~@6 x ~@7 x ~@2", AA: "~@6 x ~@7 x ~@6 x ~@2", AB: "~ x ~@6 x ~@7 x ~@7", AC: "~@2 x ~@6 x ~@2",
  AD: "~@13 x ~@4 x ~ x ~@3", AE: "~@11 x ~@12",
})).gain(0.34)

// drums · pedal hat · soft notes
const pedal_hat_soft = s("hh").struct(`<
  A ~ B ~@6 C D ~@2 E C F G ~@2 C ~ G B ~ C H I ~@3 J ~@4 J ~@6 B ~ K J L B ~ K J L ~@3 J ~@12 M ~ J ~@4 J ~@6 B ~ K J L
  B ~ K J L ~@3 J ~@10
>`.pickRestart({
  A: "~@2 x ~@2 x ~@2", B: "~@3 x", C: "x ~@2 x ~@4", D: "~@5 x ~@2", E: "~ x ~@6", F: "~@3 x ~@4 x ~@3",
  G: "~@4 x ~@2 x", H: "~@2 x", I: "~@7 x", J: "~ x ~@2", K: "x", L: "~ x", M: "~@23 x",
})).gain(0.21)

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

// drums · crash
const crash = s("cr").struct("<~@70 x ~@35>").gain(0.43)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D
  E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B C D E A B F ~@3
>`.pickRestart({
  A: "x ~ x ~ x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~", B: "x ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~ x ~ x ~ x ~ x",
  C: "~ x ~ x ~ x!2 ~ x ~ x ~ x ~ x ~ x!2 ~ x ~ x ~ x", D: "~ x ~ x ~ x ~ x ~ x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~",
  E: "x ~ x!2 ~ x ~ x ~ x ~ x ~ x ~ x ~ x!2 ~ x ~ x ~", F: "~ x ~ x ~ x!2 ~ x ~ x ~ x!2 ~ x ~ x ~@6",
})).gain(0.39)

stack(
  bass, string_ensemble_1, accordion, synth_brass_1, clavinet, clavinet_soft, brass_section, kick, low_tom, pedal_hat,
  pedal_hat_soft, open_hat, crash, tambourine
)

More by David Bowie