jevstrudel.git / website / src / repl / prebakeSounds.mjs

jevstrudel: the sounds every song can use, apart from the REPL's own (prebake.mjs adds the visitor's imported samples, from IndexedDB). The sandbox a listener's song plays in (jev/sandbox/player.mjs) registers exactly these, so a song plays there as it does in the editor; it imports nothing that touches the page's storage, which an opaque origin lacks. Its hosts are the sandbox's allowed ones (jev/sandboxPolicy.mjs).

7import { Pattern, noteToMidi, valueToMidi } from '@strudel/core';
8import { aliasBank, registerSynthSounds, registerZZFXSounds, samples } from '@strudel/webaudio';
10export const baseCDN = 'https://strudel.b-cdn.net';
11
12export async function prebakeSounds() {
13  // https://archive.org/details/SalamanderGrandPianoV3
14  // License: CC-by http://creativecommons.org/licenses/by/3.0/ Author: Alexander Holm
15  await Promise.all([
16    registerSynthSounds(),
17    registerZZFXSounds(),
18    //registerSoundfonts(),
19    // need dynamic import here, because importing @strudel/soundfonts fails on server:
20    // => getting "window is not defined", as soon as "@strudel/soundfonts" is imported statically
21    // seems to be a problem with soundfont2
22    import('@strudel/soundfonts').then(({ registerSoundfonts }) => registerSoundfonts()),
23    samples(`${baseCDN}/piano.json`, `${baseCDN}/piano/`, { prebake: true }),
24    // https://github.com/sgossner/VCSL/
25    // https://api.github.com/repositories/126427031/contents/
26    // LICENSE: CC0 general-purpose
27    samples(`${baseCDN}/vcsl.json`, `${baseCDN}/VCSL/`, { prebake: true }),
28    samples(`${baseCDN}/tidal-drum-machines.json`, `${baseCDN}/tidal-drum-machines/machines/`, {
29      prebake: true,
30      tag: 'drum-machines',
31    }),
32    samples(`${baseCDN}/uzu-drumkit.json`, `${baseCDN}/uzu-drumkit/`, {
33      prebake: true,
34      tag: 'drum-machines',
35    }),
36    samples(`${baseCDN}/uzu-wavetables.json`, `${baseCDN}/uzu-wavetables/`, {
37      prebake: true,
38    }),
39    samples(`${baseCDN}/mridangam.json`, `${baseCDN}/mrid/`, { prebake: true, tag: 'drum-machines' }),
40    samples(
41      {
42        casio: ['casio/high.wav', 'casio/low.wav', 'casio/noise.wav'],
43        crow: ['crow/000_crow.wav', 'crow/001_crow2.wav', 'crow/002_crow3.wav', 'crow/003_crow4.wav'],
44        insect: [
45          'insect/000_everglades_conehead.wav',
46          'insect/001_robust_shieldback.wav',
47          'insect/002_seashore_meadow_katydid.wav',
48        ],
49        wind: [
50          'wind/000_wind1.wav',
51          'wind/001_wind10.wav',
52          'wind/002_wind2.wav',
53          'wind/003_wind3.wav',
54          'wind/004_wind4.wav',
55          'wind/005_wind5.wav',
56          'wind/006_wind6.wav',
57          'wind/007_wind7.wav',
58          'wind/008_wind8.wav',
59          'wind/009_wind9.wav',
60        ],
61        jazz: [
62          'jazz/000_BD.wav',
63          'jazz/001_CB.wav',
64          'jazz/002_FX.wav',
65          'jazz/003_HH.wav',
66          'jazz/004_OH.wav',
67          'jazz/005_P1.wav',
68          'jazz/006_P2.wav',
69          'jazz/007_SN.wav',
70        ],
71        metal: [
72          'metal/000_0.wav',
73          'metal/001_1.wav',
74          'metal/002_2.wav',
75          'metal/003_3.wav',
76          'metal/004_4.wav',
77          'metal/005_5.wav',
78          'metal/006_6.wav',
79          'metal/007_7.wav',
80          'metal/008_8.wav',
81          'metal/009_9.wav',
82        ],
83        east: [
84          'east/000_nipon_wood_block.wav',
85          'east/001_ohkawa_mute.wav',
86          'east/002_ohkawa_open.wav',
87          'east/003_shime_hi.wav',
88          'east/004_shime_hi_2.wav',
89          'east/005_shime_mute.wav',
90          'east/006_taiko_1.wav',
91          'east/007_taiko_2.wav',
92          'east/008_taiko_3.wav',
93        ],
94        space: [
95          'space/000_0.wav',
96          'space/001_1.wav',
97          'space/002_11.wav',
98          'space/003_12.wav',
99          'space/004_13.wav',
100          'space/005_14.wav',
101          'space/006_15.wav',
102          'space/007_16.wav',
103          'space/008_17.wav',
104          'space/009_18.wav',
105          'space/010_2.wav',
106          'space/011_3.wav',
107          'space/012_4.wav',
108          'space/013_5.wav',
109          'space/014_6.wav',
110          'space/015_7.wav',
111          'space/016_8.wav',
112          'space/017_9.wav',
113        ],
114        numbers: [
115          'numbers/0.wav',
116          'numbers/1.wav',
117          'numbers/2.wav',
118          'numbers/3.wav',
119          'numbers/4.wav',
120          'numbers/5.wav',
121          'numbers/6.wav',
122          'numbers/7.wav',
123          'numbers/8.wav',
124        ],
125        num: [
126          'num/00.wav',
127          'num/01.wav',
128          'num/02.wav',
129          'num/03.wav',
130          'num/04.wav',
131          'num/05.wav',
132          'num/06.wav',
133          'num/07.wav',
134          'num/08.wav',
135          'num/09.wav',
136          'num/10.wav',
137          'num/11.wav',
138          'num/12.wav',
139          'num/13.wav',
140          'num/14.wav',
141          'num/15.wav',
142          'num/16.wav',
143          'num/17.wav',
144          'num/18.wav',
145          'num/19.wav',
146          'num/20.wav',
147        ],
148      },
149      `${baseCDN}/Dirt-Samples/`,
150      {
151        prebake: true,
152      },
153    ),
154  ]);
155
156  aliasBank(`${baseCDN}/tidal-drum-machines-alias.json`);
157}
158
159const maxPan = noteToMidi('C8');
160const panwidth = (pan, width) => pan * width + (1 - width) / 2;
161
162Pattern.prototype.piano = function () {
163  return this.fmap((v) => ({ ...v, clip: v.clip ?? 1 })) // set clip if not already set..
164    .s('piano')
165    .release(0.1)
166    .fmap((value) => {
167      const midi = valueToMidi(value);
168      // pan by pitch
169      const pan = panwidth(Math.min(Math.round(midi) / maxPan, 1), 0.5);
170      return { ...value, pan: (value.pan || 1) * pan };
171    });
172};