# HG changeset patch # User Chris Cannam # Date 1161004437 0 # Node ID 0703252c9fe8935f2ee9e93ad4561b519efa0dc4 # Parent f86b74d1b143ba2f5acf865e88043085f3680ae9 * Add spectrum icon * Start range mapper class for use in mapping between e.g. dial positions and underlying values diff -r f86b74d1b143 -r 0703252c9fe8 base/RangeMapper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/RangeMapper.cpp Mon Oct 16 13:13:57 2006 +0000 @@ -0,0 +1,90 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006 Chris Cannam. + + 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 "RangeMapper.h" + +#include +#include + +#include + +LinearRangeMapper::LinearRangeMapper(int minpos, int maxpos, + float minval, float maxval, + QString unit) : + m_minpos(minpos), + m_maxpos(maxpos), + m_minval(minval), + m_maxval(maxval), + m_unit(unit) +{ + assert(m_maxval != m_minval); + assert(m_maxpos != m_minpos); +} + +int +LinearRangeMapper::getPositionForValue(float value) const +{ + int position = lrintf(((value - m_minval) / (m_maxval - m_minval)) + * (m_maxpos - m_minpos)); + if (position < m_minpos) position = m_minpos; + if (position > m_maxpos) position = m_maxpos; + return position; +} + +float +LinearRangeMapper::getValueForPosition(int position) const +{ + float value = ((float(position - m_minpos) / float(m_maxpos - m_minpos)) + * (m_maxval - m_minval)); + if (value < m_minval) value = m_minval; + if (value > m_maxval) value = m_maxval; + return value; +} + +LogRangeMapper::LogRangeMapper(int minpos, int maxpos, + float ratio, float minlog, + QString unit) : + m_minpos(minpos), + m_maxpos(maxpos), + m_minlog(minlog), + m_unit(unit) +{ + assert(m_maxpos != m_minpos); + + m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog; +} + +int +LogRangeMapper::getPositionForValue(float value) const +{ + float mapped = m_ratio * log10(value); + int position = lrintf(((mapped - m_minlog) / (m_maxlog - m_minlog)) + * (m_maxpos - m_minpos)); + if (position < m_minpos) position = m_minpos; + if (position > m_maxpos) position = m_maxpos; + std::cerr << "LogRangeMapper::getPositionForValue: " << value << " -> " + << position << std::endl; + return position; +} + +float +LogRangeMapper::getValueForPosition(int position) const +{ + float value = powf(10, (position - m_minpos) / m_ratio + m_minlog); + std::cerr << "LogRangeMapper::getPositionForValue: " << position << " -> " + << value << std::endl; + return value; +} + diff -r f86b74d1b143 -r 0703252c9fe8 base/RangeMapper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/base/RangeMapper.h Mon Oct 16 13:13:57 2006 +0000 @@ -0,0 +1,75 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006 Chris Cannam. + + 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. +*/ + +#ifndef _RANGE_MAPPER_H_ +#define _RANGE_MAPPER_H_ + +#include + + +class RangeMapper +{ +public: + virtual ~RangeMapper() { } + virtual int getPositionForValue(float value) const = 0; + virtual float getValueForPosition(int position) const = 0; + virtual QString getUnit() const { return ""; } +}; + + +class LinearRangeMapper : public RangeMapper +{ +public: + LinearRangeMapper(int minpos, int maxpos, + float minval, float maxval, + QString unit = ""); + + virtual int getPositionForValue(float value) const; + virtual float getValueForPosition(int position) const; + + virtual QString getUnit() const { return m_unit; } + +protected: + int m_minpos; + int m_maxpos; + float m_minval; + float m_maxval; + QString m_unit; +}; + + +class LogRangeMapper : public RangeMapper +{ +public: + LogRangeMapper(int minpos, int maxpos, + float ratio, float minlog, + QString m_unit = ""); + + virtual int getPositionForValue(float value) const; + virtual float getValueForPosition(int position) const; + + virtual QString getUnit() const { return m_unit; } + +protected: + int m_minpos; + int m_maxpos; + float m_ratio; + float m_minlog; + float m_maxlog; + QString m_unit; +}; + + +#endif diff -r f86b74d1b143 -r 0703252c9fe8 base/base.pro --- a/base/base.pro Fri Oct 13 12:51:05 2006 +0000 +++ b/base/base.pro Mon Oct 16 13:13:57 2006 +0000 @@ -25,6 +25,7 @@ Preferences.h \ Profiler.h \ PropertyContainer.h \ + RangeMapper.h \ RealTime.h \ RecentFiles.h \ ResizeableBitset.h \ @@ -49,6 +50,7 @@ Preferences.cpp \ Profiler.cpp \ PropertyContainer.cpp \ + RangeMapper.cpp \ RealTime.cpp \ RecentFiles.cpp \ Selection.cpp \