Releases: humanbydefinition/textmode.synth.js
v1.6.0
v1.5.1
What's Changed
- fix: added global exports to make UMD bundle usage work by @humanbydefinition in #95
- bump version by @humanbydefinition in #96
Full Changelog: v1.5.0...v1.5.1
v1.5.0
- New Procedural Patterns: Introduced new
plasmaandmoireprocedural patterns for generating complex visual textures. - Expanded Coordinate Transforms: Added a suite of new coordinate manipulation transforms including
polar,twirl,swirl,mirror,shear,barrel,pinch, andfisheyefor advanced visual distortions. - New Blend Modes: Integrated various new blend modes such as
screen,overlay,softlight,hardlight,dodge,burn,lighten, anddarkenfor richer compositional effects. - Deterministic Randomness: Implemented a
seed()function to allow for reproduciblenoiseandvoronoipatterns, enhancing consistency in generative art. - TextmodeSource Sampling: The
src()function now supports sampling directly fromTextmodeSourceobjects (images and videos), enabling integration of external media into synth chains. - Dynamic Synth Source Evaluation: The
layer.synth()method now accepts a factory function, allowing for dynamic generation and recompilation of synth sources based on changing conditions.
v1.1.1
Highlights (via @gemini-code-assist)
- Enhanced API Flexibility with Overloads: The API for
charColor,cellColor,paint,solid, and all combine/combineCoord transforms now supports directSynthParameterValue(numbers, arrays, functions) in addition toSynthSourceobjects. This allows for more concise code, such aspaint(1, 0, 0)for solid red, orosc().add(0.5)to add a grayscale value. - Improved Shader Compilation and Lifecycle Management: Implemented robust handling for shader compilation, including
isCompilingandisDisposedflags to prevent race conditions and memory leaks during asynchronous shader creation and layer disposal. Ping-pong buffers for feedback loops are now dynamically managed, including recreation upon grid dimension changes. - Optimized Feedback Loop Rendering: Introduced a global, shared copy shader (
ShaderManager) for efficient blitting of ping-pong buffers to the draw framebuffer. This avoids re-running the main synth shader for the final copy pass, improving performance for feedback effects. - Comprehensive Development Tooling and Standards: Added new development tools including
vitestfor testing,eslintwithjsdocrules for code quality,commitlintfor conventional commit messages,markdownlint-cli2for documentation consistency, andhuskyfor Git hooks. NewAGENTS.mdprovides ground-truth reference for AI coding agents. - Refactored GLSL Utilities and Constants: Moved GLSL channel-related constants (
CHANNEL_SAMPLERS,CHANNEL_SUFFIXES) to a centralsrc/core/constants.tsfile. Introduced GLSL utility functions_packCharand_unpackCharfor more efficient character index handling in shaders.
What's Changed
- docs: Fix phantom parameters in char() and osc() examples by @humanbydefinition in #25
- test: add tests for SafeEvaluator utility by @humanbydefinition in #28
- docs: add missing examples for modulate transforms in ISynthSource by @humanbydefinition in #27
- refactor: centralize texture channel constants by @humanbydefinition in #29
- test: add coverage for CharacterResolver by @humanbydefinition in #31
- refactor: centralize CompilationTarget and TextureChannel types by @humanbydefinition in #32
- docs: add missing modulate methods to ISynthSource by @humanbydefinition in #33
- types: enforce Textmodifier type in synthRender and extensions by @humanbydefinition in #34
- test: add coverage for ArrayUtils by @humanbydefinition in #38
- types: replace any cast with Partial in SynthPlugin by @humanbydefinition in #39
- refactor: simplify getTextureChannel logic to reduce size by @humanbydefinition in #40
- Centralize GLSL character packing logic by @humanbydefinition in #49
- test: add coverage for collectExternalLayerRefs by @humanbydefinition in #46
- Refactor: Deduplicate RGB channel transforms by @humanbydefinition in #52
- test: add unit tests for TransformRegistry by @humanbydefinition in #51
- api: add RGBA overloads to color methods by @humanbydefinition in #45
- test: Add coverage for compiler channel utilities by @humanbydefinition in #53
- types: remove unsafe casts in TransformFactory by @humanbydefinition in #56
- test: add coverage for TransformFactory by @humanbydefinition in #54
- Refactor UniformManager to centralize dynamic uniform creation by @humanbydefinition in #55
- api: Add primitive value overloads for combine transforms by @humanbydefinition in #57
- Fix WebGL framebuffer leak in synth feedback loop by @humanbydefinition in #47
- types: strengthen generatedFunctions types by @humanbydefinition in #48
- docs: improve example for src/index.ts by @humanbydefinition in #35
- test: Add tests for FeedbackTracker class by @humanbydefinition in #58
- perf: optimize array smoothing calculation by @humanbydefinition in #64
- fix: shader leak in synthRender race condition by @humanbydefinition in #61
- refactor: remove unreachable vector handling code by @humanbydefinition in #59
- api: standardize scalar arguments for solid and color transforms by @humanbydefinition in #62
- test: add unit tests for TransformDefinition by @humanbydefinition in #67
- refactor: centralize SynthSource creation logic by @humanbydefinition in #66
- perf: Optimize synthRender hot path by @humanbydefinition in #71
- docs: add missing examples for coordinate transforms in ISynthSource by @humanbydefinition in #70
- api: add missing overloads for color sources by @humanbydefinition in #69
- fix: webgl shader leak during async compilation by @humanbydefinition in #68
- docs: update AGENTS.md by @humanbydefinition in #79
- fix: plugin uninstall resource cleanup by @humanbydefinition in #78
- test: add coverage for SynthChain by @humanbydefinition in #72
- types: strengthen SynthSourcePrototype in TransformFactory by @humanbydefinition in #75
- types: remove unsafe casts in SynthSource injection by @humanbydefinition in #80
- perf: optimize feedback loops with copy shader by @humanbydefinition in #77
- types: add missing return types to public methods by @humanbydefinition in #83
- refactor: centralize axis-based transform generation by @humanbydefinition in #84
- test: add coverage for GLSLGenerator by @humanbydefinition in #81
- refactor: centralize source resolution logic in api/sources by @humanbydefinition in #88
- fix: copy shader leak in SynthPlugin uninstall by @humanbydefinition in #85
- dev by @humanbydefinition in #89
Full Changelog: v1.1.0...v1.1.1
v1.1.0 - quality of life updates
What's Changed
- ⚡ Optimize synthRender by removing redundant layer collection by @google-labs-jules[bot] in #6
- ⚡ Optimize render loop by compiling safe updaters by @google-labs-jules[bot] in #5
- ⚡ Optimize CharacterResolver with O(1) index lookup by @google-labs-jules[bot] in #7
- ⚡ Optimize GLSL number formatting by @google-labs-jules[bot] in #8
- 🧭 Scout: Fix Array.prototype pollution by @google-labs-jules[bot] in #11
- 🧭 Scout: Refactor bootstrap types to use SynthSourcePrototype by @google-labs-jules[bot] in #12
- 🧭 Scout: Fix NaN in Array.prototype.fit for flat arrays by @google-labs-jules[bot] in #13
- perf(render): Reduce GC pressure by reusing dynamicValues Map by @google-labs-jules[bot] in #15
- 🧭 Scout: Fix source configuration correctness (cellColor & charCount) by @google-labs-jules[bot] in #14
- 🧭 Scout: Fix encapsulation bypass in source factories by @google-labs-jules[bot] in #16
- 🧩 Weaver: Deduplicate texture channel mapping logic by @google-labs-jules[bot] in #17
- 🧭 Scout: Optimize synthRender allocations by @google-labs-jules[bot] in #18
- 🧩 Weaver: Deduplicate argument resolution logic in TransformFactory by @google-labs-jules[bot] in #20
- 🧩 Weaver: Deduplicate GLSL thresholding and luminance logic by @google-labs-jules[bot] in #21
- 🧭 Scout: Fix time synchronization drift between JS and GLSL by @google-labs-jules[bot] in #23
- 🧩 Weaver: Deduplicate channel usage tracking logic by @google-labs-jules[bot] in #22
- 1.1.0 by @humanbydefinition in #24
New Contributors
- @google-labs-jules[bot] made their first contribution in #6
Full Changelog: v1.0.0...v1.1.0
v1.0.0
textmode.synth.js
This marks the first public release of textmode.synth.js - a Hydra-inspired visual synthesis library adapted for the textmode.js ecosystem.
textmode.synth.js brings method-chained procedural texture generation to textmode rendering, allowing characters, foreground colors, and background colors to be driven independently through a compositional API. The result is a flexible system for building animated ASCII / textmode visuals using familiar Hydra-style patterns, compiled to GLSL and executed on the GPU.
Highlights
- Hydra-style chainable synthesis API
- Native integration with
textmode.js’s three-texture pipeline - Oscillators, noise, voronoi, gradients, shapes, and more
- Feedback loops, modulation, blending, and geometry transforms
- Extensible architecture for custom sources and transforms
Live coding environment
Alongside this release, a dedicated browser-based live coding environment is available at
It includes auto-completion, inline documentation, curated examples, and access to the full textmode.js ecosystem without local setup.
Requirements
- textmode.js v0.8.5+
This release depends on new plugin and rendering hooks introduced intextmode.jsv0.8.5.
Credits
textmode.synth.js is a derivative work of hydra-synth by Olivia Jack, reimagined for textmode rendering.
Core synthesis concepts, GLSL generation, and functional design are inspired by Hydra, with adaptations for character-based output and layered text rendering.
Feedback, experiments, and bug reports are very welcome.
Have fun breaking textmode!