A quick hack which might be a useful tip. When using a cheap ($2) "DFPlayer" MP3 player module (plays off microSD, has a built in amplifier) under control of a microcontroller, I wanted to be able to read data off the SD card too - ideally synchronized with the music, for a simple lightshow. Annoyingly the DFPlayer, while it has a simple UART interface to play tunes, has no way for the host cpu to read data off the SD card.

Then I had a bright idea - because I'm only playing mono audio through the speaker, and the module has left and right DAC outputs, why not encode a modem-style FSK datastream on one channel and music on the other, then feed the DAC output into my microcontroller and get a data stream perfectly synched with the music playback?

The only mod required is to remove a resistor off the module that mixes L+R together (cos you don't want to hear what sounds like a fax machine mixed with your music). I just used simple FSK modulation (you want something that will survive MP3 encoding), and on the mcu you just read the ADC (at say 10khz or so), find the zero-crossing points, and measure the frequency to decode the bits. It's quite easy to get a few hundred bytes per second of data - which can of course contain anything you want, e.g. track info, LED or motor control data, DMX bytes, etc.

The swiss-army-knife "SOX" is ideal for preparing your MP3 files as it will happily convert the original music to mono (and EQ/normalize it if you like to work better on a small speaker) and splice in the data track before encoding to MP3.

BTW comments on this project so far are mostly on http://hackaday.com/2016/06/13/synchronize-data-with-audio-from-a-2-mp3-player/