--- /dev/null
+//
+// midi-def.cc -- implement midi output
+//
+// source file of the LilyPond music typesetter
+//
+// (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
+
+#include <math.h>
+#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;
+}
--- /dev/null
+/*
+ midioutput.cc -- implement Midi_output
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>, Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
+// "" 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 <hanwen@stack.nl>, "
+ " Jan Nieuwenhuizen <jan@digicash.com>\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++);
+}
+
--- /dev/null
+/*
+ registergroup.cc -- implement Register_group_register
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#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
+}
--- /dev/null
+//
+// midi-template.cc -- implementemplate
+//
+// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
+
+#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);
+