Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions sdk/digitakt/modules/euclidean/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

Generate rhythms from two pulse generators on each audio or MIDI track. Rotate either generator, rotate the whole result and combine them with OR, XOR, AND or SUB.

Version **1.1.4** for Digitakt I OS **1.53 and 1.54**, with separate packages
Version **1.1.5** for Digitakt I OS **1.53 and 1.54**, with separate packages
for each OS. Do not use a 1.53 package on 1.54. Hardware testing is recorded in the
[hardware report](evidence/hardware-testing.json) and [TESTING.md](TESTING.md).

Expand All @@ -20,6 +20,7 @@ for each OS. Do not use a 1.53 package on 1.54. Hardware testing is recorded in
| H — OP | Choose OR, XOR, AND or SUB. |
| FUNC + turn D off | Convert the generated sequence into ordinary trigs. |
| TRK + trig / NO | Select an audio or MIDI track / close the page. |
| TRIG / SRC / FLTR / AMP / LFO | Close Euclidean and open that page. FUNC + TRIG, FLTR, AMP or LFO opens Quantize, Delay, Reverb or Compressor. |

## Usage

Expand All @@ -30,7 +31,7 @@ Follow these steps on either supported OS release.
1. Create a few source trigs on an audio track with a loaded sample. Hold FUNC + AMP to open Euclidean.
2. Set PL1 to 5, PL2 to 0 and enable EUC with D. With a 16-step track this distributes five hits across the loop.
3. Press PLAY. Turn RO1 to move those hits, then add PL2 pulses and try the OP combinations.
4. Turn D off to restore the ordinary sequence and press NO to close. Use FUNC while turning D off only when you want to replace the ordinary trigs with the generated result.
4. Turn D off to restore the ordinary sequence. Press NO, or a page key such as TRIG or FLTR, to leave. Use FUNC while turning D off only when you want to replace the ordinary trigs with the generated result.

## Compatibility and limitations

Expand Down
42 changes: 40 additions & 2 deletions sdk/digitakt/modules/euclidean/TESTING.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,45 @@
# Euclidean Sequencing — test report

- Module: `euclidean` 1.1.4, for Digitakt I OS 1.53 and 1.54 on Elekloader Core 2.1.
- Source: https://github.com/sumedho/digirequests at `8eba613dc3e0b1698797609256fd4081923b4ef2`, `modules/euclidean`.
- Module: `euclidean` 1.1.5, for Digitakt I OS 1.53 and 1.54 on Elekloader Core 2.1.
- Source: https://github.com/sumedho/digirequests at `27432d5aa7281422e7f80467e7e848c7f5433f33`, `modules/euclidean`.

## 1.1.5: page keys leave Euclidean ([#662](https://github.com/repeat98/modwerk/issues/662))

With Euclidean open, TRIG, SRC, FLTR, AMP and LFO did nothing; only NO left
the page. FUNC + FLTR and FUNC + LFO changed the header underneath to Delay
or Compressor while the Euclidean controls stayed on screen. 1.1.5 closes
Euclidean on these keys and passes the same press to the parameter page, as
from any native page. FUNC + SRC has no native action and keeps Euclidean
open. Holding FUNC + AMP from Euclidean closes and reopens it. The only
source change is the Euclidean page's key handler (`src/release-*/page.c`).

**Emulator** ([evidence/page-keys-1.1.5.json](evidence/page-keys-1.1.5.json)):
on a MIDI and an audio track, each of the ten combinations is applied
natively from the Reverb page (the page under an open Euclidean) as a
reference, then pressed with Euclidean open; Euclidean must close and the
screen below the header must match. 1.1.4 fails at the first check. 1.1.5
passes all 233 checks on 1.53 and 1.54, standalone and with all six mods.
The earlier Euclidean UI, editing and playback regressions pass with the
same counts as 1.1.4, and both all-mods SysEx files cold-boot.

**Source parity** ([evidence/modwerk-source-parity.json](evidence/modwerk-source-parity.json)):
Modwerk's compile of this source links all 63 feature selections per OS
(126 in total) to the same MAIN as the native build, through Modwerk, in
reversed order, through the browser kit and with the native objects.

**Hardware** (sumedho, Digitakt 1, 2026-10-16, under 30 minutes): OS 1.53 and
1.54, with all six mods and with Euclidean alone. The page keys and FUNC
shortcuts leave Euclidean on audio and MIDI tracks, holding FUNC + AMP
reopens it, and settings survived project save/reload and a power cycle.
Reported working, with no failures. Tested SysEx:

| OS | All six mods | Euclidean alone |
| --- | --- | --- |
| 1.53 | `f84a7159a4c1054febb9aa566804bc5953507906625815b49fe55d9afabee6cb` | `b32f3bb8c7c56a7ff6d9e55b25e35895275d709d0c5ed9cd62ce958bd069aca0` |
| 1.54 | `4479e908e120e2ecb8890b62374355909303790208c8b83b17101704ea3e75fc` | `e7c3e4448a0fa42908756fe889957b3362e7eff97aa12223523583ec4c30c634` |

The sections below describe the 1.1.4 qualification; the rest of the
module is unchanged.
- All-mods SysEx used for the screenshots and the hardware test:
- 1.53: `23503ca42478c1644dea5fd296893f628eafb6662d2ce5e291bfc591f045ae4e`;
- 1.54: `257144e4a584172e470c3dde83d7ccda636eeb195b4e5ff0492b3ebc8bdfaba2`.
Expand Down
235 changes: 164 additions & 71 deletions sdk/digitakt/modules/euclidean/evidence/modwerk-source-parity.json
Original file line number Diff line number Diff line change
@@ -1,75 +1,168 @@
{
"schemaVersion": 1,
"core": "2.1",
"sourceCommit": "157f712907e8246b63f15e3955d918f67b6e06ca",
"compiler": {
"gcc": "m68k-elf-gcc (GCC) 16.2.0",
"assembler": "GNU assembler (GNU Binutils) 2.47.20260726",
"linker": "GNU ld (GNU Binutils) 2.47.20260726",
"node": "v24.16.0"
"schemaVersion": 1,
"moduleVersion": "1.1.5",
"core": "2.1",
"sourceCommit": "fb640666dd2ffe1e8ac47c649f3b21ddac0b8702",
"compiler": {
"gcc": "m68k-elf-gcc (GCC) 16.2.0",
"assembler": "GNU assembler (GNU Binutils) 2.47.20260726",
"linker": "GNU ld (GNU Binutils) 2.47.20260726",
"node": "v24.16.0"
},
"scope": "Modwerk-compiled objects compared semantically with the native Elekloader build of the same sources; every one of the 63 feature selections per OS linked with the catalogue Core 2.1 through Modwerk, reversed order, the vendored browser kit and the native objects, and compared with the native MAIN.",
"passed": true,
"selections": 126,
"allSelectionsMatch": true,
"allModsMainSha256": {
"1.53": "8b6f4e836bf43dbf3127f90bb5e829fe6bd6cdd9f4d525323488db0343dc9718",
"1.54": "587a6de40e6184633205cfa6b0ab8a3b1690b745c5f3f2e0d5d0d0ebab16b6a6"
},
"nativeReference": "Elekloader Core 2.1 native build of the same sources (digiemu build_dual full matrix); its all-mods SysEx are the files tested on hardware.",
"conflictAlignment": "Modwerk main declares conflicts added after the native reference was built (#629): cc-names digimono, note-accumulator digipoly, ram-machines digihealth, sample-tools digimono. They were copied into the native reference objects before comparison. Conflict lists are catalogue metadata and do not change any linked image.",
"objects": [
{
"id": "dt-support",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "729d16ba484e6ff9a08bf0d461e52678f1f462faa3f53d01c21e88c591c805d9",
"sourceTreeSha256": "bb512fd45792cdb493c261ea7c8609100328a9b581d0be46703f93acb94f67ef",
"exportedSha256": "2164a3bf1d89743189616127a5bc7e93743f2a691502d4750f517915fbd0180c"
},
"scope": "Modwerk-compiled objects compared semantically with the native Elekloader build of the same sources; every one of the 63 feature selections per OS linked with the catalogue Core 2.1 through Modwerk, reversed order, the vendored browser kit and the native objects, and compared with the native MAIN.",
"passed": true,
"selections": 126,
"allSelectionsMatch": true,
"allModsMainSha256": {
"1.53": "ce2c0bd03393ca5f7e9427874bad4f5daa32b7e5699ff003af5e6fc35573ab39",
"1.54": "14469be1cb112830aa283e034d90c9372135b3f6b3fb7d3b077202101f758017"
{
"id": "machine-pages",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "cbe209d2e6670936e05c74ae6aa6e357bb6b0d12b62b5046261156f2cd9c4d4a",
"sourceTreeSha256": "1c8fabc43d7e9b6da6cdce061712855594d30034233b2f70520f65f93c6f3354",
"exportedSha256": "93092ba38bf65583a3d436e3d8c560b0df0480477f81127fe9de7a3264ba38c6"
},
"objects": [
{
"id": "dt-support",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "4a2138b72d572aa24da4f75814f82d1d94104f475393b8f4147d9605d3e14234",
"sourceTreeSha256": "10b03865ef928631fe0ee1285e16c192d47cacb76413be6311a44e3da546f5b3",
"exportedSha256": "2164a3bf1d89743189616127a5bc7e93743f2a691502d4750f517915fbd0180c"
},
{
"id": "machine-pages",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "01d2dda24bd6d4e69214d411d817621f5e78a2225bb2ab4726641a2a41b733be",
"sourceTreeSha256": "1c8fabc43d7e9b6da6cdce061712855594d30034233b2f70520f65f93c6f3354",
"exportedSha256": "93092ba38bf65583a3d436e3d8c560b0df0480477f81127fe9de7a3264ba38c6"
},
{
"id": "euclidean",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "820e3c8bb631939f03792f8d643e722ebc78bd527a6be12dc06af40774edd1d4",
"sourceTreeSha256": "da4c089285f61c579ecb2a005e7c7f0bf6c608a58a8198b17cbf81e05b74c0f9",
"exportedSha256": "da551e67332ffa070bd9d51879319fb4e4a5807eea684555860c0179cb65db20"
},
{
"id": "dt-support",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "67b5f65eef07c6615ce9440c36c808b6be71e2780b4b6344ef3c056cdf603a81",
"sourceTreeSha256": "10b03865ef928631fe0ee1285e16c192d47cacb76413be6311a44e3da546f5b3",
"exportedSha256": "7378c51c4970df68a47e51c9a85402b91577a1495931f2ef4ec566a572dd0b88"
},
{
"id": "machine-pages",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "72f76da61da163d99233a98e4fadf25baab55e4809b781e9f6ffeb438fa1aa37",
"sourceTreeSha256": "1c8fabc43d7e9b6da6cdce061712855594d30034233b2f70520f65f93c6f3354",
"exportedSha256": "1ab853a2ff628dd60b8fa0c5693f3babac64b95c456b331162797aac1526b1a0"
},
{
"id": "euclidean",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "003b6cce541e68013e7cc99cc55193b77d258ba3dbee3ea2b2ea648c76733fa1",
"sourceTreeSha256": "da4c089285f61c579ecb2a005e7c7f0bf6c608a58a8198b17cbf81e05b74c0f9",
"exportedSha256": "7093ef6573081f1bb5180e8576bdcba92359ddf8e91aec0ec666f306464a068d"
}
]
{
"id": "cc-names",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "26ec4e3db87fed191ee2ce4544acf0a959e90db14e80f4070bfb52d219158d06",
"sourceTreeSha256": "640d6cb708aec26d56aa8dffb3aea03a45b6184c245c54e5c859330b5d6ebc2f",
"exportedSha256": "fe2ba05cd83e00187a1c4e74504be99e62a0c4115ba841031ca221d620dc095c"
},
{
"id": "euclidean",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "a5a7c41ac21cbb50bec6bd760c1177b8074ffc921b9b9f48fff381a67ea0e649",
"sourceTreeSha256": "7400bf35fd74b6ed66e4fc59b067b27fe963c66e37265aecc33879654f9777bd",
"exportedSha256": "1fce621ede91db064b0d1c6c8c337d962fa08dda31eef1248052fd5b5ffe4dfa"
},
{
"id": "midi-retrig",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "f8bae0404e3b95715ef90eae875f21c253dfec2f27c901ac9f76ea1d86cc1588",
"sourceTreeSha256": "eb83df66f5c131d869d3fb6c84e03ae0c5a30ba02d17619f11fca3c5ff1923da",
"exportedSha256": "ffe2e60aba95ae09df36ecc3d9e5d185c64e97f52fa02c1ff4ca84e9709486b9"
},
{
"id": "note-accumulator",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "8229dc1ccf1ae8181511a1f7310ac11f0f1bfe85277a03ead3952b2ca4c326ea",
"sourceTreeSha256": "f31803054623a2e471c831452bb4c228197c13ce43a5213837fb31b6bd30dec6",
"exportedSha256": "4c22ddc65ee86b78218114eda1c4099f16e24cb0300dd8d3d54db11f33844262"
},
{
"id": "ram-machines",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "448bdf6bb0bc19ec45acd39d91415226e12592d7d34ec2b117749478657718bf",
"sourceTreeSha256": "b9082e9db46bcc6f3ba1017ac8454d64e473e92f239a40cca8fb5b3fb35421b3",
"exportedSha256": "841b468a1a1336e6dd5baeb59e9b4a2639cb3046121ed92ea75e33a3f9b4cce2"
},
{
"id": "sample-tools",
"os": "1.53",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "5d094e6c672eab989a9ba7052c4d637fb0addcbe90d82b9b0b600b4c5787ea54",
"sourceTreeSha256": "18799899e9e96cfd76be1b07f3f60bf9dcc67ba5ecea15431ddf8b254622ac99",
"exportedSha256": "e8b9bb827e0f818cc38e1f1997e53a76cd74f1e7e692dad6d2af71cc7d9dc04c"
},
{
"id": "dt-support",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "159b6fe2a92f3c33250367651abf3e4e0682f930f7d2448933ab5263f96617e6",
"sourceTreeSha256": "bb512fd45792cdb493c261ea7c8609100328a9b581d0be46703f93acb94f67ef",
"exportedSha256": "7378c51c4970df68a47e51c9a85402b91577a1495931f2ef4ec566a572dd0b88"
},
{
"id": "machine-pages",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "92d70dd34404b8132b3f6464806e6ee3ab236b976f8ee20cd731e51688bc9aea",
"sourceTreeSha256": "1c8fabc43d7e9b6da6cdce061712855594d30034233b2f70520f65f93c6f3354",
"exportedSha256": "1ab853a2ff628dd60b8fa0c5693f3babac64b95c456b331162797aac1526b1a0"
},
{
"id": "cc-names",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "ed25c3723882dbff7e01d8a9c93cd30c06b1a29ab33595ffec12cae1db375f94",
"sourceTreeSha256": "640d6cb708aec26d56aa8dffb3aea03a45b6184c245c54e5c859330b5d6ebc2f",
"exportedSha256": "9b3640b6dc3b20d8ed30c478a1f9564ad784534869e1a4322a4787e3f6eefb52"
},
{
"id": "euclidean",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "f700f1a0d05bfd31b352e44121021acced4136c58b7f7712f50dad0f95280682",
"sourceTreeSha256": "7400bf35fd74b6ed66e4fc59b067b27fe963c66e37265aecc33879654f9777bd",
"exportedSha256": "b8315446ecd011d3798ed70692dd4762301458c930209465c2bd58bc52568bd9"
},
{
"id": "midi-retrig",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "c9785be605aafcee9bdc283d10508ef5d8e00d3841ddebb61cb35915a4c9ce93",
"sourceTreeSha256": "eb83df66f5c131d869d3fb6c84e03ae0c5a30ba02d17619f11fca3c5ff1923da",
"exportedSha256": "29d1f2f99bf47c4688808253a19cfad0627845370170949b19159640f2116d3d"
},
{
"id": "note-accumulator",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "121392b51f27f8695ba81eb3c1106452652f6bc542a132e74cf6bfbc75cfacee",
"sourceTreeSha256": "f31803054623a2e471c831452bb4c228197c13ce43a5213837fb31b6bd30dec6",
"exportedSha256": "faac823eedcfe583944d5d9457619d55978a4fd92a3051329ecd89db93964a9a"
},
{
"id": "ram-machines",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "f6898d4bec02643e334e76fa5e0a5a6f57a538319852a0d9baa90d48aca121da",
"sourceTreeSha256": "b9082e9db46bcc6f3ba1017ac8454d64e473e92f239a40cca8fb5b3fb35421b3",
"exportedSha256": "af6c0735fcbd3663b4536e4dffcd5a78fd7ed25e7888aa7c84dea9c9ae26450d"
},
{
"id": "sample-tools",
"os": "1.54",
"semanticParity": true,
"addedConflicts": [],
"recipeSha256": "3faf33a2bbcba26597b957c57aa7ed8cdde0b033f54e0d78896ee84a6bf1cf19",
"sourceTreeSha256": "18799899e9e96cfd76be1b07f3f60bf9dcc67ba5ecea15431ddf8b254622ac99",
"exportedSha256": "49619a91508d8bbc4e8052720a1c296b1765c0ae7cb37b130002473f2209e075"
}
]
}
72 changes: 72 additions & 0 deletions sdk/digitakt/modules/euclidean/evidence/page-keys-1.1.5.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{
"schemaVersion": 1,
"moduleVersion": "1.1.5",
"issue": "https://github.com/repeat98/modwerk/issues/662",
"sourceSha256": "56ce0d64930138fe1bb5d504355d45fd693b10865f0527b56039008c4e36f2df",
"source": {
"repository": "https://github.com/sumedho/digirequests",
"revision": "27432d5aa7281422e7f80467e7e848c7f5433f33",
"path": "modules/euclidean"
},
"fix": "With Euclidean open, TRIG, SRC, FLTR, AMP and LFO, and FUNC + TRIG/FLTR/AMP/LFO (Quantize, Delay, Reverb, Compressor), now close Euclidean and pass the same press to the parameter page underneath, as from any native page. Before, only NO left the page; FUNC + FLTR/LFO changed the header underneath while the Euclidean controls stayed on screen. FUNC + SRC has no native action and keeps Euclidean open. Holding FUNC + AMP from Euclidean closes and reopens it.",
"emulator": {
"scope": "Emulator only; not hardware evidence. Core 2.1 native builds of the same source, OS 1.53 (stock SHA-256 9bdd44bb…) and 1.54 (f78ba80f…).",
"pageKeys": {
"method": "On a MIDI and an audio track, each of the ten combinations (five page keys, alone and with FUNC) is applied natively from the Reverb page as a reference; Euclidean is then opened with a long FUNC + AMP, the combination pressed, and the modal must close and the LCD below the header must match the reference. FUNC + SRC must keep Euclidean open; holding FUNC + AMP must reopen it; NO must still close it.",
"previousVersion": "1.1.4 fails at \"MIDI TRIG closes Euclidean\".",
"results": {
"1.53 standalone": 233,
"1.53 all": 233,
"1.54 standalone": 233,
"1.54 all": 233
},
"allPassed": true
},
"regressions": {
"counts": {
"1.53-euclidean-standalone": 54,
"1.53-euclidean-combined": 59,
"1.53-playback-combined": 1,
"1.53-editing-combined": 21,
"1.54-euclidean-standalone": 54,
"1.54-euclidean-combined": 59,
"1.54-playback-combined": 1,
"1.54-editing-combined": 21
},
"note": "Same pass counts as 1.1.4 on both OSes."
},
"coldBoot": "Both all-mods SysEx files cold-boot to a settled UI."
},
"hardware": {
"tester": "sumedho",
"model": "Digitakt 1",
"testedOn": "2026-10-16",
"releases": [
"1.53",
"1.54"
],
"builds": {
"1.53": {
"all": "f84a7159a4c1054febb9aa566804bc5953507906625815b49fe55d9afabee6cb",
"euclidean": "b32f3bb8c7c56a7ff6d9e55b25e35895275d709d0c5ed9cd62ce958bd069aca0"
},
"1.54": {
"all": "4479e908e120e2ecb8890b62374355909303790208c8b83b17101704ea3e75fc",
"euclidean": "e7c3e4448a0fa42908756fe889957b3362e7eff97aa12223523583ec4c30c634"
}
},
"coverage": [
"Page keys and FUNC shortcuts leave Euclidean; holding FUNC + AMP reopens it",
"Audio and MIDI tracks",
"Project save and reload",
"Power cycle"
],
"configurations": "All six mods together, and Euclidean alone, on each OS.",
"duration": "Under 30 minutes in total.",
"result": "Working as intended; no failures reported.",
"limitations": [
"Individual outcomes were not itemized beyond the coverage listed.",
"Firmware was not read back from the device; build hashes identify the files provided for testing."
]
}
}
Loading
Loading