X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=ly%2Fchord-repetition-init.ly;h=0c986a34ba4b1962c96f812df57bcb41c4931703;hb=0950de32403b199efc8454ca527f1201ee458417;hp=f19e3a10b50d5433168ed4c92bafedf90526599d;hpb=604d785b55a3a1c536fc537e877253f0c4eaea6c;p=lilypond.git diff --git a/ly/chord-repetition-init.ly b/ly/chord-repetition-init.ly index f19e3a10b5..0c986a34ba 100644 --- a/ly/chord-repetition-init.ly +++ b/ly/chord-repetition-init.ly @@ -1,5 +1,5 @@ %%% -*- Mode: Scheme -*- -\version "2.13.9" +\version "2.13.17" %{ The following functions define the chord repetition behavior, and may @@ -16,36 +16,64 @@ ly:parser-set-repetition-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 location duration articulations) - "Copy the previous chord, filter out events which are not notes, set -the chord duration, add articulations." +#(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 in an other music block, which is certainly not - ;; what the user has intended. In that case, raise a warning. + ;; 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)))) + (null? (ly:music-property previous-chord 'length)))) (ly:input-message location - (_ "No memorized chord in music block before chord repetition"))) + (_ "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). - (make-music - 'EventChord - 'origin location - 'elements (append! (filter identity - (map (lambda (event) - (and (eqv? (ly:music-property event 'name) 'NoteEvent) - (make-music - 'NoteEvent - 'pitch (ly:music-property event 'pitch) - 'duration duration))) - (ly:music-property previous-chord 'elements))) - articulations))) + ;; 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)