Strudelify

Maitresse

Images

KeyD♭ majorTempo120 bpm
0:00/0:00
// Maitresse — Images
// 120 bpm, 4/4, key C# major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Full arrangement: all 93 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 · [...]/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 · acoustic bass · "ACOU BASS"
const bass = note(`<
  ~ A B A B A B A C D E F G H E F G H I J I K L M I J I K L N O P E F G E@2 Q R E@2 F G E@2 F G H I J I K L N O P E F G
  E@2 Q R E@2 F G E@2 F G S T U V W A B A B A B A X D E F G E Y Q R E
>`.pickRestart({
  A: "db3@2 db3@2 db3@3 db3!2 db4@2 bb2 db3@2 bb2 db3", B: "b2@2 b2@2 b2@3 b2 bb2 bb3@2 bb2 bb2@2 ab2 bb2",
  C: "b2@2 b2@2 b2@3 b2 bb2 bb3@2 bb2 bb2@2 bb3 ~", D: "c3@2 c3@2 ~ c3@3 c3@4 ~@4",
  E: "db3@4 db3@3 db3!2 db4@2 db3 db3@2 ab2 bb2", F: "gb2@4 gb2@3 gb2!2 gb3@2 gb2 gb2@2 ab2 bb2",
  G: "b2@4 b2@3 b2!2 b3@2 b2 b2@2 b2 eb3", H: "db3@4 db3@3 db3!2 db4@2 db3 db3@2 bb2@2", I: "db3@7 db3 ab2@4 ab2@4",
  J: "bb2@7 bb2 gb2@2 f2@2 gb2@2 db3 eb3", K: "gb2@2 gb2@2 ab2@2 ab2@2 db3@3 db4 ~ db3 db3@2",
  L: "gb2@7 gb2 gb2@4 gb2@2 gb2!2", M: "db3 eb3!2 eb4@2 eb3 eb3@2 ab2@2 gb2@2 ab2@2 db3 eb3",
  N: "ab2@7 ab2 ab2@2 ab2@2 ab2@2 f2@2", O: "bb2@7 bb2 bb2@4 bb2@2 bb3 c4", P: "eb3@2 eb3@2 ~@5 eb3@3 f3@4",
  Q: "b2@4 b2@3 b2!2 b3@2 b2 b2@2 ab2@2", R: "gb2@2 ab2 bb2@2 db3 eb3@2 gb3@2 ~@2 b2@4",
  S: "db3@4 db3@3 db3!2 db4@2 db3 db3@4", T: "gb2@7 gb2 gb2@2 gb2@2 gb2@2 bb2@2", U: "b2@6 ~ b2 b2@2 db3@2 b2@2 b2 db3",
  V: "e3@4 b2 db3 eb3 b2", W: "gb2@7 db3 gb2@4 gb2@4", X: "b2@2 b2@2 b2@3 b2 bb2 bb3@2 bb2 bb2@2 bb2@2",
  Y: "db3@4 db3@3 db3!2 db4@2 db3 db3@2 ab2 b2",
})).s("gm_acoustic_bass").gain(0.39)

// chords · drawbar organ · "ORGAN 1"
const drawbar_organ = note(`<
  ~ A B@2 C A D A D E F G H F@2 G H I J@2 K L M N J@2 K L M O P Q R S@2 T@2 U V R F G H F@2 G H I J@2 K L M O P Q R S@2
  T@2 U V R F G H I F G H F W X Y W A B@2 Z A AA A AB E R S@2 AC@2 AD@2 R
>`.pickRestart({
  A: "[f4,ab4,db5]", B: "[[eb4,b4] bb4 [f4,ab4]@2, gb4 ~, ~ db4@3]/2", C: "[eb4,b4]@4 [db4,bb4]@2 ~ [db5,db6], gb4@3 ~",
  D: "[eb4,gb4,b4]@8 [db4,gb4,bb4]@4 ~ [db5,db6]@2 [db5,db6]", E: "[eb4,ab4,c5]@3 ~", F: "[db4,f4,ab4]@3 ~",
  G: "[db4,gb4,bb4]@3 ~", H: "[b3,eb4,gb4]@3 ~", I: "[db4,f4,ab4]@6 ~ [db5,db6]",
  J: "[[f4,ab4,db5] [eb4,c5] [db4,f4] [db4,gb4], ~ ab4@2 ~, ~ bb4]/2", K: "[f4,ab4,db5] [c4,eb4,ab4]",
  L: "[db4,gb4,bb4] [c4,eb4] [db4,f4]@2, ~ ab4@3", M: "[db4,gb4] [gb4,db5], bb4", N: "[eb4,bb4,db5] [eb4,ab4,c5], gb4",
  O: "[eb4,gb4,ab4,c5]!2", P: "[eb4,f4,bb4] [d4,f4,bb4]", Q: "[eb4,g4,bb4] [f4,a4,c5]", R: "[db4,f4,ab4]",
  S: "[[db4,bb4] [b3,eb4], gb4]/2", T: "[[db4,f4]@7 ~, ab4]/2", U: "[b3,gb4], eb4@3 ~",
  V: "[bb3,db4,gb4]@2 ~ [b3,eb4,gb4]", W: "[db4,gb4,bb4]", X: "[b3,eb4,gb4]", Y: "[b3,e4,ab4] [b3,eb4,gb4]",
  Z: "[eb4,b4]@8 [db4,bb4]@4 ~ [db5,db6]@2 [db5,db6], gb4@3 ~", AA: "[eb4,gb4,b4]@4 [db4,gb4,bb4]@2 ~ [db5,db6]",
  AB: "[eb4,gb4,b4] [db4,gb4,bb4]", AC: "[db4,f4,ab4]/2", AD: "[[b3,eb4]@4 [bb3,db4]@2 ~ [b3,eb4,gb4], gb4@3 ~]/2",
})).s("gm_drawbar_organ").gain(0.33)

// other · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  ~ A B A B A B A B ~ C D E F C D G H ~@22 C D E F C D G H ~@16 C D E F C D G H ~@4 A B A B A B A B ~@9
>`.pickRestart({
  A: "db4!2 db4@2 db4@4 ~@6 ab3 bb3", B: "b3!2 b3@2 b3@4 ~@8", C: "db4@3 f4@2 ab4@3 db5@4 ab4@4",
  D: "bb4@3 ab4 gb4@4 ~@8", E: "b3@3 eb4@2 gb4@3 gb4@4 b4@4", F: "ab4 ~@3", G: "b3@3 eb4@2 gb4@3 gb4@4 [b4,eb5]@4",
  H: "[ab4,db5] ~@3", // Db5
})).s("gm_synth_strings_1").gain(0.46)

// other · brass section · "BRASS 1"
const brass_section = note("<~@4 A ~ B ~@10 A ~@18 C D ~ E ~@7 A ~@12 C D ~ F ~@15 G ~ A ~@6 H C I ~ E>".pickRestart({
  A: "~@14 [db5,db6] ~", B: "~@13 [db5,db6] ~ [db5,db6]", C: "~@14 [f5,f6] ~", D: "~@11 [b4,b5]!3 [eb5,eb6] ~",
  E: "~ [bb4,bb5] [db5,db6] [eb5,eb6] [f5,f6] [eb5,eb6] [db5,db6] [bb4,bb5] [db5,db6]!2 ~ [eb5,eb6]!2 ~ [db5,db6] ~", // Bb Db Eb F Eb Db Bb Db …
  F: "~ [bb4,bb5] [db5,db6] [eb5,eb6] [f5,f6] [eb5,eb6] [db5,db6] [bb4,bb5] [db5,db6] ~@2 [eb5,eb6] ~@2 [db5,db6] ~", // Bb Db Eb F Eb Db Bb Db …
  G: "~@14 [db5,db6]!2", // Db
  H: "~ [bb4,bb5] [db5,db6] [eb5,eb6] [f5,f6] [eb5,eb6] [db5,db6] [bb4,bb5] [db5,db6]!2 ~ [db5,db6] ~@4", // Bb Db Eb F Eb Db Bb Db
  I: "~@11 [b4,b5]!2 ~ [eb5,eb6] ~", // B Eb
})).s("gm_brass_section").gain(0.48)

// other · acoustic guitar nylon · "NYLON GTR"
const acoustic_guitar_nylon = note(`<
  ~ A@8 ~ A B C A@2 B C A ~@15 B ~ A ~@4 A B C A@2 B C A ~@16 A B C A@2 B C A ~@4 A@8 ~@9
>`.pickRestart({
  A: "ab4!2 db5@2 ab4@2 f4 db4@2 db4 db4@2 eb4@2 f4@2", B: "gb4!2 db5@2 bb4@2 gb4 db4@2 db4 db4@2 eb4@2 f4@2",
  C: "ab4!2 db5@2 ab4@2 b3 b3@2 b3 b3@2 db4@2 eb4@2",
})).s("gm_acoustic_guitar_nylon").gain(0.36)

// chords · electric guitar muted · "MUTED GTR"
const electric_guitar_muted = note("<~@18 A B A C D E A B A C D F G H ~@16 A B A C D F G H ~@37>".pickRestart({
  A: "~ [db4,f4,ab4]!2 [db4,f4,ab4]@2 [db4,f4,ab4] [db4,f4,ab4]@2 ~ [c4,eb4,ab4]!2 [c4,eb4,ab4]@2 [c4,eb4,ab4] [c4,eb4,ab4]@2", // Db Ab
  B: "~ [db4,f4,ab4,bb4]!2 [db4,f4,ab4,bb4]@2 [db4,f4,ab4,bb4] [db4,f4,ab4,bb4]@2 ~ [db4,gb4,bb4]!2 [db4,gb4,bb4]@2 [db4,gb4,bb4] [db4,gb4,bb4]@2", // Bbm7 Gb
  C: "~ [db4,gb4,bb4]!3 ~ [c4,eb4,ab4] [c4,eb4,ab4]@2 ~ [db4,f4,ab4]!5 [db4,f4,ab4]@2", // Gb Ab Db
  D: "~ [db4,gb4,bb4]!2 [db4,gb4,bb4]@2 [db4,gb4,bb4] [db4,gb4,bb4]@2 ~ [gb4,bb4,db5]!2 [gb4,bb4,db5]@2 [gb4,bb4,db5] [gb4,bb4,db5]@2", // Gb
  E: "~ [eb4,gb4,bb4,db5]!2 [eb4,gb4,bb4,db5]@2 [eb4,gb4,bb4,db5] [eb4,gb4,bb4,db5]@2 ~ [eb4,gb4,ab4,c5]!2 [eb4,gb4,ab4,c5]@2 [eb4,gb4,ab4,c5] [eb4,gb4,ab4,c5]@2", // Ebm7 Ab7
  F: "~ [eb4,gb4,ab4,c5]!2 [eb4,gb4,ab4,c5]@2 [eb4,gb4,ab4,c5] [eb4,gb4,ab4,c5]@2 ~ [eb4,gb4,ab4,c5]!2 [eb4,gb4,ab4,c5]@2 [eb4,gb4,ab4,c5] [eb4,gb4,ab4,c5]@2", // Ab7
  G: "~ [eb4,f4,bb4]!2 [eb4,f4,bb4]@2 [eb4,f4,bb4] [eb4,f4,bb4]@2 ~ [d4,f4,bb4]!5 [d4,f4,bb4]@2", // Ebsus2 Bb
  H: "~ [eb4,g4,bb4]!2 [eb4,g4,bb4]@2 [eb4,g4,bb4] [eb4,g4,bb4]@2 ~ [f4,a4,c5]!2 [f4,a4,c5]@2 [f4,a4,c5] [f4,a4,c5]@2", // Eb F
})).s("gm_electric_guitar_muted").gain(0.21)

// drums · kick
const kick = s("bd").struct("<~@92 [~@15 x]>").gain(0.36)

// drums · snare
const snare = s("sd").struct(`<
  ~ A@12 B A@3 C A@9 D A@7 E A@3 F A@7 G A@3 D A@7 E A@3 F A@7 G A@3 H A@16 I
>`.pickRestart({
  A: "~ x ~ x", B: "~@4 x ~@7 x ~ x!2", C: "~@4 x ~@4 x!3 ~ x!2 ~", D: "~@4 x ~@7 x ~@2 x", E: "~@2 x ~@3 x!2",
  F: "~@2 x ~@2 x!2 ~", G: "~@4 x ~@6 x!2 ~ x!2", H: "~@4 x ~@5 x!2 ~@2 x!2", I: "~@2 x ~@2 x ~ x",
})).gain(0.36)

// drums · low tom
const low_tom = s("lt").struct("<~@75 [~@12 x!2 ~@2] ~@16 [~@12 x!2 ~@2]>").gain(0.36)

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

// drums · mid tom
const mid_tom = s("mt").struct(`<
  ~ A B@7 C A B@2 D B@3 E F@3 G F H I F@7 I F@2 G F@2 H J I F@2 K F@3 L I F@7 I F@2 G F@2 H J I F@2 K F@3 L A B@2 E B@9
  A B@3 A B M A
>`.pickRestart({
  A: "~@2 x!6", B: "x!8", C: "x ~ x ~ x!2 ~@2 x ~@3 x ~@3", D: "x!6 ~ x", E: "x!5 ~@3", F: "x!16", G: "x!13 ~ x ~",
  H: "x!12 ~@4", I: "~@4 x!12", J: "~@4 x!4 ~@8", K: "x!15 ~", L: "x ~ x ~ x ~ x!2", M: "x!6 ~@2",
})).gain(0.21)

// drums · open hat
const open_hat = s("oh").struct("<~ A@3 ~@6 A@8 ~@14 A@16 ~@8 A@16 ~@4 A@3 ~@6 A@8>".pickRestart({
  A: "~ x ~@6",
})).gain(0.36)

// drums · high tom
const high_tom = s("ht").struct(`<
  ~ A ~@8 A ~@12 B A ~@7 A ~@5 B A@2 ~@7 A ~@7 A ~@5 B A@2 ~@7 A ~@3 A ~@8 A ~@3 A ~ B A
>`.pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.36)

// drums · bongos
const bongos = s("bongo:4").struct("<A ~@3 B@2 C ~@2 D ~@69 B ~ E ~@11>".pickRestart({
  A: "~@10 x!3 ~@3", B: "~@9 x!4 ~ x ~", C: "~@9 x!5 ~ x", D: "~@9 x!4 ~@3", E: "~@10 x!3 ~ x ~",
})).gain(0.94)

// drums · bongos
const bongos_2 = s("bongo:18").struct("<[~@7 x] ~@92>").gain(0.94)

stack(
  bass, drawbar_organ, synth_strings_1, brass_section, acoustic_guitar_nylon, electric_guitar_muted, kick, snare,
  low_tom, hihat, mid_tom, open_hat, high_tom, bongos, bongos_2
)