Hi Оксана, you try to output music from a recursively defined scheme-function. As Urs already said use a music-function for music. Also some mistakes:
2016-09-04 18:52 GMT+02:00 Оксана Крымина <[email protected]>: > \version "2.18.2" > musSpisok = #(define-scheme-function (parser location llen)(list?) > (if (not (null? llen)) > #{ > \repeat unfold $(car llen) {c2} \bar "" ( ^^^^^^^^^^^^^^^^^^^^ The last typed character, "(", is interpreted by LilyPond, usually as Slur-start. > \musSpisok #'(cdr llen)) ) ^^^^^^^^^ Don't quote (cdr llen), if you want it evaluated. > #}) But even corrected this would produce not what you want. 2016-09-04 20:26 GMT+02:00 Urs Liska <[email protected]>: > > > Am 4. September 2016 19:30:02 MESZ, schrieb "Оксана Крымина" > <[email protected]>: >>Great! It works! It works! >>Thank You! >> > > The first thing is you had to use define-music-function because that returns > *music*. > > Then you can return a *list* of music expressions with something like > > @(map > (lambda (len) > #{ \repeat unfold #len ... #}) > llen) > > (completely untested, on the phone) > This iterates over your input list and produces the music using regular > syntax. > > HTH > Urs Urs suggestion would lead to the following, which I'd recommend as well: foo = #(define-music-function (parser location lst)(number-list?) #{ $@(map (lambda (i) #{ \repeat unfold $i { c2 } \bar "||" #}) lst) \bar "|." #}) \foo #'(5 7 10 8) >>2016-09-04 20:15 GMT+03:00, Simon Albrecht <[email protected]>: >>> Hi Oxana, >>> >>> I _guess_ the reason it doesn’t work is because the parser doesn’t >>> accept a Scheme expression instead of the number after \repeat >>unfold. Nope. See above >>> The solution is creating music via Scheme. As a first step, you can >>> always use something like >>> >>> %%%%%%% >>> \version "2.19.47" >>> \displayMusic { \repeat unfold 2 { c'1 } } >>> %%%%%%% >>> >>> to see what the music looks like on the Scheme level: >>> >>> ;;;;;;;;;;;;;;;;;;;;; >>> (make-music >>> 'SequentialMusic >>> 'elements >>> (list (make-music >>> 'UnfoldedRepeatedMusic >>> 'elements >>> '() >>> 'repeat-count >>> 2 >>> 'element >>> (make-music >>> 'SequentialMusic >>> 'elements >>> (list (make-music >>> 'NoteEvent >>> 'duration >>> (ly:make-duration 0) >>> 'pitch >>> (ly:make-pitch 0 0))))))) >>> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; >>> >>> Now I built a music function using that information: >>> >>> %%%%%%%%%%%%%%% >>> \version "2.18.2" >>> >>> createRepeats = >>> #(define-music-function (parser location nums mus end) (list? >>ly:music? >>> ly:music?) >>> (let ((repeater (lambda (n) (make-music >>> 'SequentialMusic >>> 'elements >>> (list (make-music >>> 'UnfoldedRepeatedMusic >>> 'elements >>> '() >>> 'repeat-count >>> n >>> 'element >>> mus) >>> end))))) >>> (make-sequential-music (map repeater nums)))) >>> \createRepeats #'(2 3 7) { c'1 } { \bar "||" } >>> %%%%%%%%%%%%%%%% >>> >>> If you have further questions, feel free to ask back. >>> >>> Best, Simon >>> >>> PS. In recent development versions, one may use nicer syntax: >>> >>> %%%%%%%%%%%%%%%% >>> \version "2.19.47" >>> >>> createRepeats = >>> #(define-music-function (nums mus end) (list? ly:music? ly:music?) >>> (let ((repeater (lambda (n) (make-music >>> 'SequentialMusic >>> 'elements >>> (list (make-music >>> 'UnfoldedRepeatedMusic >>> 'elements >>> '() >>> 'repeat-count >>> n >>> 'element >>> mus) >>> end))))) >>> (make-sequential-music (map repeater nums)))) >>> \createRepeats 2,3,7 { c'1 } { \bar "||" } >>> %%%%%%%%%%%%%%%% Although working nicely, I like the sollution above best, If you really, really want a recursion, try: musSpisok = #(define-music-function (parser location llen rl)(number-list? list?) (if (null? llen) #{ $@(reverse rl) \bar "|." #} #{ \musSpisok #(cdr llen) #(cons #{ \repeat unfold #(car llen) { c2 } \bar "||" #} rl) #})) \musSpisok #'(5 7 10 8) #'() Cheers, Harm _______________________________________________ lilypond-user mailing list [email protected] https://lists.gnu.org/mailman/listinfo/lilypond-user
