Strudelify

Moments In Love

Art of Noise

KeyA minorTempo86 bpm
0:00/0:00
// Moments In Love — Art of Noise
// 86 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: Full arrangement: all 89 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(86/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.

// other · cello · "Lead Cello"
const cello = note("<A B@2 C@7 D E F G@8 ~@16 H I H D J K L M H N J K H N O P ~@36>".pickRestart({
  A: "~@9 f3@7", B: "[~ e3@8 ~ c3@8 d3@8 f3@6]/2",
  C: "[~@3 g3@8 a3@8 ~ a3@8 f3@8 g3@8 ~ e3@8 f3@8 d3@8 ~ c3@17 d3@8 f3@8 e3@8 ~]/7", D: "g3 a3", E: "~ f3@8 g3@7",
  F: "~ e3@8 ~ d3@6", G: "[~@2 f3@8 ~ e3@8 g3@8 f3@8 ~ a3@8 a3@8 c4@8 ~ d4@67]/8", H: "d3 f3", I: "e3 c3", J: "a3 f3",
  K: "g3 e3", L: "f3 d3", M: "c3", N: "e3 g3", O: "f3 a3", P: "a3 c4",
})).s("gm_cello").gain(0.25).pan(0.3)

// chords · synth strings 1 · "Strings 1"
const synth_strings_1 = note(`<
  ~ A@2 B@2 C@2 D E@2 F G@2 H@8 I@4 J@2 K@2 I@4 J@2 K@2 I@4 J@2 K@2 I@4 J@2 K@2 ~ L M N O L M N O L M N O L M N O L M N
  O L M N O L M N O L M P@3 ~@2
>`.pickRestart({
  A: "[~ e3@17 f3@14, ~ a3@31]/2", B: "[~@3 c4@17 d4@12, ~@3 a3@29]/2", C: "[~@4 c4@17 f3@11, ~ a3@7]/2",
  D: "~@3 [e3,a3]@5", E: "[~@2 c5@4 ~ d5@8 a4@6 g4@2 [c3,e3,a4]@9, ~@7 [d3,f3]@17 ~@8]/2", F: "c5 e5 [d3,f3,d5]@2",
  G: "[~ a4@6 g4@2 [e3,a4]@17 [f3,d5]@6, ~@9 a3@23]/2", // A5 Dm
  H: "[~@2 g5@8 ~ e5@8 c5@8 d5@8 ~ a4@6 g4@2 [c4,e4,a4]@17 [d4,f4,a4]@67, ~@11 a3@34 ~@83, ~@11 c4@16 d4@17 ~@84]/8", // Am Dm
  I: "[[d3,f3] [c3,e3], a3]/2", J: "[[d3,f3] [e3,c4], a3]/2", K: "[[f3,d4] [e3,c4], a3]/2", L: "f3 d4, [d3,a3]",
  M: "a3 a2, [e3,c4]", N: "d3 d4, [a2,f3]", O: "[c4,e4] [e3,a4], a3",
  P: "[d3@4 d4@5 [c4,e4]@6 [e3,a4]@7 ~@2, [a2,f3]@9 a3@13 ~@2]/3", // C A5 Dm
})).s("gm_synth_strings_1").gain(0.19).pan(0.8)

// other · tubular bells · "Tubular Bell"
const tubular_bells = note("<A ~ B@2 C@2 D@2 E@2 F@2 G@2 H@2 I@5 ~@65 J@3>".pickRestart({
  A: "d4", B: "[~@2 d4@17 ~@13]/2", C: "[~@4 d4@17 ~@11]/2", D: "[~@5 d4@17 ~@10]/2", E: "[~@7 d4@17 ~@8]/2",
  F: "[~@8 d4@17 ~@7]/2", G: "[~@10 d4@17 ~@5]/2", H: "[~@11 d4@17 ~@4]/2", I: "[~@13 d4@17 d4@16 d4@17 d4@17]/5",
  J: "[~@3 d4@8 ~]/3",
})).s("gm_tubular_bells").gain(0.57)

// bass · synth bass 1 · "Bass"
const bass = note(`<
  ~@21 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 C A B A C ~ D E D E D E D E D E D E D E D E D E D E D E D E
  D E D E D E F G H@3
>`.pickRestart({
  A: "d2 ~ d2!2", B: "a1 ~ a1!2", C: "e2 ~ e2!2", D: "d2@3 d2 a2@3 g2", E: "a2@3 a2 ~ a2 ~ a2", F: "d2@6 d2@2 a2@7 ~",
  G: "g2@2 a2@8 ~ a2@3 ~@2", H: "[~ a2@3 ~@4 a2@4 d1@32 ~@4]/3",
})).s("gm_synth_bass_1").gain(0.57)

// chords · pad halo · "SFX1"
const pad_halo = note("<~@29 A B C D E F G H ~@8 I J K L M N O P ~@36>".pickRestart({
  A: "d4 f4 a4 d5@3 e5 f5", B: "e5@3 e5 c5 a4 c5 e5", C: "d5@2 ~@2 d5!3 ~@2 d5!3 ~@2 d5!2", D: "e5 ~",
  E: "d5 ~@2 d5!3 ~@2 d5 ~@2 d5 ~@2 d5!2", F: "e5 ~ e5!2", G: "d5 a4 f4 a4 d5 a4 f4 a4", H: "c5",
  I: "[d4,f4] [f4,a4] [a4,d5] [d5,f5]@3 [c5,e5] [d5,f5]", J: "[c5,e5]@3 [c5,e5] [g4,c5] [e4,a4] [g4,c5] [c5,e5]",
  K: "[d5,f5]@2 ~@2 [d5,f5]!3 ~@2 [d5,f5]!3 ~@2 [d5,f5]!2", L: "a5, e5 ~",
  M: "[d5,f5] ~@2 [d5,f5]!3 ~@2 [d5,f5] ~@2 [d5,f5] ~@2 [d5,f5]!2", N: "[c5,e5]@4 ~@4 [c5,e5]@4 c5!4, ~@3 e5",
  O: "a4 f4 d5 f5 a4 d5 f4 d4 a4 f4 d5 f5 d5 f5 d5 f5, d5 a4 f4 a4 d5 a4 f4 a4", P: "[c5,e5]",
})).s("gm_pad_halo").gain(0.32)

// chords · orchestra hit · "SFX2"
const orchestra_hit = note("<~@54 A ~@7 A ~@7 B C D C D C D C B E D E D E F G@3 ~>".pickRestart({
  A: "[d4,f4,a4]", B: "[d4,f4]@2 ~@2 [f4,a4]@2 ~ [d4,g4]", C: "[c4,a4] ~@7", D: "[d4,f4] ~@3 [f4,a4] ~@2 [d4,g4]",
  E: "[d4,a4] ~@7", F: "[d4,f4] ~@3 [f4,a4] ~@3", G: "[[d4,g4] [c4,a4]@13 [d4,f4,a4]@4 ~@6]/3",
})).s("gm_orchestra_hit").gain(0.4)

// bass · electric bass finger · "Bass 2"
const bass_2 = note("<~@54 A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B C D@2 ~@2>".pickRestart({
  A: "d2!2 ~@6 d2 ~@2 d2 a2@2 f2 ~", B: "c2!2 ~@6 c2!3 ~ c2!3 ~", C: "d2!2 ~@6 d2 ~@3 d2 a2@2 ~",
  D: "[f2 ~ c2 ~ c2 ~@9 c2 c2@2 c2@2 ~@2 c2 c2@2 c2@2 ~@6]/2",
})).s("gm_electric_bass_finger").gain(0.48).pan(0.3)

// other · woodblock · "SFX4"
const woodblock = note("<~@62 A B ~@6 A B ~@2 A B ~@2 A B ~@2 A B ~@5>".pickRestart({
  A: "e5 [c5,d5] [a4,b4] [f4,g4] [d4,e4] [b3,c4] [g3,a3] [e3,f3] [c3,d3] [a2,b2] [f2,g2] [d2,e2] [b1,c2] [g1,a1] [e1,f1] [c1,d1]", // Csus2 Asus2 Fsus2 Dsus2 Cmaj7 Gsus2 Fmaj7 Csus2 …
  B: "b0 ~@15",
})).s("gm_woodblock").gain(0.4)

// other · acoustic guitar steel · "Guitar 1"
const acoustic_guitar_steel = note("<~@78 A B A B A B C D E ~@2>".pickRestart({
  A: "d4 a3 d4 a3 d4 a3 d4 a3", B: "e4 a3 e4 a3 e4 a3 e4 a3", C: "d4@2 a3@2 d4@2 a3@2 d4@2 ~ a3@2 d4@2 ~",
  D: "a3@2 e4@3 a3@3 e4@3 a3@3 e4@2", E: "~ a3@3 ~ e4@3 a3@4 ~@4",
})).s("gm_acoustic_guitar_steel").gain(0.4).pan(0.8)

// drums · kick
const kick = s("bd").struct(`<
  ~@21
  [x ~@3 x!2 ~@2]!32
  ~
  [x!2 ~@3 x ~@2]!30
  [x ~ x ~@8 x ~@4]
  [~@2 x ~@2 x ~@10]
  [~ x ~@10 x ~@3]
  ~@2
>`).gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  ~@21 A@32 B C D C D C D C D C D C D C D C D C D C D C D C D C D C D C D E F G ~@2
>`.pickRestart({
  A: "~@4 x ~@7 x ~ x!2", B: "x!4", C: "~@4 x ~@2 x ~ x ~@2 x ~ x!2", D: "~@4 x ~@2 x ~ x ~@2 x ~ x ~",
  E: "x ~@3 x ~@2 x!2 ~ x!2 ~ x ~@2", F: "x!3 ~@2 x ~@2 x!2 ~ x!2 ~ x!2", G: "~ x ~ x ~ x!8 ~@3",
})).gain(0.4)

// drums · splash
const splash = s("cr").struct("<~@54 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 B ~@2>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.4)

// drums · ride
const ride = s("rd").struct("<~@54 A ~@7 A ~@7 A ~@3 A ~@3 A ~@3 A ~@3 B ~@2>".pickRestart({
  A: "x", B: "~@3 x",
})).gain(0.4)

// drums · congas
const congas = s("conga:18").struct(`<
  ~@54 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 C A B D E F ~@2
>`.pickRestart({
  A: "~@4 x ~@3 x ~ x!3 ~ x ~", B: "~@4 x ~@3 x ~ x!3 ~ x!2", C: "~@4 x ~ x!3 ~ x!2 ~ x!3",
  D: "~@4 x ~@3 x ~@2 x!3 ~@2", E: "x ~@7 x ~@2 x!2 ~ x ~", F: "~ x ~ x ~@2 x ~ x ~ x ~@5",
})).gain(1.27)

// drums · congas
const congas_2 = s("conga:33").struct("<~@54 A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@3 B A@2 C D E ~@2>".pickRestart({
  A: "x!3 ~@10 x ~@2", B: "x!3 ~@6 x ~@2 x ~@3", C: "x!3 ~@11 x ~", D: "~@2 x ~ x!2 ~@9 x", E: "~@5 x ~@10",
})).gain(1.27)

stack(
  cello, synth_strings_1, tubular_bells, bass, pad_halo, orchestra_hit, bass_2, woodblock, acoustic_guitar_steel, kick,
  snare, splash, ride, congas, congas_2
)