]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.39
authorfred <fred>
Wed, 5 Mar 1997 15:57:37 +0000 (15:57 +0000)
committerfred <fred>
Wed, 5 Mar 1997 15:57:37 +0000 (15:57 +0000)
lily/midi-def.cc [new file with mode: 0644]
lily/midi-output.cc [new file with mode: 0644]
lily/registergroup.cc [new file with mode: 0644]
m2m/midi-template.cc [new file with mode: 0644]

diff --git a/lily/midi-def.cc b/lily/midi-def.cc
new file mode 100644 (file)
index 0000000..5bc6b8f
--- /dev/null
@@ -0,0 +1,64 @@
+//
+// 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;
+}
diff --git a/lily/midi-output.cc b/lily/midi-output.cc
new file mode 100644 (file)
index 0000000..7714a99
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+  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 ), &copyleft );
+    *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 (file)
index 0000000..a94f145
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+  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
+}
diff --git a/m2m/midi-template.cc b/m2m/midi-template.cc
new file mode 100644 (file)
index 0000000..1ffe8d2
--- /dev/null
@@ -0,0 +1,26 @@
+//
+// 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);
+