Force \compressFullBarRests

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Force \compressFullBarRests

Martín Rincón Botero
Hello again,

my workflow with Lilypond involves using Frescobaldi and its useful point & click. It also involves adding many "empty" measures (explicit measures containing a full bar rest with no "multiplication", so: R1 R1 R1, etc.) so that during composition I can just click on a rest wherever I want and Frescobaldi takes me right to the line of code (I write one full measure rest per line) and I just change the corresponding rests with music. This has the great advantage that I don't have to count anything. I just click where I want the music to be and replace silences with music (much like in Sibelius or Musescore). However, the pending task will be at the end of composing to clean all these repeated full bar rests and write the explicit multiplications (R1*5, etc.), so that \compressFullBarRests works in the parts. This makes me wonder if it's possible to "force" Lilypond to always display full bar rests in a single staff (f. ex. in the parts), or in multiple staves that have several full measure rests simultaneously (percussion parts, for example), without having to explicitly tell it how many measures that is, but instead, to make it calculate that for me while compiling out of several single full measure rests. This would essentially make that last manual task superfluous ;-). 

Best regards,
Martín.

--
Reply | Threaded
Open this post in threaded view
|

Re: Force \compressFullBarRests

Martín Rincón Botero
Ah, I found this old script by Kieren that seems to do the trick :-).

#(define (append-merge x l r)
"Add x to the head of list l, merging skips,
and if r is true also merging full measure rests."
  (if (and (pair? l)
           (ly:music? x)
           (ly:music? (car l))
           (or (and (music-is-of-type? x 'skip-event)
                    (music-is-of-type? (car l) 'skip-event))
               (and r
                    (music-is-of-type? x 'multi-measure-rest)
                    (music-is-of-type? (car l) 'multi-measure-rest)))
           (not (pair? (ly:music-property (car l) 'articulations))))
     (let ((total
            (ly:moment-add
            (ly:music-duration-length (car l))
            (ly:music-duration-length x)
            )))
       (set! (ly:music-property x 'duration)
              (make-duration-of-length total))
       (cons x (cdr l)))
    (cons x l)))

mergeSkips = #(define-music-function
 (parser location rests-also music) ((boolean?) ly:music?)
 "Merge successive skips in sequential music,
  optionally merge full-measure rests as well."
 (music-map
   (lambda (m)
      (if (music-is-of-type? m 'sequential-music)
        (ly:music-set-property! m
           'elements
           (fold-right (lambda (x l)
                         (append-merge x l rests-also))
             '()
             (ly:music-property m 'elements))))
     m)
   music))
   
mergeFullBarRests = #(define-music-function
 (parser location music) (ly:music?)
 #{ \mergeSkips ##t $music #})

Am Di., 8. Sept. 2020 um 20:55 Uhr schrieb Martín Rincón Botero <[hidden email]>:
Hello again,

my workflow with Lilypond involves using Frescobaldi and its useful point & click. It also involves adding many "empty" measures (explicit measures containing a full bar rest with no "multiplication", so: R1 R1 R1, etc.) so that during composition I can just click on a rest wherever I want and Frescobaldi takes me right to the line of code (I write one full measure rest per line) and I just change the corresponding rests with music. This has the great advantage that I don't have to count anything. I just click where I want the music to be and replace silences with music (much like in Sibelius or Musescore). However, the pending task will be at the end of composing to clean all these repeated full bar rests and write the explicit multiplications (R1*5, etc.), so that \compressFullBarRests works in the parts. This makes me wonder if it's possible to "force" Lilypond to always display full bar rests in a single staff (f. ex. in the parts), or in multiple staves that have several full measure rests simultaneously (percussion parts, for example), without having to explicitly tell it how many measures that is, but instead, to make it calculate that for me while compiling out of several single full measure rests. This would essentially make that last manual task superfluous ;-). 

Best regards,
Martín.

--


--
Reply | Threaded
Open this post in threaded view
|

Re: Force \compressFullBarRests

Martín Rincón Botero
actually, this works for me only in the example given here https://lists.gnu.org/archive/html/lilypond-user/2013-12/msg01085.html. Perhaps someone (maybe Kieren) might explain to me how this script is properly used?

Am Di., 8. Sept. 2020 um 21:29 Uhr schrieb Martín Rincón Botero <[hidden email]>:
Ah, I found this old script by Kieren that seems to do the trick :-).

#(define (append-merge x l r)
"Add x to the head of list l, merging skips,
and if r is true also merging full measure rests."
  (if (and (pair? l)
           (ly:music? x)
           (ly:music? (car l))
           (or (and (music-is-of-type? x 'skip-event)
                    (music-is-of-type? (car l) 'skip-event))
               (and r
                    (music-is-of-type? x 'multi-measure-rest)
                    (music-is-of-type? (car l) 'multi-measure-rest)))
           (not (pair? (ly:music-property (car l) 'articulations))))
     (let ((total
            (ly:moment-add
            (ly:music-duration-length (car l))
            (ly:music-duration-length x)
            )))
       (set! (ly:music-property x 'duration)
              (make-duration-of-length total))
       (cons x (cdr l)))
    (cons x l)))

mergeSkips = #(define-music-function
 (parser location rests-also music) ((boolean?) ly:music?)
 "Merge successive skips in sequential music,
  optionally merge full-measure rests as well."
 (music-map
   (lambda (m)
      (if (music-is-of-type? m 'sequential-music)
        (ly:music-set-property! m
           'elements
           (fold-right (lambda (x l)
                         (append-merge x l rests-also))
             '()
             (ly:music-property m 'elements))))
     m)
   music))
   
mergeFullBarRests = #(define-music-function
 (parser location music) (ly:music?)
 #{ \mergeSkips ##t $music #})

Am Di., 8. Sept. 2020 um 20:55 Uhr schrieb Martín Rincón Botero <[hidden email]>:
Hello again,

my workflow with Lilypond involves using Frescobaldi and its useful point & click. It also involves adding many "empty" measures (explicit measures containing a full bar rest with no "multiplication", so: R1 R1 R1, etc.) so that during composition I can just click on a rest wherever I want and Frescobaldi takes me right to the line of code (I write one full measure rest per line) and I just change the corresponding rests with music. This has the great advantage that I don't have to count anything. I just click where I want the music to be and replace silences with music (much like in Sibelius or Musescore). However, the pending task will be at the end of composing to clean all these repeated full bar rests and write the explicit multiplications (R1*5, etc.), so that \compressFullBarRests works in the parts. This makes me wonder if it's possible to "force" Lilypond to always display full bar rests in a single staff (f. ex. in the parts), or in multiple staves that have several full measure rests simultaneously (percussion parts, for example), without having to explicitly tell it how many measures that is, but instead, to make it calculate that for me while compiling out of several single full measure rests. This would essentially make that last manual task superfluous ;-). 

Best regards,
Martín.

--


--


--
Reply | Threaded
Open this post in threaded view
|

Re: Force \compressFullBarRests

Martín Rincón Botero
sorry, it seems Keith was the author of the above script.

Am Di., 8. Sept. 2020 um 21:41 Uhr schrieb Martín Rincón Botero <[hidden email]>:
actually, this works for me only in the example given here https://lists.gnu.org/archive/html/lilypond-user/2013-12/msg01085.html. Perhaps someone (maybe Kieren) might explain to me how this script is properly used?

Am Di., 8. Sept. 2020 um 21:29 Uhr schrieb Martín Rincón Botero <[hidden email]>:
Ah, I found this old script by Kieren that seems to do the trick :-).

#(define (append-merge x l r)
"Add x to the head of list l, merging skips,
and if r is true also merging full measure rests."
  (if (and (pair? l)
           (ly:music? x)
           (ly:music? (car l))
           (or (and (music-is-of-type? x 'skip-event)
                    (music-is-of-type? (car l) 'skip-event))
               (and r
                    (music-is-of-type? x 'multi-measure-rest)
                    (music-is-of-type? (car l) 'multi-measure-rest)))
           (not (pair? (ly:music-property (car l) 'articulations))))
     (let ((total
            (ly:moment-add
            (ly:music-duration-length (car l))
            (ly:music-duration-length x)
            )))
       (set! (ly:music-property x 'duration)
              (make-duration-of-length total))
       (cons x (cdr l)))
    (cons x l)))

mergeSkips = #(define-music-function
 (parser location rests-also music) ((boolean?) ly:music?)
 "Merge successive skips in sequential music,
  optionally merge full-measure rests as well."
 (music-map
   (lambda (m)
      (if (music-is-of-type? m 'sequential-music)
        (ly:music-set-property! m
           'elements
           (fold-right (lambda (x l)
                         (append-merge x l rests-also))
             '()
             (ly:music-property m 'elements))))
     m)
   music))
   
mergeFullBarRests = #(define-music-function
 (parser location music) (ly:music?)
 #{ \mergeSkips ##t $music #})

Am Di., 8. Sept. 2020 um 20:55 Uhr schrieb Martín Rincón Botero <[hidden email]>:
Hello again,

my workflow with Lilypond involves using Frescobaldi and its useful point & click. It also involves adding many "empty" measures (explicit measures containing a full bar rest with no "multiplication", so: R1 R1 R1, etc.) so that during composition I can just click on a rest wherever I want and Frescobaldi takes me right to the line of code (I write one full measure rest per line) and I just change the corresponding rests with music. This has the great advantage that I don't have to count anything. I just click where I want the music to be and replace silences with music (much like in Sibelius or Musescore). However, the pending task will be at the end of composing to clean all these repeated full bar rests and write the explicit multiplications (R1*5, etc.), so that \compressFullBarRests works in the parts. This makes me wonder if it's possible to "force" Lilypond to always display full bar rests in a single staff (f. ex. in the parts), or in multiple staves that have several full measure rests simultaneously (percussion parts, for example), without having to explicitly tell it how many measures that is, but instead, to make it calculate that for me while compiling out of several single full measure rests. This would essentially make that last manual task superfluous ;-). 

Best regards,
Martín.

--


--


--


--