lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: My own wishlist...


From: darius
Subject: Re: My own wishlist...
Date: Fri, 6 Feb 2004 22:26:32 +0100
User-agent: Internet Messaging Program (IMP) 3.2

May I respectfully agree with the premise, but disagree with the
conclusion. Everything can be done in Scheme, I guess that this
is clear at this stage. After all, significant parts of Lilypond are
entirely written in this language.

However, Scheme is a sometimes arcane language.
Did not LISP stand for Lots of Insane Stupid Parenthesis ? If Lisp
(or Scheme, or even ML) is your computing lingua franca, I guess 
you feel perfectly ok with Scheme. My understanding of Scheme is at
best cultural, and while I can decypher existing Scheme code in Lilypond
without too much trouble, it is also very clear to me that writing this
kind of stuff requires far more proficiency than what I can show, and
even more importantly, a deep understanding of Lily's internals, 

My question - I would not dare call it a request... - was related to 
something I see as very unsophisticated. My belief, and a number of 
messages on this mailing list seem to agree with me on this matter - 
is that a simplistic function-like facility would prove immensely
useful, even for users who are not committed up to a point where Scheme
becomes a viable option. In other words, IMHO, this function/macro/routine/
template stuff ought to be part of Lilypond, just as << \\ >> is a
shorthand for something more arcane. It would be a way of making Lilypond
even more usable to describe music in a structure and abstract way, which
is, in my view, its more important asset.

I do understand however that implementing this might not be a simple 
task at all. This is why I am trying to see what might be a reasonable 
set of simplifying assumptions that would make a basic version of such 
a feature reasonably easy to provide, leaving more sophisticated stuff
to Scheme. 

As an interesting meta-question, I always wondered in how far Lilypond
users were software people, or at least, technically oriented people.
Everytime I show my score to a musician, he/she
finds them beautiful - and, as a matter of principle, I never use anything
but Lilypond's default - and asks for more information about the software
I use. Then, after showing Lilypond and its input format,
depending on whether he/she is computer literate, I am told
that I spend too much time with computers (which is obviously
true) or that I come from a different planet altogether (which is
perhaps true as well :-) )

Cheers,

Darius.

Quoting Nicolas Sceaux <address@hidden>:

> Tue, 3 Feb 2004 15:58:07 +0100, Han-Wen a dit : 
> 
>  > address@hidden writes:
>  >> A cheap functionality, which would prove very useful in
>  >> practice, would be the ability to declare Lilypond stuff
>  >> in scheme, as in:
>  >> 
>  >> (map myfunc {\notes { a b c d | a b c d}})
>  >> 
>  >> which would be equivalent to:
>  >> 
>  >> tempvar0981 = \notes { a b c d | a b c d}
>  >> 
>  >> (map myfunc tempvar0981)
>  >> 
>  >> Since we already have the ability to declare 
>  >> Scheme stuff within LilyPond, allowing for the
>  >> reverse might be enough for most applications....
>  >> 
>  >> Is this just nonsense, or is this reasonable to implement
>  >> (I don't know whether one can plug language extensions in
>  >> GUILE...) ?
> 
>  > I don't know how it can be done. Perhaps our Scheme macro expert can
>  > chip in some ideas. Nicolas?
> 
> sorry for the delay, I was not at home.
> 
> What is easy, is to write a set of scheme operators that would reflect
> common LilyPond commands, for instance: 
> 
>   (context-property-override Voice Stem thickness 2.0)
>   ==> \property Voice.Stem \override #'thickness = #2.0
> 
> or: (skip "1.*4/3") ==> s1.*4/3
> etc.
> 
> Actually, I have started to build such a library on a per need basis
> for my scores. I am considering contributing a complete set of these
> scheme operators, aiming at programatically building any music
> expressions.
> 
> As for reading a lilypond expression in scheme, it is not trivial. I
> once tried to hack my lilypond-program so that the lilypond-language
> compiler could be called within scheme via a call to a C function in a
> lily shared library, without real success. I didn't know enough of
> lilypond internals. 
> It is feasible, however, but when I discovered
> what the \apply command could do, I definitely got rid of the idea of
> using lilypond expression in scheme. \apply is enough -- if you don't
> have to call a function with several music arguments. Some kind of
> multi-arguments apply would be cool.
> 
>   \apply-3 #bass-part
>   { ...bass notes... }
>   { ...figures... }
> 
>  > In the meantime, you can achieve the same thing  with apply, albeit a
>  > little more verbose
> 
>  > \apply #(lambda (m)
>  >   ..more stuff.. )
>  >   \notes { a b c d | a b c d}
> 
> What could be also usefull is some specialized mapping functions:
> 
>   \apply #(lambda (music)
>             (map-if mus:note? 
>                     (lambda (note) (..do something on a note..))
>                     music))
>   \notes { a b c d | a b c d}
> 
> where `map-if' would look deeply into `music', and for each element
> satisfying the predicate (eg. `mus:note?') would apply the function
> on it.
> Oh, this is not very beautiful for a LilyPond score... macrology may
> help:
> 
>   \apply #(with-note-mapping (note)
>             (..do something on a note..))
>   \notes { a b c d | a b c d}
> 
> etc.
> 
> nicolas
> 
> 
> 
> 




-------------------------------------------------
This mail sent through IMP: http://horde.org/imp/






reply via email to

[Prev in Thread] Current Thread [Next in Thread]