Skip to content

Releases: OTODESK4193/PicoSampler

PicoSampler1.1.0_UPDATE

Choose a tag to compare

@OTODESK4193 OTODESK4193 released this 01 Aug 06:23

PicoSampler v1.1.0 — Improvements
Modulation
Greatly expanded modulation destinations: per-slot Pan, per-slot Amp ADSR (A/D/S/R × 8), Filter Envelope ADSR, LFO 1–4 Rate, and all 16 FX detail parameters — 121 destinations in total.
Destination picker reorganised into a category tree (S1–S8 / Master / ARP / Filter / LFO / FX / Sat / Chorus / Delay / Reverb / Freeze) with a check mark on the current selection.
Fixed: modulation destinations were resolved one entry too low. Discrete parameters were read with a C-style (int) cast, which truncates; a denormalised value of 48.99999 became 48. Assigning "Filter Cutoff" could drive "Arp Accent". Replaced with roundToInt in 37 places — this also affected Filter Type, FX Type, Sat Algo, Delay Time, Key Range, Octave and Semitone.
Fixed: destination assignments reverted to "None" after loading a preset or reopening a project. The destination selector was bound directly to the APVTS ValueTree, which is replaced wholesale by replaceState(), leaving the control attached to an orphaned node. Now uses ParameterAttachment like every other control.
Fixed: Arp Rate modulation did nothing while Sync was on (the default). Sync mode ignores the free-run rate entirely; modulation now shifts the note-value index, ordered slowest-to-fastest so that more modulation always means faster.
Modulation of Arp Octaves / Offset / Repeat is now rounded rather than truncated. Truncation rounds toward zero, which made bipolar Offset asymmetric and put the maximum value of Octaves and Repeat practically out of reach.
Implemented Sat Pre-HPF, which previously had a knob and a modulation destination but was never read by the DSP. Built as a split-band design: only the band above the cutoff is driven, the low band passes through clean and is mixed back.
Amp ADSR Link is now a saved parameter and propagates modulation. Previously it was UI-only state that copied base values, was lost when the editor closed, and left slots 2–8 unmodulated.
Modulation rate
processBlock now runs in 16-sample control blocks. The modulation matrix previously produced one value per audio block, so an LFO got only a handful of points per cycle — 8.6 at 5 Hz with a 1024-sample buffer, and 1.4 at 30 Hz, at which point the waveform collapsed entirely. This caused an audible "pause" at each cycle turnaround. The update rate is now 2756 Hz at 44.1 kHz, independent of buffer size. The interval matches the sibling Wavetable project's kCoefInterval.
As a direct consequence, arpeggiator timing quantisation dropped from roughly 11.6 ms (buffer-dependent) to about 0.36 ms.
Audio quality
Fixed: filter Cutoff and Resonance smoothing took about 10 seconds to settle. The ramp was advanced by one sample per audio block instead of per sample. Smoothing moved inside PicoFilter and now runs per sample with a 12 ms time constant; Formant and Comb Mix were added to the same mechanism.
Fixed: LadderFilter cutoff took about 5 seconds to reach its target. Its internal smoothing coefficient assumes per-sample calls but was invoked once per block. Sub-block processing brings this to roughly 0.16 s, matching the Wavetable implementation.
Fixed: clicks when modulating Start / End / Loop markers. Marker positions were computed once per block, so a fast LFO could move the loop end past the read position in a single step, teleporting playback without passing through the crossfade. Marker ratios are now interpolated per sample.
Fixed: clicks entering the Delay and Reverb tails while modulating the arpeggiator. Three separate causes: note-offs were stamped at the end of the block and therefore read after the next note-on, cutting freshly started voices; voice stealing picked the newest voice rather than the oldest because the age counter counted per-voice retriggers instead of elapsed time; and restarting a voice produced a one-sample step. A 3 ms declick tail was added, and All Notes Off now uses a fast release instead of an instant cut.
Fixed: changing Arp Rate fired a note immediately, which turned Rate modulation into a machine-gun effect.
Pan, Slot Gain and Output Gain are now interpolated per sample. Pan is a modulation destination, so block-rate updates made the image move in steps.
All continuous FX parameters are now smoothed (12 ms). FxChain already ran a per-sample loop but read its parameters straight from the block-rate struct.
Fixed a doubling of level on mono output buses, where voices were summed twice into the same pointer.
Signal flow
The master section moved to the true output stage. Master HPF/LPF, Output Gain and the limiter were applied only to the non-bypassed path, so slots with FLT BYPASS or FX BYPASS skipped them entirely — and the limiter sat before the filter and FX, so it offered no output protection. The chain is now: all slots → Filter → FX → Master HPF/LPF → Output Gain → Limiter → out.
Limiter Ceiling now defaults to −1 dB instead of 0 dB.
Stability
Anchor buffers are generated on demand. Loading a sample previously built 49 full-length pitch-shifted copies immediately, regardless of whether Stretch mode was used — roughly 150 MB per slot for an 8-second stereo file, or 1.2 GB across all eight. setSize throws std::bad_alloc on failure, which was never caught, so filling the slots in succession could terminate the host. Anchors are now built only for semitones that actually sound, with a 768 MB budget, a 120-second load cap, and allocation failure handled gracefully. Playback falls back to resampling until an anchor is ready.
Added a write lock to SampleSlot. The existing read guard protected the audio thread but nothing prevented two writers — a message-thread clear() and a loader-thread load could resize the same buffer concurrently.
Fixed a crash when pressing Reanalyze repeatedly during analysis. The button read the slot's file path without a guard while the loader thread was reassigning the same reference-counted juce::String.
Duplicate Load and Reanalyze jobs for the same slot are now collapsed.
Fixed the "Analyzing…" indicator sticking permanently after a failed Auto-Slice.
startNote() now takes a read guard, matching renderNextBlock().
Auto-Slice parameter writes are marshalled to the message thread with a liveness flag.
Real-time safety
The three routing buffers are now members; processBlock no longer allocates on the audio thread.
Removed an unused juce::String construction from the per-slot parameter loop.
MIDI buffers are members so their capacity persists.
Interface
Fixed: modulation range arcs did not match the actual modulation depth. The arc added the modulation amount to the knob's normalised position, ignoring the per-destination scaling — ±4 octaves for Cutoff, ±24 semitones for Master Pitch, ±1000 Hz for Sat Pre-HPF. Conversion now happens in value space, with an exponential path for Cutoff.
Pan and Volume knob arcs follow the slot colour, consistent with the other per-slot controls.
Version number displayed on the Config page.
Housekeeping
Version unified to 1.1.0 across CMakeLists.txt and the README badge; previously only the GUI reported 1.1.0 while the build reported 1.0.0.
Removed SlotPanel, which was compiled but never instantiated and called loadFromFile directly from the message thread.
Added a Disclaimer section covering limiter use, hearing protection and liability.
Documented per-slot Fade In / Out and the Pre-HPF behaviour in the English and Japanese manuals.

PicoSampler1.0.0Release

Choose a tag to compare

@OTODESK4193 OTODESK4193 released this 30 Jul 08:19

PicoSampler1.0.0Release