Hi Keith, Thanks for the function and snippet. Here is a [compiling, but non-functional] revision showing how I *want* to use it:
%%%% SNIPPET BEGINS \version "2.19.15" transpositionUpdateKey = #(define-music-function (parser location new-transposition) (ly:pitch?) (_i "Set instrument transposition and, based on the previous transposition and key, generate the key-change to keep the sounding key.") (define (generate-key-change c) (define (same-scale-step? a b) (= (car a) (car b))) (let* ((old-alt (delete-duplicates! (append (ly:context-property c 'keyAlterations) major) same-scale-step?)) (old-tonic (ly:context-property c 'tonic (ly:make-pitch 0 0 0))) (old-transp (ly:context-property c 'instrumentTransposition (ly:make-pitch 0 0 0))) (delta (ly:pitch-diff old-transp new-transposition)) (new-alt (ly:transpose-key-alist old-alt delta)) (new-tonic (ly:pitch-transpose old-tonic delta)) (sev (ly:make-stream-event `(key-change-event) `((pitch-alist . ,new-alt) (tonic . ,new-tonic))))) (ly:broadcast (ly:context-event-source c) sev))) #{ \applyContext #generate-key-change \transposition $new-transposition #} ) prep_alto = { \set Staff.shortInstrumentName = "AF" <>^\markup \box "take alto flute" \transpositionUpdateKey g, } play_alto = { <>^\markup \bold "Alto Flute" \once \set Staff.whichBar = "||" } global = { \key c \major s1*12 } flute_part = { \compressFullBarRests c'2 c'' | b'4 g'8 a' b'4 c'' | c'2 a' | g'2. r4 | \prep_alto R1*4 | \play_alto a2 f' | e'4 c'8 d' e'4 f'4 | d'4 b8 c' d'4 e' | c'2. r4 } \score { << \new Staff \with { instrumentName = "Flute" } \flute_part >> } %%%% SNIPPET ENDS Note in particular that in the flute_part variable, I [want to] simply put \prep_alto to trigger the physical switch, and \play_alto to switch the key signature (which your function does perfectly!) *and* the notated transposition (which is currently not happening: the notes should be up a perfect fourth). This is why I think we should brainstorm and implement a really well-designed instrumentSwitch/instrumentDefinition mechanism — we wouldn’t need any of this. We’d simply put something like reedI = { \instrument “flute" [flute music here, no need for transposition] \instrument “alto flute” [alto music here; transposed properly in part, but optionally not in score] \instrument “tenor sax” [tenor sax music here; transposed properly in part, but optionally not in score] } This might tie in to Janek’s instrument-definition work… don’t know, since I haven’t checked it out yet. Of course, I know I can roll this myself using variables — that’s what I’ve been doing to date. But with all the key signature problems, I’d almost given up hope. Now, with your function, I’m optimistic we might solve this once and for all. Thoughts, comments, etc., welcome! Thanks, Kieren. _______________________ Kieren MacMillan, composer www: <http://www.kierenmacmillan.info> email: i...@kierenmacmillan.info _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user