working
This commit is contained in:
parent
b2f90ecb3b
commit
66828e17d3
6 changed files with 21 additions and 94 deletions
|
|
@ -5,7 +5,7 @@ This program is free software: you can redistribute it and/or modify it under th
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import createClock from './zyklus.mjs';
|
import createClock from './zyklus.mjs';
|
||||||
import { logger } from './logger.mjs';
|
import { errorLogger, logger } from './logger.mjs';
|
||||||
|
|
||||||
export class Cyclist {
|
export class Cyclist {
|
||||||
constructor({
|
constructor({
|
||||||
|
|
@ -76,7 +76,7 @@ export class Cyclist {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger(`[cyclist] error: ${e.message}`);
|
errorLogger(e);
|
||||||
onError?.(e);
|
onError?.(e);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,12 @@ let debounce = 1000,
|
||||||
lastMessage,
|
lastMessage,
|
||||||
lastTime;
|
lastTime;
|
||||||
|
|
||||||
|
export function errorLogger(e, origin = 'cyclist') {
|
||||||
|
//TODO: add some kind of debug flag that enables this while in dev mode
|
||||||
|
// console.error(e)
|
||||||
|
logger(`[${origin}] error: ${e.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
export function logger(message, type, data = {}) {
|
export function logger(message, type, data = {}) {
|
||||||
let t = performance.now();
|
let t = performance.now();
|
||||||
if (lastMessage === message && t - lastTime < debounce) {
|
if (lastMessage === message && t - lastTime < debounce) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import { NeoCyclist } from './neocyclist.mjs';
|
import { NeoCyclist } from './neocyclist.mjs';
|
||||||
import { Cyclist } from './cyclist.mjs';
|
import { Cyclist } from './cyclist.mjs';
|
||||||
import { evaluate as _evaluate } from './evaluate.mjs';
|
import { evaluate as _evaluate } from './evaluate.mjs';
|
||||||
import { logger } from './logger.mjs';
|
import { errorLogger, logger } from './logger.mjs';
|
||||||
import { setTime } from './time.mjs';
|
import { setTime } from './time.mjs';
|
||||||
import { evalScope } from './evaluate.mjs';
|
import { evalScope } from './evaluate.mjs';
|
||||||
import { register, Pattern, isPattern, silence, stack } from './pattern.mjs';
|
import { register, Pattern, isPattern, silence, stack } from './pattern.mjs';
|
||||||
|
|
@ -256,6 +256,6 @@ export const getTrigger =
|
||||||
await hap.context.onTrigger(hap, getTime(), cps, t);
|
await hap.context.onTrigger(hap, getTime(), cps, t);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger(`[cyclist] error: ${err.message}`, 'error');
|
errorLogger(err, 'getTrigger');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -349,39 +349,22 @@ export function getLfo(audioContext, begin, end, properties = {}) {
|
||||||
const lfoprops = {
|
const lfoprops = {
|
||||||
frequency: 1,
|
frequency: 1,
|
||||||
depth,
|
depth,
|
||||||
skew: .5,
|
skew: 0.5,
|
||||||
phaseoffset: 0,
|
phaseoffset: 0,
|
||||||
time: begin,
|
time: begin,
|
||||||
begin,
|
begin,
|
||||||
end,
|
end,
|
||||||
shape: getModulationShapeInput(shape),
|
shape: getModulationShapeInput(shape),
|
||||||
dcoffset,
|
dcoffset,
|
||||||
min: dcoffset - depth * 0.5,
|
min: dcoffset * depth,
|
||||||
max: dcoffset + depth * 0.5,
|
max: dcoffset * depth + depth,
|
||||||
curve: 1,
|
curve: 1,
|
||||||
...props,
|
...props,
|
||||||
}
|
};
|
||||||
|
|
||||||
console.info(lfoprops)
|
|
||||||
return getWorklet(audioContext, 'lfo-processor', lfoprops);
|
return getWorklet(audioContext, 'lfo-processor', lfoprops);
|
||||||
}
|
}
|
||||||
|
|
||||||
// export function getLfo(audioContext, time, end, properties = {}) {
|
|
||||||
// return getWorklet(audioContext, 'lfo-processor', {
|
|
||||||
// frequency: 1,
|
|
||||||
// depth: 1,
|
|
||||||
// skew: 0,
|
|
||||||
// phaseoffset: 0,
|
|
||||||
// time,
|
|
||||||
// begin: time,
|
|
||||||
// end,
|
|
||||||
// shape: 1,
|
|
||||||
// dcoffset: -0.5,
|
|
||||||
// ...properties,
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
export function getSyncedLfo(audioContext, time, end, cps, cycle, properties = {}) {
|
export function getSyncedLfo(audioContext, time, end, cps, cycle, properties = {}) {
|
||||||
const frequency = cycle / cps;
|
const frequency = cycle / cps;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -279,7 +279,7 @@ export function registerSynthSounds() {
|
||||||
getParamADSR(envGain.gain, attack, decay, sustain, release, 0, 1, begin, holdend, 'linear');
|
getParamADSR(envGain.gain, attack, decay, sustain, release, 0, 1, begin, holdend, 'linear');
|
||||||
let lfo;
|
let lfo;
|
||||||
if (pwsweep != 0) {
|
if (pwsweep != 0) {
|
||||||
lfo = getLfo(ac, begin, end, { frequency: pwrate, depth: pwsweep, skew: .5, dcoffset: 0 });
|
lfo = getLfo(ac, begin, end, { frequency: pwrate, depth: pwsweep });
|
||||||
lfo.connect(o.parameters.get('pulsewidth'));
|
lfo.connect(o.parameters.get('pulsewidth'));
|
||||||
}
|
}
|
||||||
let timeoutNode = webAudioTimeout(
|
let timeoutNode = webAudioTimeout(
|
||||||
|
|
|
||||||
|
|
@ -81,69 +81,7 @@ function getParamValue(block, param) {
|
||||||
}
|
}
|
||||||
return param[0];
|
return param[0];
|
||||||
}
|
}
|
||||||
// const waveShapeNames = Object.keys(waveshapes);
|
|
||||||
// class LFOProcessor extends AudioWorkletProcessor {
|
|
||||||
// static get parameterDescriptors() {
|
|
||||||
// return [
|
|
||||||
// { name: 'time', defaultValue: 0 },
|
|
||||||
// { name: 'end', defaultValue: 0 },
|
|
||||||
// { name: 'frequency', defaultValue: 0.5 },
|
|
||||||
// { name: 'skew', defaultValue: 0.5 },
|
|
||||||
// { name: 'depth', defaultValue: 1 },
|
|
||||||
// { name: 'phaseoffset', defaultValue: 0 },
|
|
||||||
// { name: 'shape', defaultValue: 0 },
|
|
||||||
// { name: 'dcoffset', defaultValue: 0 },
|
|
||||||
// ];
|
|
||||||
// }
|
|
||||||
|
|
||||||
// constructor() {
|
|
||||||
// super();
|
|
||||||
// this.phase;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// incrementPhase(dt) {
|
|
||||||
// this.phase += dt;
|
|
||||||
// if (this.phase > 1.0) {
|
|
||||||
// this.phase = this.phase - 1;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// process(inputs, outputs, parameters) {
|
|
||||||
// // eslint-disable-next-line no-undef
|
|
||||||
// if (currentTime >= parameters.end[0]) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// const output = outputs[0];
|
|
||||||
// const frequency = parameters['frequency'][0];
|
|
||||||
|
|
||||||
// const time = parameters['time'][0];
|
|
||||||
// const depth = parameters['depth'][0];
|
|
||||||
// const skew = parameters['skew'][0];
|
|
||||||
// const phaseoffset = parameters['phaseoffset'][0];
|
|
||||||
|
|
||||||
// const dcoffset = parameters['dcoffset'][0];
|
|
||||||
// const shape = waveShapeNames[parameters['shape'][0]];
|
|
||||||
|
|
||||||
// const blockSize = output[0].length ?? 0;
|
|
||||||
|
|
||||||
// if (this.phase == null) {
|
|
||||||
// this.phase = _mod(time * frequency + phaseoffset, 1);
|
|
||||||
// }
|
|
||||||
// // eslint-disable-next-line no-undef
|
|
||||||
// const dt = frequency / sampleRate;
|
|
||||||
// for (let n = 0; n < blockSize; n++) {
|
|
||||||
// for (let i = 0; i < output.length; i++) {
|
|
||||||
// const modval = (waveshapes[shape](this.phase, skew) + dcoffset) * depth;
|
|
||||||
// output[i][n] = modval;
|
|
||||||
// }
|
|
||||||
// this.incrementPhase(dt);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// registerProcessor('lfo-processor', LFOProcessor);
|
|
||||||
const waveShapeNames = Object.keys(waveshapes);
|
const waveShapeNames = Object.keys(waveshapes);
|
||||||
class LFOProcessor extends AudioWorkletProcessor {
|
class LFOProcessor extends AudioWorkletProcessor {
|
||||||
static get parameterDescriptors() {
|
static get parameterDescriptors() {
|
||||||
|
|
@ -185,8 +123,6 @@ class LFOProcessor extends AudioWorkletProcessor {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const output = outputs[0];
|
const output = outputs[0];
|
||||||
const frequency = parameters['frequency'][0];
|
const frequency = parameters['frequency'][0];
|
||||||
|
|
||||||
|
|
@ -194,11 +130,12 @@ class LFOProcessor extends AudioWorkletProcessor {
|
||||||
const depth = parameters['depth'][0];
|
const depth = parameters['depth'][0];
|
||||||
const skew = parameters['skew'][0];
|
const skew = parameters['skew'][0];
|
||||||
const phaseoffset = parameters['phaseoffset'][0];
|
const phaseoffset = parameters['phaseoffset'][0];
|
||||||
const min = parameters['min'][0];
|
|
||||||
const max = parameters['max'][0];
|
|
||||||
const curve = parameters['curve'][0];
|
const curve = parameters['curve'][0];
|
||||||
|
|
||||||
const dcoffset = parameters['dcoffset'][0];
|
const dcoffset = parameters['dcoffset'][0];
|
||||||
|
const min = parameters['min'][0];
|
||||||
|
const max = parameters['max'][0];
|
||||||
const shape = waveShapeNames[parameters['shape'][0]];
|
const shape = waveShapeNames[parameters['shape'][0]];
|
||||||
|
|
||||||
const blockSize = output[0].length ?? 0;
|
const blockSize = output[0].length ?? 0;
|
||||||
|
|
@ -210,8 +147,9 @@ class LFOProcessor extends AudioWorkletProcessor {
|
||||||
const dt = frequency / sampleRate;
|
const dt = frequency / sampleRate;
|
||||||
for (let n = 0; n < blockSize; n++) {
|
for (let n = 0; n < blockSize; n++) {
|
||||||
for (let i = 0; i < output.length; i++) {
|
for (let i = 0; i < output.length; i++) {
|
||||||
const modval = (waveshapes[shape](this.phase, skew) + dcoffset) * depth;
|
let modval = (waveshapes[shape](this.phase, skew) + dcoffset) * depth;
|
||||||
output[i][n] = clamp(Math.pow(modval, curve), min, max);
|
modval = Math.pow(modval, curve);
|
||||||
|
output[i][n] = clamp(modval, min, max);
|
||||||
}
|
}
|
||||||
this.incrementPhase(dt);
|
this.incrementPhase(dt);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue