A cross-platform (Windows + macOS) desktop app that scans a folder of AKAI S900/S1000/S3000
sampler disk images (.hfe and .img) and builds a searchable, browsable catalog of every
disk's volumes, samples, and programs — sample rate, duration, loop points, root key, tuning,
and full program keygroup / velocity-zone maps.
Not affiliated with or endorsed by AKAI Professional. "AKAI" and the S900/S1000/S3000 model names are used only to describe the disk formats this app reads.
- .NET 10 SDK (free, Microsoft) —
check with
dotnet --version. If you have an older SDK only (e.g. 8.x) instead, either install .NET 10 alongside it, or editTargetFrameworkin the three.csprojfiles undersrc/back down to a version you have installed (net8.0,net9.0, etc.) — the code itself has no version-specific dependencies. - Windows 10+ or macOS 12+
cd src/AkaiDiskCatalog.App
dotnet runOr open AkaiDiskCatalog.sln in JetBrains Rider / Visual Studio and run the
AkaiDiskCatalog.App project.
# macOS (Apple Silicon)
dotnet publish src/AkaiDiskCatalog.App -c Release -r osx-arm64 --self-contained
# macOS (Intel)
dotnet publish src/AkaiDiskCatalog.App -c Release -r osx-x64 --self-contained
# Windows
dotnet publish src/AkaiDiskCatalog.App -c Release -r win-x64 --self-containedThe published app is in src/AkaiDiskCatalog.App/bin/Release/net10.0/<rid>/publish/.
dotnet publish alone produces a flat folder with a raw executable, not a .app you can
double-click in Finder. Use the packaging script instead — it publishes and wraps the
result into dist/Sampler Disk Catalog.app, ad-hoc signed so it'll actually launch:
scripts/package-macos.sh osx-arm64 # or osx-x64The very first time you open it, right-click the app in Finder and choose Open (instead of double-clicking) — macOS will warn it's from an unidentified developer since it isn't notarized by an Apple Developer account; this bypasses that warning once, after which normal double-clicking works.
- AkaiDiskCatalog.Core — no external dependencies. Decodes
.hfebitstream images (a from-scratch MFM decoder — no HxC/akaiutil binaries needed at runtime), reads the AKAI S900/S1000/S3000 floppy filesystem (FAT + volume directory), and parses S1000/S3000 sample headers (rate, length, loop points, tuning) and program files (keygroups, velocity zones, per-zone tuning/filter/pan). All byte offsets were derived from and cross-checked against Klaus Michael Indlekofer'sakaiutil(GPLv2) — seeFilesystem/*.csdoc comments for structure references. - AkaiDiskCatalog.Data — SQLite-backed catalog (
Microsoft.Data.Sqlite). Rescans are incremental: a disk image is only re-decoded if its file size or modified time changed since the last scan. The database lives at:- macOS:
~/Library/Application Support/AkaiDiskCatalog/catalog.db - Windows:
%LOCALAPPDATA%\AkaiDiskCatalog\catalog.db
- macOS:
- AkaiDiskCatalog.App — Avalonia 11 MVVM desktop UI (CommunityToolkit.Mvvm). Read-only browsing plus a scoped rename feature that writes back into a copy of the disk image (see "Renaming samples & programs" below).
You can rename a Sample or Program directly from the detail pane (the pencil icon next to its name). This isn't just a catalog label — the new name is written into the actual disk image, in every place a name for that file exists:
- The 12-byte directory entry name (what disk browsers show).
- The separate 12-byte "RAM name" embedded in the file's own data block.
- For samples: every other program on the same disk that references that sample by name inside its keygroups/velocity zones is patched too, so renamed samples don't silently break the programs that use them.
Your original file is never modified. A rename always writes a brand-new .img file
next to the source (e.g. MY DISK.hfe → MY DISK.img, or MY DISK (1).img if that name's
taken), and that new file is automatically added to your catalog. If the source was a
.hfe, it's fully decoded and converted to .img as part of saving — .hfe's bitstream
format has no write path in this app, so edited disks are always saved as .img going
forward.
Rename is only offered where it can be done safely:
- S900 files aren't renameable in this version.
- Renaming a sample is blocked if the disk contains any S3000 program — S3000 keygroup layouts aren't decoded (see below), so this app can't find and patch sample references inside them, and a rename that misses a reference would leave the disk inconsistent.
- Renaming a program has no such restriction (nothing else references a program by name), so it's always available for S1000 and S3000.
- Names are limited to 12 characters from AKAI's own character set (
0-9, space,A-Z,# + - .); anything else is rejected with an explanation rather than silently truncated.
- S3000 program keygroups are not decoded — the S3000 keygroup binary layout differs from S1000's and wasn't reverse-engineered in this pass. S3000 program headers (name, MIDI channel, key range) still show; the keygroup/velocity-zone table will show a note instead of data. S1000 programs (like the disk this was built against) are fully decoded.
- S900 sample/program internals aren't deeply parsed — S900 files are recognized, named, and sized correctly, but sample-rate/loop/keygroup details specific to the S900's older header format aren't extracted yet.
- Low-density (800KB) floppies are supported in the filesystem/FAT layer but got less
real-world testing than the 1.6MB high-density path (which was validated byte-for-byte
against
akaiutiloutput on a real disk). - No audio playback or WAV export in this version (by request — metadata browsing only).
- Renaming is scoped to what can be done safely today — see "Renaming samples & programs" above for exactly what's supported (no S900, sample rename blocked on disks with S3000 programs) and why.
The parsing logic in AkaiDiskCatalog.Core/Filesystem/ is intentionally offset-based and
heavily commented with the source struct layouts, so adding S3000 keygroup or S900 detail
support later is a matter of adding another parser class alongside AkaiProgramParser/
AkaiSampleParser — no changes needed to the HFE decoder, filesystem reader, database
schema, or UI.
MIT — see LICENSE. Free to use, modify, and distribute.