diff options
| -rw-r--r-- | muse/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | muse/ChangeLog | 3 | ||||
| -rw-r--r-- | muse/all.h | 1 | ||||
| -rw-r--r-- | muse/muse/driver/alsamidi.cpp | 14 | ||||
| -rw-r--r-- | muse/muse/midiinport.cpp | 20 | ||||
| -rw-r--r-- | muse/muse/midiinport.h | 2 | ||||
| -rw-r--r-- | muse/muse/mixer/mstrip.cpp | 61 | ||||
| -rw-r--r-- | muse/muse/mixer/mstrip.h | 6 | ||||
| -rw-r--r-- | muse/muse/muse.qrc | 2 | ||||
| -rw-r--r-- | muse/muse/route.h | 4 | ||||
| -rw-r--r-- | muse/muse/xpm/activeoff.svg | 120 | ||||
| -rw-r--r-- | muse/muse/xpm/activeon.svg | 120 | 
12 files changed, 329 insertions, 35 deletions
| diff --git a/muse/CMakeLists.txt b/muse/CMakeLists.txt index f8e3b5bc..973ccae4 100644 --- a/muse/CMakeLists.txt +++ b/muse/CMakeLists.txt @@ -55,11 +55,6 @@ option ( ENABLE_VST    "enable VST/win support"                 OFF)  option ( ENABLE_FLUID  "enable fluidsynth softsynth plugins"     ON)  option ( ENABLE_ZYNADDSUBFX "enable zyaddsubfx softsynth plugin" ON) -set(QT_MIN_VERSION "4.2.0") -set(QT_USE_QTXML TRUE) -set(QT_USE_QTDESIGNER TRUE) -set(QT_USE_QTNSPLUGIN TRUE) -  ##  ## Just print a notice if this is OS X  ## @@ -76,6 +71,12 @@ endif (APPLE)  ##  look for Qt4  ## +set(QT_MIN_VERSION "4.2.0") +set(QT_USE_QTXML TRUE) +set(QT_USE_QTDESIGNER TRUE) +set(QT_USE_QTNSPLUGIN TRUE) +set(QT_USE_QTSVG TRUE) +  find_package(Qt4)  if (NOT QT4_FOUND) diff --git a/muse/ChangeLog b/muse/ChangeLog index e25be625..d330e606 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,6 @@ +10.11 (ws) +      - replaced meter in midi input strip by activity "leds" for all +        midi channels  8.11 (ws)        - removed the suboptimal "MidiChannel" concept. MidiChannels are          now merged with MidiTracks. @@ -115,6 +115,7 @@  #include <QtGui/QStyleFactory>  #include <QtGui/QDockWidget>  #include <QtGui/QDesktopServices> +#include <QtSvg/QSvgRenderer>  #endif diff --git a/muse/muse/driver/alsamidi.cpp b/muse/muse/driver/alsamidi.cpp index ba3f303c..1df1199b 100644 --- a/muse/muse/driver/alsamidi.cpp +++ b/muse/muse/driver/alsamidi.cpp @@ -654,6 +654,9 @@ bool AlsaMidi::putEvent(snd_seq_event_t* event)  void AlsaMidi::updateConnections()        { +      // +      //  add connections +      //        while (!addCon.isEmpty()) {              PortRoute pr = addCon.get();              MidiOutPortList* opl = song->midiOutPorts(); @@ -686,18 +689,19 @@ void AlsaMidi::updateConnections()                          }                    }              } +      // +      //  remove connections +      //        while (!removeCon.isEmpty()) {              PortRoute pr = removeCon.get();              foreach(MidiInPort* iport, *(song->midiInPorts())) {                    Port dst = iport->alsaPort(); -                    if (dst == pr.dst) {                          RouteList* irl = iport->inRoutes();                          for (iRoute r = irl->begin(); r != irl->end(); ++r) { -/*TODO*/                              if (/*(!r->disconnected) &&*/ (r->src.port == pr.src)) { +                              if (r->src.port == pr.src) {                                      iport->inRoutes()->erase(r); -// printf("remove in connection\n");                                      break;                                      }                                } @@ -707,13 +711,11 @@ void AlsaMidi::updateConnections()              foreach(MidiOutPort* oport, *(song->midiOutPorts())) {                    Port src = oport->alsaPort(); -                    if (src == pr.src) {                          RouteList* orl = oport->outRoutes();                          for (iRoute r = orl->begin(); r != orl->end(); ++r) { -                              if (/*(!r->disconnected) &&*/ (r->dst.port == pr.dst)) { +                              if (r->dst.port == pr.dst) {                                      orl->erase(r); -// printf("remove out connection\n");                                      break;                                      }                                } diff --git a/muse/muse/midiinport.cpp b/muse/muse/midiinport.cpp index f340cb94..1035bf14 100644 --- a/muse/muse/midiinport.cpp +++ b/muse/muse/midiinport.cpp @@ -26,6 +26,7 @@  #include "driver/mididev.h"  #include "driver/audiodev.h"  #include "audio.h" +#include "gconfig.h"  #include "midiinport.h" @@ -40,6 +41,8 @@ MidiInPort::MidiInPort()        recordRead  = 0;        recordWrite = 0;        recordCount = 0; +      for (int i = 0; i < MIDI_CHANNELS; ++i) +            activity[i] = 0;        }  //--------------------------------------------------------- @@ -171,12 +174,14 @@ void MidiInPort::eventReceived(snd_seq_event_t* ev)        pipeline()->apply(audio->curTickPos(), audio->nextTickPos(), &il, &ol);        // -      // update midi meter +      // update midi activity        // notify gui of new events        // +      int hold = config.guiRefresh / 5 + 1;   // hold for >= 1/5 sec +        for (iMidiEvent i = ol.begin(); i != ol.end(); ++i) {              if (i->type() == ME_NOTEON) -                  addMidiMeter(i->dataB()); +                  activity[i->channel()] += hold;              song->putEvent(*i);              if (recordCount == RECORD_FIFO_SIZE) {                    printf("MusE: eventReceived(): fifo overflow\n"); @@ -232,3 +237,14 @@ void MidiInPort::getEvents(unsigned, unsigned, int ch, MidiEventList* dst)              }        } +//--------------------------------------------------------- +//   checkActivity +//--------------------------------------------------------- + +bool MidiInPort::checkActivity(int channel) +      { +      if (activity[channel]) +            --activity[channel]; +      return activity[channel] != 0;       +      } + diff --git a/muse/muse/midiinport.h b/muse/muse/midiinport.h index a5d72804..4a7b8bf1 100644 --- a/muse/muse/midiinport.h +++ b/muse/muse/midiinport.h @@ -37,6 +37,7 @@ class MidiInPort : public MidiTrackBase {        int recordRead, recordWrite;        volatile int recordCount;        int tmpRecordCount; +      int activity[MIDI_CHANNELS];     public:        MidiInPort(); @@ -55,6 +56,7 @@ class MidiInPort : public MidiTrackBase {        virtual void getEvents(unsigned from, unsigned to, int channel, MidiEventList* dst);        void beforeProcess();        void afterProcess(); +      bool checkActivity(int channel);        };  typedef QList<MidiInPort*> MidiInPortList; diff --git a/muse/muse/mixer/mstrip.cpp b/muse/muse/mixer/mstrip.cpp index 49eac1f4..dec6c55d 100644 --- a/muse/muse/mixer/mstrip.cpp +++ b/muse/muse/mixer/mstrip.cpp @@ -842,26 +842,45 @@ MidiInPortStrip::MidiInPortStrip(Mixer* m, MidiInPort* t, bool align)        rack->setFixedSize(STRIP_WIDTH, rack->sizeHint().height()+2);        layout->addWidget(rack); -      if (_align) -      //      layout->addSpacing(STRIP_WIDTH/2); -            layout->addSpacing(LABEL_HEIGHT); - -      //--------------------------------------------------- -      //    slider, label, meter -      //--------------------------------------------------- - -      meter = new Awl::MidiMeter(this); -      meter->setFixedWidth(40); -      layout->addWidget(meter, 100, Qt::AlignRight); -        //--------------------------------------------------- -      //    pan, balance +      //    input activity        //--------------------------------------------------- -      if (_align) { -            layout->addSpacing(STRIP_WIDTH/2 + STRIP_WIDTH/3); -            layout->addSpacing(LABEL_HEIGHT); +      layout->addStretch(100); + +      QGridLayout* ag = new QGridLayout; +      ag->setMargin(4); +      ag->setSpacing(1); +      QSvgRenderer sr; +      QPainter painter; + +      sr.load(QString(":/xpm/activeon.svg")); +      QSize aSize(sr.defaultSize()); +      activityOn = new QPixmap(aSize); +      activityOn->fill(Qt::transparent); +      painter.begin(activityOn); +      sr.render(&painter); +      painter.end(); +       +      sr.load(QString(":/xpm/activeoff.svg")); +      activityOff = new QPixmap(aSize); +      activityOff->fill(Qt::transparent); +      painter.begin(activityOff); +      sr.render(&painter); +      painter.end(); + +      for (int ch = MIDI_CHANNELS-1; ch >= 0; --ch) { +            QLabel* l = new QLabel(QString("%1").arg(ch+1)); +            QFont f = l->font(); +            f.setPixelSize(8); +            l->setFont(f); +            ag->addWidget(l, ch, 0, Qt::AlignCenter); +            channelActivity[ch] = new QLabel; +            ag->addWidget(channelActivity[ch], ch, 1, Qt::AlignCenter); +            channelActivity[ch]->setPixmap(*activityOff); +            activity[ch] = 0;              } +      layout->addLayout(ag, Qt::AlignHCenter);        //---------------------------------------------------        //    mute, solo @@ -930,9 +949,13 @@ void MidiInPortStrip::songChanged(int val)  void MidiInPortStrip::heartBeat()        { -      double a = track->meter(0); // fast_log10(track->meter(0)) * .2f; -      meter->setMeterVal(a * 0.008); -      track->setMeter(0, a * 0.8);  // hack +      for (int i = 0; i < MIDI_CHANNELS; ++i) { +            bool isActive = inport()->checkActivity(i); +            if (activity[i] != isActive) { +                  channelActivity[i]->setPixmap(isActive ? *activityOn : *activityOff); +                  activity[i] = isActive; +                  } +            }        }  //--------------------------------------------------------- diff --git a/muse/muse/mixer/mstrip.h b/muse/muse/mixer/mstrip.h index e4645173..ed3b5255 100644 --- a/muse/muse/mixer/mstrip.h +++ b/muse/muse/mixer/mstrip.h @@ -171,9 +171,13 @@ class MidiSyntiStrip : public Strip {  class MidiInPortStrip : public Strip {        Q_OBJECT -      Awl::MidiMeter* meter; +      bool activity[MIDI_CHANNELS]; +      QPixmap* activityOn; +      QPixmap* activityOff; +      QLabel* channelActivity[MIDI_CHANNELS];        QToolButton* iR;        QToolButton* oR; +      MidiInPort* inport() const { return (MidiInPort*)track; }     private slots:        void muteToggled(bool); diff --git a/muse/muse/muse.qrc b/muse/muse/muse.qrc index 9808fae1..7c790440 100644 --- a/muse/muse/muse.qrc +++ b/muse/muse/muse.qrc @@ -19,6 +19,8 @@  	<file>xpm/recordOff.svg</file>  	<file>xpm/greendot.svg</file>  	<file>xpm/darkgreendot.svg</file> +	<file>xpm/activeon.svg</file> +	<file>xpm/activeoff.svg</file>  	<file>xpm/on.svg</file>  	<file>xpm/off.svg</file>  	<file>xpm/mono.svg</file> diff --git a/muse/muse/route.h b/muse/muse/route.h index 037f9e64..531be751 100644 --- a/muse/muse/route.h +++ b/muse/muse/route.h @@ -88,8 +88,8 @@ struct Route {        bool disconnected;      // if true, do not remove route in graphChanged()                                // or removeConnection() -      Route() { disconnected = false; } -      Route(const RouteNode& s, const RouteNode& d) : src(s), dst(d) {} +      Route() { disconnected = false;} +      Route(const RouteNode& s, const RouteNode& d) : src(s), dst(d) { disconnected = false;}        bool operator==(const Route& a) const {               return (src==a.src) && (dst==a.dst);              } diff --git a/muse/muse/xpm/activeoff.svg b/muse/muse/xpm/activeoff.svg new file mode 100644 index 00000000..8449f988 --- /dev/null +++ b/muse/muse/xpm/activeoff.svg @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg +   xmlns:dc="http://purl.org/dc/elements/1.1/" +   xmlns:cc="http://web.resource.org/cc/" +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" +   xmlns:svg="http://www.w3.org/2000/svg" +   xmlns="http://www.w3.org/2000/svg" +   xmlns:xlink="http://www.w3.org/1999/xlink" +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" +   width="20" +   height="10" +   id="svg1307" +   sodipodi:version="0.32" +   inkscape:version="0.44" +   sodipodi:docbase="/home/ws/projects/muse/muse/trunk/muse/muse/xpm" +   sodipodi:docname="activeoff.svg" +   version="1.0"> +  <defs +     id="defs1309"> +    <linearGradient +       id="linearGradient1319"> +      <stop +         style="stop-color:#ffffff;stop-opacity:1;" +         offset="0" +         id="stop1321" /> +      <stop +         style="stop-color:#1a561c;stop-opacity:1;" +         offset="1" +         id="stop1323" /> +    </linearGradient> +    <linearGradient +       id="linearGradient1370"> +      <stop +         style="stop-color:#ff271f;stop-opacity:1;" +         offset="0" +         id="stop1372" /> +      <stop +         style="stop-color:#ff0000;stop-opacity:0;" +         offset="1" +         id="stop1374" /> +    </linearGradient> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient1370" +       id="linearGradient1376" +       x1="-5.6423869" +       y1="-5.6206923" +       x2="8.5200005" +       y2="8.4349537" +       gradientUnits="userSpaceOnUse" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient1370" +       id="linearGradient1315" +       gradientUnits="userSpaceOnUse" +       x1="-1.8582375" +       y1="-0.071628742" +       x2="3.8178029" +       y2="2.5516095" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient1319" +       id="radialGradient1325" +       cx="18.5282" +       cy="0.093760476" +       fx="18.5282" +       fy="0.093760476" +       r="7.8356543" +       gradientTransform="matrix(-0.515305,-0.68232,0.563264,-0.418808,19.85983,21.47543)" +       gradientUnits="userSpaceOnUse" /> +  </defs> +  <sodipodi:namedview +     id="base" +     pagecolor="#ffffff" +     bordercolor="#666666" +     borderopacity="1.0" +     inkscape:pageopacity="0.0" +     inkscape:pageshadow="2" +     inkscape:zoom="39.396621" +     inkscape:cx="11.149585" +     inkscape:cy="3.4613455" +     inkscape:current-layer="layer1" +     showgrid="true" +     inkscape:grid-bbox="true" +     inkscape:document-units="px" +     inkscape:window-width="1680" +     inkscape:window-height="996" +     inkscape:window-x="0" +     inkscape:window-y="0" +     width="20px" +     height="10px" /> +  <metadata +     id="metadata1312"> +    <rdf:RDF> +      <cc:Work +         rdf:about=""> +        <dc:format>image/svg+xml</dc:format> +        <dc:type +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> +      </cc:Work> +    </rdf:RDF> +  </metadata> +  <g +     id="layer1" +     inkscape:label="Layer 1" +     inkscape:groupmode="layer"> +    <path +       sodipodi:type="arc" +       style="fill:url(#radialGradient1325);fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" +       id="path1317" +       sodipodi:cx="7.3610373" +       sodipodi:cy="7.3317437" +       sodipodi:rx="7.3356543" +       sodipodi:ry="7.2721972" +       d="M 14.696692 7.3317437 A 7.3356543 7.2721972 0 1 1  0.025382996,7.3317437 A 7.3356543 7.2721972 0 1 1  14.696692 7.3317437 z" +       transform="matrix(1.301701,0,0,0.625509,0.41813,0.413925)" /> +  </g> +</svg> diff --git a/muse/muse/xpm/activeon.svg b/muse/muse/xpm/activeon.svg new file mode 100644 index 00000000..c6426e54 --- /dev/null +++ b/muse/muse/xpm/activeon.svg @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg +   xmlns:dc="http://purl.org/dc/elements/1.1/" +   xmlns:cc="http://web.resource.org/cc/" +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" +   xmlns:svg="http://www.w3.org/2000/svg" +   xmlns="http://www.w3.org/2000/svg" +   xmlns:xlink="http://www.w3.org/1999/xlink" +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" +   width="20" +   height="11" +   id="svg1307" +   sodipodi:version="0.32" +   inkscape:version="0.44" +   sodipodi:docbase="/home/ws/projects/muse/muse/trunk/muse/muse/xpm" +   sodipodi:docname="activeon.svg" +   version="1.0"> +  <defs +     id="defs1309"> +    <linearGradient +       id="linearGradient1319"> +      <stop +         style="stop-color:#ffffff;stop-opacity:1;" +         offset="0" +         id="stop1321" /> +      <stop +         style="stop-color:#11ff00;stop-opacity:1;" +         offset="1" +         id="stop1323" /> +    </linearGradient> +    <linearGradient +       id="linearGradient1370"> +      <stop +         style="stop-color:#ff271f;stop-opacity:1;" +         offset="0" +         id="stop1372" /> +      <stop +         style="stop-color:#ff0000;stop-opacity:0;" +         offset="1" +         id="stop1374" /> +    </linearGradient> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient1370" +       id="linearGradient1376" +       x1="-5.6423869" +       y1="-5.6206923" +       x2="8.5200005" +       y2="8.4349537" +       gradientUnits="userSpaceOnUse" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient1370" +       id="linearGradient1315" +       gradientUnits="userSpaceOnUse" +       x1="-1.8582375" +       y1="-0.071628742" +       x2="3.8178029" +       y2="2.5516095" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient1319" +       id="radialGradient1325" +       cx="18.5282" +       cy="0.093760476" +       fx="18.5282" +       fy="0.093760476" +       r="7.8356543" +       gradientTransform="matrix(-0.515305,-0.68232,0.563264,-0.418808,19.85983,21.47543)" +       gradientUnits="userSpaceOnUse" /> +  </defs> +  <sodipodi:namedview +     id="base" +     pagecolor="#ffffff" +     bordercolor="#666666" +     borderopacity="1.0" +     inkscape:pageopacity="0.0" +     inkscape:pageshadow="2" +     inkscape:zoom="39.396621" +     inkscape:cx="14.970261" +     inkscape:cy="4.476661" +     inkscape:current-layer="layer1" +     showgrid="true" +     inkscape:grid-bbox="true" +     inkscape:document-units="px" +     inkscape:window-width="1680" +     inkscape:window-height="996" +     inkscape:window-x="0" +     inkscape:window-y="0" +     width="20px" +     height="11px" /> +  <metadata +     id="metadata1312"> +    <rdf:RDF> +      <cc:Work +         rdf:about=""> +        <dc:format>image/svg+xml</dc:format> +        <dc:type +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> +      </cc:Work> +    </rdf:RDF> +  </metadata> +  <g +     id="layer1" +     inkscape:label="Layer 1" +     inkscape:groupmode="layer"> +    <path +       sodipodi:type="arc" +       style="fill:url(#radialGradient1325);fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" +       id="path1317" +       sodipodi:cx="7.3610373" +       sodipodi:cy="7.3317437" +       sodipodi:rx="7.3356543" +       sodipodi:ry="7.2721972" +       d="M 14.696692 7.3317437 A 7.3356543 7.2721972 0 1 1  0.025382996,7.3317437 A 7.3356543 7.2721972 0 1 1  14.696692 7.3317437 z" +       transform="matrix(1.29863,0,0,0.691167,0.440736,0.432544)" /> +  </g> +</svg> | 
