Commit Graph
100 Commits
Author SHA1 Message Date
jensandClaude Sonnet 5 d713ca50bb Fix VCF coefficient buffer undersized for 4th-order filters
Found while building tools/testhost's regression suite for the
Critical #5 block-size fix: VCF_CalcCoeff_LPF/_HPF/_BPF advance the
coefficient pointer once per (sample, filter-section) pair, but a
4th-order filter uses FILTER_MAX_ORDER/2 = 2 cascaded 2nd-order
sections per sample. VCF_SetBufsize only allocated pCoef with bufsize
entries, not bufsize*sections, so any host block between 4097 and
8192 samples with a 4th-order filter selected wrote past the
allocation.

Confirmed with AddressSanitizer before the fix: heap-buffer-overflow,
WRITE of size 8, exactly 8 bytes past a 393216-byte (8192 x
sizeof(vcf_coef_t)) allocation. Fixed by sizing pCoef for the worst
case. Re-verified with ASan across blockSize 4097/8192/16384/20000 -
zero errors after the fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011dhtwRLARk4eiPngcQykLJ
2026-07-27 20:02:04 +02:00
jensandClaude Sonnet 5 cee75c523b Fix Patch/Bank import-export issues from TODO.md
- patchImportXml: handle the legacy single-patch format (JSYNTH_PATCH
  root) as its own top-level branch instead of incorrectly nested
  inside the modern per-child loop, which checked/decoded the outer
  xml on every iteration instead of the loop variable xml2. Switched
  its CC-table import to import_midi_cc, matching the convention
  already used (and exercised) by bankDecodeXml_legacy. loadPatchFromFile's
  .xmp branch now also accepts legacy-rooted files.
- setCurrentProgramStateInformation: fix a related bug found in
  passing - it was passing patchImportXml an XML node one level too
  deep, making the VST2 "copy plugin state to another track" feature
  a complete no-op.
- Fix the fundamentally broken fxb/fxp magic-number check: it compared
  raw file bytes (as text, e.g. "CcnK") against JUCE's int-to-decimal-
  text String constructor (e.g. "1130589771"), which can never match.
  This meant the entire opaque .fxb/.fxp load path was dead code.
  Fixed using ByteOrder::bigEndianInt, matching the pattern JUCE's own
  VST3 wrapper uses for the identical struct. "Regular" (non-chunk)
  .fxb/.fxp is still unsupported, but now shows an AlertWindow
  explaining why instead of silently doing nothing.
- Implement .fxp/.fxb saving using the same opaque-chunk format the
  load path expects, reusing getCurrentProgramStateInformation/
  getStateInformation for the payload.
- Deduplicate patchDecodeXml/patchDecodeXml_legacy (the latter now
  just delegates to the former).

Verified with clean debug/release builds and a standalone round-trip
test of the binary format logic (magic detection, byte order,
size/payload round-trip, safe rejection of truncated/bogus files).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011dhtwRLARk4eiPngcQykLJ
2026-07-27 18:32:52 +02:00
jensandClaude Sonnet 5 54a67562db Fix Memory-management issues from TODO.md
- JaySynth's destructor now uses delete[] to match every new T[n]
  allocation (m_pVoices, pPer_voice_controls, pCurrNoteInfos,
  humanize_voice_param[i], ppHumanizedSliders[i], m_ppAudioThread,
  m_ppEventAudioThreadRdy), fixing undefined behavior from the
  mismatched scalar delete.
- Found and fixed the same new[]/delete mismatch pattern via
  ScopedPointer in PluginProcessor.cpp: ScopedPointer always calls
  scalar delete (per JUCE's own doc comment "do not give it an array
  to hold!"), so ScopedPointer<char> holding a new char[...] in
  setStateInformation/setCurrentProgramStateInformation had the same
  bug. Replaced both with HeapBlock<char>, JUCE's array-owning,
  malloc/free-backed smart pointer.
- Added a shared SynthCheckAlloc() helper (synth_defs.h/synth_debug.c)
  that aborts with a diagnostic instead of returning NULL, and wrapped
  all 24 malloc call sites across the C DSP core (env.c, lfo.c, vcf.c,
  vco.c, blit.c, wavetable.c, voice.c, param_scale.c). All are
  one-time init/bufsize-change calls, never in the per-block render
  path, so this adds no real-time-thread overhead.

Verified with clean debug and release builds (no new warnings/errors)
and a full link.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011dhtwRLARk4eiPngcQykLJ
2026-07-27 18:19:56 +02:00
jensandClaude Sonnet 5 608ae003df Fix High-severity real-time audio-thread safety issues from TODO.md
- synthChanged() no longer builds JaySynthActionListener Strings and
  calls sendActionMessage directly on the audio thread. It now pushes
  a small POD event into a lock-free SPSC queue (JUCE's AbstractFifo),
  drained by the existing 10ms UI timer on the message thread, which
  does the String-building/posting there instead.
- VoiceProcessDataV's ~450KB-900KB of SYNTH_MAX_BUFSIZE-sized local
  arrays are now persistent per-voice buffers allocated once in
  VoiceSetBufsize (freed in VoiceFree), matching the pattern already
  used for pBuf_Q and by vcf.c/env.c/lfo.c, instead of being
  reallocated on the stack on every audio block.
- SynthDebug uses vsnprintf instead of vsprintf, bounding writes to
  its 1024-byte buffer.

Verified with clean debug and release builds (no new warnings) and a
live playback smoke test in Reaper.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011dhtwRLARk4eiPngcQykLJ
2026-07-27 18:08:35 +02:00
jensandClaude Sonnet 5 e151036963 Add TODO.md tracking hardening review findings
Records the critical fixes already applied (commit a65b71a) and the
remaining high/memory/patch-export/design findings from the code
review, for later reference.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011dhtwRLARk4eiPngcQykLJ
2026-07-27 17:26:41 +02:00
jensandClaude Sonnet 5 a65b71ab86 Fix critical memory-safety and concurrency bugs found in code review
- handleController: bounds-check NRPN/CC controller ID before indexing
  last_midiCC_info[] (NRPN IDs can reach 16383, array is sized 1024)
- JaySynthMidiCC::add/remove: also reject negative controller IDs coming
  from patch/bank file data, not just out-of-range-high ones
- bankImportXml/loadPatchFromFile: null-check XML elements after
  getFirstChildElement()/XmlDocument::parse() before dereferencing, so
  malformed/truncated patch or bank files no longer crash on load
- loadBankFromFile/loadPatchFromFile: validate the loaded file is large
  enough for the fxBank/fxProgram header, and that the embedded chunk
  size fits within the file, before reading through the raw pointer
- processBlock/JaySynth::renderNextBlock: host blocks larger than
  SYNTH_MAX_BUFSIZE no longer overflow the fixed-size stack work buffers
  or deadlock the render worker threads; oversized blocks are now
  rendered in multiple SYNTH_MAX_BUFSIZE-sized passes (pending MIDI
  events are correctly held over between passes)
- JaySynth constructor: guard against createInputStream() returning null
  when the wavetable file can't be opened
- JaySynth::setParameter/setControl/setPerVoiceControl/setParam/
  ClearControls: take the synth's lock, matching renderNextBlock and the
  note/controller handlers, to close a data race between parameter
  changes (UI/host automation) and audio-thread rendering

Verified with a full rebuild (make) producing JaySynth.so with no new
warnings or errors.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011dhtwRLARk4eiPngcQykLJ
2026-07-27 17:22:46 +02:00
jensandClaude Sonnet 5 468b4c36de Add CLAUDE.md with codebase architecture and build guidance
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011dhtwRLARk4eiPngcQykLJ
2026-07-27 17:14:24 +02:00
jens e9a5784ed1 refactored pacth import/export 2026-05-10 16:10:51 +02:00
jens f72a89ed61 no setCurrentProgram on getCurrentSatte 2026-05-10 13:55:47 +02:00
jens 17b12fe3f1 fix midi controller dialog 2026-05-10 13:37:38 +02:00
jens 255858cee8 - combo boxes have midi controller dialog
- reduce update of parameter sliders during Midi Controller Dialog
2026-05-10 13:08:35 +02:00
jens 15bcf87529 improved assignment of midi controllers 2026-05-10 12:11:34 +02:00
jens 31a0c4c009 fixed NRPN 2026-05-10 10:53:26 +02:00
jens 6e67193c3d - robusten and refactored NRPN
- increased number of midicontrollers from 128 to 1024
2026-05-10 10:36:24 +02:00
jens cbdb18e6ba handleController for CC and NPRN 2026-05-09 22:11:40 +02:00
jens bc2020e612 NRPN: normalized by max value 2026-05-09 22:04:21 +02:00
jens 8ce2db511b added Midi NRPN 2026-05-09 20:37:17 +02:00
jens 6be1b4a911 updated .gitignore 2026-05-09 08:37:16 +02:00
jens a8e6593eed used -pre suffix for version 2026-05-09 08:34:24 +02:00
jens c392104aec - refactored kml import/export
- added ability to import patch file with midicc defined without patch parameter
- fixed notes cut off by calling getStateInformation()
- disabled limiter
- increased version to v1.1.0-pre
2026-05-09 08:34:01 +02:00
jens 0de8c05f00 fixed behavior whenn unison and humanize is set over midi 2026-05-09 08:30:12 +02:00
jens 597c70bb53 fixed eval_blep 2026-05-09 08:29:00 +02:00
jens c7c9366dbb - refactored
- remove DC
2025-08-22 14:49:50 +02:00
jens 2ab8c68c9b m-files fixed wavwrite 2025-08-22 13:39:23 +02:00
jens 21411d2c56 m-files compile clean 2025-08-21 21:09:48 +02:00
jens 4f7803a8b4 added doc 2025-08-21 07:52:16 +02:00
jens 64c6745c76 added matlab 2025-08-21 07:27:52 +02:00
jens fd522e1b99 no SYNTH_DEBUG for release build 2025-08-18 21:55:31 +02:00
jens 7e11e3e72b fixed midi sync led 2025-08-18 21:42:19 +02:00
jens ed737f526f updated .gitignore 2025-08-18 18:35:13 +02:00
jens 83afc11612 - added run and install target 2025-08-18 18:32:08 +02:00
jens 8a81dd649e added web URL for later reference 2025-08-18 18:31:26 +02:00
jens 42e877c08d fixed includes 2025-08-18 18:30:55 +02:00
jens 1e0760e49b fixed includes 2025-08-18 18:29:25 +02:00
jens db4fdf68ff fixed MidiClock now working with ardour 2025-08-18 18:22:55 +02:00
jens 314b57b1ed fixing MidiClock (Zwischenstand #3) 2025-08-18 09:37:39 +02:00
jens a3ad0e989e fixing MidiClock (Zwischenstand #2) 2025-08-16 15:10:26 +02:00
jens 159fa60b08 fixing MidiClock (Zwischenstand) 2025-08-16 14:16:13 +02:00
jens e3fb2074f6 DSP: changed from float to double 2025-08-08 17:44:01 +02:00
jens 7fcbb9b509 Fixed code problems 2025-08-08 16:36:22 +02:00
jens 3a19db6a86 Fixed code problems 2025-08-08 16:36:09 +02:00
jens d73f172fc1 added bear target 2025-08-08 16:35:29 +02:00
jens f05e3be55f Fixed code problems 2025-08-08 16:35:04 +02:00
jens 2ec3cc9543 added run target 2025-08-08 13:54:33 +02:00
jens 0f70ea025c change submodule/make 2025-08-08 13:54:08 +02:00
jens 2ac71f33f1 added new waves 2025-08-06 22:08:46 +02:00
jens 73332a7292 refactored wavetable constants 2025-08-06 22:08:13 +02:00
jens 4bf46df821 - added 12bit wace for Microwave
- refactored
2025-08-06 21:15:12 +02:00
jens 072280c603 refactored waves 2025-08-06 07:51:29 +02:00
jens 4a4d67f5f1 - wavetable using Waldorf Microwave "wave.bin" (16bit) is broken
- wavetable uses "wave2.bin" (8bit) Waveforms
-
2025-08-05 19:36:59 +02:00
jens 12783fdfdb removed unused include 2025-08-03 20:51:34 +02:00
jens 63e1daa706 export waves to uild folder 2025-08-03 20:42:07 +02:00
jens bc8a2b5b20 cleaned up 2025-08-03 20:35:59 +02:00
jens 26c3ee4cb6 - fixed problems
- updated .gitignore
2025-08-03 17:04:57 +02:00
jens c0e651bf68 - refactored 2025-08-03 10:57:01 +02:00
jens d801ce21e8 added patch 2025-08-02 14:36:02 +02:00
jens 025818a042 [sdk/vstsdk2.4]
- refactored
- created patch
2025-08-02 14:34:53 +02:00
jens 3bda521d62 - fixed master volume
- added osc jitter to blep waveform saw, square and tri
2025-08-02 12:04:40 +02:00
jens ff6ba8a179 permit to override default make environment 2025-08-02 10:24:41 +02:00
jens 2afe0cfccc change submodule/make 2025-08-02 10:23:53 +02:00
jens e666247a45 change submodule/fir 2025-08-02 10:22:04 +02:00
jens dab1ed956f juce: use 2025-08-02 10:17:55 +02:00
jens 0dd21799f9 [VCO/Blit/Sawtooth]
- added slight random frequency deviation for more vivid sound
2025-07-31 18:15:08 +02:00
jens bcfe5e4edd fixed 2025-07-31 18:14:23 +02:00
jens 4d25a24e53 disabled limiter 2025-07-31 18:13:16 +02:00
jens 3e63bdd4ce added sounds 2025-07-31 18:01:49 +02:00
jens 465bc88e8f removed linefeed 2025-07-31 16:41:24 +02:00
jens 6e8b990391 -fixed includes 2025-07-31 16:39:38 +02:00
jens 6fc6b9f567 - added submodules 2025-07-29 20:43:25 +02:00
jens 7ef6975cb3 - adde exra sounds 2024-03-04 08:40:52 +01:00
jens 42d155fdac - compile clean for GCC 13 2024-03-04 08:34:54 +01:00
jens 10e92afcf4 - fixed updating GUI params 2023-05-04 22:14:18 +02:00
jens 63bb047c1e - fixed unisono toggle 2023-05-04 21:16:50 +02:00
jens 89502ec978 Refactored 2023-05-03 18:06:30 +02:00
jens 6bd4590a54 - added legacy (< v1.0.0) import for patches
- added legacy (< v1.0.0) import for banks
2023-05-03 17:59:08 +02:00
jens c9c06c9d97 - fixed crash on setStateInformation/setCurrentStateInformation
- fixed crash on getStateInformation/getCurrentStateInformation
2023-05-02 19:47:51 +02:00
jens 764f5fdf74 - fixed leakage during patch load
- fixed leakage during bank load
2023-05-02 18:21:12 +02:00
jens 4b73b5ba69 - put version info into Makefile 2023-05-02 18:19:48 +02:00
jens ca353251f4 - refactored XML structure
- new XML structure not compatible to old structure
2023-04-29 00:05:13 +02:00
jens 08b70cb57b - refactored XML structure
- new XML structure not compatible to old structure
2023-04-29 00:00:34 +02:00
jens c5a87ef41b Added xmb, xmp files 2023-04-28 19:49:34 +02:00
jens 92d911d9ed Remember directory 2023-04-28 15:38:29 +02:00
jens ea4397907f - added load of fxb through GUI
- added load of fxp through GUI
2023-04-28 14:08:59 +02:00
jens b4add9e530 - constify
- refactored MidiCC
- JaySynthSound is not MidiCC, but has MidiCC
- refactored xml import export for patches and banks
2023-04-28 12:32:26 +02:00
jens 5850ab5d46 - Bank/Patch load/save: Opens fileChooser on btn press and calls pluginProcessor 2023-04-28 09:47:31 +02:00
jens 45f2696b77 Added GUI buttons for bank/patch load and save 2023-04-28 08:31:59 +02:00
jens 8819167c54 Fixed waves path for linux 2023-04-28 08:30:23 +02:00
jens e247245d5f - revert removing fir 2023-04-26 22:01:57 +02:00
jens cb14eaef59 - cleaned up module Makefiles
- reduce variable settings in Makefile
2023-04-26 21:39:41 +02:00
jens 6dadebb700 - refactored sound banks and sound patches
- added Microwave raw waveforms
- added additional sound bank
2023-04-26 14:55:26 +02:00
jens 7932c098e8 - fixed uppercase in inclusion of MMReg.h
- fixed _uuidof for MinGW
2023-04-26 14:45:54 +02:00
jens b4f4b1fa66 - Refactored MAke system. Put sources into config.mk
- export variables of main Makefile
2023-04-26 10:50:12 +02:00
jens 91518b32e5 - added Makefile for windows target 2023-04-26 10:48:03 +02:00
jens 05ec69ca99 - added Make files for windows target using mingw 2023-04-26 10:47:27 +02:00
jens 51311d41c0 - deleted 2023-04-26 10:46:41 +02:00
jens 5e20cebcc6 - fixed Juce path 2023-04-21 14:50:46 +02:00
jens 3af11a3278 - added config.mk and Makefile for Jay's build system 2023-04-21 14:29:31 +02:00
jens 978c752e8b - use jsy_min/jsy_max
- fixed includes
- removed redundant MW table
- added Missing JK_MidiClock
2023-04-21 14:25:04 +02:00
jens 2fcbc59880 - Makefile now for Linux
- compile clean
2023-04-21 14:21:38 +02:00
jens 762b8f0e7d - clean working copy for leaving SVN 2022-06-28 19:04:46 +02:00