summaryrefslogtreecommitdiffstats
path: root/src/gui/rulers/VelocityColour.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/rulers/VelocityColour.cpp')
-rw-r--r--src/gui/rulers/VelocityColour.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/gui/rulers/VelocityColour.cpp b/src/gui/rulers/VelocityColour.cpp
new file mode 100644
index 0000000..02a2f90
--- /dev/null
+++ b/src/gui/rulers/VelocityColour.cpp
@@ -0,0 +1,120 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <glaurent@telegraph-road.org>,
+ Chris Cannam <cannam@all-day-breakfast.com>,
+ Richard Bown <richard.bown@ferventsoftware.com>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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 (at your option) any later version. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "VelocityColour.h"
+
+#include <qcolor.h>
+
+// #include <cassert>
+
+
+namespace Rosegarden
+{
+
+VelocityColour::VelocityColour(const QColor &loud,
+ const QColor &medium,
+ const QColor &quiet,
+ int maxValue,
+ int loudKnee,
+ int mediumKnee,
+ int quietKnee):
+ m_loudColour(loud),
+ m_mediumColour(medium),
+ m_quietColour(quiet),
+ m_loudKnee(loudKnee),
+ m_mediumKnee(mediumKnee),
+ m_quietKnee(quietKnee),
+ m_maxValue(maxValue),
+ m_mixedColour(QColor(0, 0, 0)), // black as default
+ m_multiplyFactor(1000)
+{
+
+// assert(maxValue > loudKnee);
+// assert(loudKnee > mediumKnee);
+// assert(mediumKnee > quietKnee);
+
+ // These are the colours for the first band from Quiet to Medium.
+ // We use a multiplication factor to keep ourselves in the realms
+ // of integer arithmetic as we can potentially be doing a lot of
+ // these calculations when playing.
+ //
+ //
+ m_loStartRed = m_quietColour.red() * m_multiplyFactor;
+ m_loStartGreen = m_quietColour.green() * m_multiplyFactor;
+ m_loStartBlue = m_quietColour.blue() * m_multiplyFactor;
+
+ m_loStepRed = ( m_mediumColour.red() * m_multiplyFactor
+ - m_loStartRed ) / m_mediumKnee;
+ m_loStepGreen = ( m_mediumColour.green() * m_multiplyFactor
+ - m_loStartGreen ) / m_mediumKnee;
+ m_loStepBlue = ( m_mediumColour.blue() * m_multiplyFactor
+ - m_loStartBlue ) / m_mediumKnee;
+
+ m_hiStartRed = m_mediumColour.red() * m_multiplyFactor;
+ m_hiStartGreen = m_mediumColour.green() * m_multiplyFactor;
+ m_hiStartBlue = m_mediumColour.blue() * m_multiplyFactor;
+
+ m_hiStepRed = ( m_loudColour.red() * m_multiplyFactor
+ - m_hiStartRed ) / m_mediumKnee;
+ m_hiStepGreen = ( m_loudColour.green() * m_multiplyFactor
+ - m_hiStartGreen ) / m_mediumKnee;
+ m_hiStepBlue = ( m_loudColour.blue() * m_multiplyFactor
+ - m_hiStartBlue ) / m_mediumKnee;
+
+}
+
+VelocityColour::~VelocityColour()
+{}
+
+const QColor&
+VelocityColour::getColour(int value)
+{
+ if (value > m_maxValue)
+ value = m_maxValue;
+
+ if (value < m_quietKnee) {
+ return m_quietColour;
+ } else if (value < m_mediumKnee) {
+ m_mixedColour.setRgb(
+ ( m_loStartRed + m_loStepRed * value ) / m_multiplyFactor,
+ ( m_loStartGreen + m_loStepGreen * value ) / m_multiplyFactor,
+ ( m_loStartBlue + m_loStepBlue * value ) / m_multiplyFactor);
+
+ } else if (value >= m_mediumKnee < m_loudKnee) {
+ int mixFactor = value - m_mediumKnee;
+
+ m_mixedColour.setRgb(
+ ( m_hiStartRed + m_hiStepRed * mixFactor ) / m_multiplyFactor,
+ ( m_hiStartGreen + m_hiStepGreen * mixFactor ) / m_multiplyFactor,
+ ( m_hiStartBlue + m_hiStepBlue * mixFactor ) / m_multiplyFactor);
+ } else {
+ return m_loudColour;
+ return m_loudColour;
+ }
+
+ return m_mixedColour;
+}
+
+}