Hi all,
The problem is that, unusually, ob-lilypond has some conditional logic on its header-args. Its solution is to set the header-args internally when required, which overrides any user-specified value.
The quickest way I could see to preserve the conditional logic was to add a new variable to hold the user configuration, which I called ob-lilypond-header-args. Now the conditional logic sets org-babel-header-args:lilypond to the new variable's value when appropriate.
Another way would be to create a context which sets the variable when needed and then resets it. I opted against this as I'm not sure it would have the same behaviour in all cases. Happy to have a go if it would be preferable, though.
Cheers,
Jamie