Andrew:
I do not have time to validate my idea, but I think you can do what you want by identifying the "self" through the action parameter to Button[].
The documentation gives an example of using Print[10!] as the value for action.   You should be call different functions, or the same function with different parameters that identify the song.
If you want to programmatically generate the Buttons, then you call use ToExpression[] with the action.  ToExpression[] takes a string (that you can generate with the song title).
Something like:
doIt[song_String] := ToExpression[Print[song]];
Button["do it", ToExpression["Print[\"title\"]"]]
Good luck, and have a great week.