diff options
author | Alexander Levin <al.le@rockbox.org> | 2009-07-12 17:14:01 +0000 |
---|---|---|
committer | Alexander Levin <al.le@rockbox.org> | 2009-07-12 17:14:01 +0000 |
commit | 76e62917803f5567bd5978c79db6ec9f25837034 (patch) | |
tree | 9275d92a7f6ed6039f548105aeffecdbda33b05b | |
parent | 4930b328177049589c06c3a35ccdeec8c537094c (diff) | |
download | rockbox-76e62917803f5567bd5978c79db6ec9f25837034.tar.gz rockbox-76e62917803f5567bd5978c79db6ec9f25837034.zip |
Unify semitone and cent macros and make the formula a bit more obvious
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21814 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/gui/pitchscreen.c | 77 |
1 files changed, 37 insertions, 40 deletions
diff --git a/apps/gui/pitchscreen.c b/apps/gui/pitchscreen.c index a699d4a7b4..2d0412d822 100644 --- a/apps/gui/pitchscreen.c +++ b/apps/gui/pitchscreen.c | |||
@@ -80,43 +80,44 @@ enum | |||
80 | 80 | ||
81 | All that math in each entry simply converts the float constant | 81 | All that math in each entry simply converts the float constant |
82 | to an integer equal to PITCH_SPEED_PRECISION times the float value, | 82 | to an integer equal to PITCH_SPEED_PRECISION times the float value, |
83 | with as little precision loss as possible. | 83 | with as little precision loss as possible (i.e. correctly rounding |
84 | the last digit). | ||
84 | */ | 85 | */ |
85 | #define SEMITONE_VALUE(x) \ | 86 | #define TO_INT_WITH_PRECISION(x) \ |
86 | ( (int)(((x) + 0.5 / PITCH_SPEED_PRECISION) * PITCH_SPEED_PRECISION) ) | 87 | ( (int)(((x) * PITCH_SPEED_PRECISION * 10 + 5) / 10) ) |
87 | 88 | ||
88 | static const int semitone_table[] = | 89 | static const int semitone_table[] = |
89 | { | 90 | { |
90 | SEMITONE_VALUE(50), | 91 | TO_INT_WITH_PRECISION(50.00000000), /* Octave lower */ |
91 | SEMITONE_VALUE(52.97315472), | 92 | TO_INT_WITH_PRECISION(52.97315472), |
92 | SEMITONE_VALUE(56.12310242), | 93 | TO_INT_WITH_PRECISION(56.12310242), |
93 | SEMITONE_VALUE(59.46035575), | 94 | TO_INT_WITH_PRECISION(59.46035575), |
94 | SEMITONE_VALUE(62.99605249), | 95 | TO_INT_WITH_PRECISION(62.99605249), |
95 | SEMITONE_VALUE(66.74199271), | 96 | TO_INT_WITH_PRECISION(66.74199271), |
96 | SEMITONE_VALUE(70.71067812), | 97 | TO_INT_WITH_PRECISION(70.71067812), |
97 | SEMITONE_VALUE(74.91535384), | 98 | TO_INT_WITH_PRECISION(74.91535384), |
98 | SEMITONE_VALUE(79.3700526 ), | 99 | TO_INT_WITH_PRECISION(79.37005260), |
99 | SEMITONE_VALUE(84.08964153), | 100 | TO_INT_WITH_PRECISION(84.08964153), |
100 | SEMITONE_VALUE(89.08987181), | 101 | TO_INT_WITH_PRECISION(89.08987181), |
101 | SEMITONE_VALUE(94.38743127), | 102 | TO_INT_WITH_PRECISION(94.38743127), |
102 | SEMITONE_VALUE(100 ), | 103 | TO_INT_WITH_PRECISION(100.0000000), /* Normal sound */ |
103 | SEMITONE_VALUE(105.9463094), | 104 | TO_INT_WITH_PRECISION(105.9463094), |
104 | SEMITONE_VALUE(112.2462048), | 105 | TO_INT_WITH_PRECISION(112.2462048), |
105 | SEMITONE_VALUE(118.9207115), | 106 | TO_INT_WITH_PRECISION(118.9207115), |
106 | SEMITONE_VALUE(125.992105 ), | 107 | TO_INT_WITH_PRECISION(125.9921049), |
107 | SEMITONE_VALUE(133.4839854), | 108 | TO_INT_WITH_PRECISION(133.4839854), |
108 | SEMITONE_VALUE(141.4213562), | 109 | TO_INT_WITH_PRECISION(141.4213562), |
109 | SEMITONE_VALUE(149.8307077), | 110 | TO_INT_WITH_PRECISION(149.8307077), |
110 | SEMITONE_VALUE(158.7401052), | 111 | TO_INT_WITH_PRECISION(158.7401052), |
111 | SEMITONE_VALUE(168.1792831), | 112 | TO_INT_WITH_PRECISION(168.1792831), |
112 | SEMITONE_VALUE(178.1797436), | 113 | TO_INT_WITH_PRECISION(178.1797436), |
113 | SEMITONE_VALUE(188.7748625), | 114 | TO_INT_WITH_PRECISION(188.7748625), |
114 | SEMITONE_VALUE(200 ) | 115 | TO_INT_WITH_PRECISION(200.0000000) /* Octave higher */ |
115 | }; | 116 | }; |
116 | 117 | ||
117 | #define NUM_SEMITONES ((int)(sizeof(semitone_table) / sizeof(int))) | 118 | #define NUM_SEMITONES ((int)(sizeof(semitone_table) / sizeof(int))) |
118 | #define SEMITONE_START -12 | 119 | #define SEMITONE_END (NUM_SEMITONES/2) |
119 | #define SEMITONE_END 12 | 120 | #define SEMITONE_START (-SEMITONE_END) |
120 | 121 | ||
121 | /* A table of values for approximating the cent curve with | 122 | /* A table of values for approximating the cent curve with |
122 | linear interpolation. Multipy the next lowest semitone | 123 | linear interpolation. Multipy the next lowest semitone |
@@ -126,19 +127,15 @@ static const int semitone_table[] = | |||
126 | x(n) = 100 * 2^(n * 20/1200) | 127 | x(n) = 100 * 2^(n * 20/1200) |
127 | */ | 128 | */ |
128 | 129 | ||
129 | #define CENT_INTERP(x) \ | ||
130 | ( (int)(((x) + 0.5 / PITCH_SPEED_PRECISION) * PITCH_SPEED_PRECISION) ) | ||
131 | |||
132 | |||
133 | static const int cent_interp[] = | 130 | static const int cent_interp[] = |
134 | { | 131 | { |
135 | PITCH_SPEED_100, | 132 | TO_INT_WITH_PRECISION(100.0000000), |
136 | CENT_INTERP(101.1619440), | 133 | TO_INT_WITH_PRECISION(101.1619440), |
137 | CENT_INTERP(102.3373892), | 134 | TO_INT_WITH_PRECISION(102.3373892), |
138 | CENT_INTERP(103.5264924), | 135 | TO_INT_WITH_PRECISION(103.5264924), |
139 | CENT_INTERP(104.7294123), | 136 | TO_INT_WITH_PRECISION(104.7294123), |
140 | /* this one's the next semitone but we have it here for convenience */ | 137 | /* this one's the next semitone but we have it here for convenience */ |
141 | CENT_INTERP(105.9463094), | 138 | TO_INT_WITH_PRECISION(105.9463094), |
142 | }; | 139 | }; |
143 | 140 | ||
144 | /* Number of cents between entries in the cent_interp table */ | 141 | /* Number of cents between entries in the cent_interp table */ |