From 467b3db8246e209a123048dcae328d716b928766 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 7 Aug 2022 21:21:44 +0200 Subject: [PATCH 1/3] handle objects in getPlayableNoteValue --- packages/core/util.mjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/util.mjs b/packages/core/util.mjs index 86d798d6..3f8fba8c 100644 --- a/packages/core/util.mjs +++ b/packages/core/util.mjs @@ -50,6 +50,9 @@ export const mod = (n, m) => ((n % m) + m) % m; export const getPlayableNoteValue = (hap) => { let { value: note, context } = hap; + if (typeof note === 'object' && !Array.isArray(note)) { + note = note.note || note.n || note.value; + } // if value is number => interpret as midi number as long as its not marked as frequency if (typeof note === 'number' && context.type !== 'frequency') { note = fromMidi(hap.value); From 8bd56d29d652771a26f705924aec34a2c3dd9169 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 7 Aug 2022 21:30:02 +0200 Subject: [PATCH 2/3] add sfumato soundfont player --- package-lock.json | 32 ++++++++++++++++++++++++++++++-- packages/soundfonts/index.mjs | 6 +++--- packages/soundfonts/package.json | 3 ++- packages/soundfonts/sfumato.mjs | 16 ++++++++++++++++ 4 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 packages/soundfonts/sfumato.mjs diff --git a/package-lock.json b/package-lock.json index f1b5fddf..31b1e31c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9616,6 +9616,14 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "node_modules/sfumato": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/sfumato/-/sfumato-0.1.2.tgz", + "integrity": "sha512-j2s5BLUS5VUNtaK1l+v+yal3XjjV7JXCQIwE5Xs4yiQ3HJ+2Fc/dd3IkkrVHn0AJO2epShSWVoP3GnE0TvPdMg==", + "dependencies": { + "soundfont2": "^0.4.0" + } + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -9852,6 +9860,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/soundfont2": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/soundfont2/-/soundfont2-0.4.0.tgz", + "integrity": "sha512-537WiurDBRbDLVhJMxXLE06D6yWxJCidfPClnibZ0f8dKMDpv+0fIfwCQ8pELE0JqKX05SOJosNJgKzQobaAEA==" + }, "node_modules/source-map-generator": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/source-map-generator/-/source-map-generator-0.8.0.tgz", @@ -11476,7 +11489,8 @@ "license": "AGPL-3.0-or-later", "dependencies": { "@strudel.cycles/core": "*", - "@strudel.cycles/webaudio": "^0.1.4" + "@strudel.cycles/webaudio": "^0.1.4", + "sfumato": "^0.1.2" }, "devDependencies": { "node-fetch": "^3.2.6" @@ -13363,7 +13377,8 @@ "requires": { "@strudel.cycles/core": "*", "@strudel.cycles/webaudio": "^0.1.4", - "node-fetch": "^3.2.6" + "node-fetch": "^3.2.6", + "sfumato": "^0.1.2" }, "dependencies": { "node-fetch": { @@ -19146,6 +19161,14 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "sfumato": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/sfumato/-/sfumato-0.1.2.tgz", + "integrity": "sha512-j2s5BLUS5VUNtaK1l+v+yal3XjjV7JXCQIwE5Xs4yiQ3HJ+2Fc/dd3IkkrVHn0AJO2epShSWVoP3GnE0TvPdMg==", + "requires": { + "soundfont2": "^0.4.0" + } + }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -19343,6 +19366,11 @@ "is-plain-obj": "^2.0.0" } }, + "soundfont2": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/soundfont2/-/soundfont2-0.4.0.tgz", + "integrity": "sha512-537WiurDBRbDLVhJMxXLE06D6yWxJCidfPClnibZ0f8dKMDpv+0fIfwCQ8pELE0JqKX05SOJosNJgKzQobaAEA==" + }, "source-map-generator": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/source-map-generator/-/source-map-generator-0.8.0.tgz", diff --git a/packages/soundfonts/index.mjs b/packages/soundfonts/index.mjs index f5156cf1..2c4ffcc6 100644 --- a/packages/soundfonts/index.mjs +++ b/packages/soundfonts/index.mjs @@ -1,6 +1,6 @@ import { getFontBufferSource } from './fontloader.mjs'; import * as soundfontList from './list.mjs'; +import { loadSoundfont, startPresetNote } from 'sfumato'; +import './sfumato.mjs'; -globalThis.getFontBufferSource = getFontBufferSource; -globalThis.soundfontList = soundfontList; -globalThis.soundfontList = soundfontList; +export { loadSoundfont, startPresetNote, getFontBufferSource, soundfontList }; diff --git a/packages/soundfonts/package.json b/packages/soundfonts/package.json index edad7daf..020cfe79 100644 --- a/packages/soundfonts/package.json +++ b/packages/soundfonts/package.json @@ -23,7 +23,8 @@ "homepage": "https://github.com/tidalcycles/strudel#readme", "dependencies": { "@strudel.cycles/core": "*", - "@strudel.cycles/webaudio": "^0.1.4" + "@strudel.cycles/webaudio": "^0.1.4", + "sfumato": "^0.1.2" }, "devDependencies": { "node-fetch": "^3.2.6" diff --git a/packages/soundfonts/sfumato.mjs b/packages/soundfonts/sfumato.mjs new file mode 100644 index 00000000..f13712a5 --- /dev/null +++ b/packages/soundfonts/sfumato.mjs @@ -0,0 +1,16 @@ +import { Pattern } from '@strudel.cycles/core'; +import { /* loadSoundfont, */ startPresetNote } from 'sfumato'; + +// TODO: find way to cache loadSoundfont + +Pattern.prototype.soundfont = function (sf, n = 0) { + return this.onTrigger((t, h, ct) => { + const ctx = getAudioContext(); + const note = getPlayableNoteValue(h); + const preset = sf.presets[n % sf.presets.length]; + const deadline = ctx.currentTime + t - ct; + const args = [ctx, preset, toMidi(note), deadline]; + const stop = startPresetNote(...args); + stop(deadline + h.duration); + }); +}; From 3986c407ff55896fc05e264830a9fd2597b5f04e Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 7 Aug 2022 23:53:14 +0200 Subject: [PATCH 3/3] cache loaded soundfonts --- packages/soundfonts/index.mjs | 4 ++-- packages/soundfonts/sfumato.mjs | 14 +++++++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/soundfonts/index.mjs b/packages/soundfonts/index.mjs index 2c4ffcc6..3c5c226c 100644 --- a/packages/soundfonts/index.mjs +++ b/packages/soundfonts/index.mjs @@ -1,6 +1,6 @@ import { getFontBufferSource } from './fontloader.mjs'; import * as soundfontList from './list.mjs'; -import { loadSoundfont, startPresetNote } from 'sfumato'; -import './sfumato.mjs'; +import { startPresetNote } from 'sfumato'; +import { loadSoundfont } from './sfumato.mjs'; export { loadSoundfont, startPresetNote, getFontBufferSource, soundfontList }; diff --git a/packages/soundfonts/sfumato.mjs b/packages/soundfonts/sfumato.mjs index f13712a5..1cca2ffe 100644 --- a/packages/soundfonts/sfumato.mjs +++ b/packages/soundfonts/sfumato.mjs @@ -1,7 +1,5 @@ import { Pattern } from '@strudel.cycles/core'; -import { /* loadSoundfont, */ startPresetNote } from 'sfumato'; - -// TODO: find way to cache loadSoundfont +import { loadSoundfont as _loadSoundfont, startPresetNote } from 'sfumato'; Pattern.prototype.soundfont = function (sf, n = 0) { return this.onTrigger((t, h, ct) => { @@ -14,3 +12,13 @@ Pattern.prototype.soundfont = function (sf, n = 0) { stop(deadline + h.duration); }); }; + +const soundfontCache = new Map(); +export function loadSoundfont(url) { + if (soundfontCache.get(url)) { + return soundfontCache.get(url); + } + const sf = _loadSoundfont(url); + soundfontCache.set(url, sf); + return sf; +}