databender 2.0.0-alpha.0 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -158,6 +158,26 @@ databender.bend(img, context);
158
158
 
159
159
  Because Databender spins up a brand new `OfflineAudioContext` for every render, the worklet module has to be registered on that context before the node is created. Returning a promise from your effect factory ensures the render waits for the module to load.
160
160
 
161
+ ### Source parameters
162
+
163
+ Some tweaks (e.g. `detune` or `playbackRate`) must be applied directly to the `AudioBufferSourceNode` **before** it starts. Pass functions to `sourceParams` and they'll run prior to chaining any effects. Each factory receives the same payload (`{ context, source, config }`) as the regular effect chain.
164
+
165
+ ```js
166
+ const databender = new Databender({
167
+ config,
168
+ sourceParams: [
169
+ ({ source, config }) => {
170
+ const value = config?.detune?.value ?? 0;
171
+ source.detune.value = value;
172
+ }
173
+ ],
174
+ effectsChain: [
175
+ useDelayEffect(),
176
+ useBitcrusher()
177
+ ]
178
+ });
179
+ ```
180
+
161
181
  ### Prerequisites
162
182
 
163
183
  Google Chrome (ideally) and an open mind!
@@ -35,6 +35,7 @@ var Databender = (function () {
35
35
  config = {},
36
36
  effectsChain = null,
37
37
  chainMode = 'series',
38
+ sourceParams = null,
38
39
  audioCtx = null
39
40
  } = {}) {
40
41
  this.audioCtx = audioCtx ? audioCtx : new AudioContext();
@@ -43,6 +44,7 @@ var Databender = (function () {
43
44
  this.configKeys = Object.keys(this.config);
44
45
  this.previousConfig = this.config;
45
46
  this.effectsChain = effectsChain ? asArray(effectsChain) : null;
47
+ this.sourceParams = sourceParams ? asArray(sourceParams) : null;
46
48
  this.chainMode = chainMode === 'parallel' ? 'parallel' : 'series';
47
49
 
48
50
  this.convert = function(image) {
@@ -141,6 +143,29 @@ var Databender = (function () {
141
143
  return resolvedNodes;
142
144
  }.bind(this);
143
145
 
146
+ var applySourceParams = async function() {
147
+ if (bypass || !this.sourceParams) {
148
+ return;
149
+ }
150
+
151
+ var candidates = asArray(this.sourceParams);
152
+
153
+ for (var i = 0; i < candidates.length; i++) {
154
+ var candidate = candidates[i];
155
+ var result = candidate;
156
+
157
+ if (isFunction(result)) {
158
+ result = result({ context: offlineAudioCtx, source: bufferSource, config: this.config });
159
+ }
160
+
161
+ if (isPromise(result)) {
162
+ await result;
163
+ }
164
+ }
165
+ }.bind(this);
166
+
167
+ await applySourceParams();
168
+
144
169
  var effectNodes = (await resolveEffectsChain()).map(normalizeEffectNode).filter(Boolean);
145
170
 
146
171
  if (!effectNodes.length) {
package/index.js CHANGED
@@ -33,6 +33,7 @@ export default class Databender {
33
33
  config = {},
34
34
  effectsChain = null,
35
35
  chainMode = 'series',
36
+ sourceParams = null,
36
37
  audioCtx = null
37
38
  } = {}) {
38
39
  this.audioCtx = audioCtx ? audioCtx : new AudioContext();
@@ -41,6 +42,7 @@ export default class Databender {
41
42
  this.configKeys = Object.keys(this.config);
42
43
  this.previousConfig = this.config;
43
44
  this.effectsChain = effectsChain ? asArray(effectsChain) : null;
45
+ this.sourceParams = sourceParams ? asArray(sourceParams) : null;
44
46
  this.chainMode = chainMode === 'parallel' ? 'parallel' : 'series';
45
47
 
46
48
  this.convert = function(image) {
@@ -139,6 +141,29 @@ export default class Databender {
139
141
  return resolvedNodes;
140
142
  }.bind(this);
141
143
 
144
+ var applySourceParams = async function() {
145
+ if (bypass || !this.sourceParams) {
146
+ return;
147
+ }
148
+
149
+ var candidates = asArray(this.sourceParams);
150
+
151
+ for (var i = 0; i < candidates.length; i++) {
152
+ var candidate = candidates[i];
153
+ var result = candidate;
154
+
155
+ if (isFunction(result)) {
156
+ result = result({ context: offlineAudioCtx, source: bufferSource, config: this.config });
157
+ }
158
+
159
+ if (isPromise(result)) {
160
+ await result;
161
+ }
162
+ }
163
+ }.bind(this);
164
+
165
+ await applySourceParams();
166
+
142
167
  var effectNodes = (await resolveEffectsChain()).map(normalizeEffectNode).filter(Boolean);
143
168
 
144
169
  if (!effectNodes.length) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "databender",
3
- "version": "2.0.0-alpha.0",
3
+ "version": "2.0.0-alpha.1",
4
4
  "description": "Create interesting visuals by misusing the Web Audio API",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/tags CHANGED
@@ -141,12 +141,17 @@ Examples README.md /^## Examples$/;" s chapter:Databender
141
141
  Getting Started README.md /^## Getting Started$/;" s chapter:Databender
142
142
  License README.md /^## License$/;" s chapter:Databender
143
143
  Prerequisites README.md /^### Prerequisites$/;" S section:Databender""Getting Started
144
+ Source parameters README.md /^### Source parameters$/;" S section:Databender""Getting Started
144
145
  anonymousObject48d51f9d0205 dist/databender.js /^ constructor({$/;" v class:Databender.Databender
145
146
  anonymousObject48d51f9d0905 dist/databender.js /^ resolvedNode = resolvedNode({ context: offlineAudioCtx, source: buff/;" v function:Databender.Databender.constructor.render.resolveEffectsChain
147
+ anonymousObject48d51f9d0b05 dist/databender.js /^ result = result({ context: offlineAudioCtx, source: bufferSource, co/;" v function:Databender.Databender.constructor.render.applySourceParams
146
148
  anonymousObject66e3de480105 index.js /^ constructor({$/;" v class:Databender
147
149
  anonymousObject66e3de480805 index.js /^ resolvedNode = resolvedNode({ context: offlineAudioCtx, source: bufferSo/;" v function:Databender.constructor.render.resolveEffectsChain
150
+ anonymousObject66e3de480a05 index.js /^ result = result({ context: offlineAudioCtx, source: bufferSource, config/;" v function:Databender.constructor.render.applySourceParams
148
151
  anonymousObject6c12f9b20105 rollup.config.js /^ resolve({$/;" v
149
152
  anonymousObject6c12f9b20205 rollup.config.js /^ commonjs({$/;" v
153
+ applySourceParams dist/databender.js /^ var applySourceParams = async function() {$/;" f method:Databender.Databender.constructor.render
154
+ applySourceParams index.js /^ var applySourceParams = async function() {$/;" f method:Databender.constructor.render
150
155
  asArray dist/databender.js /^ const asArray = (value) => {$/;" f class:Databender
151
156
  asArray index.js /^const asArray = (value) => {$/;" f
152
157
  audioCtx dist/databender.js /^ audioCtx = null$/;" p variable:Databender.Databender.anonymousObject48d51f9d0205
@@ -162,15 +167,19 @@ chainMode dist/databender.js /^ chainMode = 'series',$/;" p variable:
162
167
  chainMode index.js /^ chainMode = 'series',$/;" p variable:Databender.anonymousObject66e3de480105
163
168
  commondir package-lock.json /^ "commondir": "^1.0.1",$/;" s object:packages.node_modules/@rollup/plugin-commonjs.dependencies
164
169
  config dist/databender.js /^ resolvedNode = resolvedNode({ context: offlineAudioCtx, source: buff/;" p variable:Databender.Databender.constructor.render.resolveEffectsChain.anonymousObject48d51f9d0905
170
+ config dist/databender.js /^ result = result({ context: offlineAudioCtx, source: bufferSource, co/;" p variable:Databender.Databender.constructor.render.applySourceParams.anonymousObject48d51f9d0b05
165
171
  config dist/databender.js /^ config = {},$/;" p variable:Databender.Databender.anonymousObject48d51f9d0205
166
172
  config index.js /^ resolvedNode = resolvedNode({ context: offlineAudioCtx, source: bufferSo/;" p variable:Databender.constructor.render.resolveEffectsChain.anonymousObject66e3de480805
173
+ config index.js /^ result = result({ context: offlineAudioCtx, source: bufferSource, config/;" p variable:Databender.constructor.render.applySourceParams.anonymousObject66e3de480a05
167
174
  config index.js /^ config = {},$/;" p variable:Databender.anonymousObject66e3de480105
168
175
  configHasChanged dist/databender.js /^ this.configHasChanged = function() {$/;" m method:Databender.Databender.constructor
169
176
  configHasChanged index.js /^ this.configHasChanged = function() {$/;" m method:Databender.constructor
170
177
  constructor dist/databender.js /^ constructor({$/;" m class:Databender.Databender
171
178
  constructor index.js /^ constructor({$/;" m class:Databender
172
179
  context dist/databender.js /^ resolvedNode = resolvedNode({ context: offlineAudioCtx, source: buff/;" p variable:Databender.Databender.constructor.render.resolveEffectsChain.anonymousObject48d51f9d0905
180
+ context dist/databender.js /^ result = result({ context: offlineAudioCtx, source: bufferSource, co/;" p variable:Databender.Databender.constructor.render.applySourceParams.anonymousObject48d51f9d0b05
173
181
  context index.js /^ resolvedNode = resolvedNode({ context: offlineAudioCtx, source: bufferSo/;" p variable:Databender.constructor.render.resolveEffectsChain.anonymousObject66e3de480805
182
+ context index.js /^ result = result({ context: offlineAudioCtx, source: bufferSource, config/;" p variable:Databender.constructor.render.applySourceParams.anonymousObject66e3de480a05
174
183
  convert dist/databender.js /^ this.convert = function(image) {$/;" m method:Databender.Databender.constructor
175
184
  convert index.js /^ this.convert = function(image) {$/;" m method:Databender.constructor
176
185
  cpu package-lock.json /^ "cpu": [$/;" a object:packages.node_modules/@rollup/rollup-android-arm-eabi
@@ -583,7 +592,11 @@ rollup package-lock.json /^ "rollup": {$/;" o object:packages.node_module
583
592
  rollup package.json /^ "rollup": "4.52.4"$/;" s object:devDependencies
584
593
  scripts package.json /^ "scripts": {$/;" o
585
594
  source dist/databender.js /^ resolvedNode = resolvedNode({ context: offlineAudioCtx, source: buff/;" p variable:Databender.Databender.constructor.render.resolveEffectsChain.anonymousObject48d51f9d0905
595
+ source dist/databender.js /^ result = result({ context: offlineAudioCtx, source: bufferSource, co/;" p variable:Databender.Databender.constructor.render.applySourceParams.anonymousObject48d51f9d0b05
586
596
  source index.js /^ resolvedNode = resolvedNode({ context: offlineAudioCtx, source: bufferSo/;" p variable:Databender.constructor.render.resolveEffectsChain.anonymousObject66e3de480805
597
+ source index.js /^ result = result({ context: offlineAudioCtx, source: bufferSource, config/;" p variable:Databender.constructor.render.applySourceParams.anonymousObject66e3de480a05
598
+ sourceParams dist/databender.js /^ sourceParams = null,$/;" p variable:Databender.Databender.anonymousObject48d51f9d0205
599
+ sourceParams index.js /^ sourceParams = null,$/;" p variable:Databender.anonymousObject66e3de480105
587
600
  supports-preserve-symlinks-flag package-lock.json /^ "supports-preserve-symlinks-flag": "^1.0.0"$/;" s object:packages.node_modules/resolve.dependencies
588
601
  test package.json /^ "test": "echo \\"Error: no test specified\\" && exit 1"$/;" s object:scripts
589
602
  updateConfig dist/databender.js /^ this.updateConfig = function(effect, param, value) {$/;" m method:Databender.Databender.constructor
@@ -597,7 +610,6 @@ version package-lock.json /^ "version": "0.30.19",$/;" s object:packages.no
597
610
  version package-lock.json /^ "version": "1.0.0",$/;" s object:packages.node_modules/is-module
598
611
  version package-lock.json /^ "version": "1.0.0",$/;" s object:packages.node_modules/supports-preserve-symlinks-flag
599
612
  version package-lock.json /^ "version": "1.0.1",$/;" s object:packages.node_modules/commondir
600
- version package-lock.json /^ "version": "1.0.4",$/;" s object:packages.
601
613
  version package-lock.json /^ "version": "1.0.7",$/;" s object:packages.node_modules/path-parse
602
614
  version package-lock.json /^ "version": "1.0.8",$/;" s object:packages.node_modules/@types/estree
603
615
  version package-lock.json /^ "version": "1.1.2",$/;" s object:packages.node_modules/function-bind
@@ -606,6 +618,7 @@ version package-lock.json /^ "version": "1.20.2",$/;" s object:packages.nod
606
618
  version package-lock.json /^ "version": "1.22.10",$/;" s object:packages.node_modules/resolve
607
619
  version package-lock.json /^ "version": "1.5.5",$/;" s object:packages.node_modules/@jridgewell/sourcemap-codec
608
620
  version package-lock.json /^ "version": "16.0.3",$/;" s object:packages.node_modules/@rollup/plugin-node-resolve
621
+ version package-lock.json /^ "version": "2.0.0-alpha.0",$/;" s object:packages.
609
622
  version package-lock.json /^ "version": "2.0.2",$/;" s object:packages.node_modules/@rollup/plugin-commonjs/node_modules/estree-walker
610
623
  version package-lock.json /^ "version": "2.0.2",$/;" s object:packages.node_modules/@rollup/pluginutils/node_modules/estree-walker
611
624
  version package-lock.json /^ "version": "2.0.2",$/;" s object:packages.node_modules/hasown
@@ -639,5 +652,5 @@ version package-lock.json /^ "version": "4.52.4",$/;" s object:packages.nod
639
652
  version package-lock.json /^ "version": "4.52.4",$/;" s object:packages.node_modules/rollup
640
653
  version package-lock.json /^ "version": "5.3.0",$/;" s object:packages.node_modules/@rollup/pluginutils
641
654
  version package-lock.json /^ "version": "6.5.0",$/;" s object:packages.node_modules/fdir
642
- version package-lock.json /^ "version": "1.0.4",$/;" s
643
- version package.json /^ "version": "1.0.4",$/;" s
655
+ version package-lock.json /^ "version": "2.0.0-alpha.0",$/;" s
656
+ version package.json /^ "version": "2.0.0-alpha.0",$/;" s