synthing

a waveform sequencing synth on the web
Log | Files | Refs | Submodules

helpers.js (2938B)


      1 const partial = (f, ...args) => (...moreArgs) => f(...args, ...moreArgs);
      2 const oneTime = (target, type, handler) => {
      3     const doOnce = (ev) => {
      4         target.removeEventListener(type, doOnce);
      5         handler(ev);
      6     }
      7     target.addEventListener(type, doOnce);
      8 }
      9 
     10 export default {
     11     partial,
     12     oneTime,
     13     linear: (m, x, b) => (m * x) + b,
     14     bounded: (val, min, max) => {
     15         if (min !== undefined && min !== null && val < min) {
     16             return min;
     17         }
     18         else if (max !== undefined && max !== null && val > max) {
     19             return max;
     20         }
     21         else
     22             return val;
     23     },
     24     scale: (buf, amt) => buf.map(val => val * amt),
     25     add: (arr1, arr2) => arr1.map((v, i) => v + arr2[i]),
     26     soon: (fn, ms=0) => {
     27         return (...args) =>
     28         window.setTimeout(partial(fn, ...args), ms);
     29     },
     30     throttle: (fn, ms, performFinalCall) => {
     31         let time = 0;
     32         let finalCall = null;
     33         return (...args) => {
     34             let now = Date.now();
     35             if (finalCall)
     36                 window.clearTimeout(finalCall);
     37             if (now >= time + ms) {
     38                 fn(...args);
     39                 time = now;
     40             }
     41             else if (performFinalCall) {
     42                 finalCall = window.setTimeout(() => {
     43                     fn(...args);
     44                 }, time - now - ms);
     45             }
     46         }
     47     },
     48     clickNDrag: (el, onDown, onMove, onUp, moveEl=document) => {
     49         el.addEventListener('mousedown', (downEv) => {
     50             downEv.preventDefault();
     51             if (onMove) {
     52                 moveEl.addEventListener('mousemove', onMove);
     53             }
     54             onDown && onDown(downEv);
     55             oneTime(moveEl, 'mouseup', (upEv) => {
     56                 onUp && onUp(upEv);
     57                 if (onMove) {
     58                     moveEl.removeEventListener('mousemove', onMove)
     59                 }
     60             });
     61         })
     62     },
     63     boolArray: {
     64         setLength: (ba, newLength) => {
     65             let newBa = ba.slice(0, newLength);
     66             if (ba.length < newLength) {
     67                 newBa = newBa.concat(new Array(newLength - ba.length).fill(false));
     68             }
     69             return newBa;
     70         }, create: (length) => {
     71             return new Array(length).fill(false);
     72         },
     73         update: (ba, idx, val) => {
     74             const newBa = ba.slice();
     75             newBa[idx] = val;
     76             return newBa;
     77         }
     78     },
     79     immObjArray: {
     80         update: (arr, idx, opts) => {
     81             const newArr = arr.slice();
     82             newArr[idx] = Object.assign({}, arr[idx], opts)
     83             return newArr;
     84         },
     85         add: (arr, idx, opts) => {
     86             const newArr = arr.slice();
     87             newArr.splice(idx, 0, opts);
     88             return newArr;
     89         },
     90         remove: (arr, idx) => {
     91             const newArr = arr.slice();
     92             newArr.splice(idx, 1);
     93             return newArr;
     94         }
     95     }
     96 };