From: fred Date: Wed, 5 Mar 1997 15:57:37 +0000 (+0000) Subject: lilypond-0.0.39 X-Git-Tag: release/1.5.59~6249 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=821119d60bf33f6918a3a73a63f7ce8dcbb511f9;p=lilypond.git lilypond-0.0.39 --- diff --git a/lily/midi-def.cc b/lily/midi-def.cc new file mode 100644 index 0000000000..5bc6b8fa78 --- /dev/null +++ b/lily/midi-def.cc @@ -0,0 +1,64 @@ +// +// midi-def.cc -- implement midi output +// +// source file of the LilyPond music typesetter +// +// (c) 1997 Jan Nieuwenhuizen + +#include +#include "misc.hh" +#include "midi-def.hh" +#include "debug.hh" + +// classes, alphasorted +// statics +// constructors +// destructor +// routines, alphasorted + +Midi_def::Midi_def() +{ + set_tempo( Moment( 1, 4 ), 60 ); + outfile_str_ = "lelie.midi"; +} + +Midi_def::Midi_def( Midi_def const& midi_c_r ) +{ + whole_seconds_f_ = midi_c_r.whole_seconds_f_; + outfile_str_ = midi_c_r.outfile_str_; +} + +Midi_def::~Midi_def() +{ +} + +Real +Midi_def::duration_to_seconds_f( Moment moment ) +{ + if (!moment) + return 0; + + return Moment( whole_seconds_f_ ) * moment; +} + +int +Midi_def::get_tempo_i( Moment moment ) +{ + return Moment( whole_seconds_f_ ) * Moment( 60 ) * moment; +} + +void +Midi_def::print() const +{ +#ifndef NPRINT + mtor << "Midi {4/min: " << Real( 60 ) / ( whole_seconds_f_ * 4 ); + mtor << "out: " << outfile_str_; + mtor << "}\n"; +#endif +} + +void +Midi_def::set_tempo( Moment moment, int count_per_minute_i ) +{ + whole_seconds_f_ = Moment( count_per_minute_i ) / Moment( 60 ) / moment; +} diff --git a/lily/midi-output.cc b/lily/midi-output.cc new file mode 100644 index 0000000000..7714a99fa8 --- /dev/null +++ b/lily/midi-output.cc @@ -0,0 +1,116 @@ +/* + midioutput.cc -- implement Midi_output + + source file of the LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys , Jan Nieuwenhuizen +*/ + +// "" huh? +#include "time.h" + +#include "proto.hh" +#include "plist.hh" +#include "string.hh" +#include "string-convert.hh" +#include "debug.hh" +#include "score.hh" +#include "staff.hh" +#include "main.hh" +#include "midi-stream.hh" +#include "midi-def.hh" +#include "midi-output.hh" +#include "midi-walker.hh" +#include "midi-item.hh" +#include "staff-column.hh" +#include "musicalrequest.hh" + + +Midi_output::Midi_output(Score* score_l, Midi_def* midi_l ) +{ + midi_l_ = midi_l; + score_l_ = score_l; + + Midi_stream midi_stream(midi_l->outfile_str_, score_l_->staffs_.size(), 384 ); + midi_stream_l_ = &midi_stream; + + header(); + staffs(); +} + +void +Midi_output::do_staff(Staff*st_l,int track_i) +{ + Midi_track midi_track( track_i ); + + // set track name + Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( track_i, 2, 0 ) ); + midi_track.add( Moment( 0.0 ), &track_name ); + + // set instrument :-) + Midi_text instrument_name( Midi_text::INSTRUMENT_NAME, "piano" ); + midi_track.add( Moment( 0.0 ), &instrument_name ); + + // set key, help, where to get key, where to get major/minor? + int accidentals_i = 0; + int minor_i = 0; + + // sorry, wanna test this... + // menuetto in F + if ( ( infile_str_g.index_i( "scsii-menuetto" ) >= 0 ) + || ( infile_str_g.index_i( "standchen" ) >= 0 ) ) + accidentals_i = -1; + // standchen in d + if ( ( infile_str_g.index_i( "standchen" ) >= 0 ) ) + minor_i = 1; + + Midi_key midi_key( accidentals_i, minor_i ); + midi_track.add( Moment( 0.0 ), &midi_key ); + + Midi_tempo midi_tempo( midi_l_->get_tempo_i( Moment( 1, 4 ) ) ); + midi_track.add( Moment( 0.0 ), &midi_tempo ); + + for (Midi_walker w (st_l, &midi_track); w.ok(); w++) + w.process_requests(); + + *midi_stream_l_ << midi_track; +} + +void +Midi_output::header() +{ + Midi_track midi_track( 0 ); + + time_t t = time( 0 ); + + // perhaps multiple text events? + String str = String( "Creator: " ) + get_version() + "\n"; + str += "Generated, at "; + str += ctime( &t ); + str += ", from musical definition: " + infile_str_g; + str += "\n"; + + Midi_text creator( Midi_text::TEXT, str ); + midi_track.add( Moment( 0.0 ), &creator ); + + struct tm* tm_l = gmtime( &t ); + String year_str = String_convert::i2dec_str( 1900 + tm_l->tm_year, 4, '0' ); + + // your copyleft here + str = " Copyleft (o) " + year_str; + str += " Han-Wen Nienhuys , " + " Jan Nieuwenhuizen \n"; + + Midi_text copyleft( Midi_text::COPYRIGHT, str ); + midi_track.add( Moment( 0.0 ), ©left ); + *midi_stream_l_ << midi_track; +} + +void +Midi_output::staffs() +{ + int track_i = 1; + for (iter_top(score_l_->staffs_,i); i.ok(); i++) + do_staff(i, track_i++); +} + diff --git a/lily/registergroup.cc b/lily/registergroup.cc new file mode 100644 index 0000000000..a94f14560a --- /dev/null +++ b/lily/registergroup.cc @@ -0,0 +1,121 @@ +/* + registergroup.cc -- implement Register_group_register + + source file of the LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys +*/ + +#include "proto.hh" +#include "plist.hh" +#include "registergroup.hh" +#include "register.hh" + +bool +Register_group_register::acceptable_request_b(Request* r) +{ + for (iter_top(reg_list_, i); i.ok(); i++) { + if (i->acceptable_request_b(r)) + return true; + } + return false; +} + +void +Register_group_register::set_feature(Features d) +{ + for (iter_top(reg_list_, i); i.ok(); i++) { + i->set_feature(d); + } +} + +void +Register_group_register::pre_move_processing() +{ + for (iter_top(reg_list_, i); i.ok(); i++) + i->pre_move_processing(); +} + +void +Register_group_register::process_requests() +{ + for (iter_top(reg_list_, i); i.ok(); i++) + i->process_requests(); +} + +void +Register_group_register::post_move_processing() +{ + for (iter_top(reg_list_, i); i.ok(); i++) + i->post_move_processing(); +} + +void +Register_group_register::acknowledge_element(Staff_elem_info info) +{ + if (!contains_b(info.origin_reg_l_arr_[0])) + return; + + for (iter_top(reg_list_, i); i.ok(); i++) + i->acknowledge_element(info); +} + +bool +Register_group_register::contains_b(Request_register* reg_l) +{ + bool parent_b = Request_register::contains_b(reg_l); + + if (parent_b) + return true; + for (iter_top(reg_list_, j); j.ok(); j++) + if (j->contains_b(reg_l)) + return true; + return false; +} + + + +bool +Register_group_register::try_request(Request*req_l) +{ + for (iter_top(reg_list_, i); i.ok(); i++) + if (i->try_request(req_l)) + return true; + return false; +} + +void +Register_group_register::add(Request_register *reg_p) +{ + reg_list_.bottom().add(reg_p); + reg_p->daddy_reg_l_ = this; +} + + +Register_group_register::~Register_group_register() +{ + +} + +Request_register * +Register_group_register::get_register_p(Request_register*reg_l) +{ + iterator(reg_list_) reg_cur= reg_list_.find(reg_l); + assert(reg_cur.ok()); + return reg_cur.remove_p(); +} + +void +Register_group_register::terminate_register(Request_register*r_l) +{ + delete get_register_p(r_l); +} + +void +Register_group_register::do_print()const +{ +#ifndef NPRINT + for (iter_top(reg_list_, i); i.ok(); i++) + i->print(); +#endif +} diff --git a/m2m/midi-template.cc b/m2m/midi-template.cc new file mode 100644 index 0000000000..1ffe8d2a1b --- /dev/null +++ b/m2m/midi-template.cc @@ -0,0 +1,26 @@ +// +// midi-template.cc -- implementemplate +// +// copyright 1997 Jan Nieuwenhuizen + +#include "proto.hh" +#include "list.hh" +#include "list.tcc" +#include "cursor.tcc" + +L_instantiate(void *); + +class istream; +class ostream; + +#include "m2m.hh" +#include "plist.hh" +#include "plist.tcc" + +IPL_instantiate(Midi_event); +IPL_instantiate(Midi_track); +PL_instantiate(Midi_voice); +IPL_instantiate(Midi_voice); +IPL_instantiate(Source_file); +IPL_instantiate(Track_column); +