in reply to So close...

I do not know the solution to your problem, but I added a print to your death sub:
print "removed=$removed, ", scalar @chroma, "\n"; splice (@chroma, $removed, 1);
This gives you more info about why you get the splice warnings. You can also add use diagnostics; which explains your splice warning in more detail:
splice() offset past end of array at foo.pl line 154 (#1) (W misc) You attempted to specify an offset that was past the end +of the array passed to splice(). Splicing will instead commence at th +e end of the array, rather than past it. If this isn't what you want, tr +y explicitly pre-extending the array by assigning $#array = $offset. + See perlfunc/splice.
Hope this helps.