lilypond-user
[Top][All Lists]
Advanced

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

Re: Get input location within a stencil override function


From: David Kastrup
Subject: Re: Get input location within a stencil override function
Date: Wed, 01 Feb 2017 14:20:58 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux)

Urs Liska <address@hidden> writes:

>>> This is better because obviously it contains the correct location. (14:3
>>> of the input file).
>>> However, I don't know how to get "inside" that <Prob: or if there's
>>> another, more straightforward way to get to the location of the grob.
>> The cause obviously is a stream event.  Try something like
>>
>> (ly:event-warning (event-cause grob) "This is bad!")
>
> Obviously this is what I was looking for.
> Would I have had a reasonable chance to find it myself in the docs?

No.  In C++, the function to use is Grob::warning.  There is no Scheme
equivalent as of now.  Feel free to implement it.  It would be something
like

(define (grob-warning grob format . args)
  (let ((ev (event-cause grob)))
    (if ev (apply ly:event-warning ev format args)
      (apply ly:warning format args))))

>> Note that the string is a format string and can take ~S-like format
>> elements to be followed by corresponding values in the function call.
>> Also notice that ly:event-warning is not robust against a missing event
>> (currently).
>
> That means if (event-cause grob) doesn't evaluate something useful it
> will crash and I should take precautions? But can a grob in a stencil
> that overrides a slur *not* have an event anyway?

Sure.

address@hidden:/usr/local/tmp/lilypond$ git grep 
"\(make_item\|make_spanner\).*SCM_"
lily/ambitus-engraver.cc:  ambitus_ = make_item ("AmbitusLine", SCM_EOL);
lily/ambitus-engraver.cc:  group_ = make_item ("Ambitus", SCM_EOL);
lily/ambitus-engraver.cc:      heads_[d] = make_item ("AmbitusNoteHead", 
SCM_EOL);
lily/ambitus-engraver.cc:      accidentals_[d] = make_item 
("AmbitusAccidental", SCM_EOL);
lily/axis-group-engraver.cc:  return make_spanner ("VerticalAxisGroup", 
SCM_EOL);
lily/bar-engraver.cc:      bar_ = make_item ("BarLine", SCM_EOL);
lily/bar-number-engraver.cc:  text_ = make_item ("BarNumber", SCM_EOL);
lily/break-align-engraver.cc:  align_ = make_item ("BreakAlignment", SCM_EOL);
lily/break-align-engraver.cc:  left_edge_ = random_source->make_item 
("LeftEdge", SCM_EOL);
lily/clef-engraver.cc:      Item *c = make_item ("Clef", SCM_EOL);
lily/clef-engraver.cc:          Item *g = make_item ("ClefModifier", SCM_EOL);
lily/collision-engraver.cc:    col_ = make_item ("NoteCollision", SCM_EOL);
lily/completion-note-heads-engraver.cc:  Spanner *p = make_spanner ("Tie", 
SCM_EOL);
lily/cue-clef-engraver.cc:      Item *g = make_item ("ClefModifier", SCM_EOL);
lily/cue-clef-engraver.cc:      Item *c = make_item ("CueClef", SCM_EOL);
lily/cue-clef-engraver.cc:      clef_ = make_item ("CueEndClef", SCM_EOL);
lily/custos-engraver.cc:  Item *custos = make_item ("Custos", SCM_EOL);
lily/dot-column-engraver.cc:        dotcol_ = make_item ("DotColumn", SCM_EOL);
lily/figured-bass-engraver.cc:                    = make_spanner 
("BassFigureContinuation", SCM_EOL);
lily/figured-bass-engraver.cc:      alignment_ = make_spanner 
("BassFigureAlignment", SCM_EOL);
lily/figured-bass-engraver.cc:              group.group_ = make_spanner 
("BassFigureLine", SCM_EOL);
lily/fingering-column-engraver.cc:        fingering_columns_[d] = make_item 
("FingeringColumn", SCM_EOL);
lily/grace-spacing-engraver.cc:      grace_spacing_ = make_spanner 
("GraceSpacing", SCM_EOL);
lily/grid-line-span-engraver.cc:          spanline_ = make_item ("GridLine", 
SCM_EOL);
lily/grid-point-engraver.cc:        make_item ("GridPoint", SCM_EOL);
lily/instrument-name-engraver.cc:  text_spanner_ = make_spanner 
("InstrumentName", SCM_EOL);
lily/instrument-switch-engraver.cc:          text_ = make_item 
("InstrumentSwitch", SCM_EOL);
lily/kievan-ligature-engraver.cc:  return make_spanner ("KievanLigature", 
SCM_EOL);
lily/ledger-line-engraver.cc:  span_ = make_spanner ("LedgerLineSpanner", 
SCM_EOL);
lily/measure-grouping-engraver.cc:                  grouping_ = make_spanner 
("MeasureGrouping", SCM_EOL);
lily/mensural-ligature-engraver.cc:  return make_spanner ("MensuralLigature", 
SCM_EOL);
lily/ottava-engraver.cc:          span_ = make_spanner ("OttavaBracket", 
SCM_EOL);
lily/repeat-tie-engraver.cc:      semi_tie_column_ = make_item 
("RepeatTieColumn", SCM_EOL);
lily/rest-collision-engraver.cc:      rest_collision_ = make_item 
("RestCollision", SCM_EOL);
lily/script-column-engraver.cc:    script_column_ = make_item ("ScriptColumn", 
SCM_EOL);
lily/script-row-engraver.cc:    script_row_ = make_item ("ScriptRow", SCM_EOL);
lily/separating-line-group-engraver.cc:      current_spacings_.staff_spacing_ = 
make_item ("StaffSpacing", SCM_EOL);
lily/spacing-engraver.cc:  spacing_ = make_spanner ("SpacingSpanner", SCM_EOL);
lily/span-arpeggio-engraver.cc:    span_arpeggio_ = make_item ("Arpeggio", 
SCM_EOL);
lily/span-bar-engraver.cc:      spanbar_ = make_item ("SpanBar", SCM_EOL);
lily/staff-symbol-engraver.cc:      span_ = make_spanner ("StaffSymbol", 
SCM_EOL);
lily/stanza-number-engraver.cc:      text_ = make_item ("StanzaNumber", 
SCM_EOL);
lily/vaticana-ligature-engraver.cc:  return make_spanner ("VaticanaLigature", 
SCM_EOL);
lily/vaticana-ligature-engraver.cc:  Item *dotcol = make_item ("DotColumn", 
SCM_EOL);
lily/vertical-align-engraver.cc:      valign_ = make_spanner (top_level_ ? 
"VerticalAlignment" : "StaffGrouper", SCM_EOL);
lily/volta-engraver.cc:      volta_bracket_ = make_spanner ("VoltaBracket", 
SCM_EOL);
lily/volta-engraver.cc:        volta_spanner_ = make_spanner 
("VoltaBracketSpanner", SCM_EOL);

All those grobs have no event-cause.  Whoever calls make_item,
make_spanner or ly:engraver-make-grob (why no spanner here?) gets to
decide what cause to specify.

Can be another grob, can be an event, can be nothing.

>> But really, really, really don't use define-scheme-function for
>> something not supposed to work on LilyPond input.
>
> OK, I've changed that.
> But is that just unnecessarily complicated/expensive or could it cause
> *real* problems too?

If you use

\testLocation

in your LilyPond file, you'll get some rather inventive error messages.

-- 
David Kastrup



reply via email to

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