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> |