Mod Archive Forums

Community => Project / Coder's Corner => Topic started by: wow25 on February 06, 2021, 18:36:45

Title: Where can I start learning about programming a module player?
Post by: wow25 on February 06, 2021, 18:36:45
Hi! The title is pretty much what I'm asking. I've been looking through the Openmpt source code (https://source.openmpt.org/browse/openmpt/trunk), and specifically openmpt123, to try and understand how it works. However, the complexity of the project has confused me, and I was wondering if there was a more 'simplified' player or guide I could look into.

For background, I'm no stranger to programming (though c++ isn't my strongest language), but I know very little when it comes to audio programming. I'd love to learn this stuff, either to make my own kind of player, or to contribute somehow!

Thanks!

Title: Re: Where can I start learning about programming a module player?
Post by: Saga Musix on February 06, 2021, 19:29:18
There will always be some complexity because the original trackers, typically being written by teenagers and young adults with no industry standard to define formats etc., often lack proper documentation, a lot of implementation details are hidden inside the original assembly code... Getting started is often easy, but you cannot expect that your results will be accurate. OpenMPT's code in particular is complex because
1) it supports dozens of formats.
2) it does its best to emulate the various little quirks of the trackers used to write those formats.
3) it is designed to be used by other software and thus has high standards with regards to security and standard conformance.

It will probably much simpler if you start out with writing a player for a single format, and if you don't care about getting every detail right. Basic understanding of how audio programming works (volume, panning, resampling with interpolation) would be very useful, too.
If you want to start with the ProTracker MOD, you can check out this tiny MOD player source (https://www.pouet.net/topic.php?post=177304). It will definitely not get every detail of the MOD format right, but it's a good start. 8bitbubsy's ft2play (https://github.com/8bitbubsy/ft2play) may also be interesting if you want to get into the XM format, as it's a direct port of the original FT2 source (so it's very accurate but might not be easy to follow).

In the end, once you have grasped the basic concepts (which these two examples may help with), writing a player for yet another format will become much easier, as it's the same stuff over and over again, just with some details being different here and there. Those details add a lot of complexity once you want to support all of those formats in a single engine (like OpenMPT does), though.
Title: Re: Where can I start learning about programming a module player?
Post by: wow25 on February 06, 2021, 20:59:16
These look perfect! I'll do my best to learn it on my own (and with online resources), but I may come back here with a question or two if I'm having trouble.

Thank you for the help, and thanks for all the hard work you put into this site and OpenMPT!
Title: Re: Where can I start learning about programming a module player?
Post by: Saga Musix on February 06, 2021, 21:40:54
You're welcome. You may also have a look at the OpenMPT development forums (https://forum.openmpt.org/index.php?board=12.0) and ask technical questions about the source or how to implement certain aspects of a mod player there.
Title: Re: Where can I start learning about programming a module player?
Post by: wow25 on March 13, 2021, 03:43:18
So after about a month of diving into your sources I've made a pretty good understanding, though I still think there's stuff I need to learn. I wasn't able to make the tiny mod player work, which was likely my own inexperience. I instead focused mostly on the ft2 player which, as you said, was more difficult to understand.

Do you know of any other simple players that I could look into? This stuff really is cool!
Title: Re: Where can I start learning about programming a module player?
Post by: Saga Musix on March 13, 2021, 12:50:32
I mean, there are tons of Amiga module formats that are very simple conceptually, but most of their sources will be in Motorola 68000 assembly language so depending on your background they are probably more difficult to get into (plus the hardware does the mixing, so you will actually not see any of the magic of that - the players just tell the hardware which pieces of memory to mix at which volume).
I don't know to be honest, maybe it's time to bite the apple and try something more complex. ;) In the end, you will see the same concepts being repeated again and again. Being able to at least read assembly language (Motorola 68000 and x86) can greatly help understanding how some of the older trackers work, as some of them are open-source these days but were obviously not written in high-level languages back then. Or maybe you'd want to start from scratch and write a new MOD or XM player with the stuff you've learned so far. You're always welcome to ask questions how certain things work if you're stuck.
Title: Re: Where can I start learning about programming a module player?
Post by: wow25 on March 13, 2021, 22:23:39
I think you're right. I tend to use MilkyTracker pretty often, so I'll try to jump into the source, maybe make a primitive player.

I did have one question before that. The ft2 player used Windows Multimedia to actually play the audio once it was decoded and put into the buffer, and it seems that OpenMPT does not. Is there a preferred audio driver (if that's the right word for it) for making players? I wouldn't want to use one and find out it's depreciated.

As always, thank you for your help!
Title: Re: Where can I start learning about programming a module player?
Post by: Saga Musix on March 14, 2021, 14:44:02
Quote
I think you're right. I tend to use MilkyTracker pretty often, so I'll try to jump into the source, maybe make a primitive player.

Note that the MilkyTracker source isn't necessarily any easier than OpenMPT's, because it's also a multi-format player, and in particular because it uses a lot of magic numbers everywhere. For example you will find that the internal IDs for all pattern commands are hardcoded integers rather than having descriptive names like you can find them in OpenMPT (something like CMD_VOLUME) and other players.

Quote
I did have one question before that. The ft2 player used Windows Multimedia to actually play the audio once it was decoded and put into the buffer, and it seems that OpenMPT does not. Is there a preferred audio driver (if that's the right word for it) for making players? I wouldn't want to use one and find out it's depreciated.

Both WinMM and DirectSound are just emulation layers on top of WASAPI since Windows Vista. Modern Windows audio code should use WASAPI. It's somewhat more complex than WinMM so if you don't want to fiddle with the details, you can resort to using something like PortAudio or RtAudio as an API abstraction. That way the same audio code would also work on macOS, Linux and some other platforms.
Title: Re: Where can I start learning about programming a module player?
Post by: wow25 on April 20, 2021, 04:58:08
Ok! So I've made a lot of progress, but I keep running into errors with reading mod files. Is there a place I can find the 'anatomy' of a mod? It's a bit hard trying to figure it out by just analyzing other programs' load functions.

Also let me know if this conversation is better suited for somewhere else. Thank you!
Title: Re: Where can I start learning about programming a module player?
Post by: Saga Musix on April 20, 2021, 19:25:51
A variety of module formats is documented at https://ftp.modland.com/pub/documents/format_documentation/ - but it's important to keep in mind that often this documentation is not very formal or complete, because
- it was written by teenagers :)
- it was reverse-engineered and thus might be missing some details.
As MOD is a pretty popular format, there are several documents on the format with various degrees of completeness. You may want to look into this one in particular, because it's essentially a corrected version of another popular document:
https://ftp.modland.com/pub/documents/format_documentation/Protracker%20effects%20(MODFIL12.TXT)%20(.mod).txt

It's also important to keep in mind that a MOD file isn't necessarily a MOD file. By that I mean that there are several closely related variants of the format with tiny differences. For example, the original Ultimate Soundtracker format is almost identical to the "M.K." ProTracker format, with the difference that it only contains 15 instead of 31 sample slots, and doesn't contain the magic bytes ("M.K."). There are many more tiny differences beyond that, but those two would be the main reason why a SoundTracker MOD wouldn't load in a regular MOD loader. Many of these small details are not properly documented and can only be found by dissecting other loaders.
Title: Re: Where can I start learning about programming a module player?
Post by: wow25 on April 21, 2021, 08:38:52
Once again you have the perfect response and resources! I did notice some of the 'exception code' when I was going through the libopenmpt source. This is definitely exactly what I needed, and it looks to be smooth sailing (as much as it can be) from here. Thank you so much ;D !