Let me see if I can help you here.
1. I'm trying to establish a complex many to many relationship between custom posts.
I will use your example of Musicians and Events of your Many to Many tutorial.
This is a good start.
We also have this, for your reference:
https://toolset.com/documentation/user-guides/many-to-many-post-relationship/
https://toolset.com/documentation/toolset-training-course/ (this is a whole tutorial)
https://toolset.com/faq/how-do-i-associate-one-child-with-several-parents-of-the-same-type/
2. For example, Each musician will have a list of songs they sing, which means we have a Parent - > Child relationship between musician and songs.
Correct, the songs would be the Child post and the Singer/Band the parent Post.
3. Now, musicians play at events, and this is the many to many relationships in your example.
Exactly.
What I usually do here is to choose wether to use a Taxonomy or a Child/parent relation.
Sometimes it's easier to use a Taxonomy.
I assume you fully understood how to set this up, if not, please let me know.
4. What I'm trying to achieve, is to expand on that, Each musician will have a list of songs, but they won't play ALL their songs for any given event.
I want to be able to list the songs by each musician that is PLAYED at a given event.
So you will have a bundle of specific musicians, playing specific music (songs) at a specific event.
In another event, the songs and artists might, but must not, change.
5. Looking at what you have set up so far and how to finish it, you should now be able to create a View that queries Events.
Then, you create a View that queries the Child of events (the intermediate "Program").
This View must have a Query Filter as this:
"Select posts that are a children of the current post in the loop."
Then, you insert this View to the first View where you query Events.
What this allow you to do is to have a list of Events and along with it, a list of each Program associated with an event. So far so good.
Now, in the View where you query the Program, you should call the Parent Post in it's Loop, by using the GUI when inserting Fields.
You can choose the Post Type of the data you insert, so you can also choose if it should be the current post or the parent of the current post.
You will choose the parent Post Type "Songs".
This now produces a list of Events, and along with it, a list of Songs played at each event.
With a Custom Search in the Events View you can now filter the Events and along with it only the songs of the Event will show up.
If you need this in a Single Event, simply create a View of Programs and display the Parent Post Songs, and add a Query Filter of "Select posts that are children of the Post where this View is shown."
If I wrapped my head around your setup correctly, this will help you to achieve the goal in a few clicks.