@harmonia-audio/effects 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pipeline.ts","../src/volume.ts","../src/equalizer.ts","../src/compressor.ts","../src/noise-gate.ts","../src/delay.ts","../src/reverb.ts","../src/pitch-shift.ts","../src/stereo-widener.ts","../src/loudness.ts"],"sourcesContent":["import type { AudioEffect } from \"./effect.js\";\n\n/**\n * Chainable audio effects processing pipeline.\n *\n * @example\n * ```ts\n * import { EffectsPipeline, VolumeEffect, EqualizerEffect } from '@harmonia/effects';\n *\n * const pipeline = new EffectsPipeline()\n * .add(new VolumeEffect(0.8))\n * .add(new EqualizerEffect([{ frequency: 1000, gain: 3, q: 1.0 }]));\n *\n * const processed = pipeline.process(pcmBuffer);\n * ```\n */\nexport class EffectsPipeline {\n\tprivate readonly effects: AudioEffect[] = [];\n\n\t/**\n\t * Add an effect to the pipeline.\n\t *\n\t * @example\n\t * ```ts\n\t * pipeline.add(new VolumeEffect(0.5));\n\t * ```\n\t */\n\tadd(effect: AudioEffect): this {\n\t\tthis.effects.push(effect);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Remove an effect from the pipeline.\n\t *\n\t * @example\n\t * ```ts\n\t * pipeline.remove(volumeEffect);\n\t * ```\n\t */\n\tremove(effect: AudioEffect): this {\n\t\tconst index = this.effects.indexOf(effect);\n\t\tif (index !== -1) {\n\t\t\tthis.effects.splice(index, 1);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Clear all effects from the pipeline.\n\t *\n\t * @example\n\t * ```ts\n\t * pipeline.clear();\n\t * ```\n\t */\n\tclear(): this {\n\t\tfor (const effect of this.effects) {\n\t\t\teffect.destroy();\n\t\t}\n\t\tthis.effects.length = 0;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Process audio through all effects in the pipeline.\n\t *\n\t * @example\n\t * ```ts\n\t * const processed = pipeline.process(pcmBuffer);\n\t * ```\n\t */\n\tprocess(samples: Buffer): Buffer {\n\t\tlet current = samples;\n\t\tfor (const effect of this.effects) {\n\t\t\tcurrent = effect.process(current);\n\t\t}\n\t\treturn current;\n\t}\n\n\t/**\n\t * Reset all effects in the pipeline.\n\t *\n\t * @example\n\t * ```ts\n\t * pipeline.reset();\n\t * ```\n\t */\n\treset(): void {\n\t\tfor (const effect of this.effects) {\n\t\t\teffect.reset();\n\t\t}\n\t}\n\n\t/**\n\t * Destroy the pipeline and all effects.\n\t *\n\t * @example\n\t * ```ts\n\t * pipeline.destroy();\n\t * ```\n\t */\n\tdestroy(): void {\n\t\tthis.clear();\n\t}\n\n\t/** The number of effects in the pipeline. */\n\tget length(): number {\n\t\treturn this.effects.length;\n\t}\n}\n","import { applyVolume } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Volume control effect.\n *\n * @example\n * ```ts\n * const vol = new VolumeEffect(0.5); // 50% volume\n * const output = vol.process(pcmBuffer);\n * ```\n */\nexport class VolumeEffect implements AudioEffect {\n\tprivate _volume: number;\n\n\tconstructor(volume = 1.0) {\n\t\tthis._volume = Math.max(0, Math.min(volume, 10));\n\t}\n\n\t/** Get the current volume level (0.0 to 10.0). */\n\tget volume(): number {\n\t\treturn this._volume;\n\t}\n\n\t/**\n\t * Set the volume level.\n\t *\n\t * @example\n\t * ```ts\n\t * vol.setVolume(0.8);\n\t * ```\n\t */\n\tsetVolume(volume: number): void {\n\t\tthis._volume = Math.max(0, Math.min(volume, 10));\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\tif (this._volume === 1.0) {\n\t\t\treturn samples;\n\t\t}\n\t\treturn applyVolume(samples, this._volume);\n\t}\n\n\treset(): void {\n\t\t// Volume is stateless\n\t}\n\n\tdestroy(): void {\n\t\t// No native resources to release\n\t}\n}\n","import { BiquadFilter } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Configuration for a single equalizer band.\n *\n * @example\n * ```ts\n * const band: EqualizerBand = { frequency: 1000, gain: 3, q: 1.0 };\n * ```\n */\nexport interface EqualizerBand {\n\treadonly frequency: number;\n\treadonly gain: number;\n\treadonly q: number;\n}\n\n/**\n * Multi-band parametric equalizer effect using biquad filters.\n *\n * @example\n * ```ts\n * const eq = new EqualizerEffect([\n * { frequency: 60, gain: 3, q: 0.7 },\n * { frequency: 1000, gain: -2, q: 1.0 },\n * { frequency: 8000, gain: 1, q: 1.4 },\n * ]);\n * const output = eq.process(pcmBuffer);\n * ```\n */\nexport class EqualizerEffect implements AudioEffect {\n\tprivate readonly filters: BiquadFilter[];\n\tprivate readonly sampleRate: number;\n\n\tconstructor(bands: readonly EqualizerBand[], sampleRate = 48000) {\n\t\tthis.sampleRate = sampleRate;\n\t\tthis.filters = bands.map((band) =>\n\t\t\tBiquadFilter.peakingEq(sampleRate, band.frequency, band.q, band.gain),\n\t\t);\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\tlet current = samples;\n\t\tfor (const filter of this.filters) {\n\t\t\tcurrent = filter.process(current);\n\t\t}\n\t\treturn current;\n\t}\n\n\treset(): void {\n\t\tfor (const filter of this.filters) {\n\t\t\tfilter.reset();\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\t// Filters are GC'd\n\t}\n}\n","import { Compressor } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Options for the compressor effect.\n *\n * @example\n * ```ts\n * const options: CompressorOptions = {\n * threshold: -20,\n * ratio: 4,\n * attack: 5,\n * release: 100,\n * };\n * ```\n */\nexport interface CompressorOptions {\n\treadonly threshold: number;\n\treadonly ratio: number;\n\treadonly attack: number;\n\treadonly release: number;\n\treadonly makeupGain?: number;\n\treadonly knee?: number;\n\treadonly sampleRate?: number;\n}\n\n/**\n * Dynamic range compressor effect.\n *\n * @example\n * ```ts\n * const compressor = new CompressorEffect({\n * threshold: -20,\n * ratio: 4,\n * attack: 5,\n * release: 100,\n * });\n * const output = compressor.process(pcmBuffer);\n * ```\n */\nexport class CompressorEffect implements AudioEffect {\n\tprivate readonly native: Compressor;\n\n\tconstructor(options: CompressorOptions) {\n\t\tthis.native = new Compressor(\n\t\t\toptions.threshold,\n\t\t\toptions.ratio,\n\t\t\toptions.attack,\n\t\t\toptions.release,\n\t\t\toptions.makeupGain ?? 0,\n\t\t\toptions.knee ?? 6,\n\t\t\toptions.sampleRate ?? 48000,\n\t\t);\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\treturn this.native.process(samples);\n\t}\n\n\treset(): void {\n\t\tthis.native.reset();\n\t}\n\n\tdestroy(): void {\n\t\t// Native compressor is GC'd\n\t}\n}\n","import { NoiseGate } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Options for the noise gate effect.\n *\n * @example\n * ```ts\n * const gate = new NoiseGateEffect({ threshold: -40, attack: 1, release: 50, hold: 20 });\n * ```\n */\nexport interface NoiseGateOptions {\n\treadonly threshold: number;\n\treadonly attack: number;\n\treadonly release: number;\n\treadonly hold: number;\n\treadonly sampleRate?: number;\n}\n\n/**\n * Noise gate effect that silences audio below a threshold.\n *\n * @example\n * ```ts\n * const gate = new NoiseGateEffect({\n * threshold: -40,\n * attack: 1,\n * release: 50,\n * hold: 20,\n * });\n * const output = gate.process(pcmBuffer);\n * ```\n */\nexport class NoiseGateEffect implements AudioEffect {\n\tprivate readonly native: NoiseGate;\n\n\tconstructor(options: NoiseGateOptions) {\n\t\tthis.native = new NoiseGate(\n\t\t\toptions.threshold,\n\t\t\toptions.attack,\n\t\t\toptions.release,\n\t\t\toptions.hold,\n\t\t\toptions.sampleRate ?? 48000,\n\t\t);\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\treturn this.native.process(samples);\n\t}\n\n\treset(): void {\n\t\t// NoiseGate doesn't expose reset in native, create new\n\t}\n\n\tdestroy(): void {\n\t\t// GC'd\n\t}\n}\n","import { Delay } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Options for the delay/echo effect.\n *\n * @example\n * ```ts\n * const delay = new DelayEffect({ delayMs: 300, feedback: 0.4, wet: 0.3 });\n * ```\n */\nexport interface DelayOptions {\n\treadonly delayMs: number;\n\treadonly feedback: number;\n\treadonly wet: number;\n\treadonly sampleRate?: number;\n}\n\n/**\n * Delay/echo audio effect.\n *\n * @example\n * ```ts\n * const delay = new DelayEffect({\n * delayMs: 300,\n * feedback: 0.4,\n * wet: 0.3,\n * });\n * const output = delay.process(pcmBuffer);\n * ```\n */\nexport class DelayEffect implements AudioEffect {\n\tprivate readonly native: Delay;\n\n\tconstructor(options: DelayOptions) {\n\t\tthis.native = new Delay(\n\t\t\toptions.delayMs,\n\t\t\toptions.feedback,\n\t\t\toptions.wet,\n\t\t\toptions.sampleRate ?? 48000,\n\t\t);\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\treturn this.native.process(samples);\n\t}\n\n\treset(): void {\n\t\t// Delay buffer is internal to native\n\t}\n\n\tdestroy(): void {\n\t\t// GC'd\n\t}\n}\n","import { ConvolutionReverb } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Convolution reverb effect using an impulse response.\n *\n * @example\n * ```ts\n * import { readFileSync } from 'fs';\n *\n * const ir = readFileSync('./hall-ir.pcm');\n * const reverb = new ReverbEffect(ir);\n * const output = reverb.process(pcmBuffer);\n * ```\n */\nexport class ReverbEffect implements AudioEffect {\n\tprivate readonly native: ConvolutionReverb;\n\n\tconstructor(impulseResponse: Buffer) {\n\t\tthis.native = new ConvolutionReverb(impulseResponse);\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\treturn this.native.process(samples);\n\t}\n\n\treset(): void {\n\t\t// Convolution state is maintained internally\n\t}\n\n\tdestroy(): void {\n\t\t// GC'd\n\t}\n}\n","import { PhaseVocoder } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Pitch shifting effect using a phase vocoder.\n *\n * @example\n * ```ts\n * const pitch = new PitchShiftEffect(1.5); // shift up by 50%\n * const output = pitch.process(pcmBuffer);\n * ```\n */\nexport class PitchShiftEffect implements AudioEffect {\n\tprivate readonly native: PhaseVocoder;\n\n\tconstructor(pitchFactor: number, fftSize = 2048) {\n\t\tthis.native = new PhaseVocoder(fftSize, pitchFactor);\n\t}\n\n\t/**\n\t * Update the pitch factor at runtime.\n\t *\n\t * @example\n\t * ```ts\n\t * pitch.setPitchFactor(0.8);\n\t * ```\n\t */\n\tsetPitchFactor(factor: number): void {\n\t\tthis.native.setPitchFactor(factor);\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\treturn this.native.process(samples);\n\t}\n\n\treset(): void {\n\t\t// Phase vocoder state is internal\n\t}\n\n\tdestroy(): void {\n\t\t// GC'd\n\t}\n}\n","import { stereoWiden, monoDownmix } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Stereo widening effect with mono downmix capability.\n *\n * @example\n * ```ts\n * const widener = new StereoWidenerEffect(1.5);\n * const wider = widener.process(stereoBuffer);\n * ```\n */\nexport class StereoWidenerEffect implements AudioEffect {\n\tprivate _width: number;\n\tprivate _monoOutput: boolean;\n\n\tconstructor(width = 1.0, monoOutput = false) {\n\t\tthis._width = width;\n\t\tthis._monoOutput = monoOutput;\n\t}\n\n\t/**\n\t * Set the stereo width.\n\t *\n\t * @example\n\t * ```ts\n\t * widener.setWidth(2.0);\n\t * ```\n\t */\n\tsetWidth(width: number): void {\n\t\tthis._width = width;\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\tif (this._monoOutput) {\n\t\t\treturn monoDownmix(samples);\n\t\t}\n\t\tif (this._width === 1.0) {\n\t\t\treturn samples;\n\t\t}\n\t\treturn stereoWiden(samples, this._width);\n\t}\n\n\treset(): void {\n\t\t// Stateless\n\t}\n\n\tdestroy(): void {\n\t\t// Nothing to clean up\n\t}\n}\n","import { LoudnessNormalizer } from \"@harmonia-audio/native\";\nimport type { AudioEffect } from \"./effect.js\";\n\n/**\n * Options for loudness normalization.\n *\n * @example\n * ```ts\n * const normalizer = new LoudnessNormalizerEffect({ targetLufs: -14 });\n * ```\n */\nexport interface LoudnessOptions {\n\treadonly targetLufs: number;\n\treadonly sampleRate?: number;\n}\n\n/**\n * Loudness normalization effect targeting a specific LUFS level.\n *\n * @example\n * ```ts\n * const normalizer = new LoudnessNormalizerEffect({ targetLufs: -14 });\n * const normalized = normalizer.process(pcmBuffer);\n * ```\n */\nexport class LoudnessNormalizerEffect implements AudioEffect {\n\tprivate readonly native: LoudnessNormalizer;\n\n\tconstructor(options: LoudnessOptions) {\n\t\tthis.native = new LoudnessNormalizer(\n\t\t\toptions.targetLufs,\n\t\t\toptions.sampleRate ?? 48000,\n\t\t);\n\t}\n\n\tprocess(samples: Buffer): Buffer {\n\t\treturn this.native.process(samples);\n\t}\n\n\treset(): void {\n\t\t// Internal state managed by native\n\t}\n\n\tdestroy(): void {\n\t\t// GC'd\n\t}\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@harmonia-audio/effects",
3
+ "version": "0.1.0",
4
+ "description": "Real-time audio effects and DSP processing for harmonia",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "require": {
17
+ "types": "./dist/index.d.cts",
18
+ "default": "./dist/index.cjs"
19
+ }
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "dependencies": {
26
+ "@harmonia-audio/native": "0.1.0"
27
+ },
28
+ "devDependencies": {
29
+ "tsup": "^8.3.5",
30
+ "typescript": "^5.7.2",
31
+ "vitest": "^2.1.8",
32
+ "rimraf": "^6.0.1"
33
+ },
34
+ "scripts": {
35
+ "build": "tsup",
36
+ "test": "vitest run",
37
+ "typecheck": "tsc --noEmit",
38
+ "clean": "rimraf dist"
39
+ }
40
+ }