Firmware

ogham

Hype10/100

Ogham — a dual-voice bytebeat synthesizer for Eurorack. Firmware (MIT) and hardware (CC BY-SA 4.0).

ogham is custom firmware for the Keeos Ogham, by @keeos-io. Latest release v1.19 (October 2026), 3 stars on GitHub.

forKeeos Ogham·by@keeos-io

Unclaimed. Is this yours? Sign in with GitHub as @keeos-io to claim it.

Downloads
0
Stars
3
Fork
1
Commits
34
Last commit
Download v1.19

ogham-v1.19-standard.bin· 126 KB

Custom license· keeos-io/ogham·downloads come from the creator’s GitHub releases

34
Commits
9
Releases
34 commits and 9 releases in the last year
Activity · last 12 months
9 releases
  1. v1.19Ogham firmware v1.19Latest1 file

    Your settings survive. The stored layout is unchanged (SETTINGS_VERSION 16).

    Display brightness and auto-off

    A new last field in the Menu, br.NN. The last digit sets the display brightness, from 0 (dimmest) to 7. A first digit of 1 adds auto-off: the display goes dark one second after you last turn the encoder or a knob, and lights again as soon as you touch one.

    • br.00-br.07 - always on, at that brightness
    • br.10-br.17 - auto-off, at that brightness

    The default is br.14: the same brightness as before, with auto-off on. One detent goes from br.07 to br.10, and the brightness previews live as you edit. Patched CV, gates and the Mode switch don't wake the display; it stays lit in the Menu and through a value flash.

    Why

    On the v1.0 board the display's multiplexed LED current is audible on the outputs as a faint buzz that grows with brightness. It isn't the display's data lines: a build that stopped writing to the display entirely left the buzz unchanged, while turning the LEDs off removed it. Auto-off removes it while you're playing hands-off, and a lower brightness makes it quieter when the display is on. The hardware fix, a series resistor and bulk capacitor at the display connector, is for the next board revision.

    Build

    FileSHA-256
    ogham-v1.19-standard.bin1eec70d3e413654409aee7707dc104053a11f1213cdcad312ec2a5cdf30a5c71

    128,952 bytes. Building this tag from a fresh clone at the pinned submodule commits reproduces it byte-for-byte; that was checked for this release, not assumed.

  2. v1.18Ogham firmware v1.181 file

    Your settings survive. The stored layout is unchanged (SETTINGS_VERSION 16).

    One download from this release onward. Earlier releases published a second binary for an encoder batch with reversed A/B phase. Those are in-house development units that were never distributed, so that variant is now built locally and not published — offering it only invites someone to flash a build for hardware they do not have. The asset suffix changed from -encrev to -standard at the same time, because the default encoder direction moved with the standard part and the old names would have inverted in meaning.

    A and B reach 0 and 255

    The firmware expected the pots to read further than they physically do, so full clockwise stopped a couple of counts short of 255. At the other end the recovered CV — not the pot — held the parameter a few counts above 0, which matters more, because plenty of functions treat zero as a real value rather than a small one.

    Both ends are now set inside the measured travel on purpose. A few degrees at each extreme sit at the limit, which you will not notice, and in exchange the rails are reliably reachable. The margin is also what makes the next batch of pots behave without the firmware being re-fitted to suit them.

    The Rate and Tone detents are calibrated

    A detent is mechanical, and it does not stop in quite the same place depending on which way you turn into it. On Rate that was audible: in V/oct the fine tune could read a quarter-tone apart between arriving from the left and from the right.

    The centre is now taken as the midpoint of both approaches, with a small band around it, so the detent reads exactly 1.0x — and exactly zero detune — however you arrive at it. The band is renormalised, so it costs nothing at the ends: full clockwise is still 64x and the fine tune still covers a full octave either way.

    The Rate knob tells you what it is doing

    Turning it now flashes its value, the way A and B do:

    • V/oct — fine tune in semitones off the detent: 0.0, -1.5, 12.0
    • Free-running — playback multiplier: 1.0, 0.25, up to 64
    • Under a clock — the clock ratio, as before

    That semitone figure is measured, not asserted. tools/voct_semitone_check.cpp renders through the same 32.32 phase accumulator the firmware uses, recovers the fundamental by autocorrelation and compares the delivered pitch against 2^(n/12) — 65 points across the full ±12 semitones, worst error 0.4 cents.

    The clean-centre dot is gone

    The far-right decimal point marked Tone sitting in its clean band. With a detented Tone knob the detent tells you by feel, so it was reporting something your fingers already knew.

    Build

    FileSHA-256
    ogham-v1.18-standard.binde67ba5f7c1dfe09b4b64d1a10a7d7be97e5d1452e43be1c18a4935e8bb38fcc

    128,400 bytes. Building this tag from a fresh clone at the pinned submodule commits reproduces it byte-for-byte; that was checked for this release, not assumed.

  3. v1.17Ogham firmware v1.172 files

    Your settings survive. The stored layout is unchanged (SETTINGS_VERSION 16).

    A and B now reach 0 and 255 exactly

    At the fully anticlockwise stop the A and B parameters bottomed out at 1 or 2 rather than 0. Many formulas treat 0 as a real value — a term switched off, a divisor floor, a mask cleared — so the bottom of the throw was quietly unreachable.

    The pot was never at fault: its own reading is exactly 0 at the stop. The residual came from the CV channel. A and B are summed from the pot and the CV jack, and the CV contribution is recovered as the summing amp's departure from what the pot alone would produce. With nothing patched that departure should be zero, and it is not quite: the calibration was fitted on one module, and another module's amp sits a few thousandths away. That offset was being read as a small CV that nobody had patched.

    A departure smaller than the spread between modules now reads as no CV at all. The band is about three counts of 255, or 30 mV at the jack — under the noise of the CV chain, so patched CV behaves as before.

    The same offset costs a count at the top on a module whose error runs the other way, so this fixes both ends of both knobs, not just the bottom.

    Measured on a second module over the debug port, 290 samples: A and B each sweep the full 0–255 with none of the rotation dead at the top.

    The version number is correct again

    A v1.17 tag was pushed earlier whose firmware still reported 1.16 at power-up, and no release was ever built from it. That tag now points at this commit, which reports 1.17. If you built from the old tag, the module you have identifies itself as 1.16.

    Also in this release

    BpmClock initialises its own members rather than relying on the caller.

    Flash rises from 127,712 to 127,800 bytes, 97.50% of the 128 KB region.

    Builds

    FileForSHA-256
    ogham-v1.17-encrev.binthe default build — modules 2 onward1de252149996b63779981e3f9070a01f437bf650486fd040316dd8f458a5babe
    ogham-v1.17-orig.binoriginal-encoder build — module 1 only5f6360f4ad50828f0c8e5fe0e65ef27cba8f77577d2a178c6b7607530fbf4526

    Both are 127,800 bytes. Building this tag from a fresh clone at the pinned submodule commits reproduces the default build byte-for-byte; that was checked for this release, not assumed.

  4. v1.16Ogham firmware v1.162 files

    Housekeeping ahead of the sources being published. Nothing sounds different — if you are running 1.15 there is no reason to rush this one.

    Your settings survive. The stored layout is unchanged (SETTINGS_VERSION 16).

    The placeholder formula is removed

    Before 1.11 the bank had unfilled slots, and anything landing on one played a placeholder expression. Since 1.11 all hundred numbered slots hold real formulas, and both voices clamp their index before the lookup, so the placeholder had become unreachable — from the panel and from every tool. It is now gone from the bank entirely, and an out-of-range index returns slot 0.

    The bank was regenerated from the curated library and re-verified in the usual way: every generated function compared against the evaluator the formulas were auditioned on, at 100 slots × 9 A/B settings × 4 windows of t × 20,000 samples = 72,000,000 samples, with zero mismatches. Running the generator unmodified first confirmed it reproduces the shipped 1.15 bank exactly, so this release removes the placeholder and changes nothing else.

    Flash drops from 127,760 to 127,712 bytes, 97.44% of the 128 KB region.

    Builds

    FileForSHA-256
    ogham-v1.16-encrev.binthe default build — modules 2 onward23419a5fbaf217fa379166383cf2d0f3b271563b7fff00d57c999b3841959316
    ogham-v1.16-orig.binoriginal-encoder build — module 1 only6cac7ef22e95bcbe65222954a0cc55a3392b65672dacf80730d3f31214181fb9

    Both are 127,712 bytes. Building this tag from a fresh clone at the pinned submodule commits reproduces both files byte-for-byte.

  5. v1.15Ogham firmware v1.152 files

    The A and B knobs get their top fifth back, one-shot formulas fire when you select them, and a menu field added the day before is withdrawn.

    Your settings survive this update. The stored layout is unchanged (SETTINGS_VERSION 16), so patches carry over. Coming from anything older than 1.14, expect the one-time reset that 1.14 introduced.

    A and B stopped climbing at 2 o'clock

    Both knobs reached 255 at about 80% of travel, on every module, and the last fifth of the rotation did nothing. The pot and its CV were summed in hardware into a single ADC, and that sum sits on the 0 V rail before the pot finishes its sweep — by the time the firmware saw it, the information was gone. The pot is now read from its own ADC and the CV recovered as the sum's departure from the fitted line: 255 arrives at 100% of travel on both channels. Bipolar CV behaviour is unchanged, measured symmetric at +83/−82 counts.

    Selecting a one-shot fires it

    Roughly a fifth of the bank is percussive one-shots that make their sound within the first few thousand ticks and are silent ever after, so landing on one after a few minutes of playing gave nothing at all — at every A and B, with no indication why. Changing either voice's formula now restarts the waveform. A decoupled Out 2 drone is not affected.

    The V/oct start offset field is withdrawn

    Added and removed the same day. Skipping a formula's silent opening is better described in the manual than dialled in from a menu, so the Sync chapter gains a section on formulas that start silent — the first remedy being to turn Rate up. The persisted byte was kept as a reserved field, which is why settings are not reset.

    Appendix A of the manual now marks which formulas are one-shots.

    Builds

    FileForSHA-256
    ogham-v1.15-encrev.binthe default build — modules 2 onward331623e9cc8919af56c531b0d452f6b6380ffbba53b2ba9746624579f6732fbe
    ogham-v1.15-orig.binoriginal-encoder build — module 1 only4d9c1c10ef3afc901a2778a8f689a00bf6c630f10c436a541cac4af81034bb68

    Both are 127,760 bytes, 97.47% of the 128 KB internal flash. Building this tag from a fresh clone at the pinned submodule commits reproduces both files byte-for-byte.

  6. v1.14Ogham firmware v1.142 files

    Pitch, tempo and the low-pass gate all change here.

    This update resets your settings. SETTINGS_VERSION 15 → 16, so every module returns to factory defaults on first boot — both voices to F0 and the whole Menu back to its defaults.

    V/oct transposes instead of hard-syncing

    The V/oct input used to reset the formula every cycle to force a pitch, which gave a clean note but discarded most of what the formula was doing — and left plenty of formulas silent. It now sets the playback rate exponentially, so the formula runs out normally and every partial scales together: varispeed transposition, the way speeding up a tape moves everything at once.

    The Rate knob becomes a quantized octave selector (÷32 … ×32) while the Mode switch is on VOct. That is not a convenience — natural pulse rates across the bank span about seven octaves, so the knob is what puts a formula into a playable register. Tracking remains 1 V per octave.

    Honest limitation: roughly half the bank has a fast enough natural pulse that it bottoms out around C3 even at ÷32. Slower-pulsed formulas reach well below C1.

    Clock In follows the beat, not the sixteenth

    The clock input assumed one pulse per sixteenth note; it now assumes one per beat, which is what most gear sends. Expect a given clock to play about four times slower at the same knob position, and to sit much closer to native speed. Dropout timeouts went from 2 s to 10 s — a 4/4 bar at 120 BPM is exactly 2 s, so the old cap could read a slow clock as a stopped one.

    LPG decay gets its range back

    The decay curve's knee moved from Menu value 50 (10 s) to 40 (500 ms). The old shape crammed a 166× range into the bottom 30 values while spending its entire top half — 49 numbers — on a 2× range nobody could hear.

    Landmarks now: 10 ≈ 8 ms, 20 ≈ 32 ms, 30 ≈ 126 ms, 40 = 500 ms, 50 ≈ 0.9 s, 70 ≈ 3.3 s, 99 = 20 s. A saved LPG number now means a different time, so patches relying on a particular decay will need redialling.

    A and B recover their odd numbers

    The knobs could only land on even values: the anti-jitter filter compared each new reading against the last committed value, so from 100 a reading of 101 was rejected and only 102 accepted — halving the resolution to 7 bits. Fixed, so all 256 values are reachable.

    The value flash grew to 2.5 s, re-arms correctly on single-step moves (a slow adjustment used to change the value with nothing shown), and now yields immediately to the encoder instead of blocking the Menu until it expires.

    Also

    • New Menu field: start offset (P.NNN) — a Sync reset restarts the formula at a chosen point rather than the beginning, to skip a dead opening.
    • Correctness fixes in the tempo estimator behind the EOC output.
    • Firmware is 127,952 bytes, 97.6% of available flash.

    Flashing

    • ogham-v1.14-encrev.bin — the default, and what nearly every module wants.
    • ogham-v1.14-orig.bin — only for very early units whose encoder counts backwards on the standard build.

    Reproducibility

    A fresh git clone --recurse-submodules of this tag, built with arm-none-eabi-gcc 14.2 rel1, produces both binaries byte-identical to the ones attached here. Verified, not assumed.

  7. v1.13Ogham firmware v1.132 files

    The formula bank is finished: all hundred slots are real formulas, grouped by character — textural F0–F19, noise F20–F39, percussive F40–F59, rhythmic F60–F79, melodic F80–F99. The placeholder that filled every slot past the first twenty-two is gone.

    Your saved patch will sound different. Settings are not reset — the menu, FX chain and ENV Out setup all survive — but the bank is entirely replaced, so a stored formula number now selects a different sound.

    Also in this release

    • The encoder stops missing clicks. Its scan ran at the lowest interrupt priority while the audio DMA ran at the highest, so under a busy FX chain the audio callback starved it: the effective scan rate fell by nearly half and brisk turns had movement discarded rather than delayed. The same gesture registered 21 steps at light load and 6 under a heavy patch. Fixed, and verified at the load that used to lose two thirds of a turn — twenty clicks in, twenty registered.
    • Unused effects no longer cost CPU. A stage at Level 0 was silent but still computed; a one-effect patch went from 34% CPU to 20%.

    Flashing

    Two builds, same firmware, different encoder wiring:

    • ogham-v1.13-encrev.bin — the default, and what nearly every module wants.
    • ogham-v1.13-orig.bin — only for very early units whose encoder counts backwards on the standard build.

    Firmware is 126,904 bytes, 96.8% of the available flash.

    Reproducibility

    A fresh git clone --recurse-submodules of this tag, built with arm-none-eabi-gcc 14.2 rel1, produces ogham-v1.13-encrev.bin byte-identical to the binary attached here (SHA-256 d92577663aef9aaf74406af6775d2f853b5af5c93629a0731eff3d261a2c47ff). Verified, not assumed.

  8. v1.10Ogham firmware v1.102 files

    Firmware v1.10 for the Ogham Eurorack module. Maintenance release — no new user-facing features, and no settings-layout change (updating from 1.09 does not reset your saved settings, unlike the 1.09 update).

    Two builds — pick the right one. Two encoder batches exist with opposite A/B phase, and the firmware cannot detect which is fitted.

    FileForSHA-256
    ogham-v1.10-encrev.binCurrent modules — start here0e78f2d190ac76ce503d858ebff30af623f0988f7ab5595615bccc37fdcf65e1
    ogham-v1.10-orig.binEarly units with the original encoder9b96e018be878db68a22a51c00ea7f448a99c222a373cc5742522230e2f53586

    If after flashing the Func encoder counts down when you turn it clockwise, flash the other one. Nothing else differs between them.

    What changed

    • Firmware source clean-up. Removed several accessors and one code path left behind by earlier, since-superseded designs (an unused Out 2 "delay" mechanism, an unused engine freeze, unused polled gate/clock edge detection, among others). No behaviour change.
    • Manual: new Troubleshooting section. If the module boots fine and the Menu works but there's no sound on either output, check the internal LPG first — left on with nothing patched to Sync, it produces exactly that symptom by design, not a fault.

    Flash to internal flash at 0x08000000. See firmware/README.md, or use the in-browser flasher at https://keeos.io/firmware/ogham/.

    These binaries are reproducible from this tag: build with the submodules at their pinned commits and Arm GNU Toolchain 14.2.Rel1. Verified via a fresh clone in this release process.

  9. v1.09Ogham firmware v1.092 files

    Firmware v1.09 for the Ogham Eurorack module.

    Two builds — pick the right one. Two encoder batches exist with opposite A/B phase, and the firmware cannot detect which is fitted.

    FileForSHA-256
    ogham-v1.09-encrev.binCurrent modules — start here291e081e5f3122d2f8537e81b8df081543803917fe01fc40cf208473b7d17ee4
    ogham-v1.09-orig.binEarly units with the original encoder3d5f1df00ae861cda2f7d3dca39694eceafd92ee035e0943d56096b4875f8fbf

    If after flashing the Func encoder counts down when you turn it clockwise, flash the other one. Nothing else differs between them.

    Updating from 1.03 or earlier resets the module to factory defaults — the stored-settings layout changed. Once, on the first boot after flashing.

    Flash to internal flash at 0x08000000. See firmware/README.md, or use the in-browser flasher at https://keeos.co.uk/firmware/ogham/.

    These binaries are reproducible from this tag: build with the submodules at their pinned commits and Arm GNU Toolchain 14.2.Rel1.