I wouldn't copy the array just to use part of it. I'd set a pointer to the start of the part I want to use then iterate the pointer to the end.
No time to go into detail right now, be back later to see how the thread develops.
--- back again and got more time
Song::Song(int notesArray, int pin)
{
_notesArray = notesArray;
_pin = pin;
}
I dunno what that's supposed to do for you but (int notesArray) is just 1 int no matter what name you give it.
You can set up the array as global or as a data member of the Song class.
If the song is expected to get big then look into storing the song data in flash memory (PROGMEM) and copying short stretches into a small array if not a note at a time.
If you go that way; it takes time to play one note, much-much-etc longer than to copy the next from PROGMEM, at least if you don't waste that time with delay().