+++ /dev/null
-//
-// lily-stream.hh -- part of LilyPond
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-// should i be named Mudela_stream?
-
-#ifndef LILY_STREAM_HH
-#define LILY_STREAM_HH
-
-/// Lily output
-class Lily_stream {
-public:
- Lily_stream( String filename_str );
- ~Lily_stream();
-
- Lily_stream& operator <<( String str );
- Lily_stream& operator <<( Midi_event& midi_event_r );
-
-private:
- void header();
- void open();
- void output( String str );
- void output_wrapped( String str );
-
- ostream* os_p_;
- String filename_str_;
- int indent_i_;
- int column_i_;
- int wrap_column_i_;
- bool comment_mode_b_;
-};
-
-#endif // LILY_STREAM_HH
-
+++ /dev/null
-//
-// mi2mu.hh -- generic mi2mu include file
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#ifndef M2M_HH
-#define M2M_HH
-
-// yes, i know this hurts the dependency calc, however,
-// having includes in headers sucks, and long trial and error
-// include lists also suck.
-// if you want less dependecies, break lib/exe down in smaller
-// modules.
-
-#include <assert.h>
-#include <iostream.h>
-#include <fstream.h>
-#include <limits.h>
-#include <ctype.h>
-#include <time.h>
-
-#include "mi2mu-proto.hh"
-#include "proto.hh"
-#include "plist.hh"
-#include "warn.hh"
-#ifdef mtor
-#undef mtor
-#endif
-
-// arrays are 20% faster, but we have no Pointer_array yet
-#define MEVENT_LIST // does this work?
-#define MVOICE_LIST
-#define TCOL_LIST
-
-#include "string.hh"
-#include "string-convert.hh"
-
-#include "lgetopt.hh"
-
-#include "moment.hh"
-#include "duration-convert.hh"
-#include "duration.hh"
-#include "source-file.hh"
-#include "source.hh"
-
-// mustn-t do, these get touched!
-// #include "fversion.hh"
-// #include "version.hh"
-
-#include "midi-global.hh"
-
-#include "lily-stream.hh"
-#include "midi-event.hh"
-#include "midi-score.hh"
-#include "midi-track.hh"
-#include "midi-voice.hh"
-#include "my-midi-lexer.hh"
-#include "my-midi-parser.hh"
-#include "track-column.hh"
-
-#endif // M2M_HH
-
+++ /dev/null
-//
-// midi-event.hh -- declare midi_event
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#ifndef MIDI_EVENT_HH
-#define MIDI_EVENT_HH
-
-
-// should these:
-// * be Midi_items
-// * be Voice_elements/requests
-// * get a name-change
-// ?
-
-/// (midi_event)
-class Midi_event {
-public:
- Midi_event();
-
- virtual String mudela_str( bool command_mode_bo ) = 0;
- void output_mudela( Lily_stream& lily_stream_r, bool command_mode_bo );
- virtual Moment mom();
-};
-
-class Midi_key : public Midi_event {
-public:
- Midi_key( int accidentals_i, int minor_i );
-
- String notename_str( int pitch_i );
- virtual String mudela_str( bool command_mode_bo );
-
-private:
- int accidentals_i_;
- int minor_i_;
- int key_i_;
-};
-
-class Midi_note : public Midi_event {
-public:
-// int const c0_pitch_i_c_ = 60; // huh?
- int const c0_pitch_i_c_ = 48;
-
- Midi_note( String name_str, Duration dur );
- virtual Moment mom();
- virtual String mudela_str( bool command_mode_bo );
-
-private:
- static bool const simple_plet_b_s = false;
- Duration dur_;
- String name_str_;
-};
-
-class Midi_tempo : public Midi_event {
-public:
- Midi_tempo( int useconds_per_4_i );
-
- int get_tempo_i( Moment moment );
- virtual String mudela_str( bool command_mode_bo );
- int useconds_per_4_i();
-
-private:
- int useconds_per_4_i_;
- Real seconds_per_1_f_;
-};
-
-class Midi_text : public Midi_event {
-public:
- enum Type {
- TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC,
- MARKER, CUE_POINT
- };
- Midi_text( Midi_text::Type type, String str );
- virtual String mudela_str( bool command_mode_bo );
-private:
- Type type_;
- String text_str_;
-};
-
-class Midi_time : public Midi_event {
-public:
- Midi_time( int num_i, int den_i, int division_4_i, int count_32_i );
-
- Duration i2_dur( int time_i, int division_1_i );
- int clocks_1_i();
- int den_i();
- int num_i();
- virtual String mudela_str( bool command_mode_bo );
- Moment bar_mom();
-
-private:
- Real sync_f_;
- Duration sync_dur_;
- int clocks_1_i_;
- int num_i_;
- int den_i_;
-};
-
-#endif // MIDI_EVENT_HH
-
+++ /dev/null
-//
-// midi-global.hh -- declare global (sic) stuff for mi2mu
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#ifndef MIDI_GLOBAL_HH
-#define MIDI_GLOBAL_HH
-
-#include "string.hh"
-
-#define monitor_p_g &cout
-enum Verbose { QUIET_ver, BRIEF_ver, NORMAL_ver, VERBOSE_ver, DEBUG_ver };
-extern Verbose level_ver;
-#if 0 // NPRINT
- // not what i want, all output goes through tors.
- // set verbosity level.
- #define tor( threshold ) if ( 0 ) *monitor_p_g
-#else
- #define tor( threshold ) if ( level_ver >= threshold ) *monitor_p_g
-#endif
-
-extern Sources* source_l_g;
-void message( String message_str, char const* context_ch_C );
-void warning( String message_str, char const* context_ch_C );
-void error( String message_str, char const* context_ch_C );
-
-String mi2mu_version_str();
-
-#endif // MIDI_GLOBAL_HH
-
+++ /dev/null
-//
-// midi-score.hh -- declare midi_score
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#ifndef MIDI_SCORE_HH
-#define MIDI_SCORE_HH
-
-/// (midi_score)
-class Midi_score {
-public:
- Midi_score( int format_i, int tracks_i, int tempo_i );
- ~Midi_score();
-
- void add_track( Midi_track* midi_track_p );
-
- int output_mudela( String filename_str );
- void process();
-
-private:
- Pointer_list<Midi_track*> midi_track_p_list_;
- int format_i_;
- int tracks_i_;
- int tempo_i_;
-};
-
-#endif // MIDI_SCORE_HH
-
+++ /dev/null
-//
-// midi-track.hh -- declare midi_track
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#ifndef MIDI_TRACK_HH
-#define MIDI_TRACK_HH
-
-/// (midi_track)
-class Midi_track {
-public:
- Midi_track( int number_i, String copyright_str, String track_name_str, String instrument_str );
- ~Midi_track();
-
- void add_event( Moment mom, Midi_event* midi_event_p );
- Moment end_mom();
- String id_str();
- String name_str();
- void output_mudela( Lily_stream& lily_stream_r );
- Moment next_begin_mom( Moment now_mom );
- Moment next_end_mom( Moment now_mom );
- void process();
- void set_tempo( int useconds_i );
- void set_time( int num_i, int den_i, int clocks_i, int count_32_i );
- Track_column* tcol_l( Moment mom );
-
- String copyright_str_;
- String instrument_str_;
- String name_str_;
- Midi_tempo* midi_tempo_p_;
- Midi_time* midi_time_p_;
- int number_i_;
-
-private:
-#ifdef MVOICE_LIST
- void add_begin_at( Link_list<Midi_voice*>& open_voices_r, Moment mom );
-#else
- void add_begin_at( Array<Midi_voice*>& open_voices_r, Moment mom );
-#endif
- int check_begin_bar_i( Moment now_mom, int open_bar_i );
- int check_end_bar_i( Moment now_mom, int open_bar_i );
- Midi_voice* get_free_midi_voice_l( Moment mom );
-#ifdef MVOICE_LIST
- void remove_end_at( Link_list<Midi_voice*>& open_voices_r, Moment mom );
-#else
- void remove_end_at( Array<Midi_voice*>& open_voices_r, Moment mom );
-#endif
- void output_mudela_begin_bar( Lily_stream& lily_stream_r, Moment now_mom, int bar_i );
- void output_mudela_rest( Lily_stream& lily_stream_r, Moment begin_mom, Moment end_mom );
- void output_mudela_rest_remain( Lily_stream& lily_stream_r, Moment mom );
-
-#ifdef TCOL_LIST
- Pointer_list<Track_column*> tcol_p_list_;
-#else
- Array<Track_column*> tcol_p_array_;
-#endif
-#ifdef MVOICE_LIST
- Pointer_list<Midi_voice*> midi_voice_p_list_;
-#else
- Array<Midi_voice*> midi_voice_p_array_;
-#endif
-};
-
-#endif // MIDI_TRACK_HH
-
+++ /dev/null
-//
-// midi-voice.hh -- declare midi_voice
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#ifndef MIDI_VOICE_HH
-#define MIDI_VOICE_HH
-
-/// (midi_voice)
-class Midi_voice {
-public:
- Midi_voice( Moment begin_mom );
-
- void add_event( Midi_event* midi_event_p );
- Moment begin_mom();
- Moment end_mom();
-
- String mudela_str( Moment from_mom, Moment to_mom, bool multiple_bo );
-
-private:
- int events_i_;
- Moment end_mom_;
- Moment begin_mom_;
-#ifdef MEVENT_LIST
- Pointer_list<Midi_event*> midi_event_p_list_;
-#else
- Array<Midi_event*> midi_event_p_array_;
-#endif
-};
-
-#endif // MIDI_VOICE_HH
-
+++ /dev/null
-//
-// track-column.hh -- declare Track_column
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#ifndef TRACK_COLUMN_HH
-#define TRACK_COLUMN_HH
-
-/// (tcol)
-class Track_column {
-public:
- Track_column( Moment mom );
-
- void add_event( Midi_event* midi_event_p );
- Moment mom();
-
-//private:
-#ifdef MEVENT_LIST
- Pointer_list<Midi_event*> midi_event_p_list_;
-#else
- Array<Midi_event*> midi_event_p_array_;
-#endif
- Moment mom_;
-};
-
-#endif // TRACK_COLUMN_HH
-
+++ /dev/null
-//
-// lily-stream.cc
-//
-// source file of the LilyPond music typesetter
-//
-// (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-// should i be named Mudela_stream?
-
-#include "mi2mu.hh"
-
-Lily_stream::Lily_stream( String filename_str )
-{
- filename_str_ = filename_str;
- os_p_ = 0;
- indent_i_ = 0;
- comment_mode_b_ = false;
- column_i_ = 0;
- wrap_column_i_ = 60;
- open();
- header();
-}
-
-Lily_stream::~Lily_stream()
-{
- delete os_p_;
- if ( indent_i_ )
- warning( "lily indent level: " + String( indent_i_ ));
-}
-
-Lily_stream&
-Lily_stream::operator <<( String str )
-{
- static String word_sep_str = "{} \t\n";
- while ( str.length_i() ) {
- int i = str.index_any_i( word_sep_str ) + 1;
- if ( !i )
- i = str.length_i();
- String word = str.left_str( i );
- str = str.mid_str( i, str.length_i() );
- output_wrapped( word );
- }
- return *this;
-}
-
-Lily_stream&
-Lily_stream::operator <<( Midi_event& midi_event_r )
-{
- midi_event_r.output_mudela( *this, false );
- *os_p_ << flush;
- return *this;
-}
-
-void
-Lily_stream::header()
-{
- *os_p_ << "% Creator: " << mi2mu_version_str() << "\n";
- *os_p_ << "% Automatically generated, at ";
- time_t t( time( 0 ) );
- *os_p_ << ctime( &t );
- *os_p_ << "% from input file: ";
- *os_p_ << midi_parser_l_g->filename_str_;
- *os_p_ << "\n\n";
- // ugh
- *os_p_ << "\\version \"0.1.0\";\n";
-}
-
-void
-Lily_stream::open()
-{
- os_p_ = new ofstream( filename_str_ );
- if ( !*os_p_ )
- error ( "can't open `" + filename_str_ + "\'");
-}
-
-void
-Lily_stream::output( String str )
-{
- for ( int i = 0; i < str.length_i(); i++ ) {
- char c = str[ i ];
- switch ( c ) {
- case '{' :
- case '<' :
- indent_i_++;
- column_i_++;
- *os_p_ << c;
- break;
- case '}' :
- case '>' :
- assert( indent_i_ );
- indent_i_--;
- column_i_++;
- *os_p_ << c;
- break;
- case '%' :
- comment_mode_b_ = true;
- *os_p_ << c;
- column_i_++;
- break;
- case '\t' :
- column_i_ += 8;
- *os_p_ << c;
- break;
- case '\n' :
- *os_p_ << endl;
- *os_p_ << String( '\t', indent_i_ );
- column_i_ = indent_i_ * 8;
- comment_mode_b_ = false;
- break;
- default :
- column_i_++;
- *os_p_ << c;
- break;
- }
- }
-}
-
-void
-Lily_stream::output_wrapped( String str )
-{
- // enough room left -> doit
- if ( column_i_ + str.length_i() <= wrap_column_i_ ) {
- output( str );
- return;
- }
-
- // we're at BOL already; this will never fit -> doit
- if ( column_i_ == indent_i_ * 8 ) {
- output( str );
- return;
- }
-
- // ok, let's wrap
- // preserve comment mode
- if ( comment_mode_b_ )
- output( String( "\n%" ) );
- else
- output( String( "\n" ) );
-
- output( str );
-}
-
-
+++ /dev/null
-//
-// midi-event.cc -- implement Midi_event
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#include "mi2mu.hh"
-
-Midi_event::Midi_event()
-{
-}
-
-Moment
-Midi_event::mom()
-{
- return Moment( 0 );
-}
-
-void
-Midi_event::output_mudela( Lily_stream& lily_stream_r, bool command_mode_bo )
-{
- lily_stream_r << mudela_str( command_mode_bo ) << String( " " );
-}
-
-Midi_key::Midi_key( int accidentals_i, int minor_i )
-{
- accidentals_i_ = accidentals_i;
- minor_i_ = minor_i;
- if ( accidentals_i >= 0 )
- key_i_ = ( ( accidentals_i % 7 )[ "cgdaebf" ] - 'a' - 2 ) % 7;
- else
- key_i_ = ( ( -accidentals_i % 7 )[ "cfbeadg" ] - 'a' - 2 ) % 7;
-}
-
-String
-Midi_key::mudela_str( bool command_mode_bo )
-{
- 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
- + String('"') + "; % not supported yet\n";
- return str;
-}
-
-String
-Midi_key::notename_str( int pitch_i )
-{
- // this may seem very smart,
- // but it-s only an excuse not to read a notename table
-
- // major scale: do-do
- // minor scale: la-la ( = + 5 )
- static int notename_i_a[ 12 ] = { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6 };
- int notename_i = notename_i_a[ ( minor_i_ * 5 + pitch_i ) % 12 ];
-
- static int accidentals_i_a[ 12 ] = { 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 };
- int accidental_i = accidentals_i_a[ minor_i_ * 5 + pitch_i % 12 ];
- if ( accidental_i && ( accidentals_i_ < 0 ) ) {
- accidental_i = - accidental_i;
- notename_i = ( notename_i + 1 ) % 7;
- }
-
- String notename_str = (char)( ( ( notename_i + 2 ) % 7 ) + 'a' );
- while ( accidental_i-- > 0 )
- notename_str += "is";
- accidental_i++;
- while ( accidental_i++ < 0 )
- if ( ( notename_str == "a" ) || ( notename_str == "e" ) )
- notename_str += "s";
- else
- notename_str += "es";
- accidental_i--;
-
- String de_octavate_str = String( '\'', ( Midi_note::c0_pitch_i_c_ + 11 - pitch_i ) / 12 );
- String octavate_str = String( '\'', ( pitch_i - Midi_note::c0_pitch_i_c_ ) / 12 );
- return de_octavate_str + notename_str + octavate_str;
-}
-
-// statics Midi_note
-/*
- this switch can be used to write simple plets like
- c4*2/3
- as
- \plet 2/3; c4 \plet 1/1;
- */
-bool const Midi_note::simple_plet_b_s = true;
-
-Midi_note::Midi_note( String name_str, Duration dur )
-{
- // do i want pitch too?
- dur_ = dur;
- name_str_ = name_str;
-}
-
-String
-Midi_note::mudela_str( bool command_mode_bo )
-{
-// assert( !command_mode_bo );
- if ( !dur_.type_i_ )
- return "";
-
- if ( simple_plet_b_s )
- return name_str_ + Duration_convert::dur2_str( dur_ );
-
- //ugh
- String str;
- if ( dur_.plet_b() )
- str += String( "\\plet " )
- + String_convert::i2dec_str( dur_.plet_.iso_i_, 0, 0 )
- + "/"
- + String_convert::i2dec_str( dur_.plet_.type_i_, 0, 0 )
- + "; ";
-
- str += name_str_;
-
- Duration dur = dur_;
- dur.set_plet( 1,1 );
- str += Duration_convert::dur2_str( dur );
-
- if ( dur_.plet_b() )
- str += String( " \\plet 1/1;" );
-
- return str;
-}
-
-Moment
-Midi_note::mom()
-{
- return Duration_convert::dur2_mom( dur_ );
-}
-
-Midi_tempo::Midi_tempo( int useconds_per_4_i )
-{
- useconds_per_4_i_ = useconds_per_4_i;
- seconds_per_1_f_ = (Real)useconds_per_4_i_ * 4 / 1e6;
-}
-
-String
-Midi_tempo::mudela_str( bool command_mode_bo )
-{
-// assert( command_mode_bo );
- if ( !command_mode_bo )
- return "";
- String str = "\\tempo 4:";
- str += String( get_tempo_i( Moment( 1, 4 ) ) );
- str += ";";
- return str;
-}
-
-int
-Midi_tempo::useconds_per_4_i()
-{
- return useconds_per_4_i_;
-}
-
-int
-Midi_tempo::get_tempo_i( Moment moment )
-{
- return Moment( 60 ) / moment / Moment( seconds_per_1_f_ );
-}
-
-Midi_text::Midi_text( Midi_text::Type type, String text_str )
-{
- type_ = type;
- text_str_ = text_str;
-}
-
-String
-Midi_text::mudela_str( bool command_mode_bo )
-{
- (void)command_mode_bo;
- if ( !text_str_.length_i()
- || ( text_str_.length_i() != (int)strlen( text_str_.ch_C() ) ) )
- return "";
-
- return "% " + text_str_ + "\n";
-}
-
-Midi_time::Midi_time( int num_i, int den_i, int clocks_4_i, int count_32_i )
-{
- sync_dur_.type_i_ = 8;
-
- sync_f_ = 1.0;
- if ( count_32_i != 8 )
- warning( String( "#32 in quarter: " ) + String( count_32_i ));
- num_i_ = num_i;
- den_i_ = den_i;
- clocks_1_i_ = clocks_4_i * 4;
-}
-
-Moment
-Midi_time::bar_mom()
-{
- Duration d;
- d.type_i_ = 1 << den_i_ ;
- return Moment( num_i_ ) * Duration_convert::dur2_mom( d );
-}
-
-int
-Midi_time::clocks_1_i()
-{
- return clocks_1_i_;
-}
-
-int
-Midi_time::den_i()
-{
- return den_i_;
-}
-
-int
-Midi_time::num_i()
-{
- return num_i_;
-}
-
-String
-Midi_time::mudela_str( bool command_mode_bo )
-{
- String str = "\\meter "
- + String( num_i_ ) + "/" + String( 1 << den_i_ )
- + ";";
- return str;
-}
-
+++ /dev/null
-//
-// midi-score.cc -- implement Midi_score
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#include "mi2mu.hh"
-
-Midi_score::Midi_score( int format_i, int tracks_i, int tempo_i )
-{
- format_i_ = format_i;
- tracks_i_ = tracks_i;
- tempo_i_ = tempo_i;
-}
-
-Midi_score::~Midi_score()
-{
-}
-
-void
-Midi_score::add_track( Midi_track* midi_track_p )
-{
- midi_track_p_list_.bottom().add( midi_track_p );
-}
-
-int
-Midi_score::output_mudela( String filename_str )
-{
- tor( NORMAL_ver ) << "Lily output to " << filename_str << " ..." << endl;
-
- // ugh, ugly midi type 1 fix
- if ( ( midi_track_p_list_.size() == 1 ) && !midi_track_p_list_.top()->number_i_ )
- midi_track_p_list_.top()->number_i_ = 1;
-
- int track_i = 0;
- Lily_stream lily_stream( filename_str );
- for ( PCursor<Midi_track*> i( midi_track_p_list_.top() ); i.ok(); i++ ) {
- tor( NORMAL_ver ) << "track " << track_i++ << ": " << flush;
- i->output_mudela( lily_stream );
- lily_stream << "\n";
- tor( NORMAL_ver ) << endl;
- }
-
- lily_stream << "\\score{\n";
- lily_stream << " < \\multi 3;\n";
- for ( PCursor<Midi_track*> i( midi_track_p_list_.top() ); i.ok(); i++ ) {
- if ( ( midi_track_p_list_.size() != 1 )
- && ( i == midi_track_p_list_.top() ) )
- continue;
- lily_stream << "\\melodic{ ";
- lily_stream << "\\$" << i->id_str();
- lily_stream << " }\n";
- }
- lily_stream << ">\n";
-
- lily_stream << "\\paper{";
- lily_stream << "unitspace = 20.0\\mm;";
- lily_stream << "}\n";
-
- lily_stream << "\\midi{";
- // not use silly 0 track
- midi_track_p_list_.bottom()->midi_tempo_p_->output_mudela( lily_stream, true );
- lily_stream << "}\n";
-
- lily_stream << "}\n";
-
- return 0;
-}
-
-void
-Midi_score::process()
-{
- int track_i = 0;
- for ( PCursor<Midi_track*> i( midi_track_p_list_.top() ); i.ok(); i++ ) {
- tor( NORMAL_ver ) << "track " << track_i++ << ": " << flush;
- i->process();
- tor( NORMAL_ver ) << endl;
- }
-}
-
+++ /dev/null
-//
-// midi-track.cc -- implement Midi_track
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#include "mi2mu.hh"
-
-Midi_track::Midi_track( int number_i, String copyright_str, String track_name_str, String instrument_str )
-{
- number_i_ = number_i;
- copyright_str_ = copyright_str;
- instrument_str_ = instrument_str;
- name_str_ = track_name_str;
- midi_time_p_ = new Midi_time( 4, 2, 24, 8 );
- midi_tempo_p_ = new Midi_tempo( 1000000 );
-#ifdef TCOL_LIST
- tcol_p_list_.bottom().add( new Track_column( Moment( 0 ) ) );
-#else
- tcol_p_array_.push( new Track_column( Moment( 0 ) ) );
-#endif
-}
-
-Midi_track::~Midi_track()
-{
- delete midi_time_p_;
- delete midi_tempo_p_;
-}
-
-#ifdef MVOICE_LIST
-void
-Midi_track::add_begin_at( Link_list<Midi_voice*>& open_voices_r, Moment mom )
-{
- for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ )
- if ( i->begin_mom() == mom ) {
- tor( DEBUG_ver ) << "open_voices (" << open_voices_r.size() << "): +1\n";
- open_voices_r.bottom().add( *i );
- }
-}
-#else
-void
-Midi_track::add_begin_at( Array<Midi_voice*>& open_voices_r, Moment mom )
-{
- for ( int i = 0; i < midi_voice_p_array_.size(); i++ )
- if ( midi_voice_p_array_[ i ]->begin_mom() == mom ) {
- tor( DEBUG_ver ) << "open_voices (" << open_voices_r.size() << "): +1\n";
- open_voices_r.push( midi_voice_p_array_[ i ] );
- }
-}
-#endif
-
-void
-Midi_track::add_event( Moment mom, Midi_event* midi_event_p )
-{
- if ( ! midi_event_p )
- return;
- tcol_l( mom - midi_event_p->mom() )->add_event( midi_event_p );
-}
-
-int
-Midi_track::check_begin_bar_i( Moment now_mom, int open_bar_i )
-{
- Moment bar_mom = midi_time_p_->bar_mom();
- int bar_i = (int)( now_mom / bar_mom ) + 1;
- if ( bar_i > open_bar_i ) {
- tor( NORMAL_ver ) << '[' << flush;
- return bar_i;
- }
- return 0;
-}
-
-int
-Midi_track::check_end_bar_i( Moment now_mom, int open_bar_i )
-{
- Moment bar_mom = midi_time_p_->bar_mom();
- int bar_i = (int)( now_mom / bar_mom ) + 1;
- if ( bar_i > open_bar_i ) {
- tor( NORMAL_ver ) << ']' << flush;
- return bar_i;
- }
- return open_bar_i;
-}
-
-Moment
-Midi_track::end_mom()
-{
- // heu..
- Moment mom = 0.0;
-#ifdef MVOICE_LIST
- for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ )
- mom = i->end_mom() >? mom;
-#else
- for ( int i = 0; i < midi_voice_p_array_.size(); i++ )
- mom = midi_voice_p_array_[ i ]->end_mom() >? mom;
-#endif
- return mom;
-}
-
-Midi_voice*
-Midi_track::get_free_midi_voice_l( Moment mom )
-{
-#ifdef MVOICE_LIST
- Real f = mom;
- for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ ) {
- Real e = i->end_mom();
- if ( i->end_mom() == mom )
- return *i;
- }
-
- Midi_voice* midi_voice_p = new Midi_voice( mom );
- Midi_voice* midi_voice_l = midi_voice_p;
- midi_voice_p_list_.bottom().add( midi_voice_p );
- return midi_voice_l;
-#else
- Real f = mom;
- for ( int i = 0; i < midi_voice_p_array_.size(); i++ ) {
- Real e = i->end_mom();
- if ( midi_voice_p_array_[ i ]->end_mom() == mom )
- return midi_voice_p_array_[ i ];
- }
-
- Midi_voice* midi_voice_p = new Midi_voice( mom );
- Midi_voice* midi_voice_l = midi_voice_p;
- midi_voice_p_array_.push( midi_voice_p );
- return midi_voice_l;
-#endif
-}
-
-String
-Midi_track::id_str()
-{
- String str = name_str();
- for ( int i = 0; i < str.length_i(); i++ )
- if ( ( !i && !isalpha( str[ i ] ) )
- || !isalnum( str[ i ] ) )
- *( str.ch_l() + i ) = '_';
- return str;
-}
-
-String
-Midi_track::name_str()
-{
- if ( name_str_.length_i() )
- return name_str_;
- return String( "track" ) + String( number_i_ );
-}
-
-Moment
-Midi_track::next_begin_mom( Moment now_mom )
-{
-// Moment begin_mom = Midi_track::end_mom() + 1;
- Moment begin_mom = Midi_track::end_mom();
-#ifdef MVOICE_LIST
- for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ )
- if ( i->begin_mom() > now_mom )
- begin_mom = begin_mom <? i->begin_mom();
-#else
- for ( int i = 0; i < midi_voice_p_array_.size(); i++ )
- if ( midi_voice_p_array_[ i ]->begin_mom() > now_mom )
- begin_mom = begin_mom <? midi_voice_p_array_[ i ]->begin_mom();
-#endif
- return begin_mom;
-}
-
-Moment
-Midi_track::next_end_mom( Moment now_mom )
-{
- Moment end_mom = Midi_track::end_mom();
-#ifdef MVOICE_LIST
- for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ )
- if ( i->end_mom() > now_mom )
- end_mom = end_mom <? i->end_mom();
-#else
- for ( int i = 0; i < midi_voice_p_array_.size(); i++ )
- if ( midi_voice_p_array_[ i ]->end_mom() > now_mom )
- end_mom = end_mom <? midi_voice_p_array_[ i ]->end_mom();
-#endif
- return end_mom;
-}
-
-void
-Midi_track::process()
-{
- /*
- columns to voices
- */
-// int bar_i = 1;
- int bar_i = 0;
-#ifdef TCOL_LIST
- for ( PCursor<Track_column*> i( tcol_p_list_.top() ); i.ok(); i++ ) {
- int begin_bar_i = check_begin_bar_i( i->mom(), bar_i );
- if ( begin_bar_i )
- tor( NORMAL_ver ) << begin_bar_i << flush;
- while ( i->midi_event_p_list_.size() )
- get_free_midi_voice_l( i->mom() )->add_event( i->midi_event_p_list_.top().remove_p() );
- bar_i = check_end_bar_i( i->mom(), bar_i );
- }
-#else
- for ( int i = 0; i < tcol_p_array_.size(); i++ ) {
- Track_column* tcol_l = tcol_p_array_[ i ];
- int begin_bar_i = check_begin_bar_i( tcol_l->mom(), bar_i );
- if ( begin_bar_i )
- tor( NORMAL_ver ) << begin_bar_i << flush;
-#ifdef MEVENT_LIST
- while ( tcol_l->midi_event_p_list_.size() )
- get_free_midi_voice_l( tcol_l->mom() )->add_event( tcol_l->midi_event_p_list_.top().remove_p() );
-#else
- // what's efficient here?
-#if 0 // heu, what's different here?
- while ( tcol_l->midi_event_p_array_.size() ) {
- get_free_midi_voice_l( tcol_l->mom() )->add_event( tcol_l->midi_event_p_array_[ 0 ] );
- tcol_l->midi_event_p_array_.del( 0 );
- }
-#else
- for ( int j = 0; j < tcol_l->midi_event_p_array_.size(); j++ ) {
- get_free_midi_voice_l( tcol_l->mom() )->add_event( tcol_l->midi_event_p_array_[ j ] );
- tcol_l->midi_event_p_array_[ j ] = 0;
- }
- tcol_l->midi_event_p_array_.clear();
-#endif
-#endif
- bar_i = check_end_bar_i( tcol_l->mom(), bar_i );
- }
-#endif
-
- tor( DEBUG_ver ) << "ends: " << endl;
- int n = 0;
-#ifdef MVOICE_LIST
- for ( PCursor<Midi_voice*> i( midi_voice_p_list_.top() ); i.ok(); i++ )
- tor( VERBOSE_ver ) << "voice " << n++ << ": " << i->end_mom() << endl;
-#else
- for ( int i = 0; i < midi_voice_p_array_.size(); i++ )
- tor( VERBOSE_ver ) << "voice " << n++ << ": " << midi_voice_p_array_[ i ]->end_mom() << endl;
-#endif
- tor( DEBUG_ver ) << ":sdne" << endl;
-}
-
-void
-Midi_track::output_mudela( Lily_stream& lily_stream_r )
-{
- lily_stream_r << "$" << id_str() << " = \\melodic{\n";
- lily_stream_r << "% midi copyright:" << copyright_str_ << "\n";
- lily_stream_r << "% instrument:" << instrument_str_ << "\n";
-// int bar_i = 1;
- int bar_i = 0;
-
-#ifdef MVOICE_LIST
- Link_list<Midi_voice*> open_voices;
-#else
- Array<Midi_voice*> open_voices;
-#endif
- Moment now_mom = 0.0;
- Real now_f = now_mom;
- Real begin_f = 0;
- Real end_f = end_mom();
- Real then_f;
-
- /*
- now we step through time while writing all voices
-
- we can only output time slices that have a constant
- number of open voices; each begin or end of a voice
- starts or ends a chord or multivoice
-
- [todo]
- voice defragmentation/concatenation could make this
- lost blonder
- */
-
- bool start_of_track_bo = true;
-
- /// ugh, avoid status track 0 full of rests...
- while ( number_i_ && ( now_mom < end_mom() ) ) {
- int begin_bar_i = check_begin_bar_i( now_mom, bar_i );
- if ( begin_bar_i )
- output_mudela_begin_bar( lily_stream_r, now_mom, begin_bar_i );
- add_begin_at( open_voices, now_mom );
-
- Moment begin_mom = next_begin_mom( now_mom );
-
- if ( begin_bar_i )
- tor( NORMAL_ver ) << begin_bar_i << flush;
-
- Moment end_mom = next_end_mom( now_mom );
- Moment then_mom = 0.0;
- if ( ( begin_mom > now_mom ) && ( begin_mom < end_mom ) )
- then_mom = begin_mom;
- else
- then_mom = end_mom;
-
- tor( DEBUG_ver ) << "begin: " << begin_mom << " end: " << end_mom << endl;
- tor( DEBUG_ver ) << "slice: " << now_mom << ", " << then_mom << endl;
-
- now_f = now_mom;
- begin_f = begin_mom;
- end_f = end_mom;
- then_f = then_mom;
-
-// ugh, rests
-// checking for no open voice does not work for initial rests.
-// for some reason the voice is open, but does not procuce notes?
- if ( open_voices.size() > 1 )
- lily_stream_r << "< ";
- if ( start_of_track_bo ) {
- start_of_track_bo = false;
- String str;
-#ifdef MVOICE_LIST
- for ( PCursor<Midi_voice*> i( open_voices.top() ); i.ok(); i++ )
- lily_stream_r << i->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
-#else
- for ( int i = 0; i < open_voices.size(); i++ )
- lily_stream_r << open_voices[ i ]->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
-#endif
- if ( str.length_i() )
- lily_stream_r << str;
- else
- output_mudela_rest( lily_stream_r, now_mom, then_mom );
- }
- else {
-#ifdef MVOICE_LIST
- for ( PCursor<Midi_voice*> i( open_voices.top() ); i.ok(); i++ )
- lily_stream_r << i->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
-#else
- for ( int i = 0; i < open_voices.size(); i++ )
- lily_stream_r << open_voices[ i ]->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
-#endif
- if ( !open_voices.size() )
- output_mudela_rest( lily_stream_r, now_mom, then_mom );
- }
-// *lily_stream_r.os_p_ << flush;
-
- if ( open_voices.size() > 1 )
- lily_stream_r << "> ";
- remove_end_at( open_voices, then_mom );
-
- bar_i = check_end_bar_i( now_mom, bar_i );
-
- now_mom = then_mom;
- }
-// bar_i++;
-// tor( NORMAL_ver ) << '[' << bar_i << ']' << flush;
-
- lily_stream_r << "} % " << name_str() << "\n";
-}
-
-
-void
-Midi_track::output_mudela_begin_bar( Lily_stream& lily_stream_r, Moment now_mom, int bar_i )
-{
- Moment bar_mom = midi_time_p_->bar_mom();
- Moment into_bar_mom = now_mom - Moment( bar_i - 1 ) * bar_mom;
- if ( bar_i > 1 ) {
- if ( !into_bar_mom )
- lily_stream_r << "|\n";
- }
- lily_stream_r << "% " << String_convert::i2dec_str( bar_i, 0, ' ' );
- if ( into_bar_mom )
- lily_stream_r << ":" << Duration_convert::dur2_str( Duration_convert::mom2_dur( into_bar_mom ) );
- lily_stream_r << "\n";
-}
-
-
-void
-Midi_track::output_mudela_rest( Lily_stream& lily_stream_r, Moment begin_mom, Moment end_mom )
-{
- Moment bar_mom = midi_time_p_->bar_mom();
- Moment now_mom = begin_mom;
-
- int begin_bar_i = (int)( now_mom / bar_mom ) + 1;
- int end_bar_i = (int)( end_mom / bar_mom ) + 1;
-
- if ( end_bar_i == begin_bar_i ) {
- output_mudela_rest_remain( lily_stream_r, end_mom - begin_mom );
- return;
- }
-
- // multiple bars involved
- int bar_i = (int)( now_mom / bar_mom ) + 1;
-
- //fill current bar
- Moment begin_bar_mom = Moment( begin_bar_i - 1 ) * bar_mom;
- if ( now_mom > begin_bar_mom ) {
- int next_bar_i = (int)( now_mom / bar_mom ) + 2;
- Moment next_bar_mom = Moment( next_bar_i - 1 ) * bar_mom;
- assert( next_bar_mom <= end_mom );
-
- Moment remain_mom = next_bar_mom - now_mom;
- if ( remain_mom > Moment( 0 ) ) {
- output_mudela_rest_remain( lily_stream_r, remain_mom );
- now_mom += remain_mom;
- }
-
- bar_i = check_end_bar_i( now_mom, bar_i );
- }
-
- // fill whole bars
- int count_i = end_bar_i - bar_i;
- for ( int i = 0; i < count_i; i++ ) {
- int begin_bar_i = check_begin_bar_i( now_mom, bar_i );
- if ( begin_bar_i )
- output_mudela_begin_bar( lily_stream_r, now_mom, begin_bar_i );
- lily_stream_r << "r1 ";
-// *lily_stream_r.os_p_ << flush;
- if ( begin_bar_i )
- tor( NORMAL_ver ) << begin_bar_i << flush;
- bar_i = check_end_bar_i( now_mom, bar_i );
- now_mom += bar_mom;
- }
-
- // use "int i" here, and gcc 2.7.2 hits internal compiler error
- int ii = check_begin_bar_i( now_mom, bar_i );
- if ( ii )
- output_mudela_begin_bar( lily_stream_r, now_mom, ii );
-
-// bar_i = check_end_bar_i( now_mom, bar_i );
-
- Moment remain_mom = end_mom - Moment( end_bar_i - 1 ) * bar_mom;
- if ( remain_mom > Moment( 0 ) ) {
- output_mudela_rest_remain( lily_stream_r, remain_mom );
- now_mom += remain_mom;
- }
- assert( now_mom == end_mom );
-}
-
-void
-Midi_track::output_mudela_rest_remain( Lily_stream& lily_stream_r, Moment mom )
-{
- if ( Duration_convert::no_quantify_b_s ) {
- Duration dur = Duration_convert::mom2_dur( mom );
- lily_stream_r << "r" << dur.str() << " ";
-// assert( mom == dur.mom() );
- assert( mom == dur.length() );
- return;
- }
-
- Duration dur = Duration_convert::mom2standardised_dur( mom );
- if ( dur.type_i_ )
- lily_stream_r << "r" << dur.str() << " ";
-}
-
-
-#ifdef MVOICE_LIST
-void
-Midi_track::remove_end_at( Link_list<Midi_voice*>& open_voices_r, Moment mom )
-{
- for ( PCursor<Midi_voice*> i( open_voices_r.top() ); i.ok(); i++ )
- if ( i->end_mom() <= mom ) {
- tor( DEBUG_ver ) << "open_voices (" << open_voices_r.size() << "): -1\n";
- i.remove_p();
- if ( !i.ok() )
- break;
- }
-}
-#else
-void
-Midi_track::remove_end_at( Array<Midi_voice*>& open_voices_r, Moment mom )
-{
- for ( int i = 0; i < open_voices_r.size(); i++ )
- if ( midi_voice_p_array_[ i ]->end_mom() <= mom ) {
- tor( DEBUG_ver ) << "open_voices (" << open_voices_r.size() << "): -1\n";
- open_voices_r[ i ] = 0;
-// open_voices_r.del( i-- );
- open_voices_r.del( i );
- }
-}
-#endif
-
-void
-Midi_track::set_tempo( int useconds_per_4_i )
-{
- delete midi_tempo_p_;
- midi_tempo_p_ = new Midi_tempo( useconds_per_4_i );
-}
-
-void
-Midi_track::set_time( int num_i, int den_i, int clocks_i, int count_32_i )
-{
- delete midi_time_p_;
- midi_time_p_ = new Midi_time( num_i, den_i, clocks_i, count_32_i );
-}
-
-Track_column*
-Midi_track::tcol_l( Moment mom )
-{
-#ifdef TCOL_LIST
- for ( PCursor<Track_column*> i( tcol_p_list_.top() ); i.ok(); i++ ) {
- if ( i->mom() > mom ) { //not used, let's use array!
-// assert( 0 );
-// 97-07-21; it's used now! cannot use array
- Track_column* tcol_p = new Track_column( mom );
- i.insert( tcol_p );
- return tcol_p;
- }
- if ( i->mom() == mom )
- return *i;
- }
-
- Track_column* tcol_p = new Track_column( mom );
- tcol_p_list_.bottom().add( tcol_p );
- return tcol_p;
-#elif 0
- for ( int i = 0; i < tcol_p_array_.size(); i++ )
- if ( tcol_p_array_[ i ]->mom() == mom )
- return tcol_p_array_[ i ];
-
- Track_column* tcol_p = new Track_column( mom );
- tcol_p_array_.push( tcol_p );
- return tcol_p;
-#else
- /*
- as "insert" is never called, the right column will
- always be found, unless mom > tcol_p_array[ i ]->mom().
- */
- int upper_i = max( 0, tcol_p_array_.size() - 1 );
- int lower_i = 0;
- int i = upper_i;
- while ( 1 ) {
- Moment i_mom = tcol_p_array_[ i ]->mom();
- if ( i_mom == mom )
- return tcol_p_array_[ i ];
- if ( mom < i_mom )
- upper_i = i;
- else
- lower_i = i;
- if ( ( upper_i == lower_i ) || ( i == tcol_p_array_.size() - 1 ) ) {
-// huh? assert ( upper_i == tcol_p_array_.size() );
- Track_column* tcol_p = new Track_column( mom );
- tcol_p_array_.push( tcol_p );
- return tcol_p;
- }
- i = ( upper_i + lower_i + 1 ) / 2;
- }
- assert( 0 );
- return 0;
-#endif
-}
-
+++ /dev/null
-//
-// midi-voice.cc -- implement midi_voice
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#include "mi2mu.hh"
-
-Midi_voice::Midi_voice( Moment begin_mom )
-{
- begin_mom_ = begin_mom;
- end_mom_ = begin_mom;
- events_i_ = 0;
-}
-
-void
-Midi_voice::add_event( Midi_event* midi_event_p )
-{
-#ifdef MEVENT_LIST
- midi_event_p_list_.bottom().add( midi_event_p );
-#else
- midi_event_p_array_.push( midi_event_p );
-#endif
-}
-
-Moment
-Midi_voice::begin_mom()
-{
- return begin_mom_;
-}
-
-Moment
-Midi_voice::end_mom()
-{
-#ifdef MEVENT_LIST
-// if ( events_i_ == midi_event_p_list_.length_i() )
- if ( events_i_ == midi_event_p_list_.size() )
- return end_mom_;
- Moment now_mom = begin_mom_;
- tor( DEBUG_ver ) << now_mom << ", ";
- for ( PCursor<Midi_event*> i( midi_event_p_list_.top() ); i.ok(); i++ ) {
- tor( DEBUG_ver ) << now_mom << ", ";
- now_mom += i->mom();
- }
- tor( DEBUG_ver ) << endl;
- end_mom_ = now_mom;
-// events_i_ = midi_event_p_list_.length_i();
- events_i_ = midi_event_p_list_.size();
- return end_mom_;
-#else
- if ( events_i_ == midi_event_p_array_.size() )
- return end_mom_;
- Moment now_mom = begin_mom_;
- tor( DEBUG_ver ) << now_mom << ", ";
- for ( int i = 0; i < midi_event_p_array_.size(); i++ ) {
- tor( DEBUG_ver ) << now_mom << ", ";
- now_mom += midi_event_p_array_[ i ]->mom();
- }
- tor( DEBUG_ver ) << endl;
- end_mom_ = now_mom;
- events_i_ = midi_event_p_array_.size();
- return end_mom_;
-#endif
-}
-
-String
-Midi_voice::mudela_str( Moment from_mom, Moment to_mom, bool multiple_bo )
-{
- String str;
-
-// if ( begin_mom() >= to_mom )
- if ( begin_mom() > to_mom )
- return "";
-// if ( end_mom() <= from_mom )
- if ( end_mom() < from_mom )
- return "";
-
- Moment now_mom = begin_mom();
-#ifdef MEVENT_LIST
- PCursor<Midi_event*> i( midi_event_p_list_.top() );
- for ( ; i.ok() && now_mom < from_mom ; i++ )
- now_mom += i->mom();
-
- for ( ; i.ok() && now_mom < to_mom ; i++ ) {
- now_mom += i->mom();
- str += i->mudela_str( false ) + " ";
- }
-#else
- int i = 0;
- for ( ; i < midi_event_p_array_.size() && now_mom < from_mom ; i++ )
- now_mom += midi_event_p_array_[ i ]->mom();
-
- for ( ; i < midi_event_p_array_.size() && now_mom < to_mom ; i++ ) {
- now_mom += midi_event_p_array_[ i ]->mom();
- str += midi_event_p_array_[ i ]->mudela_str( false ) + " ";
- }
-#endif
-
- if ( str.length_i() && multiple_bo )
- str = "{ " + str + "} ";
- return str;
-}
-
+++ /dev/null
-//
-// track-column.cc -- implement Track_column
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
-
-#include "mi2mu.hh"
-
-Track_column::Track_column( Moment mom )
-{
- mom_ = mom;
-}
-
-void
-Track_column::add_event( Midi_event* midi_event_p )
-{
-#ifdef MEVENT_LIST
- midi_event_p_list_.bottom().add( midi_event_p );
-#else
- midi_event_p_array_.push( midi_event_p );
-#endif
-}
-
-Moment
-Track_column::mom()
-{
- return mom_;
-}