summaryrefslogtreecommitdiff
path: root/engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'engine.c')
-rw-r--r--engine.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/engine.c b/engine.c
index d9b35f7..82f1355 100644
--- a/engine.c
+++ b/engine.c
@@ -8,6 +8,7 @@
8#include "midi.h" 8#include "midi.h"
9 9
10static int g_selected_string = -1; 10static int g_selected_string = -1;
11static int g_normalize_mode = 0;
11 12
12#ifndef NO_DISPLAY 13#ifndef NO_DISPLAY
13#include "display.h" 14#include "display.h"
@@ -19,6 +20,13 @@ static ConfigSelect g_selected_config;
19static void highlight_line(int value, int y, int max_x, uint32_t color); 20static void highlight_line(int value, int y, int max_x, uint32_t color);
20 21
21#define scale(X) display_scale_harfe_to_screen(X) 22#define scale(X) display_scale_harfe_to_screen(X)
23static int64_t
24engine_normalize(int height, int y)
25{
26 int64_t yf = (y << 16) / height;
27 yf = (((yf * yf - (yf << 16)) * ((int64_t)g_normalize_factor))) + (yf << 32);
28 return (((int64_t)height) * yf) >> 32;
29}
22 30
23void 31void
24engine_redraw() 32engine_redraw()
@@ -28,6 +36,7 @@ engine_redraw()
28 const int tos1 = g_midi_three_octave_split_1, tos2 = g_midi_three_octave_split_2; 36 const int tos1 = g_midi_three_octave_split_1, tos2 = g_midi_three_octave_split_2;
29 const int height = g_max_y - g_min_y; 37 const int height = g_max_y - g_min_y;
30 int i, x2, MAX_X, MAX_Y, FONT_HEIGHT; 38 int i, x2, MAX_X, MAX_Y, FONT_HEIGHT;
39 int t1 = 0, t2 = 0, t3 = 0;
31 40
32 display_redraw(); 41 display_redraw();
33 display_clear(); 42 display_clear();
@@ -47,6 +56,35 @@ engine_redraw()
47 display_text( " 0", 4, scale(g_min_y + (tos1 + tos2) * height / 200) + FONT_HEIGHT / 2, 0x007f7f7fff); 56 display_text( " 0", 4, scale(g_min_y + (tos1 + tos2) * height / 200) + FONT_HEIGHT / 2, 0x007f7f7fff);
48 display_text( b ? "-1" : "+1", 4, scale(g_min_y + (tos2 / 2 + 50 ) * height / 100) + FONT_HEIGHT / 2, 0x007f7f7fff); 57 display_text( b ? "-1" : "+1", 4, scale(g_min_y + (tos2 / 2 + 50 ) * height / 100) + FONT_HEIGHT / 2, 0x007f7f7fff);
49 58
59 for (int x=0; x<height; x+=20) {
60 int y = engine_normalize(height, x);
61 /*
62 int64_t xf = (x << 16) / 100;
63 int64_t yf = (((xf * xf - (xf << 16)) * ((int64_t)g_normalize_factor))) + (xf << 32);
64 int64_t yo = (((int64_t)height) * yf) >> 48;
65
66 double xf = ((double)x) / 100.0f;
67 double yf = g_normalize_factor * (xf*xf-xf) + xf;
68 y = ax^2 + x - ax = a * (x^2 - x) + x
69 int y = scale(g_min_y + (int)(((double)height) * yf));
70 */
71
72 display_line_color(0, scale(g_min_y + (y>>16)), MAX_X, scale(g_min_y + (y>>16)), 0x1f1f1f1f);
73 if (y >> 16 > (tos2 * height) / 100 )
74 t1++;
75 else if (y >> 16 > (tos1 * height) / 100 )
76 t2++;
77 else
78 t3++;
79 }
80
81 if (g_normalize_mode) {
82 sprintf(text, "%lf", g_normalize_factor / 65336.0f);
83 display_text(text, 8, MAX_Y - 32, 0xff003fff );
84 sprintf(text, "%d %d %d", t1, t2, t3);
85 display_text(text, 8, MAX_Y - 64, 0xff003fff );
86 }
87
50 display_line_color(0, scale(g_min_y), MAX_X, scale(g_min_y), 0xff00ffff); 88 display_line_color(0, scale(g_min_y), MAX_X, scale(g_min_y), 0xff00ffff);
51 display_line_color(0, scale(g_max_y), MAX_X, scale(g_max_y), 0xff00ffff); 89 display_line_color(0, scale(g_max_y), MAX_X, scale(g_max_y), 0xff00ffff);
52#ifdef HAVE_TWO_OCTAVE_MODE 90#ifdef HAVE_TWO_OCTAVE_MODE
@@ -146,6 +184,19 @@ engine_select_config(ConfigSelect sel) {
146 g_selected_config = sel; 184 g_selected_config = sel;
147} 185}
148 186
187void
188engine_toggle_normalize_mode() {
189 if (g_normalize_mode)
190 g_config_source = source_edit;
191 g_normalize_mode = 1 - g_normalize_mode;
192}
193
194void
195engine_mouse_y(int y) {
196 if (g_normalize_mode)
197 g_normalize_factor = y;
198}
199
149ConfigSelect 200ConfigSelect
150engine_change_selected(int off) 201engine_change_selected(int off)
151{ 202{