diff options
67 files changed, 1377 insertions, 4593 deletions
| diff --git a/muse/ChangeLog b/muse/ChangeLog index ec1564ee..e25be625 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,6 @@ +8.11 (ws) +      - removed the suboptimal "MidiChannel" concept. MidiChannels are +        now merged with MidiTracks.  5.11 (ws)        - simplified midi input routing        - added "Monitor" button to midi track mixer strip diff --git a/muse/muse/CMakeLists.txt b/muse/muse/CMakeLists.txt index 3d038136..db867b0e 100644 --- a/muse/muse/CMakeLists.txt +++ b/muse/muse/CMakeLists.txt @@ -74,7 +74,6 @@ QT4_WRAP_CPP ( muse_moc_headers        synth.h        exportmidi.h        importmidi.h -      midichannel.h        midiinport.h        midioutport.h        ) @@ -129,7 +128,6 @@ add_executable ( muse        midififo.cpp        midioutport.cpp        midiinport.cpp -      midichannel.cpp        midiout.cpp        projectpropsdialog.cpp diff --git a/muse/muse/arranger/CMakeLists.txt b/muse/muse/arranger/CMakeLists.txt index fbabb96c..812c26aa 100644 --- a/muse/muse/arranger/CMakeLists.txt +++ b/muse/muse/arranger/CMakeLists.txt @@ -32,7 +32,6 @@ QT4_WRAP_CPP ( arranger_mocs  QT4_WRAP_UI ( arranger_ui_headers         configtrack.ui -      midichannelinfo.ui        midiportinfo.ui        miditrackinfo.ui        ) diff --git a/muse/muse/arranger/arranger.cpp b/muse/muse/arranger/arranger.cpp index 83b9bddc..8215028f 100644 --- a/muse/muse/arranger/arranger.cpp +++ b/muse/muse/arranger/arranger.cpp @@ -37,7 +37,6 @@  #include "midictrl.h"  #include "gconfig.h"  #include "part.h" -#include "midichannel.h"  int Arranger::trackNameWidth = 80; @@ -56,7 +55,7 @@ const TrElement trElements[] = {          | Track::M_WAVE          | Track::M_AUDIO_INPUT          | Track::M_AUDIO_SOFTSYNTH), -      TrElement(TR_DRUMMAP,  2, "use drum map", Track::M_MIDI_CHANNEL), +      TrElement(TR_DRUMMAP,  2, "use drum map", Track::M_MIDI),        TrElement(TR_MUTE,     3, "mute",             -1),        TrElement(TR_SOLO,     3, "solo",             -1),        TrElement(TR_MONITOR,  3, "monitor", @@ -67,7 +66,7 @@ const TrElement trElements[] = {              -1 & ~(Track::M_MIDI_IN | Track::M_MIDI)),        TrElement(TR_OCHANNEL,   5, "output channel", Track::M_MIDI),        TrElement(TR_INSTRUMENT, 6, "instrument",     Track::M_MIDI_OUT), -      TrElement(TR_PATCH,      7, "patch",          Track::M_MIDI_CHANNEL), +      TrElement(TR_PATCH,      7, "patch",          Track::M_MIDI),        };  const int nTrElements = sizeof(trElements)/sizeof(*trElements); @@ -874,9 +873,6 @@ void Arranger::toggleMixerStrip(bool val)                          case Track::MIDI_OUT:                                strip = new MidiOutPortStrip(0, (MidiOutPort*)_curTrack, false);                                break; -                        case Track::MIDI_CHANNEL: -                              strip = new MidiChannelStrip(0, (MidiChannel*)_curTrack, false); -                              break;                          case Track::MIDI_SYNTI:                                strip = new MidiSyntiStrip(0, (MidiSynti*)_curTrack, false);                                break; @@ -1093,8 +1089,8 @@ void Arranger::setGar()                    }              }        if (ar == false) { -            MidiChannelList* cl = song->midiChannel(); -            for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) { +            MidiTrackList* cl = song->midis(); +            for (iMidiTrack i = cl->begin(); i != cl->end(); ++i) {                    if ((*i)->autoRead()) {                          ar = true;                          break; @@ -1117,8 +1113,8 @@ void Arranger::setGaw()                    aw = true;              }        if (aw == false) { -            MidiChannelList* cl = song->midiChannel(); -            for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) { +            MidiTrackList* cl = song->midis(); +            for (iMidiTrack i = cl->begin(); i != cl->end(); ++i) {                    if ((*i)->autoWrite()) {                          aw = true;                          break; @@ -1161,8 +1157,8 @@ void Arranger::offGar()        TrackList*tl = song->tracks();        for (iTrack i = tl->begin(); i != tl->end(); ++i)              song->setAutoRead(*i, false); -      MidiChannelList* cl = song->midiChannel(); -      for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) +      MidiTrackList* cl = song->midis(); +      for (iMidiTrack i = cl->begin(); i != cl->end(); ++i)              song->setAutoRead(*i, false);        gar->setChecked(false);        } @@ -1176,8 +1172,8 @@ void Arranger::offGaw()        TrackList*tl = song->tracks();        for (iTrack i = tl->begin(); i != tl->end(); ++i)              song->setAutoWrite(*i, false); -      MidiChannelList* cl = song->midiChannel(); -      for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) +      MidiTrackList* cl = song->midis(); +      for (iMidiTrack i = cl->begin(); i != cl->end(); ++i)              song->setAutoWrite(*i, false);        gaw->setChecked(false);        } diff --git a/muse/muse/arranger/canvas.cpp b/muse/muse/arranger/canvas.cpp index de38f322..85e2305e 100644 --- a/muse/muse/arranger/canvas.cpp +++ b/muse/muse/arranger/canvas.cpp @@ -31,7 +31,6 @@  #include "tlswidget.h"  #include "part.h"  #include "gui.h" -#include "midichannel.h"  #include <samplerate.h> @@ -446,8 +445,7 @@ void PartCanvas::contextMenu(const QPoint& pos)              pop->addSeparator();        	if (track->type() == Track::MIDI) {                    MidiTrack* track = (MidiTrack*)part->track(); -                  MidiChannel* mc = track->channel(); -                  if (mc && mc->useDrumMap()) { +                  if (track->useDrumMap()) {                    	a = pop->addAction(*edit_drummsIcon, tr("drums"));                          a->setData(13);                          } diff --git a/muse/muse/arranger/midichannelinfo.ui b/muse/muse/arranger/midichannelinfo.ui deleted file mode 100644 index 85fb5e9f..00000000 --- a/muse/muse/arranger/midichannelinfo.ui +++ /dev/null @@ -1,56 +0,0 @@ -<ui version="4.0" > - <author></author> - <comment></comment> - <exportmacro></exportmacro> - <class>MidiChannelInfoBase</class> - <widget class="QWidget" name="MidiChannelInfoBase" > -  <property name="geometry" > -   <rect> -    <x>0</x> -    <y>0</y> -    <width>134</width> -    <height>83</height> -   </rect> -  </property> -  <property name="sizePolicy" > -   <sizepolicy> -    <hsizetype>7</hsizetype> -    <vsizetype>5</vsizetype> -    <horstretch>0</horstretch> -    <verstretch>0</verstretch> -   </sizepolicy> -  </property> -  <property name="windowTitle" > -   <string>Form</string> -  </property> -  <layout class="QVBoxLayout" > -   <property name="margin" > -    <number>6</number> -   </property> -   <property name="spacing" > -    <number>0</number> -   </property> -   <item> -    <widget class="QPushButton" name="patch" > -     <property name="sizePolicy" > -      <sizepolicy> -       <hsizetype>7</hsizetype> -       <vsizetype>0</vsizetype> -       <horstretch>0</horstretch> -       <verstretch>0</verstretch> -      </sizepolicy> -     </property> -     <property name="toolTip" > -      <string>Instrument Patch</string> -     </property> -     <property name="text" > -      <string>???</string> -     </property> -    </widget> -   </item> -  </layout> - </widget> - <pixmapfunction></pixmapfunction> - <resources/> - <connections/> -</ui> diff --git a/muse/muse/arranger/miditrackinfo.ui b/muse/muse/arranger/miditrackinfo.ui index cd143b28..796c7494 100644 --- a/muse/muse/arranger/miditrackinfo.ui +++ b/muse/muse/arranger/miditrackinfo.ui @@ -1,15 +1,12 @@  <ui version="4.0" > - <author></author> - <comment></comment> - <exportmacro></exportmacro>   <class>MidiTrackInfoBase</class>   <widget class="QWidget" name="MidiTrackInfoBase" >    <property name="geometry" >     <rect>      <x>0</x>      <y>0</y> -    <width>134</width> -    <height>133</height> +    <width>135</width> +    <height>165</height>     </rect>    </property>    <property name="sizePolicy" > @@ -25,13 +22,13 @@    </property>    <layout class="QGridLayout" >     <property name="margin" > -    <number>6</number> +    <number>0</number>     </property>     <property name="spacing" >      <number>0</number>     </property> -   <item row="4" column="0" > -    <widget class="QLabel" name="label_5" > +   <item row="0" column="0" > +    <widget class="QLabel" name="label" >       <property name="sizePolicy" >        <sizepolicy>         <hsizetype>5</hsizetype> @@ -41,22 +38,20 @@        </sizepolicy>       </property>       <property name="text" > -      <string>Compr.</string> +      <string>Transp.</string>       </property>      </widget>     </item> -   <item row="0" column="0" > -    <widget class="QLabel" name="label" > -     <property name="sizePolicy" > -      <sizepolicy> -       <hsizetype>5</hsizetype> -       <vsizetype>0</vsizetype> -       <horstretch>0</horstretch> -       <verstretch>0</verstretch> -      </sizepolicy> +   <item row="0" column="1" > +    <widget class="QSpinBox" name="transposition" > +     <property name="toolTip" > +      <string>Pitch Transpose</string>       </property> -     <property name="text" > -      <string>Transp.</string> +     <property name="maximum" > +      <number>127</number> +     </property> +     <property name="minimum" > +      <number>-127</number>       </property>      </widget>     </item> @@ -75,6 +70,19 @@       </property>      </widget>     </item> +   <item row="1" column="1" > +    <widget class="QSpinBox" name="delay" > +     <property name="toolTip" > +      <string>Track Delay (ticks)</string> +     </property> +     <property name="maximum" > +      <number>1000</number> +     </property> +     <property name="minimum" > +      <number>-1000</number> +     </property> +    </widget> +   </item>     <item row="2" column="0" >      <widget class="QLabel" name="label_3" >       <property name="sizePolicy" > @@ -90,6 +98,22 @@       </property>      </widget>     </item> +   <item row="2" column="1" > +    <widget class="QSpinBox" name="length" > +     <property name="toolTip" > +      <string>Modify Note Length</string> +     </property> +     <property name="suffix" > +      <string>%</string> +     </property> +     <property name="maximum" > +      <number>200</number> +     </property> +     <property name="minimum" > +      <number>25</number> +     </property> +    </widget> +   </item>     <item row="3" column="0" >      <widget class="QLabel" name="label_4" >       <property name="sizePolicy" > @@ -105,10 +129,10 @@       </property>      </widget>     </item> -   <item row="0" column="1" > -    <widget class="QSpinBox" name="transposition" > +   <item row="3" column="1" > +    <widget class="QSpinBox" name="velocity" >       <property name="toolTip" > -      <string>Pitch Transpose</string> +      <string>Modify Note Velocity</string>       </property>       <property name="maximum" >        <number>127</number> @@ -118,23 +142,25 @@       </property>      </widget>     </item> -   <item row="1" column="1" > -    <widget class="QSpinBox" name="delay" > -     <property name="toolTip" > -      <string>Track Delay (ticks)</string> -     </property> -     <property name="maximum" > -      <number>1000</number> +   <item row="4" column="0" > +    <widget class="QLabel" name="label_5" > +     <property name="sizePolicy" > +      <sizepolicy> +       <hsizetype>5</hsizetype> +       <vsizetype>0</vsizetype> +       <horstretch>0</horstretch> +       <verstretch>0</verstretch> +      </sizepolicy>       </property> -     <property name="minimum" > -      <number>-1000</number> +     <property name="text" > +      <string>Compr.</string>       </property>      </widget>     </item> -   <item row="2" column="1" > -    <widget class="QSpinBox" name="length" > +   <item row="4" column="1" > +    <widget class="QSpinBox" name="compression" >       <property name="toolTip" > -      <string>Modify Note Length</string> +      <string>Compress Note Velocity</string>       </property>       <property name="suffix" >        <string>%</string> @@ -147,38 +173,26 @@       </property>      </widget>     </item> -   <item row="3" column="1" > -    <widget class="QSpinBox" name="velocity" > -     <property name="toolTip" > -      <string>Modify Note Velocity</string> -     </property> -     <property name="maximum" > -      <number>127</number> -     </property> -     <property name="minimum" > -      <number>-127</number> +   <item row="5" column="0" colspan="2" > +    <widget class="QPushButton" name="patch" > +     <property name="sizePolicy" > +      <sizepolicy> +       <hsizetype>7</hsizetype> +       <vsizetype>0</vsizetype> +       <horstretch>0</horstretch> +       <verstretch>0</verstretch> +      </sizepolicy>       </property> -    </widget> -   </item> -   <item row="4" column="1" > -    <widget class="QSpinBox" name="compression" >       <property name="toolTip" > -      <string>Compress Note Velocity</string> -     </property> -     <property name="suffix" > -      <string>%</string> -     </property> -     <property name="maximum" > -      <number>200</number> +      <string>Instrument Patch</string>       </property> -     <property name="minimum" > -      <number>25</number> +     <property name="text" > +      <string>???</string>       </property>      </widget>     </item>    </layout>   </widget> - <pixmapfunction></pixmapfunction>   <resources/>   <connections/>  </ui> diff --git a/muse/muse/arranger/tlswidget.cpp b/muse/muse/arranger/tlswidget.cpp index cd78b1a8..d3749da4 100644 --- a/muse/muse/arranger/tlswidget.cpp +++ b/muse/muse/arranger/tlswidget.cpp @@ -20,7 +20,6 @@  #include "song.h"  #include "track.h" -#include "midichannel.h"  #include "tlswidget.h"  #include "tlwlayout.h"  #include "icons.h" @@ -243,14 +242,7 @@ bool TLSWidget::setCtrl(int ctrl)        else {              at->ctrl = ctrl;              at->controller = _track->getController(ctrl); -            if (at->controller == 0 && _track->type() == Track::MIDI) { -                  MidiChannel* mc = ((MidiTrack*)_track)->channel(); -                  at->controller = mc->getController(ctrl); -                  _ctrlTrack = mc; -                  connect(_ctrlTrack, SIGNAL(controllerChanged(int)), SLOT(controllerListChanged(int))); -                  } -            else -                  _ctrlTrack = _track; +            _ctrlTrack = _track;              ctrlList->setText(at->controller->name());              emit controllerChanged(ctrl);              } diff --git a/muse/muse/arranger/tlwidget.cpp b/muse/muse/arranger/tlwidget.cpp index 84f1044e..93da0906 100644 --- a/muse/muse/arranger/tlwidget.cpp +++ b/muse/muse/arranger/tlwidget.cpp @@ -35,7 +35,6 @@  #include "widgets/outportcombo.h"  #include "audio.h"  #include "midioutport.h" -#include "midichannel.h"  #include "instruments/minstrument.h"  //--------------------------------------------------------- @@ -330,11 +329,10 @@ void TLWidget::configChanged()                          case TR_DRUMMAP:                                {                                SimpleButton* dm = newDrumMapButton(); -                              MidiChannel* mt = (MidiChannel*)_track;                                dm->setFixedSize(trackRowHeight, trackRowHeight); -                              dm->setChecked(mt->useDrumMap()); +                              dm->setChecked(((MidiTrack*)_track)->useDrumMap());                                connect(dm, SIGNAL(clicked(bool)), SLOT(drumMapToggled(bool))); -                              connect(mt, SIGNAL(useDrumMapChanged(bool)), dm, SLOT(setChecked(bool))); +                              connect(_track, SIGNAL(useDrumMapChanged(bool)), dm, SLOT(setChecked(bool)));                                l->addWidget(dm);                                wlist.push_back(dm);                                } @@ -418,9 +416,9 @@ void TLWidget::configChanged()                                outChannel = new QSpinBox(this);                                outChannel->setFixedSize(45, trackRowHeight);                                outChannel->setRange(1, 16); -                              MidiChannel* midiChannel = ((MidiTrack*)_track)->channel(); -                              if (midiChannel) -                                 outChannel->setValue(midiChannel->channelNo()+1); +//TODOA                              MidiChannel* midiChannel = ((MidiTrack*)_track)->channel(); +//                              if (midiChannel) +//                                 outChannel->setValue(midiChannel->channelNo()+1);                                outChannel->setToolTip(tr("Midi Output Channel"));                                l->addWidget(outChannel);                                wlist.push_back(outChannel); @@ -473,7 +471,7 @@ void TLWidget::monitorToggled(bool val)  void TLWidget::drumMapToggled(bool val)        { -      ((MidiChannel*)_track)->setUseDrumMap(val); +      ((MidiTrack*)_track)->setUseDrumMap(val);        }  //--------------------------------------------------------- @@ -527,6 +525,7 @@ void TLWidget::setOutPort(int n)  void TLWidget::outChannelChanged(int n)        { +#if 0 //TODOA        n -= 1;        MidiChannel* mc = ((MidiTrack*)_track)->channel();        if (mc == 0)		// no route to port? @@ -538,6 +537,7 @@ void TLWidget::outChannelChanged(int n)        audio->msgRemoveRoute(Route(_track), Route(mc));        audio->msgAddRoute(Route(_track), Route(mp->channel(n)));        song->update(SC_ROUTE); +#endif        }  //--------------------------------------------------------- diff --git a/muse/muse/arranger/trackinfo.cpp b/muse/muse/arranger/trackinfo.cpp index b930a491..1930423b 100644 --- a/muse/muse/arranger/trackinfo.cpp +++ b/muse/muse/arranger/trackinfo.cpp @@ -31,7 +31,6 @@  #include "gui.h"  #include "midioutport.h"  #include "midiinport.h" -#include "midichannel.h"  //---------------------------------------------------------  //   createTrackInfo @@ -49,7 +48,6 @@ TrackInfo* Arranger::createTrackInfo()              case Track::AUDIO_SOFTSYNTH: return new SynthIInfo();              case Track::MIDI_OUT:        return new MidiOutPortInfo();              case Track::MIDI_IN:         return new MidiInPortInfo(); -            case Track::MIDI_CHANNEL:    return new MidiChannelInfo();              case Track::MIDI_SYNTI:      return new MidiSynthIInfo();              default:                    printf("Arranger::createTrackInfo: type %d\n", t); @@ -129,8 +127,8 @@ MidiTrackInfo::MidiTrackInfo()        QWidget* midiTrackInfo = new QWidget;        mt.setupUi(midiTrackInfo); -      QWidget* midiChannelInfo = new QWidget; -      mc.setupUi(midiChannelInfo); +//      QWidget* midiChannelInfo = new QWidget; +//      mc.setupUi(midiChannelInfo);        QWidget* midiPortInfo = new QWidget;        mp.setupUi(midiPortInfo); @@ -145,7 +143,7 @@ MidiTrackInfo::MidiTrackInfo()        channel = new QComboBox;        grid->addWidget(channel, 4, 0, 1, 2); -      grid->addWidget(midiChannelInfo, 5, 0, 1, 2); +//      grid->addWidget(midiChannelInfo, 5, 0, 1, 2);        label = new QLabel;        label->setText(tr("Midi Port")); @@ -157,14 +155,14 @@ MidiTrackInfo::MidiTrackInfo()        grid->addWidget(port, 7, 0, 1, 2);        grid->addWidget(midiPortInfo, 8, 0, 1, 2); -      pop = new QMenu(mc.patch); +      pop = new QMenu(mt.patch);        connect(mt.transposition, SIGNAL(valueChanged(int)), SLOT(transpositionChanged(int)));        connect(mt.velocity,      SIGNAL(valueChanged(int)), SLOT(velocityChanged(int)));        connect(mt.delay,         SIGNAL(valueChanged(int)), SLOT(delayChanged(int)));        connect(mt.length,        SIGNAL(valueChanged(int)), SLOT(lenChanged(int)));        connect(mt.compression,   SIGNAL(valueChanged(int)), SLOT(iKomprChanged(int))); -      connect(mc.patch,         SIGNAL(clicked()),         SLOT(patchClicked())); +      connect(mt.patch,         SIGNAL(clicked()),         SLOT(patchClicked()));        connect(channel,          SIGNAL(activated(int)),    SLOT(channelSelected(int)));        connect(port,             SIGNAL(activated(int)),    SLOT(portSelected(int)));        connect(mp.instrument,    SIGNAL(activated(int)),    SLOT(instrumentSelected(int))); @@ -181,62 +179,61 @@ MidiTrackInfo::MidiTrackInfo()  void MidiTrackInfo::init(Track* t)        {        TrackInfo::init(t); -      mt.transposition->setValue(((MidiTrack*)track)->transposition); -      mt.delay->setValue(((MidiTrack*)track)->delay); -      mt.length->setValue(((MidiTrack*)track)->len); -      mt.velocity->setValue(((MidiTrack*)track)->velocity); -      mt.compression->setValue(((MidiTrack*)track)->compression); +      mt.transposition->setValue(((MidiTrack*)track)->transposition()); +      mt.delay->setValue(((MidiTrack*)track)->delay()); +      mt.length->setValue(((MidiTrack*)track)->len()); +      mt.velocity->setValue(((MidiTrack*)track)->velocity()); +      mt.compression->setValue(((MidiTrack*)track)->compression());        mp.instrument->clear(); -      MidiChannel* midic = ((MidiTrack*)track)->channel(); -      int portIndex = 0; -      int channelIndex = 0;        channel->clear();        channel->addItem("---", -1);        port->clear();        port->addItem("---", -1); +      int portIndex = 1; +      MidiTrack* midiTrack = (MidiTrack*)track; +              MidiOutPortList* opl = song->midiOutPorts(); -      int k = 0; -      for (iMidiOutPort i = opl->begin(); i != opl->end(); ++i, ++k) { -      	port->addItem((*i)->name(), k); -            if (midic && midic->port() == *i) -                  portIndex = k + 1; + +      MidiOut* mo = midiTrack->midiOut();       +      for (iMidiOutPort i = opl->begin(); i != opl->end(); ++i, ++portIndex) { +      	port->addItem((*i)->name()); +            if (mo == (*i)) +                  port->setCurrentIndex(portIndex);              } -      if (midic) { -            MidiOut* op = midic->port(); -            for (int i = 0; i < MIDI_CHANNELS; ++i) { -                  MidiChannel* c = op->channel(i); -                  if (midic == c) -                        channelIndex = i + 1; -                  channel->addItem(c->name(), i); -                  } -            connect(midic, SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int))); -//TODO            connect(op, SIGNAL(instrumentChanged()), SLOT(instrumentChanged())); -            channel->setCurrentIndex(channelIndex); -            port->setCurrentIndex(portIndex); -            MidiInstrument* mi = op->instrument(); -            int idx = 0; -            int curIdx = 0; -            for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) { -                  mp.instrument->addItem((*i)->iname()); -                  if ((*i)->iname() == mi->iname()) -                        curIdx = idx; -                  } -            mp.instrument->setCurrentIndex(curIdx); -//TODO            mp.deviceId->setValue(op->deviceId()); +      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) +            channel->addItem(QString("Channel %1").arg(ch+1), ch); +      int n = midiTrack->channelNo(); +      channel->setCurrentIndex(n < 0 ? 0 : n + 1); + +//      connect(midic, SIGNAL(controllerChanged(int)), SLOT(controllerChanged(int))); +//TODO  connect(op, SIGNAL(instrumentChanged()), SLOT(instrumentChanged())); + +      MidiInstrument* mi = midiTrack->instrument(); +      int idx = 0; +      int curIdx = 0; +      for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i, ++idx) { +            mp.instrument->addItem((*i)->iname()); +            if (mi && ((*i)->iname() == mi->iname())) +                  curIdx = idx; +            } +      mp.instrument->setCurrentIndex(curIdx); +      mp.deviceId->setValue(midiTrack->deviceId()); +#if 0              autoChanged(midic, false);             // update enable              int val = midic->ctrlVal(CTRL_PROGRAM).i;              int channelno = midic->channelNo(); -            mc.patch->setText(mi->getPatchName(channelno, val)); +            mt.patch->setText(mi->getPatchName(channelno, val));              }        else {              channel->setCurrentIndex(0);              port->setCurrentIndex(0);              mp.instrument->addItem("--");              mp.instrument->setCurrentIndex(0); -            mc.patch->setText("--"); +            mt.patch->setText("--");              } +#endif         }  //--------------------------------------------------------- @@ -248,7 +245,7 @@ void MidiTrackInfo::portSelected(int portno)        if (portno == 0)              return;        --portno; - +#if 0 //TODOA  	Route srcRoute(track);        MidiChannel* midic = ((MidiTrack*)track)->channel();        if (midic) { @@ -264,6 +261,7 @@ void MidiTrackInfo::portSelected(int portno)        audio->msgAddRoute(srcRoute, dstRoute);  	song->update(SC_ROUTE); +#endif        }  //--------------------------------------------------------- @@ -275,12 +273,13 @@ void MidiTrackInfo::channelSelected(int ch)  	if (ch == 0)        	return;  	--ch; +#if 0 //TODOA  	Route srcRoute(track); -      MidiChannel* midic = ((MidiTrack*)track)->channel(); -      MidiOut* midip = midic->port(); -      if (midic) { -      	Route odstRoute(midic); -	      audio->msgRemoveRoute(srcRoute, odstRoute); +      MidiOut* midip = ((MidiTrack*)track)->midiOut(); +      MidiOutPort* midi =   +      if (midi) { +      	Route dstRoute(midic); +	      audio->msgRemoveRoute(srcRoute, dstRoute);              }        midic = midip->channel(ch); @@ -288,6 +287,7 @@ void MidiTrackInfo::channelSelected(int ch)        audio->msgAddRoute(srcRoute, dstRoute);  	song->update(SC_ROUTE); +#endif        }  //--------------------------------------------------------- @@ -297,13 +297,14 @@ void MidiTrackInfo::channelSelected(int ch)  void MidiTrackInfo::controllerChanged(int id)        {        if (id == CTRL_PROGRAM) { -            MidiChannel* midic = ((MidiTrack*)track)->channel(); -            if (midic) { -                  MidiOut* op = midic->port(); +#if 0 //TODOA +            MidiOut* op = ((MidiTrack*)track)->midiOut(); +            if (op) {                    MidiInstrument* mi = op->instrument();                    int val = midic->ctrlVal(id).i; -                  mc.patch->setText(mi->getPatchName(midic->channelNo(), val)); +                  mt.patch->setText(mi->getPatchName(midic->channelNo(), val));                    } +#endif              }        } @@ -313,6 +314,7 @@ void MidiTrackInfo::controllerChanged(int id)  void MidiTrackInfo::instrumentChanged()        { +#if 0 //TODOA        MidiChannel* midic = ((MidiTrack*)track)->channel();        if (midic) {              MidiOut* op = midic->port(); @@ -329,6 +331,7 @@ void MidiTrackInfo::instrumentChanged()              mp.instrument->clear();              mp.instrument->setCurrentIndex(0);              } +#endif        }  //--------------------------------------------------------- @@ -337,13 +340,13 @@ void MidiTrackInfo::instrumentChanged()  void MidiTrackInfo::autoChanged(Track* t, bool)        { -      MidiChannel* midic = ((MidiTrack*)track)->channel(); -      if (midic != t) -            return; +//      MidiChannel* midic = ((MidiTrack*)track)->channel(); +//      if (midic != t) +//            return;        bool ar = t->autoRead();        bool aw = t->autoWrite();        bool en = !ar || (ar && aw); -      mc.patch->setEnabled(en); +      mt.patch->setEnabled(en);        }  //--------------------------------------------------------- @@ -352,7 +355,7 @@ void MidiTrackInfo::autoChanged(Track* t, bool)  void MidiTrackInfo::transpositionChanged(int val)        { -      ((MidiTrack*)track)->transposition = val; +      ((MidiTrack*)track)->setTransposition(val);        }  //--------------------------------------------------------- @@ -361,6 +364,7 @@ void MidiTrackInfo::transpositionChanged(int val)  void MidiTrackInfo::patchClicked()        { +#if 0 //TODOA        MidiChannel* midic = ((MidiTrack*)track)->channel();        if (!midic)              return; @@ -369,13 +373,13 @@ void MidiTrackInfo::patchClicked()        MidiInstrument* mi = op->instrument();        mi->populatePatchPopup(pop, 0); -      QAction* rv = pop->exec(mc.patch->mapToGlobal(QPoint(10,5))); +      QAction* rv = pop->exec(mt.patch->mapToGlobal(QPoint(10,5)));        if (rv != 0) {              CVal cval;              cval.i = rv->data().toInt(); -printf("set program %06x\n", cval.i);              song->setControllerVal(midic, CTRL_PROGRAM, cval);              } +#endif        }  //--------------------------------------------------------- @@ -384,11 +388,13 @@ printf("set program %06x\n", cval.i);  void MidiTrackInfo::instrumentSelected(int n)        { +#if 0  //TODOA        MidiChannel* midic = ((MidiTrack*)track)->channel();        if (midic == 0)              return;        MidiOut* op = midic->port();        op->setInstrument(midiInstruments[n]); +#endif        }  //--------------------------------------------------------- @@ -397,7 +403,7 @@ void MidiTrackInfo::instrumentSelected(int n)  void MidiTrackInfo::velocityChanged(int val)        { -      ((MidiTrack*)track)->velocity = val; +      ((MidiTrack*)track)->setVelocity(val);        }  //--------------------------------------------------------- @@ -406,7 +412,7 @@ void MidiTrackInfo::velocityChanged(int val)  void MidiTrackInfo::delayChanged(int val)        { -      ((MidiTrack*)track)->delay = val; +      ((MidiTrack*)track)->setDelay(val);        }  //--------------------------------------------------------- @@ -415,7 +421,7 @@ void MidiTrackInfo::delayChanged(int val)  void MidiTrackInfo::lenChanged(int val)        { -      ((MidiTrack*)track)->len = val; +      ((MidiTrack*)track)->setLen(val);        }  //--------------------------------------------------------- @@ -424,7 +430,7 @@ void MidiTrackInfo::lenChanged(int val)  void MidiTrackInfo::iKomprChanged(int val)        { -      ((MidiTrack*)track)->compression = val; +      ((MidiTrack*)track)->setCompression(val);        }  //--------------------------------------------------------- @@ -433,11 +439,13 @@ void MidiTrackInfo::iKomprChanged(int val)  void MidiTrackInfo::deviceIdChanged(int /*val*/)        { +#if 0 //TODOA        MidiChannel* midic = ((MidiTrack*)track)->channel();        if (midic == 0)              return;  //      MidiOut* op = midic->port();  //TODO      op->setDeviceId(val); +#endif        }  //--------------------------------------------------------- @@ -602,6 +610,7 @@ MidiInPortInfo::MidiInPortInfo()        grid->setRowStretch(grid->rowCount(), 100);        } +#if 0  //---------------------------------------------------------  //   MidiChannelInfo  //--------------------------------------------------------- @@ -728,3 +737,4 @@ void MidiChannelInfo::controllerChanged(int id)              patch->setText(mi->getPatchName(midic->channelNo(), val));              }        } +#endif diff --git a/muse/muse/arranger/trackinfo.h b/muse/muse/arranger/trackinfo.h index 8ef253a8..2b72e584 100644 --- a/muse/muse/arranger/trackinfo.h +++ b/muse/muse/arranger/trackinfo.h @@ -69,7 +69,6 @@ class MidiTrackInfo : public TrackInfo {        Q_OBJECT        Ui::MidiTrackInfoBase mt; -      Ui::MidiChannelInfoBase mc;        Ui::MidiPortInfoBase mp;        QComboBox* port;        QComboBox* channel; @@ -94,6 +93,31 @@ class MidiTrackInfo : public TrackInfo {        MidiTrackInfo();        virtual void init(Track*);        }; +#if 0 +//--------------------------------------------------------- +//   MidiChannelInfo +//--------------------------------------------------------- + +class MidiChannelInfo : public TrackInfo { +      Q_OBJECT + +      TLLineEdit* portName; +      QComboBox* instrument; +      QPushButton* patch; +      QMenu* pop; + +   private slots: +      void instrumentSelected(int); +      void instrumentChanged(); +      void controllerChanged(int); +      void patchClicked(); + +   public: +      MidiChannelInfo(); +      virtual void init(Track*); +      }; +#endif +  //---------------------------------------------------------  //   AudioOutputInfo @@ -202,28 +226,5 @@ class MidiInPortInfo : public TrackInfo {        MidiInPortInfo();        }; -//--------------------------------------------------------- -//   MidiChannelInfo -//--------------------------------------------------------- - -class MidiChannelInfo : public TrackInfo { -      Q_OBJECT - -      TLLineEdit* portName; -      QComboBox* instrument; -      QPushButton* patch; -      QMenu* pop; - -   private slots: -      void instrumentSelected(int); -      void instrumentChanged(); -      void controllerChanged(int); -      void patchClicked(); - -   public: -      MidiChannelInfo(); -      virtual void init(Track*); -      }; -  #endif diff --git a/muse/muse/audio.cpp b/muse/muse/audio.cpp index 8674d287..ee98f85f 100644 --- a/muse/muse/audio.cpp +++ b/muse/muse/audio.cpp @@ -38,7 +38,6 @@  #include "synth.h"  #include "midioutport.h"  #include "midiinport.h" -#include "midichannel.h"  #include "midictrl.h"  #include "sync.h" @@ -538,10 +537,10 @@ void Audio::processMsg()  // printf("---msg %d\n", msg->id);        switch(msg->id) {              case AUDIO_ROUTEADD: -                  addRoute(msg->sroute, msg->droute); +                  addRoute(msg->route);                    break;              case AUDIO_ROUTEREMOVE: -                  removeRoute(msg->sroute, msg->droute); +                  removeRoute(msg->route);                    break;              case AUDIO_SET_CHANNELS:                    msg->track->setChannels(msg->ival); diff --git a/muse/muse/audio.h b/muse/muse/audio.h index 836c9321..11f30d5e 100644 --- a/muse/muse/audio.h +++ b/muse/muse/audio.h @@ -119,7 +119,7 @@ extern const char* seqMsgList[];  // for debug  struct AudioMsg : public ThreadMsg {   // this should be an union        int serialNo;        SndFile* downmix; -      Route sroute, droute; +      Route route;        int ival;        int iival;        CVal cval1, cval2; @@ -230,11 +230,11 @@ class Audio {        void msgPanic();        void sendMsg(AudioMsg*);        bool sendMessage(AudioMsg* m, bool doUndo); -      void msgRoute(bool add, Route, Route); -      void msgRemoveRoute(Route, Route); -      void msgRemoveRoute1(Route, Route); -      void msgAddRoute(Route, Route); -      void msgAddRoute1(Route, Route); +      void msgRoute(bool add, Route); +      void msgRemoveRoute(Route); +      void msgRemoveRoute1(Route); +      void msgAddRoute(Route); +      void msgAddRoute1(Route);        void msgAddPlugin(AudioTrack*, int idx, PluginI* plugin, bool prefader);        void msgAddMidiPlugin(MidiTrackBase*, int idx, MidiPluginI* plugin);        void msgSetMute(AudioTrack*, bool val); diff --git a/muse/muse/audiotrack.cpp b/muse/muse/audiotrack.cpp index b1a72db3..36efd4b3 100644 --- a/muse/muse/audiotrack.cpp +++ b/muse/muse/audiotrack.cpp @@ -569,21 +569,20 @@ bool AudioTrack::copy(int srcChannels, float** srcBuffer)  void AudioTrack::collectInputData()        {        bufferEmpty = false; -      RouteList* rl = inRoutes();        bool copyFlag = true; -      for (iRoute ir = rl->begin(); ir != rl->end(); ++ir) { +      foreach (const Route& r, _inRoutes) {              float** ptr;              int ch; -            if (ir->type == Route::TRACK) { -                  AudioTrack* track = (AudioTrack*)ir->track; +            if (r.src.type == RouteNode::TRACK) { +                  AudioTrack* track = (AudioTrack*)r.src.track;                    if (track->off() || song->bounceTrack == track)                          continue;                    ptr = track->buffer;                    ch  = track->channels();                    } -            else if (ir->type == Route::AUXPLUGIN) { -                  ch  = ir->plugin->channel(); -                  ptr = ir->plugin->buffer(); +            else if (r.src.type == RouteNode::AUXPLUGIN) { +                  ch  = r.src.plugin->channel(); +                  ptr = r.src.plugin->buffer();                    }              else                    printf("AudioTrack::collectInputRoutes(): bad route type\n"); diff --git a/muse/muse/conf.cpp b/muse/muse/conf.cpp index 315f163f..a6bf9a84 100644 --- a/muse/muse/conf.cpp +++ b/muse/muse/conf.cpp @@ -126,8 +126,8 @@ void readConfiguration(QDomNode node)                    config.trackBg[Track::MIDI_OUT] = readColor(node);              else if (tag == "midiInputBg")                    config.trackBg[Track::MIDI_IN] = readColor(node); -            else if (tag == "midiChannelBg") -                  config.trackBg[Track::MIDI_CHANNEL] = readColor(node); +//            else if (tag == "midiChannelBg") +//                  config.trackBg[Track::MIDI_CHANNEL] = readColor(node);              else if (tag == "midiSyntiBg")                    config.trackBg[Track::MIDI_SYNTI] = readColor(node);              else if (tag == "extendedMidi") @@ -425,7 +425,6 @@ void MusE::writeGlobalConfiguration(Xml& xml) const              "midiTrackBg",              "midiOutputBg",              "midiInputBg", -            "midiChannelBg",              "midiSyntiBg"              };        for (int i = 0; i < Track::TRACK_TYPES; ++i) diff --git a/muse/muse/ctrl/configmidictrl.cpp b/muse/muse/ctrl/configmidictrl.cpp index 9e01e029..c2436e12 100644 --- a/muse/muse/ctrl/configmidictrl.cpp +++ b/muse/muse/ctrl/configmidictrl.cpp @@ -21,7 +21,6 @@  #include "configmidictrl.h"  #include "miditrack.h"  #include "midioutport.h" -#include "midichannel.h"  #include "midictrl.h"  #include "midiout.h"  #include "instruments/minstrument.h" @@ -47,14 +46,10 @@ ConfigMidiCtrl::ConfigMidiCtrl(MidiTrack* t)        // populate list of available controllers        //--------------------------------------------------- -      MidiChannel* mc = 0; -      if (track->type() == Track::MIDI) -            mc = track->channel(); -      else if (track->type() == Track::MIDI_CHANNEL) -            mc = (MidiChannel*)track; -      if (mc) { -            MidiOut* mp = mc->port(); -            portName->setText(mp->track->name()); +      if (track->type() == Track::MIDI) { +#if 0 +            MidiTrack* mc = (MidiTrack*)track; +            portName->setText(track->name());              //              // populate popup with all controllers available for              // current instrument @@ -69,7 +64,9 @@ ConfigMidiCtrl::ConfigMidiCtrl(MidiTrack* t)                    if (i == cn->end())                          availableController->addItem((*ci)->name());                    } +#endif              } +        delete cn;        buttonAdd->setEnabled(false);        buttonRemove->setEnabled(false); @@ -141,14 +138,10 @@ void ConfigMidiCtrl::done(int code)              QDialog::done(code);              return;              } - -      MidiChannel* mc = 0; +#if 0 //TODOA        if (track->type() == Track::MIDI) -            mc = track->channel(); -      else if (track->type() == Track::MIDI_CHANNEL) -            mc = (MidiChannel*)track; +            MidiTrack* mc = (MidiTrack*)track; -      if (mc) {              MidiOut* port           = mc->port();              ControllerNameList* cn  = track->controllerNames();              MidiInstrument* instr   = port->instrument(); @@ -192,6 +185,7 @@ void ConfigMidiCtrl::done(int code)                    }              delete cn;              } +#endif        QDialog::done(code);        } diff --git a/muse/muse/ctrl/ctrldialog.cpp b/muse/muse/ctrl/ctrldialog.cpp index c9b4e7a7..a9715c83 100644 --- a/muse/muse/ctrl/ctrldialog.cpp +++ b/muse/muse/ctrl/ctrldialog.cpp @@ -22,7 +22,6 @@  #include "midictrl.h"  #include "track.h"  #include "miditrack.h" -#include "midichannel.h"  #include "audiotrack.h"  #include "plugin.h"  #include "pipeline.h" @@ -151,6 +150,7 @@ CtrlDialog::CtrlDialog(Track* track, int currentId, QWidget* parent)              //              //    add midi channel controller              // +#if 0 //TODOA              MidiChannel* mc = ((MidiTrack*)track)->channel();              if (mc) {                    ci = new QTreeWidgetItem(tw, CTRL_NO_CTRL); @@ -170,6 +170,7 @@ CtrlDialog::CtrlDialog(Track* track, int currentId, QWidget* parent)                                }                          }                    } +#endif              }        ci = new QTreeWidgetItem(tw, CTRL_OTHER);        ci->setText(0, tr("other")); diff --git a/muse/muse/ctrl/ctrleditor.cpp b/muse/muse/ctrl/ctrleditor.cpp index 6698e96e..32f3280b 100644 --- a/muse/muse/ctrl/ctrleditor.cpp +++ b/muse/muse/ctrl/ctrleditor.cpp @@ -87,7 +87,7 @@ void CtrlEditor::paint(QPainter& p, const QRect& r)        p.save();        p.setRenderHint(QPainter::Antialiasing, true); -      bool aR = ctrlTrack()->autoRead(); +      bool aR = track()->autoRead();        p.setPen(QPen(aR ? Qt::white : Qt::gray, 2));        TType tt = track()->timeType(); @@ -230,8 +230,9 @@ void CtrlEditor::mousePress(const QPoint& pos, int button, Qt::KeyboardModifiers              a = pop.exec(tc()->mapToGlobal(pos));              if (a) {                    int n = a->data().toInt(); -                  if (n == (1 << (TOOLS+1))) { -                        printf("TODO: start list editor\n"); +                  if (n == (1 << (TOOLS+1))) {  +                        Pos t(tc()->pix2pos(pos.x())); +                        muse->showListEditor(t, track(), ctrl());                          }                    else                          muse->setTool(n); @@ -256,7 +257,7 @@ void CtrlEditor::mousePress(const QPoint& pos, int button, Qt::KeyboardModifiers              else {                    // add controller:                    CVal val = ctrl()->pixel2val(dragy, wh); -                  song->addControllerVal(ctrlTrack(), ctrl(), selected, val); +                  song->addControllerVal(track(), ctrl(), selected, val);                    tc()->widget()->update();                    }              } @@ -284,7 +285,7 @@ void CtrlEditor::mousePress(const QPoint& pos, int button, Qt::KeyboardModifiers                          lselected = tc()->pos2pix(selected);                          if (tool == RubberTool || button == Qt::RightButton                            || modifiers & Qt::ControlModifier) { -                              song->removeControllerVal(ctrlTrack(), ctrl()->id(), i.key()); +                              song->removeControllerVal(track(), ctrl()->id(), i.key());                                dragy = -1;                                }                          else { @@ -373,7 +374,7 @@ void CtrlEditor::mouseRelease()                    int wh   = cheight();                    CVal val = ctrl()->pixel2val(dragy, wh);                    // modify controller: -                  song->addControllerVal(ctrlTrack(), ctrl(), selected, val); +                  song->addControllerVal(track(), ctrl(), selected, val);                    }              dragy = -1;              } @@ -460,7 +461,7 @@ void CtrlEditor::mouseMove(const QPoint& pos)                                else                                      selected.setFrame(i.key());                                lselected = tc()->pos2pix(selected); -                              song->removeControllerVal(ctrlTrack(), ctrl()->id(), i.key()); +                              song->removeControllerVal(track(), ctrl()->id(), i.key());                                dragy = -1;                                break;                                } diff --git a/muse/muse/ctrl/ctrleditor.h b/muse/muse/ctrl/ctrleditor.h index c1406436..1779631d 100644 --- a/muse/muse/ctrl/ctrleditor.h +++ b/muse/muse/ctrl/ctrleditor.h @@ -49,7 +49,6 @@ class CtrlEditor {        virtual TimeCanvas* tc() const = 0;        virtual int cheight()    const = 0;        virtual Track* track()   const = 0; -      virtual Track* ctrlTrack()   const = 0;        bool searchHandle(unsigned* time) const; diff --git a/muse/muse/driver/alsamidi.cpp b/muse/muse/driver/alsamidi.cpp index dc030d87..ae2ef5ea 100644 --- a/muse/muse/driver/alsamidi.cpp +++ b/muse/muse/driver/alsamidi.cpp @@ -334,6 +334,7 @@ void AlsaMidi::getOutputPollFd(struct pollfd** p, int* n)  void AlsaMidi::addConnection(snd_seq_connect_t* ev)        { +#if 0 //TODOA        Port rs(ev->sender.client, ev->sender.port);        Port rd(ev->dest.client, ev->dest.port); @@ -343,7 +344,7 @@ void AlsaMidi::addConnection(snd_seq_connect_t* ev)              Port src = oport->alsaPort(0);              if (src == rs) { -                  Route r(rd, Route::MIDIPORT); +                  RouteNode r(rd, Route::MIDIPORT);                    if (oport->outRoutes()->indexOf(r) == -1) {                          Port port(ev->dest.client, ev->dest.port);                          oport->outRoutes()->push_back(Route(port, -1, Route::MIDIPORT)); @@ -366,6 +367,7 @@ void AlsaMidi::addConnection(snd_seq_connect_t* ev)                    break;                    }              } +#endif        }  //--------------------------------------------------------- @@ -375,6 +377,7 @@ void AlsaMidi::addConnection(snd_seq_connect_t* ev)  void AlsaMidi::removeConnection(snd_seq_connect_t* ev)        { +#if 0 //TODOA        Port rs(ev->sender.client, ev->sender.port);        Port rd(ev->dest.client, ev->dest.port); @@ -411,6 +414,7 @@ void AlsaMidi::removeConnection(snd_seq_connect_t* ev)                    break;                    }              } +#endif        }  //--------------------------------------------------------- diff --git a/muse/muse/driver/jack.cpp b/muse/muse/driver/jack.cpp index 4fb29676..24525d1c 100644 --- a/muse/muse/driver/jack.cpp +++ b/muse/muse/driver/jack.cpp @@ -311,6 +311,7 @@ struct RouteRoute {  void JackAudio::graphChanged()        { +#if 0 //TODOA        QList<RouteRoute> rr;        QList<RouteRoute> ra; @@ -461,6 +462,7 @@ void JackAudio::graphChanged()              audio->msgRemoveRoute1(a.src, a.dst);        foreach(RouteRoute a, ra)              audio->msgAddRoute1(a.src, a.dst); +#endif        }  //static int xrun_callback(void*) diff --git a/muse/muse/exportmidi.cpp b/muse/muse/exportmidi.cpp index b6bd2a62..6f071b9d 100644 --- a/muse/muse/exportmidi.cpp +++ b/muse/muse/exportmidi.cpp @@ -34,7 +34,6 @@  #include "al/marker.h"  #include "part.h"  #include "exportmidi.h" -#include "midichannel.h"  //---------------------------------------------------------  //   addController @@ -149,8 +148,7 @@ void MusE::exportMidi()              MidiEventList* l = &(mft->events);              int port       = 0; // track->channel()->port();              int channel    = 0; -      	if (track->channel()) -            	channel = track->channel()->channelNo(); +            channel        = track->channelNo();              //-----------------------------------              //   managed controller @@ -213,23 +211,23 @@ void MusE::exportMidi()                                      //   apply trackinfo values                                      //--------------------------------------- -                                    if (track->transposition -                                       || track->velocity -                                       || track->compression != 100 -                                       || track->len != 100) { -                                          pitch += track->transposition; +                                    if (track->transposition() +                                       || track->velocity() +                                       || track->compression() != 100 +                                       || track->len() != 100) { +                                          pitch += track->transposition();                                            if (pitch > 127)                                                  pitch = 127;                                            if (pitch < 0)                                                  pitch = 0; -                                          velo += track->velocity; -                                          velo = (velo * track->compression) / 100; +                                          velo += track->velocity(); +                                          velo = (velo * track->compression()) / 100;                                            if (velo > 127)                                                  velo = 127;                                            if (velo < 1)           // no off event                                                  velo = 1; -                                          len = (len *  track->len) / 100; +                                          len = (len *  track->len()) / 100;                                            }                                      if (len <= 0)                                            len = 1; diff --git a/muse/muse/gconfig.cpp b/muse/muse/gconfig.cpp index 3fb98749..c926d919 100644 --- a/muse/muse/gconfig.cpp +++ b/muse/muse/gconfig.cpp @@ -62,7 +62,7 @@ GlobalConfigValues config = {              QColor(Qt::gray),             // midi;              QColor(Qt::gray),             // midiOut;              QColor(Qt::gray),             // midiIn; -            QColor(Qt::gray),             // midiChannel; +//            QColor(Qt::gray),             // midiChannel;              QColor(Qt::gray),             // midiSynti;              }, diff --git a/muse/muse/importmidi.cpp b/muse/muse/importmidi.cpp index 38a27f25..83cae602 100644 --- a/muse/muse/importmidi.cpp +++ b/muse/muse/importmidi.cpp @@ -39,7 +39,6 @@  #include "mixer/mixer.h"  #include "arranger/arranger.h"  #include "midictrl.h" -#include "midichannel.h"  #include "midiinport.h"  #include "midioutport.h" @@ -243,14 +242,16 @@ void MusE::importMidi(const QString &file)              //              // add connected channels              // -            MidiChannelList* mcl = song->midiChannel();              TrackList* tl       = song->tracks(); +#if 0 +            MidiChannelList* mcl = song->midiChannel();              for (iMidiChannel i = mcl->begin(); i != mcl->end(); ++i) {                    MidiChannel* mc = (MidiChannel*)*i;                    if (mc->noInRoute() || song->trackExists(mc))                          continue;                    tl->push_back(mc);                    } +#endif              selectionChanged();           // enable/disable "Copy" & "Paste"              arranger->endLoadSong(); @@ -427,16 +428,15 @@ void MusE::addMidiFile(const QString name)                          continue;                    MidiTrack* track = new MidiTrack(); -                  MidiChannel* mc = outPort->channel(channel);                    if ((*t)->isDrumTrack) -                        mc->setUseDrumMap(true); -                  track->outRoutes()->push_back(Route(outPort->channel(channel), -1, Route::TRACK)); -                  if (inPort && config.connectToAllMidiTracks) { -                        for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { -                              Route src(inPort, ch, Route::TRACK); -                              track->inRoutes()->push_back(src); -                              } -                        } +                        track->setUseDrumMap(true); +//TODOB                  track->outRoutes()->push_back(Route(outPort->channel(channel), -1, Route::TRACK)); +//                  if (inPort && config.connectToAllMidiTracks) { +//                        for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { +//                              Route src(inPort, ch, Route::TRACK); +//                              track->inRoutes()->push_back(src); +//                              } +//                        }                    EventList* mel = track->events();                    buildMidiEventList(mel, el, track, division, first); @@ -447,14 +447,14 @@ void MusE::addMidiFile(const QString name)                          if (event.type() == Controller) {                                int ctrl = event.dataA();                                MidiInstrument* instr = outPort->instrument(); -                              mc->addMidiController(instr, ctrl); +                              track->addMidiController(instr, ctrl);                                CVal val;                                val.i = event.dataB(); -                              mc->addControllerVal(ctrl, event.tick(), val); +                              track->addControllerVal(ctrl, event.tick(), val);                                }                          }                    if (channel == 9) { -                        mc->setUseDrumMap(true); +                        track->setUseDrumMap(true);                          //                          // remap drum pitch with drumInmap                          // @@ -480,7 +480,7 @@ void MusE::addMidiFile(const QString name)                    // (SYSEX or META)                    //                    MidiTrack* track = new MidiTrack(); -                  addRoute(Route(track, -1, Route::TRACK), Route(outPort->channel(0), -1, Route::TRACK)); +//                  addRoute(Route(track, -1, Route::TRACK), Route(track));                    EventList* mel = track->events();                    buildMidiEventList(mel, el, track, division, true);                    processTrack(track); diff --git a/muse/muse/liste/CMakeLists.txt b/muse/muse/liste/CMakeLists.txt index ad2be64c..dc5e769e 100644 --- a/muse/muse/liste/CMakeLists.txt +++ b/muse/muse/liste/CMakeLists.txt @@ -19,19 +19,16 @@  #=============================================================================  QT4_WRAP_CPP ( liste_mocs  -      listedit.h editevent.h  -#      editnotedialog.h +      listedit.h +      ctrllistedit.h        )  QT4_WRAP_UI ( liste_ui_headers  -      editnotedialog.ui         )  add_library ( liste STATIC  -      listedit.h editevent.h  -#      editnotedialog.h -#      editnotedialog.cpp -      listedit.cpp editevent.cpp  +      listedit.cpp listedit.h +      ctrllistedit.cpp ctrllistedit.h        ${liste_mocs}        ${liste_ui_headers}        ) @@ -39,3 +36,4 @@ set_target_properties( liste     PROPERTIES COMPILE_FLAGS "-include ${PROJECT_SOURCE_DIR}/all.h"     ) + diff --git a/muse/muse/liste/ctrllistedit.cpp b/muse/muse/liste/ctrllistedit.cpp new file mode 100644 index 00000000..05563bcf --- /dev/null +++ b/muse/muse/liste/ctrllistedit.cpp @@ -0,0 +1,31 @@ +//============================================================================= +//  MusE +//  Linux Music Editor +//  $Id:$ +// +//  Copyright (C) 2002-2006 by Werner Schweer and others +// +//  This program is free software; you can redistribute it and/or modify +//  it under the terms of the GNU General Public License version 2. +// +//  This program is distributed in the hope that it will be useful, +//  but WITHOUT ANY WARRANTY; without even the implied warranty of +//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +//  GNU General Public License for more details. +// +//  You should have received a copy of the GNU General Public License +//  along with this program; if not, write to the Free Software +//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +//============================================================================= + +#include "ctrllistedit.h" + +//--------------------------------------------------------- +//   CtrlListEditor +//--------------------------------------------------------- + +CtrlListEditor::CtrlListEditor(QWidget* parent) +   : QWidget(parent) +      { +      } + diff --git a/muse/muse/liste/ctrllistedit.h b/muse/muse/liste/ctrllistedit.h new file mode 100644 index 00000000..0966735d --- /dev/null +++ b/muse/muse/liste/ctrllistedit.h @@ -0,0 +1,38 @@ +//============================================================================= +//  MusE +//  Linux Music Editor +//  $Id:$ +// +//  Copyright (C) 2002-2006 by Werner Schweer and others +// +//  This program is free software; you can redistribute it and/or modify +//  it under the terms of the GNU General Public License version 2. +// +//  This program is distributed in the hope that it will be useful, +//  but WITHOUT ANY WARRANTY; without even the implied warranty of +//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +//  GNU General Public License for more details. +// +//  You should have received a copy of the GNU General Public License +//  along with this program; if not, write to the Free Software +//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +//============================================================================= + +#ifndef __CTRLLISTEDIT_H__ +#define __CTRLLISTEDIT_H__ + + +//--------------------------------------------------------- +//   CtrlListEditor +//--------------------------------------------------------- + +class CtrlListEditor : public QWidget { +      Q_OBJECT + +   public: +      CtrlListEditor(QWidget* parent = 0); +      }; +       + +#endif + diff --git a/muse/muse/liste/editctrlbase.ui b/muse/muse/liste/editctrlbase.ui deleted file mode 100644 index fa2f5b6f..00000000 --- a/muse/muse/liste/editctrlbase.ui +++ /dev/null @@ -1,288 +0,0 @@ -<ui version="4.0" > - <author></author> - <comment></comment> - <exportmacro></exportmacro> - <class>Dialog</class> - <widget class="QDialog" name="Dialog" > -  <property name="geometry" > -   <rect> -    <x>0</x> -    <y>0</y> -    <width>436</width> -    <height>361</height> -   </rect> -  </property> -  <property name="windowTitle" > -   <string>Dialog</string> -  </property> -  <layout class="QGridLayout" > -   <property name="margin" > -    <number>8</number> -   </property> -   <property name="spacing" > -    <number>6</number> -   </property> -   <item row="0" column="1" > -    <layout class="QGridLayout" > -     <property name="margin" > -      <number>0</number> -     </property> -     <property name="spacing" > -      <number>6</number> -     </property> -     <item row="3" column="0" colspan="2" > -      <widget class="QStackedWidget" name="stackedWidget" > -       <property name="currentIndex" > -        <number>0</number> -       </property> -       <widget class="QWidget" name="page" > -        <layout class="QGridLayout" > -         <property name="margin" > -          <number>8</number> -         </property> -         <property name="spacing" > -          <number>6</number> -         </property> -         <item row="4" column="0" > -          <widget class="QLabel" name="label_7" > -           <property name="text" > -            <string>Program</string> -           </property> -          </widget> -         </item> -         <item row="4" column="1" > -          <widget class="QSpinBox" name="program" /> -         </item> -         <item row="3" column="1" > -          <widget class="QSpinBox" name="lbank" /> -         </item> -         <item row="2" column="1" > -          <widget class="QSpinBox" name="hbank" /> -         </item> -         <item row="3" column="0" > -          <widget class="QLabel" name="label_6" > -           <property name="text" > -            <string>L-Bank</string> -           </property> -          </widget> -         </item> -         <item row="2" column="0" > -          <widget class="QLabel" name="label_5" > -           <property name="text" > -            <string>H-Bank</string> -           </property> -          </widget> -         </item> -         <item row="0" column="0" > -          <spacer> -           <property name="orientation" > -            <enum>Qt::Vertical</enum> -           </property> -           <property name="sizeHint" > -            <size> -             <width>20</width> -             <height>40</height> -            </size> -           </property> -          </spacer> -         </item> -         <item row="1" column="0" colspan="2" > -          <widget class="QPushButton" name="patchName" > -           <property name="text" > -            <string>Patch Name</string> -           </property> -          </widget> -         </item> -        </layout> -       </widget> -       <widget class="QWidget" name="page" > -        <layout class="QGridLayout" > -         <property name="margin" > -          <number>8</number> -         </property> -         <property name="spacing" > -          <number>6</number> -         </property> -         <item row="2" column="0" colspan="2" > -          <widget class="QLabel" name="label_9" > -           <property name="text" > -            <string>Value</string> -           </property> -          </widget> -         </item> -         <item row="1" column="0" > -          <widget class="QLabel" name="label_8" > -           <property name="text" > -            <string>Controller</string> -           </property> -          </widget> -         </item> -         <item row="1" column="2" colspan="2" > -          <widget class="QLabel" name="controllerName" > -           <property name="text" > -            <string>TextLabel</string> -           </property> -          </widget> -         </item> -         <item row="3" column="0" colspan="4" > -          <widget class="QSlider" name="valSlider" > -           <property name="orientation" > -            <enum>Qt::Horizontal</enum> -           </property> -          </widget> -         </item> -         <item row="2" column="3" > -          <widget class="QSpinBox" name="valSpinBox" /> -         </item> -         <item row="0" column="1" colspan="2" > -          <spacer> -           <property name="orientation" > -            <enum>Qt::Vertical</enum> -           </property> -           <property name="sizeHint" > -            <size> -             <width>20</width> -             <height>40</height> -            </size> -           </property> -          </spacer> -         </item> -        </layout> -       </widget> -      </widget> -     </item> -     <item row="1" column="1" > -      <widget class="QSpinBox" name="midiPort" /> -     </item> -     <item row="0" column="1" > -      <widget class="QSpinBox" name="spinBox" /> -     </item> -     <item row="0" column="0" > -      <widget class="QLabel" name="label_2" > -       <property name="text" > -        <string>Time Position:</string> -       </property> -      </widget> -     </item> -     <item row="1" column="0" > -      <widget class="QLabel" name="label_3" > -       <property name="text" > -        <string>Midi Port:</string> -       </property> -      </widget> -     </item> -     <item row="2" column="1" > -      <widget class="QSpinBox" name="midiChannel" /> -     </item> -     <item row="2" column="0" > -      <widget class="QLabel" name="label_4" > -       <property name="text" > -        <string>Midi Channel:</string> -       </property> -      </widget> -     </item> -    </layout> -   </item> -   <item row="0" column="0" > -    <layout class="QVBoxLayout" > -     <property name="margin" > -      <number>0</number> -     </property> -     <property name="spacing" > -      <number>6</number> -     </property> -     <item> -      <widget class="QLabel" name="label" > -       <property name="text" > -        <string>Available Controller:</string> -       </property> -      </widget> -     </item> -     <item> -      <widget class="QListWidget" name="ctrlList" /> -     </item> -     <item> -      <widget class="QPushButton" name="buttonNewController" > -       <property name="text" > -        <string>Create New Controller</string> -       </property> -      </widget> -     </item> -    </layout> -   </item> -   <item row="1" column="0" colspan="2" > -    <layout class="QHBoxLayout" > -     <property name="margin" > -      <number>0</number> -     </property> -     <property name="spacing" > -      <number>6</number> -     </property> -     <item> -      <spacer> -       <property name="orientation" > -        <enum>Qt::Horizontal</enum> -       </property> -       <property name="sizeHint" > -        <size> -         <width>131</width> -         <height>31</height> -        </size> -       </property> -      </spacer> -     </item> -     <item> -      <widget class="QPushButton" name="okButton" > -       <property name="text" > -        <string>OK</string> -       </property> -      </widget> -     </item> -     <item> -      <widget class="QPushButton" name="cancelButton" > -       <property name="text" > -        <string>Cancel</string> -       </property> -      </widget> -     </item> -    </layout> -   </item> -  </layout> - </widget> - <pixmapfunction></pixmapfunction> - <resources/> - <connections> -  <connection> -   <sender>okButton</sender> -   <signal>clicked()</signal> -   <receiver>Dialog</receiver> -   <slot>accept()</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>278</x> -     <y>253</y> -    </hint> -    <hint type="destinationlabel" > -     <x>96</x> -     <y>254</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>cancelButton</sender> -   <signal>clicked()</signal> -   <receiver>Dialog</receiver> -   <slot>reject()</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>369</x> -     <y>253</y> -    </hint> -    <hint type="destinationlabel" > -     <x>179</x> -     <y>282</y> -    </hint> -   </hints> -  </connection> - </connections> -</ui> diff --git a/muse/muse/liste/editevent.cpp b/muse/muse/liste/editevent.cpp deleted file mode 100644 index d203bc1c..00000000 --- a/muse/muse/liste/editevent.cpp +++ /dev/null @@ -1,542 +0,0 @@ -//========================================================= -//  MusE -//  Linux Music Editor -//    $Id: editevent.cpp,v 1.26 2005/11/04 12:03:47 wschweer Exp $ -//  (C) Copyright 1999-2004 Werner Schweer (ws@seh.de) -//========================================================= - -#include "song.h" -#include "event.h" -#include "midictrl.h" -#include "editevent.h" -#include "awl/pitchlabel.h" -#include "awl/pitchedit.h" -#include "globals.h" -#include "awl/posedit.h" -#include "gconfig.h" -#include "midiedit/drummap.h" -#include "instruments/minstrument.h" - -//--------------------------------------------------------- -//   string2qhex -//--------------------------------------------------------- - -QString string2hex(const unsigned char* data, int len) -      { -      QString d; -      QString s; -      for (int i = 0; i < len; ++i) { -            if ((i > 0) && ((i % 8)==0)) { -                  d += "\n"; -                  } -            else if (i) -                  d += " "; -            d += s.sprintf("0x%02x", data[i]); -            } -      return d; -      } - -//--------------------------------------------------------- -//   hex2string -//--------------------------------------------------------- - -char* hex2string(QWidget* parent, const char* src, int& len) -      { -      char buffer[2048]; -      char* dst = buffer; - -      while (*src) { -            while (*src == ' ' || *src == '\n') -                  ++src; -            char* ep; -            long val =  strtol(src, &ep, 0); -            if (ep == src) { -                  QMessageBox::information(parent, -                     QString("MusE"), -                     QWidget::tr("Cannot convert sysex string")); -                  return 0; -                  } -            src    = ep; -            *dst++ = val; -            if (dst - buffer >= 2048) { -                  QMessageBox::information(parent, -                     QString("MusE"), -                     QWidget::tr("Hex String too long (2048 bytes limit)")); -                  return 0; -                  } -            } -      len = dst - buffer; -      char* b = new char[len+1]; -      memcpy(b, buffer, len); -      b[len] = 0; -      return b; -      } - -//--------------------------------------------------------- -//   getEvent -//--------------------------------------------------------- - -Event EditNoteDialog::getEvent(int tick, const Event& event, QWidget* parent) -      { -      EditNoteDialog* dlg = new EditNoteDialog(tick, event, parent); -      Event nevent; -      if (dlg->exec() == QDialog::Accepted) { -            nevent = dlg->event(); -            } -      delete dlg; -      return nevent; -      } - -Event EditSysexDialog::getEvent(int tick, MidiInstrument* mi, const Event& event, QWidget* parent) -      { -      EditSysexDialog* dlg = new EditSysexDialog(tick, mi, event, parent); -      Event nevent; -      if (dlg->exec() == QDialog::Accepted) { -            nevent = dlg->event(); -            } -      delete dlg; -      return nevent; -      } - -Event EditMetaDialog::getEvent(int tick, const Event& event, QWidget* parent) -      { -      EditEventDialog* dlg = new EditMetaDialog(tick, event, parent); -      Event nevent; -      if (dlg->exec() == QDialog::Accepted) { -            nevent = dlg->event(); -            } -      delete dlg; -      return nevent; -      } - -Event EditCAfterDialog::getEvent(int tick, const Event& event, QWidget* parent) -      { -      EditEventDialog* dlg = new EditCAfterDialog(tick, event, parent); -      Event nevent; -      if (dlg->exec() == QDialog::Accepted) { -            nevent = dlg->event(); -            } -      delete dlg; -      return nevent; -      } - -Event EditPAfterDialog::getEvent(int tick, const Event& event, QWidget* parent) -      { -      EditEventDialog* dlg = new EditPAfterDialog(tick, event, parent); -      Event nevent; -      if (dlg->exec() == QDialog::Accepted) { -            nevent = dlg->event(); -            } -      delete dlg; -      return nevent; -      } - -//--------------------------------------------------------- -//   EditEventDialog -//--------------------------------------------------------- - -EditEventDialog::EditEventDialog(QWidget* parent) -//   : QDialog(parent, "edit event", true) -   : QDialog(parent) -      { -      QVBoxLayout* xlayout = new QVBoxLayout(this); -      layout1 = new QGridLayout; -      xlayout->addLayout(layout1); - -      //--------------------------------------------------- -      //  Ok, Cancel -      //--------------------------------------------------- - -      QBoxLayout* w5 = new QHBoxLayout; -      xlayout->addLayout(w5); -      QPushButton* okB = new QPushButton(tr("Ok"), this); -      okB->setDefault(true); -      QPushButton* cancelB = new QPushButton(tr("Cancel"), this); -      okB->setFixedWidth(80); -      cancelB->setFixedWidth(80); -      w5->addWidget(okB); -      w5->addSpacing(12); -      w5->addWidget(cancelB); -      w5->addStretch(1); -      connect(cancelB, SIGNAL(clicked()), SLOT(reject())); -      connect(okB, SIGNAL(clicked()), SLOT(accept())); -      } - -//--------------------------------------------------------- -//   EditNoteDialog -//--------------------------------------------------------- - -EditNoteDialog::EditNoteDialog(int tick, const Event& /*event*/, QWidget* parent) -//   : EditNoteDialogBase(parent) -   : QDialog(parent) -      { -//      if (!event.empty()) { -//TD            pos->setValue(tick); -//            il1->setValue(event.lenTick()); -//            pl->setValue(event.pitch()); -//            il2->setValue(event.velo()); -//            il3->setValue(event.veloOff()); -//            } -//      else { -//TD            pos->setValue(0); -//            il1->setValue(96); -//            pl->setValue(64); -//            il2->setValue(100); -//            il3->setValue(0); -//            } -      } - -//--------------------------------------------------------- -//   EditNoteDialog::event -//--------------------------------------------------------- - -Event EditNoteDialog::event() -      { -      Event event(Note); -//TD      event.setTick(pos->pos().tick()); -//      event.setA(pl->value()); -//      event.setB(il2->value()); -//      event.setC(il3->value()); -//      event.setLenTick(il1->value()); -      return event; -      } - -//--------------------------------------------------------- -//   EditSysExDialog -//--------------------------------------------------------- - -EditSysexDialog::EditSysexDialog(int tick, MidiInstrument* m, const Event& /*event*/, QWidget* parent) -//   : EditSysexDialogBase(parent) -   : QDialog(parent) -      { -#if 0 //TD -      sysex = 0; -      mi = m; -      if (mi) { -            std::vector<SysEx>* sl = mi->sysexList(); -            for (std::vector<SysEx>::iterator i = sl->begin(); i != sl->end(); ++i) { -                  SysEx se = *i; -                  sysexList->insertItem(se.name); -                  } -            } -      if (!event.empty()) { -            pos->setValue(tick); -            edit->setText(string2hex(event.data(), event.dataLen())); -            } -      else { -            pos->setValue(0); -            } -      listSelectionChanged(); // initialize Add button -      connect(sysexList, SIGNAL(selectionChanged()), SLOT(listSelectionChanged())); -      connect(buttonAdd, SIGNAL(clicked()), SLOT(addPressed())); -#endif -      } - -//--------------------------------------------------------- -//   addPressed -//--------------------------------------------------------- - -void EditSysexDialog::addPressed() -      { -#if 0 //TD -      Q3ListBoxItem* item = sysexList->selectedItem(); -      if (!item) -            return; -      std::vector<SysEx>* sl = mi->sysexList(); -      for (std::vector<SysEx>::iterator i = sl->begin(); i != sl->end(); ++i) { -            SysEx se = *i; -            if (se.name == item->text()) { -                  QString s = edit->text(); -                  if (!s.isEmpty()) -                        s += " "; -                  s += se.data; -                  edit->setText(s); -                  comment->setText(se.comment); -                  break; -                  } -            } -#endif -      } - -//--------------------------------------------------------- -//   listSelectionChanged -//--------------------------------------------------------- - -void EditSysexDialog::listSelectionChanged() -      { -//TD      Q3ListBoxItem* item = sysexList->selectedItem(); -//      buttonAdd->setEnabled(item); -      } - -//--------------------------------------------------------- -//   ~EditSysexDialog -//--------------------------------------------------------- - -EditSysexDialog::~EditSysexDialog() -      { -//TD      if (sysex) -//            delete sysex; -      } - -//--------------------------------------------------------- -//   EditSysExDialog::event -//--------------------------------------------------------- - -Event EditSysexDialog::event() -      { -      Event event(Sysex); -//TD      event.setTick(pos->pos().tick()); -      event.setData(sysex, len); -      return event; -      } - -//--------------------------------------------------------- -//   accept -//--------------------------------------------------------- - -void EditSysexDialog::accept() -      { -//TD      QString qsrc = edit->text(); -//      const char* src = qsrc.toLatin1().data(); - -//      sysex = (unsigned char*)hex2string(this, src, len); -//      if (sysex) -//            QDialog::accept(); -      } - -//--------------------------------------------------------- -//   EditMetaDialog -//--------------------------------------------------------- - -EditMetaDialog::EditMetaDialog(int tick, const Event& ev, QWidget* parent) -   : EditEventDialog(parent) -      { -#if 0 -      meta = 0; -      setWindowTitle(tr("MusE: Enter Meta Event")); - -      QLabel* l1 = new QLabel(tr("Time Position"), this); -      pos = new PosEdit; - -      QLabel* l2 = new QLabel(tr("Meta Type"), this); -      il2 = new IntLabel(-1, 0, 127, this, -1); -      il2->setFrame(true); -      il2->setDark(); - -      hexButton = new QRadioButton(tr("Enter Hex"), this, "hextoggle"); -      hexButton->setChecked(true); -      connect(hexButton, SIGNAL(toggled(bool)), SLOT(toggled(bool))); - -      edit = new Q3MultiLineEdit(this); -      edit->setFont(*config.fonts[5]); - -      if (!ev.empty()) { -            pos->setValue(tick); -            il2->setValue(ev.dataA()); -            toggled(true); -            edit->setText(string2hex(ev.data(), ev.dataLen())); -            } -      else { -            pos->setValue(0); -            il2->setValue(0); -            } - -      layout1->addWidget(l1,  0, 0); -      layout1->addWidget(pos, 0, 1, Qt::AlignLeft); -      layout1->addWidget(l2,  1, 0); -      layout1->addWidget(il2, 1, 1, Qt::AlignLeft); -      layout1->addMultiCellWidget(hexButton, 2, 2, 0, 1); -      layout1->addMultiCellWidget(edit, 3, 3, 0, 1); -#endif -      } - -//--------------------------------------------------------- -//   toggled -//--------------------------------------------------------- - -void EditMetaDialog::toggled(bool flag) -      { -#if 0 -      QString qsrc    = edit->text(); -      const char* src = qsrc.toLatin1().data(); -      edit->clear(); - -      QString dst; -      if (flag) {       // convert to hex -            dst = string2hex((unsigned char*)src, strlen(src)); -            } -      else {            // convert to string -            int len; -            dst = hex2string(this, src, len); -            } -      edit->setText(dst); -#endif -      } - -//--------------------------------------------------------- -//   ~EditMetaDialog -//--------------------------------------------------------- - -EditMetaDialog::~EditMetaDialog() -      { -      if (meta) -            delete meta; -      } - -//--------------------------------------------------------- -//   EditMetaDialog::event -//--------------------------------------------------------- - -Event EditMetaDialog::event() -      { -      Event event(Meta); -#if 0 -      event.setTick(pos->pos().tick()); -      event.setA(il2->value()); -      event.setData(meta, len);  // TODO ?? -#endif -      return event; -      } - -//--------------------------------------------------------- -//   accept -//--------------------------------------------------------- - -void EditMetaDialog::accept() -      { -#if 0 -      QString qsrc = edit->text(); -      const char* src = qsrc.toLatin1().data(); -      if (!hexButton->isChecked()) { -            meta = (unsigned char*)strdup(src); -            len  = strlen(src); -            QDialog::accept(); -            return; -            } - -      meta = (unsigned char*)hex2string(this, src, len); -      if (meta) -            QDialog::accept(); -#endif -      } - -//--------------------------------------------------------- -//   EditCAfterDialog -//--------------------------------------------------------- - -EditCAfterDialog::EditCAfterDialog(int tick, const Event& event, -   QWidget* parent) -   : EditEventDialog(parent) -      { -#if 0 -      setCaption(tr("MusE: Enter Channel Aftertouch")); - -      QLabel* l1 = new QLabel(tr("Time Position"), this); -      pos = new PosEdit; - -      QLabel* l2 = new QLabel(tr("Pressure"), this); -      il2  = new IntLabel(-1, 0, 127, this, -1); -      il2->setFrame(true); -      il2->setDark(); - -      QSlider* slider = new QSlider(0, 127, 1, 0, Qt::Horizontal, this); -      connect(slider, SIGNAL(valueChanged(int)), il2, SLOT(setValue(int))); -      connect(il2, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); - -      if (!event.empty()) { -            pos->setValue(tick); -            il2->setValue(event.dataA()); -            slider->setValue(event.dataA()); -            } -      else { -            pos->setValue(0); -            il2->setValue(64); -            slider->setValue(64); -            } - -      layout1->addWidget(l1,   0, 0); -      layout1->addWidget(pos,  0, 1, Qt::AlignLeft); -      layout1->addWidget(l2,   1, 0); -      layout1->addWidget(il2,  1, 1, Qt::AlignLeft); -      layout1->addMultiCellWidget(slider, 2, 2, 0, 1); -#endif -      } - -//--------------------------------------------------------- -//   EditCAfterDialog::event -//--------------------------------------------------------- - -Event EditCAfterDialog::event() -      { -      Event event(CAfter); -#if 0 -      event.setTick(pos->pos().tick()); -      event.setA(il2->value()); -#endif -      return event; -      } - -//--------------------------------------------------------- -//   EditPAfterDialog -//--------------------------------------------------------- - -EditPAfterDialog::EditPAfterDialog(int tick, const Event& event, -   QWidget* parent) -   : EditEventDialog(parent) -      { -#if 0 -      setCaption(tr("MusE: Enter Poly Aftertouch")); - -      QLabel* l1 = new QLabel(tr("Time Position"), this); -      pos = new PosEdit; - -      QLabel* l2 = new QLabel(tr("Pitch"), this); -      pl = new PitchLabel; - -      QLabel* l3 = new QLabel(tr("Pressure"), this); -      il2  = new IntLabel(-1, 0, 127, this, -1); -      il2->setFrame(true); -      il2->setDark(); - -      QSlider* slider = new QSlider(0, 127, 1, 0, Qt::Horizontal, this); -      connect(slider, SIGNAL(valueChanged(int)), il2, SLOT(setValue(int))); -      connect(il2, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); - -      if (!event.empty()) { -            pos->setValue(tick); -            pl->setValue(event.pitch()); -            il2->setValue(event.dataB()); -            slider->setValue(event.dataB()); -            } -      else { -            pos->setValue(0); -            pl->setValue(64); -            il2->setValue(64); -            slider->setValue(64); -            } - -      layout1->addWidget(l1,  0, 0); -      layout1->addWidget(pos, 0, 1, Qt::AlignLeft); -      layout1->addWidget(l2,  1, 0); -      layout1->addWidget(pl,  1, 1, Qt::AlignLeft); -      layout1->addWidget(l3,  2, 0); -      layout1->addWidget(il2, 2, 1, Qt::AlignLeft); -      layout1->addMultiCellWidget(slider, 3, 3, 0, 1); -#endif -      } - -//--------------------------------------------------------- -//   EditPAfterDialog::event -//--------------------------------------------------------- - -Event EditPAfterDialog::event() -      { -      Event event(CAfter); -#if 0 //TD -      event.setTick(pos->pos().tick()); -      event.setA(pl->value()); -      event.setB(il2->value()); -#endif -      return event; -      } - diff --git a/muse/muse/liste/editevent.h b/muse/muse/liste/editevent.h deleted file mode 100644 index 12909383..00000000 --- a/muse/muse/liste/editevent.h +++ /dev/null @@ -1,152 +0,0 @@ -//========================================================= -//  MusE -//  Linux Music Editor -//    $Id: editevent.h,v 1.16 2005/11/04 12:03:47 wschweer Exp $ -//  (C) Copyright 1999 Werner Schweer (ws@seh.de) -//========================================================= - -#ifndef __EDIT_EVENT_H__ -#define __EDIT_EVENT_H__ - -#include "ui_editnotedialog.h" -// #include "widgets/editsysexdialogbase.h" -#include "event.h" - -namespace Awl { -      class PosEdit; -      class PitchLabel; -      }; -using Awl::PosEdit; -using Awl::PitchLabel; - -// class IntLabel; -class MidiPart; -class MidiInstrument; - -//--------------------------------------------------------- -//   EditEventDialog -//--------------------------------------------------------- - -class EditEventDialog : public QDialog { -      Q_OBJECT - -   protected: -      QGridLayout* layout1; - -   public: -      EditEventDialog(QWidget* parent=0); -      virtual Event event() = 0; -      }; - -//--------------------------------------------------------- -//   EditNoteDialog -//--------------------------------------------------------- - -// class EditNoteDialog : public EditNoteDialogBase { -class EditNoteDialog : public QDialog { -      Q_OBJECT - -   public: -      EditNoteDialog(int tick, const Event&, QWidget* parent=0); -      static Event getEvent(int tick, const Event&, -         QWidget* parent = 0); -      virtual Event event(); -      }; - -//--------------------------------------------------------- -//   EditSysExDialog -//--------------------------------------------------------- - -// class EditSysexDialog : public EditSysexDialogBase { -class EditSysexDialog : public QDialog { -      Q_OBJECT - -      unsigned char* sysex; -      MidiInstrument* mi; - -      int len; - -   protected: -      QGridLayout* layout; - -   private slots: -      virtual void accept(); -      void addPressed(); -      void listSelectionChanged(); - -   public: -      EditSysexDialog(int tick, MidiInstrument*, const Event&, QWidget* parent=0); -      ~EditSysexDialog(); -      static Event getEvent(int tick, MidiInstrument*, const Event&, QWidget* parent = 0); -      virtual Event event(); -      }; - -//--------------------------------------------------------- -//   EditMetaDialog -//--------------------------------------------------------- - -class EditMetaDialog : public EditEventDialog { -      Q_OBJECT - -      unsigned char* meta; -      int len; -      PosEdit* pos; -      QTextEdit* edit; -//      IntLabel* il2; -      QRadioButton* hexButton; - -   protected: -      QGridLayout* layout; - -   private slots: -      virtual void accept(); -      void toggled(bool); - -   public: -      EditMetaDialog(int tick, const Event&, QWidget* parent=0); -      ~EditMetaDialog(); -      static Event getEvent(int tick, const Event&, QWidget* parent = 0); -      virtual Event event(); -      }; - -//--------------------------------------------------------- -//   EditCAfterDialog -//--------------------------------------------------------- - -class EditCAfterDialog : public EditEventDialog { -      Q_OBJECT - -      PosEdit* pos; -//      IntLabel* il2; - -   protected: -      QGridLayout* layout; - -   public: -      EditCAfterDialog(int tick, const Event&, QWidget* parent=0); -      static Event getEvent(int tick, const Event&, QWidget* parent = 0); -      virtual Event event(); -      }; - -//--------------------------------------------------------- -//   EditPAfterDialog -//--------------------------------------------------------- - -class EditPAfterDialog : public EditEventDialog { -      Q_OBJECT - -      PosEdit* pos; -      PitchLabel* pl; -//      IntLabel* il2; - -   protected: -      QGridLayout* layout; - -   public: -      EditPAfterDialog(int tick, const Event&, QWidget* parent=0); -      static Event getEvent(int tick, const Event&, QWidget* parent = 0); -      virtual Event event(); -      }; - -#endif - diff --git a/muse/muse/liste/editnotedialog.ui b/muse/muse/liste/editnotedialog.ui deleted file mode 100644 index d59d1c10..00000000 --- a/muse/muse/liste/editnotedialog.ui +++ /dev/null @@ -1,150 +0,0 @@ -<ui version="4.0" > - <author></author> - <comment></comment> - <exportmacro></exportmacro> - <class>EditNoteDialogBase</class> - <widget class="QDialog" name="EditNoteDialogBase" > -  <property name="geometry" > -   <rect> -    <x>0</x> -    <y>0</y> -    <width>400</width> -    <height>300</height> -   </rect> -  </property> -  <property name="windowTitle" > -   <string>Dialog</string> -  </property> -  <layout class="QGridLayout" > -   <property name="margin" > -    <number>8</number> -   </property> -   <property name="spacing" > -    <number>6</number> -   </property> -   <item row="0" column="1" > -    <widget class="QSpinBox" name="spinBox_5" /> -   </item> -   <item row="1" column="1" > -    <widget class="QSpinBox" name="spinBox_4" /> -   </item> -   <item row="2" column="1" > -    <widget class="QSpinBox" name="spinBox_3" /> -   </item> -   <item row="3" column="1" > -    <widget class="QSpinBox" name="spinBox_2" /> -   </item> -   <item row="4" column="1" > -    <widget class="QSpinBox" name="spinBox" /> -   </item> -   <item row="4" column="0" > -    <widget class="QLabel" name="label_5" > -     <property name="text" > -      <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Velocity Off:</p></body></html></string> -     </property> -    </widget> -   </item> -   <item row="3" column="0" > -    <widget class="QLabel" name="label_4" > -     <property name="text" > -      <string>Velocity On:</string> -     </property> -    </widget> -   </item> -   <item row="2" column="0" > -    <widget class="QLabel" name="label_3" > -     <property name="text" > -      <string><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pitch:</p></body></html></string> -     </property> -    </widget> -   </item> -   <item row="1" column="0" > -    <widget class="QLabel" name="label_2" > -     <property name="text" > -      <string>Length:</string> -     </property> -    </widget> -   </item> -   <item row="0" column="0" > -    <widget class="QLabel" name="label" > -     <property name="text" > -      <string>Time Position:</string> -     </property> -    </widget> -   </item> -   <item row="5" column="0" colspan="2" > -    <layout class="QHBoxLayout" > -     <property name="margin" > -      <number>0</number> -     </property> -     <property name="spacing" > -      <number>6</number> -     </property> -     <item> -      <spacer> -       <property name="orientation" > -        <enum>Qt::Horizontal</enum> -       </property> -       <property name="sizeHint" > -        <size> -         <width>131</width> -         <height>31</height> -        </size> -       </property> -      </spacer> -     </item> -     <item> -      <widget class="QPushButton" name="okButton" > -       <property name="text" > -        <string>OK</string> -       </property> -      </widget> -     </item> -     <item> -      <widget class="QPushButton" name="cancelButton" > -       <property name="text" > -        <string>Cancel</string> -       </property> -      </widget> -     </item> -    </layout> -   </item> -  </layout> - </widget> - <pixmapfunction></pixmapfunction> - <resources/> - <connections> -  <connection> -   <sender>okButton</sender> -   <signal>clicked()</signal> -   <receiver>EditNoteDialogBase</receiver> -   <slot>accept()</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>278</x> -     <y>253</y> -    </hint> -    <hint type="destinationlabel" > -     <x>96</x> -     <y>254</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>cancelButton</sender> -   <signal>clicked()</signal> -   <receiver>EditNoteDialogBase</receiver> -   <slot>reject()</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>369</x> -     <y>253</y> -    </hint> -    <hint type="destinationlabel" > -     <x>179</x> -     <y>282</y> -    </hint> -   </hints> -  </connection> - </connections> -</ui> diff --git a/muse/muse/liste/listedit.cpp b/muse/muse/liste/listedit.cpp index a7895968..9c06d375 100644 --- a/muse/muse/liste/listedit.cpp +++ b/muse/muse/liste/listedit.cpp @@ -1,1314 +1,174 @@ -//========================================================= +//=============================================================================  //  MusE  //  Linux Music Editor -//    $Id: listedit.cpp,v 1.43 2005/11/05 23:15:23 wschweer Exp $ -//  (C) Copyright 1999-2005 Werner Schweer (ws@seh.de) -//========================================================= +//  $Id:$ +// +//  Copyright (C) 2002-2006 by Werner Schweer and others +// +//  This program is free software; you can redistribute it and/or modify +//  it under the terms of the GNU General Public License version 2. +// +//  This program is distributed in the hope that it will be useful, +//  but WITHOUT ANY WARRANTY; without even the implied warranty of +//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +//  GNU General Public License for more details. +// +//  You should have received a copy of the GNU General Public License +//  along with this program; if not, write to the Free Software +//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +//============================================================================= -#if 0 //TD  #include "listedit.h" -#include "globals.h" -#include "icons.h" +#include "al/pos.h" +#include "ctrllistedit.h"  #include "song.h" -#include "audio.h" -#include "shortcuts.h" -#include "midi.h" -#include "event.h" -#include "midictrl.h" -#include "esettings.h" - -#include "al/xml.h" -#include "al/tempo.h" -#include "al/sig.h" -#include "awl/utils.h" -#include "awl/sigedit.h" -#include "awl/posedit.h" -#include "awl/pitchedit.h" - -#include "instruments/minstrument.h" - -enum { L_TIMESIG=1001, L_TEMPOSIG, L_NOTES, L_SYSEX, L_PAFTER, -       L_CAFTER, L_META, L_CTRL, L_WAVE, L_PART, L_TRACK -      }; - -//--------------------------------------------------------- -//   ListCtrl -//--------------------------------------------------------- - -struct ListCtrl { -      int tick; -      Track* track; -      int id; -      CVal val; -      ListCtrl(int t, Track* tr, int d, CVal v) { -            tick  = t; -            track = tr; -            id    = d; -            val   = v; -            } -      ListCtrl() { -            tick  = 0; -            track = 0; -            id    = 0; -            val.i = 0; -            } -      }; - -//--------------------------------------------------------- -//    midi_meta_name -//--------------------------------------------------------- - -static QString midiMetaComment(const Event& ev) -      { -      int meta  = ev.dataA(); -      QString s = midiMetaName(meta); - -      switch (meta) { -            case 0: -            case 0x2f: -            case 0x51: -            case 0x54: -            case 0x58: -            case 0x59: -            case 0x74: -            case 0x7f:  return s; - -            case 1 ... 15: -                  { -                  s += QString(": "); -                  const char* txt = (char*)(ev.data()); -                  int len = ev.dataLen(); -                  char buffer[len+1]; -                  memcpy(buffer, txt, len); -                  buffer[len] = 0; - -                  for (int i = 0; i < len; ++i) { -                        if (buffer[i] == '\n' || buffer[i] == '\r') -                        buffer[i] = ' '; -                        } -                  return s + QString(buffer); -                  } - -            case 0x20: -            case 0x21: -            default: -                  { -                  s += QString(": "); -                  int i; -                  int len = ev.lenTick(); -                  int n = len > 10 ? 10 : len; -                  for (i = 0; i < n; ++i) { -                        if (i >= ev.dataLen()) -                              break; -                        s += QString(" 0x"); -                        QString k; -                        k.setNum(ev.data()[i] & 0xff, 16); -                        s += k; -                        } -                  if (i == 10) -                        s += QString("..."); -                  return s; -                  } -            } -      } - -//--------------------------------------------------------- -//   paintCell -//--------------------------------------------------------- - -void LItem::paintCell(QPainter* p, const QColorGroup& cg, -   int column, int width, int align) -      { -      if (!p) -            return; -      Q3ListView *lv = listView(); -      if (!lv ) -            return; - -      if (isSelected() && (column == 0 || lv->allColumnsShowFocus())) { -            p->fillRect(0, 0, width, height(), cg.brush(QColorGroup::Highlight)); -            p->setPen(cg.highlightedText()); -            } -      else -            p->fillRect(0, 0, width, height(), QColor(200, 200, zebra ? 200 : 230)); - -      QString t = text(column); -      if (!t.isEmpty()) { -            if (!(align & Qt::AlignVCenter || align & Qt::AlignBottom)) -                  align |= Qt::AlignTop; -            int marg = lv->itemMargin(); -            p->drawText(marg, marg, width-marg-marg, height(), align, t); -            } -      } - -//--------------------------------------------------------- -//   text -//--------------------------------------------------------- - -QString LItem::text(int col) const -      { -      QString s; -      bool isMidi = lli()->track()->isMidiTrack(); - -      if (col == 0) { -            s.sprintf("%04d", _pos.tick()); -            return s; -            } -      if (col == 1) { -            int bar, beat; -            unsigned tick; -            AL::sigmap.tickValues(_pos.tick(), &bar, &beat, &tick); -            s.sprintf("%04d.%02d.%03d", bar+1, beat+1, tick); -            return s; -            } -      switch(_rtti) { -            case L_TIMESIG: -                  if (col == 2) -                        s = QString("Time"); -                  else if (col == 3) { -                        s.sprintf("%d/%d", _sig->z, _sig->n); -                        } -                  break; -            case L_TEMPOSIG: -                  if (col == 2) -                        s = QString("Tempo"); -                  else if (col == 3) { -                        double t = (1000000.0 * 60.0)/_tempo->tempo; -                        s.setNum(t, 'f', 3); -                        } -                  break; -            case L_NOTES: -                  if (col == 2) -                        s = "Note"; -                  else if (col == 3) -                        s = Awl::pitch2string(_event.dataA()); -                  else if (col == 4) -                        s.setNum(_event.dataB(), *showHex ? 16 : 10); -                  else if (col == 5) -                        s.setNum(_event.lenTick()); -                  break; - -            case L_WAVE: -                  if (col == 2) -                        s = "Wave"; -                  else if (col == 5) -                        s.setNum(_event.lenTick()); -                  break; - -            case L_SYSEX: -                  if (col == 2) -                        s = "SysEx"; -                  else if (col == 6) { -                        s = QString("len "); -                        QString k; -                        k.setNum(_event.dataLen()); -                        s += k; -                        s += QString(" "); - -                        s += nameSysex(_event.dataLen(), _event.data()); -                        int i; -                        for (i = 0; i < 10; ++i) { -                              if (i >= _event.dataLen()) -                                    break; -                              s += QString(" 0x"); -                              QString k; -                              k.setNum(_event.data()[i] & 0xff, 16); -                              s += k; -                              } -                        if (i == 10) -                              s += QString("..."); -                        } -                  break; -            case L_PAFTER: -                  if (col == 2) -                        s = "PAfter"; -                  else if (col == 3) -                        s.setNum(_event.dataA(), *showHex ? 16 : 10); -                  else if (col == 4) -                        s.setNum(_event.dataB(), *showHex ? 16 : 10); -                  break; -            case L_CAFTER: -                  if (col == 2) -                        s = "CAfter"; -                  else if (col == 3) -                        s.setNum(_event.dataA(), *showHex ? 16 : 10); -                  break; -            case L_META: -                  if (col == 2) -                        s = "Meta"; -                  else if (col == 3) -                        s.setNum(_event.dataA(), *showHex ? 16 : 10); -                  else if (col == 6) -                        s = midiMetaComment(_event); -                  break; - -            case L_CTRL: -                  if (col == 2) -                        s = QString("Ctrl"); -                  else if (col == 3) { -                        if (isMidi && lli()->ctrl() == CTRL_PROGRAM) { -                              s = "Prog"; -                              } -                        else -                              s.setNum(lli()->ctrl()); -                        } -                  else if (col == 4) { -                        if (isMidi) { -                              if (lli()->ctrl() == CTRL_PROGRAM) { -                                    int val = _val.i; -                                    int hb = (val >> 16) & 0xff; -                                    int lb = (val >>  8) & 0xff; -                                    int pr = (val) & 0xff; -                                    char buffer[16]; -                                    if (*showHex) { -                                          if (hb == 0xff) -                                                s += "--:"; -                                          else { -                                                sprintf(buffer, "%02x:", hb); -                                                s += buffer; -                                                } -                                          if (lb == 0xff) -                                                s += "--:"; -                                          else { -                                                sprintf(buffer, "%02x:", lb); -                                                s += buffer; -                                                } -                                          if (pr == 0xff) -                                                s += "--"; -                                          else { -                                                sprintf(buffer, "%02x", pr); -                                                s += buffer; -                                                } -                                          } -                                    else { -                                          if (hb == 0xff) -                                                s += "---:"; -                                          else { -                                                sprintf(buffer, "%03d:", hb); -                                                s += buffer; -                                                } -                                          if (lb == 0xff) -                                                s += "---:"; -                                          else { -                                                sprintf(buffer, "%03d:", lb); -                                                s += buffer; -                                                } -                                          if (pr == 0xff) -                                                s += "---"; -                                          else { -                                                sprintf(buffer, "%03d", pr); -                                                s += buffer; -                                                } -                                          } -                                    } -                              else -                                    s.setNum(_val.i, *showHex ? 16 : 10); -                              } -                        else -                              s.setNum(_val.f, 'f', 2); -                        } -                  else if (col == 6) -                        s = lli()->track()->getController(lli()->ctrl())->name(); -                  break; -            } -      return s; -      } - -//--------------------------------------------------------- -//   updateList -//--------------------------------------------------------- - -void ListEdit::updateList() -      { -      list->clear(); -      menuEdit->setItemEnabled(CMD_DELETE, false); -      menuEdit->setItemEnabled(CMD_INSERT_SIG, false); -      menuEdit->setItemEnabled(CMD_INSERT_TEMPO, false); - -      Q3ListViewItemIterator i(lists); -      for (; i.current(); ++i) { -            int id = i.current()->rtti(); -            if (id < 1000) -                  continue; -            LLItem* item = (LLItem*)(i.current()); -            if (!item->isOn()) -                  continue; -            switch (id) { -                  case L_TIMESIG: -                        menuEdit->setItemEnabled(CMD_INSERT_SIG, true); -                        for (AL::iSigEvent i = AL::sigmap.begin(); i != AL::sigmap.end(); ++i) { -                              LItem* item = new LItem(list, id, &showHex); -                              item->setPos(Pos(i->second->tick)); -                              item->setSigEvent(i->second); -                              } -                        break; -                  case L_TEMPOSIG: -                        menuEdit->setItemEnabled(CMD_INSERT_TEMPO, true); -                        for (AL::iTEvent i = AL::tempomap.begin(); i != AL::tempomap.end(); ++i) { -                              LItem* item = new LItem(list, id, &showHex); -                              item->setPos(Pos(i->second->tick)); -                              item->setTempo(i->second); -                              } -                        break; -                  case L_NOTES: -                  case L_SYSEX: -                  case L_PAFTER: -                  case L_CAFTER: -                  case L_META: -                        { -                        menuEdit->setItemEnabled(CMD_INSERT_NOTE, true); -                        menuEdit->setItemEnabled(CMD_INSERT_SYSEX, true); -                        menuEdit->setItemEnabled(CMD_INSERT_PAFTER, true); -                        menuEdit->setItemEnabled(CMD_INSERT_CAFTER, true); -                        menuEdit->setItemEnabled(CMD_INSERT_META, true); -                        MidiTrack* track = (MidiTrack*)(item->track()); -                        PartList* pl = track->parts(); -                        for (iPart ip = pl->begin(); ip !=pl->end(); ++ip) { -                              Part* part = ip->second; -                              EventList* el = part->events(); -                              for (iEvent i = el->begin(); i != el->end(); ++i) { -                                    EventType t = i->second.type(); -                                    if ((id == L_NOTES && t == Note) -                                       || (id == L_SYSEX && t == Sysex) -                                       || (id == L_PAFTER && t == PAfter) -                                       || (id == L_CAFTER && t == CAfter) -                                       || (id == L_META && t == Meta)) { -                                          LItem* litem = new LItem(list, id, &showHex); -                                          litem->setEvent(i->second); -                                          litem->setPos(Pos(i->first + ip->first)); -                                          litem->setPart(part); -                                          litem->setLLi(item); -                                          } -                                    } -                              } -                        } -                        break; - -                  case L_WAVE: -                        { -                        WaveTrack* track = (WaveTrack*)(item->track()); -                        PartList* pl = track->parts(); -                        for (iPart ip = pl->begin(); ip !=pl->end(); ++ip) { -                              Part* part = ip->second; -                              EventList* el = part->events(); -                              for (iEvent i = el->begin(); i != el->end(); ++i) { -                                    EventType t = i->second.type(); -                                    if (t != Wave) { -                                          printf("ListEdit::updateList(): wrong part type in wave track\n"); -                                          continue; -                                          } -                                    LItem* litem = new LItem(list, id, &showHex); -                                    litem->setEvent(i->second); -                                    litem->setPos(Pos(i->first + ip->first)); -                                    litem->setLLi(item); -                                    } -                              } -                        } -                        break; - -                  case L_CTRL: -                        { -                        menuEdit->setItemEnabled(CMD_INSERT_CTRL, true); -                        Track* track = item->track(); -                        CtrlList* cl = track->controller(); -                        for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) { -                              Ctrl* c = ic->second; -                              if (c->id() != item->ctrl()) -                                    continue; -                              for (iCtrlVal iv = c->begin(); iv != c->end(); ++iv) { -                                    LItem* litem = new LItem(list, id, &showHex); -                                    litem->setVal(iv->second); -                                    litem->setPos(Pos(iv->first)); -                                    litem->setLLi(item); -                                    } -                              } -                        } -                        break; -                  } -            } -      Q3ListViewItemIterator ii(list); -      bool f = false; -      for (; ii.current(); ++ii) { -            ((LItem*)(ii.current()))->setZebra(f); -            f = !f; -            } -      } - -//--------------------------------------------------------- -//   updateLists -//--------------------------------------------------------- - -void ListEdit::updateLists() -      { -      lists->clear(); - -      Q3ListViewItem* item = new Q3ListViewItem(lists, tr("Master")); -      LLItem* lit = new LLItem(item, "Tempo Signature", L_TEMPOSIG); -      connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); -      lit = new LLItem(item, "Time Signature", L_TIMESIG); -      connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); - -      TrackList* tracks = song->tracks(); -      for (irTrack it = tracks->rbegin(); it != tracks->rend(); ++it) { -            Track* track = *it; -            Q3ListViewItem* item = new Q3CheckListItem(lists, track->name(), Q3CheckListItem::CheckBoxController); -            genListsTrack(track, item); -            } -      updateList(); -      } +#include "part.h" +#include "ctrl.h"  //---------------------------------------------------------  //   ListEdit  //--------------------------------------------------------- -ListEdit::ListEdit(QWidget*, PartList*) -      { -      showHex    = false; -      curEditor  = 0; -      editItem   = 0; -      editCol    = -1; -      curPart    = 0; - -      setWindowTitle("MusE: List Editor"); - -      //---------Pulldown Menu---------------------------- -      menuEdit = new Q3PopupMenu(this); -      menuBar()->insertItem(tr("&Edit"), menuEdit); -//TD      undoRedo->addTo(menuEdit); -      menuEdit->addSeparator(); -      menuEdit->addAction(tr("Insert Tempo"), CMD_INSERT_TEMPO); -      menuEdit->addAction(tr("Insert Signature"), CMD_INSERT_SIG); -      menuEdit->addAction(tr("Insert Note"), CMD_INSERT_NOTE); -      menuEdit->addAction(tr("Insert SysEx"), CMD_INSERT_SYSEX); -      menuEdit->addAction(tr("Insert PolyAfterTouch"), CMD_INSERT_PAFTER); -      menuEdit->addAction(tr("Insert After Touch"), CMD_INSERT_CAFTER); -      menuEdit->addAction(tr("Insert Meta"), CMD_INSERT_META); -      menuEdit->addAction(tr("Insert Controller"), CMD_INSERT_CTRL); - -      menuEdit->insertSeparator(); -      menuEdit->insertItem(tr("Delete Event"), CMD_DELETE); -      menuEdit->setAccel(Qt::Key_Delete, CMD_DELETE); -      connect(menuEdit, SIGNAL(activated(int)), SLOT(cmd(int))); - -      menuView = new Q3PopupMenu(this); -      menuView->setCheckable(true); -      menuBar()->insertItem(tr("&View"), menuView); -      menuView->insertItem(tr("Hex Midi Values"), CMD_SET_HEX); -      menuView->insertItem(tr("Decimal Midi Values"), CMD_SET_DEC); -      menuView->setItemChecked(CMD_SET_HEX, showHex); -      menuView->setItemChecked(CMD_SET_DEC, !showHex); -      connect(menuView, SIGNAL(activated(int)), SLOT(cmd(int))); - -      listTools = new QToolBar(this, "list-tools"); -      listTools->setLabel(tr("List Tools")); -//TD      undoRedo->addTo(listTools); -      QToolBar* tb = new QToolBar(this, "CurPart"); -      tb->addWidget(new QLabel(tr("CurTrack:"))); -      tb_t  = new QLabel("----"); -      tb->addWidget(tb_t); -      tb_t->setFrameShape(Q3Frame::LineEditPanel); -      tb_t->setLineWidth(2); -      tb->addWidget(new QLabel(tr("CurPart:"))); -      tb_p  = new QLabel(tr("----")); -      tb->addWidget(tb_p); -      tb_p->setFrameShape(Q3Frame::LineEditPanel); -      tb_p->setLineWidth(2); - -      setCentralWidget(new QWidget(this, "qt_central_widget")); -      QGridLayout* grid = new QGridLayout(centralWidget(), 1, 1, 11, 6, "Form2Layout"); - -      splitter = new QSplitter(Qt::Horizontal, centralWidget()); -      splitter->setOpaqueResize(true); -      splitter->setChildrenCollapsible(true); - -      lists = new Q3ListView(splitter); -      lists->viewport()->setPaletteBackgroundColor(QColor(200, 200, 230)); -      lists->setRootIsDecorated(true); -      lists->addColumn(tr("Filter")); -      lists->setResizeMode(Q3ListView::LastColumn); -      lists->setColumnWidthMode(0, Q3ListView::Maximum); -      lists->setSorting(-1); -      splitter->setResizeMode(lists, QSplitter::Auto); - -      list = new Q3ListView(splitter); -      list->viewport()->setPaletteBackgroundColor(QColor(200, 200, 230)); - -      list->setAllColumnsShowFocus(true); -      list->setSelectionMode(Q3ListView::Single); -      list->addColumn(tr("Tick")); -      list->addColumn(tr("Bar")); -      list->addColumn(tr("Type")); -      list->addColumn(tr("Val 1")); -      list->addColumn(tr("Val 2")); -      list->addColumn(tr("Len")); -      list->addColumn(tr("Comment")); -      list->setResizeMode(Q3ListView::LastColumn); - -      list->setSorting(0); -      list->setColumnAlignment(0, Qt::AlignRight); - -      grid->addWidget(splitter, 0, 0); - -      sigEditor   = new Awl::SigEdit(list->viewport()); -      textEditor  = new QLineEdit(list->viewport()); -      pitchEditor = new Awl::PitchEdit(list->viewport()); -      posEditor   = new Awl::PosEdit; -      sigEditor->hide(); -      textEditor->hide(); -      pitchEditor->hide(); -      posEditor->hide(); - -      updateLists(); -      connect(list, SIGNAL(doubleClicked(Q3ListViewItem*,const QPoint&,int)), SLOT(editColumn(Q3ListViewItem*,const QPoint&,int))); -      connect(list->header(), SIGNAL(sizeChange(int,int,int)), SLOT(colResized())); -      connect(list, SIGNAL(selectionChanged()), SLOT(listSelectionChanged())); - -      connect(sigEditor, SIGNAL(returnPressed()), SLOT(returnPressed())); -      connect(textEditor, SIGNAL(returnPressed()), SLOT(returnPressed())); -      connect(pitchEditor, SIGNAL(returnPressed()), SLOT(returnPressed())); -      connect(posEditor, SIGNAL(returnPressed()), SLOT(returnPressed())); - -      connect(sigEditor, SIGNAL(escapePressed()), SLOT(escapePressed())); -      connect(pitchEditor, SIGNAL(escapePressed()), SLOT(escapePressed())); -      connect(posEditor, SIGNAL(escapePressed()), SLOT(escapePressed())); -      connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int))); -      connect(song, SIGNAL(trackAdded(Track*,int)), SLOT(trackAdded(Track*,int))); -      connect(song, SIGNAL(trackRemoved(Track*)), SLOT(trackRemoved(Track*))); -      } - -//--------------------------------------------------------- -//   ~ListEdit -//--------------------------------------------------------- - -ListEdit::~ListEdit() -      { -      } - -//--------------------------------------------------------- -//   editColumn -//--------------------------------------------------------- - -void ListEdit::editColumn(Q3ListViewItem* i, const QPoint&, int col) +ListEdit::ListEdit(QWidget*) +   : QWidget(0)        { -      if (i == 0 || col == 2 || col == -1) -            return; -      returnPressed();        // close all old editors +      setWindowTitle(tr("MusE: List Edit")); -      editItem = (LItem*)i; -      editCol  = col; +      QHBoxLayout* hbox = new QHBoxLayout; +      setLayout(hbox); -      int id = editItem->rtti(); +      QSplitter* split = new QSplitter; +      split->setOpaqueResize(true); +      hbox->addWidget(split); -      if (col == 1) { -            posEditor->setValue(editItem->tick()); -            curEditor = posEditor; -            } -      else if (id == L_TIMESIG && col == 3) { -            sigEditor->setValue(i->text(col)); -            curEditor = sigEditor; -            } -      else if (id == L_NOTES && col == 3) { -            pitchEditor->setValue(editItem->event().pitch()); -            curEditor = pitchEditor; -            } -      else if (id == L_SYSEX) { -#if 0 //TODO3 -            MidiTrack* track = (MidiTrack*)(editItem->part()->track()); -            MidiPort* mp = &midiPorts[track->outPort()]; -            MidiInstrument* instr = mp->instrument(); -            Event oEvent = editItem->event(); -            EditSysexDialog dl(editItem->tick(), instr, oEvent, list->viewport()); -            int rv = dl.exec(); -            if (rv == QDialog::Accepted) { -                  Event event = dl.event(); -                  audio->msgChangeEvent(oEvent, event, editItem->part(), true); -                  } -#endif -            editItem = 0; -            editCol  = -1; -            return; -            } -      else if (id == L_META) { -            Event oEvent = editItem->event(); -//TD            EditMetaDialog dl(editItem->tick(), oEvent, list->viewport()); -//            int rv = dl.exec(); -//            if (rv == QDialog::Accepted) { -//                  Event event = dl.event(); -//                  audio->msgChangeEvent(oEvent, event, editItem->part(), true); -//                  } -            editItem = 0; -            editCol  = -1; -            return; -            } -      else if (id == L_CTRL) { -            ListCtrl ctrl(editItem->tick(), editItem->lli()->track(), -               editItem->lli()->ctrl(), editItem->val()); +      list = new QTreeWidget; +      list->setColumnCount(1); +      list->setSelectionMode(QAbstractItemView::SingleSelection); +      list->setRootIsDecorated(true); +      list->setColumnCount(1); +      list->setHeaderLabels(QStringList("Element")); +      list->setSortingEnabled(false); +      list->setUniformRowHeights(true); +      split->addWidget(list); -            EditCtrlDialog dl(&ctrl, list->viewport()); +      stack = new QStackedWidget; +      split->addWidget(stack); +       +      ctrlPanel = new CtrlListEditor; +      stack->addWidget(ctrlPanel); -            int rv = dl.exec(); -            if (rv == QDialog::Accepted) { -                  song->addControllerVal(ctrl.track, ctrl.id, ctrl.tick, ctrl.val); -                  } -            editItem = 0; -            editCol  = -1; -            return; -            } -      else { -            textEditor->setText(i->text(col)); -            textEditor->selectAll(); -            curEditor = textEditor; -            } -      setEditorGeometry(); -      curEditor->show(); -      curEditor->setFocus(); +      connect(list, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), +         SLOT(itemChanged(QTreeWidgetItem*,QTreeWidgetItem*))); +      connect(list, SIGNAL(itemExpanded(QTreeWidgetItem*)), SLOT(itemExpanded(QTreeWidgetItem*))); +      connect(list, SIGNAL(itemCollapsed(QTreeWidgetItem*)), SLOT(itemExpanded(QTreeWidgetItem*))); +      list->resizeColumnToContents(0); +      resize(900, 300);        }  //--------------------------------------------------------- -//   setEditorGeometry +//   itemExpanded  //--------------------------------------------------------- -void ListEdit::setEditorGeometry() +void ListEdit::itemExpanded(QTreeWidgetItem*)        { -      int x1 = 0; -      for (int i = 0; i < editCol; ++i) -            x1 += list->columnWidth(i); -      QRect r(list->itemRect(editItem)); -      r.setX(x1); -      int w = list->columnWidth(editCol); -      int wHint = curEditor->sizeHint().width(); -      if (wHint > w) -            w = curEditor->sizeHint().width(); -      r.setWidth(w); -      curEditor->setGeometry(r); +      list->resizeColumnToContents(0);        }  //--------------------------------------------------------- -//   returnPressed +//   itemChanged  //--------------------------------------------------------- -void ListEdit::returnPressed() +void ListEdit::itemChanged(QTreeWidgetItem* i, QTreeWidgetItem*)        { -      if (editItem == 0) +      if (i == 0)              return; -      switch(editItem->rtti()) { -            case L_TIMESIG: -                  if (editCol == 3) { -                        Awl::Sig newSig = sigEditor->sig(); -                        int tick = editItem->tick(); -                        song->startUndo(); -                        audio->msgAddSig(tick, newSig.z, newSig.n, false); -                        song->endUndo(SC_SIG); -                        } -                  break; -            case L_TEMPOSIG: -                  if (editCol == 3) { -                        QString input = textEditor->text(); -                        const AL::TEvent* t = editItem->tempo(); -                        unsigned tick = t->tick; -                        bool conversionOK; -                        double dbl_input = input.toDouble(&conversionOK); -                        if (conversionOK && dbl_input < 250.0) { -                              int tempo = lrint((1000000.0 * 60.0)/dbl_input); -                              song->startUndo(); -                              audio->msgAddTempo(tick, tempo, false); -                              song->endUndo(SC_TEMPO); -                              } -                        else { -                              QMessageBox::warning(this, tr("MusE: List Editor"), -                                 tr("Input error, conversion not OK or value out of range"), -                                 QMessageBox::Ok, QMessageBox::NoButton -                                 ); -                              } -                        } -                  break; -            case L_NOTES: -                  { -                  } -                  break; -            case L_CTRL: +      QWidget* ew = ctrlPanel; +#if 0 +      Element* el = ((ElementItem*)i)->element(); +      setWindowTitle(QString("MuseScore: List Edit: ") + el->name()); +      ShowElementBase* ew = 0; +      switch (el->type()) { +            case PAGE:    ew = pagePanel;    break; +            case SYSTEM:  ew = systemPanel;  break; +            case MEASURE: ew = measurePanel; break; +            case CHORD:   ew = chordPanel;   break; +            case NOTE:    ew = notePanel;    break; +            case REST:    ew = restPanel;    break; +            case CLEF:    ew = clefPanel;    break; +            case TIMESIG: ew = timesigPanel; break; +            case KEYSIG:  ew = keysigPanel;  break; +            case SEGMENT: ew = segmentView;  break; +            case HAIRPIN: ew = hairpinView;  break; +            case BAR_LINE: ew = barLineView; break; +            case FINGERING: +            case TEXT: +                  ew = textView; +                  break; +            case ACCIDENTAL: +            default: +                  ew = elementView;                    break;              } -      escapePressed(); -      } - -//--------------------------------------------------------- -//   escapePressed -//--------------------------------------------------------- - -void ListEdit::escapePressed() -      { -      if (editItem == 0) -            return; -      curEditor->hide(); -      curEditor = 0; -      list->setFocus(); -      editItem  = 0; -      editCol   = -1; -      } - -//--------------------------------------------------------- -//   colResized -//--------------------------------------------------------- - -void ListEdit::colResized() -      { -      if (curEditor) -            setEditorGeometry(); -      } - -//--------------------------------------------------------- -//   readStatus -//--------------------------------------------------------- - -void ListEdit::readStatus(QDomNode node) -      { -      Q3ListViewItemIterator i(lists); - -      while (!node.isNull()) { -            QDomElement e = node.toElement(); -            QString tag(e.tagName()); -            QString s(e.text()); -            if (tag == "geometry") { -                  QRect r = AL::readGeometry(node); -                  setGeometry(r); -                  } -            else if (tag == "midiNumberBase") { -                  int base = s.toInt(); -                  if (base == 16) -                        showHex = true; -                  menuView->setItemChecked(CMD_SET_HEX, showHex); -                  menuView->setItemChecked(CMD_SET_DEC, !showHex); -                  } -            else if (tag == "splitter") -                  ; // TD splitter->readStatus(node.firstChild()); -            else if (tag == "list") { -                  QString name(e.attribute("name")); - -                  if (i.current()) { -                        if (i.current()->text(0) == name) { -                              int open = e.attribute("open","-1").toInt(); -                              int checked = e.attribute("checked","-1").toInt(); -                              if (open == 1) -                                    i.current()->setOpen(true); -                              else if (checked == 1) -                                    ((Q3CheckListItem*)(i.current()))->setOn(true); -                              } -                        else -                              printf("ListEdit::readStatus(): name mismatch <%s><%s>\n", -                                 i.current()->text(0).latin1(), s.latin1()); -                        ++i; -                        } -                  else { -                        printf("ListEdit::readStatus(): list too long\n"); -                        } -                  } -            else -                  printf("MusE:List::Edit::readStatus(): unknown tag %s\n", e.tagName().latin1()); -            node = node.nextSibling(); -            } -      } - -//--------------------------------------------------------- -//   writeStatus -//--------------------------------------------------------- - -void ListEdit::writeStatus(Xml& xml) const -      { -      xml.tag("listeditor"); -      xml.geometryTag("geometry", this); -      xml.intTag("midiNumberBase", showHex ? 16 : 10); -//TD      splitter->writeStatus(xml); - -      Q3ListViewItemIterator i(lists); -      for (; i.current(); ++i) { -            Q3ListViewItem* item = i.current(); -            int id = item->rtti(); -            if (id < 1000) -                  xml.tagE("list name=\"%s\" open=\"%d\"", -                     item->text(0).latin1(), item->isOpen()); -            else { -                  LLItem* ci = (LLItem*)item; -                  xml.tagE("list name=\"%s\" checked=\"%d\"", -                     item->text(0).latin1(), ci->isOn()); -                  } -            } -      xml.etag("listeditor"); -      } - -//--------------------------------------------------------- -//   cmd -//--------------------------------------------------------- - -void ListEdit::cmd(int cmd) -      { -      switch (cmd) { -            case CMD_SET_HEX: -                  showHex = true; -                  menuView->setItemChecked(CMD_SET_HEX, true); -                  menuView->setItemChecked(CMD_SET_DEC, false); -                  updateList(); -                  break; - -            case CMD_SET_DEC: -                  showHex = false; -                  menuView->setItemChecked(CMD_SET_HEX, false); -                  menuView->setItemChecked(CMD_SET_DEC, true); -                  updateList(); -                  break; - -            case CMD_DELETE: -                  { -                  Q3ListViewItem* l = list->selectedItem(); -                  if (!l) -                     return; -                  LItem* li = (LItem*)l; -                  switch(li->rtti()) { -                        case L_TIMESIG: -                              break; -                        case L_TEMPOSIG: -                              break; -                        case L_NOTES: -                        case L_SYSEX: -                        case L_PAFTER: -                        case L_CAFTER: -                        case L_META: -                              audio->msgDeleteEvent(li->event(), li->part(), true); -                              break; -                        case L_CTRL: -                              song->removeControllerVal(li->lli()->track(), -                                 li->lli()->ctrl(), li->tick()); -                              break; -                        } -                  break; -                  } -            case CMD_INSERT_TEMPO: -                  break; -            case CMD_INSERT_SIG: -                  break; -            case CMD_INSERT_NOTE: -                  { -                  if (curPart == 0) { -                        printf("first select part\n"); -                        break; -                        } -//TD                  Event event = EditNoteDialog::getEvent(0, Event(), this); -//                  if (!event.empty()) -//                        audio->msgAddEvent(event, curPart); -                  } -                  break; -            case CMD_INSERT_SYSEX: -                  { -                  if (curPart == 0) { -                        printf("first select part\n"); -                        break; -                        } -#if 0 // TODO3 -                  MidiTrack* track = (MidiTrack*)(curPart->track()); -                  MidiPort* mp = &midiPorts[track->outPort()]; -                  MidiInstrument* mi = mp->instrument(); -                  Event event = EditSysexDialog::getEvent(0, mi, Event(), this); -                  if (!event.empty()) -                        audio->msgAddEvent(event, curPart); +      ew->setElement(el);  #endif -                  } -                  break; -            case CMD_INSERT_PAFTER: -            case CMD_INSERT_CAFTER: -            case CMD_INSERT_META: -            case CMD_INSERT_CTRL: -                  { -//                  ListCtrl ctrl(0, 0, 0, 0, 0); -//                  if (EditCtrlDialog::editCtrl(&ctrl, this)) { -//                        printf("ADD CONTROLLER\n"); -//                        } -                  } -                  break; -            } -      } - -//--------------------------------------------------------- -//   listSelectionChanged -//--------------------------------------------------------- - -void ListEdit::listSelectionChanged() -      { -      Q3ListViewItem* item = list->selectedItem(); -      if (item == 0 || item->rtti() < 1000) { -            curPartChanged(0); -            return; -            } -      menuEdit->setItemEnabled(CMD_DELETE, true); -      LItem* i = (LItem*)item; -      switch(item->rtti()) { -            case L_NOTES: -            case L_SYSEX: -            case L_PAFTER: -            case L_CAFTER: -            case L_META: -                  curPartChanged((MidiPart*)(i->part())); -                  break; -            case L_TIMESIG: -            case L_TEMPOSIG: -            case L_CTRL: -                  curPartChanged(0); -                  break; -            } +      stack->setCurrentWidget(ew);        }  //--------------------------------------------------------- -//   songChanged +//   buildList  //--------------------------------------------------------- -void ListEdit::songChanged(int flags) +void ListEdit::buildList()        { -      if (flags & (SC_EVENT_INSERTED | SC_EVENT_REMOVED | SC_EVENT_MODIFIED | SC_SIG | SC_TEMPO)) { -            updateList(); -            } -      } - -//--------------------------------------------------------- -//   EditCtrlDialog -//    PosEdit* timePos; -//    QSlider* valSlider; -//    QSpinBox* valSpinBox; -//    QLabel* controllerName; -//    QListBox* ctrlList; -//    QPushButton* buttonNewController; -//--------------------------------------------------------- - -EditCtrlDialog::EditCtrlDialog(ListCtrl* c, QWidget* parent) -//   : EditCtrlBase(parent) -   : QDialog(parent) -      { -#if 0 -      ctrl = c; - -      pop = new Q3PopupMenu(this); -      pop->setCheckable(false); - -      bool isDrum = false; -      if (c->track->type() == Track::MIDI_CHANNEL) -            isDrum = ((MidiChannel*)c->track)->useDrumMap(); - -      if (c->track->isMidiTrack()) { -//TODO3            midiPort->setValue(((MidiTrack*)ctrl->track)->outPort() + 1); -//TODO3            midiChannel->setValue(((MidiTrack*)ctrl->track)->outChannel() + 1); -            } -      else { -            midiPort->setEnabled(false); -            midiChannel->setEnabled(false); -            } - -      ctrlList->clear(); -      ctrlList->setSelectionMode(Q3ListBox::Single); - -      // -      // populate list of available controller -      // - -      ControllerNameList* cnl = ctrl->track->controllerNames(); - +      list->clear(); +      TrackList* tl = song->tracks();        int idx = 0; -      for (iControllerName i = cnl->begin(); i != cnl->end(); ++i, ++idx) { -            int num  = i->id; -            // dont show drum specific controller if not a drum track -            if ((num & 0xff) == 0xff) { -                  if (!isDrum) -                        continue; -                  } -            ctrlList->insertItem(i->name); -            if (num == ctrl->id) -                  ctrlList->setSelected(idx, true); -            } - -      Ctrl* ct = ctrl->track->getController(ctrl->id); -      valSlider->setRange(ct->minVal().i, ct->maxVal().i); -      valSpinBox->setRange(ct->minVal().i, ct->maxVal().i); -      controllerName->setText(ct->name()); - -      connect(ctrlList, SIGNAL(clicked(Q3ListBoxItem*)), SLOT(ctrlListClicked(Q3ListBoxItem*))); -//TD      connect(buttonNewController, SIGNAL(pressed()), SLOT(newController())); -//      connect(hbank,   SIGNAL(valueChanged(int)), SLOT(programChanged())); -//      connect(lbank,   SIGNAL(valueChanged(int)), SLOT(programChanged())); -//      connect(program, SIGNAL(valueChanged(int)), SLOT(programChanged())); -//      connect(patchName, SIGNAL(released()), SLOT(instrPopup())); - -      ctrlListClicked(ctrlList->selectedItem()); - -      timePos->setValue(ctrl->tick); -      if (ctrl->id != CTRL_PROGRAM) -            valSlider->setValue(ctrl->val.i); -#endif -      } - -//--------------------------------------------------------- -//   newController -//--------------------------------------------------------- - -void EditCtrlDialog::newController() -      { -      if (!ctrl->track->isMidiTrack()) -            return; -      Q3PopupMenu* pop = new Q3PopupMenu(this); -      pop->setCheckable(this); -      // -      // populate popup with all controllers available for -      // current instrument -      // -#if 0 //TODO3 -      int portn               = ((MidiTrack*)ctrl->track)->outPort(); -      MidiPort* port          = &midiPorts[portn]; -      MidiInstrument* instr   = port->instrument(); -      MidiControllerList* mcl = instr->controller(); -      for (iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci) -            pop->insertItem((*ci)->name()); -      int rv = pop->exec(buttonNewController->mapToGlobal(QPoint(0,0))); -      if (rv != -1) { -            QString s = pop->text(rv); -            for (iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci) { -                  if ((*ci)->name() == s) { -                        for (int idx = 0; ;++idx) { -                              QString str = ctrlList->text(idx); -                              if (s == str) -                                    break; -                              if (str.isNull()) { -                                    ctrlList->insertItem(s); -                                    break; -                                    } -                              } +      for (iTrack i = tl->begin(); i != tl->end(); ++i,++idx) { +            Track* t = *i; +            QTreeWidgetItem* item = new QTreeWidgetItem; +            item->setText(0, t->name()); +            list->insertTopLevelItem(idx, item); +            PartList* pl = t->parts(); +            if (!pl->empty()) { +                  QTreeWidgetItem* pitem = new QTreeWidgetItem(item); +                  pitem->setText(0, tr("Parts")); +                  for (iPart i = pl->begin(); i != pl->end(); ++i) { +                        QTreeWidgetItem* ppitem = new QTreeWidgetItem(pitem); +                        ppitem->setText(0, i->second->name());                          }                    } -            } -#endif -      delete pop; -      } - -//--------------------------------------------------------- -//   ctrlListClicked -//--------------------------------------------------------- - -void EditCtrlDialog::ctrlListClicked(Q3ListBoxItem* item) -      { -#if 0 //TD -      if (item == 0) -            return; -      QString s(item->text()); - -      ControllerNameList* cnl = ctrl->track->controllerNames(); -      for (iControllerName i = cnl->begin(); i != cnl->end(); ++i) { -            if (s != i->name) -                  continue; -            int num = i->id; -            Ctrl* c = ctrl->track->getController(num); - -            if (num == CTRL_PROGRAM) { -                  widgetStack->raiseWidget(1); -                  updatePatch(); -                  } -            else { -                  widgetStack->raiseWidget(0); -                  valSlider->setRange(c->minVal().i, c->maxVal().i); -                  valSpinBox->setRange(c->minVal().i, c->maxVal().i); -                  controllerName->setText(s); -                  ctrl->val = c->getDefault(); -                  valSlider->setValue(ctrl->val.i); -                  } -            break; -            } -#endif -      } - -//--------------------------------------------------------- -//   setPatch -//--------------------------------------------------------- - -void EditCtrlDialog::updatePatch() -      { -#if 0 //TODO3 -      int port              = ((MidiTrack*)ctrl->track)->outPort(); -      int channel           = ((MidiTrack*)ctrl->track)->outChannel(); -      MidiInstrument* instr = midiPorts[port].instrument(); -      int val = ctrl->val.i; -      const char* name = instr->getPatchName(channel, val); -      patchName->setText(QString(name)); - -      int hb = ((val >> 16) & 0xff) + 1; -      if (hb == 0x100) -            hb = 0; -      int lb = ((val >> 8) & 0xff) + 1; -            if (lb == 0x100) -      lb = 0; -      int pr = (val & 0xff) + 1; -      if (pr == 0x100) -            pr = 0; - -      hbank->blockSignals(true); -      lbank->blockSignals(true); -      program->blockSignals(true); - -      hbank->setValue(hb); -      lbank->setValue(lb); -      program->setValue(pr); - -      hbank->blockSignals(false); -      lbank->blockSignals(false); -      program->blockSignals(false); -#endif -      } - -//--------------------------------------------------------- -//   instrPopup -//--------------------------------------------------------- - -void EditCtrlDialog::instrPopup() -      { -#if 0 //TODO3 -      int channel = ((MidiTrack*)ctrl->track)->outChannel(); -      int port    = ((MidiTrack*)ctrl->track)->outPort(); -      MidiInstrument* instr = midiPorts[port].instrument(); -      instr->populatePatchPopup(pop, channel); - -      int rv = pop->exec(patchName->mapToGlobal(QPoint(10,5))); -      if (rv != -1) { -            ctrl->val.i = rv; -            updatePatch(); -            } -#endif -      } - -//--------------------------------------------------------- -//   programChanged -//--------------------------------------------------------- - -void EditCtrlDialog::programChanged() -      { -#if 0 //TD -      int hb      = hbank->value(); -      int lb      = lbank->value(); -      int prog    = program->value(); - -      if (hb > 0 && hb < 129) -            hb -= 1; -      else -            hb = 0xff; -      if (lb > 0 && lb < 129) -            lb -= 1; -      else -            lb = 0xff; -      if (prog > 0 && prog < 129) -            prog -= 1; -      else -            prog = 0xff; - -      ctrl->val.i = (hb << 16) + (lb << 8) + prog; -      updatePatch(); -#endif -      } - -//--------------------------------------------------------- -//   trackAdded -//--------------------------------------------------------- - -void ListEdit::trackAdded(Track* track, int idx) -      { -      Q3ListViewItem* item; -      if (idx != 0) { -            Q3ListViewItem* item = lists->firstChild(); -            int i = 1; -            while (item) { -                  if (i == idx) { -                        item = new Q3ListViewItem(lists, item); -                        item->setText(0, track->name()); -                        break; +            CtrlList* cl = t->controller(); +            if (!cl->empty()) { +                  QTreeWidgetItem* citem = new QTreeWidgetItem(item); +                  citem->setText(0, tr("Controller")); +                  for (iCtrl i = cl->begin(); i != cl->end(); ++i) { +                        QTreeWidgetItem* ccitem = new QTreeWidgetItem(citem); +                        ccitem->setText(0, i->second->name());                          } -                  item = item->nextSibling(); -                  ++i;                    }              } -      else -            item = new Q3ListViewItem(lists, track->name()); -      genListsTrack(track, item);        }  //--------------------------------------------------------- -//   trackRemoved +//   selectItem  //--------------------------------------------------------- -void ListEdit::trackRemoved(Track* t) +void ListEdit::selectItem(const AL::Pos&, Track* track, Ctrl*)        { -      Q3ListViewItemIterator i(lists); -      for (; i.current(); ++i) { -            int id = i.current()->rtti(); -            if (id == 0 && t->name() == i.current()->text(0)) { -                  delete i.current(); +      stack->setCurrentWidget(ctrlPanel); +      buildList(); +      for (int i = 0;; ++i) { +            QTreeWidgetItem* item = list->topLevelItem(i); +            if (item == 0) { +                  printf("MusE::ListEdit: Element not found\n");                    break;                    } -            } -      updateList(); -      } - -//--------------------------------------------------------- -//   genListsTrack -//--------------------------------------------------------- - -void ListEdit::genListsTrack(Track* track, Q3ListViewItem* it) -      { -      LLItem* lit; -      ControllerNameList* cn = track->controllerNames(); -      for (iControllerName i = cn->begin(); i != cn->end(); ++i) { -            lit = new LLItem(it, i->name, L_CTRL); -            lit->setTrack(track); -            lit->setCtrl(i->id); -            connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); -            connect(track, SIGNAL(controllerChanged(int)), SLOT(updateList())); -            } -      PartList* pl = track->parts(); -      for (iPart ip = pl->begin(); ip != pl->end(); ++ip) { -            Part* part = ip->second; -            LLItem* item = new LLItem(it, tr("Part") + part->name(), L_PART); -            item->setPart(part); -            if (track->isMidiTrack()) { -                  lit = new LLItem(item, tr("Note On/Off"), L_NOTES); -                  lit->setTrack(track); -                  connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); -                  lit = new LLItem(item, tr("Aftertouch"), L_CAFTER); -                  lit->setTrack(track); -                  connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); -                  lit = new LLItem(item, tr("PolyAftertouch"), L_PAFTER); -                  lit->setTrack(track); -                  connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); -                  lit = new LLItem(item, tr("Sysex"), L_SYSEX); -                  lit->setTrack(track); -                  connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); -                  lit = new LLItem(item, tr("Meta"), L_META); -                  lit->setTrack(track); -                  connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); -                  } -            else if (track->type() == Track::WAVE) { -                  lit = new LLItem(item, tr("Waves"), L_WAVE); -                  lit->setTrack(track); -                  connect(lit, SIGNAL(clicked(LLItem*)), SLOT(updateList())); +            if (item->text(0) == track->name()) { +                  list->setItemExpanded(item, true); +                  list->setCurrentItem(item); +                  list->scrollToItem(item); +                  break;                    }              }        } -//--------------------------------------------------------- -//   curPartChanged -//--------------------------------------------------------- - -void ListEdit::curPartChanged(MidiPart* part) -      { -      curPart = part; - -      if (curPart) { -            tb_p->setText(curPart->name()); -            tb_t->setText(curPart->track()->name()); -            } -      else { -            tb_p->setText("----"); -            tb_t->setText("----"); -            } -      } -#endif - diff --git a/muse/muse/liste/listedit.h b/muse/muse/liste/listedit.h index 912d2650..e44b3019 100644 --- a/muse/muse/liste/listedit.h +++ b/muse/muse/liste/listedit.h @@ -1,214 +1,55 @@ -//========================================================= +//=============================================================================  //  MusE  //  Linux Music Editor -//    $Id: listedit.h,v 1.20 2005/11/04 12:03:47 wschweer Exp $ -//  (C) Copyright 1999-2005 Werner Schweer (ws@seh.de) -//========================================================= - -#ifndef __LIST_EDIT_H__ -#define __LIST_EDIT_H__ - -#include "widgets/noteinfo.h" -#include "al/pos.h" -#include "event.h" -#include "cobject.h" -#include "ctrl.h" - -namespace Awl { -      class SigEdit; -      }; +//  $Id:$ +// +//  Copyright (C) 2002-2006 by Werner Schweer and others +// +//  This program is free software; you can redistribute it and/or modify +//  it under the terms of the GNU General Public License version 2. +// +//  This program is distributed in the hope that it will be useful, +//  but WITHOUT ANY WARRANTY; without even the implied warranty of +//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +//  GNU General Public License for more details. +// +//  You should have received a copy of the GNU General Public License +//  along with this program; if not, write to the Free Software +//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +//============================================================================= + +#ifndef __LISTEDIT_H__ +#define __LISTEDIT_H__  namespace AL { -      class SigEvent; -      class TEvent; +      class Pos;        }; -class Event; -class MidiTrack; -class PartList; -class MidiPart; -class MidiPart;  class Track; -class EditorSettings;  class Ctrl; -class Part; - -#if 0 -//--------------------------------------------------------- -//   LLItem -//--------------------------------------------------------- - -class LLItem : public QObject, public Q3CheckListItem { -      Q_OBJECT - -      int _rtti; -      Track* _track; -      Part* _part; -      int _ctrl; - -      virtual void stateChange(bool) { -            emit clicked(this); -            } -      int width(const QFontMetrics&, const QListWidget*, int) const { -            return 155; -            } - -   signals: -      void clicked(LLItem*); - -   public: -      LLItem(QListWidgetItem* parent, const QString& text, int id) -         : QCheckListItem(parent, text, Q3CheckListItem::CheckBoxController) -            { -            _rtti = id; -            } - -      LLItem(Q3ListView* parent, const QString& text, int id) -         : Q3CheckListItem(parent, text, Q3CheckListItem::CheckBoxController) -            { -            _rtti = id; -            } -      virtual int rtti() const { return _rtti;  } -      void setTrack(Track* t)  { _track = t;    } -      Track* track() const     { return _track; } -      void setPart(Part* p)    { _part = p;     } -      Part* part() const       { return _part;  } -      void setCtrl(int id)     { _ctrl = id;    } -      int ctrl() const         { return _ctrl;  } -      }; - -//--------------------------------------------------------- -//   LItem -//--------------------------------------------------------- - -class LItem : public Q3ListViewItem { -      bool zebra; -      int _rtti; -      Pos _pos; -      bool* showHex; - -      AL::TEvent* _tempo; -      Event _event; -      Part* _part; -      AL::SigEvent* _sig; -      CVal _val; -      LLItem* _lli; - -      virtual void paintCell(QPainter*, const QColorGroup&, int, int, int); - -   public: -      LItem(Q3ListView* parent, int id, bool* shp) -         : Q3ListViewItem(parent) { -            showHex = shp; -            _rtti = id; -            zebra = false; -            } -      virtual int rtti() const { return _rtti; } -      virtual QString text(int col) const; -      void setPos(Pos p)        { _pos = p; } -      unsigned tick() const     { return _pos.tick(); } -      void setTempo(AL::TEvent* t)  { _tempo = t; } -      AL::TEvent* tempo() const     { return _tempo; } -      virtual int compare(Q3ListViewItem* i, int, bool) const { -            return _pos.tick() - ((LItem*)i)->_pos.tick(); -            } -      void setEvent(Event ev)       { _event = ev;   } -      Event event() const           { return _event; } -      void setVal(CVal v)           { _val = v;      } -      CVal val() const              { return _val;   } -      void setZebra(bool v)         { zebra = v;     } -      void setSigEvent(AL::SigEvent* e) { _sig = e;      } -      AL::SigEvent* sigEvent() const    { return _sig;   } -      void setPart(Part* p)         { _part = p;     } -      Part* part() const            { return _part;  } -      void setLLi(LLItem* i)        { _lli = i;      } -      LLItem* lli() const           { return _lli;   } -      }; +class CtrlListEditor;  //---------------------------------------------------------  //   ListEdit  //--------------------------------------------------------- -class ListEdit : public TopWin { -      Q_OBJECT -      Q3ListView* lists; -      Q3ListView* list; -      LItem* editItem; -      int editCol; -      QLineEdit* textEditor; -      Awl::SigEdit* sigEditor; -      Awl::PitchEdit* pitchEditor; -      Awl::PosEdit* posEditor; -      Q3PopupMenu* menuEdit; -      Q3PopupMenu* menuView; -      QLabel* tb_p;     // current part -      QLabel* tb_t;     // current track - -      MidiPart* curPart; -      QSplitter* splitter; - -      QToolBar* listTools; -      QWidget* curEditor; -      bool showHex;               // show midi values in hex - -      enum { CMD_DELETE, CMD_INSERT_SIG, CMD_INSERT_TEMPO, CMD_INSERT_NOTE, CMD_INSERT_SYSEX, -             CMD_INSERT_PAFTER, CMD_INSERT_CAFTER, CMD_INSERT_META, -             CMD_INSERT_CTRL, CMD_SET_DEC, CMD_SET_HEX -            }; - -      void setEditorGeometry(); -      void genListsTrack(Track*, Q3ListViewItem*); -      void curPartChanged(MidiPart* part); - -   private slots: -      void updateLists(); -      void editColumn(Q3ListViewItem*, const QPoint&, int col); -      void returnPressed(); -      void escapePressed(); -      virtual void colResized(); -      void cmd(int cmd); -      void listSelectionChanged(); -      void updateList(); -      void songChanged(int); -      void trackAdded(Track*, int idx); -      void trackRemoved(Track*); - -   public: -      ListEdit(QWidget* parent, PartList*); -      ~ListEdit(); -      virtual void readStatus(QDomNode); -      virtual void writeStatus(Xml&) const; -      }; - -class ListCtrl; - -//--------------------------------------------------------- -//   EditCtrlDialog -//--------------------------------------------------------- - -// class EditCtrlDialog : public EditCtrlBase  { -class EditCtrlDialog : public QDialog  { -      Q_OBJECT +class ListEdit : public QWidget { +      Q_OBJECT; -      ListCtrl* ctrl; -      Q3PopupMenu* pop; +      QStackedWidget* stack; +      QTreeWidget* list; +      CtrlListEditor* ctrlPanel; -      void updatePatch(); +      void buildList();     private slots: -      void ctrlListClicked(Q3ListBoxItem*); -      void newController(); -      void programChanged(); -      void instrPopup(); - -   protected: -      QGridLayout* layout; - +      void itemChanged(QTreeWidgetItem*, QTreeWidgetItem*); +      void itemExpanded(QTreeWidgetItem*);     public: -      EditCtrlDialog(ListCtrl*, QWidget* parent=0); +      ListEdit(QWidget* parent = 0); +      void selectItem(const AL::Pos&, Track*, Ctrl*);        };  #endif -#endif diff --git a/muse/muse/midi.cpp b/muse/muse/midi.cpp index d1d391fc..79eff684 100644 --- a/muse/muse/midi.cpp +++ b/muse/muse/midi.cpp @@ -40,7 +40,6 @@  #include "midiplugin.h"  #include "midiinport.h"  #include "midioutport.h" -#include "midichannel.h"  #include "instruments/minstrument.h"  extern void dump(const unsigned char* p, int n); @@ -210,10 +209,6 @@ void buildMidiEventList(EventList* del, const MidiEventList* el, MidiTrack* trac        int dataType = 0;   // 0 : disabled, 0x20000 : rpn, 0x30000 : nrpn        int channel = 0; -      MidiChannel* mc = track->channel(); -      if (mc) -            channel = mc->channelNo(); -        EventList mel;        int metaChannel = -1;        for (iMidiEvent i = el->begin(); i != el->end(); ++i) { @@ -238,8 +233,8 @@ void buildMidiEventList(EventList* del, const MidiEventList* el, MidiTrack* trac                    case ME_NOTEON:                          e.setType(Note); -                        if (mc && mc->useDrumMap()) { -                              int instr = mc->drumMap()->inmap(ev.dataA()); +                        if (track->useDrumMap()) { +                              int instr = track->drumMap()->inmap(ev.dataA());                                e.setPitch(instr);                                }                          else @@ -250,8 +245,8 @@ void buildMidiEventList(EventList* del, const MidiEventList* el, MidiTrack* trac                          break;                    case ME_NOTEOFF:                          e.setType(Note); -                        if (mc && mc->useDrumMap()) { -                              int instr = mc->drumMap()->inmap(ev.dataA()); +                        if (track->useDrumMap()) { +                              int instr = track->drumMap()->inmap(ev.dataA());                                e.setPitch(instr);                                }                          else @@ -574,18 +569,12 @@ void buildMidiEventList(EventList* del, const MidiEventList* el, MidiTrack* trac                    val.i = ev.dataB();                    bool found = false; -                  for (iRoute i = track->outRoutes()->begin(); i != track->outRoutes()->end(); ++i) { -                        MidiChannel* ch = (MidiChannel*)(i->track); -                        Ctrl* c = ch->getController(id); -                        if (c) { -                              found = true; -                              c->add(tick, val); -                              } -                        } -                  if (!found) { +                  Ctrl* c = track->getController(id); +                  if (c) +                        c->add(tick, val); +                  else                          // if no managed controller, store as event                          del->add(ev); -                        }                    }              else                    del->add(ev); @@ -617,9 +606,9 @@ void Audio::initDevices()                    mp->playMidiEvent(&ev);                    }              } -      MidiChannelList* mcl = song->midiChannel(); -      for (iMidiChannel i = mcl->begin(); i != mcl->end(); ++i) { -            MidiChannel* mc = *i; +      MidiTrackList* mcl = song->midis(); +      for (iMidiTrack i = mcl->begin(); i != mcl->end(); ++i) { +            MidiTrack* mc = *i;              if (mc->noInRoute())                    continue;              if (mc->autoRead()) { diff --git a/muse/muse/midichannel.cpp b/muse/muse/midichannel.cpp deleted file mode 100644 index 044c8a0a..00000000 --- a/muse/muse/midichannel.cpp +++ /dev/null @@ -1,181 +0,0 @@ -//============================================================================= -//  MusE -//  Linux Music Editor -//  $Id:$ -// -//  Copyright (C) 2002-2006 by Werner Schweer and others -// -//  This program is free software; you can redistribute it and/or modify -//  it under the terms of the GNU General Public License version 2. -// -//  This program is distributed in the hope that it will be useful, -//  but WITHOUT ANY WARRANTY; without even the implied warranty of -//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -//  GNU General Public License for more details. -// -//  You should have received a copy of the GNU General Public License -//  along with this program; if not, write to the Free Software -//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -//============================================================================= - -#include "song.h" -#include "midictrl.h" -#include "al/xml.h" -#include "midiedit/drummap.h" -#include "midichannel.h" -#include "midioutport.h" -#include "miditrack.h" -#include "instruments/minstrument.h" - -//--------------------------------------------------------- -//   MidiChannel -//--------------------------------------------------------- - -MidiChannel::MidiChannel(MidiOut* p, int ch) -   : MidiTrackBase() -      { -      _port       = p; -      _channelNo  = ch; -      _drumMap    = 0; -      _useDrumMap = false; -      initMidiController(); - -      // -      // create minimum set of managed controllers -      // to make midi mixer operational -      // -      MidiInstrument* mi = port()->instrument(); -      addMidiController(mi, CTRL_PROGRAM); -      addMidiController(mi, CTRL_VOLUME); -      addMidiController(mi, CTRL_PANPOT); -      addMidiController(mi, CTRL_REVERB_SEND); -      addMidiController(mi, CTRL_CHORUS_SEND); -      addMidiController(mi, CTRL_VARIATION_SEND); - -      // TODO: setDefault Values -      } - -//--------------------------------------------------------- -//   MidiChannel -//--------------------------------------------------------- - -MidiChannel::~MidiChannel() -      { -      } - -//--------------------------------------------------------- -//   MidiChannel::write -//--------------------------------------------------------- - -void MidiChannel::write(Xml& xml) const -      { -      xml.tag("MidiChannel idx=\"%d\"", _channelNo); -      MidiTrackBase::writeProperties(xml); -      xml.intTag("useDrumMap", _useDrumMap); -      xml.etag("MidiChannel"); -      } - -//--------------------------------------------------------- -//   MidiChannel::read -//--------------------------------------------------------- - -void MidiChannel::read(QDomNode node) -      { -      QString drumMapName; -      while (!node.isNull()) { -            QDomElement e = node.toElement(); -            QString tag(e.tagName()); -            if (tag == "useDrumMap") -                  _useDrumMap = e.text().toInt(); -            else if (MidiTrackBase::readProperties(node)) -                  printf("MusE:MidiChannel: unknown tag %s\n", tag.toLatin1().data()); -            node = node.nextSibling(); -            } -      MidiOut* op = port(); -      if (op) { -            MidiInstrument* mi = op->instrument(); -            int val = ctrlVal(CTRL_PROGRAM).i; -            _drumMap = mi->getDrumMap(val); -            } -      } - -//--------------------------------------------------------- -//   playMidiEvent -//--------------------------------------------------------- - -void MidiChannel::playMidiEvent(MidiEvent* ev) -      { -      if (ev->type() == ME_NOTEON) { -            _meter[0] += ev->dataB()/2; -            if (_meter[0] > 127.0f) -                  _meter[0] = 127.0f; -            } -      ev->setChannel(_channelNo); -      _port->playMidiEvent(ev); -      } - -//--------------------------------------------------------- -//   setUseDrumMap -//--------------------------------------------------------- - -void MidiChannel::setUseDrumMap(bool val) -      { -      if (_useDrumMap != val) { -            _useDrumMap = val; -            if (_useDrumMap) { -                  int val = ctrlVal(CTRL_PROGRAM).i; -                  MidiOut* op = port(); -                  MidiInstrument* mi = op->instrument(); -                  DrumMap* dm = mi->getDrumMap(val); -                  if (dm == 0) -                        dm = &gmDrumMap; -                  _drumMap = dm; -                  } -            else -                  _drumMap = &noDrumMap; -      	for (iRoute i = _inRoutes.begin(); i != _inRoutes.end(); ++i) { -                  MidiTrack* mt = (MidiTrack*)(i->track); -                  mt->changeDrumMap(); -                  } -            emit useDrumMapChanged(_useDrumMap); -            } -      } - -//--------------------------------------------------------- -//   emitControllerChanged -//--------------------------------------------------------- - -void MidiChannel::emitControllerChanged(int id) -      { -      if (id == CTRL_PROGRAM && _useDrumMap) { -            int val = ctrlVal(id).i; -            MidiOut* op = port(); -            MidiInstrument* mi = op->instrument(); -            DrumMap* dm = mi->getDrumMap(val); -            if (dm == 0) -                  dm = &gmDrumMap; -            if (dm != _drumMap) { -                  _drumMap = dm; -      		for (iRoute i = _inRoutes.begin(); i != _inRoutes.end(); ++i) { -                  	MidiTrack* mt = (MidiTrack*)(i->track); -	                  mt->changeDrumMap(); -      	            } -                  } -            } -      emit controllerChanged(id); -      } - -//--------------------------------------------------------- -//   isMute -//--------------------------------------------------------- - -bool MidiChannel::isMute() const -      { -      if (_solo) -            return false; -      if (song->solo()) -            return true; -      return _mute; -      } - - diff --git a/muse/muse/midichannel.h b/muse/muse/midichannel.h deleted file mode 100644 index 1ec0872f..00000000 --- a/muse/muse/midichannel.h +++ /dev/null @@ -1,78 +0,0 @@ -//============================================================================= -//  MusE -//  Linux Music Editor -//  $Id:$ -// -//  Copyright (C) 2002-2006 by Werner Schweer and others -// -//  This program is free software; you can redistribute it and/or modify -//  it under the terms of the GNU General Public License version 2. -// -//  This program is distributed in the hope that it will be useful, -//  but WITHOUT ANY WARRANTY; without even the implied warranty of -//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -//  GNU General Public License for more details. -// -//  You should have received a copy of the GNU General Public License -//  along with this program; if not, write to the Free Software -//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -//============================================================================= - -#ifndef __MIDICHANNEL_H__ -#define __MIDICHANNEL_H__ - -#include "track.h" - -class MidiOut; - -//--------------------------------------------------------- -//   MidiChannel -//--------------------------------------------------------- - -class MidiOutPort; - -class MidiChannel : public MidiTrackBase { -      Q_OBJECT - -      DrumMap* _drumMap; -      bool _useDrumMap; -      MidiOut* _port; -      int _channelNo; - -      void clearDevice(); - -   signals: -      void useDrumMapChanged(bool); - -   public: -      MidiChannel(MidiOut*, int); -      ~MidiChannel(); -      virtual TrackType type() const { return MIDI_CHANNEL; } - -      MidiOut* port() const               { return _port; } -      int channelNo() const               { return _channelNo; } - -      virtual void write(Xml&) const; -      virtual void read(QDomNode); -      virtual bool isMute() const; -      virtual Part* newPart(Part*, bool)  { return 0; } - -      bool guiVisible() const; -      bool hasGui() const; - -      // void putEvent(const MidiEvent&); -      void playMidiEvent(MidiEvent* ev); - -      bool useDrumMap() const            { return _useDrumMap;    } -      void setUseDrumMap(bool val); -      DrumMap* drumMap() const           { return _drumMap; } - -      virtual void emitControllerChanged(int id); -      }; - -typedef QList<MidiChannel*> MidiChannelList; -typedef MidiChannelList::iterator iMidiChannel; -typedef MidiChannelList::const_iterator ciMidiChannel; - -#endif - diff --git a/muse/muse/midiedit/ctrledit.cpp b/muse/muse/midiedit/ctrledit.cpp index 1c537162..d98c488a 100644 --- a/muse/muse/midiedit/ctrledit.cpp +++ b/muse/muse/midiedit/ctrledit.cpp @@ -27,7 +27,6 @@  #include "widgets/tools.h"  #include "miditrack.h"  #include "midioutport.h" -#include "midichannel.h"  //---------------------------------------------------------  //   CtrlEdit @@ -36,7 +35,6 @@  CtrlEdit::CtrlEdit(QWidget* parent, TimeCanvas* timeCanvas, Track* t)     :  QObject(parent), _track(t)        { -      _ctrlTrack    = t;        y             = 0;        _height       = 0;        setDrawCtrlName(true); @@ -76,30 +74,20 @@ void CtrlEdit::setCtrl(int id)        {        _ctrl = 0; -      if (_ctrlTrack->type() == Track::MIDI) { -            MidiTrack* mt = (MidiTrack*)_ctrlTrack; +      if (_track->type() == Track::MIDI) {              if (id == CTRL_VELOCITY)                    _ctrl = &veloList;              else if (id == CTRL_SVELOCITY)                    _ctrl = &sveloList;              else -                  _ctrl = _ctrlTrack->getController(id); -            if (!_ctrl) { -                  MidiChannel* mc = mt->channel(); -                  if (mc) { -                        _ctrl = mc->getController(id); -                        if (!_ctrl) { -                              _ctrl = mc->port()->track->getController(id); -                              } -                        } -                  } +                  _ctrl = _track->getController(id);              }        else -            _ctrl = _ctrlTrack->getController(id); +            _ctrl = _track->getController(id);        if (!_ctrl)              printf("CtrlEdit::setCtrl(%d): not found for track <%s>\n", id, -               _ctrlTrack->name().toLocal8Bit().data()); +               _track->name().toLocal8Bit().data());        }  //--------------------------------------------------------- @@ -115,7 +103,7 @@ void CtrlEdit::showControllerList()        else              id = CTRL_NO_CTRL;        for (;;) { -            CtrlDialog cd(_ctrlTrack, id); +            CtrlDialog cd(_track, id);              int rv = cd.exec();              if (rv != 1)                          return; @@ -140,12 +128,10 @@ void CtrlEdit::changeController(int id)        if (id == CTRL_VELOCITY) {              ctrlId = id;              _ctrl = &veloList; -            _ctrlTrack = _track;              }        else if (id == CTRL_SVELOCITY) {              ctrlId = id;              _ctrl = &sveloList; -            _ctrlTrack = _track;              }        else if (id == CTRL_OTHER) {   // "other"              if (track()->type() == Track::MIDI) { @@ -159,13 +145,6 @@ void CtrlEdit::changeController(int id)        else {              ctrlId = id;              _ctrl   = track()->getController(ctrlId); -            if (_ctrl == 0 && _track->type() == Track::MIDI) { -                  MidiChannel* mc = ((MidiTrack*)_track)->channel(); -                  _ctrl = mc->getController(ctrlId); -                  _ctrlTrack = mc; -                  } -            else -                  _ctrlTrack = _track;              }        _tc->updateCanvasB();        } diff --git a/muse/muse/midiedit/ctrledit.h b/muse/muse/midiedit/ctrledit.h index 9139a0c8..b05de053 100644 --- a/muse/muse/midiedit/ctrledit.h +++ b/muse/muse/midiedit/ctrledit.h @@ -35,7 +35,6 @@ class CtrlEdit : public QObject, public CtrlEditor {        Q_OBJECT      	Track* const _track; -      Track* _ctrlTrack;        Ctrl* _ctrl;        TimeCanvas* _tc;        int _height; @@ -43,7 +42,6 @@ class CtrlEdit : public QObject, public CtrlEditor {        virtual Ctrl* ctrl() const { return _ctrl; }        virtual TimeCanvas* tc() const { return _tc; }        virtual Track* track() const { return _track; } -      virtual Track* ctrlTrack() const { return _ctrlTrack; }     public:        int ctrlId; diff --git a/muse/muse/midiedit/ecanvas.cpp b/muse/muse/midiedit/ecanvas.cpp index a2917c8b..4c60a792 100644 --- a/muse/muse/midiedit/ecanvas.cpp +++ b/muse/muse/midiedit/ecanvas.cpp @@ -1103,7 +1103,7 @@ void EventCanvas::noteOn(int pitch, int velocity, bool shift)        {        DrumMap* dm = track()->drumMap();        if (!dm) -	      pitch += track()->transposition; +	      pitch += track()->transposition();        // play note:        if (editor->playEvents()) { @@ -1142,7 +1142,7 @@ void EventCanvas::noteOff(int pitch)              return;        DrumMap* dm = track()->drumMap();        if (!dm) -	      pitch += track()->transposition; +	      pitch += track()->transposition();        // release key:        MidiEvent e(0, 0, ME_NOTEON, pitch, 0); diff --git a/muse/muse/midiedit/prcanvas.cpp b/muse/muse/midiedit/prcanvas.cpp index 9356abad..23d7545b 100644 --- a/muse/muse/midiedit/prcanvas.cpp +++ b/muse/muse/midiedit/prcanvas.cpp @@ -206,9 +206,9 @@ void PianoCanvas::moveItem(CItem* item, DragType dtype)        int npitch  = y2pitch(item->my - wpos.y() + item->bbox.height()/2);        if (event.pitch() != npitch && editor->playEvents()) {              // release note: -            MidiEvent ev1(0, 0, 0x90, event.pitch() + track()->transposition, 0); +            MidiEvent ev1(0, 0, 0x90, event.pitch() + track()->transposition(), 0);              track()->playMidiEvent(&ev1); -            MidiEvent ev2(0, 0, 0x90, npitch + track()->transposition, event.velo()); +            MidiEvent ev2(0, 0, 0x90, npitch + track()->transposition(), event.velo());              track()->playMidiEvent(&ev2);              } @@ -613,7 +613,7 @@ void PianoCanvas::itemPressed(const CItem* item)        if (!editor->playEvents())              return;        Event event    = item->event; -      playedPitch    = event.pitch() + track()->transposition; +      playedPitch    = event.pitch() + track()->transposition();        int velo       = event.velo();        // play note: @@ -649,9 +649,9 @@ void PianoCanvas::itemMoved(const CItem* item)              MidiEvent ev1(0, 0, 0x90, playedPitch, 0);              track()->playMidiEvent(&ev1);              // play note: -            MidiEvent e2(0, 0, 0x90, npitch + track()->transposition, event.velo()); +            MidiEvent e2(0, 0, 0x90, npitch + track()->transposition(), event.velo());              track()->playMidiEvent(&e2); -            playedPitch = npitch + track()->transposition; +            playedPitch = npitch + track()->transposition();              }        } diff --git a/muse/muse/midiinport.cpp b/muse/muse/midiinport.cpp index a63aaaa0..f340cb94 100644 --- a/muse/muse/midiinport.cpp +++ b/muse/muse/midiinport.cpp @@ -220,11 +220,12 @@ void MidiInPort::beforeProcess()  //    called from jack process context  //--------------------------------------------------------- -void MidiInPort::getEvents(unsigned, unsigned, int /*ch*/, MidiEventList* dst) +void MidiInPort::getEvents(unsigned, unsigned, int ch, MidiEventList* dst)        {        int tmpRecordRead = recordRead;        for (int i = 0; i < tmpRecordCount; ++i) { -            dst->insert(recordFifo[tmpRecordRead]); +            if (ch == -1 || recordFifo[tmpRecordRead].channel() == ch) +                  dst->insert(recordFifo[tmpRecordRead]);              ++tmpRecordRead;              if (tmpRecordRead >= RECORD_FIFO_SIZE)                    tmpRecordRead = 0; diff --git a/muse/muse/midiout.cpp b/muse/muse/midiout.cpp index c07b2822..79928cb7 100644 --- a/muse/muse/midiout.cpp +++ b/muse/muse/midiout.cpp @@ -23,7 +23,6 @@  #include "track.h"  #include "al/tempo.h"  #include "event.h" -#include "midichannel.h"  #include "sync.h"  #include "audio.h"  #include "gconfig.h" @@ -199,6 +198,7 @@ void MidiOut::seek(unsigned tickPos, unsigned framePos)        //    set all controller        //--------------------------------------------------- +#if 0        for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {              MidiChannel* mc = channel(ch);              if (mc->mute() || mc->noInRoute() || !mc->autoRead()) @@ -212,6 +212,7 @@ void MidiOut::seek(unsigned tickPos, unsigned framePos)                          }                    }              } +#endif        }  //--------------------------------------------------------- @@ -239,6 +240,7 @@ void MidiOut::stop()        //    reset sustain        //--------------------------------------------------- +#if 0        for (int ch = 0; ch < MIDI_CHANNELS; ++ch) {              MidiChannel* mc = channel(ch);              if (mc->noInRoute()) @@ -249,6 +251,7 @@ void MidiOut::stop()                    track->routeEvent(ev);                    }              } +#endif        if (track->sendSync()) {              if (genMMC) {                    unsigned char mmcPos[] = { @@ -315,14 +318,15 @@ void MidiOut::reset()  //   process  //    Collect all midi events for the current process cycle and put  //    into _schedEvents queue. For note on events create the proper -//    note off events. The note off events maybe played after the +//    note off events. The note off events maybe played later after the  //    current process cycle.  //    From _schedEvents queue copy all events for the current cycle  //    to all output routes. Events routed to ALSA go into the   //    _playEvents queue which is processed by the MidiSeq thread.  //------------------------------------------------------------------- -void MidiOut::processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick, unsigned /*fromFrame*/, unsigned /*toFrame*/) +void MidiOut::processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick,  +   unsigned, unsigned)        {        while (!eventFifo.isEmpty())              el.insert(eventFifo.get()); @@ -343,46 +347,22 @@ void MidiOut::processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick,                          }                    }              } -      for (int ch = 0; ch < MIDI_CHANNELS; ++ch)  { -            MidiChannel* mc = channel(ch); - -            if (mc->mute() || mc->noInRoute()) +      foreach (const Route& r, *track->inRoutes()) { +            MidiTrackBase* t = (MidiTrackBase*)r.src.track; +            int dstChannel = r.dst.channel; +            if (t->isMute())                    continue; -            // collect channel controller -            if (fromTick != toTick) { -                  CtrlList* cl = mc->controller(); -                  for (iCtrl ic = cl->begin(); ic != cl->end(); ++ic) { -                        Ctrl* c = ic->second; -                        iCtrlVal is = c->lowerBound(fromTick); -                        iCtrlVal ie = c->lowerBound(toTick); -                        for (; is != ie; ++is) { -                              unsigned frame = AL::tempomap.tick2frame(is.key()); -                              Event ev(Controller); -                              ev.setA(c->id()); -                              ev.setB(is.value().i); -                              el.insert(MidiEvent(frame, ch, ev)); -                              } -                        } -                  } - -            // Collect midievents from all input tracks for outport -            RouteList* rl = mc->inRoutes(); -            for (iRoute i = rl->begin(); i != rl->end(); ++i) { -                  MidiTrackBase* track = (MidiTrackBase*)i->track; -                  if (track->isMute()) -                        continue; -                  MidiEventList ell; -                  track->getEvents(fromTick, toTick, 0, &ell); -                  int velo = 0; -                  for (iMidiEvent i = ell.begin(); i != ell.end(); ++i) { -                        MidiEvent ev(*i); -                        ev.setChannel(ch); -                        el.insert(ev); -                        if (ev.type() == ME_NOTEON) -                              velo += ev.dataB(); -                        } -                  mc->addMidiMeter(velo); +            MidiEventList ell; +            t->getEvents(fromTick, toTick, r.src.channel, &ell); +            int velo = 0; +            for (iMidiEvent i = ell.begin(); i != ell.end(); ++i) { +                  MidiEvent ev(*i); +                  ev.setChannel(dstChannel); +                  el.insert(ev); +                  if (ev.type() == ME_NOTEON) +                        velo += ev.dataB();                    } +            t->addMidiMeter(velo);              }        } diff --git a/muse/muse/midiout.h b/muse/muse/midiout.h index a76f3fe6..76835052 100644 --- a/muse/muse/midiout.h +++ b/muse/muse/midiout.h @@ -39,7 +39,6 @@ class MidiOut     public:        Track* track;        MidiInstrument* _instrument; -      MidiChannel* _channel[MIDI_CHANNELS];        MidiEventList _schedEvents;  // scheduled events by process()        // fifo for midi events send from gui @@ -49,7 +48,6 @@ class MidiOut        void processMidi(MidiEventList& el, unsigned fromTick, unsigned toTick,            unsigned fromFrame, unsigned toFrame); -      MidiChannel* channel(int n)           { return _channel[n]; }        MidiInstrument* instrument()          { return _instrument; }        void setInstrument(MidiInstrument* i) { _instrument = i; } diff --git a/muse/muse/midioutport.cpp b/muse/muse/midioutport.cpp index c3fc16fc..899dc70c 100644 --- a/muse/muse/midioutport.cpp +++ b/muse/muse/midioutport.cpp @@ -28,7 +28,6 @@  #include "driver/audiodev.h"  #include "audio.h"  #include "midioutport.h" -#include "midichannel.h"  #include "midiseq.h"  #include "sync.h"  #include "gconfig.h" @@ -43,8 +42,8 @@ MidiOutPort::MidiOutPort()        {        track      = this;        _instrument = genericMidiInstrument; -      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) -            _channel[ch] = new MidiChannel(this, ch); +//      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) +//            _channel[ch] = new MidiChannel(this, ch);        setDeviceId(127);        // all        addMidiController(_instrument, CTRL_MASTER_VOLUME);        _channels = 1; @@ -56,8 +55,8 @@ MidiOutPort::MidiOutPort()  MidiOutPort::~MidiOutPort()        { -      for (int ch = 0; ch < MIDI_CHANNEL; ++ch) -            delete _channel[ch]; +//      for (int ch = 0; ch < MIDI_CHANNEL; ++ch) +//            delete _channel[ch];        }  //--------------------------------------------------------- @@ -71,8 +70,8 @@ void MidiOutPort::setName(const QString& s)              midiDriver->setPortName(alsaPort(), s);        if (!jackPort().isZero())              audioDriver->setPortName(jackPort(), s); -      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) -            _channel[ch]->setDefaultName(); +//      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) +//            _channel[ch]->setDefaultName();        }  //--------------------------------------------------------- @@ -85,10 +84,10 @@ void MidiOutPort::write(Xml& xml) const        MidiTrackBase::writeProperties(xml);        if (_instrument)              xml.strTag("instrument", _instrument->iname()); -      for (int i = 0; i < MIDI_CHANNELS; ++i) { -            if (!_channel[i]->noInRoute()) -                  _channel[i]->write(xml); -            } +//      for (int i = 0; i < MIDI_CHANNELS; ++i) { +//            if (!_channel[i]->noInRoute()) +//                  _channel[i]->write(xml); +//            }        xml.intTag("sendSync", sendSync());        xml.intTag("deviceId", deviceId());        xml.etag("MidiOutPort"); @@ -103,11 +102,11 @@ void MidiOutPort::read(QDomNode node)        for (; !node.isNull(); node = node.nextSibling()) {              QDomElement e = node.toElement();              QString tag(e.tagName()); -            if (tag == "MidiChannel") { -                  int idx = e.attribute("idx", "0").toInt(); -                  _channel[idx]->read(node.firstChild()); -                  } -            else if (tag == "instrument") { +//            if (tag == "MidiChannel") { +//                  int idx = e.attribute("idx", "0").toInt(); +//                  _channel[idx]->read(node.firstChild()); +//                  } +            if (tag == "instrument") {                    QString iname = e.text();                    _instrument = registerMidiInstrument(iname);                    } @@ -138,6 +137,7 @@ void MidiOutPort::routeEvent(const MidiEvent& event)                          }                    setHwCtrlState(a, b);                    } +#if 0              else {                    MidiChannel* mc = channel(chn);                    // @@ -149,14 +149,15 @@ void MidiOutPort::routeEvent(const MidiEvent& event)                          }                    mc->setHwCtrlState(a, b);                    } +#endif              }        for (iRoute r = _outRoutes.begin(); r != _outRoutes.end(); ++r) { -            switch (r->type) { -                  case Route::MIDIPORT: +            switch (r->dst.type) { +                  case RouteNode::MIDIPORT:                          queueAlsaEvent(event);                          break; -                  case Route::JACKMIDIPORT: +                  case RouteNode::JACKMIDIPORT:                          queueJackEvent(event);                          break;                    default: diff --git a/muse/muse/midisynti.cpp b/muse/muse/midisynti.cpp index c74a2694..c542ebac 100644 --- a/muse/muse/midisynti.cpp +++ b/muse/muse/midisynti.cpp @@ -203,12 +203,11 @@ void MidiSynti::read(QDomNode node)  void MidiSynti::getEvents(unsigned from, unsigned to, int, MidiEventList* dst)        {        MidiEventList il; -      RouteList* rl = inRoutes(); -      for (iRoute i = rl->begin(); i != rl->end(); ++i) { -            MidiTrackBase* track = (MidiTrackBase*)i->track; +      foreach(const Route& r, *inRoutes()) { +            MidiTrackBase* track = (MidiTrackBase*)r.src.track;              if (track->isMute())                    continue; -            track->getEvents(from, to, i->channel, &il); +            track->getEvents(from, to, r.src.channel, &il);              }        MidiEventList ol;        _synti->apply(from, to, &il, &ol); diff --git a/muse/muse/miditrack.cpp b/muse/muse/miditrack.cpp index 546173d0..43c627e1 100644 --- a/muse/muse/miditrack.cpp +++ b/muse/muse/miditrack.cpp @@ -27,7 +27,6 @@  #include "part.h"  #include "al/tempo.h"  #include "midiedit/drummap.h" -#include "midichannel.h"  //---------------------------------------------------------  //   MidiTrack @@ -52,11 +51,11 @@ MidiTrack::~MidiTrack()  void MidiTrack::init()        { -      transposition  = 0; -      velocity       = 0; -      delay          = 0; -      len            = 100;          // percent -      compression    = 100;          // percent +      _transposition  = 0; +      _velocity       = 0; +      _delay          = 0; +      _len            = 100;          // percent +      _compression    = 100;          // percent        }  //--------------------------------------------------------- @@ -85,11 +84,12 @@ void MidiTrack::write(Xml& xml) const        xml.tag("miditrack");        MidiTrackBase::writeProperties(xml); -      xml.intTag("transposition", transposition); -      xml.intTag("velocity", velocity); -      xml.intTag("delay", delay); -      xml.intTag("len", len); -      xml.intTag("compression", compression); +      xml.intTag("transposition", _transposition); +      xml.intTag("velocity", _velocity); +      xml.intTag("delay", _delay); +      xml.intTag("len", _len); +      xml.intTag("compression", _compression); +      xml.intTag("useDrumMap", _useDrumMap);        const PartList* pl = cparts();        for (ciPart p = pl->begin(); p != pl->end(); ++p) @@ -109,15 +109,15 @@ void MidiTrack::read(QDomNode node)              QString s(e.text());              int i = s.toInt();              if (tag == "transposition") -                  transposition = i; +                  _transposition = i;              else if (tag == "velocity") -                  velocity = i; +                  _velocity = i;              else if (tag == "delay") -                  delay = i; +                  _delay = i;              else if (tag == "len") -                  len = i; +                  _len = i;              else if (tag == "compression") -                  compression = i; +                  _compression = i;              else if (tag == "part") {                    Part* p = newPart();                    p->read(node); @@ -125,31 +125,21 @@ void MidiTrack::read(QDomNode node)                    }              else if (tag == "locked")                    _locked = i; +            else if (tag == "useDrumMap") +                  _useDrumMap = e.text().toInt();              else if (MidiTrackBase::readProperties(node))                    printf("MusE:MidiTrack: unknown tag %s\n", e.tagName().toLatin1().data());              }        }  //--------------------------------------------------------- -//   channel -//--------------------------------------------------------- - -MidiChannel* MidiTrack::channel() const -      { -      if (_outRoutes.empty()) -            return 0; -      return (MidiChannel*)(_outRoutes.front().track); -      } - -//---------------------------------------------------------  //   playMidiEvent  //---------------------------------------------------------  void MidiTrack::playMidiEvent(MidiEvent* ev)        { -      const RouteList* rl = &_outRoutes; -      for (ciRoute r = rl->begin(); r != rl->end(); ++r) { -            ((MidiChannel*)r->track)->playMidiEvent(ev); +      foreach (const Route& r, _outRoutes) { +            ((MidiOutPort*)r.dst.track)->playMidiEvent(ev);              }        } @@ -432,23 +422,23 @@ void MidiTrack::clone(MidiTrack* t)                    break;              }        setName(name); -      transposition = t->transposition; -      velocity      = t->velocity; -      delay         = t->delay; -      len           = t->len; -      compression   = t->compression; -      _recordFlag   = t->_recordFlag; -      _mute         = t->_mute; -      _solo         = t->_solo; -      _off          = t->_off; -      _monitor      = t->_monitor; -      _channels     = t->_channels; -      _locked       = t->_locked; -      _inRoutes     = t->_inRoutes; -      _outRoutes    = t->_outRoutes; -      _controller   = t->_controller; -      _autoRead     = t->_autoRead; -      _autoWrite    = t->_autoWrite; +      _transposition = t->_transposition; +      _velocity      = t->_velocity; +      _delay         = t->_delay; +      _len           = t->_len; +      _compression   = t->_compression; +      _recordFlag    = t->_recordFlag; +      _mute          = t->_mute; +      _solo          = t->_solo; +      _off           = t->_off; +      _monitor       = t->_monitor; +      _channels      = t->_channels; +      _locked        = t->_locked; +      _inRoutes      = t->_inRoutes; +      _outRoutes     = t->_outRoutes; +      _controller    = t->_controller; +      _autoRead      = t->_autoRead; +      _autoWrite     = t->_autoWrite;        }  //--------------------------------------------------------- @@ -464,20 +454,7 @@ bool MidiTrack::isMute() const        return _mute;        } -//--------------------------------------------------------- -//   drumMap -//	return drum map for this track -//	return zero if no drum map is used -//--------------------------------------------------------- - -DrumMap* MidiTrack::drumMap() const -	{ -      MidiChannel* mc = channel(); -      if (mc && mc->useDrumMap()) -            return mc->drumMap(); -	return 0; -      } - +#if 0  //---------------------------------------------------------  //   changeDrumMap  //--------------------------------------------------------- @@ -486,6 +463,7 @@ void MidiTrack::changeDrumMap() const  	{        emit drumMapChanged();        } +#endif  //---------------------------------------------------------  //   getEvents @@ -494,10 +472,6 @@ void MidiTrack::changeDrumMap() const  void MidiTrack::getEvents(unsigned from, unsigned to, int, MidiEventList* dst)        { -      if (from > to) { -            printf("getEvents(): FATAL: cur > next %d > %d\n", from, to); -            return; -            }  	//        // collect events only when transport is rolling        // @@ -507,7 +481,7 @@ void MidiTrack::getEvents(unsigned from, unsigned to, int, MidiEventList* dst)                    if (part->mute())                          continue;                    DrumMap* dm = ((MidiTrack*)part->track())->drumMap(); -                  unsigned offset = delay + part->tick(); +                  unsigned offset = _delay + part->tick();                    if (offset > to)                          break; @@ -532,19 +506,19 @@ void MidiTrack::getEvents(unsigned from, unsigned to, int, MidiEventList* dst)                                // maybe we should skip next lines if using a                                // drummap -                              int pitch = ev.pitch() + transposition + song->globalPitchShift(); +                              int pitch = ev.pitch() + _transposition + song->globalPitchShift();                                if (pitch > 127)                                      pitch = 127;                                if (pitch < 0)                                      pitch = 0;                                int velo  = ev.velo(); -                              velo += velocity; -                              velo = (velo * compression) / 100; +                              velo += _velocity; +                              velo = (velo * _compression) / 100;                                if (velo > 127)                                      velo = 127;                                if (velo < 1)           // no off event                                      velo = 1; -                              int elen = (ev.lenTick() * len)/100; +                              int elen = (ev.lenTick() * _len)/100;                                if (elen <= 0)     // dont allow zero length                                      elen = 1;                                int veloOff = ev.veloOff(); @@ -567,13 +541,12 @@ void MidiTrack::getEvents(unsigned from, unsigned to, int, MidiEventList* dst)        // process input routing        // -      RouteList* rl = inRoutes(); -      for (iRoute i = rl->begin(); i != rl->end(); ++i) { -            MidiTrackBase* track = (MidiTrackBase*)i->track; +      foreach(const Route& r, *inRoutes()) { +            MidiTrackBase* track = (MidiTrackBase*)r.src.track;              if (track->isMute())                    continue;              MidiEventList el; -            track->getEvents(from, to, i->channel, &el); +            track->getEvents(from, to, r.src.channel, &el);              for (iMidiEvent ie = el.begin(); ie != el.end(); ++ie) {                    MidiEvent event(*ie); @@ -587,15 +560,15 @@ void MidiTrack::getEvents(unsigned from, unsigned to, int, MidiEventList* dst)                    	addMidiMeter(event.dataB());                    if (monitor()) {                          if (event.type() == ME_NOTEON) { -                              int pitch = event.dataA() + transposition + song->globalPitchShift(); +                              int pitch = event.dataA() + _transposition + song->globalPitchShift();                                if (pitch > 127)                                      pitch = 127;                                if (pitch < 0)                                      pitch = 0;                                event.setA(pitch);                                if (!event.isNoteOff()) { -                                    int velo = event.dataB() + velocity; -                                    velo = (velo * compression) / 100; +                                    int velo = event.dataB() + _velocity; +                                    velo = (velo * _compression) / 100;                                      if (velo > 127)                                            velo = 127;                                      if (velo < 1) @@ -609,5 +582,99 @@ void MidiTrack::getEvents(unsigned from, unsigned to, int, MidiEventList* dst)                          }                    }              } +      // +      // collect controller +      // +      for (iCtrl ic = controller()->begin(); ic != controller()->end(); ++ic) { +            Ctrl* c = ic->second; +            iCtrlVal is = c->lowerBound(from); +            iCtrlVal ie = c->lowerBound(to); +            for (iCtrlVal ic = is; ic != ie; ++ic) { +                  unsigned frame = AL::tempomap.tick2frame(ic.key()); +                  Event ev(Controller); +                  ev.setA(c->id()); +                  ev.setB(ic.value().i); +                  dst->insert(MidiEvent(frame, -1, ev)); +                  } +            } +      } + +//--------------------------------------------------------- +//   emitControllerChanged +//--------------------------------------------------------- + +void MidiTrack::emitControllerChanged(int id) +      { +      if (id == CTRL_PROGRAM && _useDrumMap) { +            int val = ctrlVal(id).i; +            MidiInstrument* mi = instrument(); +            DrumMap* dm = mi->getDrumMap(val); +            if (dm == 0) +                  dm = &gmDrumMap; +            if (dm != _drumMap) +                  _drumMap = dm; +            emit drumMapChanged(); +            } +      emit controllerChanged(id); +      } + +//--------------------------------------------------------- +//   setUseDrumMap +//--------------------------------------------------------- + +void MidiTrack::setUseDrumMap(bool val) +      { +      if (_useDrumMap != val) { +            _useDrumMap = val; +            if (_useDrumMap) { +                  MidiInstrument* mi = instrument(); +                  DrumMap* dm; +                  if (mi) { +                        int val = ctrlVal(CTRL_PROGRAM).i; +                        dm = mi->getDrumMap(val); +                        if (dm == 0) +                              dm = &gmDrumMap; +                        } +                  _drumMap = dm; +                  } +            else +                  _drumMap = &noDrumMap; +            emit drumMapChanged(); +            emit useDrumMapChanged(_useDrumMap); +            } +      } + + +//--------------------------------------------------------- +//   instrument +//--------------------------------------------------------- + +MidiInstrument* MidiTrack::instrument() const +      { +      if (_outRoutes.isEmpty()) +            return genericMidiInstrument; +      return ((MidiOutPort*)_outRoutes[0].dst.track)->instrument(); +      } + +//--------------------------------------------------------- +//   channelNo +//--------------------------------------------------------- + +int MidiTrack::channelNo() const +      { +      if (_outRoutes.isEmpty()) +            return -1; +      return _outRoutes[0].dst.channel; +      } + +//--------------------------------------------------------- +//   midiOut +//--------------------------------------------------------- + +MidiOut* MidiTrack::midiOut() const +      { +      if (_outRoutes.isEmpty()) +            return 0; +      return (MidiOut*)_outRoutes[0].dst.track;        } diff --git a/muse/muse/miditrack.h b/muse/muse/miditrack.h index c7ecbc8b..3ee2a9bc 100644 --- a/muse/muse/miditrack.h +++ b/muse/muse/miditrack.h @@ -26,6 +26,7 @@  class Part;  class EventList; +class MidiOut;  //---------------------------------------------------------  //   MidiTrack @@ -34,12 +35,12 @@ class EventList;  class MidiTrack : public MidiTrackBase {        Q_OBJECT -      EventList* _events;     // tmp Events during midi import +      EventList* _events;        // tmp Events during midi import        // recording:        MidiFifo recordFifo;       // for event transfer from RT-thread to gui thread        std::list<Event> keyDown;  // keep track of "note on" events -      Part* recordPart;      // part we are recording into +      Part* recordPart;          // part we are recording into        int recordedEvents;        bool partCreated;        int hbank, lbank; @@ -47,27 +48,38 @@ class MidiTrack : public MidiTrackBase {        int rpnh, rpnl;        int dataType; +      // channel data: +      DrumMap* _drumMap; +      bool _useDrumMap; + +      // play parameter +      int _transposition; +      int _velocity; +      int _delay; +      int _len; +      int _compression; +     signals:        void drumMapChanged() const; +      void useDrumMapChanged(bool);     public:        MidiTrack();        virtual ~MidiTrack();        virtual TrackType type() const { return MIDI; } -        void clone(MidiTrack*); -        void init(); -      MidiChannel* channel() const; -      void changeDrumMap() const; - -      // play parameter -      int transposition; -      int velocity; -      int delay; -      int len; -      int compression; +      int transposition() const      { return _transposition; } +      int velocity() const           { return _velocity;     } +      int delay() const              { return _delay;        } +      int len() const                { return _len;          } +      int compression() const        { return  _compression; } +      void setTransposition(int val) { _transposition = val; } +      void setVelocity(int val)      { _velocity      = val; } +      void setDelay(int val)         { _delay         = val; } +      void setLen(int val)           { _len           = val; } +      void setCompression(int val)   { _compression   = val; }        void startRecording();        void recordBeat(); @@ -85,8 +97,15 @@ class MidiTrack : public MidiTrackBase {        void playMidiEvent(MidiEvent*);        virtual void getEvents(unsigned from, unsigned to, int channel, MidiEventList* dst); -      bool useDrumMap() const; -      DrumMap* drumMap() const; + +      bool useDrumMap() const             { return _useDrumMap;    } +      DrumMap* drumMap() const            { return _drumMap; } +      void setUseDrumMap(bool val); + +      int channelNo() const; +      virtual void emitControllerChanged(int id); +      MidiOut* midiOut() const; +      MidiInstrument* instrument() const;        };  typedef QList<MidiTrack*> MidiTrackList; diff --git a/muse/muse/mixer/astrip.cpp b/muse/muse/mixer/astrip.cpp index 5a29272d..a7ef5037 100644 --- a/muse/muse/mixer/astrip.cpp +++ b/muse/muse/mixer/astrip.cpp @@ -198,23 +198,15 @@ AudioStrip::AudioStrip(Mixer* m, AudioTrack* t, bool align)              rBox->addStretch(100);              }        else { -            iR = new QToolButton(this); -            iR->setFont(config.fonts[1]); -            iR->setFixedWidth((STRIP_WIDTH-4)/2); -            iR->setText(tr("iR")); -            iR->setCheckable(false); -            iR->setToolTip(tr("input routing")); +            iR = newInRouteButton();              rBox->addWidget(iR); -            connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed())); +            connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow())); +            connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*)));              } -      oR = new QToolButton(this); -      oR->setFont(config.fonts[1]); -      oR->setFixedWidth((STRIP_WIDTH-4)/2); -      oR->setText(tr("oR")); -      oR->setCheckable(false); -      oR->setToolTip(tr("output routing")); +      oR = newOutRouteButton();        rBox->addWidget(oR); -      connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed())); +      connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow())); +      connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*)));        layout->addLayout(rBox); @@ -466,7 +458,7 @@ Awl::PanKnob* AudioStrip::addPanKnob(Awl::PanEntry** dlabel)  //   addAuxPorts  //--------------------------------------------------------- -static void addAuxPorts(AudioTrack* track, QMenu* lb, RouteList* r) +static void addAuxPorts(AudioTrack* track, QMenu* lb, const RouteList& rl)        {        QList<AuxPluginIF*> pre  = track->preAux();        QList<AuxPluginIF*> post = track->postAux(); @@ -474,26 +466,18 @@ static void addAuxPorts(AudioTrack* track, QMenu* lb, RouteList* r)              QString s = p->pluginInstance()->name();              QAction* a = lb->addAction(p->pluginInstance()->name());              a->setCheckable(true); -            Route route(p); +//            Route route(RouteNode(p), RouteNode(track)); +            Route route = Route(RouteNode(p), RouteNode(track));              a->setData(QVariant::fromValue(route)); -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        a->setChecked(true); -                        break; -                        } -                  } +            a->setChecked(rl.indexOf(route) != -1);              }        foreach(AuxPluginIF* p, post) {              QAction* a = lb->addAction(p->pluginInstance()->name());              a->setCheckable(true); -            Route route(p); +//            Route route(RouteNode(p), RouteNode(track));  // does not compile?! +            Route route = Route(RouteNode(p), RouteNode(track));              a->setData(QVariant::fromValue(route)); -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        a->setChecked(true); -                        break; -                        } -                  } +            a->setChecked(rl.indexOf(route) != -1);              }                    } @@ -501,8 +485,10 @@ static void addAuxPorts(AudioTrack* track, QMenu* lb, RouteList* r)  //   addInPorts  //--------------------------------------------------------- -static void addInPorts(AudioTrack* t, QMenu* lb, RouteList* r, bool input) +static void addInPorts(AudioTrack* t, QMenu* lb, const RouteList& rl, bool input)        { +      RouteNode a(t); +        InputList* al = song->inputs();        for (iAudioInput i = al->begin(); i != al->end(); ++i) {              AudioTrack* track = (AudioTrack*)*i; @@ -510,17 +496,12 @@ static void addInPorts(AudioTrack* t, QMenu* lb, RouteList* r, bool input)                    continue;              QAction* it = lb->addAction(track->name());              it->setCheckable(true); -            Route route(track); +            RouteNode b(track); +            Route route = input ? Route(b, a) : Route(a, b);              it->setData(QVariant::fromValue(route)); -             -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        it->setChecked(true); -                        break; -                        } -                  } +            it->setChecked(rl.indexOf(route) != -1);              if (input) -                  addAuxPorts(track, lb, r); +                  addAuxPorts(track, lb, rl);              }        } @@ -528,7 +509,7 @@ static void addInPorts(AudioTrack* t, QMenu* lb, RouteList* r, bool input)  //   addOutPorts  //--------------------------------------------------------- -static void addOutPorts(AudioTrack* t, QMenu* lb, RouteList* r) +static void addOutPorts(AudioTrack* t, QMenu* lb, const RouteList& rl)        {        OutputList* al = song->outputs();        for (iAudioOutput i = al->begin(); i != al->end(); ++i) { @@ -537,14 +518,9 @@ static void addOutPorts(AudioTrack* t, QMenu* lb, RouteList* r)                    continue;              QAction* it = lb->addAction(track->name());              it->setCheckable(true); -            Route route(track); +            Route route = Route(RouteNode(t), RouteNode(track));              it->setData(QVariant::fromValue(route)); -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        it->setChecked(true); -                        break; -                        } -                  } +            it->setChecked(rl.indexOf(route) != -1);              }        } @@ -552,7 +528,7 @@ static void addOutPorts(AudioTrack* t, QMenu* lb, RouteList* r)  //   addGroupPorts  //--------------------------------------------------------- -static void addGroupPorts(AudioTrack* t, QMenu* lb, RouteList* r) +static void addGroupPorts(AudioTrack* t, QMenu* lb, const RouteList& rl)        {        GroupList* al = song->groups();        for (iAudioGroup i = al->begin(); i != al->end(); ++i) { @@ -561,14 +537,9 @@ static void addGroupPorts(AudioTrack* t, QMenu* lb, RouteList* r)                    continue;              QAction* it = lb->addAction(track->name());              it->setCheckable(true); -            Route route(track); +            Route route = Route(RouteNode(t), RouteNode(track));              it->setData(QVariant::fromValue(route)); -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        it->setChecked(true); -                        break; -                        } -                  } +            it->setChecked(rl.indexOf(route) != -1);              }        } @@ -576,8 +547,9 @@ static void addGroupPorts(AudioTrack* t, QMenu* lb, RouteList* r)  //   addWavePorts  //--------------------------------------------------------- -static void addWavePorts(AudioTrack* t, QMenu* lb, RouteList* r, bool input) +static void addWavePorts(AudioTrack* t, QMenu* lb, const RouteList& rl, bool input)        { +      RouteNode a(t);        WaveTrackList* al = song->waves();        for (iWaveTrack i = al->begin(); i != al->end(); ++i) {              AudioTrack* track = (AudioTrack*)*i; @@ -585,73 +557,20 @@ static void addWavePorts(AudioTrack* t, QMenu* lb, RouteList* r, bool input)                    continue;              QAction* it = lb->addAction(track->name());              it->setCheckable(true); -            Route route(track); +            RouteNode b(track); +            Route route = input ? Route(b, a) : Route(a, b);              it->setData(QVariant::fromValue(route)); -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        it->setChecked(true); -                        break; -                        } -                  } +            it->setChecked(rl.indexOf(route) != -1);              if (input) -                  addAuxPorts(track, lb, r); -            } -      } - -//--------------------------------------------------------- -//   addMidiOutPorts -//--------------------------------------------------------- -#if 0 -static void addMidiOutPorts(Track* t, QMenu* lb, RouteList* r) -      { -      MidiOutPortList* al = song->midiOutPorts(); -      for (iMidiOutPort i = al->begin(); i != al->end(); ++i) { -            Track* track = *i; -            if (t == track) -                  continue; -            QAction* it = lb->addAction(track->name()); -            it->setCheckable(true); -            Route route(track); -            it->setData(QVariant::fromValue(route)); -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        it->setChecked(true); -                        break; -                        } -                  } +                  addAuxPorts(track, lb, rl);              }        }  //--------------------------------------------------------- -//   addMidiInPorts -//--------------------------------------------------------- - -static void addMidiInPorts(Track* t, QMenu* lb, RouteList* r) -      { -      MidiInPortList* al = song->midiInPorts(); -      for (iMidiInPort i = al->begin(); i != al->end(); ++i) { -            Track* track = *i; -            if (t == track) -                  continue; -            QAction* it = lb->addAction(track->name()); -            it->setCheckable(true); -            Route route(track); -            it->setData(QVariant::fromValue(route)); -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        it->setChecked(true); -                        break; -                        } -                  } -            } -      } -#endif - -//---------------------------------------------------------  //   addSyntiPorts  //--------------------------------------------------------- -static void addSyntiPorts(AudioTrack* t, QMenu* lb, RouteList* r) +static void addSyntiPorts(AudioTrack* t, QMenu* lb, const RouteList& rl)        {        SynthIList* al = song->syntis();        for (iSynthI i = al->begin(); i != al->end(); ++i) { @@ -660,27 +579,20 @@ static void addSyntiPorts(AudioTrack* t, QMenu* lb, RouteList* r)                    continue;              QAction* it = lb->addAction(track->name());              it->setCheckable(true); -            Route route(track, -1, Route::TRACK); +            Route route = Route(RouteNode(t), RouteNode(track));              it->setData(QVariant::fromValue(route)); - -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == route) { -                        it->setChecked(true); -                        break; -                        } -                  } +            it->setChecked(rl.indexOf(route) != -1);              }        }  //--------------------------------------------------------- -//   iRoutePressed +//   iRouteShow  //--------------------------------------------------------- -void AudioStrip::iRoutePressed() +void AudioStrip::iRouteShow()        { -      QMenu pup(iR); -      pup.setSeparatorsCollapsible(false); - +      QMenu* pup = iR->menu(); +      pup->clear();        AudioTrack* t  = (AudioTrack*)track;        RouteList* irl = t->inRoutes(); @@ -690,68 +602,46 @@ void AudioStrip::iRoutePressed()              case Track::AUDIO_INPUT:                    {                    for (int i = 0; i < channel; ++i) { -                        char buffer[128]; -                        snprintf(buffer, 128, "%s %d", tr("Channel").toLatin1().data(), i+1); -                        pup.addSeparator()->setText(QString(buffer)); +                        pup->addSeparator()->setText(QString(tr("Channel %1")).arg(i+1));                          QList<PortName> ol = audioDriver->outputPorts(false);                          foreach (PortName ip, ol) { -                              QAction* id = pup.addAction(ip.name); +                              QAction* id = pup->addAction(ip.name);                                id->setCheckable(true); -                              Route src(ip.port, i, Route::AUDIOPORT); -                              id->setData(QVariant::fromValue(src)); -                              for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) { -                                    if (*ir == src) { -                                          id->setChecked(true); -                                          break; -                                          } -                                    } +                              RouteNode src(ip.port, i, RouteNode::AUDIOPORT); +                              RouteNode dst(t, i, RouteNode::TRACK); +                              Route route = Route(src, dst); +                              id->setData(QVariant::fromValue(route)); +                              id->setChecked(irl->indexOf(route) != -1);                                }                          }                    }                    break;              case Track::AUDIO_OUTPUT: -                  addWavePorts(t, &pup, irl, true); -                  addInPorts(t, &pup, irl, true); -                  addGroupPorts(t, &pup, irl); -                  addSyntiPorts(t, &pup, irl); +                  addWavePorts(t, pup, *irl, true); +                  addInPorts(t, pup, *irl, true); +                  addGroupPorts(t, pup, *irl); +                  addSyntiPorts(t, pup, *irl);                    break;              case Track::WAVE: -                  addInPorts(t, &pup, irl, true); +                  addInPorts(t, pup, *irl, true);                    break;              case Track::AUDIO_GROUP: -                  addWavePorts(t, &pup, irl, true); -                  addInPorts(t, &pup, irl, true); -                  addGroupPorts(t, &pup, irl); -                  addSyntiPorts(t, &pup, irl); +                  addWavePorts(t, pup, *irl, true); +                  addInPorts(t, pup, *irl, true); +                  addGroupPorts(t, pup, *irl); +                  addSyntiPorts(t, pup, *irl);                    break;              } -      if (pup.isEmpty()) -            return; -      QAction* n = pup.exec(QCursor::pos()); -      if (n != 0) { -            Route srcRoute = n->data().value<Route>(); -            Route dstRoute(t); -            dstRoute.channel = srcRoute.channel; - -            if (track->type() == Track::AUDIO_INPUT) -                  dstRoute.channel = srcRoute.channel; -            else if (track->type() == Track::AUDIO_SOFTSYNTH) -                  dstRoute.type = Route::SYNTIPORT; - -            audio->msgRoute(n->isChecked(), srcRoute, dstRoute); -            } -      iR->setDown(false);     // pup.exec() catches mouse release event        }  //--------------------------------------------------------- -//   oRoutePressed +//   oRouteShow  //--------------------------------------------------------- -void AudioStrip::oRoutePressed() +void AudioStrip::oRouteShow()        { -      QMenu pup(oR); -      pup.setSeparatorsCollapsible(false); - +      QMenu* pup = oR->menu(); +      pup->clear();        AudioTrack* t = (AudioTrack*)track;        RouteList* orl = t->outRoutes(); @@ -763,42 +653,30 @@ void AudioStrip::oRoutePressed()                    for (int i = 0; i < channel; ++i) {                          char buffer[128];                          snprintf(buffer, 128, "%s %d", tr("Channel").toLatin1().data(), i+1); -                        pup.addSeparator()->setText(QString(buffer)); +                        pup->addSeparator()->setText(QString(buffer));                          QList<PortName> ol = audioDriver->inputPorts(false);                          foreach (PortName ip, ol) { -                              QAction* action = pup.addAction(ip.name); +                              QAction* action = pup->addAction(ip.name);                                action->setCheckable(true); -                              Route dst(ip.port, i, Route::AUDIOPORT); -                              action->setData(QVariant::fromValue(dst)); -                              int idx = orl->indexOf(dst); -                              action->setChecked(idx != -1); +                              RouteNode src(t); +                              RouteNode dst(ip.port, i, RouteNode::AUDIOPORT); +                              Route r = Route(src, dst); +                              action->setData(QVariant::fromValue(r)); +                              action->setChecked(orl->indexOf(r) != -1);                                }                          }                    }                    break;              case Track::AUDIO_INPUT: -                  addWavePorts(t, &pup, orl, false); +                  addWavePorts(t, pup, *orl, false);              case Track::WAVE:              case Track::AUDIO_GROUP:              case Track::AUDIO_SOFTSYNTH: -                  addOutPorts(t, &pup, orl); -                  addGroupPorts(t, &pup, orl); +                  addOutPorts(t, pup, *orl); +                  addGroupPorts(t, pup, *orl);                    break;              } -      if (pup.isEmpty()) -            return; -      QAction* n = pup.exec(QCursor::pos()); -      if (n != 0) { -            QString s(n->text()); -            Route srcRoute(t); -            Route dstRoute = n->data().value<Route>(); -             -            if (track->type() == Track::AUDIO_OUTPUT) -                  srcRoute.channel = dstRoute.channel; -            audio->msgRoute(n->isChecked(), srcRoute, dstRoute); -            } -      oR->setDown(false);     // pup.exec() catches mouse release event        }  //--------------------------------------------------------- diff --git a/muse/muse/mixer/astrip.h b/muse/muse/mixer/astrip.h index d69f8ac8..056e18ed 100644 --- a/muse/muse/mixer/astrip.h +++ b/muse/muse/mixer/astrip.h @@ -59,8 +59,8 @@ class AudioStrip : public Strip {        void stereoToggled(bool);        void preToggled(bool);        void offToggled(bool); -      void iRoutePressed(); -      void oRoutePressed(); +      void iRouteShow(); +      void oRouteShow();        void volumeChanged(double);        void volumePressed();        void volumeReleased(); diff --git a/muse/muse/mixer/mixer.cpp b/muse/muse/mixer/mixer.cpp index d22aa6da..70c9395f 100644 --- a/muse/muse/mixer/mixer.cpp +++ b/muse/muse/mixer/mixer.cpp @@ -15,7 +15,6 @@  #include "routedialog.h"  #include "synth.h"  #include "midiinport.h" -#include "midichannel.h"  #include "midioutport.h"  extern void populateAddTrack(QMenu* addTrack); @@ -45,7 +44,6 @@ Mixer::Mixer(QWidget* parent, MixerConfig* c)        showMidiTracksId  = menuView->addAction(tr("Show Midi Tracks"));        showMidiOutPortId = menuView->addAction(tr("Show Midi Out Ports"));        showMidiInPortId  = menuView->addAction(tr("Show Midi In Ports")); -      showMidiChannelId = menuView->addAction(tr("Show Midi Channels"));        menuView->addSeparator(); @@ -59,7 +57,6 @@ Mixer::Mixer(QWidget* parent, MixerConfig* c)        showMidiTracksId->setCheckable(true);        showMidiInPortId->setCheckable(true);        showMidiOutPortId->setCheckable(true); -      showMidiChannelId->setCheckable(true);        showWaveTracksId->setCheckable(true);        showOutputTracksId->setCheckable(true);        showGroupTracksId->setCheckable(true); @@ -116,9 +113,6 @@ void Mixer::addStrip(Track* t, int idx)                    case Track::MIDI_OUT:                          strip = new MidiOutPortStrip(this, (MidiOutPort*)t, true);                          break; -                  case Track::MIDI_CHANNEL: -                        strip = new MidiChannelStrip(this, (MidiChannel*)t, true); -                        break;                    case Track::MIDI:                          strip = new MidiStrip(this, (MidiTrack*)t, true);                          break; @@ -159,7 +153,6 @@ void Mixer::updateMixer(int action)        showMidiTracksId->setChecked(cfg->showMidiTracks);        showMidiInPortId->setChecked(cfg->showMidiInPorts);        showMidiOutPortId->setChecked(cfg->showMidiOutPorts); -      showMidiChannelId->setChecked(cfg->showMidiChannels);        showWaveTracksId->setChecked(cfg->showWaveTracks);        showOutputTracksId->setChecked(cfg->showOutputTracks);        showGroupTracksId->setChecked(cfg->showGroupTracks); @@ -179,10 +172,10 @@ void Mixer::updateMixer(int action)                    stripList.erase(ssi);                    }              int idx = stripList.size(); -            setMaximumWidth(STRIP_WIDTH * idx); +            setMaximumWidth(STRIP_WIDTH * idx + 4);              central->setFixedWidth(STRIP_WIDTH * idx);              if (idx < 4) -                  setMinimumWidth(idx * STRIP_WIDTH); +                  setMinimumWidth(idx * STRIP_WIDTH + 4);              return;              } @@ -241,17 +234,6 @@ void Mixer::updateMixer(int action)                    addStrip(*i, idx++);              } -      if (cfg->showMidiChannels) { -            MidiChannelList* mpl = song->midiChannel(); -            for (iMidiChannel i = mpl->begin(); i != mpl->end(); ++i) { -                  MidiChannel* mc = *i; -                  // -                  // show only if used -                  // -                  if (!mc->noInRoute()) -                        addStrip(mc, idx++); -                  } -            }        if (cfg->showMidiOutPorts) {              MidiOutPortList* mpl = song->midiOutPorts();              for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i) @@ -277,10 +259,10 @@ void Mixer::updateMixer(int action)              for (iAudioOutput i = otl->begin(); i != otl->end(); ++i)                    addStrip(*i, idx++);              } -      setMaximumWidth(STRIP_WIDTH * idx); +      setMaximumWidth(STRIP_WIDTH * idx + 4);        central->setFixedWidth(STRIP_WIDTH * idx);        if (idx < 4) -            setMinimumWidth(idx * STRIP_WIDTH); +            setMinimumWidth(idx * STRIP_WIDTH + 4);        layout->update();        } @@ -375,8 +357,6 @@ void Mixer::showTracksChanged(QAction* id)              cfg->showMidiInPorts = val;        else if (id == showMidiOutPortId)              cfg->showMidiOutPorts = val; -      else if (id == showMidiChannelId) -            cfg->showMidiChannels = val;        updateMixer(UPDATE_ALL);        } @@ -396,7 +376,6 @@ void Mixer::write(Xml& xml, const char* name)        xml.intTag("showSyntiTracks",  cfg->showSyntiTracks);        xml.intTag("showMidiInPorts",  cfg->showMidiInPorts);        xml.intTag("showMidiOutPorts", cfg->showMidiOutPorts); -      xml.intTag("showMidiChannels", cfg->showMidiChannels);        xml.etag("%s", name);        } diff --git a/muse/muse/mixer/mixer.h b/muse/muse/mixer/mixer.h index df86dad5..f7bd17a7 100644 --- a/muse/muse/mixer/mixer.h +++ b/muse/muse/mixer/mixer.h @@ -41,7 +41,6 @@ class Mixer : public QMainWindow {        QAction* showMidiTracksId;        QAction* showMidiInPortId;        QAction* showMidiOutPortId; -      QAction* showMidiChannelId;        QAction* showOutputTracksId;        QAction* showWaveTracksId;        QAction* showGroupTracksId; diff --git a/muse/muse/mixer/mstrip.cpp b/muse/muse/mixer/mstrip.cpp index 5fa413d4..5e728b75 100644 --- a/muse/muse/mixer/mstrip.cpp +++ b/muse/muse/mixer/mstrip.cpp @@ -20,7 +20,6 @@  #include "midiplugin.h"  #include "midiinport.h"  #include "midioutport.h" -#include "midichannel.h"  #include "awl/midimslider.h"  #include "awl/midimeter.h" @@ -33,102 +32,110 @@ enum { KNOB_PAN, KNOB_CHOR_SEND, KNOB_VAR_SEND, KNOB_REV_SEND };  //---------------------------------------------------------  //   addMidiTracks +//    input == true +//          add routes from all possible midi tracks to input +//          route list of track(channel) +//    input == false +//          add routes to all midi tracks to output route +//          list of track(channel) +// +//    Note: midi tracks do not have channels  //--------------------------------------------------------- -static void addMidiTracks(QMenu* menu, RouteList* r) +static void addMidiTracks(QMenu* menu, Track* track, int channel, bool input)        { +      RouteList* rl = input ? track->inRoutes() : track->outRoutes(); +      RouteNode a(track, channel, RouteNode::TRACK); +        MidiTrackList* tl = song->midis();        for (iMidiTrack i = tl->begin();i != tl->end(); ++i) {              MidiTrack* track = *i;              QAction* action = menu->addAction(track->name());              action->setCheckable(true); -            Route src(track); -            action->setData(QVariant::fromValue(src)); +            RouteNode b(track); +            Route r = input ? Route(b, a) : Route(a, b); +            action->setData(QVariant::fromValue(r)); +            action->setChecked(rl->indexOf(r) != -1); +            } +      } -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == src) { -                        action->setChecked(true); -                        break; -                        } +//--------------------------------------------------------- +//   addMidiInPorts +//    can only be added to input route lists +//--------------------------------------------------------- + +static void addMidiInPorts(QMenu* menu, Track* dtrack, int channel) +      { +      RouteList* rl = dtrack->inRoutes(); +      RouteNode dst(dtrack, channel, RouteNode::TRACK); + +      MidiInPortList* tl = song->midiInPorts(); +      for (iMidiInPort i = tl->begin();i != tl->end(); ++i) { +            MidiInPort* track = *i; +            QMenu* m = menu->addMenu(track->name()); +            m->setSeparatorsCollapsible(false); +            m->addSeparator()->setText(m->tr("Channels")); +            for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { +                  QAction* a = m->addAction(QString("Channel %1").arg(ch+1)); +                  a->setCheckable(true); +                  RouteNode src(track, ch, RouteNode::TRACK); +                  Route r = Route(src, dst); +                  a->setData(QVariant::fromValue(r)); +                  a->setChecked(rl->indexOf(r) != -1);                    }              }        }  //---------------------------------------------------------  //   addMidiOutPorts +//    can only be added to output route lists  //--------------------------------------------------------- -static void addMidiOutPorts(QMenu* menu, RouteList* r) +static void addMidiOutPorts(QMenu* menu, Track* strack, int channel)        { +      RouteList* rl = strack->outRoutes(); +      RouteNode src(strack, channel, RouteNode::TRACK); +        MidiOutPortList* tl = song->midiOutPorts();        for (iMidiOutPort i = tl->begin();i != tl->end(); ++i) {              MidiOutPort* op = *i;              QMenu* m = menu->addMenu(op->name());              m->setSeparatorsCollapsible(false);              m->addSeparator()->setText(m->tr("Channels")); -            for (int channel = 0; channel < MIDI_CHANNELS; ++channel) { -                  MidiChannel* track = op->channel(channel); -                  QAction* action = m->addAction(track->name()); -                  action->setCheckable(true); -                  Route dst(track); -                  action->setData(QVariant::fromValue(dst)); -                  for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                        if (*ir == dst) { -                              action->setChecked(true); -                              break; -                              } -                        } +            for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { +                  QAction* a = m->addAction(QString("Channel %1").arg(ch+1)); +                  a->setCheckable(true); +                  RouteNode dst(op, ch, RouteNode::TRACK); +                  Route r = Route(src, dst); +                  a->setData(QVariant::fromValue(r)); +                  a->setChecked(rl->indexOf(r) != -1);                    }              }        }  //---------------------------------------------------------  //   addSyntiPorts +//    can only be added to output route lists  //--------------------------------------------------------- -static void addSyntiPorts(QMenu* menu, RouteList* r) +static void addSyntiPorts(QMenu* menu, Track* strack, int channel)        { +      RouteList* rl = strack->inRoutes(); +      RouteNode src(strack, channel, RouteNode::TRACK); +        SynthIList* sl = song->syntis();        for (iSynthI i = sl->begin(); i != sl->end(); ++i) {              SynthI* sy = *i;              QMenu* m = menu->addMenu(sy->name());              m->setSeparatorsCollapsible(false);              m->addSeparator()->setText(m->tr("Channels")); -            for (int channel = 0; channel < MIDI_CHANNELS; ++channel) { -                  MidiChannel* track = sy->channel(channel); -                  QAction* action = m->addAction(track->name()); -                  action->setCheckable(true); -                  Route dst(track); -                  action->setData(QVariant::fromValue(dst)); -                  for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                        if (*ir == dst) { -                              action->setChecked(true); -                              break; -                              } -                        } -                  } -            } -      } - - -//--------------------------------------------------------- -//   addMidiInPorts -//--------------------------------------------------------- - -static void addMidiInPorts(QMenu* menu, RouteList* r) -      { -      MidiInPortList* tl = song->midiInPorts(); -      for (iMidiInPort i = tl->begin();i != tl->end(); ++i) { -            MidiInPort* track = *i; -            QAction* action = menu->addAction(track->name()); -            action->setCheckable(true); -            Route src(track); -            action->setData(QVariant::fromValue(src)); -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == src) { -                        action->setChecked(true); -                        break; -                        } +            for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { +                  QAction* a = m->addAction(QString("Channel %1").arg(ch+1)); +                  a->setCheckable(true); +                  RouteNode dst(sy, channel, RouteNode::TRACK); +                  Route r = Route(src, dst); +                  a->setData(QVariant::fromValue(r)); +                  a->setChecked(rl->indexOf(r) != -1);                    }              }        } @@ -137,7 +144,7 @@ static void addMidiInPorts(QMenu* menu, RouteList* r)  //   addKnob  //--------------------------------------------------------- -void MidiChannelStrip::addKnob(int ctrl, int idx, const QString& tt, const QString& label, +void MidiStrip::addKnob(int ctrl, int idx, const QString& tt, const QString& label,     const char* slot, bool enabled)        {        Awl::FloatEntry* dl; @@ -187,10 +194,10 @@ void MidiChannelStrip::addKnob(int ctrl, int idx, const QString& tt, const QStri        }  //--------------------------------------------------------- -//   MidiChannelStrip +//   MidiStrip  //--------------------------------------------------------- -MidiChannelStrip::MidiChannelStrip(Mixer* m, MidiChannel* t, bool align) +MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align)     : Strip(m, t, align)        {        volumeTouched     = false; @@ -233,8 +240,17 @@ MidiChannelStrip::MidiChannelStrip(Mixer* m, MidiChannel* t, bool align)        //    mute, solo        //--------------------------------------------------- -      if (_align) -            layout->addSpacing(STRIP_WIDTH/3); +      SimpleButton* monitor = newMonitorButton(); +      monitor->setFixedSize(buttonSize); +      monitor->setChecked(track->monitor()); +      connect(monitor, SIGNAL(clicked(bool)), SLOT(monitorToggled(bool))); +      connect(t, SIGNAL(monitorChanged(bool)), monitor, SLOT(setChecked(bool))); + +      SimpleButton* record = newRecordButton(); +      record->setFixedSize(buttonSize); +      record->setChecked(track->recordFlag()); +      connect(record, SIGNAL(clicked(bool)), SLOT(recordToggled(bool))); +      connect(t, SIGNAL(recordChanged(bool)), record, SLOT(setChecked(bool)));        mute  = newMuteButton();        mute->setChecked(track->isMute()); @@ -246,11 +262,16 @@ MidiChannelStrip::MidiChannelStrip(Mixer* m, MidiChannel* t, bool align)        solo->setChecked(track->solo());        connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool))); +      QHBoxLayout* smBox1 = new QHBoxLayout(0);        QHBoxLayout* smBox2 = new QHBoxLayout(0); +      smBox1->addWidget(monitor); +      smBox1->addWidget(record); +        smBox2->addWidget(mute);        smBox2->addWidget(solo); +      layout->addLayout(smBox1);        layout->addLayout(smBox2);        //--------------------------------------------------- @@ -264,15 +285,16 @@ MidiChannelStrip::MidiChannelStrip(Mixer* m, MidiChannel* t, bool align)        //---------------------------------------------------        QHBoxLayout* rBox = new QHBoxLayout(0); -      iR = new QToolButton(this); -      iR->setCheckable(false); -      iR->setFont(config.fonts[1]); -      iR->setFixedWidth((STRIP_WIDTH-4)/2); -      iR->setText(tr("iR")); -      iR->setToolTip(tr("input routing")); +      iR = newInRouteButton();        rBox->addWidget(iR); -      connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed())); -      rBox->addStretch(100); +      connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow())); +      connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); + +      oR = newOutRouteButton(); +      rBox->addWidget(oR); +      connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow())); +      connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); +        layout->addLayout(rBox);        connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat())); @@ -289,7 +311,7 @@ MidiChannelStrip::MidiChannelStrip(Mixer* m, MidiChannel* t, bool align)  //   songChanged  //--------------------------------------------------------- -void MidiChannelStrip::songChanged(int val) +void MidiStrip::songChanged(int val)        {        if (val & SC_TRACK_MODIFIED)              updateLabel(); @@ -299,7 +321,7 @@ void MidiChannelStrip::songChanged(int val)  //   heartBeat  //--------------------------------------------------------- -void MidiChannelStrip::heartBeat() +void MidiStrip::heartBeat()        {        double a = track->meter(0); // fast_log10(track->meter(0)) * .2f;        slider->setMeterVal(a * 0.008); @@ -310,7 +332,7 @@ void MidiChannelStrip::heartBeat()  //   controllerChanged  //--------------------------------------------------------- -void MidiChannelStrip::controllerChanged(int id) +void MidiStrip::controllerChanged(int id)        {        double val = double(track->ctrlVal(id).i); @@ -348,7 +370,7 @@ void MidiChannelStrip::controllerChanged(int id)  //	called when user changes controller  //--------------------------------------------------------- -void MidiChannelStrip::ctrlChanged(double val, int num) +void MidiStrip::ctrlChanged(double val, int num)        {        int ival = int(val);        CVal cval; @@ -360,7 +382,7 @@ void MidiChannelStrip::ctrlChanged(double val, int num)  //   sliderPressed  //--------------------------------------------------------- -void MidiChannelStrip::sliderPressed(int id) +void MidiStrip::sliderPressed(int id)        {        switch (id) {              case CTRL_VOLUME:         volumeTouched = true;     break; @@ -376,7 +398,7 @@ void MidiChannelStrip::sliderPressed(int id)  //   sliderReleased  //--------------------------------------------------------- -void MidiChannelStrip::sliderReleased(int id) +void MidiStrip::sliderReleased(int id)        {        switch (id) {              case CTRL_VOLUME:         volumeTouched = false;     break; @@ -392,7 +414,7 @@ void MidiChannelStrip::sliderReleased(int id)  //   muteToggled  //--------------------------------------------------------- -void MidiChannelStrip::muteToggled(bool val) +void MidiStrip::muteToggled(bool val)        {        song->setMute(track, val);        } @@ -401,7 +423,7 @@ void MidiChannelStrip::muteToggled(bool val)  //   soloToggled  //--------------------------------------------------------- -void MidiChannelStrip::soloToggled(bool val) +void MidiStrip::soloToggled(bool val)        {        song->setSolo(track, val);        } @@ -410,7 +432,7 @@ void MidiChannelStrip::soloToggled(bool val)  //   autoChanged  //--------------------------------------------------------- -void MidiChannelStrip::autoChanged() +void MidiStrip::autoChanged()        {        bool ar = track->autoRead();        bool aw = track->autoWrite(); @@ -432,7 +454,7 @@ void MidiChannelStrip::autoChanged()  //   autoReadToggled  //--------------------------------------------------------- -void MidiChannelStrip::autoReadToggled(bool val) +void MidiStrip::autoReadToggled(bool val)        {        song->setAutoRead(track, val);        } @@ -441,172 +463,34 @@ void MidiChannelStrip::autoReadToggled(bool val)  //   autoWriteToggled  //--------------------------------------------------------- -void MidiChannelStrip::autoWriteToggled(bool val) +void MidiStrip::autoWriteToggled(bool val)        {        song->setAutoWrite(track, val);        }  //--------------------------------------------------------- -//   iRoutePressed -//--------------------------------------------------------- - -void MidiChannelStrip::iRoutePressed() -      { -      QMenu pup(iR); -      pup.setSeparatorsCollapsible(false); -      pup.addSeparator()->setText(tr("Tracks")); - -      MidiChannel* t = (MidiChannel*)track; -      RouteList* irl = t->inRoutes(); - -      addMidiTracks(&pup, irl);  // add midi tracks to menu -      addMidiInPorts(&pup, irl); // add midi inputs to menu - -      if (pup.isEmpty()) -            return; -      QAction* n = pup.exec(QCursor::pos()); -      if (n) { -            Route srcRoute = n->data().value<Route>(); -            Route dstRoute(track); -            audio->msgRoute(n->isChecked(), srcRoute, dstRoute); -            } -      iR->setDown(false);     // pup->exec() catches mouse release event -      } - -//--------------------------------------------------------- -//   MidiStrip -//--------------------------------------------------------- - -MidiStrip::MidiStrip(Mixer* m, MidiTrack* t, bool align) -   : Strip(m, t, align) -      { -      if (_align) -            layout->addSpacing(STRIP_WIDTH/2 * 3); - -      //--------------------------------------------------- -      //    slider, label, meter -      //--------------------------------------------------- - -      meter = new Awl::MidiMeter(this); -      meter->setId(CTRL_VOLUME); -      meter->setFixedWidth(40); -      layout->addWidget(meter, 100, Qt::AlignRight); - -      if (_align) -            layout->addSpacing(LABEL_HEIGHT); - -      //--------------------------------------------------- -      //    pan, balance -      //--------------------------------------------------- - -      if (_align) -            layout->addSpacing(STRIP_WIDTH/2 + 1); - -      //--------------------------------------------------- -      //    mute, solo -      //    or -      //    record, mixdownfile -      //--------------------------------------------------- - -      SimpleButton* monitor = newMonitorButton(); -      monitor->setFixedSize(buttonSize); -      monitor->setChecked(track->monitor()); -      connect(monitor, SIGNAL(clicked(bool)), SLOT(monitorToggled(bool))); -      connect(t, SIGNAL(monitorChanged(bool)), monitor, SLOT(setChecked(bool))); - -      SimpleButton* record = newRecordButton(); -      record->setFixedSize(buttonSize); -      record->setChecked(track->recordFlag()); -      connect(record, SIGNAL(clicked(bool)), SLOT(recordToggled(bool))); -      connect(t, SIGNAL(recordChanged(bool)), record, SLOT(setChecked(bool))); - -      mute  = newMuteButton(); -      mute->setChecked(track->isMute()); -      mute->setFixedSize(buttonSize); -      connect(mute, SIGNAL(clicked(bool)), SLOT(muteToggled(bool))); - -      solo  = newSoloButton(); -      solo->setFixedSize(buttonSize); -      solo->setChecked(track->solo()); -      connect(solo, SIGNAL(clicked(bool)), SLOT(soloToggled(bool))); - -      QHBoxLayout* smBox1 = new QHBoxLayout(0); -      QHBoxLayout* smBox2 = new QHBoxLayout(0); - -      smBox2->addWidget(mute); -      smBox2->addWidget(solo); - -      smBox1->addWidget(monitor); -      smBox1->addWidget(record); -      layout->addLayout(smBox1); -      layout->addLayout(smBox2); - -      //--------------------------------------------------- -      //    automation mode -      //--------------------------------------------------- - -      if (_align) -            layout->addSpacing(STRIP_WIDTH/3); - -      //--------------------------------------------------- -      //    routing -      //--------------------------------------------------- - -      QHBoxLayout* rBox = new QHBoxLayout(0); -      iR = new QToolButton(this); -      iR->setFont(config.fonts[1]); -      iR->setFixedWidth((STRIP_WIDTH-4)/2); -      iR->setText(tr("iR")); -      iR->setCheckable(false); -      iR->setToolTip(tr("input routing")); -      rBox->addWidget(iR); -      connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed())); - -      oR = new QToolButton(this); -      oR->setFont(config.fonts[1]); -      oR->setFixedWidth((STRIP_WIDTH-4)/2); -      oR->setText(tr("oR")); -      oR->setCheckable(false); -      oR->setToolTip(tr("output routing")); -      rBox->addWidget(oR); -      connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed())); - -      layout->addLayout(rBox); - -      connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat())); -      connect(song,  SIGNAL(songChanged(int)), SLOT(songChanged(int))); -      connect(track, SIGNAL(muteChanged(bool)), mute, SLOT(setChecked(bool))); -      connect(track, SIGNAL(soloChanged(bool)), solo, SLOT(setChecked(bool))); -      } - -//--------------------------------------------------------- -//   songChanged -//--------------------------------------------------------- - -void MidiStrip::songChanged(int val) -      { -      if (val & SC_TRACK_MODIFIED) -            updateLabel(); -      } - -//--------------------------------------------------------- -//   heartBeat +//   iRouteShow  //--------------------------------------------------------- -void MidiStrip::heartBeat() +void MidiStrip::iRouteShow()        { -      double a = track->meter(0); // fast_log10(track->meter(0)) * .2f; -      meter->setMeterVal(a * 0.008); -      track->setMeter(0, a * 0.8);  // hack +      QMenu* pup = iR->menu(); +      pup->clear(); +      pup->addSeparator()->setText(tr("Tracks")); +      addMidiInPorts(pup, track, -1); // add midi inputs to menu        }  //--------------------------------------------------------- -//   muteToggled +//   oRouteShow  //--------------------------------------------------------- -void MidiStrip::muteToggled(bool val) +void MidiStrip::oRouteShow()        { -      song->setMute(track, val); +      QMenu* pup = oR->menu(); +      pup->clear(); +      pup->addSeparator()->setText(tr("OutputPorts")); +      addMidiOutPorts(pup, track, -1); +      addSyntiPorts(pup, track, -1);        }  //--------------------------------------------------------- @@ -619,15 +503,6 @@ void MidiStrip::monitorToggled(bool val)        }  //--------------------------------------------------------- -//   soloToggled -//--------------------------------------------------------- - -void MidiStrip::soloToggled(bool val) -      { -      song->setSolo(track, val); -      } - -//---------------------------------------------------------  //   recordToggled  //--------------------------------------------------------- @@ -637,71 +512,6 @@ void MidiStrip::recordToggled(bool val)        }  //--------------------------------------------------------- -//   iRoutePressed -//--------------------------------------------------------- - -void MidiStrip::iRoutePressed() -      { -      QMenu pup(oR); -      pup.setSeparatorsCollapsible(false); -      pup.addSeparator()->setText(tr("Input Ports")); - -      MidiOutPort* t = (MidiOutPort*)track; -      RouteList* r   = t->inRoutes(); - -      MidiInPortList* ipl = song->midiInPorts(); -      for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i) { -            MidiInPort* track = *i; -            QAction* action = pup.addAction(track->name()); -            action->setCheckable(true); -            Route src(track); -            action->setData(QVariant::fromValue(src)); - -            for (iRoute ir = r->begin(); ir != r->end(); ++ir) { -                  if (*ir == src) { -                        action->setChecked(true); -                        break; -                        } -                  } -            } -      if (pup.isEmpty()) -            return; -      QAction* n = pup.exec(QCursor::pos()); -      if (n) { -            Route srcRoute = n->data().value<Route>(); -            Route dstRoute(track); -            audio->msgRoute(n->isChecked(), srcRoute, dstRoute); -            } -      iR->setDown(false);     // pup.exec() catches mouse release event -      } - -//--------------------------------------------------------- -//   oRoutePressed -//--------------------------------------------------------- - -void MidiStrip::oRoutePressed() -      { -      QMenu pup(oR); -      pup.setSeparatorsCollapsible(false); -      pup.addSeparator()->setText(tr("OutputPorts")); -      RouteList* orl = track->outRoutes(); - -      addMidiOutPorts(&pup, orl); -      addSyntiPorts(&pup, orl); - -      if (pup.isEmpty()) -            return; - -      QAction* n = pup.exec(QCursor::pos()); -      if (n) { -            Route srcRoute(track); -            Route dstRoute = n->data().value<Route>(); -            audio->msgRoute(n->isChecked(), srcRoute, dstRoute); -            } -      oR->setDown(false);     // pup->exec() catches mouse release event -      } - -//---------------------------------------------------------  //   MidiOutPortStrip  //--------------------------------------------------------- @@ -793,16 +603,16 @@ MidiOutPortStrip::MidiOutPortStrip(Mixer* m, MidiOutPort* t, bool align)        //---------------------------------------------------        QHBoxLayout* rBox = new QHBoxLayout(0); -      rBox->addStretch(100); - -      oR = new QToolButton(this); -      oR->setFont(config.fonts[1]); -      oR->setFixedWidth((STRIP_WIDTH-4)/2); -      oR->setText(tr("oR")); -      oR->setCheckable(false); -      oR->setToolTip(tr("output routing")); + +      iR = newInRouteButton(); +      rBox->addWidget(iR); +      connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow())); +      connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); + +      oR = newOutRouteButton();        rBox->addWidget(oR); -      connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed())); +      connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow())); +      connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*)));        layout->addLayout(rBox); @@ -941,14 +751,31 @@ void MidiOutPortStrip::controllerChanged(int id)        }  //--------------------------------------------------------- -//   oRoutePressed +//   iRouteShow  //--------------------------------------------------------- -void MidiOutPortStrip::oRoutePressed() +void MidiOutPortStrip::iRouteShow()        { -      QMenu pup(oR); -      pup.setSeparatorsCollapsible(false); -      pup.addSeparator()->setText(tr("MidiDevices")); +      QMenu* pup = iR->menu(); +      pup->clear(); +      pup->addSeparator()->setText(tr("MidiChannel")); + +      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { +            QMenu* m = pup->addMenu(QString("Channel %1").arg(ch+1)); +            addMidiTracks(m, track, ch, true); +            addMidiInPorts(m, track, ch); +            } +      } + +//--------------------------------------------------------- +//   oRouteShow +//--------------------------------------------------------- + +void MidiOutPortStrip::oRouteShow() +      { +      QMenu* pup = oR->menu(); +      pup->clear(); +      pup->addSeparator()->setText(tr("MidiDevices"));        RouteList* orl = track->outRoutes();        // @@ -956,17 +783,12 @@ void MidiOutPortStrip::oRoutePressed()        //        QList<PortName> ol = midiDriver->outputPorts(true);        foreach (PortName ip, ol) { -            QAction* oa = pup.addAction(ip.name); +            QAction* oa = pup->addAction(ip.name);              oa->setCheckable(true); -            Route dst(ip.port, Route::MIDIPORT); -            oa->setData(QVariant::fromValue(dst)); - -            for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) { -                  if (*ir == dst) { -                        oa->setChecked(true); -                        break; -                        } -                  } +            RouteNode dst(ip.port, RouteNode::MIDIPORT); +            Route r = Route(RouteNode(track), dst); +            oa->setData(QVariant::fromValue(r)); +            oa->setChecked(orl->indexOf(r) != -1);              }        // @@ -974,27 +796,13 @@ void MidiOutPortStrip::oRoutePressed()        //        ol = audioDriver->inputPorts(true);        foreach (PortName ip, ol) { -            QAction* oa = pup.addAction(ip.name); +            QAction* oa = pup->addAction(ip.name);              oa->setCheckable(true); -            Route dst(ip.port, Route::JACKMIDIPORT); -            oa->setData(QVariant::fromValue(dst)); - -            for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) { -                  if (*ir == dst) { -                        oa->setChecked(true); -                        break; -                        } -                  } -            } -      if (pup.isEmpty()) -            return; -      QAction* action = pup.exec(QCursor::pos()); -      if (action) { -            Route dstRoute = action->data().value<Route>(); -            Route srcRoute(track); -            audio->msgRoute(action->isChecked(), srcRoute, dstRoute); +            RouteNode dst(ip.port, RouteNode::JACKMIDIPORT); +            Route r = Route(RouteNode(track), dst); +            oa->setData(QVariant::fromValue(r)); +            oa->setChecked(orl->indexOf(r) != -1);              } -      oR->setDown(false);     // pup->exec() catches mouse release event        }  //--------------------------------------------------------- @@ -1073,27 +881,19 @@ MidiInPortStrip::MidiInPortStrip(Mixer* m, MidiInPort* t, bool align)        //---------------------------------------------------        if (_align) -            layout->addSpacing(STRIP_WIDTH/3);        // automation line +            layout->addSpacing(STRIP_WIDTH/3);        // automation row + +      iR = newInRouteButton(); +      connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow())); +      connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); + +      oR = newOutRouteButton(); +      connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow())); +      connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*)));        QHBoxLayout* rBox = new QHBoxLayout(0); -      iR = new QToolButton(this); -      iR->setFont(config.fonts[1]); -      iR->setFixedWidth((STRIP_WIDTH-4)/2); -      iR->setText(tr("iR")); -      iR->setCheckable(false); -      iR->setToolTip(tr("input routing"));        rBox->addWidget(iR); -      connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed())); - -      oR = new QToolButton(this); -      oR->setFont(config.fonts[1]); -      oR->setFixedWidth((STRIP_WIDTH-4)/2); -      oR->setText(tr("oR")); -      oR->setCheckable(false); -      oR->setToolTip(tr("output routing"));        rBox->addWidget(oR); -      connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed())); -        layout->addLayout(rBox);        connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat())); @@ -1142,82 +942,56 @@ void MidiInPortStrip::soloToggled(bool val)        }  //--------------------------------------------------------- -//   oRoutePressed -//--------------------------------------------------------- - -void MidiInPortStrip::oRoutePressed() -      { -      QMenu pup(oR); -      pup.setSeparatorsCollapsible(false); - -      RouteList* orl = track->outRoutes(); - -      addMidiTracks(&pup, orl); -      addSyntiPorts(&pup, orl); -      addMidiOutPorts(&pup, orl); - -      if (pup.isEmpty()) -            return; -      QAction* action = pup.exec(QCursor::pos()); -      if (action) { -            Route srcRoute(track); -            Route dstRoute = action->data().value<Route>(); -            audio->msgRoute(action->isChecked(), srcRoute, dstRoute); -            } -      oR->setDown(false);     // pup->exec() catches mouse release event -      } - -//--------------------------------------------------------- -//   iRoutePressed +//   iRouteShow  //--------------------------------------------------------- -void MidiInPortStrip::iRoutePressed() +void MidiInPortStrip::iRouteShow()        { -      QMenu pup(oR); -      pup.setSeparatorsCollapsible(false); -      pup.addSeparator()->setText(tr("AlsaDevices")); +      QMenu* pup = iR->menu(); +      pup->clear(); +      pup->addSeparator()->setText(tr("AlsaDevices"));        RouteList* irl = track->inRoutes();        QList<PortName> ol = midiDriver->inputPorts(false);        foreach (PortName ip, ol) { -            QAction* action = pup.addAction(ip.name); +            RouteNode src(ip.port, RouteNode::MIDIPORT); +            Route r = Route(src, RouteNode(track)); +            QAction* action = pup->addAction(ip.name);              action->setCheckable(true); -            Route src(ip.port, Route::MIDIPORT); -            action->setData(QVariant::fromValue(src)); -            for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) { -                  if (*ir == src) { -                        action->setChecked(true); -                        break; -                        } -                  } +            action->setData(QVariant::fromValue(r)); +            action->setChecked(irl->indexOf(r) != -1);              }        //        // add JACK midi ports to list        //        ol = audioDriver->outputPorts(true);        foreach (PortName ip, ol) { -            QAction* action = pup.addAction(ip.name); +            QAction* action = pup->addAction(ip.name);              action->setCheckable(true); -            Route src(ip.port, Route::JACKMIDIPORT); -            action->setData(QVariant::fromValue(src)); - -            for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) { -                  if (*ir == src) { -                        action->setChecked(true); -                        break; -                        } -                  } +            RouteNode src(ip.port, RouteNode::JACKMIDIPORT); +            Route r = Route(src, RouteNode(track)); +            action->setData(QVariant::fromValue(r)); +            action->setChecked(irl->indexOf(r) != -1);              } -      if (pup.isEmpty()) -            return; -      QAction* action = pup.exec(QCursor::pos()); -      if (action) { -            Route srcRoute = action->data().value<Route>(); -            Route dstRoute(track, -1, Route::TRACK); -            audio->msgRoute(action->isChecked(), srcRoute, dstRoute); +      } + +//--------------------------------------------------------- +//   oRouteShow +//--------------------------------------------------------- + +void MidiInPortStrip::oRouteShow() +      { +      QMenu* pup = oR->menu(); +      pup->clear(); +      pup->addSeparator()->setText(tr("MidiChannel")); + +      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { +            QMenu* m = pup->addMenu(QString("Channel %1").arg(ch+1)); +            addMidiTracks(m, track, ch, false); +            addSyntiPorts(m, track, ch); +            addMidiOutPorts(m, track, ch);              } -      iR->setDown(false);     // pup->exec() catches mouse release event        }  //--------------------------------------------------------- @@ -1294,24 +1068,15 @@ MidiSyntiStrip::MidiSyntiStrip(Mixer* m, MidiSynti* t, bool align)        QHBoxLayout* rBox = new QHBoxLayout(0); -      iR = new QToolButton(this); -      iR->setFont(config.fonts[1]); -      iR->setFixedWidth((STRIP_WIDTH-4)/2); -      iR->setText(tr("iR")); -      iR->setCheckable(false); -      iR->setToolTip(tr("input routing")); +      iR = newInRouteButton();        rBox->addWidget(iR); -      connect(iR, SIGNAL(pressed()), SLOT(iRoutePressed())); +      connect(iR->menu(), SIGNAL(aboutToShow()), SLOT(iRouteShow())); +      connect(iR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*))); -      oR = new QToolButton(this); -      rBox->addWidget(oR); -      oR->setFont(config.fonts[1]); -      oR->setFixedWidth((STRIP_WIDTH-4)/2); -      oR->setText(tr("oR")); -      oR->setCheckable(false); -      oR->setToolTip(tr("output routing")); +      oR = newOutRouteButton();        rBox->addWidget(oR); -      connect(oR, SIGNAL(pressed()), SLOT(oRoutePressed())); +      connect(oR->menu(), SIGNAL(aboutToShow()), SLOT(oRouteShow())); +      connect(oR->menu(), SIGNAL(triggered(QAction*)), song, SLOT(routeChanged(QAction*)));        layout->addLayout(rBox); @@ -1450,22 +1215,22 @@ void MidiSyntiStrip::controllerChanged(int id)        }  //--------------------------------------------------------- -//   oRoutePressed +//   oRouteShow  //--------------------------------------------------------- -void MidiSyntiStrip::oRoutePressed() +void MidiSyntiStrip::oRouteShow()        { -      QMenu pup(oR); -      pup.setSeparatorsCollapsible(false); -      pup.addSeparator()->setText(tr("OutputPorts")); -      RouteList* orl = track->outRoutes(); +      QMenu* pup = oR->menu(); +      pup->clear(); +      pup->addSeparator()->setText(tr("OutputPorts"));        MidiOutPortList* mpl = song->midiOutPorts();        int pn = 0;        for (iMidiOutPort i = mpl->begin(); i != mpl->end(); ++i, ++pn) {              MidiOutPort* op = *i; -            QMenu* m = pup.addMenu(op->name()); +            QMenu* m = pup->addMenu(op->name());              m->addSeparator()->setText(tr("Channel")); +#if 0 //TODO              for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {                    QString s;                    s.setNum(channel+1); @@ -1482,94 +1247,25 @@ void MidiSyntiStrip::oRoutePressed()                                }                          }                    } +#endif              } -      if (pup.isEmpty()) -            return; -      QAction* action = pup.exec(QCursor::pos()); -      if (action) { -            Route dstRoute = action->data().value<Route>(); -            Route srcRoute(track, -1, Route::TRACK); - -            // remove old route -            // note: audio->msgRemoveRoute() changes orl list -            // -            bool removed; -            do { -                  removed = false; -                  for (iRoute ir = orl->begin(); ir != orl->end(); ++ir) { -                        Route s(track, ir->channel, Route::TRACK); -                        s.dump(); -                        ir->dump(); -                        audio->msgRemoveRoute(s, *ir); -                        removed = true; -                        break; -                        } -                  } while (removed); -            audio->msgAddRoute(srcRoute, dstRoute); -            song->update(SC_ROUTE); -            if (mixer) -                  mixer->setUpdateMixer(); -            } -      oR->setDown(false);     // pup->exec() catches mouse release event        }  //--------------------------------------------------------- -//   iRoutePressed +//   iRouteShow  //--------------------------------------------------------- -void MidiSyntiStrip::iRoutePressed() +void MidiSyntiStrip::iRouteShow()        { -      QMenu pup(oR); -      pup.setSeparatorsCollapsible(false); +      QMenu* pup = oR->menu(); +      pup->clear(); -      pup.addSeparator()->setText(tr("Input Ports")); +      pup->addSeparator()->setText(tr("Input Ports"));        MidiOutPort* t = (MidiOutPort*)track; -      RouteList* irl = t->inRoutes(); - -      MidiInPortList* ipl = song->midiInPorts(); -      for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i) { -            QMenu* m = pup.addMenu((*i)->name()); -            m->addSeparator()->setText(tr("Channel")); -            QAction* action = m->addAction(tr("All")); -            Route src(*i, MIDI_CHANNELS, Route::TRACK); -            action->setData(QVariant::fromValue(src)); -            for (int channel = 0; channel < MIDI_CHANNELS; ++channel) { -                  QString s; -                  s.setNum(channel+1); - -                  action = m->addAction(s); -                  action->setCheckable(true); -                  Route src(*i, channel, Route::TRACK); -                  action->setData(QVariant::fromValue(src)); - -                  for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) { -                        if (*ir == src) { -                              action->setChecked(true); -                              break; -                              } -                        } -                  } -            } - -      if (pup.isEmpty()) -            return; -      QAction* action = pup.exec(QCursor::pos()); -      if (action) { -            Route srcRoute = action->data().value<Route>(); -            if (srcRoute.channel == MIDI_CHANNELS) { -                  for (int channel = 0; channel < MIDI_CHANNELS; ++channel) { -                        srcRoute.channel = channel; -                        Route dstRoute(track, channel, Route::TRACK); -                        audio->msgAddRoute(srcRoute, dstRoute); -                        } -                  song->update(SC_ROUTE); -                  } -            else { -                  Route dstRoute(track, srcRoute.channel, Route::TRACK); -                  audio->msgRoute(action->isChecked(), srcRoute, dstRoute); -                  } +      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) { +            QMenu* m = pup->addMenu(QString("Channel %1").arg(ch+1)); +            addMidiTracks(m, t, ch, false); +            addMidiInPorts(m, t, ch);              } -      iR->setDown(false);     // pup->exec() catches mouse release event        } - diff --git a/muse/muse/mixer/mstrip.h b/muse/muse/mixer/mstrip.h index bf23dd95..1f167739 100644 --- a/muse/muse/mixer/mstrip.h +++ b/muse/muse/mixer/mstrip.h @@ -32,38 +32,10 @@ class MidiSynti;  class MidiStrip : public Strip {        Q_OBJECT -      Awl::MidiMeter* meter; -      QToolButton* iR; -      QToolButton* oR; - -   private slots: -      void muteToggled(bool); -      void soloToggled(bool); -      void recordToggled(bool); -      void iRoutePressed(); -      void oRoutePressed(); -      void monitorToggled(bool); - -   protected slots: -      virtual void heartBeat(); - -   public slots: -      virtual void songChanged(int); - -   public: -      MidiStrip(Mixer*, MidiTrack*, bool align); -      }; - -//--------------------------------------------------------- -//   MidiChannelStrip -//--------------------------------------------------------- - -class MidiChannelStrip : public Strip { -      Q_OBJECT -        Awl::MidiMeterSlider* slider;        Awl::MidiVolEntry* sl;        QToolButton* iR; +      QToolButton* oR;        struct KNOB {              Awl::Knob* knob; @@ -89,7 +61,10 @@ class MidiChannelStrip : public Strip {        void sliderReleased(int);        void autoReadToggled(bool);        void autoWriteToggled(bool); -      void iRoutePressed(); +      void iRouteShow(); +      void oRouteShow(); +      void recordToggled(bool); +      void monitorToggled(bool);     protected slots:        virtual void heartBeat(); @@ -98,7 +73,7 @@ class MidiChannelStrip : public Strip {        virtual void songChanged(int);     public: -      MidiChannelStrip(Mixer*, MidiChannel*, bool align = true); +      MidiStrip(Mixer*, MidiTrack*, bool align = true);        };  //--------------------------------------------------------- @@ -111,6 +86,7 @@ class MidiOutPortStrip : public Strip {        Awl::MidiMeterSlider* slider;        Awl::MidiVolEntry* sl;        QToolButton* oR; +      QToolButton* iR;        SimpleButton* sync;        bool volumeTouched; @@ -125,7 +101,8 @@ class MidiOutPortStrip : public Strip {        void sliderReleased(int);        void autoReadToggled(bool);        void autoWriteToggled(bool); -      void oRoutePressed(); +      void iRouteShow(); +      void oRouteShow();        void syncToggled(bool) const;     protected slots: @@ -162,8 +139,8 @@ class MidiSyntiStrip : public Strip {        void sliderReleased(int);        void autoReadToggled(bool);        void autoWriteToggled(bool); -      void oRoutePressed(); -      void iRoutePressed(); +      void iRouteShow(); +      void oRouteShow();     protected slots:        virtual void heartBeat(); @@ -189,8 +166,8 @@ class MidiInPortStrip : public Strip {     private slots:        void muteToggled(bool);        void soloToggled(bool); -      void iRoutePressed(); -      void oRoutePressed(); +      void iRouteShow(); +      void oRouteShow();     protected slots:        virtual void heartBeat(); diff --git a/muse/muse/muse.cpp b/muse/muse/muse.cpp index 1fef1927..0391d446 100644 --- a/muse/muse/muse.cpp +++ b/muse/muse/muse.cpp @@ -66,7 +66,7 @@  #include "templatedialog.h"  #include "midiedit/miditracker.h"  #include "projectpropsdialog.h" -#include "midichannel.h" +#include "liste/listedit.h"  extern void initMidiInstruments(); @@ -469,6 +469,7 @@ MusE::MusE()        markerView            = 0;        exportMidiDialog      = 0;        projectPropsDialog    = 0; +      listEditor            = 0;        startAction   = new QAction(QIcon(":/xpm/start.xpm"), "start", this);        rewindAction  = new QAction(QIcon(":/xpm/frewind.xpm"), "rewind", this); @@ -1234,18 +1235,6 @@ void MusE::loadProject1(const QString& path)        clipboardChanged();           // enable/disable "Paste"        song->setLen(song->len());    // emit song->lenChanged() signal -      // -      // add connected channels -      // -      MidiChannelList* mcl = song->midiChannel(); -      TrackList* tl       = song->tracks(); -      for (iMidiChannel i = mcl->begin(); i != mcl->end(); ++i) { -            MidiChannel* mc = (MidiChannel*)*i; -            if (mc->noInRoute() || song->trackExists(mc)) -                  continue; -            tl->push_back(mc); -            } -        selectionChanged();           // enable/disable "Copy" & "Paste"        arranger->endLoadSong();        song->updatePos(); @@ -1254,6 +1243,7 @@ void MusE::loadProject1(const QString& path)        // send "cur" controller values to devices        // +      TrackList* tl = song->tracks();        for (iTrack i = tl->begin(); i != tl->end(); ++i) {              Track* track = *i;  //            track->blockSignals(true); @@ -1498,8 +1488,7 @@ void MusE::startEditor(Part* part)              case Track::MIDI:                    {                    MidiTrack* t = (MidiTrack*)track; -                  MidiChannel* mc = t->channel(); -                  if (mc && mc->useDrumMap()) +                  if (t->useDrumMap())                          startDrumEditor(pl);                    else                          startPianoroll(pl); @@ -1562,8 +1551,17 @@ void MusE::startListEditor()  void MusE::startListEditor(PartList* /*pl*/)        { -//      ListEdit* listEditor = new ListEdit(0, pl); -//      listEditor->show(); +      if (listEditor == 0) +            listEditor = new ListEdit(this); +      listEditor->show(); +      } + +void MusE::showListEditor(const Pos& pos, Track* track, Ctrl* ctrl) +      { +      if (listEditor == 0) +            listEditor = new ListEdit(this); +      listEditor->selectItem(pos, track, ctrl); +      listEditor->show();        }  //--------------------------------------------------------- diff --git a/muse/muse/muse.h b/muse/muse/muse.h index 5045df19..c74d4b8d 100644 --- a/muse/muse/muse.h +++ b/muse/muse/muse.h @@ -53,6 +53,8 @@ class PreferencesDialog;  class EditInstrument;  class Mixer;  class ExportMidiDialog; +class ListEdit; +class Ctrl;  extern void configMidiController(); @@ -110,6 +112,7 @@ class MusE : public QMainWindow // , public Ui::MuseBase        QAction* aid1a;  	Mixer* mixer2;        QAction* aid1b; +      ListEdit* listEditor;        EditInstrument* editInstrument; @@ -198,8 +201,7 @@ class MusE : public QMainWindow // , public Ui::MuseBase        void configShortCuts();        void startMasterEditor(); -      void startListEditor(); -      void startListEditor(PartList*); +        void startDrumEditor();        void startDrumEditor(PartList* pl);        void startEditor(Part*); @@ -212,6 +214,10 @@ class MusE : public QMainWindow // , public Ui::MuseBase        void startWaveEditor(PartList*);        void writeGlobalConfiguration() const;        void startEditInstrument(); + +      void startListEditor(); +      void startListEditor(PartList*); +        void showProjectPropsDialog();        void openRecentMenu(); @@ -302,6 +308,8 @@ class MusE : public QMainWindow // , public Ui::MuseBase        QAction* forwardAction;        QAction* stopAction;        QAction* playAction; + +      void showListEditor(const Pos&, Track*, Ctrl*);        };  extern MusE* muse; diff --git a/muse/muse/preferences.cpp b/muse/muse/preferences.cpp index 52773b53..e0b9b4be 100644 --- a/muse/muse/preferences.cpp +++ b/muse/muse/preferences.cpp @@ -162,7 +162,7 @@ PreferencesDialog::PreferencesDialog(Arranger* a, QWidget* parent)        twi(id, "Midi Track",     0x500 + Track::MIDI);        twi(id, "Midi Output",    0x500 + Track::MIDI_OUT);        twi(id, "Midi Input",     0x500 + Track::MIDI_IN); -      twi(id, "Midi Channel",   0x500 + Track::MIDI_CHANNEL); +//      twi(id, "Midi Channel",   0x500 + Track::MIDI_CHANNEL);        twi(id, "Midi Synti",     0x500 + Track::MIDI_SYNTI);        id = twi(itemList, "BigTime", 0); diff --git a/muse/muse/route.cpp b/muse/muse/route.cpp index 89f819ee..4129b884 100644 --- a/muse/muse/route.cpp +++ b/muse/muse/route.cpp @@ -27,13 +27,12 @@  #include "driver/mididev.h"  #include "al/xml.h"  #include "auxplugin.h" -#include "midichannel.h"  //--------------------------------------------------------- -//   Route +//   RouteNode  //--------------------------------------------------------- -Route::Route() +RouteNode::RouteNode()        {        track   = 0;        channel = -1; @@ -41,7 +40,7 @@ Route::Route()        disconnected = false;        } -Route::Route(Port p, int ch, RouteType t) +RouteNode::RouteNode(Port p, int ch, RouteNodeType t)        {        port    = p;        channel = ch; @@ -49,7 +48,7 @@ Route::Route(Port p, int ch, RouteType t)        disconnected = false;        } -Route::Route(Port p, RouteType t) +RouteNode::RouteNode(Port p, RouteNodeType t)        {        port    = p;        channel = -1; @@ -57,7 +56,7 @@ Route::Route(Port p, RouteType t)        disconnected = false;        } -Route::Route(Track* tr) +RouteNode::RouteNode(Track* tr)        {        track   = tr;        channel = -1; @@ -65,7 +64,7 @@ Route::Route(Track* tr)        disconnected = false;        } -Route::Route(AuxPluginIF* p) +RouteNode::RouteNode(AuxPluginIF* p)        {        plugin  = p;        channel = -1; @@ -73,7 +72,7 @@ Route::Route(AuxPluginIF* p)        disconnected = false;        } -Route::Route(Track* tr, int ch, RouteType t) +RouteNode::RouteNode(Track* tr, int ch, RouteNodeType t)        {        track   = tr;        channel = ch; @@ -86,60 +85,57 @@ Route::Route(Track* tr, int ch, RouteType t)  //    return false, if route invalid or cannot be found  //--------------------------------------------------------- -bool addRoute(Route src, Route dst) +bool addRoute(const Route& r)        {  //printf("addRoute %s.%d:<%s> %s.%d:<%s>\n", -//         src.tname(), src.channel, src.name().toLatin1().data(), -//         dst.tname(), dst.channel, dst.name().toLatin1().data()); +//         r.src.tname(), r.src.channel, r.src.name().toLatin1().data(), +//         r.dst.tname(), r.dst.channel, r.dst.name().toLatin1().data()); -      if (src.type == Route::AUDIOPORT || src.type == Route::MIDIPORT  -         || src.type == Route::JACKMIDIPORT) { -            if (dst.type != Route::TRACK) { +      if (r.src.type == RouteNode::AUDIOPORT || r.src.type == RouteNode::MIDIPORT  +         || r.src.type == RouteNode::JACKMIDIPORT) { +            if (r.dst.type != RouteNode::TRACK) {                    fprintf(stderr, "addRoute: bad route 1\n");                    return false;                    } -            if (dst.track->type() != Track::AUDIO_INPUT && dst.track->type() != Track::MIDI_IN) { +            if (r.dst.track->type() != Track::AUDIO_INPUT && r.dst.track->type() != Track::MIDI_IN) {                    fprintf(stderr, "addRoute: bad route 2\n");                    return false;                    } -            src.channel = dst.channel; -            RouteList* inRoutes = dst.track->inRoutes(); -            if (inRoutes->indexOf(src) != -1) { +            RouteList* inRoutes = r.dst.track->inRoutes(); +            if (inRoutes->indexOf(r) != -1) {                    printf("  route already there 1\n");                    return true;                    } -            inRoutes->push_back(src); +            inRoutes->push_back(r);              } -      else if (dst.type == Route::AUDIOPORT || dst.type == Route::MIDIPORT -         || dst.type == Route::JACKMIDIPORT) { -            if (src.type != Route::TRACK) { +      else if (r.dst.type == RouteNode::AUDIOPORT || r.dst.type == RouteNode::MIDIPORT +         || r.dst.type == RouteNode::JACKMIDIPORT) { +            if (r.src.type != RouteNode::TRACK) {                    fprintf(stderr, "addRoute: bad route 3\n");                    return false;                    } -            if (src.track->type() != Track::AUDIO_OUTPUT && src.track->type() != Track::MIDI_OUT) { -                  fprintf(stderr, "addRoute: bad route 4, tracktype %s\n", src.track->cname().toLatin1().data()); +            if (r.src.track->type() != Track::AUDIO_OUTPUT && r.src.track->type() != Track::MIDI_OUT) { +                  fprintf(stderr, "addRoute: bad route 4, tracktype %s\n", r.src.track->cname().toLatin1().data());                    return false;                    } -            RouteList* outRoutes = src.track->outRoutes(); -            dst.channel = src.channel; - -            if (outRoutes->indexOf(dst) != -1) { +            RouteList* outRoutes = r.src.track->outRoutes(); +            if (outRoutes->indexOf(r) != -1) {                    printf("  route already there 2\n");                    return true;                    } -            outRoutes->push_back(dst); +            outRoutes->push_back(r);              } -      else if (src.type == Route::AUXPLUGIN) { -            RouteList* inRoutes = dst.track->inRoutes(); -            inRoutes->insert(inRoutes->begin(), src); +      else if (r.src.type == RouteNode::AUXPLUGIN) { +            RouteList* inRoutes = r.dst.track->inRoutes(); +            inRoutes->insert(inRoutes->begin(), r);              }        else { -            if (src.track->outRoutes()->indexOf(dst) != -1) { +            if (r.src.track->outRoutes()->indexOf(r) != -1) {                    printf("  route already there 3\n");                    return true;                    } -            src.track->outRoutes()->push_back(dst); -            dst.track->inRoutes()->push_back(src); +            r.src.track->outRoutes()->push_back(r); +            r.dst.track->inRoutes()->push_back(r);              }        return true;        } @@ -148,76 +144,75 @@ bool addRoute(Route src, Route dst)  //   removeRoute  //--------------------------------------------------------- -void removeRoute(Route src, Route dst) +void removeRoute(const Route& r)        {  //      printf("removeRoute %s.%d:<%s> %s.%d:<%s>\n", -//         src.tname(), src.channel, src.name().toLatin1().data(), -//         dst.tname(), dst.channel, dst.name().toLatin1().data()); -      if (src.type == Route::AUDIOPORT || src.type == Route::MIDIPORT -         || src.type == Route::JACKMIDIPORT) { -            if (dst.type != Route::TRACK && dst.type != Route::SYNTIPORT) { +//         r.src.tname(), r.src.channel, r.src.name().toLatin1().data(), +//         r.dst.tname(), r.dst.channel, r.dst.name().toLatin1().data()); +      if (r.src.type == RouteNode::AUDIOPORT || r.src.type == RouteNode::MIDIPORT +         || r.src.type == RouteNode::JACKMIDIPORT) { +            if (r.dst.type != RouteNode::TRACK && r.dst.type != RouteNode::SYNTIPORT) {                    fprintf(stderr, "removeRoute: bad route 1\n");                    goto error;                    } -            if (dst.track->type() != Track::AUDIO_INPUT -               && dst.track->type() != Track::AUDIO_SOFTSYNTH -               && dst.track->type() != Track::MIDI_IN) { +            if (r.dst.track->type() != Track::AUDIO_INPUT +               && r.dst.track->type() != Track::AUDIO_SOFTSYNTH +               && r.dst.track->type() != Track::MIDI_IN) {                    fprintf(stderr, "removeRoute: bad route 2\n");                    goto error;                    } -            RouteList* inRoutes = dst.track->inRoutes(); +            RouteList* inRoutes = r.dst.track->inRoutes();              iRoute i;              for (i = inRoutes->begin(); i != inRoutes->end(); ++i) { -                  if (*i == src) { +                  if (*i == r) {                          inRoutes->erase(i);                          break;                          }                    }              } -      else if (dst.type == Route::AUDIOPORT || dst.type == Route::MIDIPORT -         || dst.type == Route::JACKMIDIPORT) { -//         | dst.type == Route::SYNTIPORT) { -            if (src.type != Route::TRACK) { +      else if (r.dst.type == RouteNode::AUDIOPORT || r.dst.type == RouteNode::MIDIPORT +         || r.dst.type == RouteNode::JACKMIDIPORT) { +            if (r.src.type != RouteNode::TRACK) {                    fprintf(stderr, "removeRoute: bad route 3\n");                    goto error;                    } -            if (src.track->type() != Track::AUDIO_OUTPUT && src.track->type() != Track::MIDI_OUT) { +            if (r.src.track->type() != Track::AUDIO_OUTPUT && r.src.track->type() != Track::MIDI_OUT) {                    fprintf(stderr, "removeRoute: bad route 4\n");                    goto error;                    } -            RouteList* outRoutes = src.track->outRoutes(); +            RouteList* outRoutes = r.src.track->outRoutes();              iRoute i;              for (i = outRoutes->begin(); i != outRoutes->end(); ++i) { -                  if (*i == dst) { +                  if (*i == r) {                          outRoutes->erase(i);                          break;                          }                    }              } -      else if (src.type == Route::AUXPLUGIN) { -            if (dst.type != Route::TRACK) { +      else if (r.src.type == RouteNode::AUXPLUGIN) { +            if (r.dst.type != RouteNode::TRACK) {                    fprintf(stderr, "removeRoute: bad route 5\n");                    goto error;                    } -            RouteList* inRoutes = dst.track->inRoutes(); +            RouteList* inRoutes = r.dst.track->inRoutes();              for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) { -                  if (*i == src) { +                  if (*i == r) {                          inRoutes->erase(i);                          break;                          }                    }              }        else { -            RouteList* outRoutes = src.track->outRoutes(); +            RouteList* outRoutes = r.src.track->outRoutes();              for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) { -                  if (*i == dst) { +                  if (*i == r) {                          outRoutes->erase(i);                          break;                          }                    } -            RouteList* inRoutes = dst.track->inRoutes(); +            RouteList* inRoutes = r.dst.track->inRoutes();              for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) { -                  if (*i == src) { +                  if (*i == r) {                          inRoutes->erase(i);                          break;                          } @@ -226,8 +221,8 @@ void removeRoute(Route src, Route dst)        return;  error:        printf("removeRoute %s.%d:<%s> %s.%d:<%s>\n", -         src.tname(), src.channel, src.name().toLatin1().data(), -         dst.tname(), dst.channel, dst.name().toLatin1().data()); +         r.src.tname(), r.src.channel, r.src.name().toLatin1().data(), +         r.dst.tname(), r.dst.channel, r.dst.name().toLatin1().data());        abort();        } @@ -246,7 +241,7 @@ static QString track2name(const Track* n)  //    create string name representation for audio node  //--------------------------------------------------------- -QString Route::name() const +QString RouteNode::name() const        {        switch (type) {              case TRACK: @@ -273,7 +268,7 @@ QString Route::name() const  void Song::readRoute(QDomNode n)        { -      Route s, d; +      RouteNode s, d;        for (QDomNode node = n.firstChild(); !node.isNull(); node = node.nextSibling()) {              QDomElement e = node.toElement();              if (e.tagName() == "src") @@ -295,23 +290,19 @@ void Song::readRoute(QDomNode n)                d.tname(), d.channel, d.name().toLatin1().data());              return;              } -       -      if (s.type == Route::AUDIOPORT) -            s.channel = d.channel; -      if (d.type == Route::AUDIOPORT) -            d.channel = s.channel;        s.disconnected = true;        d.disconnected = true; -      addRoute(s, d); +      Route r(s, d); +      addRoute(r);        }  //---------------------------------------------------------  //   dump  //--------------------------------------------------------- -void Route::dump() const +void RouteNode::dump() const        { -      printf("Route %p dump: <%s> channel %d, type %s\n", +      printf("RouteNode %p dump: <%s> channel %d, type %s\n",           track, name().toLatin1().data(), channel, tname());        } @@ -319,7 +310,7 @@ void Route::dump() const  //   operator==  //--------------------------------------------------------- -bool Route::operator==(const Route& a) const +bool RouteNode::operator==(const RouteNode& a) const        {        if (type != a.type)              return false; @@ -342,7 +333,7 @@ bool Route::operator==(const Route& a) const  //   tname  //--------------------------------------------------------- -const char* Route::tname(RouteType t) +const char* RouteNode::tname(RouteNodeType t)        {        static const char* names[] = {              "TRACK", "AUDIOPORT", "MIDIPORT", "JACKMIDIPORT",  @@ -353,7 +344,7 @@ const char* Route::tname(RouteType t)        return names[t];        } -const char* Route::tname() const +const char* RouteNode::tname() const        {        return tname(type);        } @@ -362,7 +353,7 @@ const char* Route::tname() const  //   write  //--------------------------------------------------------- -void Route::write(Xml& xml, const char* label) const +void RouteNode::write(Xml& xml, const char* label) const        {        switch (type) {              case AUDIOPORT: @@ -389,7 +380,7 @@ void Route::write(Xml& xml, const char* label) const  //   read  //--------------------------------------------------------- -void Route::read(QDomNode node) +void RouteNode::read(QDomNode node)        {        QDomElement e = node.toElement();        channel       = e.attribute("channel","0").toInt() - 1; @@ -397,7 +388,7 @@ void Route::read(QDomNode node)        QString st    = e.attribute("type", "TRACK");        if (st == "TRACK") { -            type = Route::TRACK; +            type = RouteNode::TRACK;              track = 0;              TrackList* tl = song->tracks();              for (iTrack i = tl->begin(); i != tl->end(); ++i) { @@ -407,39 +398,29 @@ void Route::read(QDomNode node)                          break;                          }                    } -            if (track == 0) { -                  MidiChannelList* mc = song->midiChannel(); -                  for (iMidiChannel i = mc->begin(); i != mc->end(); ++i) { -                        MidiChannel* t = *i; -                        if (t->name() == s) { -                              track = t; -                              break; -                              } -                        } -                  }              if (track == 0)                    printf("Route::read(): track <%s> not found\n", s.toLatin1().data());              }        else if (st == "AUDIOPORT") { -            type = Route::AUDIOPORT; +            type = RouteNode::AUDIOPORT;              port = audioDriver->findPort(s);              if (port.isZero())                    printf("Route::read(): audioport <%s> not found\n", s.toLatin1().data());              }        else if (st == "JACKMIDIPORT") { -            type = Route::JACKMIDIPORT; +            type = RouteNode::JACKMIDIPORT;              port = audioDriver->findPort(s);              if (port.isZero())                    printf("Route::read(): jack midiport <%s> not found\n", s.toLatin1().data());              }        else if (st == "MIDIPORT") { -            type = Route::MIDIPORT; +            type = RouteNode::MIDIPORT;              port = midiDriver->findPort(s);              if (port.isZero())                    printf("Route::read(): midiport <%s> not found\n", s.toLatin1().data());              }        else if (st == "SYNTIPORT") { -            type = Route::SYNTIPORT; +            type = RouteNode::SYNTIPORT;              SynthIList* tl = song->syntis();              for (iSynthI i = tl->begin(); i != tl->end(); ++i) {                    SynthI* t = *i; @@ -450,7 +431,7 @@ void Route::read(QDomNode node)                    }              }        else if (st == "AUX") { -            type = Route::AUXPLUGIN; +            type = RouteNode::AUXPLUGIN;              plugin = 0;              TrackList* tl = song->tracks();              for (iTrack i = tl->begin(); i != tl->end(); ++i) { @@ -481,7 +462,7 @@ void Route::read(QDomNode node)              }        else {              printf("Route::read(): unknown type <%s>\n", st.toLatin1().data()); -            type = Route::TRACK; +            type = RouteNode::TRACK;              }        } diff --git a/muse/muse/route.h b/muse/muse/route.h index 70ed536b..a57b6405 100644 --- a/muse/muse/route.h +++ b/muse/muse/route.h @@ -31,23 +31,8 @@ using AL::Xml;  #include "driver/driver.h" -// Routing Types: -// -// Audio: -//    Port - Track::Channel         Audio Input -//    Track::Channel - Port         Audio Ouput -//    Track - Track -//    Aux   - Track                 Audio Aux Send -// Midi: -//    Port  - Track                 Midi Input -//    Track - Port                  Midi Output -//    Track - Track -// -// A software synthesizer is somewhat special as it has -//    a midi input and an audio output -  //--------------------------------------------------------- -//   Route +//   RouteNode  //    this describes one endpoint of a route  //       Track  //       Track/Channel @@ -56,8 +41,8 @@ using AL::Xml;  //       SYNTI  //--------------------------------------------------------- -struct Route { -      enum RouteType { TRACK, AUDIOPORT, MIDIPORT, JACKMIDIPORT, +struct RouteNode { +      enum RouteNodeType { TRACK, AUDIOPORT, MIDIPORT, JACKMIDIPORT,           SYNTIPORT, AUXPLUGIN};        Port   port; @@ -69,14 +54,14 @@ struct Route {        bool disconnected;      // if true, do not remove route in graphChanged()                                // or removeConnection() -      RouteType type; +      RouteNodeType type; -      Route(); -      Route(Port, int, RouteType); -      Route(Port, RouteType); -      Route(Track*); -      Route(Track*, int, RouteType t = TRACK); -      Route(AuxPluginIF*); +      RouteNode(); +      RouteNode(Port, int, RouteNodeType); +      RouteNode(Port, RouteNodeType); +      RouteNode(Track*); +      RouteNode(Track*, int, RouteNodeType t = TRACK); +      RouteNode(AuxPluginIF*);        bool isPortType() const {              return type==AUDIOPORT || type == MIDIPORT || type == JACKMIDIPORT; @@ -90,10 +75,25 @@ struct Route {        void read(QDomNode node);        void write(Xml&, const char* name) const; -      bool operator==(const Route& a) const; +      bool operator==(const RouteNode& a) const;        void dump() const;        const char* tname() const; -      static const char* tname(RouteType); +      static const char* tname(RouteNodeType); +      }; + +//--------------------------------------------------------- +//    Route +//--------------------------------------------------------- + +struct Route { +      RouteNode src; +      RouteNode dst; + +      Route() {} +      Route(const RouteNode& s, const RouteNode& d) : src(s), dst(d) {} +      bool operator==(const Route& a) const {  +            return (src==a.src) && (dst==a.dst); +            }        };  Q_DECLARE_METATYPE(struct Route); @@ -102,9 +102,8 @@ typedef QList<Route> RouteList;  typedef RouteList::iterator iRoute;  typedef RouteList::const_iterator ciRoute; -extern bool addRoute(Route, Route); -extern void removeRoute(Route, Route); -extern bool checkRoute(const QString&, const QString&); +extern bool addRoute(const Route&); +extern void removeRoute(const Route&);  #endif diff --git a/muse/muse/seqmsg.cpp b/muse/muse/seqmsg.cpp index b2f26361..1033381a 100644 --- a/muse/muse/seqmsg.cpp +++ b/muse/muse/seqmsg.cpp @@ -34,7 +34,6 @@  #include "midictrl.h"  #include "midiplugin.h"  #include "part.h" -#include "midichannel.h"  #include "midioutport.h"  #include "midiinport.h" @@ -79,12 +78,12 @@ bool Audio::sendMessage(AudioMsg* m, bool doUndo)  //   msgRoute  //--------------------------------------------------------- -void Audio::msgRoute(bool add, Route src, Route dst) +void Audio::msgRoute(bool add, Route r)        {        if (add) -            msgAddRoute(src, dst); +            msgAddRoute(r);        else -            msgRemoveRoute(src, dst);       +            msgRemoveRoute(r);        song->update(SC_ROUTE);        } @@ -92,41 +91,40 @@ void Audio::msgRoute(bool add, Route src, Route dst)  //   msgRemoveRoute  //--------------------------------------------------------- -void Audio::msgRemoveRoute(Route src, Route dst) +void Audio::msgRemoveRoute(Route r)        { -      if (src.type == Route::AUDIOPORT) { -            AudioInput* ai = (AudioInput*)(dst.track); -            audioDriver->disconnect(src.port, ai->jackPort(dst.channel)); +      if (r.src.type == RouteNode::AUDIOPORT) { +            AudioInput* ai = (AudioInput*)(r.dst.track); +            audioDriver->disconnect(r.src.port, ai->jackPort(r.dst.channel));              } -      else if (src.type == Route::JACKMIDIPORT) { -            audioDriver->disconnect(src.port, ((MidiInPort*)dst.track)->jackPort()); +      else if (r.src.type == RouteNode::JACKMIDIPORT) { +            audioDriver->disconnect(r.src.port, ((MidiInPort*)r.dst.track)->jackPort());              } -      else if (src.type == Route::MIDIPORT) { -            midiDriver->disconnect(src.port, ((MidiInPort*)dst.track)->alsaPort()); +      else if (r.src.type == RouteNode::MIDIPORT) { +            midiDriver->disconnect(r.src.port, ((MidiInPort*)r.dst.track)->alsaPort());              } -      else if (dst.type == Route::AUDIOPORT) { -            AudioOutput* ai = (AudioOutput*)(src.track); -            audioDriver->disconnect(ai->jackPort(src.channel), dst.port); +      else if (r.dst.type == RouteNode::AUDIOPORT) { +            AudioOutput* ai = (AudioOutput*)(r.src.track); +            audioDriver->disconnect(ai->jackPort(r.src.channel), r.dst.port);              } -      else if (dst.type == Route::MIDIPORT) { -            midiDriver->disconnect(((MidiOutPort*)src.track)->alsaPort(), dst.port); +      else if (r.dst.type == RouteNode::MIDIPORT) { +            midiDriver->disconnect(((MidiOutPort*)r.src.track)->alsaPort(), r.dst.port);              } -      else if (dst.type == Route::JACKMIDIPORT) { -            audioDriver->disconnect(((MidiOutPort*)src.track)->jackPort(), dst.port); +      else if (r.dst.type == RouteNode::JACKMIDIPORT) { +            audioDriver->disconnect(((MidiOutPort*)r.src.track)->jackPort(), r.dst.port);              } -      msgRemoveRoute1(src, dst); +      msgRemoveRoute1(r);        }  //---------------------------------------------------------  //   msgRemoveRoute1  //--------------------------------------------------------- -void Audio::msgRemoveRoute1(Route src, Route dst) +void Audio::msgRemoveRoute1(Route r)        {        AudioMsg msg;        msg.id     = AUDIO_ROUTEREMOVE; -      msg.sroute = src; -      msg.droute = dst; +      msg.route = r;        sendMsg(&msg);        } @@ -134,28 +132,28 @@ void Audio::msgRemoveRoute1(Route src, Route dst)  //   msgAddRoute  //--------------------------------------------------------- -void Audio::msgAddRoute(Route src, Route dst) +void Audio::msgAddRoute(Route r)        { -      msgAddRoute1(src, dst); -      if (src.type == Route::AUDIOPORT) { -            AudioInput* ai = (AudioInput*)dst.track; -            audioDriver->connect(src.port, ai->jackPort(dst.channel)); +      msgAddRoute1(r); +      if (r.src.type == RouteNode::AUDIOPORT) { +            AudioInput* ai = (AudioInput*)r.dst.track; +            audioDriver->connect(r.src.port, ai->jackPort(r.dst.channel));              } -      else if (src.type == Route::JACKMIDIPORT) { -            audioDriver->connect(src.port, ((MidiInPort*)dst.track)->jackPort()); +      else if (r.src.type == RouteNode::JACKMIDIPORT) { +            audioDriver->connect(r.src.port, ((MidiInPort*)r.dst.track)->jackPort());              } -      else if (src.type == Route::MIDIPORT) { -            midiDriver->connect(src.port, ((MidiInPort*)dst.track)->alsaPort()); +      else if (r.src.type == RouteNode::MIDIPORT) { +            midiDriver->connect(r.src.port, ((MidiInPort*)r.dst.track)->alsaPort());              } -      else if (dst.type == Route::AUDIOPORT) { -            AudioOutput* ao = (AudioOutput*)src.track; -            audioDriver->connect(ao->jackPort(src.channel), dst.port); +      else if (r.dst.type == RouteNode::AUDIOPORT) { +            AudioOutput* ao = (AudioOutput*)r.src.track; +            audioDriver->connect(ao->jackPort(r.src.channel), r.dst.port);              } -      else if (dst.type == Route::MIDIPORT) { -            midiDriver->connect(((MidiOutPort*)src.track)->alsaPort(), dst.port); +      else if (r.dst.type == RouteNode::MIDIPORT) { +            midiDriver->connect(((MidiOutPort*)r.src.track)->alsaPort(), r.dst.port);              } -      else if (dst.type == Route::JACKMIDIPORT) { -            audioDriver->connect(((MidiOutPort*)src.track)->jackPort(), dst.port); +      else if (r.dst.type == RouteNode::JACKMIDIPORT) { +            audioDriver->connect(((MidiOutPort*)r.src.track)->jackPort(), r.dst.port);              }        } @@ -163,12 +161,11 @@ void Audio::msgAddRoute(Route src, Route dst)  //   msgAddRoute1  //--------------------------------------------------------- -void Audio::msgAddRoute1(Route src, Route dst) +void Audio::msgAddRoute1(Route r)        {        AudioMsg msg;        msg.id = AUDIO_ROUTEADD; -      msg.sroute = src; -      msg.droute = dst; +      msg.route = r;        sendMsg(&msg);        } @@ -230,8 +227,8 @@ void Audio::msgSetChannels(AudioTrack* node, int n)                                RouteList* ir = node->inRoutes();                                for (iRoute ii = ir->begin(); ii != ir->end(); ++ii) {                                      Route r = *ii; -                                    if ((r.type == Route::AUDIOPORT) && (r.channel == i)) { -                                          msgRemoveRoute(r, Route(node,i, Route::TRACK)); +                                    if ((r.src.type == RouteNode::AUDIOPORT) && (r.src.channel == i)) { +                                          msgRemoveRoute(r);                                            break;                                            }                                      } @@ -253,8 +250,8 @@ void Audio::msgSetChannels(AudioTrack* node, int n)                                RouteList* ir = node->outRoutes();                                for (iRoute ii = ir->begin(); ii != ir->end(); ++ii) {                                      Route r = *ii; -                                    if ((r.type == Route::AUDIOPORT) && (r.channel == i)) { -                                          msgRemoveRoute(Route(node,i,Route::TRACK), r); +                                    if ((r.src.type == RouteNode::AUDIOPORT) && (r.src.channel == i)) { +                                          msgRemoveRoute(r);                                            break;                                            }                                      } @@ -591,8 +588,8 @@ void Audio::msgPanic()        MidiEvent ev1(0, 0, ME_CONTROLLER, CTRL_ALL_SOUNDS_OFF, 0);        MidiEvent ev2(0, 0, ME_CONTROLLER, CTRL_RESET_ALL_CTRL, 0); -      MidiChannelList* cl = song->midiChannel(); -      for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) { +      MidiTrackList* cl = song->midis(); +      for (iMidiTrack i = cl->begin(); i != cl->end(); ++i) {              (*i)->playMidiEvent(&ev1);              (*i)->playMidiEvent(&ev2);              } @@ -606,8 +603,8 @@ void Audio::msgLocalOff()        {        MidiEvent ev1(0, 0, ME_CONTROLLER, CTRL_LOCAL_OFF, 0); -      MidiChannelList* cl = song->midiChannel(); -      for (iMidiChannel i = cl->begin(); i != cl->end(); ++i) +      MidiTrackList* cl = song->midis(); +      for (iMidiTrack i = cl->begin(); i != cl->end(); ++i)              (*i)->playMidiEvent(&ev1);        } diff --git a/muse/muse/song.cpp b/muse/muse/song.cpp index 2b9f9ff9..f14d4253 100644 --- a/muse/muse/song.cpp +++ b/muse/muse/song.cpp @@ -41,7 +41,6 @@  #include "midirc.h"  #include "part.h"  #include "conf.h" -#include "midichannel.h"  #include "midioutport.h"  #include "midiinport.h"  #include "instruments/minstrument.h" @@ -163,12 +162,11 @@ bool Song::addEvent(Event& event, Part* part)              MidiTrack* track = (MidiTrack*)part->track();              int tick  = event.tick();              int cntrl = event.dataA(); -            MidiChannel* mc = track->channel();              CVal val;              val.i = event.dataB(); -            if (mc && !mc->addControllerVal(cntrl, tick, val)) { -                  mc->addMidiController(mc->port()->instrument(), cntrl); -                  if (!mc->addControllerVal(cntrl, tick, val)) { +            if (!track->addControllerVal(cntrl, tick, val)) { +//TODOA                  track->addMidiController(track->port()->instrument(), cntrl); +                  if (!track->addControllerVal(cntrl, tick, val)) {                          return false;                          }                    } @@ -194,14 +192,11 @@ void Song::changeEvent(Event& oldEvent, Event& newEvent, Part* part)        if (newEvent.type() == Controller) {              MidiTrack* track = (MidiTrack*)part->track(); -            MidiChannel* mc  = track->channel(); -            if (mc) { -                  int tick  = newEvent.tick(); -                  int cntrl = newEvent.dataA(); -                  CVal val; -                  val.i   = newEvent.dataB(); -                  mc->addControllerVal(cntrl, tick, val); -                  } +            int tick  = newEvent.tick(); +            int cntrl = newEvent.dataA(); +            CVal val; +            val.i   = newEvent.dataB(); +            track->addControllerVal(cntrl, tick, val);              }        } @@ -590,37 +585,6 @@ void Song::update(int flags)        {        if (flags == 0)              return; -      if (flags & SC_ROUTE) { -            // -            // remove unconnected channels -            // -// printf("update tracks %d channels: %d\n", _tracks.size(), _midiChannel.size()); -            bool again; -            do { -                  again = false; -                  for (iTrack i = _tracks.begin(); i != _tracks.end(); ++i) { -                        if ((*i)->type() != Track::MIDI_CHANNEL) -                              continue; -                        MidiChannel* mc = (MidiChannel*)*i; -                        if (mc->noInRoute()) { -                              emit trackRemoved(mc); -                              _tracks.erase(i); -                              again = true; -                              break; -                              } -                        } -                  } while(again); -            // -            // add new connected channels -            // -            for (iMidiChannel i = _midiChannel.begin(); i != _midiChannel.end(); ++i) { -                  MidiChannel* mc = (MidiChannel*)*i; -                  if (mc->noInRoute() || trackExists(mc)) -                        continue; -                  _tracks.push_back(mc); -                  emit trackAdded(mc, _tracks.size()-1); -                  } -            }        emit songChanged(flags);        if (flags & SC_TEMPO)              emit tempoChanged(); @@ -1159,8 +1123,6 @@ void Song::clear(bool signal)        qDeleteAll(_midiInPorts);        _midiInPorts.clear(); -      _midiChannel.clear(); -        AL::tempomap.clear();        AL::sigmap.clear();        undoList->clear(); @@ -1551,7 +1513,6 @@ void Song::insertTrack(Track* track, int idx)              case Track::TRACK_TYPES:              case Track::MIDI_OUT:              case Track::MIDI_IN: -            case Track::MIDI_CHANNEL:              case Track::MIDI_SYNTI:                    break;              case Track::MIDI: @@ -1560,6 +1521,7 @@ void Song::insertTrack(Track* track, int idx)                    // if there is already a route, do not add another                    // default routing                    // +#if 0                    if (track->noOutRoute()) {                          for (iMidiChannel i = _midiChannel.begin(); i != _midiChannel.end(); ++i) {                                if ((*i)->noInRoute()) { @@ -1568,10 +1530,12 @@ void Song::insertTrack(Track* track, int idx)                                      }                                }                          } +#endif                    //                    // connect to all midi inputs, if there is not already                    // a route                    // +#if 0 //TODOA                    if (!track->noInRoute()) {                          MidiInPortList* mi = midiInPorts();                          for (iMidiInPort i = mi->begin(); i != mi->end(); ++i) { @@ -1579,20 +1543,22 @@ void Song::insertTrack(Track* track, int idx)                                      track->inRoutes()->push_back(Route(*i, ch, Route::TRACK));                                }                          } +#endif                    break;              case Track::AUDIO_SOFTSYNTH: -                  if (mo) -                        track->inRoutes()->push_back(Route(mo, -1, Route::TRACK)); +//TODOA                  if (mo) +//                        track->inRoutes()->push_back(Route(mo, -1, Route::TRACK));                    // fall through              case Track::WAVE:              case Track::AUDIO_GROUP: -                  if (ao) -                        track->outRoutes()->push_back(Route(ao)); +//TODOA                  if (ao) +//                        track->outRoutes()->push_back(Route(ao));                    break;              case Track::AUDIO_INPUT:                    { +#if 0 //TODOA                    // connect first input channel to first available jack output                    // etc.                    QList<PortName> op = audioDriver->outputPorts(false); @@ -1605,10 +1571,12 @@ void Song::insertTrack(Track* track, int idx)                          }                    if (ao)                          track->outRoutes()->push_back(Route(ao)); +#endif                    }                    break;              case Track::AUDIO_OUTPUT:                    { +#if 0 //TODOA                    QList<PortName> op = audioDriver->inputPorts(false);                    QList<PortName>::iterator is = op.begin();                    for (int ch = 0; ch < track->channels(); ++ch) { @@ -1617,6 +1585,7 @@ void Song::insertTrack(Track* track, int idx)                                ++is;                                }                          } +#endif                    }                    break;              } @@ -1685,17 +1654,10 @@ void Song::insertTrack2(Track* track)                    break;              case Track::MIDI_OUT:                    _midiOutPorts.push_back((MidiOutPort*)track); -                  for (int i = 0; i < MIDI_CHANNELS; ++i) { -                        MidiChannel* mc = ((MidiOutPort*)track)->channel(i); -                        _midiChannel.push_back(mc); -                        }                    break;              case Track::MIDI_IN:                    _midiInPorts.push_back((MidiInPort*)track);                    break; -            case Track::MIDI_CHANNEL: -                  _midiChannel.push_back((MidiChannel*)track); -                  break;              case Track::WAVE:                    _waves.push_back((WaveTrack*)track);                    break; @@ -1713,10 +1675,6 @@ void Song::insertTrack2(Track* track)                    SynthI* s = (SynthI*)track;                    midiInstruments.push_back(s->instrument());                    _synthIs.push_back(s); -                  for (int i = 0; i < MIDI_CHANNELS; ++i) { -                        MidiChannel* mc = ((SynthI*)track)->channel(i); -                        _midiChannel.push_back(mc); -                        }                    }                    break;              default: @@ -1728,34 +1686,29 @@ void Song::insertTrack2(Track* track)        //        //  connect routes        // -      Route src(track);        if (track->type() == Track::AUDIO_OUTPUT || track->type() == Track::MIDI_OUT) {              foreach(Route r, *(track->inRoutes())) { -                  if (r.type != Route::AUXPLUGIN) { -                        src.channel = r.channel; -                        r.track->outRoutes()->push_back(src); +                  if (r.src.type != RouteNode::AUXPLUGIN) { +                        r.src.track->outRoutes()->push_back(r);                          }                    }              }        else if (track->type() == Track::AUDIO_INPUT || track->type() == Track::MIDI_IN) {              foreach(Route r, *(track->outRoutes())) { -                  if (r.type != Route::AUXPLUGIN) { -                        src.channel = r.channel; -                        r.track->inRoutes()->push_back(src); +                  if (r.dst.type != RouteNode::AUXPLUGIN) { +                        r.dst.track->inRoutes()->push_back(r);                          }                    }              }        else {              foreach(Route r, *(track->inRoutes())) { -                  if (r.type != Route::AUXPLUGIN) { -                        src.channel = r.channel; -                        r.track->outRoutes()->push_back(src); +                  if (r.src.type != RouteNode::AUXPLUGIN) { +                        r.src.track->outRoutes()->push_back(r);                          }                    }              foreach(Route r, *(track->outRoutes())) { -                  if (r.type != Route::AUXPLUGIN) { -                        src.channel = r.channel; -                        r.track->inRoutes()->push_back(src); +                  if (r.dst.type != RouteNode::AUXPLUGIN) { +                        r.dst.track->inRoutes()->push_back(r);                          }                    }              } @@ -1769,31 +1722,6 @@ 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.indexOf(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.indexOf(mc); -                        undoOp(UndoOp::DeleteTrack, idx, mc); -                        removeTrack1(mc); -                        audio->msgRemoveTrack(mc); -                        removeTrack3(mc); -                        } -                  } -            }        int idx = _tracks.indexOf(track);        undoOp(UndoOp::DeleteTrack, idx, track);        removeTrack1(track); @@ -1834,9 +1762,6 @@ void Song::removeTrack2(Track* track)              case Track::MIDI_IN:                    _midiInPorts.removeAt(_midiInPorts.indexOf((MidiInPort*)track));                    break; -            case Track::MIDI_CHANNEL: -                  _midiChannel.removeAt(_midiChannel.indexOf((MidiChannel*)track)); -                  break;              case Track::WAVE:                    _waves.removeAt(_waves.indexOf((WaveTrack*)track));                    break; @@ -1862,30 +1787,28 @@ void Song::removeTrack2(Track* track)        //        //  remove routes        // -      Route src(track, -1, Route::TRACK);        foreach (const Route r, *(track->inRoutes())) { -            if (r.type != Route::TRACK && r.type != Route::SYNTIPORT) +            if (r.src.type != RouteNode::TRACK && r.src.type != RouteNode::SYNTIPORT)                    continue; -            src.channel = r.channel; -            int idx = r.track->outRoutes()->indexOf(src); +            int idx = r.src.track->outRoutes()->indexOf(r);              if (idx != -1) -                  r.track->outRoutes()->removeAt(idx); +                  r.src.track->outRoutes()->removeAt(idx);              else                    printf("Song::removeTrack2(): input route not found\n");              }        foreach (const Route r, *(track->outRoutes())) { -            if (r.type != Route::TRACK && r.type != Route::SYNTIPORT) +            if (r.dst.type != RouteNode::TRACK && r.dst.type != RouteNode::SYNTIPORT)                    continue; -            src.channel = r.channel; -            int idx = r.track->inRoutes()->indexOf(src); +            int idx = r.dst.track->inRoutes()->indexOf(r);              if (idx != -1) -                  r.track->inRoutes()->removeAt(idx); +                  r.dst.track->inRoutes()->removeAt(idx);              else {                    printf("Song::removeTrack2(): output route not found\n"); -                  src.dump(); +/*TODOA                  src.dump();                    printf("  in route list:\n");                    foreach (const Route rr, *(r.track->inRoutes()))                          rr.dump(); +*/                    }              }        } @@ -2208,12 +2131,9 @@ void Song::addControllerVal(Track* t, Ctrl* c, const Pos& p, CVal val)              unsigned ctime = t->timeType() == AL::FRAMES ? pos[0].frame() : pos[0].tick();              CVal cval = c->value(ctime);              if (c->curVal().i != cval.i) { -                  if (t->isMidiTrack()) { -                        if (t->type() == Track::MIDI_CHANNEL) { -                              MidiChannel* mc = (MidiChannel*)t; -                              MidiEvent ev(0, 0, ME_CONTROLLER, c->id(), cval.i); -                              mc->playMidiEvent(&ev); -                              } +                  if (t->type() == Track::MIDI) { +                        MidiEvent ev(0, 0, ME_CONTROLLER, c->id(), cval.i); +                        ((MidiTrack*)t)->playMidiEvent(&ev);                          }                    c->setCurVal(cval);                    } @@ -2239,8 +2159,8 @@ void Song::setControllerVal(Track* t, int id, CVal val)  void Song::setControllerVal(Track* t, Ctrl* c, CVal val)        {        if (t->isMidiTrack()) { -            if (t->type() == Track::MIDI_CHANNEL) { -                  MidiChannel* mc = (MidiChannel*)t; +            if (t->type() == Track::MIDI) { +                  MidiTrack* mc = (MidiTrack*)t;                    MidiEvent ev(0, 0, ME_CONTROLLER, c->id(), val.i);                    mc->playMidiEvent(&ev);                    } @@ -2486,3 +2406,13 @@ void Song::restartJack()        muse->seqRestart();        } +//--------------------------------------------------------- +//   routeChanged +//--------------------------------------------------------- + +void Song::routeChanged(QAction* a) +      { +      audio->msgRoute(a->isChecked(), a->data().value<Route>()); +      } + + diff --git a/muse/muse/song.h b/muse/muse/song.h index d06aad88..af2e426b 100644 --- a/muse/muse/song.h +++ b/muse/muse/song.h @@ -24,7 +24,6 @@  #include "undo.h"  #include "midiinport.h"  #include "midioutport.h" -#include "midichannel.h"  #include "miditrack.h"  #include "midisynti.h"  #include "wavetrack.h" @@ -110,13 +109,11 @@ class Song : public QObject {        MidiSyntiList _midiSyntis;        MidiOutPortList _midiOutPorts;        MidiInPortList _midiInPorts; -      MidiChannelList _midiChannel;        Track* _selectedTrack;        UndoList* undoList;        UndoList* redoList;        Pos pos[3]; -//      Pos _vcpos;               // virtual CPOS (locate in progress)        AL::MarkerList* _markerList;        bool seekInProgress;	// user initiated a seek @@ -165,6 +162,7 @@ class Song : public QObject {        void setPos(int, const AL::Pos&);        void setPos(int, const AL::Pos&, bool sig, bool isSeek = true,           bool adjustScrollbar = false); +      void routeChanged(QAction*);     signals:        void songChanged(int); @@ -309,7 +307,6 @@ class Song : public QObject {        MidiOutPortList* midiOutPorts() { return &_midiOutPorts; }        MidiSyntiList* midiSyntis()     { return &_midiSyntis;   }        MidiInPortList* midiInPorts()   { return &_midiInPorts;  } -      MidiChannelList* midiChannel()  { return &_midiChannel;  }        bool trackExists(Track*) const; diff --git a/muse/muse/songfile.cpp b/muse/muse/songfile.cpp index 51898d07..c8f89e7b 100644 --- a/muse/muse/songfile.cpp +++ b/muse/muse/songfile.cpp @@ -40,7 +40,6 @@  #include "marker/markerview.h"  #include "midioutport.h"  #include "midiinport.h" -// #include "midichannel.h"  //---------------------------------------------------------  //   readPart @@ -310,11 +309,8 @@ void Song::write(Xml& xml) const        cloneList.clear();        // write tracks -      for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i) { -            // midi channels are saved as part of midi out ports -            if ((*i)->type() != Track::MIDI_CHANNEL) -                  (*i)->write(xml); -            } +      for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i) +            (*i)->write(xml);        // write routing        for (ciTrack i = _tracks.begin(); i != _tracks.end(); ++i) diff --git a/muse/muse/synth.cpp b/muse/muse/synth.cpp index 23efe9c2..1b5d09fa 100644 --- a/muse/muse/synth.cpp +++ b/muse/muse/synth.cpp @@ -31,7 +31,6 @@  #include "audio.h"  #include "event.h"  #include "midievent.h" -#include "midichannel.h"  #include "audio.h"  #include "midiseq.h"  #include "midictrl.h" @@ -189,8 +188,8 @@ SynthI::SynthI()        // setVolume(1.0);        // setPan(0.0);        _instrument = this; -      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) -            _channel[ch] = new MidiChannel(this, ch); +//      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) +//            _channel[ch] = new MidiChannel(this, ch);        }  //--------------------------------------------------------- @@ -201,8 +200,8 @@ SynthI::~SynthI()        {        deactivate2();        deactivate3(); -      for (int ch = 0; ch < MIDI_CHANNEL; ++ch) -            delete _channel[ch]; +//      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) +//            delete _channel[ch];        }  //--------------------------------------------------------- @@ -212,8 +211,8 @@ SynthI::~SynthI()  void SynthI::setName(const QString& s)        {        Track::setName(s); -      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) -            _channel[ch]->setDefaultName(); +//      for (int ch = 0; ch < MIDI_CHANNELS; ++ch) +//            _channel[ch]->setDefaultName();        }  //--------------------------------------------------------- @@ -373,10 +372,10 @@ void SynthI::write(Xml& xml) const        AudioTrack::writeProperties(xml);        xml.strTag("class", synth()->name()); -      for (int i = 0; i < MIDI_CHANNELS; ++i) { -            if (!_channel[i]->noInRoute()) -                  _channel[i]->write(xml); -            } +//      for (int i = 0; i < MIDI_CHANNELS; ++i) { +//            if (!_channel[i]->noInRoute()) +//                  _channel[i]->write(xml); +//            }        //---------------------------------------------        // if soft synth is attached to a midi port, @@ -454,10 +453,10 @@ void SynthI::read(QDomNode node)                    }              else if (tag == "geometry")                    r = AL::readGeometry(node); -            else if (tag == "MidiChannel") { -                  int idx = e.attribute("idx", "0").toInt(); -                  _channel[idx]->read(node.firstChild()); -                  } +//            else if (tag == "MidiChannel") { +//                  int idx = e.attribute("idx", "0").toInt(); +//                  _channel[idx]->read(node.firstChild()); +//                  }              else if (AudioTrack::readProperties(node)) {                    printf("MusE:SynthI: unknown tag %s\n", e.tagName().toLatin1().data());                    } diff --git a/muse/muse/track.cpp b/muse/muse/track.cpp index 18749960..2b4f0b79 100644 --- a/muse/muse/track.cpp +++ b/muse/muse/track.cpp @@ -32,7 +32,6 @@  #include "part.h"  #include "gui.h"  #include "midioutport.h" -#include "midichannel.h"  #include "driver/audiodev.h"  #include "driver/mididev.h" @@ -40,12 +39,12 @@  const char* Track::_cname[] = {        "AudioOut", "Group", "Wave", "AudioIn", -      "Synth", "Midi", "MidiOut", "MidiIn", "M-Ch", "M-Synth" +      "Synth", "Midi", "MidiOut", "MidiIn", "M-Synth"        };  const char* Track::_clname[] = {        "Audio Output", "Audio Group", "Wave Track", "Audio Input", -      "Synti", "Midi Track", "Midi Output", "Midi Input", "Midi Channel", +      "Synti", "Midi Track", "Midi Output", "Midi Input",        "Midi Synth"        }; @@ -87,7 +86,6 @@ QPixmap* Track::pixmap(TrackType t)              case MIDI:         return addtrack_addmiditrackIcon;              case MIDI_OUT:     return addtrack_addmiditrackIcon;              case MIDI_IN:      return addtrack_addmiditrackIcon; -            case MIDI_CHANNEL: return addtrack_addmiditrackIcon;              }        } @@ -149,15 +147,6 @@ void Track::setDefaultName()              case WAVE:                    base = QString("Track");                    break; -            case MIDI_CHANNEL: -                  { -                  MidiOut* mop = ((MidiChannel*)this)->port(); -                  int no = ((MidiChannel*)this)->channelNo(); -                  base = QString("%1:%2").arg(mop->track->name()).arg(no + 1); -                  setName(base); -                  return; -                  } -                  break;              case AUDIO_GROUP:                    base = QString("Group");                    break; @@ -191,24 +180,11 @@ void Track::setDefaultName()                          break;                          }                    } -            MidiChannelList* mc = song->midiChannel(); -            for (iMidiChannel ic = mc->begin(); ic != mc->end(); ++ic) { -                  MidiChannel* t = *ic; -                  if (t->name() == s) { -                        found = true; -                        break; -                        } -                  }              if (!found) {                    setName(s);                    break;                    }              } -      if (type() == MIDI_OUT) { -            MidiOutPort* mop = (MidiOutPort*) this; -            for (int i = 0; i < MIDI_CHANNELS; ++i) -                  mop->channel(i)->setDefaultName(); -            }        }  //--------------------------------------------------------- @@ -679,34 +655,18 @@ void Track::updateController()  void Track::writeRouting(Xml& xml) const        { -      foreach(Route src, _inRoutes) { -            Route dst((Track*)this); -            if (type() == AUDIO_INPUT || type() == MIDI_IN) { +      if (type() == AUDIO_INPUT || type() == MIDI_IN) { +            foreach(Route r, _inRoutes) {                    xml.tag("Route"); -                  dst.channel = src.channel; -                  src.write(xml, "src"); -                  dst.write(xml, "dst"); -                  xml.etag("Route"); -                  } -            else if (src.type == Route::AUXPLUGIN) { -                  xml.tag("Route"); -                  src.write(xml, "src"); -                  dst.write(xml, "dst"); +                  r.src.write(xml, "src"); +                  r.dst.write(xml, "dst");                    xml.etag("Route");                    }              }        foreach(Route r, _outRoutes) { -            Route src((Track*)this); -            Route dst(r); -            if (type() == MIDI_IN) { -                  src.channel = dst.channel; -                  dst.channel = 0; -                  } -            else if (type() == AUDIO_OUTPUT) -                  src.channel = r.channel;              xml.tag("Route"); -            src.write(xml, "src"); -            dst.write(xml, "dst"); +            r.src.write(xml, "src"); +            r.dst.write(xml, "dst");              xml.etag("Route");              }        } @@ -1014,34 +974,32 @@ void Track::activate2()              printf("Track::activate2(): no audio running !\n");              abort();              } -      for (iRoute ri = _outRoutes.begin(); ri != _outRoutes.end(); ++ri) { -            Route& r = *ri; -            if (r.type == Route::JACKMIDIPORT) { -                  audioDriver->connect(_jackPort[0], r.port); -                  r.disconnected = false; +      foreach(Route r, _outRoutes) { +            if (r.dst.type == RouteNode::JACKMIDIPORT) { +                  audioDriver->connect(_jackPort[0], r.dst.port); +                  r.dst.disconnected = false;                    } -            else if (r.type == Route::AUDIOPORT) { -                  audioDriver->connect(_jackPort[r.channel], r.port); -                  r.disconnected = false; +            else if (r.dst.type == RouteNode::AUDIOPORT) { +                  audioDriver->connect(_jackPort[r.dst.channel], r.dst.port); +                  r.dst.disconnected = false;                    } -            else if (r.type == Route::MIDIPORT) { -                  midiDriver->connect(_alsaPort[0], r.port); -                  r.disconnected = false; +            else if (r.dst.type == RouteNode::MIDIPORT) { +                  midiDriver->connect(_alsaPort[0], r.dst.port); +                  r.dst.disconnected = false;                    }              } -      for (iRoute ri = _inRoutes.begin(); ri != _inRoutes.end(); ++ri) { -            Route& r = *ri; -            if (r.type == Route::JACKMIDIPORT) { -                  audioDriver->connect(r.port, _jackPort[0]); -                  r.disconnected = false; +      foreach(Route r, _inRoutes) { +            if (r.src.type == RouteNode::JACKMIDIPORT) { +                  audioDriver->connect(r.src.port, _jackPort[0]); +                  r.src.disconnected = false;                    } -            else if (r.type == Route::AUDIOPORT) { -                  audioDriver->connect(r.port, _jackPort[r.channel]); -                  r.disconnected = false; +            else if (r.src.type == RouteNode::AUDIOPORT) { +                  audioDriver->connect(r.src.port, _jackPort[r.src.channel]); +                  r.src.disconnected = false;                    } -            else if (r.type == Route::MIDIPORT) { -                  midiDriver->connect(r.port, _alsaPort[0]); -                  r.disconnected = false; +            else if (r.src.type == RouteNode::MIDIPORT) { +                  midiDriver->connect(r.src.port, _alsaPort[0]); +                  r.src.disconnected = false;                    }              }        } @@ -1054,34 +1012,32 @@ void Track::activate2()  void Track::deactivate()        {  // printf("deactivate<%s>\n", name().toLatin1().data()); -      for (iRoute ri = _outRoutes.begin(); ri != _outRoutes.end(); ++ri) { -            Route& r = *ri; -            if (r.type == Route::JACKMIDIPORT) { -                  r.disconnected = true; -                  audioDriver->disconnect(_jackPort[0], r.port); +      foreach(Route r, _outRoutes) { +            if (r.dst.type == RouteNode::JACKMIDIPORT) { +                  r.dst.disconnected = true; +                  audioDriver->disconnect(_jackPort[0], r.dst.port);                    } -            else if (r.type == Route::AUDIOPORT) { -                  audioDriver->disconnect(_jackPort[r.channel], r.port); -                  r.disconnected = true; +            else if (r.dst.type == RouteNode::AUDIOPORT) { +                  audioDriver->disconnect(_jackPort[r.dst.channel], r.dst.port); +                  r.dst.disconnected = true;                    } -            else if (r.type == Route::MIDIPORT) { -                  r.disconnected = true; -                  midiDriver->disconnect(_alsaPort[0], r.port); +            else if (r.dst.type == RouteNode::MIDIPORT) { +                  r.dst.disconnected = true; +                  midiDriver->disconnect(_alsaPort[0], r.dst.port);                    }              } -      for (iRoute ri = _inRoutes.begin(); ri != _inRoutes.end(); ++ri) { -            Route& r = *ri; -            if (r.type == Route::JACKMIDIPORT) { -                  r.disconnected = true; -                  audioDriver->disconnect(r.port, _jackPort[0]); +      foreach(Route r, _inRoutes) { +            if (r.src.type == RouteNode::JACKMIDIPORT) { +                  r.src.disconnected = true; +                  audioDriver->disconnect(r.src.port, _jackPort[0]);                    } -            else if (r.type == Route::AUDIOPORT) { -                  r.disconnected = true; -                  audioDriver->disconnect(r.port, _jackPort[r.channel]); +            else if (r.src.type == RouteNode::AUDIOPORT) { +                  r.src.disconnected = true; +                  audioDriver->disconnect(r.src.port, _jackPort[r.src.channel]);                    } -            else if (r.type == Route::MIDIPORT) { -                  r.disconnected = true; -                  midiDriver->disconnect(r.port, _alsaPort[0]); +            else if (r.src.type == RouteNode::MIDIPORT) { +                  r.src.disconnected = true; +                  midiDriver->disconnect(r.src.port, _alsaPort[0]);                    }              }        for (int i = 0; i < channels(); ++i) { diff --git a/muse/muse/track.h b/muse/muse/track.h index 354edf46..7940aa75 100644 --- a/muse/muse/track.h +++ b/muse/muse/track.h @@ -87,7 +87,6 @@ class Track : public QObject {              MIDI,              MIDI_OUT,              MIDI_IN, -            MIDI_CHANNEL,              MIDI_SYNTI,              TRACK_TYPES              }; @@ -100,7 +99,6 @@ class Track : public QObject {              M_MIDI            = 1 << MIDI,              M_MIDI_OUT        = 1 << MIDI_OUT,              M_MIDI_IN         = 1 << MIDI_IN, -            M_MIDI_CHANNEL    = 1 << MIDI_CHANNEL,              M_MIDI_SYNTI      = 1 << MIDI_SYNTI              }; @@ -287,7 +285,6 @@ class Track : public QObject {              return type() == MIDI                 || type() == MIDI_IN                 || type() == MIDI_OUT -               || type() == MIDI_CHANNEL                 || type() == MIDI_SYNTI;              }        virtual bool canRecord() const { return false; } diff --git a/muse/muse/widgets/utils.cpp b/muse/muse/widgets/utils.cpp index 89417f5c..16feb0d0 100644 --- a/muse/muse/widgets/utils.cpp +++ b/muse/muse/widgets/utils.cpp @@ -360,6 +360,42 @@ SimpleButton* newStereoButton()        }  //--------------------------------------------------------- +//   newOutRouteButton +//--------------------------------------------------------- + +QToolButton* newOutRouteButton() +      { +      QToolButton* oR = new QToolButton; +      oR->setFont(config.fonts[BFONT]); +      oR->setFixedWidth((STRIP_WIDTH-4)/2); +      oR->setText(oR->tr("oR")); +      oR->setCheckable(false); +      oR->setToolTip(oR->tr("output routing")); +      oR->setMenu(new QMenu); +      oR->setPopupMode(QToolButton::InstantPopup); +      oR->menu()->setSeparatorsCollapsible(false); +      return oR; +      } + +//--------------------------------------------------------- +//   newInRouteButton +//--------------------------------------------------------- + +QToolButton* newInRouteButton() +      { +      QToolButton* iR = new QToolButton; +      iR->setFont(config.fonts[BFONT]); +      iR->setFixedWidth((STRIP_WIDTH-4)/2); +      iR->setText(iR->tr("iR")); +      iR->setCheckable(false); +      iR->setToolTip(iR->tr("input routing")); +      iR->setMenu(new QMenu); +      iR->setPopupMode(QToolButton::InstantPopup); +      iR->menu()->setSeparatorsCollapsible(false); +      return iR; +      } + +//---------------------------------------------------------  //   fatalError  //--------------------------------------------------------- diff --git a/muse/muse/widgets/utils.h b/muse/muse/widgets/utils.h index e395ff3a..c520c6d5 100644 --- a/muse/muse/widgets/utils.h +++ b/muse/muse/widgets/utils.h @@ -45,6 +45,8 @@ extern SimpleButton* newSyncButton();  extern SimpleButton* newPlusButton();  extern SimpleButton* newMinusButton();  extern SimpleButton* newStereoButton(); +QToolButton* newOutRouteButton(); +QToolButton* newInRouteButton();  extern void fatalError(const char*); | 
