Just found the markup macro in the docs. Changing
(ly:grob-set-property! grob 'text new-name)
to
(ly:grob-set-property! grob 'text (markup #:italic #:smaller new-name))
does what I'm looking for. Is this the "right" way to handle issues like
this? By that question, I think I really mean "Is there any downside to
using Scheme to solve problems like this?"
Cheers,
Mike
On Thu, Dec 9, 2010 at 1:02 PM, Michael Ellis <[email protected]>wrote:
> Putting the \midi block inside a separate \score block solved the audio
> doubling issue. I could still use some suggestions regarding how to control
> the font properties of the NoteNames output. With lyrics, I can do things
> like
>
> \context {
> \Lyrics
> %% Pack stanzas a little closer vertically
> minimumVerticalExtent = #'(0 . 0)
> %% decrease lyric font size by 1 increment
> \override LyricText #'font-size = #-1
> }
>
> Thanks,
> Mike
>
>
>
> On Tue, Dec 7, 2010 at 3:40 PM, Michael Ellis
> <[email protected]>wrote:
>
>> Thanks Valentin, that's quite helpful. I ended up taking an approach you
>> suggested in a previous
>> post<http://lists.gnu.org/archive/html/lilypond-user/2010-10/msg00687.html>to
>> this list. Using the NoteNames context with alternative note names seems
>> to be doing pretty much everything I want.
>>
>> Here's a revised version of my script that works as desired:
>>
>> % Moveable Do as lyrics example
>>
>> % define solfege pitchnames
>> pitchnames = #`(
>> (do . ,(ly:make-pitch -1 0 NATURAL))
>> (re . ,(ly:make-pitch -1 1 NATURAL))
>> (mi . ,(ly:make-pitch -1 2 NATURAL))
>> )
>>
>> #(ly:parser-set-note-names parser pitchnames)
>>
>> % Apparently, LilyPond reverts to dutch names when
>> % using the NoteNames context. The following
>> % workaround was posted by V. Villenave at
>> % http://lists.gnu.org/archive/html/lilypond-user/2010-10/msg00687.html
>>
>> newnames =
>> #`(("c" . "do")
>> ("d" . "re")
>> ("e" . "mi"))
>>
>> myNoteNames =
>> #(lambda (grob)
>> (let* ((default-name (ly:grob-property grob 'text))
>> (new-name (assoc-get default-name newnames)))
>> (ly:grob-set-property! grob 'text new-name)
>> (ly:text-interface::print grob)))
>>
>> % compose as though in C major
>> mynotes = \relative do' {\key do \major do2 re4( mi4) }
>>
>> % transpose to desired key
>> melody = \transpose do mi { \mynotes }
>>
>> % Produce score with solfege names as lyrics
>> \score {
>> <<
>> \new Voice = "myVoice" {
>> \melody
>> }
>> \context NoteNames \with {
>> \override NoteName #'stencil = #myNoteNames
>> } { \mynotes }
>>
>> >>
>> }
>> \version "2.12.3"
>>
>>
>> This approach seems to work ok with a larger example where I defined all
>> the chromatic solfege names. The only issue I seem to be encountering in
>> the larger example is an unintended doubling of voices on the midi output.
>> Does the NoteNames engraver produce a midi stream by default? If so, how
>> can I turn it off?
>>
>> My midi section looks like
>>
>> \midi {
>> %% voodoo that lets us specify instrument in melody
>> \context {
>> \Staff
>> \remove "Staff_performer"
>> }
>> \context {
>> \Voice
>> \consists "Staff_performer"
>> }
>> }
>>
>>
>> Cheers,
>> Mike
>>
>>
>>
>> On Tue, Dec 7, 2010 at 11:41 AM, Valentin Villenave <
>> [email protected]> wrote:
>>
>>> On Tue, Dec 7, 2010 at 4:35 PM, Michael Ellis <[email protected]>
>>> wrote:
>>> > It seems to me that the best solution would be to use LilyPond's
>>> built-in
>>> > Scheme interpreter to extract the pitch names while the file is being
>>> > processed. I've made some attempts to use map with ly:note-pitchname,
>>> but so
>>> > far no success. This is probably because I know squat about Scheme,
>>> > especially as used in LilyPond scripts.
>>>
>>> Here's an attempt of a patch I recently made, that might give you some
>>> pointers:
>>>
>>> diff --git a/scm/chord-name.scm b/scm/chord-name.scm
>>> index 7f5909b..2853102 100644
>>> --- a/scm/chord-name.scm
>>> +++ b/scm/chord-name.scm
>>> @@ -59,15 +59,38 @@
>>> (make-hspace-markup (if (= alteration SHARP) 0.2 0.1))
>>> ))))
>>>
>>> +(define (note-names-vector alist)
>>> + "Extract note names from a pitchnames ALIST."
>>> + (let ((name-ls '()))
>>> + (map (lambda (x)
>>> + (let* ((pitch (cdr x))
>>> + (alteration (ly:pitch-alteration pitch)))
>>> + (if (eq? alteration 0)
>>> + (set! name-ls (cons
>>> + (string-capitalize (symbol->string (car
>>> x)))
>>> + name-ls)))))
>>> + alist)
>>> + (list->vector (reverse name-ls))))
>>> +
>>> -(define-public (note-name->markup pitch lowercase?)
>>> +(define-public (note-name->markup pitch lowercase? . input-language)
>>> "Return pitch markup for PITCH."
>>> - (make-line-markup
>>> - (list
>>> - (make-simple-markup
>>> - (conditional-string-downcase
>>> - (vector-ref #("C" "D" "E" "F" "G" "A" "B") (ly:pitch-notename
>>> pitch))
>>> - lowercase?))
>>> - (accidental->markup (ly:pitch-alteration pitch)))))
>>> + (let* ((get-pitchnames (lambda (x)
>>> + (ly:assoc-get (string->symbol x)
>>> + language-pitch-names)))
>>> + (alist (get-pitchnames default-language)))
>>> + (if input-language
>>> + (cond ((string? input-language)
>>> + (set! alist (get-pitchnames input-language)))
>>> + ((boolean? input-language))
>>> + (set! alist pitchnames)))
>>> + (make-line-markup
>>> + (list
>>> + (make-simple-markup
>>> + (conditional-string-downcase
>>> + (vector-ref (note-names-vector alist)
>>> + (ly:pitch-notename pitch))
>>> + lowercase?))
>>> + (accidental->markup (ly:pitch-alteration pitch))))))
>>>
>>> Sorry for not being more helpful, if there are things you don't
>>> understand I'll try and help you further.
>>>
>>> Cheers,
>>> Valentin.
>>>
>>
>>
>
_______________________________________________
lilypond-user mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-user