annotate audioio/PlaySpeedRangeMapper.cpp @ 140:9ccaa8fd9b9f

* Add code to identify (usually) the type of an XML file that contains either SV session or layer data, and use it to permit loading files with plain .xml extension that contain complete uncompression sessions
author Chris Cannam
date Thu, 20 Nov 2008 10:59:14 +0000
parents 3c5756fb6a68
children 068235cf5bf7
rev   line source
Chris@43 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@43 2
Chris@43 3 /*
Chris@43 4 Sonic Visualiser
Chris@43 5 An audio file viewer and annotation editor.
Chris@43 6 Centre for Digital Music, Queen Mary, University of London.
Chris@43 7 This file copyright 2006 QMUL.
Chris@43 8
Chris@43 9 This program is free software; you can redistribute it and/or
Chris@43 10 modify it under the terms of the GNU General Public License as
Chris@43 11 published by the Free Software Foundation; either version 2 of the
Chris@43 12 License, or (at your option) any later version. See the file
Chris@43 13 COPYING included with this distribution for more information.
Chris@43 14 */
Chris@43 15
Chris@43 16 #include "PlaySpeedRangeMapper.h"
Chris@43 17
Chris@43 18 #include <iostream>
Chris@43 19 #include <cmath>
Chris@43 20
Chris@43 21 PlaySpeedRangeMapper::PlaySpeedRangeMapper(int minpos, int maxpos) :
Chris@43 22 m_minpos(minpos),
Chris@43 23 m_maxpos(maxpos)
Chris@43 24 {
Chris@43 25 }
Chris@43 26
Chris@43 27 int
Chris@43 28 PlaySpeedRangeMapper::getPositionForValue(float value) const
Chris@43 29 {
Chris@43 30 // value is percent
Chris@43 31 float factor = getFactorForValue(value);
Chris@43 32 int position = getPositionForFactor(factor);
Chris@43 33 return position;
Chris@43 34 }
Chris@43 35
Chris@43 36 int
Chris@43 37 PlaySpeedRangeMapper::getPositionForFactor(float factor) const
Chris@43 38 {
Chris@43 39 bool slow = (factor > 1.0);
Chris@43 40
Chris@43 41 if (!slow) factor = 1.0 / factor;
Chris@43 42
Chris@43 43 int half = (m_maxpos + m_minpos) / 2;
Chris@43 44
Chris@43 45 factor = sqrtf((factor - 1.0) * 1000.f);
Chris@43 46 int position = lrintf(((factor * (half - m_minpos)) / 100.0) + m_minpos);
Chris@43 47
Chris@43 48 if (slow) {
Chris@43 49 position = half - position;
Chris@43 50 } else {
Chris@43 51 position = position + half;
Chris@43 52 }
Chris@43 53
Chris@43 54 // std::cerr << "value = " << value << " slow = " << slow << " factor = " << factor << " position = " << position << std::endl;
Chris@43 55
Chris@43 56 return position;
Chris@43 57 }
Chris@43 58
Chris@43 59 float
Chris@43 60 PlaySpeedRangeMapper::getValueForPosition(int position) const
Chris@43 61 {
Chris@43 62 float factor = getFactorForPosition(position);
Chris@43 63 float pc = getValueForFactor(factor);
Chris@43 64 return pc;
Chris@43 65 }
Chris@43 66
Chris@43 67 float
Chris@43 68 PlaySpeedRangeMapper::getValueForFactor(float factor) const
Chris@43 69 {
Chris@43 70 float pc;
Chris@43 71 if (factor < 1.0) pc = ((1.0 / factor) - 1.0) * 100.0;
Chris@43 72 else pc = (1.0 - factor) * 100.0;
Chris@43 73 // std::cerr << "position = " << position << " percent = " << pc << std::endl;
Chris@43 74 return pc;
Chris@43 75 }
Chris@43 76
Chris@43 77 float
Chris@43 78 PlaySpeedRangeMapper::getFactorForValue(float value) const
Chris@43 79 {
Chris@43 80 // value is percent
Chris@43 81
Chris@43 82 float factor;
Chris@43 83
Chris@43 84 if (value <= 0) {
Chris@43 85 factor = 1.0 - (value / 100.0);
Chris@43 86 } else {
Chris@43 87 factor = 1.0 / (1.0 + (value / 100.0));
Chris@43 88 }
Chris@43 89
Chris@43 90 // std::cerr << "value = " << value << " factor = " << factor << std::endl;
Chris@43 91 return factor;
Chris@43 92 }
Chris@43 93
Chris@43 94 float
Chris@43 95 PlaySpeedRangeMapper::getFactorForPosition(int position) const
Chris@43 96 {
Chris@43 97 bool slow = false;
Chris@43 98
Chris@43 99 if (position < m_minpos) position = m_minpos;
Chris@43 100 if (position > m_maxpos) position = m_maxpos;
Chris@43 101
Chris@43 102 int half = (m_maxpos + m_minpos) / 2;
Chris@43 103
Chris@43 104 if (position < half) {
Chris@43 105 slow = true;
Chris@43 106 position = half - position;
Chris@43 107 } else {
Chris@43 108 position = position - half;
Chris@43 109 }
Chris@43 110
Chris@43 111 // position is between min and half (inclusive)
Chris@43 112
Chris@43 113 float factor;
Chris@43 114
Chris@43 115 if (position == m_minpos) {
Chris@43 116 factor = 1.0;
Chris@43 117 } else {
Chris@43 118 factor = ((position - m_minpos) * 100.0) / (half - m_minpos);
Chris@43 119 factor = 1.0 + (factor * factor) / 1000.f;
Chris@43 120 }
Chris@43 121
Chris@43 122 if (!slow) factor = 1.0 / factor;
Chris@43 123
Chris@43 124 // std::cerr << "position = " << position << " slow = " << slow << " factor = " << factor << std::endl;
Chris@43 125
Chris@43 126 return factor;
Chris@43 127 }
Chris@43 128
Chris@43 129 QString
Chris@43 130 PlaySpeedRangeMapper::getUnit() const
Chris@43 131 {
Chris@43 132 return "%";
Chris@43 133 }