]> git.sesse.net Git - pitch/blob - glpitch.cpp
a3c301051046fe2466b3bb5a7a45a234a905703d
[pitch] / glpitch.cpp
1 #include <SDL.h>
2 #include <GL/gl.h>
3
4 #include "config.h"
5 #include "linux_audio.h"
6 #include "notes.h"
7 #include "pitchdetector.h"
8
9 #define MIN_X -40
10 #define MAX_X 5
11
12 double find_pos(double freq)
13 {
14         return 12.0 * log2(freq / BASE_PITCH) - 3.0;
15 }
16
17 int main(void)
18 {
19         PitchDetector pd(SAMPLE_RATE, FFT_LENGTH, PAD_FACTOR, OVERLAP);
20         int fd = get_dsp_fd(SAMPLE_RATE, FFT_LENGTH, OVERLAP);
21
22         SDL_Init(SDL_INIT_VIDEO);
23         SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
24         SDL_SetVideoMode(1024, 200, 32, SDL_OPENGL);
25
26         glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
27         glClear(GL_COLOR_BUFFER_BIT);
28
29         for ( ;; ) {
30                 SDL_Event event;
31                 while (SDL_PollEvent(&event)) {
32                         switch (event.type) {
33                         case SDL_KEYUP:
34                                 if (event.key.keysym.sym == SDLK_ESCAPE) {
35                                         exit(0);
36                                 }
37                                 break;
38                         case SDL_QUIT:
39                                 exit(0);
40                         }
41                 }
42
43                 short buf[FFT_LENGTH / PAD_FACTOR / OVERLAP];
44                 read_chunk(fd, buf, FFT_LENGTH / PAD_FACTOR / OVERLAP);
45                 std::pair<double, double> peak = pd.detect_pitch(buf);
46
47                 glMatrixMode(GL_PROJECTION);
48                 glLoadIdentity();
49                 glOrtho(MIN_X, MAX_X, 1.0f, 0.0f, 0.0f, 1.0f);
50
51                 glMatrixMode(GL_MODELVIEW);
52                 glLoadIdentity();
53
54                 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
55                 glEnable(GL_BLEND); 
56
57                 glBegin(GL_QUADS);      
58                 glColor4f(0.0, 0.0f, 0.0f, 0.05f);
59                 glVertex2f(MIN_X, 0.0f);
60                 glVertex2f(MIN_X, 1.0f);
61                 glVertex2f(MAX_X, 1.0f);
62                 glVertex2f(MAX_X, 0.0f);
63                 glEnd();
64
65                 if (peak.second - log10(FFT_LENGTH) >= 0.0) {
66                         double peak_pos = find_pos(peak.first);
67
68                         glBlendFunc(GL_SRC_ALPHA, GL_ONE);
69                         glBegin(GL_QUADS);      
70                         glColor4f(0.0, 1.0f, 0.0f, 0.2f);
71                         glVertex2f(peak_pos - 0.1, 0.0f);
72                         glVertex2f(peak_pos - 0.1, 1.0f);
73                         glVertex2f(peak_pos + 0.1, 1.0f);
74                         glVertex2f(peak_pos + 0.1, 0.0f);
75                         glEnd();
76                 }
77
78                 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
79                 glBegin(GL_LINES);
80
81                 for (int i = 0; i < 6; ++i) {
82                         double pos = find_pos(notes[i].freq);
83                         glVertex2f(pos, 0.0f);
84                         glVertex2f(pos, 1.0f);
85                 }
86                 glEnd();
87
88                 SDL_GL_SwapBuffers();
89         }
90 }