summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Levin <al.le@rockbox.org>2009-09-20 17:03:30 +0000
committerAlexander Levin <al.le@rockbox.org>2009-09-20 17:03:30 +0000
commit8163ddeb7ef57cf0c36af5edde1fe323636d595a (patch)
tree68bcf8d06b0d360e26fb8929960f51c14821f6ec
parentab563da17585992e9b8d54db1d4e36ba50d65d43 (diff)
downloadrockbox-8163ddeb7ef57cf0c36af5edde1fe323636d595a.tar.gz
rockbox-8163ddeb7ef57cf0c36af5edde1fe323636d595a.zip
Pitch Detector: group note related data together
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@22758 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/pitch_detector.c69
1 files changed, 28 insertions, 41 deletions
diff --git a/apps/plugins/pitch_detector.c b/apps/plugins/pitch_detector.c
index c1d0cff50a..461b8562d8 100644
--- a/apps/plugins/pitch_detector.c
+++ b/apps/plugins/pitch_detector.c
@@ -258,37 +258,29 @@ audio_sample_type audio_data[BUFFER_SIZE];
258fixed yin_buffer[YIN_BUFFER_SIZE]; 258fixed yin_buffer[YIN_BUFFER_SIZE];
259static int recording=0; 259static int recording=0;
260 260
261/* Frequencies of all the notes of the scale */ 261/* Description of a note of scale */
262static const fixed freqs[12] = 262struct note_entry
263{ 263{
264 float2fixed(440.0f), /* A */ 264 const char *name; /* Name of the note, e.g. "A#" */
265 float2fixed(466.1637615f), /* A# */ 265 const fixed freq; /* Note frequency */
266 float2fixed(493.8833013f), /* etc... */ 266 const fixed logfreq; /* log2(frequency) */
267 float2fixed(523.2511306f),
268 float2fixed(554.3652620f),
269 float2fixed(587.3295358f),
270 float2fixed(622.2539674f),
271 float2fixed(659.2551138f),
272 float2fixed(698.4564629f),
273 float2fixed(739.9888454f),
274 float2fixed(783.9908720f),
275 float2fixed(830.6093952f),
276}; 267};
277/* logarithm of all the notes of the scale */ 268
278static const fixed lfreqs[12] = 269/* Notes within one (reference) scale */
270static const struct note_entry notes[] =
279{ 271{
280 float2fixed(8.781359714f), 272 {"A" , float2fixed(440.0000000f), float2fixed(8.781359714f)},
281 float2fixed(8.864693047f), 273 {"A#", float2fixed(466.1637615f), float2fixed(8.864693047f)},
282 float2fixed(8.948026380f), 274 {"B" , float2fixed(493.8833013f), float2fixed(8.948026380f)},
283 float2fixed(9.031359714f), 275 {"C" , float2fixed(523.2511306f), float2fixed(9.031359714f)},
284 float2fixed(9.114693047f), 276 {"C#", float2fixed(554.3652620f), float2fixed(9.114693047f)},
285 float2fixed(9.198026380f), 277 {"D" , float2fixed(587.3295358f), float2fixed(9.198026380f)},
286 float2fixed(9.281359714f), 278 {"D#", float2fixed(622.2539674f), float2fixed(9.281359714f)},
287 float2fixed(9.364693047f), 279 {"E" , float2fixed(659.2551138f), float2fixed(9.364693047f)},
288 float2fixed(9.448026380f), 280 {"F" , float2fixed(698.4564629f), float2fixed(9.448026380f)},
289 float2fixed(9.531359714f), 281 {"F#", float2fixed(739.9888454f), float2fixed(9.531359714f)},
290 float2fixed(9.614693047f), 282 {"G" , float2fixed(783.9908720f), float2fixed(9.614693047f)},
291 float2fixed(9.698026380f), 283 {"G#", float2fixed(830.6093952f), float2fixed(9.698026380f)},
292}; 284};
293 285
294/* GUI */ 286/* GUI */
@@ -297,12 +289,7 @@ static int font_w,font_h;
297static int bar_x_0; 289static int bar_x_0;
298static int lbl_x_minus_50, lbl_x_minus_20, lbl_x_0, lbl_x_20, lbl_x_50; 290static int lbl_x_minus_50, lbl_x_minus_20, lbl_x_0, lbl_x_20, lbl_x_50;
299 291
300static const char *english_notes[] = {"A","A#","B","C","C#","D","D#","E", 292/* Settings for the plugin */
301 "F","F#","G","G#"};
302static const char **notes = english_notes;
303
304/*Settings for the plugin */
305
306struct tuner_settings 293struct tuner_settings
307{ 294{
308 unsigned volume_threshold; 295 unsigned volume_threshold;
@@ -747,23 +734,23 @@ void display_frequency (fixed freq)
747 /* This calculates a log freq offset for note A */ 734 /* This calculates a log freq offset for note A */
748 /* Get the frequency to within the range of our reference table, */ 735 /* Get the frequency to within the range of our reference table, */
749 /* i.e. into the right octave. */ 736 /* i.e. into the right octave. */
750 while (fp_lt(lfreq, fp_sub(lfreqs[0], fp_shr(LOG_D_NOTE, 1)))) 737 while (fp_lt(lfreq, fp_sub(notes[0].logfreq, fp_shr(LOG_D_NOTE, 1))))
751 lfreq = fp_add(lfreq, LOG_2); 738 lfreq = fp_add(lfreq, LOG_2);
752 while (fp_gte(lfreq, fp_sub(fp_add(lfreqs[0], LOG_2), 739 while (fp_gte(lfreq, fp_sub(fp_add(notes[0].logfreq, LOG_2),
753 fp_shr(LOG_D_NOTE, 1)))) 740 fp_shr(LOG_D_NOTE, 1))))
754 lfreq = fp_sub(lfreq, LOG_2); 741 lfreq = fp_sub(lfreq, LOG_2);
755 mldf = LOG_D_NOTE; 742 mldf = LOG_D_NOTE;
756 for (i=0; i<12; i++) 743 for (i=0; i<12; i++)
757 { 744 {
758 ldf = fp_gt(fp_sub(lfreq,lfreqs[i]), FP_ZERO) ? 745 ldf = fp_gt(fp_sub(lfreq,notes[i].logfreq), FP_ZERO) ?
759 fp_sub(lfreq,lfreqs[i]) : fp_neg(fp_sub(lfreq,lfreqs[i])); 746 fp_sub(lfreq,notes[i].logfreq) : fp_neg(fp_sub(lfreq,notes[i].logfreq));
760 if (fp_lt(ldf, mldf)) 747 if (fp_lt(ldf, mldf))
761 { 748 {
762 mldf = ldf; 749 mldf = ldf;
763 note = i; 750 note = i;
764 } 751 }
765 } 752 }
766 nfreq = freqs[note]; 753 nfreq = notes[note].freq;
767 while (fp_gt(fp_div(nfreq, freq), D_NOTE_SQRT)) 754 while (fp_gt(fp_div(nfreq, freq), D_NOTE_SQRT))
768 nfreq = fp_shr(nfreq, 1); 755 nfreq = fp_shr(nfreq, 1);
769 while (fp_gt(fp_div(freq, nfreq), D_NOTE_SQRT)) 756 while (fp_gt(fp_div(freq, nfreq), D_NOTE_SQRT))
@@ -777,11 +764,11 @@ void display_frequency (fixed freq)
777 draw_bar(ldf); /* The red bar */ 764 draw_bar(ldf); /* The red bar */
778 if(fp_round(freq) != 0) 765 if(fp_round(freq) != 0)
779 { 766 {
780 draw_note(notes[note]); 767 draw_note(notes[note].name);
781 if(tuner_settings.display_hz) 768 if(tuner_settings.display_hz)
782 { 769 {
783 rb->snprintf(str_buf,30, "%s : %d cents (%d.%02dHz)", 770 rb->snprintf(str_buf,30, "%s : %d cents (%d.%02dHz)",
784 notes[note], fp_round(ldf) ,fixed2int(orig_freq), 771 notes[note].name, fp_round(ldf) ,fixed2int(orig_freq),
785 fp_round(fp_mul(fp_frac(orig_freq), 772 fp_round(fp_mul(fp_frac(orig_freq),
786 int2fixed(DISPLAY_HZ_PRECISION)))); 773 int2fixed(DISPLAY_HZ_PRECISION))));
787 print_str(str_buf); 774 print_str(str_buf);