From ed5ec5c193630c230e4a4d3a1a8b0f218381511b Mon Sep 17 00:00:00 2001 From: erdgeist Date: Mon, 16 Apr 2018 15:37:20 +0200 Subject: Add normalizing and pitch bending delay code --- config.c | 18 ++++++++++++++++++ config.h | 9 ++++++--- engine.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ engine.h | 2 ++ main-sdl.c | 17 ++++++++++++++++- 5 files changed, 93 insertions(+), 4 deletions(-) diff --git a/config.c b/config.c index 7467e8e..9e47044 100644 --- a/config.c +++ b/config.c @@ -14,8 +14,10 @@ int g_midi_three_octave_split_2 = 66; int g_midi_three_octave_split_inverse = 0; int g_settled_dist = 5; int g_timetosilence = 30; +int g_pitchbend_delay = 500; int g_min_y = 0, g_max_y; +int g_normalize_factor = 0; static int g_current_string; StringConfig @@ -43,6 +45,7 @@ config_reset() g_midi_three_octave_split_inverse = 0; g_settled_dist = 5; g_timetosilence = 30; + g_pitchbend_delay = 500; g_config_source = source_none; } @@ -74,6 +77,8 @@ enum { KEYWORD_STRINGS, KEYWORD_STRING, KEYWORD_LINE, + KEYWORD_LINEARIZE, + KEYWORD_PITCHBEND_DELAY, KEYWORD_MODE, KEYWORD_MODE_ONE_OCTAVE, KEYWORD_MODE_TWO_OCTAVES, @@ -108,6 +113,8 @@ static keyword keywords[] = { {KEYWORD_STRINGS, "Strings"}, {KEYWORD_STRING, "String"}, {KEYWORD_LINE, "Line"}, + {KEYWORD_LINEARIZE, "LineSquareFactor"}, + {KEYWORD_PITCHBEND_DELAY, "PitchBendDelay"}, {KEYWORD_MODE, "Mode"}, {KEYWORD_MODE_ONE_OCTAVE, "midi_one_octave"}, {KEYWORD_MODE_TWO_OCTAVES, "midi_two_octaves"}, @@ -208,6 +215,12 @@ config_handle_line(char *line) return -1; } break; + case KEYWORD_LINEARIZE: + g_normalize_factor = atol(line); + break; + case KEYWORD_PITCHBEND_DELAY: + g_pitchbend_delay = atol(line); + break; case KEYWORD_LINE: { LLine *l = &sc->line; @@ -394,6 +407,11 @@ config_dumpglobals(char *out, size_t outsize) off += snprintf(out + off, outsize - off, "midi_main_channel %d\n\n", g_midi_main_channel); + off += snprintf(out + off, outsize - off, + "LineSquareFactor %d\n\n", g_normalize_factor); + off += snprintf(out + off, outsize - off, + "PitchBendDelay %d\n\n", g_pitchbend_delay); + if (g_settled_dist != 5) off += snprintf(out + off, outsize - off, "SettledDist %d\n\n", g_settled_dist); diff --git a/config.h b/config.h index ed3f56c..25b9e0d 100644 --- a/config.h +++ b/config.h @@ -17,6 +17,8 @@ extern int g_midi_main_control; extern int g_midi_main_channel; extern int g_settled_dist; extern int g_timetosilence; +extern int g_pitchbend_delay; +extern int g_normalize_factor; typedef enum { midi_one_octave = 0, @@ -35,9 +37,10 @@ typedef enum { } StringModifier; typedef enum { - silent = 0, - in_attack = 1, - playing = 2 + string_is_silent = 0, + string_is_in_attack = 1, + string_is_playing = 2, + string_is_bending = 3 } StringPlaying; typedef enum { diff --git a/engine.c b/engine.c index d9b35f7..82f1355 100644 --- a/engine.c +++ b/engine.c @@ -8,6 +8,7 @@ #include "midi.h" static int g_selected_string = -1; +static int g_normalize_mode = 0; #ifndef NO_DISPLAY #include "display.h" @@ -19,6 +20,13 @@ static ConfigSelect g_selected_config; static void highlight_line(int value, int y, int max_x, uint32_t color); #define scale(X) display_scale_harfe_to_screen(X) +static int64_t +engine_normalize(int height, int y) +{ + int64_t yf = (y << 16) / height; + yf = (((yf * yf - (yf << 16)) * ((int64_t)g_normalize_factor))) + (yf << 32); + return (((int64_t)height) * yf) >> 32; +} void engine_redraw() @@ -28,6 +36,7 @@ engine_redraw() const int tos1 = g_midi_three_octave_split_1, tos2 = g_midi_three_octave_split_2; const int height = g_max_y - g_min_y; int i, x2, MAX_X, MAX_Y, FONT_HEIGHT; + int t1 = 0, t2 = 0, t3 = 0; display_redraw(); display_clear(); @@ -47,6 +56,35 @@ engine_redraw() display_text( " 0", 4, scale(g_min_y + (tos1 + tos2) * height / 200) + FONT_HEIGHT / 2, 0x007f7f7fff); display_text( b ? "-1" : "+1", 4, scale(g_min_y + (tos2 / 2 + 50 ) * height / 100) + FONT_HEIGHT / 2, 0x007f7f7fff); + for (int x=0; x> 48; + + double xf = ((double)x) / 100.0f; + double yf = g_normalize_factor * (xf*xf-xf) + xf; + y = ax^2 + x - ax = a * (x^2 - x) + x + int y = scale(g_min_y + (int)(((double)height) * yf)); + */ + + display_line_color(0, scale(g_min_y + (y>>16)), MAX_X, scale(g_min_y + (y>>16)), 0x1f1f1f1f); + if (y >> 16 > (tos2 * height) / 100 ) + t1++; + else if (y >> 16 > (tos1 * height) / 100 ) + t2++; + else + t3++; + } + + if (g_normalize_mode) { + sprintf(text, "%lf", g_normalize_factor / 65336.0f); + display_text(text, 8, MAX_Y - 32, 0xff003fff ); + sprintf(text, "%d %d %d", t1, t2, t3); + display_text(text, 8, MAX_Y - 64, 0xff003fff ); + } + display_line_color(0, scale(g_min_y), MAX_X, scale(g_min_y), 0xff00ffff); display_line_color(0, scale(g_max_y), MAX_X, scale(g_max_y), 0xff00ffff); #ifdef HAVE_TWO_OCTAVE_MODE @@ -146,6 +184,19 @@ engine_select_config(ConfigSelect sel) { g_selected_config = sel; } +void +engine_toggle_normalize_mode() { + if (g_normalize_mode) + g_config_source = source_edit; + g_normalize_mode = 1 - g_normalize_mode; +} + +void +engine_mouse_y(int y) { + if (g_normalize_mode) + g_normalize_factor = y; +} + ConfigSelect engine_change_selected(int off) { diff --git a/engine.h b/engine.h index 2d47dc7..6974d51 100644 --- a/engine.h +++ b/engine.h @@ -7,6 +7,8 @@ void engine_redraw(); void engine_handle_point(LPoint * p, uint32_t monotime); void engine_checksilence(uint32_t monotime); void engine_select_config(ConfigSelect sel); +void engine_toggle_normalize_mode(); +void engine_mouse_y(int y); ConfigSelect engine_change_selected(int off); extern int g_harfe_width, g_harfe_height; diff --git a/main-sdl.c b/main-sdl.c index b61806b..2ac648c 100644 --- a/main-sdl.c +++ b/main-sdl.c @@ -34,7 +34,8 @@ enum { int g_harfe_connected = 0; int g_harfe_fd = -1; -static int g_up_pressed = 0, g_down_pressed = 0; +static int g_up_pressed, g_down_pressed, g_mouse_down; +static LPoint g_last_mouse; static char * find_harfe() @@ -387,6 +388,12 @@ handle_keydown(SDL_Event *ev) { write(g_harfe_fd, "ME20020\nM824C00\n", 16); } break; + case SDL_SCANCODE_N: + engine_toggle_normalize_mode(); + break; + case SDL_SCANCODE_P: + config_flip_pitch(); + break; case SDL_SCANCODE_Q: config_reset(); break; @@ -472,6 +479,8 @@ main(int argc, char **argv) if (ev.motion.state & SDL_BUTTON_LMASK) { LPoint p = { display_scale_screen_to_harfe(ev.motion.x), 768 - display_scale_screen_to_harfe(ev.motion.y) }; engine_handle_point(&p, now()); + g_last_mouse = p; + engine_mouse_y((65336 * (SCREEN_HEIGHT-ev.motion.y))/ SCREEN_HEIGHT); } break; case SDL_MOUSEBUTTONDOWN: @@ -479,12 +488,15 @@ main(int argc, char **argv) LPoint p = { display_scale_screen_to_harfe(ev.button.x), 768 - display_scale_screen_to_harfe(ev.button.y) }; if (menu_test_mouse_down(ev.button.x, ev.button.y)) engine_handle_point(&p, now()); + g_last_mouse = p; + g_mouse_down = 1; } break; case SDL_MOUSEBUTTONUP: { LPoint p = { display_scale_screen_to_harfe(ev.button.x), 768 - display_scale_screen_to_harfe(ev.button.y) }; menu_handle_button_up(ev.button.x, ev.button.y); + g_mouse_down = 0; } break; @@ -502,6 +514,9 @@ main(int argc, char **argv) break; } + if (g_mouse_down) + engine_handle_point(&g_last_mouse, now()); + if (!g_calibration_running || !g_importing_config) engine_checksilence(now()); -- cgit v1.2.3