Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sampler Disk Catalog

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.

Requirements

  • .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 edit TargetFramework in the three .csproj files under src/ 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+

Running it

cd src/AkaiDiskCatalog.App
dotnet run

Or open AkaiDiskCatalog.sln in JetBrains Rider / Visual Studio and run the AkaiDiskCatalog.App project.

Publishing a standalone app

# 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-contained

The published app is in src/AkaiDiskCatalog.App/bin/Release/net10.0/<rid>/publish/.

macOS: making it a real double-clickable app

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-x64

The 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.

How it works

  • AkaiDiskCatalog.Core — no external dependencies. Decodes .hfe bitstream 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's akaiutil (GPLv2) — see Filesystem/*.cs doc 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
  • 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).

Renaming samples & programs

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.hfeMY 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.

Known limitations (v1)

  • 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 akaiutil output 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.

Extending it

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.

License

MIT — see LICENSE. Free to use, modify, and distribute.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages