summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--muse/muse/arranger/trackinfo.cpp9
-rw-r--r--muse/muse/mixer/mstrip.cpp5
-rw-r--r--muse/muse/song.cpp74
-rw-r--r--muse/muse/synth.h4
-rw-r--r--muse/muse/track.cpp16
5 files changed, 85 insertions, 23 deletions
diff --git a/muse/muse/arranger/trackinfo.cpp b/muse/muse/arranger/trackinfo.cpp
index cba5a891..2935b943 100644
--- a/muse/muse/arranger/trackinfo.cpp
+++ b/muse/muse/arranger/trackinfo.cpp
@@ -657,6 +657,13 @@ void MidiChannelInfo::init(Track* t)
curIdx = idx;
}
instrument->setCurrentIndex(curIdx);
+ int val = midic->ctrlVal(CTRL_PROGRAM).i;
+ patch->setText(mi->getPatchName(midic->channelNo(), val));
+ //
+ // instrument type cannot be changed for software
+ // synthesizer
+ //
+ instrument->setEnabled(op->track->type() != Track::AUDIO_SOFTSYNTH);
}
//---------------------------------------------------------
@@ -703,7 +710,7 @@ void MidiChannelInfo::patchClicked()
if (rv != 0) {
CVal cval;
cval.i = rv->data().toInt();
- song->setControllerVal(midic, CTRL_PROGRAM, cval);
+ song->setControllerVal(track, CTRL_PROGRAM, cval);
}
}
diff --git a/muse/muse/mixer/mstrip.cpp b/muse/muse/mixer/mstrip.cpp
index bb6a0d34..7dae09aa 100644
--- a/muse/muse/mixer/mstrip.cpp
+++ b/muse/muse/mixer/mstrip.cpp
@@ -39,10 +39,10 @@ static void addSyntiPorts(QMenu* menu, RouteList* r, int channel)
{
SynthIList* sl = song->syntis();
for (iSynthI i = sl->begin(); i != sl->end(); ++i) {
- SynthI* track = *i;
+ MidiChannel* track = (*i)->channel(channel);
QAction* oa = menu->addAction(track->name());
oa->setCheckable(true);
- Route dst(track, channel, Route::SYNTIPORT);
+ Route dst(track, channel, Route::TRACK);
oa->setData(QVariant::fromValue(dst));
for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
@@ -67,6 +67,7 @@ static void addMidiTracks(QMenu* menu, RouteList* r, int channel)
action->setCheckable(true);
Route src(track, channel, Route::TRACK);
action->setData(QVariant::fromValue(src));
+
for (iRoute ir = r->begin(); ir != r->end(); ++ir) {
if (*ir == src) {
action->setChecked(true);
diff --git a/muse/muse/song.cpp b/muse/muse/song.cpp
index 0875a106..2ae02fee 100644
--- a/muse/muse/song.cpp
+++ b/muse/muse/song.cpp
@@ -593,7 +593,7 @@ void Song::update(int flags)
//
// remove unconnected channels
//
-// printf("update tracks %d %d\n", _tracks.size(), _midiChannel.size());
+// printf("update tracks %d channels: %d\n", _tracks.size(), _midiChannel.size());
bool again;
do {
again = false;
@@ -1417,8 +1417,8 @@ Track* Song::addTrack(QAction* action)
MidiSynti* si = new MidiSynti();
QString sName(s->name());
for (k = s->instances(); k < 1000; ++k) {
- QString instanceName = ("%1-%2");
- instanceName = instanceName.arg(sName).arg(k);
+ QString instanceName = (k == 0) ?
+ sName : instanceName.arg(sName).arg(k);
MidiSyntiList* sl = midiSyntis();
iMidiSynti sii;
@@ -1450,8 +1450,8 @@ Track* Song::addTrack(QAction* action)
SynthI* si = new SynthI();
int i;
for (i = s->instances(); i < 1000; ++i) {
- QString instanceName = ("%1-%2");
- instanceName = instanceName.arg(s->name()).arg(i);
+ QString instanceName = (i == 0) ?
+ s->name() : QString("%1-%2").arg(s->name()).arg(i);
SynthIList* sl = syntis();
iSynthI sii;
@@ -1746,11 +1746,37 @@ void Song::insertTrack2(Track* track)
void Song::removeTrack(Track* track)
{
startUndo();
+
+ if (track->type() == Track::AUDIO_SOFTSYNTH) {
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ MidiChannel* mc = ((SynthI*)track)->channel(i);
+ if (!mc->noInRoute()) {
+ int idx = _tracks.index(mc);
+ undoOp(UndoOp::DeleteTrack, idx, mc);
+ removeTrack1(mc);
+ audio->msgRemoveTrack(mc);
+ removeTrack3(mc);
+ }
+ }
+ }
+ else if (track->type() == Track::MIDI_OUT) {
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ MidiChannel* mc = ((MidiOutPort*)track)->channel(i);
+ if (!mc->noInRoute()) {
+ int idx = _tracks.index(mc);
+ undoOp(UndoOp::DeleteTrack, idx, mc);
+ removeTrack1(mc);
+ audio->msgRemoveTrack(mc);
+ removeTrack3(mc);
+ }
+ }
+ }
int idx = _tracks.index(track);
undoOp(UndoOp::DeleteTrack, idx, track);
removeTrack1(track);
audio->msgRemoveTrack(track);
removeTrack3(track);
+
endUndo(SC_TRACK_REMOVED | SC_ROUTE);
}
@@ -1761,6 +1787,22 @@ void Song::removeTrack(Track* track)
void Song::removeTrack1(Track* track)
{
+#if 0
+ if (track->type() == Track::AUDIO_SOFTSYNTH) {
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ MidiChannel* mc = ((SynthI*)track)->channel(i);
+ if (!mc->noInRoute())
+ removeTrack1(mc);
+ }
+ }
+ else if (track->type() == Track::MIDI_OUT) {
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ MidiChannel* mc = ((MidiOutPort*)track)->channel(i);
+ if (!mc->noInRoute())
+ removeTrack1(mc);
+ }
+ }
+#endif
track->deactivate();
_tracks.erase(track);
}
@@ -1780,6 +1822,8 @@ void Song::removeTrack2(Track* track)
_midis.erase(track);
break;
case Track::MIDI_OUT:
+// for (int i = 0; i < MIDI_CHANNELS; ++i)
+// removeTrack2(((MidiOutPort*)track)->channel(i));
_midiOutPorts.erase(track);
break;
case Track::MIDI_IN:
@@ -1803,6 +1847,8 @@ void Song::removeTrack2(Track* track)
case Track::AUDIO_SOFTSYNTH:
{
SynthI* s = (SynthI*) track;
+// for (int i = 0; i < MIDI_CHANNELS; ++i)
+// removeTrack2(s->channel(i));
s->deactivate2();
_synthIs.erase(track);
}
@@ -1814,8 +1860,6 @@ void Song::removeTrack2(Track* track)
// remove routes
//
Route src(track, -1, Route::TRACK);
-// if (track->type() == Track::AUDIO_SOFTSYNTH)
-// src.type = Route::SYNTIPORT;
foreach (const Route r, *(track->inRoutes())) {
if (r.type != Route::TRACK && r.type != Route::SYNTIPORT)
continue;
@@ -1853,7 +1897,23 @@ void Song::removeTrack3(Track* track)
if (track->type() == Track::AUDIO_SOFTSYNTH) {
SynthI* s = (SynthI*) track;
s->deactivate3();
+#if 0
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ MidiChannel* mc = ((SynthI*)track)->channel(i);
+ if (!mc->noInRoute())
+ removeTrack3(mc);
+ }
+#endif
}
+#if 0
+ else if (track->type() == Track::MIDI_OUT) {
+ for (int i = 0; i < MIDI_CHANNELS; ++i) {
+ MidiChannel* mc = ((MidiOutPort*)track)->channel(i);
+ if (!mc->noInRoute())
+ removeTrack3(mc);
+ }
+ }
+#endif
emit trackRemoved(track);
}
diff --git a/muse/muse/synth.h b/muse/muse/synth.h
index f657ea41..af45c04d 100644
--- a/muse/muse/synth.h
+++ b/muse/muse/synth.h
@@ -155,7 +155,7 @@ class SynthI : public AudioTrack, public MidiOut, public MidiInstrument
virtual bool isSynti() const { return true; }
virtual QString getPatchName(int ch, int prog) {
- return _sif->getPatchName(ch, prog);
+ return _sif ? _sif->getPatchName(ch, prog) : "";
}
virtual void populatePatchPopup(QMenu* m, int i) {
_sif->populatePatchPopup(m, i);
@@ -186,8 +186,6 @@ class SynthI : public AudioTrack, public MidiOut, public MidiInstrument
// mess synthesizer instance
//---------------------------------------------------------
-static const int PUT_FIFO_SIZE = 64;
-
class MessSynthIF : public SynthIF {
Mess* _mess;
diff --git a/muse/muse/track.cpp b/muse/muse/track.cpp
index d3e18ee3..aab33bae 100644
--- a/muse/muse/track.cpp
+++ b/muse/muse/track.cpp
@@ -164,7 +164,6 @@ void Track::setDefaultName()
case AUDIO_SOFTSYNTH:
// base = QString("Synth");
return;
- break;
case AUDIO_OUTPUT:
case AUDIO_INPUT:
case MIDI_OUT:
@@ -177,30 +176,27 @@ void Track::setDefaultName()
//
// create unique name
//
- base += " ";
for (int i = 1; true; ++i) {
- QString n;
- n.setNum(i);
- QString s = base + n;
+ QString s = QString("%1 $2").arg(base).arg(i);
bool found = false;
TrackList* tl = song->tracks();
- for (iTrack i = tl->begin(); i != tl->end(); ++i) {
- Track* track = *i;
+ for (iTrack it = tl->begin(); it != tl->end(); ++it) {
+ Track* track = *it;
if (track->name() == s) {
found = true;
break;
}
}
MidiChannelList* mc = song->midiChannel();
- for (iMidiChannel i = mc->begin(); i != mc->end(); ++i) {
- MidiChannel* t = *i;
+ for (iMidiChannel ic = mc->begin(); ic != mc->end(); ++ic) {
+ MidiChannel* t = *ic;
if (t->name() == s) {
found = true;
break;
}
}
if (!found) {
- setName(s);
+ setName(i == 1 ? base : s);
break;
}
}