
ogham
Hype10/100Ogham — 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.
ogham-v1.19-standard.bin· 126 KB
Custom license· keeos-io/ogham·downloads come from the creator’s GitHub releases
v1.19Ogham firmware v1.19Latest1 file
Your settings survive. The stored layout is unchanged (
SETTINGS_VERSION16).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 brightnessbr.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 frombr.07tobr.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
File SHA-256 ogham-v1.19-standard.bin1eec70d3e413654409aee7707dc104053a11f1213cdcad312ec2a5cdf30a5c71128,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.
v1.18Ogham firmware v1.181 file
Your settings survive. The stored layout is unchanged (
SETTINGS_VERSION16).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
-encrevto-standardat 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 to64 - Under a clock — the clock ratio, as before
That semitone figure is measured, not asserted.
tools/voct_semitone_check.cpprenders through the same 32.32 phase accumulator the firmware uses, recovers the fundamental by autocorrelation and compares the delivered pitch against2^(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
File SHA-256 ogham-v1.18-standard.binde67ba5f7c1dfe09b4b64d1a10a7d7be97e5d1452e43be1c18a4935e8bb38fcc128,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.
- V/oct — fine tune in semitones off the detent:
v1.17Ogham firmware v1.172 files
Your settings survive. The stored layout is unchanged (
SETTINGS_VERSION16).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.17tag 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
BpmClockinitialises 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
File For SHA-256 ogham-v1.17-encrev.binthe default build — modules 2 onward 1de252149996b63779981e3f9070a01f437bf650486fd040316dd8f458a5babeogham-v1.17-orig.binoriginal-encoder build — module 1 only 5f6360f4ad50828f0c8e5fe0e65ef27cba8f77577d2a178c6b7607530fbf4526Both 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.
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_VERSION16).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
File For SHA-256 ogham-v1.16-encrev.binthe default build — modules 2 onward 23419a5fbaf217fa379166383cf2d0f3b271563b7fff00d57c999b3841959316ogham-v1.16-orig.binoriginal-encoder build — module 1 only 6cac7ef22e95bcbe65222954a0cc55a3392b65672dacf80730d3f31214181fb9Both are 127,712 bytes. Building this tag from a fresh clone at the pinned submodule commits reproduces both files byte-for-byte.
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_VERSION16), 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
File For SHA-256 ogham-v1.15-encrev.binthe default build — modules 2 onward 331623e9cc8919af56c531b0d452f6b6380ffbba53b2ba9746624579f6732fbeogham-v1.15-orig.binoriginal-encoder build — module 1 only 4d9c1c10ef3afc901a2778a8f689a00bf6c630f10c436a541cac4af81034bb68Both 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.
v1.14Ogham firmware v1.142 files
Pitch, tempo and the low-pass gate all change here.
This update resets your settings.
SETTINGS_VERSION15 → 16, so every module returns to factory defaults on first boot — both voices toF0and 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-submodulesof this tag, built with arm-none-eabi-gcc 14.2 rel1, produces both binaries byte-identical to the ones attached here. Verified, not assumed.- New Menu field: start offset (
v1.13Ogham firmware v1.132 files
The formula bank is finished: all hundred slots are real formulas, grouped by character — textural
F0–F19, noiseF20–F39, percussiveF40–F59, rhythmicF60–F79, melodicF80–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-submodulesof this tag, built with arm-none-eabi-gcc 14.2 rel1, producesogham-v1.13-encrev.binbyte-identical to the binary attached here (SHA-256d92577663aef9aaf74406af6775d2f853b5af5c93629a0731eff3d261a2c47ff). Verified, not assumed.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.
File For SHA-256 ogham-v1.10-encrev.binCurrent modules — start here 0e78f2d190ac76ce503d858ebff30af623f0988f7ab5595615bccc37fdcf65e1ogham-v1.10-orig.binEarly units with the original encoder 9b96e018be878db68a22a51c00ea7f448a99c222a373cc5742522230e2f53586If 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.
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.
File For SHA-256 ogham-v1.09-encrev.binCurrent modules — start here 291e081e5f3122d2f8537e81b8df081543803917fe01fc40cf208473b7d17ee4ogham-v1.09-orig.binEarly units with the original encoder 3d5f1df00ae861cda2f7d3dca39694eceafd92ee035e0943d56096b4875f8fbfIf 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.