From eeafd68c62481b0d10c292f0e4bfa5d821168c87 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Thu, 10 Jul 1997 08:56:40 +0200 Subject: [PATCH] patch::: 0.0.74pre.jcn1: pats pl 74pre.jcn1 - oversimplified midi output thru performer hierarchy - bf: Spanner::doprint pl 72pre.jcn1 - naming fixes; some iter*() explicitations - removed acceptor.hh - *performer*: second draft of midi (audio/...) --- .dstreamrc | 116 +++++++++++------- .version | 2 +- BUGS | 11 -- NEWS | 9 ++ flower/include/iterate.hh | 8 +- init/midi.ini | 5 + init/performer.ini | 28 +++++ init/symbol.ini | 3 + lily/.version | 2 +- lily/engraver-group.cc | 24 ++-- lily/engraver.cc | 3 +- lily/global-performers.cc | 50 ++++++++ lily/identifier.cc | 4 + lily/include/acceptor.hh | 41 ------- lily/include/engraver-group.hh | 1 + lily/include/global-performers.hh | 33 ++++++ lily/include/global-translator.hh | 2 +- lily/include/identifier.hh | 2 + lily/include/input-translator.hh | 2 +- lily/include/lily-proto.hh | 11 +- lily/include/lyric-performer.hh | 31 +++++ lily/include/midi-def.hh | 17 ++- lily/include/my-lily-parser.hh | 1 + lily/include/note-performer.hh | 44 +++++++ lily/include/performer-group-performer.hh | 51 ++++++++ lily/include/performer.hh | 36 ++++++ lily/include/score-performer.hh | 36 ++++++ lily/include/score.hh | 2 + lily/include/staff-performer.hh | 30 +++++ lily/include/voice-group-performer.hh | 41 +++++++ lily/input-translator.cc | 20 ++-- lily/lyric-performer.cc | 62 ++++++++++ lily/midi-def.cc | 59 ++++++++-- lily/music-iterator.cc | 14 +-- lily/my-lily-lexer.cc | 2 +- lily/note-performer.cc | 71 +++++++++++ lily/parser.y | 46 ++++++-- lily/performer-group-performer.cc | 137 ++++++++++++++++++++++ lily/performer.cc | 57 +++++++++ lily/score-grav.cc | 2 +- lily/score-performer.cc | 70 +++++++++++ lily/score.cc | 30 ++++- lily/spanner.cc | 15 ++- lily/staff-performer.cc | 38 ++++++ lily/template6.cc | 2 + lily/voice-group-performer.cc | 26 ++++ 46 files changed, 1136 insertions(+), 161 deletions(-) create mode 100644 init/midi.ini create mode 100644 init/performer.ini create mode 100644 lily/global-performers.cc create mode 100644 lily/include/global-performers.hh create mode 100644 lily/include/lyric-performer.hh create mode 100644 lily/include/note-performer.hh create mode 100644 lily/include/performer-group-performer.hh create mode 100644 lily/include/performer.hh create mode 100644 lily/include/score-performer.hh create mode 100644 lily/include/staff-performer.hh create mode 100644 lily/include/voice-group-performer.hh create mode 100644 lily/lyric-performer.cc create mode 100644 lily/note-performer.cc create mode 100644 lily/performer-group-performer.cc create mode 100644 lily/performer.cc create mode 100644 lily/score-performer.cc create mode 100644 lily/staff-performer.cc create mode 100644 lily/voice-group-performer.cc diff --git a/.dstreamrc b/.dstreamrc index 321a61888a..cb3e8bbcbe 100644 --- a/.dstreamrc +++ b/.dstreamrc @@ -3,53 +3,87 @@ Dstream 1 File_path 1 My_lily_lexer 1 -PCol 0 -Score_column 0 -Ineq_constrained_qp 0 -Spacing_problem 0 -Colinfo 0 -Mixed_qp 0 -PScore 0 -Idealspacing 0 +PCol 1 +Score_column 1 +Script_column 1 +# E l b e ment? search/replace typo +Elbement_group 1 +Ineq_constrained_qp 1 +Spacing_problem 1 +Colinfo 1 +Mixed_qp 1 +PScore 1 +Idealspacing 1 # yydebug -InitParser 0 -Parser 0 -InitDeclarations 0 +InitParser 1 +Parser 1 +InitDeclarations 1 Declarations 1 # FlexLexer debug InitLexer 1 Lexer 1 +Matrix 1 -parse_duration 0 -parse_pitchmod 0 -Col_configuration 0 -Request 0 -Note_req 0 -Rhythmic_req 0 -Rest_req 0 -delete_identifiers 0 -Command 0 -Staff_commands 0 -Stem 0 -Staff 0 -Score 0 -Voice 0 -Voice_element 0 -Input_cursor 0 -Commands_at 0 -Input_command 0 -Time_description 0 -Melodic_req 0 -Midi_walker 0 -Stem_req 0 -Group_change_req 0 -Script_req 0 -Colinfo 0 -Word_wrap 0 -Text_req 0 -Script_def 0 -Text_def 0 -Paperdef 0 +parse_duration 1 +parse_pitchmod 1 +Col_configuration 1 +Request 1 +Note_req 1 +Rhythmic_req 1 +Rest_req 1 +delete_identifiers 1 +Command 1 +Staff_commands 1 +Stem 1 +Staff 1 +Score 1 +Voice 1 +Voice_element 1 +Spanner 1 +Atom 1 +Change_iterator 1 +Chord_iterator 1 +Music_iterator 1 +Request_iterator 1 +Score_performer 0 +Voice_element_iterator 1 +Voice_iterator 1 +Chord 1 +Collision 1 +Rest_collision 1 +Stem 1 +Key_item 1 +Clef_item 1 +Bar 1 +Slur 1 +Music 1 +Paper_def 1 +Lookup 1 +Input_translator 1 +Score_elem 1 +Item 1 +Note_head 1 +Engraver 1 +Score_engraver 1 +Staff_engravers 1 +Engraver_group_engraver 1 +Input_cursor 1 +Commands_at 1 +Input_command 1 +Time_description 1 +Melodic_req 1 +Midi_walker 1 +Note_performer 0 +Performer 0 +Stem_req 1 +Group_change_req 1 +Script_req 1 +Colinfo 1 +Word_wrap 1 +Text_req 1 +Script_def 1 +Text_def 1 +Paperdef 1 Symtable 1 Symtables 1 diff --git a/.version b/.version index 62907006a8..ef1a729850 100644 --- a/.version +++ b/.version @@ -4,4 +4,4 @@ TOPLEVEL_PATCH_LEVEL = 74 # use to send patches, always empty for released version: # include separator: ".postfix", "-pl" makes rpm barf -TOPLEVEL_MY_PATCH_LEVEL = pre +TOPLEVEL_MY_PATCH_LEVEL = pre.jcn1 diff --git a/BUGS b/BUGS index ab3880a17e..e69de29bb2 100644 --- a/BUGS +++ b/BUGS @@ -1,11 +0,0 @@ -This file documents bugs which were "re-introduced" in various pl's - -pl69 - * slurs.ly - -pl68: - * opening rests wohltemperirt - - * lyrics broken, - - * midi broken diff --git a/NEWS b/NEWS index 8024812612..cd728f5bdf 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,12 @@ +pl 74pre.jcn1 + - oversimplified midi output thru performer hierarchy + - bf: Spanner::doprint + +pl 72pre.jcn1 + - naming fixes; some iter*() explicitations + - removed acceptor.hh + - *performer*: second draft of midi (audio/...) + pl 74pre - Input_engraver -> Input_translator - bf: span start/stop is now a "used" col. diff --git a/flower/include/iterate.hh b/flower/include/iterate.hh index 9aee1ec550..74e6ff202c 100644 --- a/flower/include/iterate.hh +++ b/flower/include/iterate.hh @@ -10,7 +10,13 @@ #ifndef ITERATE_HH #define ITERATE_HH - +/* + ugh. + jcn: kjoet. + if we wouldn't have had this, things might have been + just a little bit easier to read, imho. + (it does save quite some disk space, though) + */ #define iterator(set) typeof((set).top()) #define iterator_bot(set) typeof((set).bottom()) diff --git a/init/midi.ini b/init/midi.ini new file mode 100644 index 0000000000..29f4c2d9da --- /dev/null +++ b/init/midi.ini @@ -0,0 +1,5 @@ + +default_midi = \midi { + \tempo 4:60; + \include "performer.ini" +} diff --git a/init/performer.ini b/init/performer.ini new file mode 100644 index 0000000000..6c77837edf --- /dev/null +++ b/init/performer.ini @@ -0,0 +1,28 @@ +% +% setup for Request->Element conversion. Guru-only +% + +% nice to have, but let's first get some output + +\requesttranslator { + Performer "Score_performer" + \alias "Score"; +% \consists "Clef_performer"; +% \consists "Key_performer"; +% \consists "Meter_performer"; +% \consists "Tempo_performer"; + + \contains\requesttranslator { + Performer "Staff_performer" + \alias "Midi"; + \contains\requesttranslator{ + Performer "Voice_group_performer" + \alias "Voice_group"; + \contains\requesttranslator{ + Performer "Performer_group_performer" + \consists "Lyric_performer"; + \consists "Note_performer"; + } + } + } +} diff --git a/init/symbol.ini b/init/symbol.ini index 2c26af1cc5..77f7fdd5f6 100644 --- a/init/symbol.ini +++ b/init/symbol.ini @@ -5,6 +5,9 @@ \include "script.ini" \include "paper16.ini" +% ugh +\include "midi.ini" + left = -1 right = 1 up = 1 diff --git a/lily/.version b/lily/.version index e6694dfa00..3175b2b620 100644 --- a/lily/.version +++ b/lily/.version @@ -4,4 +4,4 @@ PATCH_LEVEL = 74 # use to send patches, always empty for released version: # include separator: ".postfix", "-pl" makes rpm barf -MY_PATCH_LEVEL = pre +MY_PATCH_LEVEL = pre.jcn1 diff --git a/lily/engraver-group.cc b/lily/engraver-group.cc index f876bf2605..224a86ac4f 100644 --- a/lily/engraver-group.cc +++ b/lily/engraver-group.cc @@ -48,7 +48,8 @@ Engraver_group_engraver::Engraver_group_engraver() void Engraver_group_engraver::set_feature(Feature d) { - iter_top(grav_list_, i); + PCursor i(grav_list_.top()); + // why the while construct? while (i.ok()) { // this construction to ensure clean deletion Engraver *grav_l = i++; @@ -59,9 +60,8 @@ Engraver_group_engraver::set_feature(Feature d) void Engraver_group_engraver::sync_features() { - iter_top(grav_list_, i); + PCursor i(grav_list_.top()); while (i.ok()) { - Engraver *grav_l = i++; grav_l->sync_features(); } @@ -70,9 +70,8 @@ Engraver_group_engraver::sync_features() void Engraver_group_engraver::do_pre_move_processing() { - iter_top(grav_list_, i); + PCursor i(grav_list_.top()); while (i.ok()) { - Engraver *grav_l = i++; grav_l->pre_move_processing(); } @@ -81,9 +80,8 @@ Engraver_group_engraver::do_pre_move_processing() void Engraver_group_engraver::do_process_requests() { - iter_top(grav_list_, i); + PCursor i(grav_list_.top()); while (i.ok()) { - Engraver *grav_l = i++; grav_l->process_requests(); } @@ -93,7 +91,7 @@ Engraver_group_engraver::do_process_requests() void Engraver_group_engraver::do_post_move_processing() { - iter_top(grav_list_, i); + PCursor i(grav_list_.top()); while (i.ok()) { // this construction to ensure clean deletion Engraver *grav_l = i++; @@ -109,8 +107,8 @@ Engraver_group_engraver::contains_b(Engraver* grav_l)const if (parent_b) return true; - for (iter_top(grav_list_, j); j.ok(); j++) - if (j->contains_b(grav_l)) + for (PCursor i(grav_list_.top()); i.ok(); i++) + if (i->contains_b(grav_l)) return true; return false; } @@ -153,7 +151,7 @@ Engraver_group_engraver::remove_engraver_p(Engraver*grav_l) { group_l_arr_.substitute((Engraver_group_engraver*)grav_l,0); nongroup_l_arr_.substitute(grav_l,0); - iterator(grav_list_) grav_cur= grav_list_.find(grav_l); + PCursor grav_cur( grav_list_.find(grav_l) ); return grav_cur.remove_p(); } @@ -177,7 +175,7 @@ Engraver_group_engraver::do_print()const { #ifndef NPRINT mtor << "ID: " << id_str_ << "\n"; - for (iter_top(grav_list_, i); i.ok(); i++) + for (PCursor i(grav_list_.top()); i.ok(); i++) i->print(); #endif } @@ -273,7 +271,7 @@ Engraver_group_engraver::do_announces() void Engraver_group_engraver::do_removal_processing() { - for (iter( grav_list_.top(), i); i.ok(); i++) + for (PCursor i(grav_list_.top()); i.ok(); i++) i->do_removal_processing(); } diff --git a/lily/engraver.cc b/lily/engraver.cc index 29027f4dea..d524de63d5 100644 --- a/lily/engraver.cc +++ b/lily/engraver.cc @@ -130,8 +130,7 @@ IMPLEMENT_STATIC_NAME(Engraver); IMPLEMENT_IS_TYPE_B(Engraver); void -Engraver::do_print()const +Engraver::do_print() const { } - diff --git a/lily/global-performers.cc b/lily/global-performers.cc new file mode 100644 index 0000000000..274a0d79ee --- /dev/null +++ b/lily/global-performers.cc @@ -0,0 +1,50 @@ +/* + global-translators.cc -- implement + + source file of the GNU LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ + +#include "proto.hh" +#include "plist.hh" +#include "input-translator.hh" +#include "debug.hh" +#include "performer.hh" + +struct Performer_table_entry { + String name_str_; + Perf_ctor ctor_l_; + Performer_table_entry(String s, Perf_ctor f) { + name_str_ =s; + ctor_l_ = f; + } + Performer_table_entry() + { + ctor_l_ =0; + } +}; + +static Array *perf_table=0; + +void +add_Performer(String s, Perf_ctor f) +{ + if (!perf_table) + perf_table = new Array; + + perf_table->push(Performer_table_entry(s, f)); +} + + +Performer* +get_performer_p(String s) +{ + for (int i=0; i < perf_table->size(); i++) { + if ((*perf_table)[i].name_str_ == s) + return (*(*perf_table)[i].ctor_l_)(); + } + error("Unknown performer `" + s +"\'"); + return 0; +} diff --git a/lily/identifier.cc b/lily/identifier.cc index 40c7e543e8..b3b6179487 100644 --- a/lily/identifier.cc +++ b/lily/identifier.cc @@ -7,6 +7,7 @@ */ #include +#include "midi-def.hh" #include "paper-def.hh" #include "score.hh" #include "identifier.hh" @@ -67,6 +68,7 @@ DEFAULT_PRINT(Music_id,Music , music); DEFAULT_PRINT(Request_id, Request, request); DEFAULT_PRINT(Score_id, Score, score); DEFAULT_PRINT(Input_trans_id, Input_translator, itrans); +DEFAULT_PRINT(Midi_def_id,Midi_def, mididef); DEFAULT_PRINT(Paper_def_id,Paper_def, paperdef); void @@ -120,6 +122,7 @@ implement_id_class(Music_id, Music, music); implement_id_class(Score_id, Score, score); implement_id_class(Request_id, Request, request); implement_id_class(Input_trans_id, Input_translator, itrans); +implement_id_class(Midi_def_id, Midi_def, mididef); implement_id_class(Paper_def_id, Paper_def, paperdef); Identifier::Identifier(Identifier const&) @@ -136,4 +139,5 @@ virtual_accessor(Music_id, Music, music); default_accessor(Score_id, Score, score); virtual_accessor(Request_id, Request, request); default_accessor(Input_trans_id, Input_translator, itrans); +default_accessor(Midi_def_id, Midi_def, mididef); default_accessor(Paper_def_id, Paper_def, paperdef); diff --git a/lily/include/acceptor.hh b/lily/include/acceptor.hh index 872f374aee..e69de29bb2 100644 --- a/lily/include/acceptor.hh +++ b/lily/include/acceptor.hh @@ -1,41 +0,0 @@ -/* - acceptor.hh -- declare Translator - - source file of the GNU LilyPond music typesetter - - (c) 1997 Han-Wen Nienhuys -*/ - - -#ifndef ACCEPTOR_HH -#define ACCEPTOR_HH -#error - -#include "string.hh" -#include "lily-proto.hh" -#include "interpreter.hh" -#include "virtual-methods.hh" - -class Translator { -public: - String id_str_; - - int iterator_count_; - - virtual Interpreter * interpreter_l() { return 0; } - - /// Score_engraver = 0, Staff_engravers = 1, etc) - virtual int depth_i()const=0; - virtual Translator *find_get_translator_l(String name, String id)=0; - virtual Translator *ancestor_l(int l=1)=0; - virtual ~Translator(){} - NAME_MEMBERS(); - Translator(); - virtual Translator *get_default_interpreter()=0; -}; - -class Interpreter : public virtual Translator { -public: - virtual bool interpret_request_b(Request*) { return false;} -}; -#endif // ACCEPTOR_HH diff --git a/lily/include/engraver-group.hh b/lily/include/engraver-group.hh index 8710ff53ad..4e468e9efd 100644 --- a/lily/include/engraver-group.hh +++ b/lily/include/engraver-group.hh @@ -10,6 +10,7 @@ #ifndef ENGRAVERGROUP_HH #define ENGRAVERGROUP_HH +#include "lily-proto.hh" #include "parray.hh" #include "plist.hh" #include "score-elem-info.hh" diff --git a/lily/include/global-performers.hh b/lily/include/global-performers.hh new file mode 100644 index 0000000000..b3e65743d9 --- /dev/null +++ b/lily/include/global-performers.hh @@ -0,0 +1,33 @@ + +/* + global-performers.hh -- declare global performer stuff + + source file of the GNU LilyPond music typesetter + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ + +#ifndef GLOBAL_PERFORMER_HH +#define GLOBAL_PERFORMER_HH + +/** + A macro to automate administration of performers + */ +#define ADD_THIS_PERFORMER( c ) \ +struct c ## init { \ + static Performer* globalctor () \ + { \ + return new c;\ + } \ + c ## init () \ + { \ + add_Performer( c::static_name(), globalctor ); \ + } \ +} _ ## c ## init; + +// typedef Performer*(*Perf_ctor)(void); c++ ? +typedef Performer*(*Perf_ctor)(); +void add_Performer(String s, Perf_ctor f); + +#endif // GLOBAL_PERFORMER_HH diff --git a/lily/include/global-translator.hh b/lily/include/global-translator.hh index 877020b10d..8344d3d898 100644 --- a/lily/include/global-translator.hh +++ b/lily/include/global-translator.hh @@ -36,4 +36,4 @@ protected: -#endif // Global_translator_HH +#endif // GLOBAL_TRANSLATOR_HH diff --git a/lily/include/identifier.hh b/lily/include/identifier.hh index 5a0d8d5395..ddcc32ccb4 100644 --- a/lily/include/identifier.hh +++ b/lily/include/identifier.hh @@ -34,6 +34,7 @@ struct Identifier : public Input { IDACCESSOR(Input_translator, itrans) IDACCESSOR(General_script_def, script) IDACCESSOR(Symtables, symtables) + IDACCESSOR(Midi_def, mididef) IDACCESSOR(Paper_def, paperdef) IDACCESSOR(Lookup,lookup) IDACCESSOR(Real,real) @@ -68,4 +69,5 @@ declare_id_class(Score_id, Score, score); declare_id_class(Request_id, Request, request); declare_id_class(Input_trans_id, Input_translator, itrans); declare_id_class(Paper_def_id,Paper_def, paperdef); +declare_id_class(Midi_def_id,Midi_def, mididef); #endif // IDENTIFIER_ diff --git a/lily/include/input-translator.hh b/lily/include/input-translator.hh index fa4790cbe8..2ee65f0d8f 100644 --- a/lily/include/input-translator.hh +++ b/lily/include/input-translator.hh @@ -37,7 +37,7 @@ struct Input_translator : Input { bool accepts_b(String); void print() const; Engraver_group_engraver * get_group_engraver_p(); - // Performer_group_performer * get_group_performer_p(); + Performer_group_performer * get_group_performer_p(); Input_translator * get_default_itrans_l(); Input_translator * recursive_find(String nm); Input_translator * find_itrans_l(String nm); diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index 0dbc8f0863..86573e0001 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -31,6 +31,7 @@ struct Chord; struct Clef_change_req; struct Clef_item; struct Clef_engraver; +struct Clef_performer; struct Col_hpositions; struct Chord; struct Colinfo; @@ -61,13 +62,14 @@ struct Idealspacing; struct Identifier; struct Interpreter; struct Input_file; -struct Input_translator; struct Input_score; +struct Input_translator; struct Item; struct Key; struct Key_change_req; struct Key_item; struct Key_engraver; +struct Key_performer; struct Keyword; struct Keyword_table; struct Lily_stream; @@ -85,6 +87,7 @@ struct Melodic_req; struct Meter; struct Meter_change_req; struct Meter_engraver; +struct Meter_performer; struct Midi_def; struct Midi_duration; struct Midi_header; @@ -105,6 +108,7 @@ struct Music_list; struct My_lily_parser; struct Note_column; struct Note_column_engraver; +struct Note_performer; struct Note_req; struct Note_head; struct Note_head_engraver; @@ -121,6 +125,8 @@ struct Pulk_voice; struct Pulk_voices; struct Rational; struct Engraver_group_engraver; +struct Performer; +struct Performer_group_performer; struct Request; struct Request_column; struct Engraver; @@ -136,6 +142,7 @@ struct Score; struct Score_column; struct Score_elem; struct Score_elem_info; +struct Score_performer; struct Script; struct Script_column; struct Script_def; @@ -150,6 +157,7 @@ struct Spacing_req ; struct Span_dynamic_req; struct Span_req; struct Spanner; +struct Staff_performer; struct Staff_side; struct Staff_symbol; struct Stem; @@ -182,6 +190,7 @@ struct Vertical_align_element; struct Voice; struct Voice_element; struct Voice_group_engravers; +struct Voice_group_performer; struct Voice_list; struct Voice_engravers; struct Voicegroup; diff --git a/lily/include/lyric-performer.hh b/lily/include/lyric-performer.hh new file mode 100644 index 0000000000..3abb55b0ba --- /dev/null +++ b/lily/include/lyric-performer.hh @@ -0,0 +1,31 @@ +/* + lyric-performer.hh -- declare Lyric_performer + + source file of the GNU LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ + + +#ifndef LYRIC_PERFOMER_HH +#define LYRIC_PERFOMER_HH + +#include "lily-proto.hh" +#include "performer.hh" +#include "varray.hh" + +class Lyric_performer : public Performer { +public: + NAME_MEMBERS(); + Lyric_performer(); + ~Lyric_performer(); + +private: + Array lreq_arr_; + virtual bool do_try_request(Request*); + virtual void do_process_requests(); + virtual void do_post_move_processing(); +}; + +#endif // LYRIC_PERFOMER_HH diff --git a/lily/include/midi-def.hh b/lily/include/midi-def.hh index 9673783d25..13073251ab 100644 --- a/lily/include/midi-def.hh +++ b/lily/include/midi-def.hh @@ -7,8 +7,8 @@ */ -#ifndef MIDIDEF_HH -#define MIDIDEF_HH +#ifndef MIDI_DEF_HH +#define MIDI_DEF_HH #include "lily-proto.hh" #include "real.hh" #include "string.hh" @@ -25,18 +25,25 @@ struct Midi_def { /// output file name String outfile_str_; + Assoc *real_vars_p_; + Input_translator* itrans_p_; + /// duration of whole note Real whole_seconds_f_; Midi_def(); - Midi_def(Midi_def const& midi_c_r); + Midi_def( Midi_def const& midi_c_r ); ~Midi_def(); Real duration_to_seconds_f(Moment); + Global_translator* get_global_translator_p() const; + Real get_var( String s ) const; int get_tempo_i( Moment moment ); - void set_tempo( Moment moment, int count_per_minute_i ); void print() const; + void set( Input_translator* itrans_p ); + void set_var( String s, Real r ); + void set_tempo( Moment moment, int count_per_minute_i ); }; -#endif // MIDIDEF_HH // +#endif // MIDI_DEF_HH diff --git a/lily/include/my-lily-parser.hh b/lily/include/my-lily-parser.hh index 5ecfd7d62c..6c96382498 100644 --- a/lily/include/my-lily-parser.hh +++ b/lily/include/my-lily-parser.hh @@ -55,6 +55,7 @@ public: Input pop_spot(); Paper_def*default_paper(); + Midi_def*default_midi(); void do_yyparse(); void parser_error(String); void clear_notenames(); diff --git a/lily/include/note-performer.hh b/lily/include/note-performer.hh new file mode 100644 index 0000000000..267deb1212 --- /dev/null +++ b/lily/include/note-performer.hh @@ -0,0 +1,44 @@ +/* + note-performer.hh -- declare Note_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#ifndef NOTE_PERFORMER_HH +#define NOTE_PERFORMER_HH + +#include "performer.hh" + +/** +*/ + +class Note_performer : public Performer { +public: + NAME_MEMBERS(); + + Note_performer(); + ~Note_performer(); + + virtual void process_requests(); + virtual bool /*do_*/try_request( Request *req_l ) ; + +protected: + virtual void do_print() const; + +#if 0 + virtual void /*do_*/process_requests(); + virtual void /*do_*/pre_move_processing(); + virtual void /*do_*/post_move_processing(); +#endif + +private: + Melodic_req * note_req_l_; +// Rhythmic_req * note_req_l_; + +// Melodic_req* current_l_; +// Moment off_mom_; +// Moment on_mom_; +}; + +#endif // NOTE_PERFORMER_HH diff --git a/lily/include/performer-group-performer.hh b/lily/include/performer-group-performer.hh new file mode 100644 index 0000000000..7219de0d6d --- /dev/null +++ b/lily/include/performer-group-performer.hh @@ -0,0 +1,51 @@ +/* + performer-group-performer.hh -- declare Performer_group_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#ifndef PERFORMER_GROUP_PERFORMER_HH +#define PERFORMER_GROUP_PERFORMER_HH + +#include "lily-proto.hh" +#include "parray.hh" +#include "plist.hh" +#include "performer.hh" +#include "translator.hh" + +/** + Group a number of performers. Usually delegates everything to its contents. +*/ + +class Performer_group_performer : public Performer, public virtual Translator { +public: + NAME_MEMBERS(); + Input_translator* itrans_l_; + + Performer_group_performer(); + ~Performer_group_performer(); + + bool is_bottom_performer_b() const; + virtual Performer_group_performer* find_performer_l( String name, String id ); + + virtual void add( Performer* perf_p ); + virtual bool try_request( Request* req_l ); + + virtual Translator* find_get_translator_l( String name, String id ); + virtual Translator* get_default_interpreter(); + + Translator * ancestor_l( int l = 1 ); + int depth_i() const; + + void process_requests(); + +private: + Pointer_list perf_p_list_; + + Link_array group_l_arr_; + Link_array nongroup_l_arr_; +}; + +#endif // PERFORMER_GROUP_PERFORMER_HH + diff --git a/lily/include/performer.hh b/lily/include/performer.hh new file mode 100644 index 0000000000..356b0c939b --- /dev/null +++ b/lily/include/performer.hh @@ -0,0 +1,36 @@ +/* + performer.hh -- declare Performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#ifndef PERFORMER_HH +#define PERFORMER_HH + +#include "lily-proto.hh" +#include "varray.hh" +#include "request.hh" +#include "score-elem-info.hh" +#include "staff-info.hh" + +class Performer { +public: + NAME_MEMBERS(); + Performer_group_performer* daddy_perf_l_; + + Performer(); + virtual ~Performer(); + + void print() const; + virtual void process_requests(); + virtual bool try_request( Request* req_l ); + +protected: + virtual void do_print() const; + virtual void play_event( Midi_item* l ); +}; + +#include "global-performers.hh" + +#endif // PERFORMER_HH diff --git a/lily/include/score-performer.hh b/lily/include/score-performer.hh new file mode 100644 index 0000000000..980bbaa2e3 --- /dev/null +++ b/lily/include/score-performer.hh @@ -0,0 +1,36 @@ +/* + score-performer.hh -- declare Score_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#ifndef SCORE_PERFORMER_HH +#define SCORE_PERFORMER_HH + +#include "performer-group-performer.hh" +#include "global-translator.hh" + +class Score_performer: + public Performer_group_performer, public Global_translator +{ +public: + NAME_MEMBERS(); + Score_performer(); + ~Score_performer(); + +protected: + virtual Translator* ancestor_l( int l ); + virtual int depth_i() const; + + virtual void play_event( Midi_item* l ); + virtual void prepare( Moment mom ); + virtual void process(); + +private: + Midi_stream* midi_stream_p_; + Moment prev_mom_; + Moment now_mom_; +}; + +#endif // SCORE_PERFORMER_HH diff --git a/lily/include/score.hh b/lily/include/score.hh index b11118f17f..15486e2aaa 100644 --- a/lily/include/score.hh +++ b/lily/include/score.hh @@ -62,7 +62,9 @@ public: private: void run_translator(Global_translator*); + void midi_output(); void paper_output(); + /// do midi stuff void midi(); diff --git a/lily/include/staff-performer.hh b/lily/include/staff-performer.hh new file mode 100644 index 0000000000..cf1eb20188 --- /dev/null +++ b/lily/include/staff-performer.hh @@ -0,0 +1,30 @@ +/* + staff-performer.hh -- declare Staff_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#ifndef STAFF_PERFORMER_HH +#define STAFF_PERFORMER_HH + +#include "performer-group-performer.hh" + +class Staff_performer : public Performer_group_performer +{ +public: + NAME_MEMBERS(); + + Staff_performer(); + ~Staff_performer(); + + String instrument_str(); + +protected: + virtual void play_event( Midi_item* l ); + +private: + int midi_track_i_; +}; + +#endif // STAFF_PERFORMER_HH diff --git a/lily/include/voice-group-performer.hh b/lily/include/voice-group-performer.hh new file mode 100644 index 0000000000..1a7efee085 --- /dev/null +++ b/lily/include/voice-group-performer.hh @@ -0,0 +1,41 @@ +/* + voice-group-performer.hh -- declare Voice_group_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#ifndef VOICE_GROUP_PERFORMER_HH +#define VOICE_GROUP_PERFORMER_HH + +#include "performer-group-performer.hh" + +#if 0 +class Voice_performer_group_performer : public Performer_group_performer { +public: + Voice_performer_ + +}; + +#endif + +class Voice_group_performer : public Performer_group_performer { +public: + NAME_MEMBERS(); + + Voice_group_performer(); + ~Voice_group_performer(); + +private: +}; + + +#if 0 +class Voice_performer : + public Performer_group_performer, public Interpreter +{ + +}; +#endif + +#endif // VOICE_GROUP_PERFORMER_HH diff --git a/lily/input-translator.cc b/lily/input-translator.cc index a90325bd5e..1a652794a8 100644 --- a/lily/input-translator.cc +++ b/lily/input-translator.cc @@ -13,6 +13,7 @@ #include "parray.hh" #include "input-translator.hh" #include "engraver-group.hh" +#include "performer-group-performer.hh" bool Input_translator::is_name_b(String n) @@ -33,7 +34,7 @@ Input_translator::print() const mtor << consists_str_arr_[i] << ','; if (contains_itrans_p_list_.size()) mtor << "\nContains " ; - for (iter(contains_itrans_p_list_.top(), i); i.ok(); i++) + for (PCursor i(contains_itrans_p_list_.top()); i.ok(); i++) i->print(); mtor << "}\n"; #endif @@ -48,7 +49,8 @@ Input_translator::recursive_find(String nm) return this; Input_translator * r =0; - iter(contains_itrans_p_list_.top(), i); + // what bout for() ? + PCursor i(contains_itrans_p_list_.top()); for (; !r &&i.ok(); i++) { if (i->recursive_find(nm)) r = i.ptr(); @@ -60,7 +62,7 @@ Input_translator::recursive_find(String nm) Input_translator * Input_translator::find_itrans_l(String nm) { - for (iter(contains_itrans_p_list_.top(), i); i.ok(); i++) + for (PCursor i(contains_itrans_p_list_.top()); i.ok(); i++) if (i->is_name_b( nm)) return i; @@ -83,22 +85,20 @@ Input_translator::get_group_engraver_p() return grav_p; } -#if 0 Performer_group_performer* Input_translator::get_group_performer_p() { assert (base_str_ == "Performer"); - Performer_group_performer * grav_p = (Performer_group_performer*) + Performer_group_performer * perf_p = (Performer_group_performer*) get_performer_p(type_str_); for (int i=0; i < consists_str_arr_.size(); i++) { - grav_p->add( get_performer_p( consists_str_arr_[i]) ); + perf_p->add( get_performer_p( consists_str_arr_[i]) ); } - grav_p->itrans_l_ = this; - grav_p->id_str_ = default_id_str_; - return grav_p; + perf_p->itrans_l_ = this; + perf_p->id_str_ = default_id_str_; + return perf_p; } -#endif bool Input_translator::accept_req_b() diff --git a/lily/lyric-performer.cc b/lily/lyric-performer.cc new file mode 100644 index 0000000000..aa24dcac25 --- /dev/null +++ b/lily/lyric-performer.cc @@ -0,0 +1,62 @@ +/* + lyric-performer.cc -- implement Lyric_performer + + source file of the GNU LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ + +#include "lyric-performer.hh" +#include "musical-request.hh" +//#include "text-item.hh" +//#include "paper-def.hh" +//#include "lookup.hh" + + +IMPLEMENT_STATIC_NAME(Lyric_performer); +IMPLEMENT_IS_TYPE_B1(Lyric_performer,Performer); +ADD_THIS_PERFORMER(Lyric_performer); + +Lyric_performer::Lyric_performer() +{ +} + +Lyric_performer::~Lyric_performer() +{ +} + +bool +Lyric_performer::do_try_request( Request* req_l ) +{ + 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; +} + +void +Lyric_performer::do_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); + } +#endif +} + +void +Lyric_performer::do_post_move_processing() +{ + lreq_arr_.set_size(0); +} + diff --git a/lily/midi-def.cc b/lily/midi-def.cc index 2f703f01f8..5e76d11805 100644 --- a/lily/midi-def.cc +++ b/lily/midi-def.cc @@ -8,6 +8,10 @@ #include #include "misc.hh" #include "midi-def.hh" +#include "input-translator.hh" +#include "performer-group-performer.hh" +#include "assoc-iter.hh" + #include "debug.hh" // classes, alphasorted @@ -23,27 +27,48 @@ int Midi_def::num_i_s = 4; Midi_def::Midi_def() { - set_tempo( Moment( 1, 4 ), 60 ); outfile_str_ = "lelie.midi"; + itrans_p_ = 0; + real_vars_p_ = new Assoc; + // ugh + set_tempo( Moment( 1, 4 ), 60 ); } -Midi_def::Midi_def( Midi_def const& midi_c_r ) +Midi_def::Midi_def( Midi_def const& s ) { - whole_seconds_f_ = midi_c_r.whole_seconds_f_; - outfile_str_ = midi_c_r.outfile_str_; + whole_seconds_f_ = s.whole_seconds_f_; + itrans_p_ = s.itrans_p_ ? new Input_translator( *s.itrans_p_ ) : 0; + real_vars_p_ = new Assoc ( *s.real_vars_p_ ); + outfile_str_ = s.outfile_str_; } Midi_def::~Midi_def() { + delete itrans_p_; + delete real_vars_p_; } Real -Midi_def::duration_to_seconds_f( Moment moment ) +Midi_def::duration_to_seconds_f( Moment mom ) { - if (!moment) + if ( !mom ) return 0; - return Moment( whole_seconds_f_ ) * moment; + return Moment( whole_seconds_f_ ) * mom; +} + +Global_translator* +Midi_def::get_global_translator_p() const +{ + return itrans_p_->get_group_performer_p()->global_l(); +} + +Real +Midi_def::get_var( String s ) const +{ + if ( !real_vars_p_->elt_b( s ) ) + error ( "unknown midi variable `" + s + "'" ); + return real_vars_p_->elem( s ); } int @@ -56,14 +81,32 @@ void Midi_def::print() const { #ifndef NPRINT - mtor << "Midi {4/min: " << Real( 60 ) / ( whole_seconds_f_ * 4 ); + mtor << "Midi {"; + mtor << "4/min: " << Real( 60 ) / ( whole_seconds_f_ * 4 ); mtor << "out: " << outfile_str_; + for (Assoc_iter i( *real_vars_p_ ); i.ok(); i++) { + mtor << i.key() << "= " << i.val() << "\n"; + } mtor << "}\n"; #endif } +void +Midi_def::set( Input_translator* itrans_p ) +{ + delete itrans_p_; + itrans_p_ = itrans_p; +} + void Midi_def::set_tempo( Moment moment, int count_per_minute_i ) { whole_seconds_f_ = Moment( count_per_minute_i ) / Moment( 60 ) / moment; } + +void +Midi_def::set_var( String s, Real r ) +{ + real_vars_p_->elem( s ) = r; +} + diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc index 38cfd02349..33e6b2cdb6 100644 --- a/lily/music-iterator.cc +++ b/lily/music-iterator.cc @@ -167,9 +167,9 @@ Chord_iterator::Chord_iterator(Chord const *chord_C) void Chord_iterator::construct_children() { - int j =0; - for(iter(chord_C_->music_p_list_.top(), i); i.ok(); j++, i++) { - + int j = 0; + for(PCursor i(chord_C_->music_p_list_.top()); //, int j = 0; + i.ok(); j++, i++) { Music_iterator * mi = get_iterator_p( i.ptr()); set_translator(mi->report_to_l()->ancestor_l( chord_C_->multi_level_i_ )); if ( mi->ok() ) @@ -182,16 +182,16 @@ void Chord_iterator::do_print() const { #ifndef NPRINT - for (iter(children_p_list_.top(), i); i.ok(); i++ ) { + for (PCursor i(children_p_list_.top()); i.ok(); i++) { i->print(); - } + } #endif } void Chord_iterator::process_and_next(Moment until) { - for (iter(children_p_list_.top(), i); i.ok(); ) { + for (PCursor i(children_p_list_.top()); i.ok(); ) { if (i->next_moment() == until) { i->process_and_next(until); } @@ -212,7 +212,7 @@ Moment Chord_iterator::next_moment()const { Moment next_ = INFTY; - for (iter(children_p_list_.top(), i); i.ok(); i++) + for (PCursor i(children_p_list_.top()); i.ok(); i++) next_ = next_ next_moment() ; return next_; } diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index 9792102b5a..a67aac8a76 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -38,7 +38,7 @@ static Keyword_ent the_key_tab[]={ {"id", ID}, {"in", IN_T}, {"init_end", INIT_END}, - {"requesttranslator", REQUESTENGRAVER}, + {"requesttranslator", REQUESTTRANSLATOR}, {"lyric", LYRIC}, {"key", KEY}, {"melodic" , MELODIC}, diff --git a/lily/note-performer.cc b/lily/note-performer.cc new file mode 100644 index 0000000000..03d53b1f08 --- /dev/null +++ b/lily/note-performer.cc @@ -0,0 +1,71 @@ +/* + note-performer.cc -- implement Note_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#include "note-performer.hh" +#include "translator.hh" +#include "input-translator.hh" +#include "musical-request.hh" +#include "midi-item.hh" +#include "debug.hh" + +IMPLEMENT_IS_TYPE_B1(Note_performer,Performer); +IMPLEMENT_STATIC_NAME(Note_performer); +ADD_THIS_PERFORMER(Note_performer); + +Note_performer::Note_performer() +{ + // is this what we want? + // or do we need to cache/keep note until it has ended? + note_req_l_ = 0; +} + +Note_performer::~Note_performer() +{ +} + +void +Note_performer::do_print() const +{ +#ifndef NPRINT + if ( note_req_l_ ) + note_req_l_->print(); +#endif +} + +void +Note_performer::process_requests() +{ +// if ( when() == off_mom_ ) +// play_event( Note_event( current_l_->pitch() ) ); + +//Midi_note( Melodic_req* melreq_l, int channel_i, bool on_bo ) + + // this is _really_ braindead, but it generates some output + if ( note_req_l_ && note_req_l_->melodic() ) { + Midi_note n( note_req_l_->melodic(), 0, true ); + play_event( &n ); + } + note_req_l_ = 0; +} + +bool +Note_performer::try_request( Request* req_l ) +{ + if ( note_req_l_ ) + return false; + + // huh? +// if (req_l->musical() && (req_l->musical()->note() || req_l->musical()->rest())) +// note_req_l_ = req_l->musical()->rhythmic(); + if ( req_l->musical() && req_l->musical()->note() ) + note_req_l_ = req_l->musical()->melodic(); + else + return false; + + return true; +} + diff --git a/lily/parser.y b/lily/parser.y index 27472489af..2607a2ed08 100644 --- a/lily/parser.y +++ b/lily/parser.y @@ -1,6 +1,17 @@ %{ // -*-Fundamental-*- + +/* + parser.y -- lily parser + + source file of the GNU LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ + #include +// mmm #define MUDELA_VERSION "0.0.61" #include "script-def.hh" @@ -47,7 +58,7 @@ Chord * chord; Duration *duration; Identifier *id; - Input_translator * iregs; + Input_translator* itrans; Music *music; Music_list *musiclist; Score *score; @@ -106,7 +117,7 @@ yylex(YYSTYPE *s, void * v_l) %token GEOMETRIC %token GROUPING %token GROUP -%token REQUESTENGRAVER +%token REQUESTTRANSLATOR %token HSHIFT %token IN_T %token ID @@ -114,9 +125,9 @@ yylex(YYSTYPE *s, void * v_l) %token LYRIC %token KEY %token MELODIC +%token MIDI %token MELODIC_REQUEST %token METER -%token MIDI %token MM_T %token MULTI %token NOTE @@ -161,6 +172,7 @@ yylex(YYSTYPE *s, void * v_l) %token REAL_IDENTIFIER %token INT_IDENTIFIER %token SCORE_IDENTIFIER +%token MIDI_IDENTIFIER %token PAPER_IDENTIFIER %token REQUEST_IDENTIFIER %token REAL @@ -203,7 +215,7 @@ yylex(YYSTYPE *s, void * v_l) %type old_identifier %type symboldef %type symtable symtable_body -%type input_translator_spec input_translator_spec_body +%type input_translator_spec input_translator_spec_body %left PRIORITY @@ -288,6 +300,10 @@ declaration: $$ = new Paper_def_id(*$1, $3, PAPER_IDENTIFIER); delete $1; } + | declarable_identifier '=' midi_block { + $$ = new Midi_def_id(*$1, $3, MIDI_IDENTIFIER); + delete $1; + } | declarable_identifier '=' script_definition { $$ = new Script_id(*$1, $3, SCRIPT_IDENTIFIER); delete $1; @@ -321,7 +337,7 @@ declaration: input_translator_spec: - REQUESTENGRAVER '{' input_translator_spec_body '}' + REQUESTTRANSLATOR '{' input_translator_spec_body '}' { $$ = $3; } ; @@ -350,6 +366,7 @@ input_translator_spec_body: $$->add($3); } ; + /* SCORE */ @@ -405,7 +422,7 @@ paper_block: paper_body: /* empty */ { - $$ = THIS->default_paper(); + $$ = THIS->default_paper(); // paper / video / engrave } | paper_body OUTPUT STRING ';' { $$->outfile_str_ = *$3; delete $3; @@ -434,8 +451,8 @@ midi_block: '{' midi_body '}' { $$ = $3; } ; -midi_body: { - $$ = new Midi_def; +midi_body: /* empty */ { + $$ = THIS->default_midi(); // midi / audio / perform } | midi_body OUTPUT STRING ';' { $$->outfile_str_ = *$3; @@ -444,14 +461,14 @@ midi_body: { | midi_body TEMPO notemode_duration ':' int ';' { $$->set_tempo( $3->length(), $5 ); } + | midi_body input_translator_spec { + $$->set( $2 ); + } | midi_body error { } ; - - - /* MUSIC */ @@ -1068,3 +1085,10 @@ My_lily_parser::default_paper() return id ? id->paperdef(true) : new Paper_def ; } +Midi_def* +My_lily_parser::default_midi() +{ + Identifier *id = lexer_p_->lookup_identifier( "default_midi" ); + return id ? id->mididef(true) : new Midi_def ; +} + diff --git a/lily/performer-group-performer.cc b/lily/performer-group-performer.cc new file mode 100644 index 0000000000..1f09116811 --- /dev/null +++ b/lily/performer-group-performer.cc @@ -0,0 +1,137 @@ +/* + performer-group-performer.cc -- implement Performer_group_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#include "performer-group-performer.hh" +#include "input-translator.hh" +#include "debug.hh" + +IMPLEMENT_IS_TYPE_B2(Performer_group_performer,Performer, Translator); +IMPLEMENT_STATIC_NAME(Performer_group_performer); +ADD_THIS_PERFORMER(Performer_group_performer); + +Performer_group_performer::Performer_group_performer() +{ +} + +Performer_group_performer::~Performer_group_performer() +{ +} + +void +Performer_group_performer::add( Performer *perf_p ) +{ + perf_p_list_.bottom().add(perf_p); + perf_p->daddy_perf_l_ = this; + + if (perf_p->is_type_b(Performer_group_performer::static_name())) { + group_l_arr_.push((Performer_group_performer*)perf_p); + } else { + nongroup_l_arr_ .push(perf_p); + } +} + +Translator* +Performer_group_performer::ancestor_l( int l ) +{ + if (!l || !daddy_perf_l_) + return this; + + return daddy_perf_l_->ancestor_l( l - 1 ); +} + +int +Performer_group_performer::depth_i() const +{ + return daddy_perf_l_->depth_i() + 1; +} + +Translator* +Performer_group_performer::find_get_translator_l( String n,String id ) +{ + Translator * ret=0; + Input_translator* itrans_l= itrans_l_-> recursive_find ( n ); + if (itrans_l ) { + ret = find_performer_l(n,id); + if (!ret) { + Performer_group_performer * group = + itrans_l-> get_group_performer_p(); + + add(group); + ret = group; + + if (group->itrans_l_->is_name_b( n ) ) + ret ->id_str_ = id; + else + return ret->find_get_translator_l(n,id); + + } + } else if (daddy_perf_l_) + ret =daddy_perf_l_->find_get_translator_l(n,id); + else { + warning("Can't find or create `" + n + "' called `" + id + "'\n"); + ret =0; + } + return ret; +} + +Performer_group_performer* +Performer_group_performer::find_performer_l( String n, String id ) +{ + if (name() == n && id_str_ == id) + return this; + Performer_group_performer * r = 0; + for (int i =0; !r && i< group_l_arr_.size(); i++) { + r = group_l_arr_[i]->find_performer_l(n,id); + } + + return r; +} + +Translator* +Performer_group_performer::get_default_interpreter() +{ + // ? + if ( is_bottom_performer_b() ) + return daddy_perf_l_->get_default_interpreter(); + + Performer_group_performer *perf_p= itrans_l_-> + get_default_itrans_l()->get_group_performer_p(); + add(perf_p ); + if (perf_p->is_bottom_performer_b()) + return perf_p; + else + return perf_p->get_default_interpreter(); +} + +bool +Performer_group_performer::is_bottom_performer_b() const +{ + return !itrans_l_->get_default_itrans_l(); +} + +void +Performer_group_performer::process_requests() +{ + PCursor i( perf_p_list_.top() ); + while( i.ok() ) { + Performer* perf_l = i++; + perf_l->process_requests(); + } +} + +bool +Performer_group_performer::try_request( Request* req_l ) +{ +// return Performer::try_request( req_l ); + bool hebbes_b =false; + for (int i =0; !hebbes_b && i < nongroup_l_arr_.size() ; i++) + hebbes_b =nongroup_l_arr_[i]->try_request(req_l); +// if (!hebbes_b) + if ( !hebbes_b && daddy_perf_l_ ) + hebbes_b = daddy_perf_l_->try_request(req_l); + return hebbes_b ; +} diff --git a/lily/performer.cc b/lily/performer.cc new file mode 100644 index 0000000000..9523fc36ce --- /dev/null +++ b/lily/performer.cc @@ -0,0 +1,57 @@ +/* + performer.cc -- declare Performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + + +#include "performer-group-performer.hh" +#include "debug.hh" + +IMPLEMENT_STATIC_NAME(Performer); +IMPLEMENT_IS_TYPE_B(Performer); + +Performer::Performer() +{ + daddy_perf_l_ = 0; +} + +Performer::~Performer() +{ +} + +void +Performer::do_print() const +{ +} + +void +Performer::play_event( Midi_item* l ) +{ + daddy_perf_l_->play_event( l ); +} + +void +Performer::print() const +{ +#ifndef NPRINT + mtor << "\n" << name() << " {"; +// do_print(); + mtor << "}"; +#endif +} + +void +Performer::process_requests() +{ +} + +bool +Performer::try_request( Request* req_l ) +{ +// huh? +// return daddy_perf_l_->try_request( req_l_ ); + return false; +} + diff --git a/lily/score-grav.cc b/lily/score-grav.cc index ee3b325a00..f837dba557 100644 --- a/lily/score-grav.cc +++ b/lily/score-grav.cc @@ -1,5 +1,5 @@ /* - score-reg.cc -- implement Score_engraver + score-grav.cc -- implement Score_engraver source file of the GNU LilyPond music typesetter diff --git a/lily/score-performer.cc b/lily/score-performer.cc new file mode 100644 index 0000000000..944f44e0cc --- /dev/null +++ b/lily/score-performer.cc @@ -0,0 +1,70 @@ +/* + score-performer.cc -- implement Score_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + +#include "score-performer.hh" +#include "input-translator.hh" +#include "midi-item.hh" +#include "midi-stream.hh" +#include "string-convert.hh" +#include "debug.hh" + +IMPLEMENT_IS_TYPE_B1(Score_performer,Performer_group_performer); +IMPLEMENT_STATIC_NAME(Score_performer); +ADD_THIS_PERFORMER(Score_performer); + +Score_performer::Score_performer() +{ + // not so much ugh, as [todo] + *mlog << "MIDI output to " << "lelie.midi" << " ...\n"; + midi_stream_p_ = new Midi_stream( "lelie.midi", + // don-t forget: extra track 0 for tempo/copyright stuff... + //score_l_->staffs_.size() + 1, + 1, + 384 ); +} + +Score_performer::~Score_performer() +{ + delete midi_stream_p_; +} + +Translator* +Score_performer::ancestor_l( int l ) +{ + return Global_translator::ancestor_l( l ); +} + +int +Score_performer::depth_i() const +{ + return Global_translator::depth_i(); +} + +void +Score_performer::play_event( Midi_item* l ) +{ +// file_p_->output( l ); +// cerr << String_convert::bin2hex_str( l->str() ); + // this should be done at staff level, + // cached per staff probably. + // but it generates output... + *midi_stream_p_ << *l; +} + +void +Score_performer::prepare( Moment m ) +{ + now_mom_ = m; +} + +void +Score_performer::process() +{ + process_requests(); + prev_mom_ = now_mom_; +} + diff --git a/lily/score.cc b/lily/score.cc index fd23b08522..320c752caf 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -60,8 +60,35 @@ void Score::process() { paper(); + midi(); } +void +Score::midi() +{ + if (!midi_p_) + return; + + *mlog << "\nCreating elements ..." << endl; //flush; +// pscore_p_ = new PScore(paper_p_); + + Global_translator* score_trans= midi_p_->get_global_translator_p(); + run_translator( score_trans ); + delete score_trans; + + if( errorlevel_i_){ + // should we? hampers debugging. + warning("Errors found, /*not processing score*/"); +// return; + } + print(); + *mlog << endl; +// pscore_p_->process(); + + // output + midi_output(); +} + void Score::paper() { @@ -93,7 +120,6 @@ Score::paper() // output paper_output(); - } /** @@ -219,7 +245,7 @@ Score::paper_output() } void -Score::midi() +Score::midi_output() { #if 0 if (!midi_p_) diff --git a/lily/spanner.cc b/lily/spanner.cc index f66aa49497..5cc28a1bd9 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -18,8 +18,19 @@ void Spanner::do_print()const { #ifndef NPRINT - mtor << "Between col " << - left_col_l_->rank_i() << ", " << right_col_l_->rank_i() ; + mtor << "Between col "; +// huh? this does not work +// mtor << ( left_col_l_ ? left_col_l_->rank_i() : "nop" ); + if ( left_col_l_ ) + mtor << left_col_l_->rank_i(); + else + mtor << "nop"; + mtor << ", "; +// mtor << ( right_col_l_ ? right_col_l_->rank_i() : "nop" ); + if ( right_col_l_ ) + mtor << right_col_l_->rank_i(); + else + mtor << "nop"; if (broken_into_l_arr_.size()) mtor << "with broken pieces\n"; #endif diff --git a/lily/staff-performer.cc b/lily/staff-performer.cc new file mode 100644 index 0000000000..1609a571e1 --- /dev/null +++ b/lily/staff-performer.cc @@ -0,0 +1,38 @@ +/* + staff-performer.cc -- implement Staff_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + + +#include "staff-performer.hh" +#include "translator.hh" +#include "input-translator.hh" +#include "debug.hh" + +IMPLEMENT_STATIC_NAME(Staff_performer); +IMPLEMENT_IS_TYPE_B1(Staff_performer,Performer_group_performer); +ADD_THIS_PERFORMER(Staff_performer); + +Staff_performer::Staff_performer() +{ +} + +Staff_performer::~Staff_performer() +{ +} + +String +Staff_performer::instrument_str() +{ + return Translator::id_str_; +} + +void +Staff_performer::play_event( Midi_item* l ) +{ +// l.track_i_ = midi_track_i_; + Performer::play_event( l ); +} + diff --git a/lily/template6.cc b/lily/template6.cc index 2fbc121679..38344df600 100644 --- a/lily/template6.cc +++ b/lily/template6.cc @@ -1,5 +1,7 @@ #include "proto.hh" #include "plist.tcc" #include "engraver.hh" +#include "performer.hh" IPL_instantiate(Engraver); +IPL_instantiate(Performer); diff --git a/lily/voice-group-performer.cc b/lily/voice-group-performer.cc new file mode 100644 index 0000000000..ac5c6cb7da --- /dev/null +++ b/lily/voice-group-performer.cc @@ -0,0 +1,26 @@ +/* + voice-group-performer.cc -- implement Voice_group_performer + + (c) 1996, 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ + + +#include "voice-group-performer.hh" +#include "translator.hh" +#include "input-translator.hh" +#include "debug.hh" + +//IMPLEMENT_IS_TYPE_B2(Voice_group_performer,Performer, Translator); +IMPLEMENT_IS_TYPE_B1(Voice_group_performer,Performer_group_performer); +IMPLEMENT_STATIC_NAME(Voice_group_performer); +ADD_THIS_PERFORMER(Voice_group_performer); + +Voice_group_performer::Voice_group_performer() +{ +} + +Voice_group_performer::~Voice_group_performer() +{ +} + -- 2.39.5