refactor onTrigger

This commit is contained in:
Felix Roos 2022-11-12 20:17:57 +01:00
parent 5fc8f10602
commit b668a2c0d2
6 changed files with 122 additions and 141 deletions

View file

@ -32,11 +32,8 @@ function speak(words, lang, voice) {
}
Pattern.prototype._speak = function (lang, voice) {
return this._withHap((hap) => {
const onTrigger = (time, hap) => {
return this.onTrigger((_, hap) => {
speak(hap.value, lang, voice);
};
return hap.setContext({ ...hap.context, onTrigger });
});
};

View file

@ -65,9 +65,7 @@ Pattern.prototype.midi = async function (output, channel = 1) {
}')`,
);
}
return this._withHap((hap) => {
// const onTrigger = (time: number, hap: any) => {
const onTrigger = (time, hap) => {
return this.onTrigger((time, hap) => {
let note = getPlayableNoteValue(hap);
const velocity = hap.context?.velocity ?? 0.9;
if (!isNote(note)) {
@ -104,7 +102,5 @@ Pattern.prototype.midi = async function (output, channel = 1) {
duration: hap.duration.valueOf() * 1000 - 5,
attack: velocity,
});
};
return hap.setContext({ ...hap.context, onTrigger });
});
};

View file

@ -15,12 +15,13 @@ function connect() {
const osc = new OSC();
osc.open();
osc.on('open', () => {
logger('OSC connected!');
const url = osc.options?.plugin?.socket?.url;
logger(`[osc] connected${url ? ` to ${url}` : ''}`);
resolve(osc);
});
osc.on('close', () => {
connection = undefined; // allows new connection afterwards
console.log('osc connection closed');
console.log('[osc] disconnected');
reject('OSC connection closed');
});
osc.on('error', (err) => reject(err));
@ -45,8 +46,7 @@ let startedAt = -1;
*/
Pattern.prototype.osc = async function () {
const osc = await connect();
return this._withHap((hap) => {
const onTrigger = (time, hap, currentTime, cps = 1) => {
return this.onTrigger((time, hap, currentTime, cps = 1) => {
const cycle = hap.wholeOrPart().begin.valueOf();
const delta = hap.duration.valueOf();
// time should be audio time of onset
@ -64,7 +64,5 @@ Pattern.prototype.osc = async function () {
const bundle = new OSC.Bundle([message], ts);
bundle.timestamp(ts); // workaround for https://github.com/adzialocha/osc-js/issues/60
osc.send(bundle);
};
return hap.setContext({ ...hap.context, onTrigger });
});
};

View file

@ -9,7 +9,7 @@ import { Pattern, isPattern } from '@strudel.cycles/core';
var serialWriter;
var choosing = false;
export async function getWriter(br=38400) {
export async function getWriter(br = 38400) {
if (choosing) {
return;
}
@ -24,11 +24,10 @@ export async function getWriter(br=38400) {
const writableStreamClosed = textEncoder.readable.pipeTo(port.writable);
const writer = textEncoder.writable.getWriter();
serialWriter = function (message) {
writer.write(message)
}
}
else {
throw('Webserial is not available in this browser.')
writer.write(message);
};
} else {
throw 'Webserial is not available in this browser.';
}
}
@ -40,7 +39,7 @@ Pattern.prototype.serial = function (...args) {
getWriter(...args);
}
const onTrigger = (time, hap, currentTime) => {
var message = "";
var message = '';
if (typeof hap.value === 'object') {
if ('action' in hap.value) {
message += hap.value['action'] + '(';
@ -51,26 +50,23 @@ Pattern.prototype.serial = function (...args) {
}
if (first) {
first = false;
} else {
message += ',';
}
else {
message +=',';
}
message += `${key}:${val}`
message += `${key}:${val}`;
}
message += ')';
}
else {
} else {
for (const [key, val] of Object.entries(hap.value)) {
message += `${key}:${val};`
message += `${key}:${val};`;
}
}
}
else {
} else {
message = hap.value;
}
const offset = (time - currentTime + latency) * 1000;
window.setTimeout(serialWriter, offset, message);
};
return hap.setContext({ ...hap.context, onTrigger });
return hap.setContext({ ...hap.context, onTrigger, dominantTrigger: true });
});
};

View file

@ -50,8 +50,7 @@ export const getDefaultSynth = () => {
// with this function, you can play the pattern with any tone synth
Pattern.prototype.tone = function (instrument) {
return this._withHap((hap) => {
const onTrigger = (time, hap) => {
return this.onTrigger((time, hap) => {
let note;
let velocity = hap.context?.velocity ?? 0.75;
if (instrument instanceof PluckSynth) {
@ -74,8 +73,6 @@ Pattern.prototype.tone = function (instrument) {
note = getPlayableNoteValue(hap);
instrument.triggerAttackRelease(note, hap.duration.valueOf(), time, velocity);
}
};
return hap.setContext({ ...hap.context, instrument, onTrigger });
});
};

View file

@ -62,8 +62,7 @@ export function loadWebDirt(config) {
*/
Pattern.prototype.webdirt = function () {
// create a WebDirt object and initialize Web Audio context
return this._withHap((hap) => {
const onTrigger = async (time, e, currentTime) => {
return this.onTrigger(async (time, e, currentTime) => {
if (!webDirt) {
throw new Error('WebDirt not initialized!');
}
@ -92,7 +91,5 @@ Pattern.prototype.webdirt = function () {
webDirt.playSample(msg, deadline);
}
}
};
return hap.setContext({ ...hap.context, onTrigger });
});
};