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).
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};