Add one-shot LFO sync modes, expand LFO shapes, and optimize FM decimation
FM decimation reworked for performance and consistency:
- cap selectable precision to 1..19 bit plus Full mode
- remove 20..24 bit modes from engine enum/UI path
- simplify quantization path by removing expensive phase-accumulator quantization
- add D=2 temporal sample-and-hold behavior in decimated oscillator render paths
- keep feedback rendering full-rate for stability
- precompute per-voice decimation scale/invScale and use saturating fixed-point-style rounding
Preset/patch compatibility and format updates:
- bump patch format to 1.4
- add dedicated per-LFO sync-mode storage in synth params/flash params
- persist/restore new sync-mode fields in flash conversion
- for older patches, derive sync mode from legacy internal/external frequency behavior
- clamp legacy decimation values 20..24 to 19-bit on load
- clamp sync mode values to valid range on load
LFO sync system expanded:
- add sync mode model: Int, Ext, and one-shot 1..8 cycles for both internal/external clocks
- decouple one-shot behavior from KSync so they can be combined
- add one-shot runtime handling (remaining-cycle counter, terminal hold value, shape-aware terminal behavior)
- prevent one-shot retrigger during overlapping mono/unison glide note transitions
LFO engine and shape expansion:
- extend LFO shape enum/editor/renderer with new shapes:
- SawDown, DecayExp, DecayLog, RiseExp, RiseLog, AttackDecay, AttackHoldDecay, S-Decay, Buchla Plong variants, SinSquare, SinZero, SinPos, and User1..User6
- refactor shape execution into dedicated executors with precomputed constants
- add curve lookup table header for exp/log/damping tables used by new LFO shapes
UI/oscilloscope updates:
- extend sync selector labels and encoder handling for new sync modes
- update LFO oscilloscope preview to render all new shapes
- add one-shot hold visualization after the configured shot count
- update LFO oscilloscope parameter passing to include sync mode
Misc updates:
- move TFT display instance to RAM_D1 section
- bump firmware version string to v1.06c
- update CLI build script to derive firmware/bootloader versions from headers and generate release names dynamically (with safe fallbacks)
- refresh README branch notes to reflect decimation and LFO sync/shape behavior changes