From 8bd56d29d652771a26f705924aec34a2c3dd9169 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Sun, 7 Aug 2022 21:30:02 +0200 Subject: [PATCH] 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); + }); +};