One thing I found out (the hard way) about NoSQL (DynamoDB) modelling is that you need to know all your access patterns before you model your table. In an RDBMS, it's rather common to model first and optimize indexes later as access patterns change. This is not straightforward in NoSQL modelling (otherwise there would be massive migrations from RDBMS to NoSQL).
Having that said, I will now suggest a simplistic model and I will update my answer as the question is updated with access patterns (i.e. "I need to get all songs for an artist").
Artist:
PK: Artist-<Artist ID>, i.e. Artist-1234 SK: <Name> Attributes: Gender etc.
Song:
PK: Song-<Song ID>, i.e. Song-5678 SK: <Genre> Attributes: Genre, Artist ID, Rating
This approach will only allow you to get your entities by using their ID.
While it's common in NoSQL to de-normalize data (i.e. store artist data in song) for easiest/more efficient access, I'd go with storing the artist ID because it allows easier updates and better consistency.