From 1dbfe58548c0dbea3a09c94eb03113aaaaa73c75 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Mon, 14 Mar 2011 10:08:06 +0100 Subject: [PATCH] Midi: only output PORT if midiChannelMapping == #'voice. This reduces the risk of creating trouble for the default #'instrument-mode output and the old #'staff-mode output, while leaving the option open for MIDI-players to do the right thing with ports in the #'voice-mode: in each track, each channel 0 should be able to play another instrument. --- lily/audio-column.cc | 1 - lily/audio-staff.cc | 4 ++-- lily/include/audio-staff.hh | 2 +- lily/include/midi-chunk.hh | 3 ++- lily/include/performance.hh | 3 ++- lily/midi-chunk.cc | 10 +++++++--- lily/performance.cc | 7 ++++--- lily/score-performer.cc | 3 +++ 8 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lily/audio-column.cc b/lily/audio-column.cc index 3b4fa48190..105eb1dda8 100644 --- a/lily/audio-column.cc +++ b/lily/audio-column.cc @@ -20,7 +20,6 @@ #include "audio-column.hh" #include "audio-item.hh" -#include "performance.hh" Audio_column::Audio_column (Moment when) { diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc index 8de47bf9de..d40220ca1c 100644 --- a/lily/audio-staff.cc +++ b/lily/audio-staff.cc @@ -35,9 +35,9 @@ Audio_staff::Audio_staff () } void -Audio_staff::output (Midi_stream &midi_stream, int track) +Audio_staff::output (Midi_stream &midi_stream, int track, bool port) { - Midi_track midi_track (track); + Midi_track midi_track (track, port); Midi_walker i (this, &midi_track); for (; i.ok (); i++) diff --git a/lily/include/audio-staff.hh b/lily/include/audio-staff.hh index a76854ddb1..acf31b17a4 100644 --- a/lily/include/audio-staff.hh +++ b/lily/include/audio-staff.hh @@ -27,7 +27,7 @@ struct Audio_staff : public Audio_element { void add_audio_item (Audio_item *ai); - void output (Midi_stream &midi_stream_r, int track); + void output (Midi_stream &midi_stream_r, int track, bool port); Audio_staff (); diff --git a/lily/include/midi-chunk.hh b/lily/include/midi-chunk.hh index 5af4487828..c567e904f1 100644 --- a/lily/include/midi-chunk.hh +++ b/lily/include/midi-chunk.hh @@ -70,11 +70,12 @@ class Midi_track : public Midi_chunk { public: int number_; + int port_; DECLARE_CLASSNAME (Midi_track); vector events_; - Midi_track (int number); + Midi_track (int number, bool port); ~Midi_track (); void add (int, Midi_item *midi); diff --git a/lily/include/performance.hh b/lily/include/performance.hh index e69aa8712a..9612fb8aed 100644 --- a/lily/include/performance.hh +++ b/lily/include/performance.hh @@ -27,7 +27,7 @@ class Performance : public Music_output { public: - Performance (); + Performance (bool ports=false); ~Performance (); DECLARE_CLASSNAME(Performance); @@ -43,6 +43,7 @@ public: vector audio_staffs_; vector audio_elements_; Output_def *midi_; + bool ports_; }; #endif /* PERFORMANCE_HH */ diff --git a/lily/midi-chunk.cc b/lily/midi-chunk.cc index aaed0a27fe..9c2a4bdf10 100644 --- a/lily/midi-chunk.cc +++ b/lily/midi-chunk.cc @@ -24,7 +24,7 @@ #include "std-string.hh" #include "string-convert.hh" -Midi_track::Midi_track (int number) +Midi_track::Midi_track (int number, bool port) : number_ (number) { // 4D 54 72 6B MTrk @@ -55,8 +55,12 @@ Midi_track::Midi_track (int number) // only for format 0 (currently using format 1)? data_string += String_convert::hex2bin (data_str0); - string port = "00" "ff" "21" "01" + String_convert::int2hex (number_, 2, '0'); - data_string += String_convert::hex2bin (port); + if (port) + { + string port = "00" "ff" "21" "01" + + String_convert::int2hex (number_, 2, '0'); + data_string += String_convert::hex2bin (port); + } char const *footer_str0 = "00" "ff2f" "00"; string footer_string = String_convert::hex2bin (footer_str0); diff --git a/lily/performance.cc b/lily/performance.cc index b07c8604cf..bcd8b42c50 100644 --- a/lily/performance.cc +++ b/lily/performance.cc @@ -34,9 +34,10 @@ using namespace std; #include "string-convert.hh" #include "warn.hh" -Performance::Performance () +Performance::Performance (bool ports) + : midi_ (0) + , ports_ (ports) { - midi_ = 0; } Performance::~Performance () @@ -58,7 +59,7 @@ Performance::output (Midi_stream &midi_stream) const Audio_staff *s = audio_staffs_[i]; if (be_verbose_global) progress_indication ("[" + to_string (i)); - s->output (midi_stream, i); + s->output (midi_stream, i, ports_); if (be_verbose_global) progress_indication ("]"); } diff --git a/lily/score-performer.cc b/lily/score-performer.cc index 99e41290c3..5257788df6 100644 --- a/lily/score-performer.cc +++ b/lily/score-performer.cc @@ -119,6 +119,9 @@ IMPLEMENT_LISTENER (Score_performer, finish); void Score_performer::finish (SCM) { + SCM channel_mapping = context ()->get_property ("midiChannelMapping"); + bool use_ports = channel_mapping == ly_symbol2scm ("voice"); + performance_->ports_ = use_ports; recurse_over_translators (context (), &Translator::finalize, &Translator_group::finalize, -- 2.39.2