@vessel-dsp/runtime 0.2.1 → 0.2.2

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
@@ -1,27 +1,28 @@
1
1
  # @vessel-dsp/runtime
2
2
 
3
- Headless real time MNA simulation runtime and solver console for compiled VesselDSP `Program` ROMs. It executes a `@vessel-dsp/compiler` program on audio streams with trapezoidal integration and damped Newton Raphson iteration. It depends on `@vessel-dsp/compiler` only.
3
+ Headless real time MNA simulation runtime and solver console for compiled VesselDSP `Program` ROMs. It executes a `@vessel-dsp/compiler` program on audio streams with trapezoidal integration and damped Newton Raphson iteration. It depends on `@vessel-dsp/compiler` only. The same package ships the compiled C++/WASM console (`V2WasmEngine`) as a release artifact under `./wasm/*`.
4
4
 
5
5
  ## Install
6
6
 
7
- `@vessel-dsp/runtime` 0.1.0 is not yet on npm. Until the release is published, use the package from this repository's workspace rather than an install command that will 404.
7
+ `@vessel-dsp/runtime` 0.2.1 is on npm. Use runtime 0.2.1 or later: 0.2.0 cannot load a program inside an AudioWorklet (`structuredClone` is not defined there).
8
+
8
9
 
9
10
  ```bash
10
- # once published:
11
- bun add @vessel-dsp/runtime
11
+ bun add @vessel-dsp/runtime @vessel-dsp/compiler
12
12
  ```
13
13
 
14
+ Subpath exports: `.` (the `ReferenceRuntime` console, chain runtime, admission, settling, and measurement helpers) and `./wasm/*` (the compiled solver console files: `v2_dsp.cjs` glue plus `v2_dsp.wasm`).
15
+
14
16
  ## Minimal example
15
17
 
16
- The constructor takes the program and optional block elimination only. The sample rate goes to `prepare()`, which has no default. `process()` takes a `Float64Array` and returns a new `Float64Array`.
18
+ The constructor takes the program and optional block elimination only. The sample rate goes to `prepare()`, which has no default. `process()` takes a `Float64Array` and returns a new `Float64Array`. The circuit below ships with the compiler under `./fixtures`, so this runs as written:
17
19
 
18
20
  ```ts
19
- import { readFileSync } from "node:fs";
20
- import { compile, pedalPartCatalog } from "@vessel-dsp/compiler";
21
+ import { compile, emptyRegistry } from "@vessel-dsp/compiler";
22
+ import { commonEmitterAmplifier } from "@vessel-dsp/compiler/fixtures";
21
23
  import { ReferenceRuntime } from "@vessel-dsp/runtime";
22
24
 
23
- const source = readFileSync("big-muff-pi.vdsp", "utf8");
24
- const compiled = compile(source, { registry: pedalPartCatalog });
25
+ const compiled = compile(commonEmitterAmplifier, { registry: emptyRegistry });
25
26
  if (compiled.status !== "ok") throw new Error("compile failed");
26
27
 
27
28
  const runtime = new ReferenceRuntime(compiled.program);
@@ -42,7 +43,7 @@ console.log("output peak:", peak.toFixed(6));
42
43
  ```text
43
44
  output length: 128
44
45
  output is Float64Array: true
45
- output peak: 0.265499
46
+ output peak: 0.896891
46
47
  ```
47
48
 
48
49
  The previous version of this example constructed `new ReferenceRuntime(program, 44100)` and called `process(inputBuffer, outputBuffer)` with `Float32Array` buffers. That throws `RuntimeError: prepare(sampleRate) was never called`, because the second constructor argument is an options object and the rate is only accepted by `prepare()`.
@@ -64,115 +65,47 @@ The previous version of this example constructed `new ReferenceRuntime(program,
64
65
 
65
66
  ## Supply control
66
67
 
67
- `getSupplies()` lists every addressable `dc-source` stamp as `SupplyInfo` (`address`, `positive`, `negative`, `volts`, `sourceOhms`). `big-muff-pi` reports one supply: block 0, source 0, 9 V, 1 ohm.
68
+ Both consoles expose the same pair: `getSupplies()` lists every addressable `dc-source` stamp as `SupplyInfo` (`address`, `positive`, `negative`, `volts`, `sourceOhms`), and `setSupply(addresses, volts, sourceOhms)` retargets them between `process()` calls with effect from the next sample. The common-emitter fixture reports one supply: block 0, source 0, 9 V, 1 ohm.
69
+
70
+ `setSupply` validates every address before touching state, replaces the touched stamps on the runtime own copies (never the caller `Program`), rebuilds each affected block base matrix the way `prepare()` builds it, and bumps the control generation so eliminated path factorisation rebuilds. Re applying identical values rebuilds nothing (`supplyRebuilds` unchanged). The DC operating point is deliberately not re solved and reactive state carries over.
68
71
 
69
- `setSupply(addresses, volts, sourceOhms)` retargets supply stamps between `process()` calls with effect from the next sample. It validates every address before touching state, replaces the touched stamps on the runtime own copies (never the caller `Program`), rebuilds each affected block base matrix the way `prepare()` builds it, and bumps the control generation so eliminated path factorisation rebuilds. Re applying identical values rebuilds nothing. The DC operating point is deliberately not re solved and reactive state carries over.
72
+ Call `setSupply` before `prepare()` or mid-stream. The two consoles solve the operating point at different moments, so a call between `prepare()` and the first sample is not guaranteed to agree across them. Which stamps are the external supply is the compiler's `resolveSupplyStamps` (see the Compiler guide); the consoles only retarget the addresses they are given.
70
73
 
71
- What it does not do: no mutation of the caller `Program` (two runtimes from one program never interact; a frozen program never throws), no envelope follower or waveshaper, no audio domain processing of any kind. This is the TypeScript reference runtime only.
74
+ What it does not do: no mutation of the caller `Program` (two runtimes from one program never interact; a frozen program never throws), no envelope follower or waveshaper, no audio domain processing of any kind.
72
75
 
73
76
  `supplyRebuilds` counts block base matrix rebuilds so far. Bad addresses throw: unknown block index, non MNA block, or missing source index, each naming the block and index. Non finite volts and negative or non finite `sourceOhms` throw.
74
77
 
75
78
  ## Admission
76
79
 
77
- `admissionVerdict(chain, sampleRate, budget)` answers whether an ordered list of programs can be shown to fit inside a host CPU budget. Costs add across slots; a one program caller passes a one element list. The budget carries `nsPerSolve`, `nsPerMacroSample` (required; an unpriced model is refused by name, never costed at zero), `budgetedIterationsPerSample` (default 64, a sustained policy allowance, not the solver cap), and `cpuBudgetFraction` (default 1). The verdict is `{ fits: true }` or `{ fits: false, reason }` with the worst offender named by slot, block, unknowns, and nanoseconds. `predictedWorstCaseNs` returns the same sum as a number, or null when a model has no price.
80
+ `admissionVerdict(chain, sampleRate, budget)` answers whether an ordered list of programs can be shown to fit inside a host CPU budget. Costs add across slots; a one program caller passes a one element list. The budget carries `nsPerSolve`, `nsPerMacroSample` (required; an unpriced model is refused by name, never costed at zero), `budgetedIterationsPerSample` (default 64, a sustained policy allowance, not the solver cap), and `cpuBudgetFraction` (default 1). The verdict is `{ fits: true }` or `{ fits: false, reason }` with the worst offender named by slot, block, unknowns, and nanoseconds. `predictedWorstCaseNs` returns the same sum as a number, or null when a model has no price. `calibrateNsPerSolve` measures this host's real per-solve cost to feed the budget instead of a guess.
78
81
 
79
82
  ## Settling and measurement
80
83
 
81
- These render a program until its level stops moving, so startup transients are not measured as the circuit.
82
-
83
- | Name | What it is |
84
- | --- | --- |
85
- | `findSettled` | First window at which the level holds still, or null. |
86
- | `measureSettled` | Render until the output level stops moving and report it. |
87
- | `measureSettledSignal` | Driven level with the silent part removed. |
88
- | `measureSharedWindow` | Several drive levels over one shared settled window. |
89
- | `measureInputAttributable` | Per node AC attributable to the input (driven minus silent). |
90
- | `settledRender` | Render until still, in a value, refusal, or diverged shape. |
91
- | `settledLevel` | `settledRender` level as a bare number, throwing when it cannot settle. |
92
- | `settledSweep` | Settle once, then measure each control setting on the same runtime. |
93
- | `settledSweepVerified` | Sweep with one point verified against an independent render. |
94
- | `sweepMatchesIndependent` | Whether a sweep point matches an independent render. |
95
- | `sweepIsOrderIndependent` | Whether sweep order changes the result. |
96
- | `settleSelfCheck` | Known answer controls for the measurement primitives. |
97
- | `SettleOptions` | Window, consecutive, stable dB, and ladder seconds. |
98
- | `SETTLE_DEFAULTS` | Corpus measured defaults (0.5 s window, 2 consecutive, 0.25 dB). |
99
- | `SettleCriterion` | Which criterion produced a measurement. |
100
- | `Settled` | `{ rms, seconds }` of the settled window. |
101
- | `SettledMeasurement` | `{ rms, peak, settleSeconds, renderedSeconds, flatAtZero }`. |
102
- | `SettledRender` | Value, refusal, or diverged outcome of `settledRender`. |
103
- | `SettledRenderOptions` | What to render. |
104
- | `SettleRefusal` | Thrown by `settledLevel` instead of an unstandable level. |
105
- | `SharedWindowMeasurement` | One drive behaviour over the shared window. |
106
- | `AttributedMeasurement` | Driven level plus attributable fraction from one window. |
107
- | `InputAttributableNode` | One node response with and without stimulus. |
108
- | `FLAT_AT_ZERO_RMS` | Level below this (1e-6) is noise, not measurement. |
109
- | `isFlatAtZero` | Whether a level is indistinguishable from noise. |
110
-
111
- `findSettled([1, 1.001, 1.0005, 1.0001])` returns `{ rms: 1.0005, seconds: 1.5 }`; `findSettled([1, 2, 4, 8])` returns null. `measureSettled` on `big-muff-pi` at 48000 Hz with a 0.3 V 440 Hz sine reports rms about 0.2010, peak about 0.2491, settled in 1.5 s.
84
+ `settledRender(program, options)` renders until the output level stops moving and returns a verdict — `settled` with `rms`, `peak`, and the rendered tail, or a refusal/diverged shape — never a bare number. The resistor-divider fixture at 1 V drive settles to exactly its 0.5 ratio (`rms` 0.3536, `peak` 0.5). Alongside it: `measureSharedWindow` and `measureInputAttributable` (shared-window comparisons), `settledSweepVerified` (a control sweep with one point verified against an independent render), and `SETTLE_DEFAULTS` (corpus measured defaults: 0.5 s window, 2 consecutive, 0.25 dB).
112
85
 
113
86
  ## Chain runtime and advisories
114
87
 
115
- | Name | What it is |
116
- | --- | --- |
117
- | `ChainRuntime` | Ordered slots where each slot output feeds the next. |
118
- | `ChainSlot` | A program slot or an injected processor slot. |
119
- | `ChainSlotTelemetry` | One slot telemetry labelled by position. |
120
- | `programSlot` | A compiled circuit as a slot. |
121
- | `processorSlot` | An injected processor (NAM, IR, cab) as a slot. |
122
- | `ExternalProcessor` | A host supplied processor: NAM profile, impulse response, cab simulation. |
123
- | `slotContract` | The contract a slot presents to seam arithmetic. |
124
- | `SlotContract` | What the chain needs to know about a slot. |
125
- | `slotLabel` | Human readable label for a slot. |
126
- | `supplyGroundConflicts` | Slot pairs whose shared supply would short through grounds. |
127
- | `SupplyGroundConflict` | One conflicting slot pair with message. |
128
- | `chainAdvisories` | Seams where one side states no full scale, plus kind errors. |
129
- | `ChainAdvisory` | One chain problem with code, slots, and message. |
130
- | `chainScaleFactor` | Multiplier from two adjacent port full scales (null is unity). |
131
- | `chainScaleAdvisories` | Boundaries where the chain fell back to unity scaling. |
132
- | `ChainScaleAdvisory` | One unity fallback boundary with message. |
133
- | `seamScale` | Multiplier applied to the signal crossing into a slot. |
134
- | `seamDivider` | Resistive divider at a seam, or 1 when not computable. |
135
- | `dacScaleFactor` | Worklet DAC multiplier so a rail swing does not peg output. |
136
- | `outputDbfs` | Output level in dBFS at the DAC. |
137
- | `outputConversionFullScale` | Declared 0 dBFS reference where stated, else derived ceiling. |
138
- | `taperFraction` | Fraction of track at a 0..1 position for a taper kind. |
139
- | `StageCoverage` | `instrument`, `preamp`, `speaker-electrical`, or `miked`. |
140
-
141
- `ChainRuntime` gates the whole chain once against the admission budget, then prepares every slot ungated at the same rate. `process()` feeds slot outputs forward with `seamScale` between them. `setControl(slot, id, position)` addresses one slot; processor slots refuse with the slot named. `telemetry()` returns per slot telemetry, never blended.
142
-
143
- `supplyGroundConflicts([muff, rangemaster])` reports that the positive ground treble booster and the negative ground muff cannot share one supply. `chainAdvisories` reports `unscalable-seam` where a full scale is null, `speaker-signal-into-input` where a speaker terminal feeds an instrument input, `cab-after-miked`, `undividable-seam`, and `instrument-into-speaker-stage`.
144
-
145
- ## WASM engine
146
-
147
- | Name | What it is |
148
- | --- | --- |
149
- | `V2WasmEngine` | Exported TypeScript wrapper around the C++ V2 console. Requires a build artifact the package does not ship; not usable from the npm package today. |
150
- | `getV2WasmModule` | Loads the V2 Emscripten module from the missing build artifact. |
151
-
152
- `V2WasmEngine` dynamically imports `../../build/v2_dsp.cjs`, a built artifact that is not in this repository and not in the package `files` (`dist`, `README.md`, `LICENSE.md`). From an installed tarball it fails with:
88
+ - `ChainRuntime`: ordered slots where each slot output feeds the next. `programSlot` wraps a compiled circuit; `processorSlot` wraps a host supplied processor (NAM, IR, cab). Gates the whole chain once against the admission budget, then prepares every slot ungated at the same rate. `setControl(slot, id, position)` addresses one slot; `telemetry()` returns per slot telemetry, never blended.
89
+ - `slotContract`: the contract a slot presents to seam arithmetic. `supplyGroundConflicts([programs])`: slot groups whose shared supply would short through grounds (fires when a `positive-ground` program meets a `negative-ground` or `dual-rail` one; `unpowered` conflicts with nothing). `chainAdvisories([contracts])`: seams where one side states no full scale (`unscalable-seam`), plus kind errors (`speaker-signal-into-input`, `cab-after-miked`, `undividable-seam`, `instrument-into-speaker-stage`, `bypass-not-modelled`).
90
+ - `seamScale`: multiplier applied to the signal crossing into a slot (1 when either side states no full scale). `dacScaleFactor`: worklet DAC multiplier so a rail swing does not peg output. `outputConversionFullScale`: declared 0 dBFS reference where stated, else derived ceiling. `outputDbfs`: output level in dBFS at the DAC.
91
+ - `taperFraction`: fraction of track at a 0..1 position for a taper kind.
92
+ - `resolveBypassMode`: chain bypass mode for a program bypass, or null where the host must decide (`buffered` kinds until the buffer program lands).
93
+ - `bypassNotModelledAdvisories`: bypass requests on slots whose packet declares no bypass switch.
153
94
 
154
- ```text
155
- Error: Cannot find module
156
- '/tmp/v2proof-proj/node_modules/@vessel-dsp/build/v2_dsp.cjs'
157
- imported from
158
- '/tmp/v2proof-proj/node_modules/@vessel-dsp/runtime/dist/v2-wasm-engine.js'
159
- ```
95
+ `supplyGroundConflicts([muff, rangemaster])` reports that the positive ground treble booster and the negative ground muff cannot share one supply. See the Runtime guide for worked samples.
96
+
97
+ ## WASM console
98
+
99
+ `V2WasmEngine` is the compiled C++/WASM console for the same programs. It ships in this package: `bun run --cwd packages/runtime build:wasm` (needs `em++`) writes `v2_dsp.cjs` plus `v2_dsp.wasm` to the gitignored `src/wasm/`, `build` copies them to `dist/wasm/`, and `prepack` does both, so the published tarball always carries a freshly built console. The 0.2.0 tarball is about 1.0 MB packed (3.1 MB unpacked): 2.1 MB of wasm plus about 15 KB of glue.
100
+
101
+ `V2WasmEngine.create(program?)` loads the glue from the package's own `dist/wasm/` — no path to configure — and optionally loads a program. `prepare({ sampleRate, maxNewtonIterations, inputSourceOhms })` (rate defaults to 48000), `processSample` / `processBlock` on `Float32Array`s, `getControl` beside `setControl`, `getSupplies`/`setSupply` with the same validation and `RuntimeError` behaviour as the reference console, and schedule telemetry (`getScheduleTelemetry`: solves, fallbacks, kernel solves, repivoted, abandoned, dropped blocks — a healthy packet reads zero fallbacks and zero abandoned blocks).
102
+
103
+ A host that cannot dynamically import the glue — an `AudioWorkletGlobalScope` bundles it statically and has no `fetch` — instantiates the module from pre-fetched bytes and passes it as the second argument: `V2WasmEngine.create(program, mod)`, where `mod` comes from the glue factory called with `{ wasmBinary }` read from `@vessel-dsp/runtime/wasm/v2_dsp.wasm`. See the Runtime guide for both paths end to end; on a biased BJT stage the two consoles agree sample by sample to about 1e-7.
104
+
105
+ ## Reference console surface
106
+
107
+ Values: `ReferenceRuntime`, `DEFAULT_NEWTON_MAX_ITERATIONS`, `admissionVerdict`, `predictedWorstCaseNs`, `calibrateNsPerSolve`, `denseLinearSolveWorkload`, `ChainRuntime`, `programSlot`, `processorSlot`, `slotContract`, `resolveBypassMode`, `chainAdvisories`, `bypassNotModelledAdvisories`, `seamScale`, `dacScaleFactor`, `outputConversionFullScale`, `outputDbfs`, `supplyGroundConflicts`, `taperFraction`, `settledRender`, `settledSweepVerified`, `measureSharedWindow`, `measureInputAttributable`, `SETTLE_DEFAULTS`, `V2WasmEngine`.
108
+
109
+ Types (import with `import type`): `RuntimeNodeVoltageSnapshot`, `SupplyAddress`, `SupplyInfo`, `AdmissionVerdict`, `RealtimeBudget`, `ChainSlot`, `ExternalProcessor`, `SlotContract`, `StageCoverage`, `SupplyGroundConflict`, `ChainAdvisory`, `SettleOptions`, `CalibrationResult`, and the rest in the package sources.
160
110
 
161
- Evidence: packed the runtime and compiler tarballs, installed both with npm into an empty project under `/tmp`, and called `getV2WasmModule()` and `V2WasmEngine.create()`. Both reject with the error above; the tarball contains `dist` only, no `build` directory. The export is kept as is (removing it is an API decision for the maintainer). Two options for the maintainer: ship the built artifact in the package `files`, or drop the export.
162
-
163
- ## Reference runtime surface
164
-
165
- | Name | What it is |
166
- | --- | --- |
167
- | `ReferenceRuntime` | The executable semantics of the program format. |
168
- | `RuntimeTelemetry` | What the solver did, so failing to solve is never silent. |
169
- | `RuntimeBranchCurrent` | One solved branch current per auxiliary unknown. |
170
- | `RuntimeNodeVoltageSnapshot` | Per block node voltages. |
171
- | `SupplyAddress` | `{ blockIndex, sourceIndex }` naming one `dc-source` stamp. |
172
- | `SupplyInfo` | Address plus the stamp own positive, negative, volts, sourceOhms. |
173
- | `DEFAULT_NEWTON_MAX_ITERATIONS` | How long a Newton loop may try before its iterate is the answer. |
174
- | `RealtimeBudget` | Host measured solve costs plus iteration and fraction policy. |
175
- | `AdmissionVerdict` | `{ fits: true }` or `{ fits: false, reason }`. |
176
- | `admissionVerdict` | Whether a chain of programs fits inside a budget. |
177
- | `predictedWorstCaseNs` | The admission worst case sum as a number, or null. |
178
- | `RuntimeError` | Thrown for misuse: no prepare, bad rate, bad control, bad supply, unimplemented operator or model. |
111
+ `RuntimeError` is thrown for misuse: no prepare, bad rate, bad control, bad supply, unimplemented operator or model.
@@ -1 +1 @@
1
- {"version":3,"file":"taper.d.ts","sourceRoot":"","sources":["../src/taper.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBxE"}
1
+ {"version":3,"file":"taper.d.ts","sourceRoot":"","sources":["../src/taper.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBxE"}
package/dist/taper.js CHANGED
@@ -16,10 +16,14 @@
16
16
  */
17
17
  export function taperFraction(taper, position) {
18
18
  const x = Math.min(1, Math.max(0, position));
19
- // Base 81 is not arbitrary: it is the value for which (b^0.5 - 1)/(b - 1) is
20
- // exactly 0.1, which is the audio-taper convention of 10% of the track at half
21
- // rotation. Solving 0.1 = (u - 1)/(u^2 - 1) for u = sqrt(b) gives u = 9.
22
- const audioBase = 81;
19
+ // Base 1089/49 is not arbitrary: it is the value for which (b^0.5 - 1)/(b - 1) is
20
+ // exactly 0.175, the midpoint of the Alpha A-taper maker's bracket (10-25% of track
21
+ // at the 150-degree test point of a 300-degree rotation; Alpha RV16AF SP16050157
22
+ // p. 4 section 2.4). Solving 0.175 = (u - 1)/(u^2 - 1) = 1/(u + 1) for u = sqrt(b)
23
+ // gives u = 33/7, so b = 1089/49. Meter-confirmed 2026-10-01 on specimen RT-301860:
24
+ // Volume 19.3%, Distortion 20%, Filter 21% at the noon mark. The previous base 81
25
+ // (10% edge of the same bracket) under-read every audio-taper noon by ~4.4 dB.
26
+ const audioBase = 1089 / 49;
23
27
  if (taper === "logarithmic") {
24
28
  return (audioBase ** x - 1) / (audioBase - 1);
25
29
  }
package/dist/taper.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"taper.js","sourceRoot":"","sources":["../src/taper.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,mFAAmF;AACnF,qFAAqF;AACrF,wFAAwF;AACxF,kFAAkF;AAClF,sFAAsF;AACtF,EAAE;AACF,0FAA0F;AAI1F;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,QAAgB;IAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7C,6EAA6E;IAC7E,+EAA+E;IAC/E,yEAAyE;IACzE,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC7B,OAAO,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,KAAK,KAAK,qBAAqB,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,KAAK,gBAAgB,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC"}
1
+ {"version":3,"file":"taper.js","sourceRoot":"","sources":["../src/taper.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,mFAAmF;AACnF,qFAAqF;AACrF,wFAAwF;AACxF,kFAAkF;AAClF,sFAAsF;AACtF,EAAE;AACF,0FAA0F;AAI1F;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,QAAgB;IAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7C,kFAAkF;IAClF,oFAAoF;IACpF,iFAAiF;IACjF,mFAAmF;IACnF,oFAAoF;IACpF,kFAAkF;IAClF,+EAA+E;IAC/E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;IAC5B,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC7B,OAAO,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,KAAK,KAAK,qBAAqB,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,KAAK,gBAAgB,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vessel-dsp/runtime",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Real-time MNA simulation runtime and solver console for VesselDSP Program ROMs.",
5
5
  "keywords": [
6
6
  "guitar-pedal",