# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
-TOPLEVEL_MY_PATCH_LEVEL = .jcn4
+TOPLEVEL_MY_PATCH_LEVEL = .jcn6
+pl 75.jcn6
+ - {lyric,meter,key}-performer
+ - span-brace-*
+
+pl 75.jcn5
+ - doze compile
+
pl 75.jcn4
- midi output, notes only
\consists "Vertical_align_engraver";
\consists "Span_bar_engraver";
+ \consists "Span_brace_engraver";
\contains\requesttranslator {
Engraver "Staff_engravers"
\contains\requesttranslator{
Performer "Performer_group_performer"
\consists "Lyric_performer";
+ \consists "Key_performer";
\consists "Note_performer";
+ \consists "Meter_performer";
\consists "Silent_performer";
}
}
% dims ignored for this table
"param" = \table {
+ "brace" "\brace{%}" 0.0\pt 0.0\pt -3.0\pt 3.0\pt
"meter" "\generalmeter{%}{%}" 0.0\pt 10.0\pt -5.0\pt 5.0\pt
"linestaf" "\linestafsym{%}{%}"
"stem" "\stem{%}{%}"
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
-MY_PATCH_LEVEL = .jcn2
+MY_PATCH_LEVEL = .jcn5
IMPLEMENT_IS_TYPE_B2(Horizontal_vertical_group, Horizontal_group, Vertical_group);
IMPLEMENT_STATIC_NAME(Horizontal_vertical_group);
+Horizontal_vertical_group::Horizontal_vertical_group()
+{
+}
+
void
Horizontal_vertical_group::do_substitute_dependency(Score_elem*o,Score_elem*n)
{
protected:
virtual Horizontal_vertical_group* elem_group() { return this; }
public:
- Element_group();
+ Horizontal_vertical_group();
bool contains_b(Score_elem const *)const;
NAME_MEMBERS();
virtual void do_substitute_dependency(Score_elem*,Score_elem*);
--- /dev/null
+/*
+ key-performer.hh -- declare Key_performer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#ifndef KEY_PERFOMER_HH
+#define KEY_PERFOMER_HH
+
+#include "lily-proto.hh"
+#include "performer.hh"
+
+class Key_performer : public Performer {
+public:
+ NAME_MEMBERS();
+ Key_performer();
+ ~Key_performer();
+
+protected:
+ void do_print() const;
+ virtual bool try_request( Request* req_l );
+ virtual void process_requests();
+
+private:
+ Key_change_req* key_req_l_;
+};
+
+#endif // KEY_PERFOMER_HH
source file of the GNU LilyPond music typesetter
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
+ (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
*/
Lyric_performer();
~Lyric_performer();
+protected:
+ void do_print() const;
+ virtual bool try_request( Request* req_l );
+ virtual void process_requests();
+
private:
Array<Lyric_req*> lreq_arr_;
- virtual bool do_try_request(Request*);
- virtual void do_process_requests();
- virtual void do_post_move_processing();
};
#endif // LYRIC_PERFOMER_HH
--- /dev/null
+/*
+ meter-performer.hh -- declare Meter_performer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#ifndef METER_PERFOMER_HH
+#define METER_PERFOMER_HH
+
+#include "lily-proto.hh"
+#include "performer.hh"
+
+class Meter_performer : public Performer {
+public:
+ NAME_MEMBERS();
+ Meter_performer();
+ ~Meter_performer();
+
+protected:
+ void do_print() const;
+ virtual bool try_request( Request* req_l );
+ virtual void process_requests();
+
+private:
+ Meter_change_req* meter_req_l_;
+};
+
+#endif // METER_PERFOMER_HH
class Voice_element : public Chord {
public:
NAME_MEMBERS();
+ Voice_element();
VIRTUAL_COPY_CONS(Voice_element,Music);
};
--- /dev/null
+/*
+ span-brace-engraver.hh -- declare Span_brace_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef SPAN_BRACE_GRAV_HH
+#define SPAN_BRACE_GRAV_HH
+
+#include "engraver.hh"
+
+class Span_brace_engraver : public Engraver
+{
+public:
+ NAME_MEMBERS();
+ Span_brace_engraver();
+ ~Span_brace_engraver();
+
+ virtual void acknowledge_element( Score_elem_info i );
+ virtual void do_pre_move_processing();
+
+private:
+ Span_brace_item* span_brace_p_;
+ Array<Bar*> bar_l_arr_;
+ Vertical_align_element* valign_l_;
+};
+
+#endif // SPAN_BRACE_GRAV_HH
--- /dev/null
+/*
+ span-brace-item.hh -- declare Span_brace_item
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+
+#ifndef SPAN_BRACE_ITEM_HH
+#define SPAN_BRACE_ITEM_HH
+
+#include "bar.hh"
+
+class Span_brace_item : public Item
+{
+public:
+ NAME_MEMBERS();
+ SCORE_ELEM_CLONE(Span_brace_item);
+
+ void add( Bar* bar_l );
+ void set( Vertical_align_element* vae_l );
+ void do_pre_processing();
+ void do_substitute_dependency( Score_elem*, Score_elem* );
+ Molecule* brew_molecule_p() const;
+
+private:
+ Link_array<Bar> spanning_l_arr_;
+};
+
+#endif // SPAN_BRACE_ITEM_HH
--- /dev/null
+/*
+ key-performer.cc -- implement Key_performer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#include "key-performer.hh"
+#include "command-request.hh"
+#include "midi-item.hh"
+
+
+IMPLEMENT_STATIC_NAME(Key_performer);
+IMPLEMENT_IS_TYPE_B1(Key_performer,Performer);
+ADD_THIS_PERFORMER(Key_performer);
+
+Key_performer::Key_performer()
+{
+ key_req_l_ = 0;
+}
+
+Key_performer::~Key_performer()
+{
+}
+
+void
+Key_performer::do_print() const
+{
+#ifndef NPRINT
+ if ( key_req_l_ )
+ key_req_l_->print();
+#endif
+}
+
+void
+Key_performer::process_requests()
+{
+ if ( key_req_l_ ) {
+ int sharps_i = key_req_l_->sharps_i();
+ int flats_i = key_req_l_->flats_i();
+ // midi cannot handle non-conventional keys
+ if ( !( flats_i && sharps_i ) ) {
+ Midi_key k( sharps_i - flats_i, key_req_l_->minor_b() );
+ play_event( &k );
+ }
+ key_req_l_ = 0;
+ }
+}
+
+bool
+Key_performer::try_request( Request* req_l )
+{
+ if ( key_req_l_ )
+ return false;
+
+ if ( req_l->command() )
+ key_req_l_ = req_l->command()->keychange();
+
+ if ( key_req_l_ )
+ return true;
+
+ return false;
+}
+
}
Symbol
-Lookup::vbrace(Real &y) const
+Lookup::vbrace( Real &y ) const
{
- if (y < 2* 20 PT) {
- warning ( "piano brace too small (" + print_dimen(y)+ ")");
- y = 2*20 PT;
+ if ( y < 2 * 20 PT ) {
+ warning( "staff brace too small (" + print_dimen( y ) + ")" );
+ y = 2 * 20 PT;
}
- if (y > 67 * 2 PT) {
- warning ( "piano brace too big (" + print_dimen(y)+ ")");
- y = 67 *2 PT;
+ if ( y > 2 * 67 PT ) {
+ warning( "staff brace too big (" + print_dimen( y ) + ")" );
+ y = 2 * 67 PT;
}
- int idx = int(rint((y/2.0 - 20 ) + 148));
+ int idx = int( rint( y/2.0 - 20 ) );
Symbol s = (*symtables_)("param")->lookup("brace");
source file of the GNU LilyPond music typesetter
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
+ (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
*/
#include "lyric-performer.hh"
+#include "text-def.hh"
#include "musical-request.hh"
-//#include "text-item.hh"
-//#include "paper-def.hh"
-//#include "lookup.hh"
+#include "midi-item.hh"
IMPLEMENT_STATIC_NAME(Lyric_performer);
{
}
-bool
-Lyric_performer::do_try_request( Request* req_l )
+void
+Lyric_performer::do_print() const
{
- Musical_req* m_l = req_l->musical();
- if ( !m_l || ! m_l->lreq_l() )
- return false;
- lreq_arr_.push( m_l->lreq_l() );
-
- return true;
+#ifndef NPRINT
+ if ( lreq_arr_.size() )
+ lreq_arr_[ 0 ]->print();
+#endif
}
void
-Lyric_performer::do_process_requests()
+Lyric_performer::process_requests()
{
-#if 0
- Text_item * last_item_l =0;
- for (int i=0; i < lreq_arr_.size(); i++) {
- Text_item *lp = new Text_item(lreq_arr_[i]->tdef_p_ );
- lp->dir_i_ = -1;
- lp->fat_b_ = true;
- if (last_item_l)
- lp->add_support(last_item_l);
- last_item_l = lp;
- typeset_element(lp);
+ if ( lreq_arr_.size() ) {
+ Midi_text t( Midi_text::LYRIC, lreq_arr_[ 0 ]->tdef_p_->text_str_ );
+ play_event( &t );
}
-#endif
+
+ lreq_arr_.clear();
}
-void
-Lyric_performer::do_post_move_processing()
+bool
+Lyric_performer::try_request( Request* req_l )
{
- lreq_arr_.set_size(0);
+ Musical_req* m_l = req_l->musical();
+ if ( !m_l || ! m_l->lreq_l() )
+ return false;
+ lreq_arr_.push( m_l->lreq_l() );
+
+ return true;
}
--- /dev/null
+/*
+ meter-performer.cc -- implement Meter_performer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#include "meter-performer.hh"
+#include "command-request.hh"
+#include "midi-item.hh"
+
+
+IMPLEMENT_STATIC_NAME(Meter_performer);
+IMPLEMENT_IS_TYPE_B1(Meter_performer,Performer);
+ADD_THIS_PERFORMER(Meter_performer);
+
+Meter_performer::Meter_performer()
+{
+ meter_req_l_ = 0;
+}
+
+Meter_performer::~Meter_performer()
+{
+}
+
+void
+Meter_performer::do_print() const
+{
+#ifndef NPRINT
+ if ( meter_req_l_ )
+ meter_req_l_->print();
+#endif
+}
+
+void
+Meter_performer::process_requests()
+{
+ if ( meter_req_l_ ) {
+ Midi_time m( meter_req_l_->beats_i_, meter_req_l_->one_beat_i_, 18 );
+ play_event( &m );
+ meter_req_l_ = 0;
+ }
+}
+
+bool
+Meter_performer::try_request( Request* req_l )
+{
+ if ( meter_req_l_ )
+ return false;
+
+ if ( req_l->command() )
+ meter_req_l_ = req_l->command()->meterchange();
+
+ if ( meter_req_l_ )
+ return true;
+
+ return false;
+}
+
--- /dev/null
+/*
+ span-brace-engraver.cc -- implement Span_brace_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#include "span-brace-item.hh"
+#include "span-brace-engraver.hh"
+#include "vertical-align-spanner.hh"
+
+IMPLEMENT_STATIC_NAME(Span_brace_engraver);
+IMPLEMENT_IS_TYPE_B1(Span_brace_engraver,Engraver);
+ADD_THIS_ENGRAVER(Span_brace_engraver);
+
+Span_brace_engraver::Span_brace_engraver()
+{
+ span_brace_p_ = 0;
+ valign_l_ = 0;
+}
+
+Span_brace_engraver::~Span_brace_engraver()
+{
+}
+
+void
+Span_brace_engraver::acknowledge_element( Score_elem_info i )
+{
+ if ( i.elem_l_->is_type_b( Bar::static_name() ) ) {
+ bar_l_arr_.push( (Bar*)i.elem_l_->item() );
+
+ if ( bar_l_arr_.size() >= 2 && !span_brace_p_ ) {
+ span_brace_p_ = new Span_brace_item;
+ announce_element( Score_elem_info( span_brace_p_, 0 ) );
+ }
+ }
+ else if ( i.elem_l_->is_type_b( Vertical_align_spanner::static_name() )
+ && i.origin_grav_l_arr_.size() <= 2 )
+ valign_l_ = (Vertical_align_spanner*)i.elem_l_->spanner();
+}
+
+void
+Span_brace_engraver::do_pre_move_processing()
+{
+ if ( span_brace_p_ ) {
+ for ( int i=0; i < bar_l_arr_.size() ; i++ )
+ span_brace_p_->add( bar_l_arr_[ i ] );
+ span_brace_p_->set( valign_l_ );
+ typeset_breakable_item( span_brace_p_ );
+ span_brace_p_ = 0;
+ }
+
+ bar_l_arr_.clear();
+}
+
--- /dev/null
+/*
+ span-brace-item.cc -- implement Span_brace_item
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+#include "span-brace-item.hh"
+#include "lookup.hh"
+#include "symbol.hh"
+#include "paper-def.hh"
+#include "molecule.hh"
+#include "vertical-align-elem.hh"
+
+IMPLEMENT_STATIC_NAME(Span_brace_item);
+IMPLEMENT_IS_TYPE_B1( Span_brace_item, Item );
+
+void
+Span_brace_item::add( Bar* b )
+{
+ b->spanned_i_++;
+ spanning_l_arr_.push( b );
+ add_dependency( b );
+}
+
+void
+Span_brace_item::do_substitute_dependency( Score_elem* o, Score_elem* n )
+{
+ Bar* bold = 0;
+ if ( o->is_type_b( Bar::static_name() ) )
+ bold = (Bar*)o->item();
+ else
+ return;
+
+ bold->spanned_i_--;
+ Bar* b = 0;
+ if ( n && n->is_type_b( Bar::static_name() ) ) {
+ b = (Bar*)n->item();
+ b->spanned_i_++;
+ }
+
+ spanning_l_arr_.substitute( bold, b );
+}
+
+void
+Span_brace_item::set( Vertical_align_element* a )
+{
+ add_dependency( a );
+}
+
+
+void
+Span_brace_item::do_pre_processing()
+{
+ if ( spanning_l_arr_.size () < 1 ) {
+ transparent_b_ = true;
+ empty_b_ = true;
+ }
+ else { // 0: nobreak, 1: pre, 2: post
+ empty_b_ = ( break_status_i() != 2 );
+ transparent_b_ = ( break_status_i() != 1 );
+ }
+}
+
+Molecule*
+Span_brace_item::brew_molecule_p() const
+{
+ Interval y;
+ for ( int i = 0; i < spanning_l_arr_.size(); i++ )
+ y.unite( spanning_l_arr_[ i ]->height() );
+ // ugh, one extra staff @ 16pt
+// Real length_f = y.length() + spanning_l_arr_[ 0 ]->height().length();
+// Real length_f = y.length() + 16;
+ Real length_f = y.length() - 6;
+ Symbol s = paper()->lookup_l()->vbrace( length_f );
+ Molecule* mol_p = new Molecule( Atom ( s ) );
+// mol_p->translate_y( - ( length_f + 16 ) / 2 );
+ // urgh, what's wrong here?
+ mol_p->translate_y( - length_f / 2 - 6 );
+
+ return mol_p;
+}
+
(c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
+#include "proto.hh"
+#include "plist.hh"
#include "plist.tcc"
#include "pcursor.tcc"
+#include "proto.hh"
+#include "plist.hh"
#include "plist.tcc"
#include "pcursor.tcc"
String
Midi_key::mudela_str( bool command_mode_bo )
{
- String str = "\\key\\";
+ String str = "\\key";
if ( !minor_i_ )
str += String( (char)( ( key_i_ + 2 ) % 7 + 'A' ) );
else // heu, -2: should be - 1 1/2: A -> fis
str += String( (char)( ( key_i_ + 2 - 2 ) % 7 + 'a' ) );
- str = String( "%" ) + str + ";\n"; // "\key\F" not supported yet...
+ str = String( "% " ) + '"' str + '"' + "; % not supported yet\n";
return str;
}
\font\musicfont=musix16
\font\slurfont=xslu16
-\def\thefont{\musicfont}
+\font\specfont=musixspx
+% \def\thefont{\musicfont}
+\def\thefont{\specfont}
\def\mb#1{{\thefont\char#1}}
\divide\wid by 2
\here=-\wid
\loop\ifdim\here<\wid\advance\here by\inc
- \hbox to0pt{\kern\here\vrule width0.05pt height 2pt\hss}%
+ \hbox to0pt{\kern\here\vrule width0.05pt height 4pt\hss}%
\repeat%
}
\def\beamslope#1#2{{\count0=#2\advance\count0 by#1\musicfnt\char\count0}}
-\def\rulesym#1#2{\vrule height #1 width #2}
+\def\brace#1{\count0=148\advance\count0 by #1\musicdraw\char\count0}
\def\crescendosym#1{\count0=84\advance\count0 by #1\musicdraw\char\count0}
\def\decrescendosym#1{\count0=116\advance\count0 by #1\musicdraw\char\count0}
+\def\rulesym#1#2{\vrule height #1 width #2}
\def\settext#1{\textfont #1}
\def\setitalic#1{\italicfont #1}
\def\setdynamic#1{\dynfont #1}