comparison audio/PlaySpeedRangeMapper.cpp @ 468:56acd9368532 bqaudioio

Initial work toward switching to bqaudioio library (so as to get I/O, not just O)
author Chris Cannam
date Tue, 04 Aug 2015 13:27:42 +0100
parents audioio/PlaySpeedRangeMapper.cpp@45054b36ddbf
children
comparison
equal deleted inserted replaced
466:45054b36ddbf 468:56acd9368532
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2
3 /*
4 Sonic Visualiser
5 An audio file viewer and annotation editor.
6 Centre for Digital Music, Queen Mary, University of London.
7 This file copyright 2006 QMUL.
8
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License as
11 published by the Free Software Foundation; either version 2 of the
12 License, or (at your option) any later version. See the file
13 COPYING included with this distribution for more information.
14 */
15
16 #include "PlaySpeedRangeMapper.h"
17
18 #include <iostream>
19 #include <cmath>
20
21 // PlaySpeedRangeMapper maps a position in the range [0,120] on to a
22 // play speed factor on a logarithmic scale in the range 0.125 ->
23 // 8. This ensures that the desirable speed factors 0.25, 0.5, 1, 2,
24 // and 4 are all mapped to exact positions (respectively 20, 40, 60,
25 // 80, 100).
26
27 // Note that the "factor" referred to below is a play speed factor
28 // (higher = faster, 1.0 = normal speed), the "value" is a percentage
29 // (higher = faster, 100 = normal speed), and the "position" is an
30 // integer step on the dial's scale (0-120, 60 = centre).
31
32 PlaySpeedRangeMapper::PlaySpeedRangeMapper() :
33 m_minpos(0),
34 m_maxpos(120)
35 {
36 }
37
38 int
39 PlaySpeedRangeMapper::getPositionForValue(double value) const
40 {
41 // value is percent
42 double factor = getFactorForValue(value);
43 int position = getPositionForFactor(factor);
44 return position;
45 }
46
47 int
48 PlaySpeedRangeMapper::getPositionForValueUnclamped(double value) const
49 {
50 // We don't really provide this
51 return getPositionForValue(value);
52 }
53
54 double
55 PlaySpeedRangeMapper::getValueForPosition(int position) const
56 {
57 double factor = getFactorForPosition(position);
58 double pc = getValueForFactor(factor);
59 return pc;
60 }
61
62 double
63 PlaySpeedRangeMapper::getValueForPositionUnclamped(int position) const
64 {
65 // We don't really provide this
66 return getValueForPosition(position);
67 }
68
69 double
70 PlaySpeedRangeMapper::getValueForFactor(double factor) const
71 {
72 return factor * 100.0;
73 }
74
75 double
76 PlaySpeedRangeMapper::getFactorForValue(double value) const
77 {
78 return value / 100.0;
79 }
80
81 int
82 PlaySpeedRangeMapper::getPositionForFactor(double factor) const
83 {
84 if (factor == 0) return m_minpos;
85 int pos = int(lrint((log2(factor) + 3.0) * 20.0));
86 if (pos < m_minpos) pos = m_minpos;
87 if (pos > m_maxpos) pos = m_maxpos;
88 return pos;
89 }
90
91 double
92 PlaySpeedRangeMapper::getFactorForPosition(int position) const
93 {
94 return pow(2.0, double(position) * 0.05 - 3.0);
95 }
96
97 QString
98 PlaySpeedRangeMapper::getUnit() const
99 {
100 return "%";
101 }