Skip to content

Latest commit

 

History

19 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

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

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

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages