annotate base/RangeMapper.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents be6f263fa0ab
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2006 QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16
lbajardsilogic@0 17 #include <cassert>
lbajardsilogic@0 18 #include <cmath>
lbajardsilogic@0 19
lbajardsilogic@0 20 #include <iostream>
lbajardsilogic@0 21
lbarthelemy@187 22 #include "system/System.h"
lbarthelemy@187 23 #include "RangeMapper.h"
lbarthelemy@187 24
lbajardsilogic@0 25 LinearRangeMapper::LinearRangeMapper(int minpos, int maxpos,
lbajardsilogic@0 26 float minval, float maxval,
lbajardsilogic@0 27 QString unit) :
lbajardsilogic@0 28 m_minpos(minpos),
lbajardsilogic@0 29 m_maxpos(maxpos),
lbajardsilogic@0 30 m_minval(minval),
lbajardsilogic@0 31 m_maxval(maxval),
lbajardsilogic@0 32 m_unit(unit)
lbajardsilogic@0 33 {
lbajardsilogic@0 34 assert(m_maxval != m_minval);
lbajardsilogic@0 35 assert(m_maxpos != m_minpos);
lbajardsilogic@0 36 }
lbajardsilogic@0 37
lbajardsilogic@0 38 int
lbajardsilogic@0 39 LinearRangeMapper::getPositionForValue(float value) const
lbajardsilogic@0 40 {
lbajardsilogic@0 41 int position = m_minpos +
lbajardsilogic@0 42 lrintf(((value - m_minval) / (m_maxval - m_minval))
lbajardsilogic@0 43 * (m_maxpos - m_minpos));
lbajardsilogic@0 44 if (position < m_minpos) position = m_minpos;
lbajardsilogic@0 45 if (position > m_maxpos) position = m_maxpos;
lbajardsilogic@0 46 // std::cerr << "LinearRangeMapper::getPositionForValue: " << value << " -> "
lbajardsilogic@0 47 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl;
lbajardsilogic@0 48 return position;
lbajardsilogic@0 49 }
lbajardsilogic@0 50
lbajardsilogic@0 51 float
lbajardsilogic@0 52 LinearRangeMapper::getValueForPosition(int position) const
lbajardsilogic@0 53 {
lbajardsilogic@0 54 float value = m_minval +
lbajardsilogic@0 55 ((float(position - m_minpos) / float(m_maxpos - m_minpos))
lbajardsilogic@0 56 * (m_maxval - m_minval));
lbajardsilogic@0 57 if (value < m_minval) value = m_minval;
lbajardsilogic@0 58 if (value > m_maxval) value = m_maxval;
lbajardsilogic@0 59 // std::cerr << "LinearRangeMapper::getValueForPosition: " << position << " -> "
lbajardsilogic@0 60 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl;
lbajardsilogic@0 61 return value;
lbajardsilogic@0 62 }
lbajardsilogic@0 63
lbajardsilogic@0 64 LogRangeMapper::LogRangeMapper(int minpos, int maxpos,
lbajardsilogic@0 65 float ratio, float minlog,
lbajardsilogic@0 66 QString unit) :
lbajardsilogic@0 67 m_minpos(minpos),
lbajardsilogic@0 68 m_maxpos(maxpos),
lbajardsilogic@0 69 m_ratio(ratio),
lbajardsilogic@0 70 m_minlog(minlog),
lbajardsilogic@0 71 m_unit(unit)
lbajardsilogic@0 72 {
lbajardsilogic@0 73 assert(m_maxpos != m_minpos);
lbajardsilogic@0 74
lbajardsilogic@0 75 m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog;
lbajardsilogic@0 76 }
lbajardsilogic@0 77
lbajardsilogic@0 78 int
lbajardsilogic@0 79 LogRangeMapper::getPositionForValue(float value) const
lbajardsilogic@0 80 {
lbajardsilogic@0 81 float mapped = m_ratio * log10(value);
lbajardsilogic@0 82 int position = lrintf(((mapped - m_minlog) / (m_maxlog - m_minlog))
lbajardsilogic@0 83 * (m_maxpos - m_minpos));
lbajardsilogic@0 84 if (position < m_minpos) position = m_minpos;
lbajardsilogic@0 85 if (position > m_maxpos) position = m_maxpos;
lbajardsilogic@0 86 // std::cerr << "LogRangeMapper::getPositionForValue: " << value << " -> "
lbajardsilogic@0 87 // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl;
lbajardsilogic@0 88 return position;
lbajardsilogic@0 89 }
lbajardsilogic@0 90
lbajardsilogic@0 91 float
lbajardsilogic@0 92 LogRangeMapper::getValueForPosition(int position) const
lbajardsilogic@0 93 {
lbajardsilogic@0 94 float value = powf(10, (position - m_minpos) / m_ratio + m_minlog);
lbajardsilogic@0 95 // std::cerr << "LogRangeMapper::getValueForPosition: " << position << " -> "
lbajardsilogic@0 96 // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl;
lbajardsilogic@0 97 return value;
lbajardsilogic@0 98 }
lbajardsilogic@0 99