Strudelify
KeyD♭ majorTempo128 bpm
0:00/0:00
// Ramona — The Blue Diamonds
// 128 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 86 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(128/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 · fretless bass
const bass = note(`<
  A B A B C D E F G H I J K L M@2 N O P Q C D E F G H R S T U V W X Y A B A B C D E F G H I J K L M@2 N O P Q C D E F G
  H R S T U V W X Y Z AA K L M@2 N O AB AC T U V W X Y Z AD
>`.pickRestart({
  A: "gb2@3 ~@6 gb2@2 ~ f2 ~@8 f2 ~@2", B: "eb2 ~@8 b2@2 ~ db3 ~@2 db3 ~@2 db3@3 bb2@2 ~",
  C: "gb1@2 ~@7 gb1@2 ~ db2@2 ~@7 db2@2 ~", D: "gb1@2 ~@7 gb1 ~@2 db2 ~@2 db2 ~@2 db2@2 ~ gb1 ~@2",
  E: "db2@3 ~@6 db2@2 ~ ab1@2 ~@7 ab1@2 ~", F: "db2@2 ~@7 ab1 ~@2 db2 ~@2 db2 ~@2 db2@2 ~ ab1@2 ~",
  G: "db2@2 ~@7 db2@2 ~ ab1@2 ~@7 ab1@2 ~", H: "db2@2 ~@7 ab1 ~@2 db2 ~@2 db2 ~@2 db2@2 ~@4",
  I: "gb1@3 ~@6 gb1@2 ~ db2@2 ~@7 db2@2 ~", J: "gb1@2 ~@7 gb1@2 ~ db2 ~@2 db2 ~@2 db2@2 ~@4",
  K: "gb1@6 bb1@5 ~ db2@6 eb2@4 db2@2", L: "gb1@6 bb1@6 b1@6 c2@5 ~", M: "db2@3 f2@3 ab2@3 bb2@2 ab2",
  N: "db2@6 ab1@6 db2@5 ~ ab1@5 ~", O: "db2@5 ~ f2@6 ab2@6 bb2@4 ab2 ~", P: "gb1@6 bb1@6 db2@6 eb2@4 db2 ~",
  Q: "gb1@5 ~ bb1@6 db2@6 eb2@4 db2 ~", R: "eb2@3 ~@6 eb2@2 ~ bb1@2 ~@7 bb1@2 ~",
  S: "eb2@2 ~@7 bb1@2 ~ eb2 ~@2 eb2 ~@2 eb2@2 ~@4", T: "b1@3 eb2@3 gb2@3 ab2@2 gb2", U: "b1@3 eb2@3 db2@3 eb2@2 db2",
  V: "gb1@5 ~ gb2@5 ~ db2@4 ~@2 db2@6", W: "eb2@6 bb2@6 eb2@4 db1@2 db2@5 ~", X: "b1@3 eb2@3 gb2@3 b2@2 gb2",
  Y: "db2@6 f2@5 ~ ab2@6 db3@6", Z: "gb1 bb1 db2 gb1", AA: "gb1 bb1 gb1!2", AB: "eb2@6 eb2@6 bb1@6 eb2@4 g2 ~",
  AC: "eb2@5 ~ bb1@6 eb2@6 bb1@4 db2 ~", AD: "gb1 ~@3",
})).s("gm_fretless_bass").gain(0.37)

// chords · piano
const piano = note(`<
  ~@4 A ~ B C D ~ A E F@2 G@4 F@2 A ~ B C D ~ H I J@2 K L J M ~@4 A ~ B C D ~ A E F@2 G@4 F@2 A ~ B C D ~ H I J@2 K L J
  M N@2 F@2 G@4 O@2 J@2 K L J M N P
>`.pickRestart({
  A: "[db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2", // Gb
  B: "[f5,b5]@2 ~ [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2, db5 ~@23", // Fdim Db7
  C: "[db5,f5,b5] ~@2 [db5,f5,b5] ~@20", // Db7
  D: "[db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2", // Db7
  E: "[db5,gb5,bb5] ~@23", F: "~@4 [db5,gb5,bb5] ~@5 [db5,gb5,bb5] ~@5 [db5,gb5,bb5] ~@5 [db5,gb5,bb5] ~",
  G: "~@4 [db5,f5,b5] ~@5 [db5,f5,b5] ~@5 [db5,f5,b5] ~@5 [db5,f5,b5] ~", // Db7
  H: "[g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2", // Eb
  I: "[g5,bb5,eb6] ~@23", J: "~@4 [gb5,b5,eb6] ~@5 [gb5,b5,eb6] ~@5 [gb5,b5,eb6] ~@5 [gb5,b5,eb6] ~",
  K: "~@4 [gb5,bb5,db6] ~@5 [gb5,bb5,db6] ~@5 [f5,ab5,db6] ~@5 [f5,ab5,db6] ~", // Gb Db
  L: "~@4 [g5,bb5,eb6] ~@5 [g5,bb5,eb6] ~@5 [g5,bb5,eb6] ~@5 [g5,bb5,eb6] ~", // Eb
  M: "~@4 [ab5,db6,f6] ~@5 [ab5,db6,f6] ~@5 [ab5,db6,f6] ~@5 [ab5,db6,f6] ~", // Db
  N: "~@4 [gb5,bb5,db6] ~@5 [gb5,bb5,db6] ~@5 [gb5,bb5,db6] ~@5 [gb5,bb5,db6] ~", // Gb
  O: "~@4 [eb5,g5,bb5] ~@5 [eb5,g5,bb5] ~@5 [eb5,g5,bb5] ~@5 [eb5,g5,bb5] ~", P: "[gb5,bb5,db6] ~@23",
})).s("gm_piano").gain(0.11).pan(0.7)

// chords · piano · soft notes
const piano_soft = note("<~@5 A ~ B ~ C ~ D ~@9 A ~ B ~ C ~ E ~@11 A ~ B ~ C ~ D ~@9 A ~ B ~ C ~ E ~@24>".pickRestart({
  A: "[db5,gb5] ~@2 [db5,gb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5] ~@2 [db5,gb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2, bb5@2 ~ bb5@2 ~@7 bb5@2 ~ bb5@2 ~@7", // Gb5 Gb Gb5 Gb
  B: "~@6 [db5,f5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [f5,b5] ~@2, ~@3 b5 ~@8", // Db Db7 Fdim
  C: "[db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5,b5] ~@2 [db5,f5] ~@2 [db5,f5,b5] ~@2 [db5,f5] ~@2 [db5,f5] ~@2, ~@12 b5@2 ~@4 b5@2 ~ b5@2 ~", // Db7 Db Db7 Db
  D: "~@3 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2 [db5,gb5,bb5] ~@2, ~@9 gb5@2 ~@13", // Gb
  E: "~@3 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2 [g5,bb5,eb6] ~@2, ~@9 g5@2 ~@13", // Eb Eb5 Eb
})).s("gm_piano").gain(0.05).pan(0.7)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  A B C D E F G H I J K L ~@8 E F G H I J M N ~@6 A B C D E F G H I J K L ~@8 E F G H I J M N ~@24
>`.pickRestart({
  A: "gb2@3 ~@6 gb2@2 ~ bb2@3 ~@6 bb2@2 ~", B: "b2@2 ~@7 b2@2 ~ db3 ~@2 db3 ~@2 db3@3 bb2@2 ~",
  C: "gb2 ~@8 gb2@2 ~ bb2@3 ~@6 bb2@2 ~", D: "b2@2 ~@7 b2@2 ~ db3 ~@2 db3 ~@2 db3@2 ~ bb2@2 ~",
  E: "gb2@2 ~ gb2 ~@2 gb2 ~@2 gb2@2 ~ db3@2 ~ db3 ~@5 db3@2 ~",
  F: "gb2@2 ~ gb2 ~@2 gb2 ~@2 gb2 ~@2 db3 ~@2 db3 ~@2 db3@2 ~ gb2 ~@2",
  G: "db3@3 ~@3 db3 ~@2 db3@2 ~ ab2@2 ~ ab2 ~@2 ab2 ~@2 ab2@2 ~",
  H: "db3@2 ~@4 db3 ~@2 ab2 ~@2 db3 ~@2 db3 ~@2 db3@2 ~ ab2@2 ~",
  I: "db3@2 ~@7 db3@2 ~ ab2@2 ~ ab2 ~@2 ab2 ~@2 ab2@2 ~",
  J: "db3@2 ~ db3 ~@2 db3 ~@2 ab2 ~@2 db3 ~@2 db3 ~@2 db3@2 ~@4",
  K: "gb2@3 ~@6 gb2@2 ~ db3@2 ~ db3 ~@2 db3 ~@2 db3@2 ~",
  L: "gb2@2 ~@4 gb2 ~@2 gb2@2 ~ db3 ~@2 db3 ~@2 db3@2 ~ db3 ~@2",
  M: "eb3@3 ~@6 eb3@2 ~ bb2@2 ~ bb2 ~@2 bb2 ~@2 bb2@2 ~",
  N: "eb3@2 ~@4 eb3 ~@2 bb2@2 ~ eb3 ~@2 eb3 ~@2 eb3@2 ~ eb3 ~@2",
})).s("gm_electric_guitar_muted").gain(0.44)

// other · electric guitar muted · soft notes
const electric_guitar_muted_2 = note(`<
  A B A B C ~ D@2 E F G H ~@8 C ~ D@2 E F I J ~@6 A B A B C ~ D@2 E F G H ~@8 C ~ D@2 E F I J ~@24
>`.pickRestart({
  A: "~@3 gb2 ~@2 gb2 ~@8 bb2 ~@2 bb2 ~@5", B: "~@3 b2 ~@2 b2 ~@17", C: "~@18 db3 ~@5", D: "~@3 db3 ~@20",
  E: "~@3 db3 ~@2 db3 ~@17", F: "~@21 db3 ~@2", G: "~@3 gb2 ~@2 gb2 ~@17", H: "~@3 gb2 ~@20", I: "~@3 eb3 ~@2 eb3 ~@17",
  J: "~@3 eb3 ~@20",
})).s("gm_electric_guitar_muted").gain(0.27)

// chords · synth strings 1
const synth_strings_1 = note(`<
  ~@4 A@2 B@4 C@2 A@2 B@4 C@4 D@4 E@2 F@2 G H@2 I@2 ~@3 A@2 B@4 C@2 A@2 B@4 C@4 D@4 E@2 F@2 G H@2 J@2 K A@2 B@4 L@2 F@2
  G H@2 J@2 ~
>`.pickRestart({
  A: "[[gb3,bb3,db4]@47 ~]/2", B: "[[f3,ab3,db4]@47 ~]/4", C: "[[gb3,bb3,db4]@23 ~]/2",
  D: "[[ab3,db4]@95 ~, f3@31 ~]/4", E: "[g3,bb3,eb4]/2", F: "[gb3,b3,eb4]/2", G: "[gb3,bb3] [f3,ab3], db4",
  H: "[[g3,bb3] [gb3,b3], eb4]/2", I: "[[ab3,f4] ~, db4]/2", J: "[[ab3,f4] [gb3,bb3], db4]/2", K: "[gb3,bb3]",
  L: "[[g3,bb3,eb4]@23 ~]/2", // Eb
})).s("gm_synth_strings_1").gain(0.14)

// chords · tenor sax
const tenor_sax = note("<~@69 A B C D E F G H ~@9>".pickRestart({
  A: "~@9 gb3 ~@2", B: "[gb3,bb3]@2 ~ [gb3,bb3]@11 ~@7 [gb3,bb3]@3",
  C: "b3@2 [gb3,bb3] ab3@2 [eb3,gb3] [f3,ab3] [gb3,bb3], ab3@4 ~@5 f3@4 ~@11", D: "b3@3 ~, ab3@2 ~", E: "~@7 db3",
  F: "[ab3,b3]@2 ~ [ab3,b3]@13 ~@5 [ab3,b3]@2 ~", // Abm
  G: "[bb3,db4]@6 [ab3,b3]@3 [gb3,bb3]@5 ~ [f3,ab3]@3 [gb3,bb3]@3 [ab3,b3]@3", H: "g3@5 ~, eb4@17 ~@7",
})).s("gm_tenor_sax").gain(0.32).pan(0.8)

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

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

// drums · clap
const clap = s("cp").struct("<~@12 A@8 ~@8 A@6 ~@12 A@8 ~@8 A@7 B A@15 ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.44)

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

// drums · open hat
const open_hat = s("oh").struct("<~@3 A ~@15 B ~@11 B ~@5 A ~@15 B ~@11 B ~@11 B ~@3 B ~@4>".pickRestart({
  A: "~@3 x", B: "~@11 x",
})).gain(0.38)

// drums · crash
const crash = s("cr").struct("<~@12 A ~@15 A ~@17 A ~@15 A ~@7 A ~@7 A ~@6 A>".pickRestart({
  A: "x",
})).gain(0.33)

// drums · tambourine
const tambourine = s("tb").struct("<[~ x ~ x]!69 [~ x ~@2] [~ x ~ x]!15 ~>").gain(0.44)

stack(
  bass, piano, piano_soft, electric_guitar_muted, electric_guitar_muted_2, synth_strings_1, tenor_sax, kick, snare,
  clap, hihat, open_hat, crash, tambourine
)