ipatix/agbplay

Support for GSF rips?

dogtopus opened this issue · 7 comments

GSF rips contain parts of the ROM that is responsible for playing the music and sound, along with tags for each music track/sound effect contained in "MiniGSF" files. It would be nice to support those for easy track finding, fine-tuned track order, etc. without hardcoding everything into the INI file (given that the they are from games that use sappy engine).

Is there any documentation about what these GSF files look like?

There's a tool that rips music from ROMs that uses sappy/M4A/MP2K engine. See https://github.com/loveemu/saptapper

I am aware of this tool, however, I probably will not implement something like this if I first have to read code just in order to find out the structure of the file format. So if you can find some documentation on this I might give it some consideration.

here's this by the author of gsf, don't know how much this helps
https://www.caitsith2.com/gsf/gsf%20spec.txt

I've thought about it and I personally most likely won't implement it. For me, I don't see too much benefit from opening gsflibs directly.

However, what I can imagine is generating an .ini playlist (or a different format in the future) from a minigsf set, so you don't have to go through the process manually (I've done it before and it sucks :D). Perhaps by specifying a set of minigsf files with a new command line parameter to import the tags into the playlist.

As for an estimate when it's going to happen: Probaly when I'll want to import from a GSF set myself. So not sure when I'm going to do it, but it's definitely somthing I could imagine being useful.

@dogtopus I've added a script with the name playlist_from_gsf.py. Pass it a number of .minigsf files and it will generate a playlist in the recently added JSON format which can then be inserted into agbplay.json in ~/.config/agbplay.json. The script will automatically discard any files that don't end with .minigsf, so you can simply pass it in your shell with a * wildcard from the GSF directory.

Does that at least somewhat solve your problem?

I've put some more information into the README. I'm closing the issue for now. If you have any more suggestions, feel free to reopen.