delete now obsolete poc

This commit is contained in:
Felix Roos 2024-03-22 00:46:08 +01:00
parent ba8f996103
commit 7889017434
7 changed files with 3 additions and 311 deletions

View file

@ -1,24 +0,0 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View file

@ -1,14 +0,0 @@
# worker-repl
This is a poc for a more precise version of cyclist, fixing the clock jitter on chrome.
It is also an experiment to use the `worker-timers` lib to test scheduling in inactive windows,
but not the reason why it works. You can comment out the import from `worker-timers` and it still works precisely..
I am not 100% sure why it works + the poc also doesn't implement cps yet..
run it with:
```sh
pnpm i
pnpm dev
```

View file

@ -1,13 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Worker REPL</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/main.js"></script>
<p>click somewhere...</p>
</body>
</html>

View file

@ -1,76 +0,0 @@
import { createClock, seq } from '@strudel/core';
import { getAudioContext, initAudioOnFirstClick, samples, superdough } from 'superdough';
import { setInterval, clearInterval } from 'worker-timers'; // comment out this line to test with window.setInterval
let loaded = samples('github:tidalcycles/dirt-samples');
async function run() {
//let pat = seq('hh').s().fast(25.2);
let pat = seq('bd', ['hh', 'hh'], 'jvbass').s().fast(1.92);
await initAudioOnFirstClick();
await loaded;
const ctx = getAudioContext();
let last = 0;
let cps = 0.6;
let num_ticks_since_cps_change = 0;
let num_cycles_at_cps_change = 0;
let seconds_at_cps_change;
let latency = 0.1;
function setCps(_cps) {
if (_cps === cps) {
return;
}
cps = _cps;
num_ticks_since_cps_change = 0;
}
const clock = createClock(
() => ctx.currentTime,
(phase, duration, tick, t) => {
if (num_ticks_since_cps_change === 0) {
console.log('changed cps..!!', cps);
num_cycles_at_cps_change = last;
seconds_at_cps_change = phase;
}
num_ticks_since_cps_change++;
const seconds_since_cps_change = num_ticks_since_cps_change * duration;
const num_cycles_since_cps_change = seconds_since_cps_change * cps;
const [begin, end] = [last, (last = num_cycles_at_cps_change + num_cycles_since_cps_change)];
console.log(
'q',
begin.toFixed(2),
end.toFixed(2),
phase.toFixed(2),
'#',
(end - begin).toFixed(2),
duration.toFixed(2),
);
pat
.queryArc(begin, end, { _cps: cps })
.filter((h) => h.hasOnset())
.forEach((hap) => {
const deadline = (hap.whole.begin - num_cycles_at_cps_change) / cps + seconds_at_cps_change + latency;
superdough(hap.value, '=' + deadline);
});
},
0.025, // duration of each cycle
0.1, // interval between callbacks
0.4, // overlap between callbacks
setInterval,
clearInterval,
false,
);
clock.start();
setTimeout(() => {
console.log('change cps!!!!!!!!!!!!!!!!!!!!');
setCps(1.2);
}, 6000);
setTimeout(() => {
clock.stop();
}, 12000);
}
run();

View file

@ -1,19 +0,0 @@
{
"name": "worker-repl",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"vite": "^5.2.0"
},
"dependencies": {
"@strudel/core": "workspace:*",
"superdough": "workspace:*",
"worker-timers": "^7.1.4"
}
}

View file

@ -1,116 +0,0 @@
// used to consistently schedule events
const createClock = (
getTime,
callback, // called slightly before each cycle
duration = 0.05, // duration of each cycle
interval = 0.1, // interval between callbacks
overlap = 0.1, // overlap between callbacks
) => {
let tick = 0; // counts callbacks
let phase = 0; // next callback time
let precision = 10 ** 4; // used to round phase
let minLatency = 0;
const setDuration = (setter) => (duration = setter(duration));
overlap = overlap || interval / 2;
const onTick = () => {
const t = getTime();
const lookahead = t + interval + overlap; // the time window for this tick
if (phase === 0) {
phase = t + minLatency;
}
// callback as long as we're inside the lookahead
while (phase < lookahead) {
// phase = Math.round(phase * precision) / precision;
phase >= t && callback(phase, duration, tick, t);
phase < t && console.log('TOO LATE', phase); // what if latency is added from outside?
phase += duration; // increment phase by duration
tick++;
}
};
let intervalID;
const start = () => {
clear(); // just in case start was called more than once
onTick();
intervalID = setInterval(onTick, interval * 1000);
};
const clear = () => intervalID !== undefined && clearInterval(intervalID);
const pause = () => clear();
const stop = () => {
tick = 0;
phase = 0;
clear();
};
const getPhase = () => phase;
// setCallback
return { setDuration, start, stop, pause, duration, interval, getPhase, minLatency };
};
onmessage = async function (e) {
console.log('Worker: Message received from main script', e);
/* const { seq } = await import('@strudel/core');
let pat = seq('bd').fast(4).s(); */
if (!e.data.origin) {
console.log('no origin');
return;
}
console.log('start!', e.data.origin);
// e.data.origin = unix ms when main document was created
// performance.timeOrigin = unix ms when worker was created
let originDiff = (performance.timeOrigin - e.data.origin) / 1000;
let firstTick;
console.log('originDiff', originDiff);
let precision = 10 ** 4;
let cps = 0.5;
let interval = 0.05;
let tickOrigin;
let lastEnd = 0;
let bag = [];
let clock = createClock(
() => performance.now() / 1000,
(phase, duration, tick, t) => {
if (tick === 0) {
firstTick = t;
console.log('firstTick', t);
}
// let durationInCycles = duration * cps;
/* phase = lastEnd; */
// phase = Math.round(phase * precision) / precision;
bag.push({ tick, duration, phase, cps, origin: performance.timeOrigin });
//postMessage({ tick, phase, cps, origin: performance.timeOrigin });
let pack = 4;
if (bag.length === pack) {
console.log('send', performance.now());
postMessage(bag);
bag = [];
}
/* phase += duration;
lastEnd = phase; */
/*if (tick === 0) {
tickOrigin = performance.now();
}
let begin = lastEnd || 0;
let end = begin + duration * cps;
lastEnd = end;
//console.log('query', begin, phase);
const haps = pat.queryArc(begin, end).filter((hap) => hap.hasOnset());
if (haps.length) {
postMessage({ tick, phase, begin, end, haps, cps, tickOrigin, origin: performance.timeOrigin });
}
*/
/* console.log(
'tick',
phase,
`${begin.toFixed(2)}-${end.toFixed(2)}: ${haps
.map((h) => `${h.value.s}:${(h.whole.begin + 0).toFixed(2)}`)
.join(' ')}`,
); */
},
interval,
interval,
);
clock.start();
};