In production
ADDAC511 VC Stochastic Voltage Generator
Four channels of stochastic voltages, gates and clocks, with presets, quantizer, sequencer and CV assignments.
- Platform
- Daisy Seed (STM32H750), libDaisy
Tools
Procedures
Bootloader
| Channel | Version | Date | File | |
|---|---|---|---|---|
| release | V2 | 2026-04-13 | bootloader_V2.bin | |
| release | V1.1 | 2025-07-22 | bootloader_V1.1.bin |
Firmware
| Channel | Version | Date | File | |
|---|---|---|---|---|
| release | V2 | 2026-10-08 | addac511_V2.bin | NotesCV assignments: - (bug fix) Stored assignments were applied with no checks: an out-of-range channel or state indexed outside the channel/state arrays, and an n_assigns above 64 read past the assignment list. They are now validated when a preset loads, and invalid ones are skipped - (bug fix) Functions that pick one of several options from a CV (quantizer scale and root note, envelope size source, and the other mode selections) could index past their tables, because the CV after gain and offset is not limited to 0-1 (gain 1 + offset 1 reaches 2.0). Full-scale CV now picks the last option. In-range behaviour is unchanged - (bug fix) STATE B assigned to a CV input only fired once per boot - (bug fix) "GATE SIZE DEV" was registered as gate length, so it could not be assigned; it now controls gate size deviation - (bug fix) Opening EDIT on a digital assignment (e.g. HOLD) silently turned it into the analog function with the same number (VMIN) - (bug fix) A digital assignment locked the analog parameter with the same number, e.g. a HOLD assignment made VOLTAGE MIN uneditable - Removed a duplicate TBPM entry from the function list Preset storage and backwards compatibility: - Preset slots now carry a trailer (magic, format version, payload size, CRC32) in the unused tail of each 20kB slot. A stored preset is finally self-describing: the firmware knows which fields it actually contains and initialises anything newer from the defaults, and corruption is detected instead of being silently loaded. Slots written by older firmware have no trailer and keep loading exactly as before - Preset version bumped to 0xFF03. It had been left at 0xFF02 across several rounds of appended fields, so presets of very different vintages were indistinguishable - (bug fix) set_time_mode only clamped upwards, so a preset saved before time_mode existed loaded with an invalid mode (-1) that matched neither TIME nor BPM nor BPM_CHn, and the channel timing fell through every branch - (bug fix) enum setters for quantize rounding, sequencer mode, envelope mode, clock source, clock mult/div and voltage mode did not range-check their argument at all - (bug fix) voltage/envelope-scale setters used a clamp idiom that is NaN-transparent (both comparisons are false for NaN), so a NaN from an unwritten or corrupted slot was stored as-is and propagated into the output - (bug fix) the PresetsCommon check[] marker was written but never compared, so an erased or corrupted block was trusted: every slot entry read 0xFFFFFFFF, which counts as occupied, giving 16 phantom presets. The block is now validated (marker, slot size, slot-table entries) and falls back to defaults, and the preset count is recomputed from the slot table rather than trusted - (bug fix) presets_common_init left the last entry of preset[] uninitialised - (bug fix) selected was used to index preset[] with no upper bound check - Saved presets are now reproducible: live RAM pointers (current_state, v_quantization_scale, PresetsCommon::exists) were being written into flash, so the same preset saved by two firmware builds differed. The fields remain for layout compatibility but store 0. Nothing ever read them back - sizeof/offsetof static_asserts lock the stored layout, so a change to Preset that would invalidate every preset in the field now fails the build USB: - New length-framed backup/restore commands (bk2, rt2) carrying an explicit byte count and CRC. The old framing used an unescaped "!FIM!" terminator, so that sequence occurring in preset data (a preset name is 20 free ASCII characters) truncated a restore. rt2 also verifies the CRC before erasing anything, and backs up the whole image rather than dropping the last 5 bytes. bkram/rtram are unchanged, so existing pages keep working - (bug fix) restore wrote one byte less than the full presets-common block - New "ver" command reports the firmware version, so the config panel can tell what a module runs and offer updates. Older firmware ignores it Internal: - 27 setter/guard functions changed from Result to void (honest API: these never fail from the caller's perspective) - 19 I/O functions (preset, calibration, flash) marked [[nodiscard]] so unchecked calls become compiler warnings - channels_auto_calibration now propagates per-channel calibration errors instead of always returning OK Bug fixes: - Quantizer (OCTAVES and SEMITONES transpose modes): the transpose value was permanently overwritten while fitting the quantized note into the voltage range, so it drifted towards 0 during playback (most visible with Lock on, when a step falls outside the range). Range fitting is now done on a temporary copy, as it already was for SCALE_DEGREES - Smooth menu: smooth curve being reset to OFF when exiting the menu with the cursor on the first item - Sequencer offset: offset changes not working reliably when turned quickly; RV direction offset was always wrong for non-zero values due to incorrect step-order traversal; rapid changes in any direction caused uint32_t underflow in the phase calculation - Sequencer: set_edit_idx and set_next_idx accepted index equal to n_steps (off-by-one), potentially causing out-of-bounds array access when step count is at maximum - Sequencer: set_offset accepted negative values, causing undefined behaviour in offset time calculation - USB: hb_counter not bounds-checked against buffer size during SDRAM receive, risking buffer overflow From development build V2-23-g66e9: Bug fixes: - Clock delay (follow=ch out): gate was firing in sync with source channel instead of being delayed; CV output was not changing at all From development build V2-20-g0539: Bug fixes: - Transpose value jumping in quantization menu when voltage min > max with an active scale - Quantizer (SEMITONES mode) jumping an octave instead of one note when transpose is non-zero and input crosses an octave boundary From development build V2-7-g044b: Features: - New gate-assignable randomize functions: randomize voltage, gate, probability, smooth curve, time, time distribution, clock, voltage distribution, and lock pages 1/2/3 independently, in addition to the existing full-channel randomize Bug fixes: - CV assignment edit screen: selected function was not retained when entering edit - Crash/infinite loop in quantizer when using SCALE_DEGREES transpose mode - Range lock not working correctly in voltage envelope menu - Crash when changing quantization transpose while quantization was active - BPM not preserved when switching clock source between internal channels - Changed order of items in gate menu From the first V2 development builds (tagged V2 in April 2026, never released): Features: - Random length option added to gate - External clock follower that controls bpm and allows mult/div Bug fixes: - Quantizer not respecting limits - When following ch out, probability of src channel is not respected - CV control of the voltage distribution using a CV assignment is not correct - buttons not reacting - ch1 in time mode, "ghost" option visible - ch1 in bpm mode, cannot change mult/div - crash when changing sequencer mode and steps == off - calibration crashing when editing factory calibration - older presets causing problems entering voltage menu - crash when calibrating cv outs - Freeze when selecting a custom scale - Sequence Lock editing - line 7 doesn't show mark From V1.2 (October 2025, not previously listed): - (bug fix) Blank screen on power-up: the display is now reset before it is initialised - (bug fix) Crash when calibrating the CV outputs - (bug fix) Lock tracker view: scrolling corrected, and steps beyond the sequence length are no longer shown (#479) - (bug fix) Quantizing to a custom scale with no notes now passes the voltage through unchanged (#481) |
| release | V1.1 | 2025-07-23 | addac511_V1.1.bin | NotesDistribution: walk as default Probability: cv+gate default Trigger quantize: added option to have also 10ms pulse (bug fix) Lock: when STOP ALL is clicked, turn gates off immediately (bug fix) VCO tuning should ignore mute and hold (bug fix) Quantize: when a scale other than chromatic was active, the wrong notes not belonging to scale were played skip steps behaviour changed: when negative, pulses once every n steps; when positive, skips once every n steps updated year in system info (bug fix) Gate for first step after play/reset not output Lock: Reset -> make all steps 0 (bug fix) "Following" channel screens (e.g., on smooth): changing channel doesn't update the screen, when changing to src channel (bug fix) lock: long sequences, changing state works ok for 1st and 2nd channels, gets confused when trying to change state in a 3rd channel (bug fix) Logic: Make bpm and counter compatible with other logic operations (bug fix) Logic: index shown in logic line operations was incorrect (bug fix) Lock: Sequencers not starting at the same time when Play All is clicked (bug fix) Crash on preset load when a custom scale is selected (bug fix) Crash when a CV assign for note probability exists in a normal scale and the scale is changed to a custom scale (bug fix) Sync probability: when value is high, it never triggers or generates gate (bug fix) Lock: Selection of Track/Hold/On gets "stuck" Added functions to select note probability as degree of scale, instead of absolute note value Lock: to change state, 1 press blinks and changes at the end of sequence; 2 slow presses change at the next step (V1.0.1) has all above (bug fix) clock sync issues (see email from Will, 16-04-2025) (V1.0.2) has all above (bug fix) crash when changing to clk src from signal (V1.0.3) has all above New option in BPM mode: set beat note (bug fix) updated size of backup file, to include all presets (only 10 were stored...) (bug fix) Prevent presets restore from overwriting calibration data (bug fix) Envelope mode: with quantizer on, cv wasn't going back to Vrest (bug fix) Envelope mode: gate percentage should refer to entire cycle, not only attack Envelope mode: set gate time to asr when this mode is selected, and when changing back to normal mode, set the percentage to the previous value (bug fix) Output CV calibration: invert offset values shown on screen, so that CV increases with offset value Force quantize post when Sequencer is set to ON (bug fix) Pressing play when sequencer is in "Track", makes the output go out of control Lock: Tracker view added (bug fix) when time is set to bpm chX, beat note should be editable (bug fix) Beat note not being copied (bug fix) tracker: a selected item isnt deselected when going to another menu (bug fix) tracker: rotating encoder A should deselect current item and move to another line (bug fix) tracker: item limits should be constrained in the encoder, otherwise, eg, if rotating past 0, it will take many rotations to get to values > 0 again (bug fix) time: when in bpm chX mode, bpm item is skipped only when going down (bug fix) sequencer: when tracking and quantize is on, force cents to 0 (bug fix) randomize shouldnt work in quantize screen Added 'upload bootloader' item to menu |
| release | V1.0.3 | 2025-04-21 | addac511_V1.0.3.bin | |
| release | V1.0.2 | 2025-04-16 | addac511_V1.0.2.bin | |
| release | V1.0.1 | 2025-04-10 | addac511_V1.0.1.bin |