lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: lbarthelemy@187: #include "system/System.h" lbarthelemy@187: #include "RangeMapper.h" lbarthelemy@187: lbajardsilogic@0: LinearRangeMapper::LinearRangeMapper(int minpos, int maxpos, lbajardsilogic@0: float minval, float maxval, lbajardsilogic@0: QString unit) : lbajardsilogic@0: m_minpos(minpos), lbajardsilogic@0: m_maxpos(maxpos), lbajardsilogic@0: m_minval(minval), lbajardsilogic@0: m_maxval(maxval), lbajardsilogic@0: m_unit(unit) lbajardsilogic@0: { lbajardsilogic@0: assert(m_maxval != m_minval); lbajardsilogic@0: assert(m_maxpos != m_minpos); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: LinearRangeMapper::getPositionForValue(float value) const lbajardsilogic@0: { lbajardsilogic@0: int position = m_minpos + lbajardsilogic@0: lrintf(((value - m_minval) / (m_maxval - m_minval)) lbajardsilogic@0: * (m_maxpos - m_minpos)); lbajardsilogic@0: if (position < m_minpos) position = m_minpos; lbajardsilogic@0: if (position > m_maxpos) position = m_maxpos; lbajardsilogic@0: // std::cerr << "LinearRangeMapper::getPositionForValue: " << value << " -> " lbajardsilogic@0: // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl; lbajardsilogic@0: return position; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: LinearRangeMapper::getValueForPosition(int position) const lbajardsilogic@0: { lbajardsilogic@0: float value = m_minval + lbajardsilogic@0: ((float(position - m_minpos) / float(m_maxpos - m_minpos)) lbajardsilogic@0: * (m_maxval - m_minval)); lbajardsilogic@0: if (value < m_minval) value = m_minval; lbajardsilogic@0: if (value > m_maxval) value = m_maxval; lbajardsilogic@0: // std::cerr << "LinearRangeMapper::getValueForPosition: " << position << " -> " lbajardsilogic@0: // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", minval " << m_minval << ", maxval " << m_maxval << ")" << std::endl; lbajardsilogic@0: return value; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: LogRangeMapper::LogRangeMapper(int minpos, int maxpos, lbajardsilogic@0: float ratio, float minlog, lbajardsilogic@0: QString unit) : lbajardsilogic@0: m_minpos(minpos), lbajardsilogic@0: m_maxpos(maxpos), lbajardsilogic@0: m_ratio(ratio), lbajardsilogic@0: m_minlog(minlog), lbajardsilogic@0: m_unit(unit) lbajardsilogic@0: { lbajardsilogic@0: assert(m_maxpos != m_minpos); lbajardsilogic@0: lbajardsilogic@0: m_maxlog = (m_maxpos - m_minpos) / m_ratio + m_minlog; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: LogRangeMapper::getPositionForValue(float value) const lbajardsilogic@0: { lbajardsilogic@0: float mapped = m_ratio * log10(value); lbajardsilogic@0: int position = lrintf(((mapped - m_minlog) / (m_maxlog - m_minlog)) lbajardsilogic@0: * (m_maxpos - m_minpos)); lbajardsilogic@0: if (position < m_minpos) position = m_minpos; lbajardsilogic@0: if (position > m_maxpos) position = m_maxpos; lbajardsilogic@0: // std::cerr << "LogRangeMapper::getPositionForValue: " << value << " -> " lbajardsilogic@0: // << position << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl; lbajardsilogic@0: return position; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: LogRangeMapper::getValueForPosition(int position) const lbajardsilogic@0: { lbajardsilogic@0: float value = powf(10, (position - m_minpos) / m_ratio + m_minlog); lbajardsilogic@0: // std::cerr << "LogRangeMapper::getValueForPosition: " << position << " -> " lbajardsilogic@0: // << value << " (minpos " << m_minpos << ", maxpos " << m_maxpos << ", ratio " << m_ratio << ", minlog " << m_minlog << ")" << std::endl; lbajardsilogic@0: return value; lbajardsilogic@0: } lbajardsilogic@0: