@node Formatting cue notes
@unnumberedsubsubsec Formatting cue notes
-@cindex cues
@cindex cue notes
-@cindex cue notes, formatting
@cindex fragments
-@cindex quoting other voices
-@cindex cues, formatting
+@cindex cue notes, formatting
+@cindex formatting, cue notes
+@cindex voices, quoting
+
@funindex \cueDuring
@funindex cueDuring
+@funindex \cueClef
+@funindex cueClef
@funindex \cueDuringWithClef
@funindex cueDuringWithClef
@funindex \quoteDuring
@funindex quoteDuring
-The previous section explains how to create quotations. The
-@code{\cueDuring} command is a more specialized form of
-@code{\quoteDuring}, being particularly useful for inserting cue
-notes into a part. The syntax is as follows:
+@cindex notes, smaller
+@cindex smaller notes
+@cindex CueVoice
+
+The simplest way to format cue notes is to explicitly create a
+@code{CueVoice} context within the part.
+
+@lilypond[verbatim,relative=1]
+R1
+<<
+ { e2\rest r4. e8 }
+ \new CueVoice {
+ \stemUp d'8^"flute" c d e fis2
+ }
+>>
+d,4 r a r
+@end lilypond
+
+The @code{\cueClef} command can also be used with an explict
+@code{CueVoice} context if a change of clef is required and will print
+an appropriately sized clef for the cue notes. The @code{\cueClefUnset}
+command can then be used to switch back to the original clef, again with
+an appropriately sized clef.
+
+@lilypond[verbatim,noragged-right,relative=1]
+\clef "bass"
+R1
+<<
+ { e2\rest r4. \cueClefUnset e,8 }
+ \new CueVoice {
+ \cueClef "treble" \stemUp d''8^"flute" c d e fis2
+ }
+>>
+d,,4 r a r
+@end lilypond
+
+The @code{\cueClef} and @code{\cueClefUnset} command can also be used
+without a @code{CueVoice} if required.
+
+@lilypond[verbatim,noragged-right,relative=1]
+\clef "bass"
+R1
+\cueClef "treble"
+d'8^"flute" c d e fis2
+\cueClefUnset
+d,,4 r a r
+@end lilypond
+
+For more complex cue note placement, e.g including transposition, or
+inserting cue notes from multiple music sources the @code{\cueDuring} or
+@code{\cueDuringWithClef} commands can be used. These are more
+specialized form of @code{\quoteDuring}, see @ref{Quoting other voices}
+in the previous section.
+
+The syntax is:
@example
-\cueDuring #@var{partname} #@var{voice} @var{music}
+\cueDuring #@var{quotename} #@var{direction} #@var{music}
@end example
-This command copies only the notes and rests from the
-corresponding measures from @code{@var{partname}} into a
-@code{CueVoice} context. The @code{CueVoice} is created
-implicitly, and occurs simultaneously with @code{@var{music}},
-which creates a polyphonic situation. The @code{@var{voice}}
-argument determines whether the cue notes should be notated as a
-first or second voice; @code{UP} corresponds to the first voice,
-and @code{DOWN} corresponds to the second.
+and
+
+@example
+\cueDuringWithClef #@var{quotename} #@var{direction} #@var{clef} #@var{music}
+@end example
+
+The music from the corresponding measures of the @code{@var{quote name}}
+is added as @code{CueVoice} context and occurs simultaneously with the
+@code{@var{music}}, which creates a polyphonic situation. The
+@code{@var{direction}} takes the argument @code{UP} or @code{DOWN}, and
+corresponds to first and second voices respectively determining how
+the cue notes are printed in relation to the other voice.
@lilypond[verbatim,quote]
-oboe = \relative c'' {
- r2 r8 d16(\f f e g f a)
- g8 g16 g g2.
+fluteNotes = \relative c'' {
+ r2. c4 | d8 c d e fis2 | g2 d |
}
-\addQuote "oboe" { \oboe }
-\new Voice \relative c'' {
- \cueDuring #"oboe" #UP { R1 }
+oboeNotes = \relative c'' {
+ R1
+ s1*0^\markup { \tiny "flute" }
+ \cueDuring #"flute" #UP { R1 }
g2 c,
}
+
+\addQuote "flute" { \fluteNotes }
+
+\new Staff {
+ \oboeNotes
+}
@end lilypond
@noindent
fluteNotes = \relative c'' {
r2. c4 d8 c d e fis2 g2 d2
}
+
bassoonNotes = \relative c {
\clef bass
R1
\clef bass
g4. b8 d2
}
+
\addQuote "flute" { \fluteNotes }
+
\new Staff {
\bassoonNotes
}
fluteNotes = \relative c'' {
r2. c4 d8 c d e fis2 g2 d2
}
+
bassoonNotes = \relative c {
\clef bass
R1
\cueDuringWithClef #"flute" #UP #"treble" { R1 }
g4. b8 d2
}
+
\addQuote "flute" { \fluteNotes }
+
\new Staff {
\bassoonNotes
}
c8 c c e g2
c4 g g2
}
+
bassClarinetNotes = \relative c' {
\key d \major
\transposition bes,
>>
@end lilypond
-@cindex notes, smaller
-@cindex smaller notes
-
-A @code{CueVoice} context may be created explicitly if notes of a
-smaller size are required, for example to set an alternative
-sequence of notes more suitable for a higher or lower voice.
-
-@lilypond[verbatim,relative=2]
-\time 12/8
-\key ees \major
-g4 ees8 f4 g8
-\stemDown
-<<
- { d4. bes4 c8 }
- \new CueVoice
- { g'4. f4 ees8 }
->>
-\stemUp
-d2. d2.
-@end lilypond
-
-@cindex removing cues
@cindex removing cue notes
@cindex cue notes, removing
@funindex \killCues
@funindex killCues
+@funindex \addInstrumentDefinition
+@funindex addInstrumentDefinition
The @code{\killCues} command removes cue notes from a music
expression, so the same music expression can be used to produce
fluteNotes = \relative c'' {
r2. c4 d8 c d e fis2 g2 d2
}
+
bassoonNotes = \relative c {
\clef bass
R1
\tag #'part \clef bass
g4. b8 d2
}
+
\addQuote "flute" { \fluteNotes }
\new Staff {
\bassoonNotes
}
+
\new StaffGroup <<
\new Staff {
\fluteNotes
Alternatively, Clef changes and instrument labels can be
collected into an instrument definition for repeated use, using
-@code{\addInstrumentDefinition} described in
-@ref{Instrument names}.
+@code{\addInstrumentDefinition} described in @ref{Instrument names}.
@seealso
Notation Reference:
+@ref{Quoting other voices},
@ref{Instrument transpositions},
@ref{Instrument names},
@ref{Musical cues},
#include "breathing-sign.hh"
-#include "staff-symbol-referencer.hh"
-#include "directional-element-interface.hh"
-#include "output-def.hh"
-#include "lookup.hh"
#include "dimensions.hh"
#include "direction.hh"
-#include "text-interface.hh"
+#include "directional-element-interface.hh"
#include "font-interface.hh"
#include "grob.hh"
-
-/*
- TODO: thickness should be a grob property (unit: linethickness)
- rather than hardwired to (staff_space / 6).
-*/
+#include "lookup.hh"
+#include "output-def.hh"
+#include "staff-symbol.hh"
+#include "staff-symbol-referencer.hh"
+#include "text-interface.hh"
/*
UGH : this is full of C&P code. Consolidate! --hwn
set_grob_direction (me, d);
}
- Real inter = Staff_symbol_referencer::staff_space (me) / 2;
- int sz = Staff_symbol_referencer::line_count (me) - 1;
- return scm_from_double (inter * sz * d);
+ Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
+ if (staff)
+ {
+ Interval iv = Staff_symbol::line_span (staff);
+ Real inter = Staff_symbol::staff_space (me) / 2;
+ return scm_from_double (inter * iv[d]);
+ }
+
+ return scm_from_double (0.0);
}
ADD_INTERFACE (Breathing_sign,
"A breathing sign.",
-
+
/* properties */
"direction "
);
#include "staff-symbol-referencer.hh"
#include "stream-event.hh"
#include "tie.hh"
+#include "tie-column.hh"
#include "warn.hh"
#include "translator.icc"
-/*
- TODO: make matching rest engraver.
-*/
-
/*
How does this work?
class Completion_heads_engraver : public Engraver
{
- vector<Item*> notes_;
- vector<Item*> prev_notes_;
+ vector<Item *> notes_;
+ vector<Item *> prev_notes_;
// Must remember notes for explicit ties.
- vector<Item*> tie_note_candidates_;
- vector<Stream_event*> tie_note_candidate_events_;
- vector<Grob*> ties_;
- vector<Stream_event*> note_events_;
+ vector<Item *> tie_note_candidates_;
+ vector<Stream_event *> tie_note_candidate_events_;
+ vector<Grob *> ties_;
+ vector<Stream_event *> note_events_;
+ Spanner *tie_column_;
Moment note_end_mom_;
bool is_first_;
Rational left_to_do_;
Rational factor_;
Moment next_barline_moment ();
- Item *make_note_head (Stream_event*);
+ Item *make_note_head (Stream_event *);
public:
TRANSLATOR_DECLARATIONS (Completion_heads_engraver);
Completion_heads_engraver::listen_note (Stream_event *ev)
{
note_events_.push_back (ev);
-
+
is_first_ = true;
Moment now = now_mom ();
Moment musiclen = get_event_length (ev, now);
}
/*
- The duration _until_ the next barline.
+ The duration _until_ the next bar line.
*/
Moment
Completion_heads_engraver::next_barline_moment ()
return (*l - *e);
}
-Item*
+Item *
Completion_heads_engraver::make_note_head (Stream_event *ev)
{
Item *note = make_item ("NoteHead", ev->self_scm ());
{
if (!is_first_ && !left_to_do_)
return;
-
+
is_first_ = false;
Moment now = now_mom ();
event->unprotect ();
notes_.push_back (note);
}
-
+
if (prev_notes_.size () == notes_.size ())
{
for (vsize i = 0; i < notes_.size (); i++)
make_tie (prev_notes_[i], notes_[i]);
}
+ if (ties_.size () && !tie_column_)
+ tie_column_ = make_spanner ("TieColumn", ties_[0]->self_scm ());
+
+ if (tie_column_)
+ for (vsize i = ties_.size (); i--;)
+ Tie_column::add_tie (tie_column_, ties_[i]);
+
left_to_do_ -= note_dur.get_length ();
if (left_to_do_)
- get_global_context ()->add_moment_to_process (now.main_part_ + note_dur.get_length());
+ get_global_context ()->add_moment_to_process (now.main_part_ + note_dur.get_length ());
/*
don't do complicated arithmetic with grace notes.
*/
Tie::set_head (p, RIGHT, right);
ties_.push_back (p);
}
-
+
void
Completion_heads_engraver::stop_translation_timestep ()
{
ties_.clear ();
+ tie_column_ = 0;
if (notes_.size ())
prev_notes_ = notes_;
Completion_heads_engraver::Completion_heads_engraver ()
{
+ tie_column_ = 0;
}
ADD_TRANSLATOR (Completion_heads_engraver,
/* doc */
"This engraver replaces @code{Note_heads_engraver}. It plays"
" some trickery to break long notes and automatically tie them"
- " into the next measure."
- ,
+ " into the next measure.",
+
/* create */
"NoteHead "
"Tie "
- ,
+ "TieColumn ",
+
/* read */
- "middleCPosition "
- "measurePosition "
"measureLength "
- ,
+ "measurePosition "
+ "middleCPosition "
+ "timing ",
+
/* write */
"completionBusy "
);