summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/pitchscreen.c77
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
88static const int semitone_table[] = 89static 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
133static const int cent_interp[] = 130static 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 */