notebook/strudel/fadein sample code.md
2025-11-27 15:14:35 +09:00

1.5 KiB

// @title fading @by ACorp
// @license 0BSD

setCpm(60 / 2)

const latch = (f) => {
  let start = undefined;
  return signal((t) => {
    start = start ?? t;
    return f(t - start);
  });
}

const ramp = (cycles) => latch((t) => Math.min(t / cycles, 1));
const iramp = (cycles) => latch((t) => Math.max(1 - t / cycles, 0));
register('fadein', function(cycles, gainstart, gainstop, pat) {
  return pat.gain(ramp(cycles).range(gainstart, gainstop));
})

const shush = [Math.pow(2,32)-1, silence];

const chords = chord("<CM9 Am7 Dm9 Gm7>").voicing()
const nchords = p => n(p).chord("<CM9 Am7 Dm9 Gm7>").voicing()
const i1 = chords.s("supersaw").lpf(800)
  .ph(3).phd(1).phc(4000).room(2)

const parts = [20, 32, 8, 80]
const sparts = (start, stop) => parts
  .slice(start, stop + 1)
  .reduce((sum, val) => sum + val, 0);


i1$: arrange(
  [sparts(0,1), i1.fadein(parts[0], 0.2,1)],
  [parts[2], silence],
  [parts[3], i1],
  shush
)

const i2 = nchords("[3,4] - - -").s("square,pulse")
  .decay(0.2).release(0.4)
  .lpf(1600).gain(0.6)

i2$: arrange(
  [parts[0],silence],
  [sparts(1,3), i2],
  shush
)

const i3 = nchords("1,2")
  .struct("1 0 1 1 0 1 1 0")
  .s("tri,pulse")
  .ply("2 0 1 2 1 2 2 0")

i3$: arrange(
  [parts[0],silence],
  [sparts(1,3), i3.fadein(parts[1], 0.2,1.2)],
  shush
)

const i4 = nchords(irand(4).seg(8).add(2))
  .mask("1 <[0 1] 1> 1 <0 [1 0] [1 0 1] 1> 1")
  .s("gm_piano").n("0,1")
  .lpf(2000).rarely(x=>x.ply("2"))

i4$: arrange(
  [sparts(0,2), silence],
  [parts[3], i4],
  shush
)

all(x=>x.postgain(0.8))