Strudelify

Close to You

Fun Factory

KeyA minorTempo135 bpm
0:00/0:00
// Close to You — Fun Factory
// 135 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 120 bars on a 16-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 · synth bass 2 · "SAN BASS 2"
const bass = note(`<
  ~@17 A B A C A B A C A B A C A B A C A@3 C A@3 C A@3 C A@3 ~ A B A C A B A C A B A C A B A ~ A B A C A B A C A@3 C A@3
  D A B A C A B A C A B A C A B A ~ A B A C A B A ~@16
>`.pickRestart({
  A: "a1 ~ a1!3 ~ a1!3 ~ a1!3 ~ a1!2", B: "d2 ~ d2!3 ~ d2!3 ~ d2!3 ~ d2!2", C: "g1 ~ g1!3 ~ g1!3 ~ g1!3 ~ g1!2",
  D: "a1 ~@15",
})).s("gm_synth_bass_2").gain(0.48)

// other · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note(`<
  ~@17 A B A C A B A C A B A C A B A C ~@8 D@3 E D@3 ~@17 A B A C A B A C D@3 E D@3 ~ F G F H A B A C ~@31
>`.pickRestart({
  A: "a3@2 ~ a3!2 ~ a3!2 e4@2 a3 ~ a3!2 e4@2, ~@2 e4@2 ~ d4@2 ~@4 d4@2 ~@3",
  B: "a3@2 ~ a3!2 ~ a3!2 f4@2 a3 ~ a3!2 f4@2, ~@2 f4@2 ~ e4@2 ~@4 e4@2 ~@3",
  C: "g3@2 ~ g3!2 ~ g3!2 d4@2 g3 ~ g3!2 d4@2, ~@2 d4@2 ~ c4@2 ~@4 c4@2 ~@3",
  D: "a2 ~ a3!2 a2 ~ a3!2 a2 ~ a3!2 a2 ~ a3!2", E: "g2 ~ g3!2 g2 ~ g3!2 g2 ~ g3!2 g2 ~ g3!2",
  F: "a2@2 ~ a2!2 ~ a2!2 e3@2 a2 ~ a2!2 e3@2, ~@2 e3@2 ~ d3@2 ~@4 d3@2 ~@3",
  G: "a2@2 ~ a2!2 ~ a2!2 f3@2 a2 ~ a2!2 f3@2, ~@2 f3@2 ~ e3@2 ~@4 e3@2 ~@3",
  H: "g2@2 ~ g2!2 ~ g2!2 d3@2 g2 ~ g2!2 d3@2, ~@2 d3@2 ~ c3@2 ~@4 c3@2 ~@3",
})).s("gm_lead_2_sawtooth").gain(0.11).pan(0.4)

// chords · synth strings 2 · "SYN STR 2"
const synth_strings_2 = note(`<
  ~ A B A C A B A D A B A D A B A ~ A B A C A B A C E F E G E F E G ~@16 A B A C A B A C H I H J H I H J E F E G E F E G
  ~@12 E F E G A B A C A B A C H I H J H I H J K L K M K L K N K L K M O@3
>`.pickRestart({
  A: "[a3,c4,e4]", B: "[a3,d4,f4]", C: "[g3,b3,d4]", D: "e4 d4, [g3,b3]", E: "[a3,c4,a4,e5]", F: "[a3,d4,a4,f5]",
  G: "[g3,b3,g4,d5]", H: "[c4,e4]", I: "[d4,f4]", J: "[b3,d4]", K: "[a3,c4,e4,a4,e5]", L: "[a3,d4,f4,a4,f5]",
  M: "[g3,b3,d4,g4,d5]", N: "[e4,e5] [d4,d5], [g3,b3,g4]", O: "[[a3,c4,e4,a4,e5]@5 ~]/3",
})).s("gm_synth_strings_2").gain(0.11)

// chords · synth brass 1 · "SYNBRASS 1"
const synth_brass_1 = note("<~@57 A B C D A B C E ~@32 A B C D A B C E ~@15>".pickRestart({
  A: "[a4,c5,e5]@3 ~ [a4,c5,e5]@2 ~@4 [a4,c5,e5]@2 ~@2 [a4,d5,f5]@2", // Am Dm
  B: "~@2 [a4,d5,f5]@2 ~@2 [g4,b4,d5]@2 ~@2 [g4,b4,d5]@3 ~ g4 ~", // Dm G
  C: "[a4,c5,e5]@3 ~ [a4,c5,e5]@2 ~@4 [a4,c5,e5]@2 ~@2 [g4,b4,d5]@2", // Am G
  D: "~@2 [g4,b4,d5]@2 ~@2 [g4,b4,d5]@2 ~@2 [g4,b4,d5]@2 ~@2 g4 ~", E: "~ [g4,b4,d5] ~ [g4,b4,d5] ~ [g4,b4,d5] ~@2",
})).s("gm_synth_brass_1").gain(0.23).pan(0.6)

// other · epiano2 · "E.PIANO 2"
const epiano2 = note("<~@33 A B C@3 D E F D@2 C G H I J K ~@24 L@3 M L@3 N ~@39>".pickRestart({
  A: "a3!2 ~ a3 ~ a3 ~ a3 ~ a3!2 ~ a3 ~@2 a3", B: "a3 ~ a3!2 ~ a3 ~ a3 ~ a3 ~ a3!2 ~@2 a3",
  C: "a3!2 ~ a3 ~ a3 ~ a3 ~ a3 ~@2 a3 ~@2 a3", D: "a3!2 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~@3 a3",
  E: "a3!2 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3", F: "~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~ a3 ~@3 a3",
  G: "a3 ~ a3!4 ~ a3 ~ a3 ~@2 a3 ~@3", H: "a3!2 ~ a3!2 ~ a3!2 ~ a3!2 ~ a3!3 ~", I: "a3 ~ a3!2 ~@2 a3!3 ~ a3!2 ~@3 a3",
  J: "a3!4 ~ a3 ~ a3 ~ a3 ~ c4@3 ~@2", K: "~@2 c4 ~ c4 ~ c4 ~ c4 ~ c4 ~ a3@3 ~",
  L: "a3 ~ a3 ~ a3 ~ a3!2 ~ a3 ~ a3 ~ a3 ~@2", M: "~ a3!4 ~ a3 ~ a3 ~ a3!2 ~ a3 ~@2",
  N: "~ a3!4 ~ a3 ~ a3 ~ a3 c4 ~ a3 ~@2",
})).s("gm_epiano2").gain(0.2)

// chords · piano · "A.PIANO 1"
const piano = note("<~@49 A B A C A B A C A B A C A B A ~@25 A B A C A B A C A B A C A B A D ~@15>".pickRestart({
  A: "~@2 [a3,c4] ~@2 [a3,c4] ~@2 [a3,c4] ~@2 [a3,c4] ~@2 [a3,c4] ~", // Am
  B: "~@2 [a3,d4] ~@2 [a3,d4] ~@2 [a3,d4] ~@2 [a3,d4] ~@2 [a3,d4] ~", // D5
  C: "~@2 [b3,e4] ~@2 [b3,e4] ~@2 [b3,e4] ~@2 [b3,d4] ~@2 [b3,d4] ~", // E5 Bm
  D: "~@2 [b3,d4] ~@2 [b3,d4] ~@2 [b3,d4] ~@2 [b3,d4] ~@4", // Bm
})).s("gm_piano").gain(0.13).pan(0.6)

// drums · kick
const kick = s("bd").struct("<~@17 [x!4]!31 ~ [x!4]!31 ~ [x!4]!23 x ~@15>").gain(0.5)

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

// drums · hihat
const hihat = s("hh").struct("<~@9 [x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2]!104 ~@7>").gain(0.3)

// drums · open hat
const open_hat = s("oh").struct("<~@9 [~ x ~ x ~ x ~ x]!104 ~@7>").gain(0.2)

// drums · crash
const crash = s("cr").struct(`<
  ~@17 A ~@7 A ~@7 A ~@7 A ~@6 B A ~@7 A ~@3 A ~@3 A ~@7 A ~@6 A@2 ~@3 A ~@2 B A ~@3 A ~@3 A ~@3 A ~@3 A ~@14
>`.pickRestart({
  A: "x", B: "x!4",
})).gain(0.3)

// drums · vibraslap
const vibraslap = s("vibraslap:0").struct("<~@16 x ~@103>").gain(3.5)

// drums · cabasa
const cabasa = s("cabasa:4").struct("<~@9 A@24 ~@8 A@7 ~ A@31 ~ A@24 ~@15>".pickRestart({
  A: "x!16",
})).gain(0.75)

// drums · shaker
const shaker = s("sh").struct("<~@9 [~@3 x ~@3 x ~@3 x ~@3 x]!103 [~@3 x ~@3 x ~@3 x ~@4] ~@7>").gain(0.2)

stack(
  bass, lead_2_sawtooth, synth_strings_2, synth_brass_1, epiano2, piano, kick, snare, hihat, open_hat, crash, vibraslap,
  cabasa, shaker
)

More by Fun Factory