From f1ac9c44433a52047d878a9e6638082a2bfe61e6 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 16 Apr 2022 10:03:00 +0100 Subject: [PATCH] perlin noise --- packages/core/signal.mjs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/core/signal.mjs b/packages/core/signal.mjs index fd924cbc..a2f0e4e4 100644 --- a/packages/core/signal.mjs +++ b/packages/core/signal.mjs @@ -1,6 +1,7 @@ import { Hap } from './hap.mjs'; import { Pattern, fastcat, reify, silence } from './pattern.mjs'; import Fraction from './fraction.mjs'; +import { id } from './util.mjs'; export function steady(value) { // A continuous value @@ -29,6 +30,8 @@ export const square2 = square._toBipolar(); export const tri = fastcat(isaw, saw); export const tri2 = fastcat(isaw2, saw2); +export const time = signal(id); + // random signals const xorwise = (x) => { @@ -75,3 +78,13 @@ export const chooseWith = (pat, xs) => { }; export const choose = (...xs) => chooseWith(rand, xs); + +export const perlinWith = (pat) => { + const pata = pat.fmap(Math.floor); + const patb = pat.fmap((t) => Math.floor(t) + 1); + const smootherStep = (x) => 6.0 * x ** 5 - 15.0 * x ** 4 + 10.0 * x ** 3; + const interp = (x) => (a) => (b) => a + smootherStep(x) * (b - a); + return pat.sub(pata).fmap(interp).appBoth(pata.fmap(timeToRand)).appBoth(patb.fmap(timeToRand)); +}; + +export const perlin = perlinWith(time);