From bdc48d562c8a90536ec9bda17d7722f019da40e9 Mon Sep 17 00:00:00 2001 From: Werner Schweer Date: Fri, 10 Nov 2006 11:11:58 +0000 Subject: midi activity leds in midi input strip --- muse/CMakeLists.txt | 11 ++-- muse/ChangeLog | 3 ++ muse/all.h | 1 + muse/muse/driver/alsamidi.cpp | 14 ++--- muse/muse/midiinport.cpp | 20 ++++++- muse/muse/midiinport.h | 2 + muse/muse/mixer/mstrip.cpp | 61 ++++++++++++++------- muse/muse/mixer/mstrip.h | 6 ++- muse/muse/muse.qrc | 2 + muse/muse/route.h | 4 +- muse/muse/xpm/activeoff.svg | 120 ++++++++++++++++++++++++++++++++++++++++++ muse/muse/xpm/activeon.svg | 120 ++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 329 insertions(+), 35 deletions(-) create mode 100644 muse/muse/xpm/activeoff.svg create mode 100644 muse/muse/xpm/activeon.svg 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. diff --git a/muse/all.h b/muse/all.h index e731b9b9..c074560c 100644 --- a/muse/all.h +++ b/muse/all.h @@ -115,6 +115,7 @@ #include #include #include +#include #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 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 @@ xpm/recordOff.svg xpm/greendot.svg xpm/darkgreendot.svg + xpm/activeon.svg + xpm/activeoff.svg xpm/on.svg xpm/off.svg xpm/mono.svg 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 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + -- cgit v1.2.3