@@ -212,7 +212,7 @@ void carla_register_all_plugins() | |||||
void carla_register_native_plugin_3BandEQ(); | void carla_register_native_plugin_3BandEQ(); | ||||
void carla_register_native_plugin_3BandSplitter(); | void carla_register_native_plugin_3BandSplitter(); | ||||
void carla_register_native_plugin_PingPongPan(); | void carla_register_native_plugin_PingPongPan(); | ||||
//void carla_register_native_plugin_Notes(); | |||||
void carla_register_native_plugin_Notes(); | |||||
#ifdef WANT_AUDIOFILE | #ifdef WANT_AUDIOFILE | ||||
// AudioFile | // AudioFile | ||||
@@ -8,7 +8,7 @@ include ../Makefile.mk | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) | |||||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore QtGui) -I../../widgets | |||||
LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui) | LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui) | ||||
ifeq ($(HAVE_AF_DEPS),true) | ifeq ($(HAVE_AF_DEPS),true) | ||||
@@ -38,8 +38,8 @@ OBJS = \ | |||||
OBJS += \ | OBJS += \ | ||||
distrho-3bandeq.cpp.o \ | distrho-3bandeq.cpp.o \ | ||||
distrho-3bandsplitter.cpp.o \ | distrho-3bandsplitter.cpp.o \ | ||||
distrho-pingpongpan.cpp.o | |||||
# distrho-notes.cpp.o | |||||
distrho-pingpongpan.cpp.o \ | |||||
distrho-notes.cpp.o | |||||
# AudioFile | # AudioFile | ||||
ifeq ($(HAVE_AF_DEPS),true) | ifeq ($(HAVE_AF_DEPS),true) | ||||
@@ -30,7 +30,7 @@ START_NAMESPACE_DISTRHO | |||||
static const PluginDescriptor notesDesc = { | static const PluginDescriptor notesDesc = { | ||||
/* category */ ::PLUGIN_CATEGORY_UTILITY, | /* category */ ::PLUGIN_CATEGORY_UTILITY, | ||||
/* hints */ static_cast<PluginHints>(::PLUGIN_IS_RTSAFE | ::PLUGIN_HAS_GUI | ::PLUGIN_USES_SINGLE_THREAD), | |||||
/* hints */ static_cast<PluginHints>(::PLUGIN_IS_RTSAFE|::PLUGIN_HAS_GUI|::PLUGIN_USES_SINGLE_THREAD), | |||||
/* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | /* audioIns */ DISTRHO_PLUGIN_NUM_INPUTS, | ||||
/* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | /* audioOuts */ DISTRHO_PLUGIN_NUM_OUTPUTS, | ||||
/* midiIns */ 0, | /* midiIns */ 0, | ||||
@@ -17,9 +17,6 @@ | |||||
#include "DistrhoUINotes.hpp" | #include "DistrhoUINotes.hpp" | ||||
#include "notes/ParamProgressBar.cpp" | |||||
#include "moc_ParamProgressBar.cpp" | |||||
#include <QtGui/QResizeEvent> | #include <QtGui/QResizeEvent> | ||||
START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
@@ -19,7 +19,7 @@ | |||||
#define __DISTRHO_UI_NOTES_HPP__ | #define __DISTRHO_UI_NOTES_HPP__ | ||||
#include "DistrhoUIQt4.hpp" | #include "DistrhoUIQt4.hpp" | ||||
#include "ParamProgressBar.hpp" | |||||
#include "paramspinbox.hpp" | |||||
#include <QtGui/QGridLayout> | #include <QtGui/QGridLayout> | ||||
#include <QtGui/QLabel> | #include <QtGui/QLabel> | ||||
@@ -1,118 +0,0 @@ | |||||
/* | |||||
* Parameter Progress-Bar, a custom Qt4 widget | |||||
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | |||||
* 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. | |||||
* | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | |||||
#include "ParamProgressBar.hpp" | |||||
#include <QtGui/QMouseEvent> | |||||
ParamProgressBar::ParamProgressBar(QWidget* parent) | |||||
: QProgressBar(parent) | |||||
{ | |||||
m_leftClickDown = false; | |||||
m_minimum = 0.0f; | |||||
m_maximum = 1.0f; | |||||
m_rvalue = 0.0f; | |||||
m_textCall = nullptr; | |||||
setMinimum(0); | |||||
setMaximum(1000); | |||||
setValue(0); | |||||
setFormat("(none)"); | |||||
} | |||||
void ParamProgressBar::set_minimum(float value) | |||||
{ | |||||
m_minimum = value; | |||||
} | |||||
void ParamProgressBar::set_maximum(float value) | |||||
{ | |||||
m_maximum = value; | |||||
} | |||||
void ParamProgressBar::set_value(float value) | |||||
{ | |||||
m_rvalue = value; | |||||
float vper = (value - m_minimum) / (m_maximum - m_minimum); | |||||
setValue(vper * 1000); | |||||
} | |||||
void ParamProgressBar::set_label(QString label) | |||||
{ | |||||
m_label = label; | |||||
if (m_label == "(coef)") | |||||
{ | |||||
m_label = ""; | |||||
m_preLabel = "*"; | |||||
} | |||||
} | |||||
void ParamProgressBar::set_text_call(TextCallback* textCall) | |||||
{ | |||||
m_textCall = textCall; | |||||
} | |||||
void ParamProgressBar::handleMouseEventPos(const QPoint& pos) | |||||
{ | |||||
float xper = float(pos.x()) / width(); | |||||
float value = xper * (m_maximum - m_minimum) + m_minimum; | |||||
if (value < m_minimum) | |||||
value = m_minimum; | |||||
else if (value > m_maximum) | |||||
value = m_maximum; | |||||
emit valueChangedFromBar(value); | |||||
} | |||||
void ParamProgressBar::mousePressEvent(QMouseEvent* event) | |||||
{ | |||||
if (event->button() == Qt::LeftButton) | |||||
{ | |||||
handleMouseEventPos(event->pos()); | |||||
m_leftClickDown = true; | |||||
} | |||||
else | |||||
m_leftClickDown = false; | |||||
QProgressBar::mousePressEvent(event); | |||||
} | |||||
void ParamProgressBar::mouseMoveEvent(QMouseEvent* event) | |||||
{ | |||||
if (m_leftClickDown) | |||||
handleMouseEventPos(event->pos()); | |||||
QProgressBar::mouseMoveEvent(event); | |||||
} | |||||
void ParamProgressBar::mouseReleaseEvent(QMouseEvent* event) | |||||
{ | |||||
m_leftClickDown = false; | |||||
QProgressBar::mouseReleaseEvent(event); | |||||
} | |||||
void ParamProgressBar::paintEvent(QPaintEvent* event) | |||||
{ | |||||
if (m_textCall) | |||||
setFormat(QString("%1 %2 %3").arg(m_preLabel).arg(m_textCall->textCallBack()).arg(m_label)); | |||||
else | |||||
setFormat(QString("%1 %2 %3").arg(m_preLabel).arg(m_rvalue).arg(m_label)); | |||||
QProgressBar::paintEvent(event); | |||||
} |
@@ -1,64 +0,0 @@ | |||||
/* | |||||
* Parameter Progress-Bar, a custom Qt4 widget | |||||
* Copyright (C) 2012 Filipe Coelho <falktx@falktx.com> | |||||
* | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | |||||
* 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. | |||||
* | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | |||||
#ifndef PARAMPROGRESSBAR_H | |||||
#define PARAMPROGRESSBAR_H | |||||
#include <QtGui/QProgressBar> | |||||
class TextCallback | |||||
{ | |||||
public: | |||||
virtual ~TextCallback(); | |||||
virtual const char* textCallBack() = 0; | |||||
}; | |||||
class ParamProgressBar : public QProgressBar | |||||
{ | |||||
Q_OBJECT | |||||
public: | |||||
ParamProgressBar(QWidget* parent); | |||||
void set_minimum(float value); | |||||
void set_maximum(float value); | |||||
void set_value(float value); | |||||
void set_label(QString label); | |||||
void set_text_call(TextCallback* textCall); | |||||
signals: | |||||
void valueChangedFromBar(float value); | |||||
protected: | |||||
void handleMouseEventPos(const QPoint& pos); | |||||
void mousePressEvent(QMouseEvent* event); | |||||
void mouseMoveEvent(QMouseEvent* event); | |||||
void mouseReleaseEvent(QMouseEvent* event); | |||||
void paintEvent(QPaintEvent* event); | |||||
private: | |||||
bool m_leftClickDown; | |||||
float m_minimum; | |||||
float m_maximum; | |||||
float m_rvalue; | |||||
QString m_label; | |||||
QString m_preLabel; | |||||
TextCallback* m_textCall; | |||||
}; | |||||
#endif // #define PARAMPROGRESSBAR_H |
@@ -9,7 +9,7 @@ include ../Makefile.mk | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Common | # Common | ||||
LINK_FLAGS += $(shell pkg-config --libs liblo QtCore QtGui QtXml) | |||||
LINK_FLAGS += $(shell pkg-config --libs gl liblo QtCore QtGui QtXml) | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Engine | # Engine | ||||
@@ -27,9 +27,6 @@ endif | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Plugin | # Plugin | ||||
ifeq ($(HAVE_SUIL),true) | |||||
LINK_FLAGS += $(shell pkg-config --libs suil-0) | |||||
endif | |||||
ifeq ($(HAVE_FLUIDSYNTH),true) | ifeq ($(HAVE_FLUIDSYNTH),true) | ||||
LINK_FLAGS += $(shell pkg-config --libs fluidsynth) | LINK_FLAGS += $(shell pkg-config --libs fluidsynth) | ||||
endif | endif | ||||
@@ -40,12 +37,9 @@ endif | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
# Native | # Native | ||||
LINK_FLAGS += $(shell pkg-config --libs gl) | |||||
ifeq ($(HAVE_AF_DEPS),true) | ifeq ($(HAVE_AF_DEPS),true) | ||||
LINK_FLAGS += $(shell pkg-config --libs libavcodec libavformat sndfile) | LINK_FLAGS += $(shell pkg-config --libs libavcodec libavformat sndfile) | ||||
endif | endif | ||||
ifeq ($(HAVE_ZYN_DEPS),true) | ifeq ($(HAVE_ZYN_DEPS),true) | ||||
LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml) | LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml) | ||||
endif | endif | ||||
@@ -58,6 +52,7 @@ LIBS += ../libcarla_native.a | |||||
LIBS += ../../libs/dgl.a | LIBS += ../../libs/dgl.a | ||||
LIBS += ../../libs/lilv.a | LIBS += ../../libs/lilv.a | ||||
LIBS += ../../libs/rtmempool.a | LIBS += ../../libs/rtmempool.a | ||||
LIBS += ../../libs/widgets.a | |||||
OBJS = \ | OBJS = \ | ||||
CarlaStandalone.cpp.o | CarlaStandalone.cpp.o | ||||
@@ -32,6 +32,11 @@ rtmempool.%.a: | |||||
# -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
widgets.a: | |||||
$(MAKE) -C ../widgets | |||||
# -------------------------------------------------------------- | |||||
jackbridge-win32.dll: | jackbridge-win32.dll: | ||||
$(MAKE) -C jackbridge win32 | $(MAKE) -C jackbridge win32 | ||||
@@ -51,3 +56,4 @@ clean: | |||||
$(MAKE) clean -C distrho/dgl | $(MAKE) clean -C distrho/dgl | ||||
$(MAKE) clean -C lilv | $(MAKE) clean -C lilv | ||||
$(MAKE) clean -C rtmempool | $(MAKE) clean -C rtmempool | ||||
$(MAKE) clean -C ../widgets |
@@ -16,8 +16,9 @@ | |||||
*/ | */ | ||||
// still need qt classes check | // still need qt classes check | ||||
#include "plugin/CarlaPluginInternal.hpp" | |||||
//#include "plugin/CarlaPluginInternal.hpp" | |||||
//#include "plugin/DssiPlugin.cpp" | //#include "plugin/DssiPlugin.cpp" | ||||
#include "../widgets/digitalpeakmeter.cpp" | |||||
#if 0 | #if 0 | ||||
#include "CarlaDefines.hpp" | #include "CarlaDefines.hpp" | ||||
@@ -0,0 +1,49 @@ | |||||
#!/usr/bin/make -f | |||||
# Makefile for widgets # | |||||
# -------------------- # | |||||
# Created by falkTX | |||||
# | |||||
include ../Makefile.mk | |||||
# -------------------------------------------------------------- | |||||
BUILD_CXX_FLAGS += -fvisibility=hidden -fPIC -I. | |||||
BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore) | |||||
LINK_FLAGS += $(shell pkg-config --libs QtCore) | |||||
FILES = \ | |||||
moc_pixmapkeyboard.cpp | |||||
OBJS = \ | |||||
digitalpeakmeter.cpp.o \ | |||||
ledbutton.cpp.o \ | |||||
paramspinbox.cpp.o \ | |||||
pixmapdial.cpp.o \ | |||||
pixmapkeyboard.cpp.o \ | |||||
moc_pixmapkeyboard.cpp.o | |||||
TARGET = ../libs/widgets.a | |||||
# -------------------------------------------------------------- | |||||
all: $(TARGET) | |||||
clean: | |||||
rm -f $(FILES) $(OBJS) $(TARGET) | |||||
debug: | |||||
$(MAKE) DEBUG=true | |||||
# -------------------------------------------------------------- | |||||
$(TARGET): $(FILES) $(OBJS) | |||||
$(AR) rs $@ $(OBJS) | |||||
# -------------------------------------------------------------- | |||||
%.cpp.o: %.cpp | |||||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||||
moc_%.cpp: %.hpp | |||||
$(MOC) $< -o $@ |
@@ -18,31 +18,46 @@ | |||||
#include "digitalpeakmeter.hpp" | #include "digitalpeakmeter.hpp" | ||||
#include <QtGui/QPainter> | #include <QtGui/QPainter> | ||||
#include <QtGui/QPaintEvent> | |||||
DigitalPeakMeter::DigitalPeakMeter(QWidget* parent) | DigitalPeakMeter::DigitalPeakMeter(QWidget* parent) | ||||
: QWidget(parent), | : QWidget(parent), | ||||
m_paintTimer(this) | |||||
fChannels(0), | |||||
fSmoothMultiplier(1), | |||||
fWidth(0), | |||||
fHeight(0), | |||||
fSizeMeter(0), | |||||
fOrientation(VERTICAL), | |||||
fColorBackground("#111111"), | |||||
fGradientMeter(0, 0, 1, 1), | |||||
fColorBase(93, 231, 61), | |||||
fColorBaseAlt(15, 110, 15, 100), | |||||
fChannelsData(nullptr), | |||||
fLastValueData(nullptr), | |||||
fPaintTimer(this) | |||||
{ | { | ||||
m_channels = 0; | |||||
m_orientation = VERTICAL; | |||||
m_smoothMultiplier = 1; | |||||
m_colorBackground = QColor("#111111"); | |||||
m_gradientMeter = QLinearGradient(0, 0, 1, 1); | |||||
setChannels(0); | setChannels(0); | ||||
setColor(GREEN); | setColor(GREEN); | ||||
m_paintTimer.setInterval(60); | |||||
connect(&m_paintTimer, SIGNAL(timeout()), this, SLOT(update())); | |||||
m_paintTimer.start(); | |||||
fPaintTimer.setInterval(60); | |||||
connect(&fPaintTimer, SIGNAL(timeout()), this, SLOT(update())); | |||||
fPaintTimer.start(); | |||||
} | |||||
DigitalPeakMeter::~DigitalPeakMeter() | |||||
{ | |||||
if (fChannelsData != nullptr) | |||||
delete[] fChannelsData; | |||||
if (fLastValueData != nullptr) | |||||
delete[] fLastValueData; | |||||
} | } | ||||
void DigitalPeakMeter::displayMeter(int meter, float level) | void DigitalPeakMeter::displayMeter(int meter, float level) | ||||
{ | { | ||||
Q_ASSERT(meter > 0 && meter <= m_channels); | |||||
Q_ASSERT(fChannelsData != nullptr); | |||||
Q_ASSERT(meter > 0 && meter <= fChannels); | |||||
if (meter <= 0 || meter > m_channels) | |||||
if (meter <= 0 || meter > fChannels || fChannelsData == nullptr) | |||||
return qCritical("DigitalPeakMeter::displayMeter(%i, %f) - invalid meter number", meter, level); | return qCritical("DigitalPeakMeter::displayMeter(%i, %f) - invalid meter number", meter, level); | ||||
if (level < 0.0f) | if (level < 0.0f) | ||||
@@ -50,7 +65,7 @@ void DigitalPeakMeter::displayMeter(int meter, float level) | |||||
else if (level > 1.0f) | else if (level > 1.0f) | ||||
level = 1.0f; | level = 1.0f; | ||||
m_channelsData[meter-1] = level; | |||||
fChannelsData[meter-1] = level; | |||||
} | } | ||||
void DigitalPeakMeter::setChannels(int channels) | void DigitalPeakMeter::setChannels(int channels) | ||||
@@ -60,14 +75,28 @@ void DigitalPeakMeter::setChannels(int channels) | |||||
if (channels < 0) | if (channels < 0) | ||||
return qCritical("DigitalPeakMeter::setChannels(%i) - 'channels' must be a positive integer", channels); | return qCritical("DigitalPeakMeter::setChannels(%i) - 'channels' must be a positive integer", channels); | ||||
m_channels = channels; | |||||
m_channelsData.clear(); | |||||
m_lastValueData.clear(); | |||||
fChannels = channels; | |||||
for (int i=0; i < channels; i++) | |||||
if (fChannelsData != nullptr) | |||||
delete[] fChannelsData; | |||||
if (fLastValueData != nullptr) | |||||
delete[] fLastValueData; | |||||
if (channels > 0) | |||||
{ | { | ||||
m_channelsData.append(0.0f); | |||||
m_lastValueData.append(0.0f); | |||||
fChannelsData = new float[channels]; | |||||
fLastValueData = new float[channels]; | |||||
for (int i=0; i < channels; i++) | |||||
{ | |||||
fChannelsData[i] = 0.0f; | |||||
fLastValueData[i] = 0.0f; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
fChannelsData = nullptr; | |||||
fLastValueData = nullptr; | |||||
} | } | ||||
} | } | ||||
@@ -75,41 +104,41 @@ void DigitalPeakMeter::setColor(Color color) | |||||
{ | { | ||||
if (color == GREEN) | if (color == GREEN) | ||||
{ | { | ||||
m_colorBase = QColor(93, 231, 61); | |||||
m_colorBaseT = QColor(15, 110, 15, 100); | |||||
fColorBase = QColor(93, 231, 61); | |||||
fColorBaseAlt = QColor(15, 110, 15, 100); | |||||
} | } | ||||
else if (color == BLUE) | else if (color == BLUE) | ||||
{ | { | ||||
m_colorBase = QColor(82, 238, 248); | |||||
m_colorBaseT = QColor(15, 15, 110, 100); | |||||
fColorBase = QColor(82, 238, 248); | |||||
fColorBaseAlt = QColor(15, 15, 110, 100); | |||||
} | } | ||||
else | else | ||||
return qCritical("DigitalPeakMeter::setColor(%i) - invalid color", color); | return qCritical("DigitalPeakMeter::setColor(%i) - invalid color", color); | ||||
setOrientation(m_orientation); | |||||
setOrientation(fOrientation); | |||||
} | } | ||||
void DigitalPeakMeter::setOrientation(Orientation orientation) | void DigitalPeakMeter::setOrientation(Orientation orientation) | ||||
{ | { | ||||
m_orientation = orientation; | |||||
fOrientation = orientation; | |||||
if (m_orientation == HORIZONTAL) | |||||
if (fOrientation == HORIZONTAL) | |||||
{ | { | ||||
m_gradientMeter.setColorAt(0.0f, m_colorBase); | |||||
m_gradientMeter.setColorAt(0.2f, m_colorBase); | |||||
m_gradientMeter.setColorAt(0.4f, m_colorBase); | |||||
m_gradientMeter.setColorAt(0.6f, m_colorBase); | |||||
m_gradientMeter.setColorAt(0.8f, Qt::yellow); | |||||
m_gradientMeter.setColorAt(1.0f, Qt::red); | |||||
fGradientMeter.setColorAt(0.0f, fColorBase); | |||||
fGradientMeter.setColorAt(0.2f, fColorBase); | |||||
fGradientMeter.setColorAt(0.4f, fColorBase); | |||||
fGradientMeter.setColorAt(0.6f, fColorBase); | |||||
fGradientMeter.setColorAt(0.8f, Qt::yellow); | |||||
fGradientMeter.setColorAt(1.0f, Qt::red); | |||||
} | } | ||||
else if (m_orientation == VERTICAL) | |||||
else if (fOrientation == VERTICAL) | |||||
{ | { | ||||
m_gradientMeter.setColorAt(0.0f, Qt::red); | |||||
m_gradientMeter.setColorAt(0.2f, Qt::yellow); | |||||
m_gradientMeter.setColorAt(0.4f, m_colorBase); | |||||
m_gradientMeter.setColorAt(0.6f, m_colorBase); | |||||
m_gradientMeter.setColorAt(0.8f, m_colorBase); | |||||
m_gradientMeter.setColorAt(1.0f, m_colorBase); | |||||
fGradientMeter.setColorAt(0.0f, Qt::red); | |||||
fGradientMeter.setColorAt(0.2f, Qt::yellow); | |||||
fGradientMeter.setColorAt(0.4f, fColorBase); | |||||
fGradientMeter.setColorAt(0.6f, fColorBase); | |||||
fGradientMeter.setColorAt(0.8f, fColorBase); | |||||
fGradientMeter.setColorAt(1.0f, fColorBase); | |||||
} | } | ||||
else | else | ||||
return qCritical("DigitalPeakMeter::setOrientation(%i) - invalid orientation", orientation); | return qCritical("DigitalPeakMeter::setOrientation(%i) - invalid orientation", orientation); | ||||
@@ -121,9 +150,9 @@ void DigitalPeakMeter::setRefreshRate(int rate) | |||||
{ | { | ||||
Q_ASSERT(rate > 0); | Q_ASSERT(rate > 0); | ||||
m_paintTimer.stop(); | |||||
m_paintTimer.setInterval(rate); | |||||
m_paintTimer.start(); | |||||
fPaintTimer.stop(); | |||||
fPaintTimer.setInterval(rate); | |||||
fPaintTimer.start(); | |||||
} | } | ||||
void DigitalPeakMeter::setSmoothRelease(int value) | void DigitalPeakMeter::setSmoothRelease(int value) | ||||
@@ -135,7 +164,7 @@ void DigitalPeakMeter::setSmoothRelease(int value) | |||||
else if (value > 5) | else if (value > 5) | ||||
value = 5; | value = 5; | ||||
m_smoothMultiplier = value; | |||||
fSmoothMultiplier = value; | |||||
} | } | ||||
QSize DigitalPeakMeter::minimumSizeHint() const | QSize DigitalPeakMeter::minimumSizeHint() const | ||||
@@ -145,121 +174,122 @@ QSize DigitalPeakMeter::minimumSizeHint() const | |||||
QSize DigitalPeakMeter::sizeHint() const | QSize DigitalPeakMeter::sizeHint() const | ||||
{ | { | ||||
return QSize(m_width, m_height); | |||||
return QSize(fWidth, fHeight); | |||||
} | } | ||||
void DigitalPeakMeter::updateSizes() | void DigitalPeakMeter::updateSizes() | ||||
{ | { | ||||
m_width = width(); | |||||
m_height = height(); | |||||
m_sizeMeter = 0; | |||||
fWidth = width(); | |||||
fHeight = height(); | |||||
fSizeMeter = 0; | |||||
if (m_orientation == HORIZONTAL) | |||||
if (fOrientation == HORIZONTAL) | |||||
{ | { | ||||
m_gradientMeter.setFinalStop(m_width, 0); | |||||
fGradientMeter.setFinalStop(fWidth, 0); | |||||
if (m_channels > 0) | |||||
m_sizeMeter = m_height/m_channels; | |||||
if (fChannels > 0) | |||||
fSizeMeter = fHeight/fChannels; | |||||
} | } | ||||
else if (m_orientation == VERTICAL) | |||||
else if (fOrientation == VERTICAL) | |||||
{ | { | ||||
m_gradientMeter.setFinalStop(0, m_height); | |||||
fGradientMeter.setFinalStop(0, fHeight); | |||||
if (m_channels > 0) | |||||
m_sizeMeter = m_width/m_channels; | |||||
if (fChannels > 0) | |||||
fSizeMeter = fWidth/fChannels; | |||||
} | } | ||||
} | } | ||||
void DigitalPeakMeter::paintEvent(QPaintEvent*) | |||||
void DigitalPeakMeter::paintEvent(QPaintEvent* event) | |||||
{ | { | ||||
QPainter painter(this); | QPainter painter(this); | ||||
event->accept(); | |||||
painter.setPen(Qt::black); | painter.setPen(Qt::black); | ||||
painter.setBrush(Qt::black); | painter.setBrush(Qt::black); | ||||
painter.drawRect(0, 0, m_width, m_height); | |||||
painter.drawRect(0, 0, fWidth, fHeight); | |||||
int meterX = 0; | int meterX = 0; | ||||
painter.setPen(m_colorBackground); | |||||
painter.setBrush(m_gradientMeter); | |||||
painter.setPen(fColorBackground); | |||||
painter.setBrush(fGradientMeter); | |||||
for (int i=0; i < m_channels; i++) | |||||
for (int i=0; i < fChannels; i++) | |||||
{ | { | ||||
float value, level = m_channelsData[i]; | |||||
float value, level = fChannelsData[i]; | |||||
if (level == m_lastValueData[i]) | |||||
if (level == fLastValueData[i]) | |||||
continue; | continue; | ||||
if (m_orientation == HORIZONTAL) | |||||
value = level * m_width; | |||||
else if (m_orientation == VERTICAL) | |||||
value = float(m_height) - (level * m_height); | |||||
if (fOrientation == HORIZONTAL) | |||||
value = level * float(fWidth); | |||||
else if (fOrientation == VERTICAL) | |||||
value = float(fHeight) - (level * float(fHeight)); | |||||
else | else | ||||
value = 0.0f; | value = 0.0f; | ||||
if (value < 0.0f) | if (value < 0.0f) | ||||
value = 0.0f; | value = 0.0f; | ||||
else if (m_smoothMultiplier > 0) | |||||
value = (m_lastValueData[i] * m_smoothMultiplier + value) / (m_smoothMultiplier + 1); | |||||
else if (fSmoothMultiplier > 0) | |||||
value = (fLastValueData[i] * float(fSmoothMultiplier) + value) / float(fSmoothMultiplier + 1); | |||||
if (m_orientation == HORIZONTAL) | |||||
painter.drawRect(0, meterX, value, m_sizeMeter); | |||||
else if (m_orientation == VERTICAL) | |||||
painter.drawRect(meterX, value, m_sizeMeter, m_height); | |||||
if (fOrientation == HORIZONTAL) | |||||
painter.drawRect(0, meterX, int(value), fSizeMeter); | |||||
else if (fOrientation == VERTICAL) | |||||
painter.drawRect(meterX, int(value), fSizeMeter, fHeight); | |||||
meterX += m_sizeMeter; | |||||
m_lastValueData[i] = value; | |||||
meterX += fSizeMeter; | |||||
fLastValueData[i] = value; | |||||
} | } | ||||
painter.setBrush(QColor(0, 0, 0, 0)); | |||||
painter.setBrush(Qt::black); | |||||
if (m_orientation == HORIZONTAL) | |||||
if (fOrientation == HORIZONTAL) | |||||
{ | { | ||||
// Variables | // Variables | ||||
int lsmall = m_width; | |||||
int lfull = m_height - 1; | |||||
float lsmall = fWidth; | |||||
float lfull = fHeight - 1; | |||||
// Base | // Base | ||||
painter.setPen(m_colorBaseT); | |||||
painter.drawLine(lsmall * 0.25f, 2, lsmall * 0.25f, lfull-2); | |||||
painter.drawLine(lsmall * 0.50f, 2, lsmall * 0.50f, lfull-2); | |||||
painter.setPen(fColorBaseAlt); | |||||
painter.drawLine(lsmall * 0.25f, 2, lsmall * 0.25f, lfull-2.0f); | |||||
painter.drawLine(lsmall * 0.50f, 2, lsmall * 0.50f, lfull-2.0f); | |||||
// Yellow | // Yellow | ||||
painter.setPen(QColor(110, 110, 15, 100)); | painter.setPen(QColor(110, 110, 15, 100)); | ||||
painter.drawLine(lsmall * 0.70f, 2, lsmall * 0.70f, lfull-2); | |||||
painter.drawLine(lsmall * 0.83f, 2, lsmall * 0.83f, lfull-2); | |||||
painter.drawLine(lsmall * 0.70f, 2, lsmall * 0.70f, lfull-2.0f); | |||||
painter.drawLine(lsmall * 0.83f, 2, lsmall * 0.83f, lfull-2.0f); | |||||
// Orange | // Orange | ||||
painter.setPen(QColor(180, 110, 15, 100)); | painter.setPen(QColor(180, 110, 15, 100)); | ||||
painter.drawLine(lsmall * 0.90f, 2, lsmall * 0.90f, lfull-2); | |||||
painter.drawLine(lsmall * 0.90f, 2, lsmall * 0.90f, lfull-2.0f); | |||||
// Red | // Red | ||||
painter.setPen(QColor(110, 15, 15, 100)); | painter.setPen(QColor(110, 15, 15, 100)); | ||||
painter.drawLine(lsmall * 0.96f, 2, lsmall * 0.96f, lfull-2); | |||||
painter.drawLine(lsmall * 0.96f, 2, lsmall * 0.96f, lfull-2.0f); | |||||
} | } | ||||
else if (m_orientation == VERTICAL) | |||||
else if (fOrientation == VERTICAL) | |||||
{ | { | ||||
// Variables | // Variables | ||||
int lsmall = m_height; | |||||
int lfull = m_width - 1; | |||||
float lsmall = fHeight; | |||||
float lfull = fWidth - 1; | |||||
// Base | // Base | ||||
painter.setPen(m_colorBaseT); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.25f), lfull-2, lsmall - (lsmall * 0.25f)); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.50f), lfull-2, lsmall - (lsmall * 0.50f)); | |||||
painter.setPen(fColorBaseAlt); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.25f), lfull-2.0f, lsmall - (lsmall * 0.25f)); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.50f), lfull-2.0f, lsmall - (lsmall * 0.50f)); | |||||
// Yellow | // Yellow | ||||
painter.setPen(QColor(110, 110, 15, 100)); | painter.setPen(QColor(110, 110, 15, 100)); | ||||
painter.drawLine(2, lsmall - (lsmall * 0.70f), lfull-2, lsmall - (lsmall * 0.70f)); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.83f), lfull-2, lsmall - (lsmall * 0.83f)); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.70f), lfull-2.0f, lsmall - (lsmall * 0.70f)); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.83f), lfull-2.0f, lsmall - (lsmall * 0.83f)); | |||||
// Orange | // Orange | ||||
painter.setPen(QColor(180, 110, 15, 100)); | painter.setPen(QColor(180, 110, 15, 100)); | ||||
painter.drawLine(2, lsmall - (lsmall * 0.90f), lfull-2, lsmall - (lsmall * 0.90f)); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.90f), lfull-2.0f, lsmall - (lsmall * 0.90f)); | |||||
// Red | // Red | ||||
painter.setPen(QColor(110, 15, 15, 100)); | painter.setPen(QColor(110, 15, 15, 100)); | ||||
painter.drawLine(2, lsmall - (lsmall * 0.96f), lfull-2, lsmall - (lsmall * 0.96f)); | |||||
painter.drawLine(2, lsmall - (lsmall * 0.96f), lfull-2.0f, lsmall - (lsmall * 0.96f)); | |||||
} | } | ||||
} | } | ||||
@@ -35,6 +35,7 @@ public: | |||||
}; | }; | ||||
DigitalPeakMeter(QWidget* parent); | DigitalPeakMeter(QWidget* parent); | ||||
~DigitalPeakMeter(); | |||||
void displayMeter(int meter, float level); | void displayMeter(int meter, float level); | ||||
void setChannels(int channels); | void setChannels(int channels); | ||||
@@ -53,21 +54,21 @@ protected: | |||||
void resizeEvent(QResizeEvent* event); | void resizeEvent(QResizeEvent* event); | ||||
private: | private: | ||||
int m_channels; | |||||
int m_smoothMultiplier; | |||||
int m_width, m_height, m_sizeMeter; | |||||
Orientation m_orientation; | |||||
int fChannels; | |||||
int fSmoothMultiplier; | |||||
int fWidth, fHeight, fSizeMeter; | |||||
Orientation fOrientation; | |||||
QColor m_colorBackground; | |||||
QLinearGradient m_gradientMeter; | |||||
QColor fColorBackground; | |||||
QLinearGradient fGradientMeter; | |||||
QColor m_colorBase; | |||||
QColor m_colorBaseT; | |||||
QColor fColorBase; | |||||
QColor fColorBaseAlt; | |||||
QList<float> m_channelsData; | |||||
QList<float> m_lastValueData; | |||||
float* fChannelsData; | |||||
float* fLastValueData; | |||||
QTimer m_paintTimer; | |||||
QTimer fPaintTimer; | |||||
}; | }; | ||||
#endif // __DIGITALPEAKMETER_HPP__ | #endif // __DIGITALPEAKMETER_HPP__ |
@@ -61,7 +61,7 @@ class DigitalPeakMeter(QWidget): | |||||
elif level > 1.0: | elif level > 1.0: | ||||
level = 1.0 | level = 1.0 | ||||
self.fChannelsData[meter-1] = level | |||||
self.fChannelsData[meter-1] = float(level) | |||||
def setChannels(self, channels): | def setChannels(self, channels): | ||||
if channels < 0: | if channels < 0: | ||||
@@ -77,11 +77,11 @@ class DigitalPeakMeter(QWidget): | |||||
def setColor(self, color): | def setColor(self, color): | ||||
if color == self.GREEN: | if color == self.GREEN: | ||||
self.fColorBase = QColor(93, 231, 61) | |||||
self.fColorBaseT = QColor(15, 110, 15, 100) | |||||
self.fColorBase = QColor(93, 231, 61) | |||||
self.fColorBaseAlt = QColor(15, 110, 15, 100) | |||||
elif color == self.BLUE: | elif color == self.BLUE: | ||||
self.fColorBase = QColor(82, 238, 248) | |||||
self.fColorBaseT = QColor(15, 15, 110, 100) | |||||
self.fColorBase = QColor(82, 238, 248) | |||||
self.fColorBaseAlt = QColor(15, 15, 110, 100) | |||||
else: | else: | ||||
return qCritical("DigitalPeakMeter::setColor(%i) - invalid color" % color) | return qCritical("DigitalPeakMeter::setColor(%i) - invalid color" % color) | ||||
@@ -149,6 +149,7 @@ class DigitalPeakMeter(QWidget): | |||||
def paintEvent(self, event): | def paintEvent(self, event): | ||||
painter = QPainter(self) | painter = QPainter(self) | ||||
event.accept() | |||||
painter.setPen(Qt.black) | painter.setPen(Qt.black) | ||||
painter.setBrush(Qt.black) | painter.setBrush(Qt.black) | ||||
@@ -165,74 +166,72 @@ class DigitalPeakMeter(QWidget): | |||||
continue | continue | ||||
if self.fOrientation == self.HORIZONTAL: | if self.fOrientation == self.HORIZONTAL: | ||||
value = level * self.fWidth | |||||
value = level * float(self.fWidth) | |||||
elif self.fOrientation == self.VERTICAL: | elif self.fOrientation == self.VERTICAL: | ||||
value = float(self.fHeight) - (level * self.fHeight) | |||||
value = float(self.fHeight) - (level * float(self.fHeight)) | |||||
else: | else: | ||||
value = 0.0 | value = 0.0 | ||||
if value < 0.0: | if value < 0.0: | ||||
value = 0.0 | value = 0.0 | ||||
elif self.fSmoothMultiplier > 0: | elif self.fSmoothMultiplier > 0: | ||||
value = (self.fLastValueData[i] * self.fSmoothMultiplier + value) / (self.fSmoothMultiplier + 1) | |||||
value = (self.fLastValueData[i] * self.fSmoothMultiplier + value) / float(self.fSmoothMultiplier + 1) | |||||
if self.fOrientation == self.HORIZONTAL: | if self.fOrientation == self.HORIZONTAL: | ||||
painter.drawRect(0, meterX, value, self.fSizeMeter) | |||||
painter.drawRect(0, meterX, int(value), self.fSizeMeter) | |||||
elif self.fOrientation == self.VERTICAL: | elif self.fOrientation == self.VERTICAL: | ||||
painter.drawRect(meterX, value, self.fSizeMeter, self.fHeight) | |||||
painter.drawRect(meterX, int(value), self.fSizeMeter, self.fHeight) | |||||
meterX += self.fSizeMeter | meterX += self.fSizeMeter | ||||
self.fLastValueData[i] = value | self.fLastValueData[i] = value | ||||
painter.setBrush(QColor(0, 0, 0, 0)) | |||||
painter.setBrush(Qt.black) | |||||
if self.fOrientation == self.HORIZONTAL: | if self.fOrientation == self.HORIZONTAL: | ||||
# Variables | # Variables | ||||
lsmall = self.fWidth | |||||
lfull = self.fHeight - 1 | |||||
lsmall = float(self.fWidth) | |||||
lfull = float(self.fHeight - 1) | |||||
# Base | # Base | ||||
painter.setPen(self.fColorBaseT) | |||||
painter.drawLine(lsmall * 0.25, 2, lsmall * 0.25, lfull-2) | |||||
painter.drawLine(lsmall * 0.50, 2, lsmall * 0.50, lfull-2) | |||||
painter.setPen(self.fColorBaseAlt) | |||||
painter.drawLine(lsmall * 0.25, 2, lsmall * 0.25, lfull-2.0) | |||||
painter.drawLine(lsmall * 0.50, 2, lsmall * 0.50, lfull-2.0) | |||||
# Yellow | # Yellow | ||||
painter.setPen(QColor(110, 110, 15, 100)) | painter.setPen(QColor(110, 110, 15, 100)) | ||||
painter.drawLine(lsmall * 0.70, 2, lsmall * 0.70, lfull-2) | |||||
painter.drawLine(lsmall * 0.83, 2, lsmall * 0.83, lfull-2) | |||||
painter.drawLine(lsmall * 0.70, 2, lsmall * 0.70, lfull-2.0) | |||||
painter.drawLine(lsmall * 0.83, 2, lsmall * 0.83, lfull-2.0) | |||||
# Orange | # Orange | ||||
painter.setPen(QColor(180, 110, 15, 100)) | painter.setPen(QColor(180, 110, 15, 100)) | ||||
painter.drawLine(lsmall * 0.90, 2, lsmall * 0.90, lfull-2) | |||||
painter.drawLine(lsmall * 0.90, 2, lsmall * 0.90, lfull-2.0) | |||||
# Red | # Red | ||||
painter.setPen(QColor(110, 15, 15, 100)) | painter.setPen(QColor(110, 15, 15, 100)) | ||||
painter.drawLine(lsmall * 0.96, 2, lsmall * 0.96, lfull-2) | |||||
painter.drawLine(lsmall * 0.96, 2, lsmall * 0.96, lfull-2.0) | |||||
elif self.fOrientation == self.VERTICAL: | elif self.fOrientation == self.VERTICAL: | ||||
# Variables | # Variables | ||||
lsmall = self.fHeight | |||||
lfull = self.fWidth - 1 | |||||
lsmall = float(self.fHeight) | |||||
lfull = float(self.fWidth - 1) | |||||
# Base | # Base | ||||
painter.setPen(self.fColorBaseT) | |||||
painter.drawLine(2, lsmall - (lsmall * 0.25), lfull-2, lsmall - (lsmall * 0.25)) | |||||
painter.drawLine(2, lsmall - (lsmall * 0.50), lfull-2, lsmall - (lsmall * 0.50)) | |||||
painter.setPen(self.fColorBaseAlt) | |||||
painter.drawLine(2, lsmall - (lsmall * 0.25), lfull-2.0, lsmall - (lsmall * 0.25)) | |||||
painter.drawLine(2, lsmall - (lsmall * 0.50), lfull-2.0, lsmall - (lsmall * 0.50)) | |||||
# Yellow | # Yellow | ||||
painter.setPen(QColor(110, 110, 15, 100)) | painter.setPen(QColor(110, 110, 15, 100)) | ||||
painter.drawLine(2, lsmall - (lsmall * 0.70), lfull-2, lsmall - (lsmall * 0.70)) | |||||
painter.drawLine(2, lsmall - (lsmall * 0.82), lfull-2, lsmall - (lsmall * 0.82)) | |||||
painter.drawLine(2, lsmall - (lsmall * 0.70), lfull-2.0, lsmall - (lsmall * 0.70)) | |||||
painter.drawLine(2, lsmall - (lsmall * 0.82), lfull-2.0, lsmall - (lsmall * 0.82)) | |||||
# Orange | # Orange | ||||
painter.setPen(QColor(180, 110, 15, 100)) | painter.setPen(QColor(180, 110, 15, 100)) | ||||
painter.drawLine(2, lsmall - (lsmall * 0.90), lfull-2, lsmall - (lsmall * 0.90)) | |||||
painter.drawLine(2, lsmall - (lsmall * 0.90), lfull-2.0, lsmall - (lsmall * 0.90)) | |||||
# Red | # Red | ||||
painter.setPen(QColor(110, 15, 15, 100)) | painter.setPen(QColor(110, 15, 15, 100)) | ||||
painter.drawLine(2, lsmall - (lsmall * 0.96), lfull-2, lsmall - (lsmall * 0.96)) | |||||
event.accept() | |||||
painter.drawLine(2, lsmall - (lsmall * 0.96), lfull-2.0, lsmall - (lsmall * 0.96)) | |||||
def resizeEvent(self, event): | def resizeEvent(self, event): | ||||
self.updateSizes() | self.updateSizes() | ||||
@@ -1,21 +1,21 @@ | |||||
/* | /* | ||||
* Parameter Progress-Bar, a custom Qt4 widget | |||||
* Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
* Parameter SpinBox, a custom Qt4 widget | |||||
* Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU General Public License as | |||||
* published by the Free Software Foundation; either version 2 of | |||||
* the License, or any later version. | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | * | ||||
* This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | * GNU General Public License for more details. | ||||
* | * | ||||
* For a full copy of the GNU General Public License see the GPL.txt file | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | */ | ||||
#include "paramspinbox.h" | |||||
#include "paramspinbox.hpp" | |||||
#include <QtGui/QMouseEvent> | #include <QtGui/QMouseEvent> | ||||
@@ -1,29 +1,29 @@ | |||||
/* | /* | ||||
* Parameter Progress-Bar, a custom Qt4 widget | |||||
* Copyright (C) 2012-2013 Filipe Coelho <falktx@falktx.com> | |||||
* Parameter SpinBox, a custom Qt4 widget | |||||
* Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU General Public License as | |||||
* published by the Free Software Foundation; either version 2 of | |||||
* the License, or any later version. | |||||
* This program is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* any later version. | |||||
* | * | ||||
* This program is distributed in the hope that it will be useful, | * This program is distributed in the hope that it will be useful, | ||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | * GNU General Public License for more details. | ||||
* | * | ||||
* For a full copy of the GNU General Public License see the GPL.txt file | |||||
* For a full copy of the GNU General Public License see the COPYING file | |||||
*/ | */ | ||||
#ifndef __PARAMPROGRESSBAR_HPP__ | |||||
#define __PARAMPROGRESSBAR_HPP__ | |||||
#ifndef __PARAMSPINBOX_HPP__ | |||||
#define __PARAMSPINBOX_HPP__ | |||||
#include <QtGui/QProgressBar> | #include <QtGui/QProgressBar> | ||||
class TextCallback | class TextCallback | ||||
{ | { | ||||
public: | public: | ||||
virtual ~TextCallback() {} | |||||
virtual ~TextCallback(); | |||||
virtual const char* textCallBack() = 0; | virtual const char* textCallBack() = 0; | ||||
}; | }; | ||||
@@ -61,4 +61,4 @@ private: | |||||
TextCallback* m_textCall; | TextCallback* m_textCall; | ||||
}; | }; | ||||
#endif // __PARAMPROGRESSBAR_HPP__ | |||||
#endif // #define __PARAMSPINBOX_HPP__ |
@@ -17,141 +17,129 @@ | |||||
#include "pixmapkeyboard.hpp" | #include "pixmapkeyboard.hpp" | ||||
#include <QtCore/QMap> | |||||
#include <QtCore/QTimer> | #include <QtCore/QTimer> | ||||
#include <QtGui/QKeyEvent> | #include <QtGui/QKeyEvent> | ||||
#include <QtGui/QMouseEvent> | #include <QtGui/QMouseEvent> | ||||
#include <QtGui/QPainter> | #include <QtGui/QPainter> | ||||
QMap<int, QRectF> midi_key2rect_map_horizontal; | |||||
QMap<int, QRectF> midi_key2rect_map_vertical; | |||||
QMap<int, int> midi_keyboard2key_map; | |||||
QVector<int> blackNotes; | |||||
static bool pixmapkeyboard_initiated = false; | |||||
void pixmapkeyboard_init() | |||||
{ | |||||
if (pixmapkeyboard_initiated) | |||||
return; | |||||
pixmapkeyboard_initiated = true; | |||||
// midi_key2rect_map_horizontal ------ | |||||
midi_key2rect_map_horizontal[0] = QRectF(0, 0, 18, 64); // C | |||||
midi_key2rect_map_horizontal[1] = QRectF(13, 0, 11, 42); // C# | |||||
midi_key2rect_map_horizontal[2] = QRectF(18, 0, 25, 64); // D | |||||
midi_key2rect_map_horizontal[3] = QRectF(37, 0, 11, 42); // D# | |||||
midi_key2rect_map_horizontal[4] = QRectF(42, 0, 18, 64); // E | |||||
midi_key2rect_map_horizontal[5] = QRectF(60, 0, 18, 64); // F | |||||
midi_key2rect_map_horizontal[6] = QRectF(73, 0, 11, 42); // F# | |||||
midi_key2rect_map_horizontal[7] = QRectF(78, 0, 25, 64); // G | |||||
midi_key2rect_map_horizontal[8] = QRectF(97, 0, 11, 42); // G# | |||||
midi_key2rect_map_horizontal[9] = QRectF(102, 0, 25, 64); // A | |||||
midi_key2rect_map_horizontal[10] = QRectF(121, 0, 11, 42); // A# | |||||
midi_key2rect_map_horizontal[11] = QRectF(126, 0, 18, 64); // B | |||||
// midi_key2rect_map_vertical -------- | |||||
midi_key2rect_map_vertical[11] = QRectF(0, 0, 64, 18); // B | |||||
midi_key2rect_map_vertical[10] = QRectF(0, 14, 42, 7); // A# | |||||
midi_key2rect_map_vertical[9] = QRectF(0, 18, 64, 24); // A | |||||
midi_key2rect_map_vertical[8] = QRectF(0, 38, 42, 7); // G# | |||||
midi_key2rect_map_vertical[7] = QRectF(0, 42, 64, 24); // G | |||||
midi_key2rect_map_vertical[6] = QRectF(0, 62, 42, 7); // F# | |||||
midi_key2rect_map_vertical[5] = QRectF(0, 66, 64, 18); // F | |||||
midi_key2rect_map_vertical[4] = QRectF(0, 84, 64, 18); // E | |||||
midi_key2rect_map_vertical[3] = QRectF(0, 98, 42, 7); // D# | |||||
midi_key2rect_map_vertical[2] = QRectF(0, 102, 64, 24); // D | |||||
midi_key2rect_map_vertical[1] = QRectF(0, 122, 42, 7); // C# | |||||
midi_key2rect_map_vertical[0] = QRectF(0, 126, 64, 18); // C | |||||
// midi_keyboard2key_map ------------- | |||||
static std::map<int, QRectF> kMidiKey2RectMapHorizontal = { | |||||
{0, QRectF(0, 0, 18, 64)}, // C | |||||
{1, QRectF(13, 0, 11, 42)}, // C# | |||||
{2, QRectF(18, 0, 25, 64)}, // D | |||||
{3, QRectF(37, 0, 11, 42)}, // D# | |||||
{4, QRectF(42, 0, 18, 64)}, // E | |||||
{5, QRectF(60, 0, 18, 64)}, // F | |||||
{6, QRectF(73, 0, 11, 42)}, // F# | |||||
{7, QRectF(78, 0, 25, 64)}, // G | |||||
{8, QRectF(97, 0, 11, 42)}, // G# | |||||
{9, QRectF(102, 0, 25, 64)}, // A | |||||
{10, QRectF(121, 0, 11, 42)}, // A# | |||||
{11, QRectF(126, 0, 18, 64)} // B | |||||
}; | |||||
static std::map<int, QRectF> kMidiKey2RectMapVertical = { | |||||
{11, QRectF(0, 0, 64, 18)}, // B | |||||
{10, QRectF(0, 14, 42, 7)}, // A# | |||||
{9, QRectF(0, 18, 64, 24)}, // A | |||||
{8, QRectF(0, 38, 42, 7)}, // G# | |||||
{7, QRectF(0, 42, 64, 24)}, // G | |||||
{6, QRectF(0, 62, 42, 7)}, // F# | |||||
{5, QRectF(0, 66, 64, 18)}, // F | |||||
{4, QRectF(0, 84, 64, 18)}, // E | |||||
{3, QRectF(0, 98, 42, 7)}, // D# | |||||
{2, QRectF(0, 102, 64, 24)}, // D | |||||
{1, QRectF(0, 122, 42, 7)}, // C# | |||||
{0, QRectF(0, 126, 64, 18)} // C | |||||
}; | |||||
static const std::map<int, int> kMidiKeyboard2KeyMap = { | |||||
// 3th octave | // 3th octave | ||||
midi_keyboard2key_map[Qt::Key_Z] = 48; | |||||
midi_keyboard2key_map[Qt::Key_S] = 49; | |||||
midi_keyboard2key_map[Qt::Key_X] = 50; | |||||
midi_keyboard2key_map[Qt::Key_D] = 51; | |||||
midi_keyboard2key_map[Qt::Key_C] = 52; | |||||
midi_keyboard2key_map[Qt::Key_V] = 53; | |||||
midi_keyboard2key_map[Qt::Key_G] = 54; | |||||
midi_keyboard2key_map[Qt::Key_B] = 55; | |||||
midi_keyboard2key_map[Qt::Key_H] = 56; | |||||
midi_keyboard2key_map[Qt::Key_N] = 57; | |||||
midi_keyboard2key_map[Qt::Key_J] = 58; | |||||
midi_keyboard2key_map[Qt::Key_M] = 59; | |||||
{Qt::Key_Z, 48}, | |||||
{Qt::Key_S, 49}, | |||||
{Qt::Key_X, 50}, | |||||
{Qt::Key_D, 51}, | |||||
{Qt::Key_C, 52}, | |||||
{Qt::Key_V, 53}, | |||||
{Qt::Key_G, 54}, | |||||
{Qt::Key_B, 55}, | |||||
{Qt::Key_H, 56}, | |||||
{Qt::Key_N, 57}, | |||||
{Qt::Key_J, 58}, | |||||
{Qt::Key_M, 59}, | |||||
// 4th octave | // 4th octave | ||||
midi_keyboard2key_map[Qt::Key_Q] = 60; | |||||
midi_keyboard2key_map[Qt::Key_2] = 61; | |||||
midi_keyboard2key_map[Qt::Key_W] = 62; | |||||
midi_keyboard2key_map[Qt::Key_3] = 63; | |||||
midi_keyboard2key_map[Qt::Key_E] = 64; | |||||
midi_keyboard2key_map[Qt::Key_R] = 65; | |||||
midi_keyboard2key_map[Qt::Key_5] = 66; | |||||
midi_keyboard2key_map[Qt::Key_T] = 67; | |||||
midi_keyboard2key_map[Qt::Key_6] = 68; | |||||
midi_keyboard2key_map[Qt::Key_Y] = 69; | |||||
midi_keyboard2key_map[Qt::Key_7] = 70; | |||||
midi_keyboard2key_map[Qt::Key_U] = 71; | |||||
blackNotes << 1; | |||||
blackNotes << 3; | |||||
blackNotes << 6; | |||||
blackNotes << 8; | |||||
blackNotes << 10; | |||||
} | |||||
{Qt::Key_Q, 60}, | |||||
{Qt::Key_2, 61}, | |||||
{Qt::Key_W, 62}, | |||||
{Qt::Key_3, 63}, | |||||
{Qt::Key_E, 64}, | |||||
{Qt::Key_R, 65}, | |||||
{Qt::Key_5, 66}, | |||||
{Qt::Key_T, 67}, | |||||
{Qt::Key_6, 68}, | |||||
{Qt::Key_Y, 69}, | |||||
{Qt::Key_7, 70}, | |||||
{Qt::Key_U, 71} | |||||
}; | |||||
static const QVector<int> kBlackNotes = {1, 3, 6, 8, 10}; | |||||
PixmapKeyboard::PixmapKeyboard(QWidget* parent) | PixmapKeyboard::PixmapKeyboard(QWidget* parent) | ||||
: QWidget(parent), | : QWidget(parent), | ||||
m_font("Monospace", 8, QFont::Normal) | |||||
fPixmap(""), | |||||
fPixmapMode(HORIZONTAL), | |||||
fColorStr("orange"), | |||||
fFont("Monospace", 8, QFont::Normal), | |||||
fOctaves(6), | |||||
fLastMouseNote(-1), | |||||
fWidth(0), | |||||
fHeight(0), | |||||
fNeedsUpdate(false), | |||||
fMidiMap(kMidiKey2RectMapHorizontal) | |||||
{ | { | ||||
pixmapkeyboard_init(); | |||||
m_octaves = 6; | |||||
m_lastMouseNote = -1; | |||||
m_needsUpdate = false; | |||||
setCursor(Qt::PointingHandCursor); | setCursor(Qt::PointingHandCursor); | ||||
setMode(HORIZONTAL); | setMode(HORIZONTAL); | ||||
} | } | ||||
void PixmapKeyboard::allNotesOff() | void PixmapKeyboard::allNotesOff() | ||||
{ | { | ||||
m_enabledKeys.clear(); | |||||
m_needsUpdate = true; | |||||
QTimer::singleShot(0, this, SLOT(updateOnce())); | |||||
fEnabledKeys.clear(); | |||||
fNeedsUpdate = true; | |||||
emit notesOff(); | emit notesOff(); | ||||
QTimer::singleShot(0, this, SLOT(updateOnce())); | |||||
} | } | ||||
void PixmapKeyboard::sendNoteOn(int note, bool sendSignal) | void PixmapKeyboard::sendNoteOn(int note, bool sendSignal) | ||||
{ | { | ||||
if (0 <= note && note <= 127 && ! m_enabledKeys.contains(note)) | |||||
if (0 <= note && note <= 127 && ! fEnabledKeys.contains(note)) | |||||
{ | { | ||||
m_enabledKeys.append(note); | |||||
fEnabledKeys.append(note); | |||||
if (sendSignal) | if (sendSignal) | ||||
emit noteOn(note); | emit noteOn(note); | ||||
m_needsUpdate = true; | |||||
fNeedsUpdate = true; | |||||
QTimer::singleShot(0, this, SLOT(updateOnce())); | QTimer::singleShot(0, this, SLOT(updateOnce())); | ||||
} | } | ||||
if (m_enabledKeys.count() == 1) | |||||
if (fEnabledKeys.count() == 1) | |||||
emit notesOn(); | emit notesOn(); | ||||
} | } | ||||
void PixmapKeyboard::sendNoteOff(int note, bool sendSignal) | void PixmapKeyboard::sendNoteOff(int note, bool sendSignal) | ||||
{ | { | ||||
if (note >= 0 && note <= 127 && m_enabledKeys.contains(note)) | |||||
if (note >= 0 && note <= 127 && fEnabledKeys.contains(note)) | |||||
{ | { | ||||
m_enabledKeys.removeOne(note); | |||||
fEnabledKeys.removeOne(note); | |||||
if (sendSignal) | if (sendSignal) | ||||
emit noteOff(note); | emit noteOff(note); | ||||
m_needsUpdate = true; | |||||
fNeedsUpdate = true; | |||||
QTimer::singleShot(0, this, SLOT(updateOnce())); | QTimer::singleShot(0, this, SLOT(updateOnce())); | ||||
} | } | ||||
if (m_enabledKeys.count() == 0) | |||||
if (fEnabledKeys.count() == 0) | |||||
emit notesOff(); | emit notesOff(); | ||||
} | } | ||||
@@ -159,11 +147,11 @@ void PixmapKeyboard::setMode(Orientation mode, Color color) | |||||
{ | { | ||||
if (color == COLOR_CLASSIC) | if (color == COLOR_CLASSIC) | ||||
{ | { | ||||
m_colorStr = "classic"; | |||||
fColorStr = "classic"; | |||||
} | } | ||||
else if (color == COLOR_ORANGE) | else if (color == COLOR_ORANGE) | ||||
{ | { | ||||
m_colorStr = "orange"; | |||||
fColorStr = "orange"; | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -173,19 +161,19 @@ void PixmapKeyboard::setMode(Orientation mode, Color color) | |||||
if (mode == HORIZONTAL) | if (mode == HORIZONTAL) | ||||
{ | { | ||||
m_midi_map = &midi_key2rect_map_horizontal; | |||||
m_pixmap.load(QString(":/bitmaps/kbd_h_%1.png").arg(m_colorStr)); | |||||
m_pixmap_mode = HORIZONTAL; | |||||
p_width = m_pixmap.width(); | |||||
p_height = m_pixmap.height() / 2; | |||||
fMidiMap = kMidiKey2RectMapHorizontal; | |||||
fPixmap.load(QString(":/bitmaps/kbd_h_%1.png").arg(fColorStr)); | |||||
fPixmapMode = HORIZONTAL; | |||||
fWidth = fPixmap.width(); | |||||
fHeight = fPixmap.height() / 2; | |||||
} | } | ||||
else if (mode == VERTICAL) | else if (mode == VERTICAL) | ||||
{ | { | ||||
m_midi_map = &midi_key2rect_map_vertical; | |||||
m_pixmap.load(QString(":/bitmaps/kbd_v_%1.png").arg(m_colorStr)); | |||||
m_pixmap_mode = VERTICAL; | |||||
p_width = m_pixmap.width() / 2; | |||||
p_height = m_pixmap.height(); | |||||
fMidiMap = kMidiKey2RectMapVertical; | |||||
fPixmap.load(QString(":/bitmaps/kbd_v_%1.png").arg(fColorStr)); | |||||
fPixmapMode = VERTICAL; | |||||
fWidth = fPixmap.width() / 2; | |||||
fHeight = fPixmap.height(); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -193,28 +181,29 @@ void PixmapKeyboard::setMode(Orientation mode, Color color) | |||||
return setMode(HORIZONTAL); | return setMode(HORIZONTAL); | ||||
} | } | ||||
setOctaves(m_octaves); | |||||
setOctaves(fOctaves); | |||||
} | } | ||||
void PixmapKeyboard::setOctaves(int octaves) | void PixmapKeyboard::setOctaves(int octaves) | ||||
{ | { | ||||
Q_ASSERT(octaves >= 1 && octaves <= 6); | |||||
Q_ASSERT(octaves >= 1 && octaves <= 8); | |||||
if (octaves < 1) | if (octaves < 1) | ||||
octaves = 1; | octaves = 1; | ||||
else if (octaves > 6) | |||||
octaves = 6; | |||||
m_octaves = octaves; | |||||
else if (octaves > 8) | |||||
octaves = 8; | |||||
if (m_pixmap_mode == HORIZONTAL) | |||||
fOctaves = octaves; | |||||
if (fPixmapMode == HORIZONTAL) | |||||
{ | { | ||||
setMinimumSize(p_width * m_octaves, p_height); | |||||
setMaximumSize(p_width * m_octaves, p_height); | |||||
setMinimumSize(fWidth * fOctaves, fHeight); | |||||
setMaximumSize(fWidth * fOctaves, fHeight); | |||||
} | } | ||||
else if (m_pixmap_mode == VERTICAL) | |||||
else if (fPixmapMode == VERTICAL) | |||||
{ | { | ||||
setMinimumSize(p_width, p_height * m_octaves); | |||||
setMaximumSize(p_width, p_height * m_octaves); | |||||
setMinimumSize(fWidth, fHeight * fOctaves); | |||||
setMaximumSize(fWidth, fHeight * fOctaves); | |||||
} | } | ||||
update(); | update(); | ||||
@@ -222,53 +211,54 @@ void PixmapKeyboard::setOctaves(int octaves) | |||||
void PixmapKeyboard::handleMousePos(const QPoint& pos) | void PixmapKeyboard::handleMousePos(const QPoint& pos) | ||||
{ | { | ||||
int note, octave; | |||||
QPointF n_pos; | |||||
int note; | |||||
int octave; | |||||
QPointF keyPos; | |||||
if (m_pixmap_mode == HORIZONTAL) | |||||
if (fPixmapMode == HORIZONTAL) | |||||
{ | { | ||||
if (pos.x() < 0 or pos.x() > m_octaves * 144) | |||||
if (pos.x() < 0 or pos.x() > fOctaves * 144) | |||||
return; | return; | ||||
int posX = pos.x() - 1; | int posX = pos.x() - 1; | ||||
octave = posX / p_width; | |||||
n_pos = QPointF(posX % p_width, pos.y()); | |||||
octave = posX / fWidth; | |||||
keyPos = QPointF(posX % fWidth, pos.y()); | |||||
} | } | ||||
else if (m_pixmap_mode == VERTICAL) | |||||
else if (fPixmapMode == VERTICAL) | |||||
{ | { | ||||
if (pos.y() < 0 or pos.y() > m_octaves * 144) | |||||
if (pos.y() < 0 or pos.y() > fOctaves * 144) | |||||
return; | return; | ||||
int posY = pos.y() - 1; | int posY = pos.y() - 1; | ||||
octave = m_octaves - posY / p_height; | |||||
n_pos = QPointF(pos.x(), posY % p_height); | |||||
octave = fOctaves - posY / fHeight; | |||||
keyPos = QPointF(pos.x(), posY % fHeight); | |||||
} | } | ||||
else | else | ||||
return; | return; | ||||
octave += 3; | octave += 3; | ||||
if ((*m_midi_map)[1].contains(n_pos)) // C# | |||||
if (fMidiMap[1].contains(keyPos)) // C# | |||||
note = 1; | note = 1; | ||||
else if ((*m_midi_map)[3].contains(n_pos)) // D# | |||||
else if (fMidiMap[3].contains(keyPos)) // D# | |||||
note = 3; | note = 3; | ||||
else if ((*m_midi_map)[6].contains(n_pos)) // F# | |||||
else if (fMidiMap[6].contains(keyPos)) // F# | |||||
note = 6; | note = 6; | ||||
else if ((*m_midi_map)[8].contains(n_pos)) // G# | |||||
else if (fMidiMap[8].contains(keyPos)) // G# | |||||
note = 8; | note = 8; | ||||
else if ((*m_midi_map)[10].contains(n_pos))// A# | |||||
else if (fMidiMap[10].contains(keyPos))// A# | |||||
note = 10; | note = 10; | ||||
else if ((*m_midi_map)[0].contains(n_pos)) // C | |||||
else if (fMidiMap[0].contains(keyPos)) // C | |||||
note = 0; | note = 0; | ||||
else if ((*m_midi_map)[2].contains(n_pos)) // D | |||||
else if (fMidiMap[2].contains(keyPos)) // D | |||||
note = 2; | note = 2; | ||||
else if ((*m_midi_map)[4].contains(n_pos)) // E | |||||
else if (fMidiMap[4].contains(keyPos)) // E | |||||
note = 4; | note = 4; | ||||
else if ((*m_midi_map)[5].contains(n_pos)) // F | |||||
else if (fMidiMap[5].contains(keyPos)) // F | |||||
note = 5; | note = 5; | ||||
else if ((*m_midi_map)[7].contains(n_pos)) // G | |||||
else if (fMidiMap[7].contains(keyPos)) // G | |||||
note = 7; | note = 7; | ||||
else if ((*m_midi_map)[9].contains(n_pos)) // A | |||||
else if (fMidiMap[9].contains(keyPos)) // A | |||||
note = 9; | note = 9; | ||||
else if ((*m_midi_map)[11].contains(n_pos))// B | |||||
else if (fMidiMap[11].contains(keyPos))// B | |||||
note = 11; | note = 11; | ||||
else | else | ||||
note = -1; | note = -1; | ||||
@@ -276,16 +266,17 @@ void PixmapKeyboard::handleMousePos(const QPoint& pos) | |||||
if (note != -1) | if (note != -1) | ||||
{ | { | ||||
note += octave * 12; | note += octave * 12; | ||||
if (m_lastMouseNote != note) | |||||
if (fLastMouseNote != note) | |||||
{ | { | ||||
sendNoteOff(m_lastMouseNote); | |||||
sendNoteOff(fLastMouseNote); | |||||
sendNoteOn(note); | sendNoteOn(note); | ||||
} | } | ||||
} | } | ||||
else | |||||
sendNoteOff(m_lastMouseNote); | |||||
else if (fLastMouseNote != -1) | |||||
sendNoteOff(fLastMouseNote); | |||||
m_lastMouseNote = note; | |||||
fLastMouseNote = note; | |||||
} | } | ||||
void PixmapKeyboard::keyPressEvent(QKeyEvent* event) | void PixmapKeyboard::keyPressEvent(QKeyEvent* event) | ||||
@@ -293,8 +284,9 @@ void PixmapKeyboard::keyPressEvent(QKeyEvent* event) | |||||
if (! event->isAutoRepeat()) | if (! event->isAutoRepeat()) | ||||
{ | { | ||||
int qKey = event->key(); | int qKey = event->key(); | ||||
if (midi_keyboard2key_map.keys().contains(qKey)) | |||||
sendNoteOn(midi_keyboard2key_map[qKey]); | |||||
std::map<int, int>::const_iterator it = kMidiKeyboard2KeyMap.find(qKey); | |||||
if (it != kMidiKeyboard2KeyMap.end()) | |||||
sendNoteOn(it->second); | |||||
} | } | ||||
QWidget::keyPressEvent(event); | QWidget::keyPressEvent(event); | ||||
} | } | ||||
@@ -304,15 +296,16 @@ void PixmapKeyboard::keyReleaseEvent(QKeyEvent* event) | |||||
if (! event->isAutoRepeat()) | if (! event->isAutoRepeat()) | ||||
{ | { | ||||
int qKey = event->key(); | int qKey = event->key(); | ||||
if (midi_keyboard2key_map.keys().contains(qKey)) | |||||
sendNoteOff(midi_keyboard2key_map[qKey]); | |||||
std::map<int, int>::const_iterator it = kMidiKeyboard2KeyMap.find(qKey); | |||||
if (it != kMidiKeyboard2KeyMap.end()) | |||||
sendNoteOff(it->second); | |||||
} | } | ||||
QWidget::keyReleaseEvent(event); | QWidget::keyReleaseEvent(event); | ||||
} | } | ||||
void PixmapKeyboard::mousePressEvent(QMouseEvent* event) | void PixmapKeyboard::mousePressEvent(QMouseEvent* event) | ||||
{ | { | ||||
m_lastMouseNote = -1; | |||||
fLastMouseNote = -1; | |||||
handleMousePos(event->pos()); | handleMousePos(event->pos()); | ||||
setFocus(); | setFocus(); | ||||
QWidget::mousePressEvent(event); | QWidget::mousePressEvent(event); | ||||
@@ -326,34 +319,35 @@ void PixmapKeyboard::mouseMoveEvent(QMouseEvent* event) | |||||
void PixmapKeyboard::mouseReleaseEvent(QMouseEvent* event) | void PixmapKeyboard::mouseReleaseEvent(QMouseEvent* event) | ||||
{ | { | ||||
if (m_lastMouseNote != -1) | |||||
if (fLastMouseNote != -1) | |||||
{ | { | ||||
sendNoteOff(m_lastMouseNote); | |||||
m_lastMouseNote = -1; | |||||
sendNoteOff(fLastMouseNote); | |||||
fLastMouseNote = -1; | |||||
} | } | ||||
QWidget::mouseReleaseEvent(event); | QWidget::mouseReleaseEvent(event); | ||||
} | } | ||||
void PixmapKeyboard::paintEvent(QPaintEvent*) | |||||
void PixmapKeyboard::paintEvent(QPaintEvent* event) | |||||
{ | { | ||||
QPainter painter(this); | QPainter painter(this); | ||||
event->accept(); | |||||
// ------------------------------------------------------------- | // ------------------------------------------------------------- | ||||
// Paint clean keys (as background) | // Paint clean keys (as background) | ||||
for (int octave=0; octave < m_octaves; octave++) | |||||
for (int octave=0; octave < fOctaves; octave++) | |||||
{ | { | ||||
QRectF target; | QRectF target; | ||||
if (m_pixmap_mode == HORIZONTAL) | |||||
target = QRectF(p_width * octave, 0, p_width, p_height); | |||||
else if (m_pixmap_mode == VERTICAL) | |||||
target = QRectF(0, p_height * octave, p_width, p_height); | |||||
if (fPixmapMode == HORIZONTAL) | |||||
target = QRectF(fWidth * octave, 0, fWidth, fHeight); | |||||
else if (fPixmapMode == VERTICAL) | |||||
target = QRectF(0, fHeight * octave, fWidth, fHeight); | |||||
else | else | ||||
return; | return; | ||||
QRectF source = QRectF(0, 0, p_width, p_height); | |||||
painter.drawPixmap(target, m_pixmap, source); | |||||
QRectF source = QRectF(0, 0, fWidth, fHeight); | |||||
painter.drawPixmap(target, fPixmap, source); | |||||
} | } | ||||
// ------------------------------------------------------------- | // ------------------------------------------------------------- | ||||
@@ -361,10 +355,10 @@ void PixmapKeyboard::paintEvent(QPaintEvent*) | |||||
bool paintedWhite = false; | bool paintedWhite = false; | ||||
for (int i=0; i < m_enabledKeys.count(); i++) | |||||
for (int i=0, count=fEnabledKeys.count(); i < count; i++) | |||||
{ | { | ||||
int octave, note = m_enabledKeys[i]; | |||||
QRectF pos = _getRectFromMidiNote(note); | |||||
int octave, note = fEnabledKeys[i]; | |||||
const QRectF& pos(_getRectFromMidiNote(note)); | |||||
if (_isNoteBlack(note)) | if (_isNoteBlack(note)) | ||||
continue; | continue; | ||||
@@ -384,30 +378,34 @@ void PixmapKeyboard::paintEvent(QPaintEvent*) | |||||
octave = 4; | octave = 4; | ||||
else if (note < 108) | else if (note < 108) | ||||
octave = 5; | octave = 5; | ||||
else if (note < 120) | |||||
octave = 6; | |||||
else if (note < 132) | |||||
octave = 7; | |||||
else | else | ||||
// cannot paint this note either | // cannot paint this note either | ||||
continue; | continue; | ||||
if (m_pixmap_mode == VERTICAL) | |||||
octave = m_octaves - octave - 1; | |||||
if (fPixmapMode == VERTICAL) | |||||
octave = fOctaves - octave - 1; | |||||
QRectF target, source; | QRectF target, source; | ||||
if (m_pixmap_mode == HORIZONTAL) | |||||
if (fPixmapMode == HORIZONTAL) | |||||
{ | { | ||||
target = QRectF(pos.x() + (p_width * octave), 0, pos.width(), pos.height()); | |||||
source = QRectF(pos.x(), p_height, pos.width(), pos.height()); | |||||
target = QRectF(pos.x() + (fWidth * octave), 0, pos.width(), pos.height()); | |||||
source = QRectF(pos.x(), fHeight, pos.width(), pos.height()); | |||||
} | } | ||||
else if (m_pixmap_mode == VERTICAL) | |||||
else if (fPixmapMode == VERTICAL) | |||||
{ | { | ||||
target = QRectF(pos.x(), pos.y() + (p_height * octave), pos.width(), pos.height()); | |||||
source = QRectF(p_width, pos.y(), pos.width(), pos.height()); | |||||
target = QRectF(pos.x(), pos.y() + (fHeight * octave), pos.width(), pos.height()); | |||||
source = QRectF(fWidth, pos.y(), pos.width(), pos.height()); | |||||
} | } | ||||
else | else | ||||
return; | return; | ||||
paintedWhite = true; | paintedWhite = true; | ||||
painter.drawPixmap(target, m_pixmap, source); | |||||
painter.drawPixmap(target, fPixmap, source); | |||||
} | } | ||||
// ------------------------------------------------------------- | // ------------------------------------------------------------- | ||||
@@ -415,26 +413,27 @@ void PixmapKeyboard::paintEvent(QPaintEvent*) | |||||
if (paintedWhite) | if (paintedWhite) | ||||
{ | { | ||||
for (int octave=0; octave < m_octaves; octave++) | |||||
for (int octave=0; octave < fOctaves; octave++) | |||||
{ | { | ||||
foreach (int note, blackNotes) | |||||
foreach (int note, kBlackNotes) | |||||
{ | { | ||||
QRectF target, source; | QRectF target, source; | ||||
QRectF pos = _getRectFromMidiNote(note); | |||||
if (m_pixmap_mode == HORIZONTAL) | |||||
const QRectF& pos(_getRectFromMidiNote(note)); | |||||
if (fPixmapMode == HORIZONTAL) | |||||
{ | { | ||||
target = QRectF(pos.x() + (p_width * octave), 0, pos.width(), pos.height()); | |||||
target = QRectF(pos.x() + (fWidth * octave), 0, pos.width(), pos.height()); | |||||
source = QRectF(pos.x(), 0, pos.width(), pos.height()); | source = QRectF(pos.x(), 0, pos.width(), pos.height()); | ||||
} | } | ||||
else if (m_pixmap_mode == VERTICAL) | |||||
else if (fPixmapMode == VERTICAL) | |||||
{ | { | ||||
target = QRectF(pos.x(), pos.y() + (p_height * octave), pos.width(), pos.height()); | |||||
target = QRectF(pos.x(), pos.y() + (fHeight * octave), pos.width(), pos.height()); | |||||
source = QRectF(0, pos.y(), pos.width(), pos.height()); | source = QRectF(0, pos.y(), pos.width(), pos.height()); | ||||
} | } | ||||
else | else | ||||
return; | return; | ||||
painter.drawPixmap(target, m_pixmap, source); | |||||
painter.drawPixmap(target, fPixmap, source); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -442,10 +441,10 @@ void PixmapKeyboard::paintEvent(QPaintEvent*) | |||||
// ------------------------------------------------------------- | // ------------------------------------------------------------- | ||||
// Paint (black) pressed keys | // Paint (black) pressed keys | ||||
for (int i=0; i < m_enabledKeys.count(); i++) | |||||
for (int i=0, count=fEnabledKeys.count(); i < count; i++) | |||||
{ | { | ||||
int octave, note = m_enabledKeys[i]; | |||||
QRectF pos = _getRectFromMidiNote(note); | |||||
int octave, note = fEnabledKeys[i]; | |||||
const QRectF& pos(_getRectFromMidiNote(note)); | |||||
if (! _isNoteBlack(note)) | if (! _isNoteBlack(note)) | ||||
continue; | continue; | ||||
@@ -465,60 +464,64 @@ void PixmapKeyboard::paintEvent(QPaintEvent*) | |||||
octave = 4; | octave = 4; | ||||
else if (note < 108) | else if (note < 108) | ||||
octave = 5; | octave = 5; | ||||
else if (note < 120) | |||||
octave = 6; | |||||
else if (note < 132) | |||||
octave = 7; | |||||
else | else | ||||
// cannot paint this note either | // cannot paint this note either | ||||
continue; | continue; | ||||
if (m_pixmap_mode == VERTICAL) | |||||
octave = m_octaves - octave - 1; | |||||
if (fPixmapMode == VERTICAL) | |||||
octave = fOctaves - octave - 1; | |||||
QRectF target, source; | QRectF target, source; | ||||
if (m_pixmap_mode == HORIZONTAL) | |||||
if (fPixmapMode == HORIZONTAL) | |||||
{ | { | ||||
target = QRectF(pos.x() + (p_width * octave), 0, pos.width(), pos.height()); | |||||
source = QRectF(pos.x(), p_height, pos.width(), pos.height()); | |||||
target = QRectF(pos.x() + (fWidth * octave), 0, pos.width(), pos.height()); | |||||
source = QRectF(pos.x(), fHeight, pos.width(), pos.height()); | |||||
} | } | ||||
else if (m_pixmap_mode == VERTICAL) | |||||
else if (fPixmapMode == VERTICAL) | |||||
{ | { | ||||
target = QRectF(pos.x(), pos.y() + (p_height * octave), pos.width(), pos.height()); | |||||
source = QRectF(p_width, pos.y(), pos.width(), pos.height()); | |||||
target = QRectF(pos.x(), pos.y() + (fHeight * octave), pos.width(), pos.height()); | |||||
source = QRectF(fWidth, pos.y(), pos.width(), pos.height()); | |||||
} | } | ||||
else | else | ||||
return; | return; | ||||
painter.drawPixmap(target, m_pixmap, source); | |||||
painter.drawPixmap(target, fPixmap, source); | |||||
} | } | ||||
// Paint C-number note info | // Paint C-number note info | ||||
painter.setFont(m_font); | |||||
painter.setFont(fFont); | |||||
painter.setPen(Qt::black); | painter.setPen(Qt::black); | ||||
for (int i=0; i < m_octaves; i++) | |||||
for (int i=0; i < fOctaves; i++) | |||||
{ | { | ||||
if (m_pixmap_mode == HORIZONTAL) | |||||
if (fPixmapMode == HORIZONTAL) | |||||
painter.drawText(i * 144, 48, 18, 18, Qt::AlignCenter, QString("C%1").arg(i + 2)); | painter.drawText(i * 144, 48, 18, 18, Qt::AlignCenter, QString("C%1").arg(i + 2)); | ||||
else if (m_pixmap_mode == VERTICAL) | |||||
painter.drawText(45, (m_octaves * 144) - (i * 144) - 16, 18, 18, Qt::AlignCenter, QString("C%1").arg(i + 2)); | |||||
else if (fPixmapMode == VERTICAL) | |||||
painter.drawText(45, (fOctaves * 144) - (i * 144) - 16, 18, 18, Qt::AlignCenter, QString("C%1").arg(i + 2)); | |||||
} | } | ||||
} | } | ||||
void PixmapKeyboard::updateOnce() | void PixmapKeyboard::updateOnce() | ||||
{ | { | ||||
if (m_needsUpdate) | |||||
if (fNeedsUpdate) | |||||
{ | { | ||||
update(); | update(); | ||||
m_needsUpdate = false; | |||||
fNeedsUpdate = false; | |||||
} | } | ||||
} | } | ||||
bool PixmapKeyboard::_isNoteBlack(int note) | |||||
bool PixmapKeyboard::_isNoteBlack(int note) const | |||||
{ | { | ||||
int baseNote = note % 12; | int baseNote = note % 12; | ||||
return blackNotes.contains(baseNote); | |||||
return kBlackNotes.contains(baseNote); | |||||
} | } | ||||
QRectF PixmapKeyboard::_getRectFromMidiNote(int note) | |||||
const QRectF& PixmapKeyboard::_getRectFromMidiNote(int note) const | |||||
{ | { | ||||
return (*m_midi_map)[note % 12]; | |||||
return fMidiMap[note % 12]; | |||||
} | } |
@@ -18,6 +18,7 @@ | |||||
#ifndef __PIXMAPKEYBOARD_HPP__ | #ifndef __PIXMAPKEYBOARD_HPP__ | ||||
#define __PIXMAPKEYBOARD_HPP__ | #define __PIXMAPKEYBOARD_HPP__ | ||||
#include <map> | |||||
#include <QtGui/QPixmap> | #include <QtGui/QPixmap> | ||||
#include <QtGui/QWidget> | #include <QtGui/QWidget> | ||||
@@ -64,22 +65,23 @@ private Q_SLOTS: | |||||
void updateOnce(); | void updateOnce(); | ||||
private: | private: | ||||
QPixmap m_pixmap; | |||||
Orientation m_pixmap_mode; | |||||
QPixmap fPixmap; | |||||
Orientation fPixmapMode; | |||||
QString m_colorStr; | |||||
QFont m_font; | |||||
QString fColorStr; | |||||
QFont fFont; | |||||
int m_octaves; | |||||
int m_lastMouseNote; | |||||
int p_width, p_height; | |||||
int fOctaves; | |||||
int fLastMouseNote; | |||||
int fWidth; | |||||
int fHeight; | |||||
bool m_needsUpdate; | |||||
QList<int> m_enabledKeys; | |||||
QMap<int, QRectF> *m_midi_map; | |||||
bool fNeedsUpdate; | |||||
QList<int> fEnabledKeys; | |||||
std::map<int, QRectF>& fMidiMap; | |||||
bool _isNoteBlack(int note); | |||||
QRectF _getRectFromMidiNote(int note); | |||||
bool _isNoteBlack(int note) const; | |||||
const QRectF& _getRectFromMidiNote(int note) const; | |||||
}; | }; | ||||
#endif // __PIXMAPKEYBOARD_HPP__ | #endif // __PIXMAPKEYBOARD_HPP__ |
@@ -24,7 +24,7 @@ from PyQt4.QtGui import QFont, QPainter, QPixmap, QWidget | |||||
# ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
midi_key2rect_map_horizontal = { | |||||
kMidiKey2RectMapHorizontal = { | |||||
'0': QRectF(0, 0, 18, 64), # C | '0': QRectF(0, 0, 18, 64), # C | ||||
'1': QRectF(13, 0, 11, 42), # C# | '1': QRectF(13, 0, 11, 42), # C# | ||||
'2': QRectF(18, 0, 25, 64), # D | '2': QRectF(18, 0, 25, 64), # D | ||||
@@ -39,7 +39,7 @@ midi_key2rect_map_horizontal = { | |||||
'11': QRectF(126, 0, 18, 64) # B | '11': QRectF(126, 0, 18, 64) # B | ||||
} | } | ||||
midi_key2rect_map_vertical = { | |||||
kMidiKey2RectMapVertical = { | |||||
'11': QRectF(0, 0, 64, 18), # B | '11': QRectF(0, 0, 64, 18), # B | ||||
'10': QRectF(0, 14, 42, 7), # A# | '10': QRectF(0, 14, 42, 7), # A# | ||||
'9': QRectF(0, 18, 64, 24), # A | '9': QRectF(0, 18, 64, 24), # A | ||||
@@ -54,7 +54,7 @@ midi_key2rect_map_vertical = { | |||||
'0': QRectF(0, 126, 64, 18) # C | '0': QRectF(0, 126, 64, 18) # C | ||||
} | } | ||||
midi_keyboard2key_map = { | |||||
kMidiKeyboard2KeyMap = { | |||||
# 3th octave | # 3th octave | ||||
'%i' % Qt.Key_Z: 48, | '%i' % Qt.Key_Z: 48, | ||||
'%i' % Qt.Key_S: 49, | '%i' % Qt.Key_S: 49, | ||||
@@ -81,7 +81,9 @@ midi_keyboard2key_map = { | |||||
'%i' % Qt.Key_Y: 69, | '%i' % Qt.Key_Y: 69, | ||||
'%i' % Qt.Key_7: 70, | '%i' % Qt.Key_7: 70, | ||||
'%i' % Qt.Key_U: 71, | '%i' % Qt.Key_U: 71, | ||||
} | |||||
} | |||||
kBlackNotes = (1, 3, 6, 8, 10) | |||||
# ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
# MIDI Keyboard, using a pixmap for painting | # MIDI Keyboard, using a pixmap for painting | ||||
@@ -112,15 +114,15 @@ class PixmapKeyboard(QWidget): | |||||
def allNotesOff(self): | def allNotesOff(self): | ||||
self.fEnabledKeys = [] | self.fEnabledKeys = [] | ||||
self.fNeedsUpdate = True | self.fNeedsUpdate = True | ||||
QTimer.singleShot(0, self, SLOT("slot_updateOnce()")) | |||||
self.emit(SIGNAL("notesOff()")) | self.emit(SIGNAL("notesOff()")) | ||||
QTimer.singleShot(0, self, SLOT("slot_updateOnce()")) | |||||
def sendNoteOn(self, note, sendSignal=True): | def sendNoteOn(self, note, sendSignal=True): | ||||
if 0 <= note <= 127 and note not in self.fEnabledKeys: | if 0 <= note <= 127 and note not in self.fEnabledKeys: | ||||
self.fEnabledKeys.append(note) | self.fEnabledKeys.append(note) | ||||
if sendSignal: | if sendSignal: | ||||
self.emit(SIGNAL("noteOn(int)"), note) | self.emit(SIGNAL("noteOn(int)"), note) | ||||
@@ -133,6 +135,7 @@ class PixmapKeyboard(QWidget): | |||||
def sendNoteOff(self, note, sendSignal=True): | def sendNoteOff(self, note, sendSignal=True): | ||||
if 0 <= note <= 127 and note in self.fEnabledKeys: | if 0 <= note <= 127 and note in self.fEnabledKeys: | ||||
self.fEnabledKeys.remove(note) | self.fEnabledKeys.remove(note) | ||||
if sendSignal: | if sendSignal: | ||||
self.emit(SIGNAL("noteOff(int)"), note) | self.emit(SIGNAL("noteOff(int)"), note) | ||||
@@ -152,13 +155,13 @@ class PixmapKeyboard(QWidget): | |||||
return self.setMode(mode) | return self.setMode(mode) | ||||
if mode == self.HORIZONTAL: | if mode == self.HORIZONTAL: | ||||
self.fMidiMap = midi_key2rect_map_horizontal | |||||
self.fMidiMap = kMidiKey2RectMapHorizontal | |||||
self.fPixmap.load(":/bitmaps/kbd_h_%s.png" % self.fColorStr) | self.fPixmap.load(":/bitmaps/kbd_h_%s.png" % self.fColorStr) | ||||
self.fPixmapMode = self.HORIZONTAL | self.fPixmapMode = self.HORIZONTAL | ||||
self.fWidth = self.fPixmap.width() | self.fWidth = self.fPixmap.width() | ||||
self.fHeight = self.fPixmap.height() / 2 | self.fHeight = self.fPixmap.height() / 2 | ||||
elif mode == self.VERTICAL: | elif mode == self.VERTICAL: | ||||
self.fMidiMap = midi_key2rect_map_vertical | |||||
self.fMidiMap = kMidiKey2RectMapVertical | |||||
self.fPixmap.load(":/bitmaps/kbd_v_%s.png" % self.fColorStr) | self.fPixmap.load(":/bitmaps/kbd_v_%s.png" % self.fColorStr) | ||||
self.fPixmapMode = self.VERTICAL | self.fPixmapMode = self.VERTICAL | ||||
self.fWidth = self.fPixmap.width() / 2 | self.fWidth = self.fPixmap.width() / 2 | ||||
@@ -174,6 +177,7 @@ class PixmapKeyboard(QWidget): | |||||
octaves = 1 | octaves = 1 | ||||
elif octaves > 8: | elif octaves > 8: | ||||
octaves = 8 | octaves = 8 | ||||
self.fOctaves = octaves | self.fOctaves = octaves | ||||
if self.fPixmapMode == self.HORIZONTAL: | if self.fPixmapMode == self.HORIZONTAL: | ||||
@@ -189,53 +193,55 @@ class PixmapKeyboard(QWidget): | |||||
if self.fPixmapMode == self.HORIZONTAL: | if self.fPixmapMode == self.HORIZONTAL: | ||||
if pos.x() < 0 or pos.x() > self.fOctaves * 144: | if pos.x() < 0 or pos.x() > self.fOctaves * 144: | ||||
return | return | ||||
posX = pos.x() - 1 | |||||
posX = pos.x() - 1 | |||||
octave = int(posX / self.fWidth) | octave = int(posX / self.fWidth) | ||||
n_pos = QPointF(posX % self.fWidth, pos.y()) | |||||
keyPos = QPointF(posX % self.fWidth, pos.y()) | |||||
elif self.fPixmapMode == self.VERTICAL: | elif self.fPixmapMode == self.VERTICAL: | ||||
if pos.y() < 0 or pos.y() > self.fOctaves * 144: | if pos.y() < 0 or pos.y() > self.fOctaves * 144: | ||||
return | return | ||||
posY = pos.y() - 1 | |||||
posY = pos.y() - 1 | |||||
octave = int(self.fOctaves - posY / self.fHeight) | octave = int(self.fOctaves - posY / self.fHeight) | ||||
n_pos = QPointF(pos.x(), posY % self.fHeight) | |||||
keyPos = QPointF(pos.x(), posY % self.fHeight) | |||||
else: | else: | ||||
return | return | ||||
octave += 3 | octave += 3 | ||||
if self.fMidiMap['1'].contains(n_pos): # C# | |||||
if self.fMidiMap['1'].contains(keyPos): # C# | |||||
note = 1 | note = 1 | ||||
elif self.fMidiMap['3'].contains(n_pos): # D# | |||||
elif self.fMidiMap['3'].contains(keyPos): # D# | |||||
note = 3 | note = 3 | ||||
elif self.fMidiMap['6'].contains(n_pos): # F# | |||||
elif self.fMidiMap['6'].contains(keyPos): # F# | |||||
note = 6 | note = 6 | ||||
elif self.fMidiMap['8'].contains(n_pos): # G# | |||||
elif self.fMidiMap['8'].contains(keyPos): # G# | |||||
note = 8 | note = 8 | ||||
elif self.fMidiMap['10'].contains(n_pos):# A# | |||||
elif self.fMidiMap['10'].contains(keyPos):# A# | |||||
note = 10 | note = 10 | ||||
elif self.fMidiMap['0'].contains(n_pos): # C | |||||
elif self.fMidiMap['0'].contains(keyPos): # C | |||||
note = 0 | note = 0 | ||||
elif self.fMidiMap['2'].contains(n_pos): # D | |||||
elif self.fMidiMap['2'].contains(keyPos): # D | |||||
note = 2 | note = 2 | ||||
elif self.fMidiMap['4'].contains(n_pos): # E | |||||
elif self.fMidiMap['4'].contains(keyPos): # E | |||||
note = 4 | note = 4 | ||||
elif self.fMidiMap['5'].contains(n_pos): # F | |||||
elif self.fMidiMap['5'].contains(keyPos): # F | |||||
note = 5 | note = 5 | ||||
elif self.fMidiMap['7'].contains(n_pos): # G | |||||
elif self.fMidiMap['7'].contains(keyPos): # G | |||||
note = 7 | note = 7 | ||||
elif self.fMidiMap['9'].contains(n_pos): # A | |||||
elif self.fMidiMap['9'].contains(keyPos): # A | |||||
note = 9 | note = 9 | ||||
elif self.fMidiMap['11'].contains(n_pos):# B | |||||
elif self.fMidiMap['11'].contains(keyPos):# B | |||||
note = 11 | note = 11 | ||||
else: | else: | ||||
note = -1 | note = -1 | ||||
if note != -1: | if note != -1: | ||||
note += octave * 12 | note += octave * 12 | ||||
if self.fLastMouseNote != note: | if self.fLastMouseNote != note: | ||||
self.sendNoteOff(self.fLastMouseNote) | self.sendNoteOff(self.fLastMouseNote) | ||||
self.sendNoteOn(note) | self.sendNoteOn(note) | ||||
else: | |||||
elif self.fLastMouseNote != -1: | |||||
self.sendNoteOff(self.fLastMouseNote) | self.sendNoteOff(self.fLastMouseNote) | ||||
self.fLastMouseNote = note | self.fLastMouseNote = note | ||||
@@ -243,15 +249,15 @@ class PixmapKeyboard(QWidget): | |||||
def keyPressEvent(self, event): | def keyPressEvent(self, event): | ||||
if not event.isAutoRepeat(): | if not event.isAutoRepeat(): | ||||
qKey = str(event.key()) | qKey = str(event.key()) | ||||
if qKey in midi_keyboard2key_map.keys(): | |||||
self.sendNoteOn(midi_keyboard2key_map.get(qKey)) | |||||
if qKey in kMidiKeyboard2KeyMap.keys(): | |||||
self.sendNoteOn(kMidiKeyboard2KeyMap.get(qKey)) | |||||
QWidget.keyPressEvent(self, event) | QWidget.keyPressEvent(self, event) | ||||
def keyReleaseEvent(self, event): | def keyReleaseEvent(self, event): | ||||
if not event.isAutoRepeat(): | if not event.isAutoRepeat(): | ||||
qKey = str(event.key()) | qKey = str(event.key()) | ||||
if qKey in midi_keyboard2key_map.keys(): | |||||
self.sendNoteOff(midi_keyboard2key_map.get(qKey)) | |||||
if qKey in kMidiKeyboard2KeyMap.keys(): | |||||
self.sendNoteOff(kMidiKeyboard2KeyMap.get(qKey)) | |||||
QWidget.keyReleaseEvent(self, event) | QWidget.keyReleaseEvent(self, event) | ||||
def mousePressEvent(self, event): | def mousePressEvent(self, event): | ||||
@@ -295,7 +301,7 @@ class PixmapKeyboard(QWidget): | |||||
for i in range(len(self.fEnabledKeys)): | for i in range(len(self.fEnabledKeys)): | ||||
note = self.fEnabledKeys[i] | note = self.fEnabledKeys[i] | ||||
pos = self._getRectFromMidiNote(note) | |||||
pos = self._getRectFromMidiNote(note) | |||||
if self._isNoteBlack(note): | if self._isNoteBlack(note): | ||||
continue | continue | ||||
@@ -343,8 +349,9 @@ class PixmapKeyboard(QWidget): | |||||
if paintedWhite: | if paintedWhite: | ||||
for octave in range(self.fOctaves): | for octave in range(self.fOctaves): | ||||
for note in (1, 3, 6, 8, 10): | |||||
for note in kBlackNotes: | |||||
pos = self._getRectFromMidiNote(note) | pos = self._getRectFromMidiNote(note) | ||||
if self.fPixmapMode == self.HORIZONTAL: | if self.fPixmapMode == self.HORIZONTAL: | ||||
target = QRectF(pos.x() + (self.fWidth * octave), 0, pos.width(), pos.height()) | target = QRectF(pos.x() + (self.fWidth * octave), 0, pos.width(), pos.height()) | ||||
source = QRectF(pos.x(), 0, pos.width(), pos.height()) | source = QRectF(pos.x(), 0, pos.width(), pos.height()) | ||||
@@ -361,7 +368,7 @@ class PixmapKeyboard(QWidget): | |||||
for i in range(len(self.fEnabledKeys)): | for i in range(len(self.fEnabledKeys)): | ||||
note = self.fEnabledKeys[i] | note = self.fEnabledKeys[i] | ||||
pos = self._getRectFromMidiNote(note) | |||||
pos = self._getRectFromMidiNote(note) | |||||
if not self._isNoteBlack(note): | if not self._isNoteBlack(note): | ||||
continue | continue | ||||
@@ -421,7 +428,7 @@ class PixmapKeyboard(QWidget): | |||||
def _isNoteBlack(self, note): | def _isNoteBlack(self, note): | ||||
baseNote = note % 12 | baseNote = note % 12 | ||||
return bool(baseNote in (1, 3, 6, 8, 10)) | |||||
return bool(baseNote in kBlackNotes) | |||||
def _getRectFromMidiNote(self, note): | def _getRectFromMidiNote(self, note): | ||||
return self.fMidiMap.get(str(note % 12)) | return self.fMidiMap.get(str(note % 12)) |