+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(define-public (cue-substitute quote-music)
+ "Must happen after quote-substitute."
+
+ (if (vector? (ly:music-property quote-music 'quoted-events))
+ (let* ((dir (ly:music-property quote-music 'quoted-voice-direction))
+ (main-voice (if (eq? 1 dir) 1 0))
+ (cue-voice (if (eq? 1 dir) 0 1))
+ (main-music (ly:music-property quote-music 'element))
+ (return-value quote-music))
+
+ (if (or (eq? 1 dir) (eq? -1 dir))
+
+ ;; if we have stem dirs, change both quoted and main music
+ ;; to have opposite stems.
+ (begin
+ (set! return-value
+
+ ;; cannot context-spec Quote-music, since context
+ ;; for the quotes is determined in the iterator.
+ (make-sequential-music
+ (list
+ (context-spec-music (make-voice-props-set cue-voice) 'Voice "cue")
+ quote-music
+ (context-spec-music (make-voice-props-revert) 'Voice "cue"))))
+ (set! main-music
+ (make-sequential-music
+ (list
+ (make-voice-props-set main-voice)
+ main-music
+ (make-voice-props-revert))))
+ (set! (ly:music-property quote-music 'element) main-music)))
+
+ return-value)
+ quote-music))
+
+(define-public ((quote-substitute quote-tab) music)
+ (let* ((quoted-name (ly:music-property music 'quoted-music-name))
+ (quoted-vector (if (string? quoted-name)
+ (hash-ref quote-tab quoted-name #f)
+ #f)))
+
+ (if (string? quoted-name)
+ (if (vector? quoted-vector)
+ (set! (ly:music-property music 'quoted-events) quoted-vector)
+ (ly:warn "Cannot find quoted music `~S'" quoted-name)))
+
+ music))
+
+