Speicherprobleme

Flash und RAM haben getrennte Adress-Räume, da der AVR eine Harvard Architektur hat. Du kannst daher nicht einfach normalen Funktionen eine Adresse übergeben und annehmen, dass die ins Flash zeigt. Die adressiert statt dessen das RAM wo was ganz anderes steht.

Statt dessen brauchst du spezielle Makros, die die Adressen umsetzen. Für Bytes ist das pgm_read_byte_near(). Damit kopierst du ein Byte ins RAM.

Siehe:

http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

Mit dem jagged Array hast du aber vielleicht noch mehr Probleme. Probier vielleicht erst mal ein ganz normales zwei-dimensionales Array. Ein jagged Array ist so ähnlich wie ein String Array. Wo man Zeiger auf Arrays abspeichert. Da Zeiger 2 Byte breit sind, braucht man pgm_read_word_near() um den Zeiger zu lesen (aus dem byte* melody).
Aber lerne wie gesagt erst mal wie man einfach PROGMEM Arrays verwendet.

Um dir das freie RAM anzuzeigen gibt es diese Funktion (solange der Sketch noch lauffähig ist):

int getFreeRAM() 
{
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}