mirror of
https://github.com/eliasstepanik/strudel.git
synced 2026-01-11 05:38:35 +00:00
60 lines
2.1 KiB
JavaScript
60 lines
2.1 KiB
JavaScript
import { noteToMidi, valueToMidi, Pattern, evalScope } from '@strudel/core';
|
|
import { aliasBank, registerSynthSounds, registerZZFXSounds, samples } from '@strudel/webaudio';
|
|
import * as core from '@strudel/core';
|
|
|
|
export async function prebake() {
|
|
const modulesLoading = evalScope(
|
|
// import('@strudel/core'),
|
|
core,
|
|
import('@strudel/draw'),
|
|
import('@strudel/mini'),
|
|
import('@strudel/tonal'),
|
|
import('@strudel/webaudio'),
|
|
import('@strudel/codemirror'),
|
|
import('@strudel/hydra'),
|
|
import('@strudel/soundfonts'),
|
|
import('@strudel/midi'),
|
|
// import('@strudel/xen'),
|
|
// import('@strudel/serial'),
|
|
// import('@strudel/csound'),
|
|
// import('@strudel/osc'),
|
|
);
|
|
// load samples
|
|
const ds = 'https://raw.githubusercontent.com/felixroos/dough-samples/main/';
|
|
|
|
// TODO: move this onto the strudel repo
|
|
const ts = 'https://raw.githubusercontent.com/todepond/samples/main/';
|
|
await Promise.all([
|
|
modulesLoading,
|
|
registerSynthSounds(),
|
|
registerZZFXSounds(),
|
|
//registerSoundfonts(),
|
|
// need dynamic import here, because importing @strudel/soundfonts fails on server:
|
|
// => getting "window is not defined", as soon as "@strudel/soundfonts" is imported statically
|
|
// seems to be a problem with soundfont2
|
|
import('@strudel/soundfonts').then(({ registerSoundfonts }) => registerSoundfonts()),
|
|
samples(`${ds}/tidal-drum-machines.json`),
|
|
samples(`${ds}/piano.json`),
|
|
samples(`${ds}/Dirt-Samples.json`),
|
|
samples(`${ds}/EmuSP12.json`),
|
|
samples(`${ds}/vcsl.json`),
|
|
]);
|
|
|
|
aliasBank(`${ts}/tidal-drum-machines-alias.json`);
|
|
}
|
|
|
|
const maxPan = noteToMidi('C8');
|
|
const panwidth = (pan, width) => pan * width + (1 - width) / 2;
|
|
|
|
Pattern.prototype.piano = function () {
|
|
return this.fmap((v) => ({ ...v, clip: v.clip ?? 1 })) // set clip if not already set..
|
|
.s('piano')
|
|
.release(0.1)
|
|
.fmap((value) => {
|
|
const midi = valueToMidi(value);
|
|
// pan by pitch
|
|
const pan = panwidth(Math.min(Math.round(midi) / maxPan, 1), 0.5);
|
|
return { ...value, pan: (value.pan || 1) * pan };
|
|
});
|
|
};
|