mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-27 21:48:27 +00:00
add onEvent to useRepl
This commit is contained in:
parent
d3dce4c662
commit
72835c80ed
@ -1,7 +1,6 @@
|
|||||||
import { useCallback, useLayoutEffect, useState, useMemo, useEffect } from 'react';
|
import { useCallback, useState, useMemo } from 'react';
|
||||||
import { isNote } from 'tone';
|
import { isNote } from 'tone';
|
||||||
import { evaluate } from './evaluate';
|
import { evaluate } from './evaluate';
|
||||||
import { useWebMidi } from './midi';
|
|
||||||
import type { Pattern } from './types';
|
import type { Pattern } from './types';
|
||||||
import useCycle from './useCycle';
|
import useCycle from './useCycle';
|
||||||
import usePostMessage from './usePostMessage';
|
import usePostMessage from './usePostMessage';
|
||||||
@ -12,7 +11,7 @@ let s4 = () => {
|
|||||||
.substring(1);
|
.substring(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
function useRepl({ tune, defaultSynth, autolink = true }) {
|
function useRepl({ tune, defaultSynth, autolink = true, onEvent }: any) {
|
||||||
const id = useMemo(() => s4(), []);
|
const id = useMemo(() => s4(), []);
|
||||||
const [code, setCode] = useState<string>(tune);
|
const [code, setCode] = useState<string>(tune);
|
||||||
const [activeCode, setActiveCode] = useState<string>();
|
const [activeCode, setActiveCode] = useState<string>();
|
||||||
@ -48,30 +47,34 @@ function useRepl({ tune, defaultSynth, autolink = true }) {
|
|||||||
};
|
};
|
||||||
// cycle hook to control scheduling
|
// cycle hook to control scheduling
|
||||||
const cycle = useCycle({
|
const cycle = useCycle({
|
||||||
onEvent: useCallback((time, event) => {
|
onEvent: useCallback(
|
||||||
try {
|
(time, event) => {
|
||||||
if (!event.value?.onTrigger) {
|
try {
|
||||||
const note = event.value?.value || event.value;
|
onEvent?.(event);
|
||||||
if (!isNote(note)) {
|
if (!event.value?.onTrigger) {
|
||||||
throw new Error('not a note: ' + note);
|
const note = event.value?.value || event.value;
|
||||||
}
|
if (!isNote(note)) {
|
||||||
if (defaultSynth) {
|
throw new Error('not a note: ' + note);
|
||||||
defaultSynth.triggerAttackRelease(note, event.duration, time);
|
}
|
||||||
} else {
|
if (defaultSynth) {
|
||||||
throw new Error('no defaultSynth passed to useRepl.');
|
defaultSynth.triggerAttackRelease(note, event.duration, time);
|
||||||
}
|
} else {
|
||||||
/* console.warn('no instrument chosen', event);
|
throw new Error('no defaultSynth passed to useRepl.');
|
||||||
|
}
|
||||||
|
/* console.warn('no instrument chosen', event);
|
||||||
throw new Error(`no instrument chosen for ${JSON.stringify(event)}`); */
|
throw new Error(`no instrument chosen for ${JSON.stringify(event)}`); */
|
||||||
} else {
|
} else {
|
||||||
const { onTrigger } = event.value;
|
const { onTrigger } = event.value;
|
||||||
onTrigger(time, event);
|
onTrigger(time, event);
|
||||||
|
}
|
||||||
|
} catch (err: any) {
|
||||||
|
console.warn(err);
|
||||||
|
err.message = 'unplayable event: ' + err?.message;
|
||||||
|
pushLog(err.message); // not with setError, because then we would have to setError(undefined) on next playable event
|
||||||
}
|
}
|
||||||
} catch (err: any) {
|
},
|
||||||
console.warn(err);
|
[onEvent]
|
||||||
err.message = 'unplayable event: ' + err?.message;
|
),
|
||||||
pushLog(err.message); // not with setError, because then we would have to setError(undefined) on next playable event
|
|
||||||
}
|
|
||||||
}, []),
|
|
||||||
onQuery: useCallback(
|
onQuery: useCallback(
|
||||||
(span) => {
|
(span) => {
|
||||||
try {
|
try {
|
||||||
@ -146,7 +149,7 @@ function useRepl({ tune, defaultSynth, autolink = true }) {
|
|||||||
togglePlay,
|
togglePlay,
|
||||||
activateCode,
|
activateCode,
|
||||||
activeCode,
|
activeCode,
|
||||||
pushLog,
|
pushLog
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user