X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstaff-performer.cc;h=505da3adbac4270207edaf15a4cfeb6dfecdff28;hb=cb2895f4abe165c0022ae2519111f73a0e775c30;hp=d3368ad683820c771dd6ce398d60ea606927bec3;hpb=058370efc7e9710f149d0f444328bb1fcd7bdec1;p=lilypond.git diff --git a/lily/staff-performer.cc b/lily/staff-performer.cc index d3368ad683..505da3adba 100644 --- a/lily/staff-performer.cc +++ b/lily/staff-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2014 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,6 +27,9 @@ #include "international.hh" #include "performer-group.hh" #include "warn.hh" +#include "lily-imports.hh" + +#include "translator.icc" /* Perform a staff. Individual notes should have their instrument (staff-wide) set, so we override play_element () @@ -51,7 +54,7 @@ private: int get_channel (const string &instrument); Audio_staff *get_audio_staff (const string &voice); Audio_staff *new_audio_staff (const string &voice); - Audio_dynamic *get_dynamic (const string &voice); + Audio_span_dynamic *get_dynamic (const string &voice); string instrument_string_; int channel_; @@ -62,7 +65,7 @@ private: map > note_map_; map staff_map_; map channel_map_; - map dynamic_map_; + map dynamic_map_; // Would prefer to have the following two items be // members of the containing class Performance, // so they can be reset for each new midi file output. @@ -76,7 +79,11 @@ map Staff_performer::static_channel_map_; int Staff_performer::channel_count_ = 0; int Staff_performer::staff_performer_count_ = 0; -#include "translator.icc" +void +Staff_performer::boot () +{ + +} ADD_TRANSLATOR (Staff_performer, /* doc */ @@ -161,7 +168,7 @@ Audio_staff * Staff_performer::get_audio_staff (const string &voice) { SCM channel_mapping = get_property ("midiChannelMapping"); - if (channel_mapping != ly_symbol2scm ("instrument") + if (!scm_is_eq (channel_mapping, ly_symbol2scm ("instrument")) && staff_map_.size ()) return staff_map_.begin ()->second; @@ -177,10 +184,10 @@ Staff_performer::get_audio_staff (const string &voice) return new_audio_staff (voice); } -Audio_dynamic * +Audio_span_dynamic * Staff_performer::get_dynamic (const string &voice) { - map::const_iterator i = dynamic_map_.find (voice); + map::const_iterator i = dynamic_map_.find (voice); if (i != dynamic_map_.end ()) return i->second; return 0; @@ -199,9 +206,8 @@ Staff_performer::set_instrument (int channel, const string &voice) announce_element (Audio_element_info (instrument_, 0)); Audio_staff *audio_staff = get_audio_staff (voice); audio_staff->add_audio_item (instrument_); - SCM proc = ly_lily_module_constant ("percussion?"); - SCM drums = scm_call_1 (proc, ly_symbol2scm (instrument_string_.c_str ())); - audio_staff->percussion_ = (drums == SCM_BOOL_T); + SCM drums = Lily::percussion_p (ly_symbol2scm (instrument_string_.c_str ())); + audio_staff->percussion_ = to_boolean (drums); } void @@ -221,13 +227,12 @@ Staff_performer::stop_translation_timestep () instrument_name_ = 0; instrument_ = 0; // For each voice with a note played in the current translation time step, - // check if the voice has an Audio_dynamic registered: if yes, apply this - // dynamic to every note played in the voice in the current translation time - // step. + // check if the voice has a dynamic registered: if yes, apply the dynamic + // to every note played in the voice in the current translation time step. for (map >::iterator vi = note_map_.begin (); vi != note_map_.end (); ++vi) { - Audio_dynamic *d = get_dynamic (vi->first); + Audio_span_dynamic *d = get_dynamic (vi->first); if (d) { for (deque::iterator ni = vi->second.begin (); @@ -272,11 +277,11 @@ Staff_performer::get_channel (const string &instrument) { SCM channel_mapping = get_property ("midiChannelMapping"); map &channel_map - = (channel_mapping != ly_symbol2scm ("instrument")) + = (!scm_is_eq (channel_mapping, ly_symbol2scm ("instrument"))) ? channel_map_ : static_channel_map_; - if (channel_mapping == ly_symbol2scm ("staff") + if (scm_is_eq (channel_mapping, ly_symbol2scm ("staff")) && channel_ >= 0) return channel_; @@ -284,7 +289,7 @@ Staff_performer::get_channel (const string &instrument) if (i != channel_map.end ()) return i->second; - int channel = (channel_mapping == ly_symbol2scm ("staff")) + int channel = (scm_is_eq (channel_mapping, ly_symbol2scm ("staff"))) ? channel_count_++ : channel_map.size (); @@ -310,46 +315,40 @@ Staff_performer::get_channel (const string &instrument) void Staff_performer::acknowledge_audio_element (Audio_element_info inf) { - if (Audio_item *ai = dynamic_cast (inf.elem_)) + /* map each context (voice) to its own track */ + Context *c = inf.origin_contexts (this)[0]; + string voice; + if (c->is_alias (ly_symbol2scm ("Voice"))) + voice = c->id_string (); + SCM channel_mapping = get_property ("midiChannelMapping"); + string str = new_instrument_string (); + if (!scm_is_eq (channel_mapping, ly_symbol2scm ("instrument"))) + channel_ = get_channel (voice); + else if (channel_ < 0 && str.empty ()) + channel_ = get_channel (str); + if (str.length ()) { - /* map each context (voice) to its own track */ - Context *c = inf.origin_contexts (this)[0]; - string voice; - if (c->is_alias (ly_symbol2scm ("Voice"))) - voice = c->id_string (); - SCM channel_mapping = get_property ("midiChannelMapping"); - string str = new_instrument_string (); - if (channel_mapping != ly_symbol2scm ("instrument")) - channel_ = get_channel (voice); - else if (channel_ < 0 && str.empty ()) + if (!scm_is_eq (channel_mapping, ly_symbol2scm ("voice"))) channel_ = get_channel (str); - if (str.length ()) - { - if (channel_mapping != ly_symbol2scm ("voice")) - channel_ = get_channel (str); - set_instrument (channel_, voice); - set_instrument_name (voice); - } + set_instrument (channel_, voice); + set_instrument_name (voice); + } + Audio_staff *audio_staff = get_audio_staff (voice); + if (Audio_item *ai = dynamic_cast (inf.elem_)) + { ai->channel_ = channel_; - bool encode_dynamics_as_velocity_ = true; - if (encode_dynamics_as_velocity_) + if (Audio_note *n = dynamic_cast (inf.elem_)) { - if (Audio_note *n = dynamic_cast (inf.elem_)) - { - // Keep track of the notes played in the current voice in this - // translation time step (for adjusting their dynamics later in - // stop_translation_timestep). - note_map_[voice].push_back (n); - } - else if (Audio_dynamic *d = dynamic_cast (inf.elem_)) - { - dynamic_map_[voice] = d; - // Output volume as velocity: must disable Midi_dynamic output - d->silent_ = true; - } + // Keep track of the notes played in the current voice in this + // translation time step (for adjusting their dynamics later in + // stop_translation_timestep). + note_map_[voice].push_back (n); } - Audio_staff *audio_staff = get_audio_staff (voice); audio_staff->add_audio_item (ai); } + else if (Audio_span_dynamic *d = dynamic_cast (inf.elem_)) + { + dynamic_map_[voice] = d; + } }