I ended up scrapping the iTunes Controller API and generating my own with JacobGen. I figured out that index 1 is the library source & for IITPlaylistCollection, index 1 is the library playlist (all songs), then called play() on the IITTrack object. Worked beautifully, even opens iTunes if its not already open!
ActiveXComponent iTunesCom = new ActiveXComponent("iTunes.Application");
Dispatch iTunesController = new Dispatch(iTunesCom.getObject());
IiTunes it = new IiTunes(iTunesController);
IITSourceCollection sourceList = it.getSources();
IITSource s = sourceList.getItem(1); // Index 1 is library source
IITPlaylistCollection pc = s.getPlaylists();
IITPlaylist p = pc.getItem(1); // Index 1 is library playlist
IITTrackCollection tracks = p.getTracks();
IITTrack track = tracks.getItemByName(songName);
track.play();
Works similarly with playlists:
ActiveXComponent iTunesCom = new ActiveXComponent("iTunes.Application");
Dispatch iTunesController = new Dispatch(iTunesCom.getObject());
IiTunes it = new IiTunes(iTunesController);
IITSourceCollection sourceList = it.getSources();
IITSource s = sourceList.getItem(1); // Index 1 is library source
IITPlaylistCollection pc = s.getPlaylists();
IITPlaylist playlist = pc.getItemByName(playlistName);
playlist.playFirstTrack();
Thanks for all your pointers all, hopefully this helps anyone with a similar question. It took me forever to figure out how to get JacobGen working since theres barely any documentation on it anywhere on the internet. If anyone has questions I'd be glad to make a post about it.