Skip to content

Releases: cutterbl/SoundTouchJS

v2.0.3

15 May 20:19

Choose a tag to compare

2.0.3 (2026-05-15)

Bug Fixes

  • release: Use flat projectsRelationship, remove per-package GitHub releases (#77)

❤️ Thank You

  • Steve 'Cutter' Blades

v2.0.2

15 May 20:09

Choose a tag to compare

2.0.2 (2026-05-15)

Bug Fixes

  • release: Set releaseTagPattern to match existing v{version} git tags (#76)
  • Release conventional commits (#75)
  • release: Remove duplicate conventionalCommits from version config (#74)
  • Release (#73)
  • Release (#72)
  • ci: Allow workflow_dispatch to bypass release commit check (#70)
  • ci: Remove paths-ignore from storybook pages trigger, add workflow_dispatch (#69)

❤️ Thank You

  • Steve 'Cutter' Blades

v2.0.1

15 May 13:52

Choose a tag to compare

2.0.1 (2026-05-15)

This was a version bump only for @soundtouchjs/formant-correction-worklet to align it with other projects, there were no code changes.

v2.0.0

14 May 21:55

Choose a tag to compare

2.0.0 (2026-05-14)

Features

  • ⚠️ Add worklet ecosystem, offline rendering, and processor metrics; drop legacy ScriptProcessorNode API (#65)
  • Update README to reflect LGPL-3.0 license upgrade (#64)

⚠️ Breaking Changes

  • Add worklet ecosystem, offline rendering, and processor metrics; drop legacy ScriptProcessorNode API (#65)
    PitchShifter, SimpleFilter, WebAudioBufferSource,
    getWebAudioNode, and FilterSupport are no longer exported from
    @soundtouchjs/core. SoundTouch no longer exposes rate, tempo, virtualRate,
    or virtualTempo. SoundTouchNode no longer exposes tempo or rate AudioParams.
    Remove PitchShifter, SimpleFilter, WebAudioBufferSource, getWebAudioNode,
    FilterSupport, minsSecs, and noop — all solely supported the deprecated
    ScriptProcessorNode path. AudioWorklet is supported in all targeted browsers
    including iOS Safari 14.5+.
    Simplify SoundTouch to pitch-only public control: remove rate, tempo,
    virtualRate, virtualTempo, rateChange, and tempoChange setters. Internal
    _rate and _tempo are now always derived from virtualPitch.
    Remove tempo and rate AudioParams from SoundTouchNode. Playback speed is
    controlled exclusively by mirroring playbackRate on both the source node
    and SoundTouchNode.
    Add CLAUDE.md with mandatory code change requirements: JSDoc, tests, and
    documentation gates, plus Conventional Commits table and project conventions.
    Update all READMEs, Storybook stories, and .mdx docs to reflect the current
    public API and remove all references to removed symbols. Consolidate three
    duplicate root-level .mdx files into their beginner-friendly core/ versions.
    • chore(docs): Enrich CLAUDE.md with commands, architecture, and project conventions
      Add Commands and Architecture sections documenting Nx task commands, the
      SoundTouch processing pipeline, AudioWorklet pattern, worklet processor
      bundling, interpolation strategy plugin system, test setup, and Nx
      auto-detection rules. Correct the test command from pnpm --filter to
      pnpm nx test, add feat!/BREAKING CHANGE commit row, and document required
      files for new worklet packages.
      fix(audio-worklet): Add outputChannelCount option to SoundTouchNode
      Add optional outputChannelCount?: 1 | 2 to SoundTouchNodeConstructorOptions
      so callers can connect SoundTouchNode to mono destinations without creating
      a separate ChannelMergerNode. Defaults to 2 (stereo). Document the existing
      mono input fallback in processor.ts with inline comments. Add tests for all
      three cases (default, 1, 2) and add an explicit mono output processor test.
    • feat(core,audio-worklet): Expose WSOLA timing parameters
      Add StretchParameters interface (sequenceMs, seekWindowMs, overlapMs, quickSeek)
      and setStretchParameters() method to Stretch and SoundTouch for fine-grained
      control of the WSOLA time-stretch algorithm at runtime.
      Add public overlapMs getter/setter and quickSeek getter to Stretch, making the
      previously-hidden timing internals accessible without replacing all parameters
      at once. Add SetStretchParametersMessage to the processor message union so
      SoundTouchNode.setStretchParameters() can queue updates to the render thread.
    • feat(audio-worklet): Add processOffline() for OfflineAudioContext rendering
      Add processOffline() helper that renders an AudioBuffer through SoundTouch in
      an OfflineAudioContext without requiring a live audio device. Accepts pitch,
      pitchSemitones, playbackRate, interpolationStrategy, stretchParameters, and
      sampleBufferType options. Output length is estimated as ceil(input.length /
      playbackRate).
    • feat(audio-worklet): Add processor observability metrics
      Processor posts framesBuffered, underrunCount, and blockCount to the
      main thread every 100 render blocks. SoundTouchNode stores the latest
      snapshot as ProcessorMetrics, exposes it via a metrics getter, and
      dispatches a metrics CustomEvent for event-driven monitoring.
    • docs(storybook): Add Getting Started guide for processorModuleUrl resolution
      Documents how to resolve processorModuleUrl in Vite, webpack 5, and
      static hosting setups, plus OfflineAudioContext usage and common
      first-time mistakes (registration order, CORS, relative paths, autoplay).
    • feat(core): Add StretchPipe interface and stretchFactory option
      Introduces StretchPipe as a structural interface for the time-stretch
      stage, implemented by the existing Stretch class. SoundTouchOptions
      gains a stretchFactory callback so callers can substitute a custom
      stage (e.g. a phase vocoder) without subclassing. Also fixes stale
      @cxing/ scopes and missing packages in nx.json release.projects.
    • feat(audio-worklet): Add phase vocoder packages
      Adds two new packages:
    • @soundtouchjs/stretch-phase-vocoder: FFT-based StretchPipe implementation
      using radix-2 Cooley-Tukey FFT, Hann-windowed overlap-add synthesis, and
      per-bin phase accumulation. Includes createPhaseVocoderFactory for drop-in
      use with SoundTouchOptions.stretchFactory.
    • @soundtouchjs/phase-vocoder-worklet: AudioWorklet integration wrapping
      PhaseVocoderNode (mirrors SoundTouchNode API) and PhaseVocoderProcessor
      (uses SoundTouch with the phase vocoder stretchFactory). Adds fftSize and
      overlapFactor constructor options. Full metrics observability support.
    • feat(audio-worklet): Add formant correction worklet
      Adds @soundtouchjs/formant-correction-worklet — an AudioWorkletNode
      that applies SoundTouch pitch-shifting with LPC-based formant
      preservation. Use FormantCorrectionNode instead of SoundTouchNode when
      pitching vocals without the chipmunk/giant timbre shift.
      Key additions:
    • lpc.ts: autocorrelate, levinsonDurbin, applyAnalysisFilter,
      applySynthesisFilter (LPC order 16, 512-sample Hamming window)
    • formant-correction-processor.ts: per-block LPC correction with
      formantStrength AudioParam blend (0 = raw, 1 = corrected)
    • FormantCorrectionNode.ts: AudioWorkletNode with pitch, pitchSemitones,
      playbackRate, and formantStrength AudioParams; metrics getter/event
    • Storybook playground with formantStrength slider and A/B toggle
    • Full Vitest test suite (37 tests), README, and Storybook MDX docs
    • feat(storybook): Add WSOLA stretch parameters and processOffline playgrounds
      Add StretchParametersPlayground with live sliders for sequenceMs,
      seekWindowMs, overlapMs, and a quickSeek toggle — all wired to
      SoundTouchNode.setStretchParameters() and applied immediately to the
      running audio graph during playback.
      Add ProcessOfflinePlayground that fetches a track, renders it through
      processOffline() in an OfflineAudioContext, then plays the resulting
      AudioBuffer. Shows render time, output duration, and live code sample
      reflecting current parameter values.
      Also fix a pre-existing MDX parse failure in getting-started.mdx caused
      by smart/curly quotes throughout the file that prevented the Storybook 9
      acorn indexer from parsing the compiled MDX output.
    • feat: Refactor processing pipeline and update interpolation strategy integrations
    • chore(agents): Nx agent config
    • feat: Add live processor metrics to Storybook playgrounds
    • Wire ProcessorMetrics event listener into AudioWorkletPlayground,
      StretchParametersPlayground, FormantCorrectionPlayground, and
      PhaseVocoderPlayground; metrics panel is always visible, defaulting to 0
    • Fix Storybook static build: change processor/installer imports from
      ?url to ?worker&url so Vite bundles each dependency inline
    • Add worker: { format: 'es' } and publicDir to storybook vite.config.mts
    • Add .github/workflows/storybook-pages.yml for GitHub Pages deployment
    • Restructure CI: merge test + coverage-summary into single validation job
    • Raise @soundtouchjs/core coverage thresholds to branches: 85, functions: 95
    • Add interpolationStrategyRegistry tests to reach 85.75% branch coverage
    • Migrate ESLint config from .eslintrc.cjs to per-package .eslintrc.json
    • Add static-storybook to .gitignore
    • chore: Run lint in pre-commit hook
    • docs: Update stage and commit instructions for Husky pre-commit hook
    • docs: Add Husky pre-commit hook instructions to repo-management
    • docs(repo-management): Update stage and commit instructions for Husky pre-commit hook
    • docs(repo-management): Update stage and commit instructions for Husky pre-commit hook
    • ci: Switch Storybook Pages deploy to GitHub Actions
    • feat: Add processOffline and output level metrics to worklet packages
    • Add processOffline() to phase-vocoder-worklet and formant-correction-worklet
    • Add outputRms and outputPeak to ProcessorMetrics for all worklet packages
    • Update demo metrics panel to display outputRms and outputPeak
    • Update PhaseVocoderPlayground to surface expanded metrics
    • Update Storybook and README docs for offline rendering and observability APIs
    • Fix nx release changelog rules and semverBump for non-code commit types
    • ci: Post coverage summary as PR comment
    • chore(ci): Update action versions and stage-and-commit guidance

❤️ Thank You

  • Steve 'Cutter' Blades

v1.0.10

06 Apr 20:45

Choose a tag to compare

1.0.10 (2026-04-06)

🚀 Features

  • demo: Add loop playback toggle and beginner Web Audio docs (#58, #31)

🏡 Chore

  • Dependency updates (#60)

❤️ Thank You

  • Steve 'Cutter' Blades

v1.0.9

31 Mar 12:38

Choose a tag to compare

1.0.9 (2026-03-31)

🩹 Fixes

  • @soundtouchjs/audio-worklet: Expand range (#57, #56)

❤️ Thank You

  • Steve 'Cutter' Blades

v1.0.8

18 Mar 14:31

Choose a tag to compare

1.0.8 (2026-03-18)

📖 Documentation

🤖 CI

  • Update dependencies (#55)

❤️ Thank You

  • Steve 'Cutter' Blades

v1.0.7

09 Mar 20:07

Choose a tag to compare

1.0.7 (2026-03-09)

🩹 Fixes

  • @soundtouchjs/core: Versioning (#53)

❤️ Thank You

  • Steve 'Cutter' Blades

1.0.0 (2026-03-09)

09 Mar 17:05
6cffed1

Choose a tag to compare

  • Manually bump to 1.0.0 to rectify versioning after 0.4.0 release with breaking changes. No code changes from 0.4.0.

feat: Migrate to Nx monorepo, refactor to TypeScript, and add audio-worklet integration

09 Mar 15:37

Choose a tag to compare

BREAKING CHANGE:

  • Convert legacy soundtouchjs repo to Nx monorepo structure
  • Rename package from soundtouchjs to @soundtouchjs/core (ESM only)
  • Refactor all source code to strict TypeScript, ES2024, and ESNext modules
  • Remove all CommonJS and legacy build artifacts

Features and improvements:

  • Add @soundtouchjs/audio-worklet package with AudioWorkletProcessor and SoundTouchNode
  • Implement AudioParam-based control for pitch, tempo, rate, pitchSemitones, and playbackRate
  • Demo app rewritten with dual-mode (AudioBuffer and Audio Element)
  • Code snippet display and UI improvements
  • Update documentation for new API, key switching, and usage patterns
  • Update and expand unit tests for new features
  • Update root README and package READMEs for v0.4.0 release