WIP non-realtime exporting

This commit is contained in:
Nikita
2025-10-19 14:35:23 +03:00
parent 6e58c973af
commit 0fbde61b2d
12 changed files with 217 additions and 31 deletions
+13
View File
@@ -6,6 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th
import createClock from './zyklus.mjs';
import { errorLogger, logger } from './logger.mjs';
import { loadBuffer, renderPatternAudio, setAudioContext, superdough } from '@strudel/webaudio';
export class Cyclist {
constructor({
@@ -98,6 +99,7 @@ export class Cyclist {
this.started = v;
this.onToggle?.(v);
}
async start() {
await this.beforeStart?.();
this.num_ticks_since_cps_change = 0;
@@ -109,6 +111,17 @@ export class Cyclist {
this.clock.start();
this.setStarted(true);
}
async exportAudio(begin, end) {
if (!this.pattern) {
throw new Error('Scheduler: no pattern set! call .setPattern first.');
}
logger('[cyclist] exporting');
// this.clock.start();
// this.setStarted(true);
await renderPatternAudio(this.pattern, this.cps, begin, end)
}
pause() {
logger('[cyclist] pause');
this.clock.pause();
+16 -15
View File
@@ -91,6 +91,7 @@ export function repl({
const stop = () => scheduler.stop();
const start = () => scheduler.start();
const exportAudio = (begin, end) => scheduler.exportAudio(begin, end);
const pause = () => scheduler.pause();
const toggle = () => scheduler.toggle();
const setCps = (cps) => {
@@ -257,23 +258,23 @@ export function repl({
}
};
const setCode = (code) => updateState({ code });
return { scheduler, evaluate, start, stop, pause, setCps, setPattern, setCode, toggle, state };
return { scheduler, evaluate, start, exportAudio, stop, pause, setCps, setPattern, setCode, toggle, state };
}
export const getTrigger =
({ getTime, defaultOutput }) =>
async (hap, deadline, duration, cps, t) => {
// ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger)
// TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004
try {
if (!hap.context.onTrigger || !hap.context.dominantTrigger) {
await defaultOutput(hap, deadline, duration, cps, t);
async (hap, deadline, duration, cps, t) => {
// ^ this signature is different from hap.context.onTrigger, as set by Pattern.onTrigger(onTrigger)
// TODO: get rid of deadline after https://codeberg.org/uzu/strudel/pulls/1004
try {
if (!hap.context.onTrigger || !hap.context.dominantTrigger) {
await defaultOutput(hap, deadline, duration, cps, t);
}
if (hap.context.onTrigger) {
// call signature of output / onTrigger is different...
await hap.context.onTrigger(hap, getTime(), cps, t);
}
} catch (err) {
errorLogger(err, 'getTrigger');
}
if (hap.context.onTrigger) {
// call signature of output / onTrigger is different...
await hap.context.onTrigger(hap, getTime(), cps, t);
}
} catch (err) {
errorLogger(err, 'getTrigger');
}
};
};