-#(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
- '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)
+chordRepeats =
+#(define-music-function (parser location event-types music)
+ ((list? '()) ly:music?)
+ "Walk through @var{music} putting the notes of the previous chord
+into repeat chords, as well as an optional list of @var{event-types}
+such as @code{#'(string-number-event)}."
+ (expand-repeat-chords! (cons 'rhythmic-event event-types) music))
+
+tabChordRepeats =
+#(define-music-function (parser location event-types music)
+ ((list? '()) ly:music?)
+ "Walk through @var{music} putting the notes, fingerings and string
+numbers of the previous chord into repeat chords, as well as an
+optional list of @var{event-types} such as @code{#'(articulation-event)}."
+ #{ \chordRepeats
+ #(append '(string-number-event fingering-event) event-types)
+ #music
+ #})
+
+tabChordRepetition =
+#(define-void-function (parser location) ()
+ (_i "Include the string and fingering information in a chord repetition.
+This function is deprecated; try using @code{\\tabChordRepeats} instead.")
+ (ly:parser-define! parser '$chord-repeat-events
+ '(string-number-event fingering-event)))