X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=ly%2Fchord-repetition-init.ly;h=0c986a34ba4b1962c96f812df57bcb41c4931703;hb=18387fe2615f814b1f08627a8a06a97449fe1a0f;hp=3ff4578b60da24402d4d2173809a831b87f3c358;hpb=e26f468ce5bdb4738bb34d6ad200cd888c6011ac;p=lilypond.git diff --git a/ly/chord-repetition-init.ly b/ly/chord-repetition-init.ly index 3ff4578b60..0c986a34ba 100644 --- a/ly/chord-repetition-init.ly +++ b/ly/chord-repetition-init.ly @@ -1,6 +1,8 @@ -\version "2.13.8" +%%% -*- Mode: Scheme -*- +\version "2.13.17" %{ -Two functions define the chord repetition behavior, and may + +The following functions define the chord repetition behavior, and may be invoked by the user to customize it. ly:parser-set-repetition-symbol @@ -8,27 +10,70 @@ ly:parser-set-repetition-symbol `q' is the default value set in this file. ly:parser-set-repetition-function + set the function that is invoked when a chord repetition symbol - is encountered by the parser: a three argument function - (previous-chord, duration, list of articulations) which is supposed - to return a new chord. + is encountered by the parser: a four argument function + (previous-chord, location, duration, list of articulations) which is + supposed to return a new chord. `default-repeat-chord' is the default function set in this file. + `tab-repeat-chord' may be used in tablatures to preserve the string information. %} -#(define-public (default-repeat-chord previous-chord duration articulations) - "Copy the previous chord, filter out events which are not notes, set the -chord duration, add articulations." - (let ((new-chord (ly:music-deep-copy previous-chord))) - (set! (ly:music-property new-chord 'elements) - (append! articulations - (filter (lambda (event) - (eqv? (ly:music-property event 'name) 'NoteEvent)) - (ly:music-property new-chord 'elements)))) - (for-each (lambda (event) - (if (ly:duration? (ly:music-property event 'duration)) - (set! (ly:music-property event 'duration) duration))) - (ly:music-property new-chord 'elements)) - new-chord)) +#(define-public ((make-repeat-chord-function chord-element-types note-articulation-types) + previous-chord location duration articulations) + "Make a chord repetition function. +The returned functions copies the notes from @var{previous-chord} into a new chord. +Chord elements, which type is found in @var{chord-element-types}, are copied into +the new chord. Note articulations, which type is found in @var{note-articulation-types}, +are also copied. All other events are not copied into the new chord." + (define (filter-events events event-types) + (filter (lambda (event) + (and (memq (ly:music-property event 'name) event-types) event)) + events)) + ;; If previous-chord has an length property, then it means that it + ;; has been processed by a music iterator. In other words, the chord + ;; has been memorized from an other music block, which is certainly not + ;; what the user has intended, as anywy the result will be buggy. + ;; In that case, raise a warning. + (if (not (and (ly:music? previous-chord) + (null? (ly:music-property previous-chord 'length)))) + (ly:input-message location + (_ "No memorized chord in music block before chord repetition"))) + ;; Instead of copying the previous chord, then removing the + ;; undesired elements (like articulations), a new empty chord is built. + ;; Then, the pitch found in the previous chord are added to the new + ;; chord, without any "decoration" (e.g. cautionary accidentals, + ;; fingerings, text scripts, articulations). Only the events of types + ;; given in `chord-elements-types' and `note-articulation-types' are + ;; copied from the original chord elements and note articulations, + ;; respectively. + (let ((elements (ly:music-property (ly:music-deep-copy previous-chord) 'elements))) + (make-music + 'EventChord + 'origin location + 'elements (append! + (map (lambda (note) + (let ((new-note (make-music 'NoteEvent + 'origin location + 'pitch (ly:music-property note 'pitch) + 'duration duration)) + (articulations + (filter-events (ly:music-property note 'articulations) + note-articulation-types))) + (if (not (null? articulations)) + (set! (ly:music-property new-note 'articulations) + articulations)) + new-note)) + (filter-events elements '(NoteEvent))) + (filter-events elements chord-element-types) + articulations)))) + +#(define-public default-repeat-chord + (make-repeat-chord-function '() '())) + +#(define-public tab-repeat-chord + (make-repeat-chord-function '(StringNumberEvent) '(StringNumberEvent))) +% default settings #(ly:parser-set-repetition-symbol parser 'q) #(ly:parser-set-repetition-function parser default-repeat-chord)