add speak output
This commit is contained in:
parent
16e2c97e0c
commit
1dd19c0831
2 changed files with 49 additions and 5 deletions
33
packages/core/speak.mjs
Normal file
33
packages/core/speak.mjs
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
import { Pattern, patternify2 } from './strudel.mjs';
|
||||||
|
|
||||||
|
const synth = window?.speechSynthesis;
|
||||||
|
let allVoices = synth?.getVoices();
|
||||||
|
// console.log('voices', allVoices);
|
||||||
|
|
||||||
|
function speak(words, lang, voice) {
|
||||||
|
synth.cancel();
|
||||||
|
const utterance = new SpeechSynthesisUtterance(words);
|
||||||
|
utterance.lang = lang;
|
||||||
|
allVoices = synth.getVoices();
|
||||||
|
const voices = allVoices.filter((v) => v.lang.includes(lang));
|
||||||
|
if (typeof voice === 'number') {
|
||||||
|
utterance.voice = voices[voice % voices.length];
|
||||||
|
} else if (typeof voice === 'string') {
|
||||||
|
utterance.voice = voices.find((voice) => voice.name === voice);
|
||||||
|
}
|
||||||
|
// console.log(utterance.voice?.name, utterance.voice?.lang);
|
||||||
|
speechSynthesis.speak(utterance);
|
||||||
|
}
|
||||||
|
|
||||||
|
Pattern.prototype._speak = function (lang, voice) {
|
||||||
|
return this._withEvent((event) => {
|
||||||
|
const onTrigger = (time, event) => {
|
||||||
|
speak(event.value, lang, voice);
|
||||||
|
};
|
||||||
|
return event.setContext({ ...event.context, onTrigger });
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Pattern.prototype.speak = function (lang, voice) {
|
||||||
|
return patternify2(Pattern.prototype._speak)(reify(lang), reify(voice), this);
|
||||||
|
};
|
||||||
|
|
@ -26,17 +26,28 @@ import '@strudel.cycles/tonal/tonal.mjs';
|
||||||
import '@strudel.cycles/xen/xen.mjs';
|
import '@strudel.cycles/xen/xen.mjs';
|
||||||
import '@strudel.cycles/xen/tune.mjs';
|
import '@strudel.cycles/xen/tune.mjs';
|
||||||
import '@strudel.cycles/core/euclid.mjs';
|
import '@strudel.cycles/core/euclid.mjs';
|
||||||
|
import '@strudel.cycles/core/speak.mjs';
|
||||||
import '@strudel.cycles/tone/pianoroll.mjs';
|
import '@strudel.cycles/tone/pianoroll.mjs';
|
||||||
import '@strudel.cycles/tone/draw.mjs';
|
import '@strudel.cycles/tone/draw.mjs';
|
||||||
import '@strudel.cycles/osc/osc.mjs';
|
import '@strudel.cycles/osc/osc.mjs';
|
||||||
import controls from '@strudel.cycles/core/controls.mjs';
|
import controls from '@strudel.cycles/core/controls.mjs';
|
||||||
|
|
||||||
extend(Tone, strudel, strudel.Pattern.prototype.bootstrap(), controls, toneHelpers, voicingHelpers, drawHelpers, uiHelpers, {
|
extend(
|
||||||
|
Tone,
|
||||||
|
strudel,
|
||||||
|
strudel.Pattern.prototype.bootstrap(),
|
||||||
|
controls,
|
||||||
|
toneHelpers,
|
||||||
|
voicingHelpers,
|
||||||
|
drawHelpers,
|
||||||
|
uiHelpers,
|
||||||
|
{
|
||||||
gist,
|
gist,
|
||||||
euclid,
|
euclid,
|
||||||
mini,
|
mini,
|
||||||
Tone,
|
Tone,
|
||||||
});
|
},
|
||||||
|
);
|
||||||
// eval stuff end
|
// eval stuff end
|
||||||
|
|
||||||
const codeParam = window.location.href.split('#')[1];
|
const codeParam = window.location.href.split('#')[1];
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue