From 1671959cea25dbc4b94e2326b44b8e36680129b6 Mon Sep 17 00:00:00 2001 From: petern Date: Wed, 22 Jul 2009 09:58:01 +0000 Subject: [PATCH] -Change: Classify UI a bit. -Add: edit modes, and ability to edit the bpm. git-svn-id: http://svn.fuzzle.org/mloop/trunk@15 ba049829-c6ef-42ef-81ac-908dd8d2e907 --- src/ui.cpp | 130 ++++++++++++++++++++++++++++++++++++----------------- src/ui.h | 15 +++++++ 2 files changed, 103 insertions(+), 42 deletions(-) diff --git a/src/ui.cpp b/src/ui.cpp index b1d268a..682db45 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -54,41 +54,51 @@ int getch() } */ -int bpm = 120; int color_map[4]; char status[1024]; -bool quantise = false; + +UI::UI() +{ + set_conio_terminal_mode(); + + initscr(); + noecho(); + nonl(); + + intrflush(stdscr, false); + keypad(stdscr, true); + nodelay(stdscr, true); + raw(); + + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + init_pair(2, COLOR_BLACK, COLOR_CYAN); + init_pair(3, COLOR_YELLOW, COLOR_RED); + + for (int i = 0; i < 4; i++) { + color_map[i] = COLOR_PAIR(i); + } + + snprintf(status, sizeof status, "..."); + + m_loop = 0; + m_bpm = 120; + m_quantise = false; + m_edit_mode = EM_LOOPS; + m_edit_timer = 0; +} + +UI::~UI() +{ + endwin(); + reset_terminal_mode(); +} bool UI::Run(Jack &j) { char buf[1024]; - static bool first = true; - if (first) { - set_conio_terminal_mode(); - first = false; - m_loop = 0; - initscr(); - noecho(); - nonl(); - intrflush(stdscr, false); - keypad(stdscr, true); - nodelay(stdscr, true); - raw(); - - start_color(); - init_pair(1, COLOR_WHITE, COLOR_BLUE); - init_pair(2, COLOR_BLACK, COLOR_CYAN); - init_pair(3, COLOR_YELLOW, COLOR_RED); - - for (int i = 0; i < 4; i++) { - color_map[i] = COLOR_PAIR(i); - } - - snprintf(status, sizeof status, "..."); - } - - snprintf(buf, sizeof buf, " mloop -- %d bpm", bpm); + snprintf(buf, sizeof buf, " mloop -- %d bpm", m_bpm); bkgdset(color_map[1]); attrset(color_map[1]); mvaddstr(0, 0, buf); @@ -101,7 +111,7 @@ bool UI::Run(Jack &j) bkgdset(color_map[0]); attrset(color_map[0]); - snprintf(buf, sizeof buf, " [ ] %2d: Position: %0.2f beats (%0.2fs) Length: %0.2f beats (%0.2fs)", i, bpm * j.LoopPosition(i) / 60.0, j.LoopPosition(i), bpm * j.LoopLength(i) / 60.0, j.LoopLength(i)); + snprintf(buf, sizeof buf, " [ ] %2d: Position: %0.2f beats (%0.2fs) Length: %0.2f beats (%0.2fs)", i, m_bpm * j.LoopPosition(i) / 60.0, j.LoopPosition(i), m_bpm * j.LoopLength(i) / 60.0, j.LoopLength(i)); mvaddstr(i + 1, 0, buf); clrtoeol(); @@ -114,12 +124,14 @@ bool UI::Run(Jack &j) case LS_RECORDING: c = "R"; break; } - bkgdset(color_map[m_loop == i ? 2 : k]); - attrset(color_map[m_loop == i ? 2 : k]); + bkgdset(color_map[(m_loop == i && m_edit_mode == EM_LOOPS) ? 2 : k]); + attrset(color_map[(m_loop == i && m_edit_mode == EM_LOOPS) ? 2 : k]); mvaddstr(i + 1, 2, c); } + if (m_edit_timer > 0) m_edit_timer--; + if (!kbhit()) { refresh(); return false; @@ -129,12 +141,10 @@ bool UI::Run(Jack &j) switch (c) { case 3: - endwin(); - reset_terminal_mode(); return true; case 'r': - j.ToggleRecording(m_loop, quantise ? bpm : 0); + j.ToggleRecording(m_loop, m_quantise ? m_bpm : 0); if (j.Recording()) { snprintf(status, sizeof status, "Start recording loop %d", m_loop); } else { @@ -152,8 +162,17 @@ bool UI::Run(Jack &j) case '7': case '8': case '9': - m_loop = (c - '0'); - snprintf(status, sizeof status, "Selected loop %d", m_loop); + if (m_edit_mode == EM_BPM) { + if (m_edit_timer <= 0) { + m_bpm = 0; + } + m_bpm *= 10; + m_bpm += (c - '0'); + m_edit_timer = EDIT_TIMER_RESET; + } else { + m_loop = (c - '0'); + snprintf(status, sizeof status, "Selected loop %d", m_loop); + } break; case 'z': @@ -173,18 +192,45 @@ bool UI::Run(Jack &j) break; case 'q': - quantise = !quantise; - snprintf(status, sizeof status, "Set quantise %s", quantise ? "on" : "off"); + m_quantise = !m_quantise; + snprintf(status, sizeof status, "Set quantise %s", m_quantise ? "on" : "off"); + break; + + case 'b': + if (m_edit_mode == EM_BPM) { + m_edit_mode = EM_LOOPS; + } else { + m_edit_mode = EM_BPM; + } + break; + + case '\r': + m_edit_mode = EM_LOOPS; break; case KEY_UP: - m_loop--; - if (m_loop == -1) m_loop = NUM_LOOPS - 1; + if (m_edit_mode == EM_BPM) { + m_bpm++; + } else { + m_loop--; + if (m_loop == -1) m_loop = NUM_LOOPS - 1; + } break; case KEY_DOWN: - m_loop++; - if (m_loop == NUM_LOOPS) m_loop = 0; + if (m_edit_mode == EM_BPM) { + m_bpm--; + } else { + m_loop++; + if (m_loop == NUM_LOOPS) m_loop = 0; + } + break; + + case KEY_BACKSPACE: + if (m_edit_mode == EM_BPM) { + m_bpm /= 10; + m_edit_timer = EDIT_TIMER_RESET; + } break; } diff --git a/src/ui.h b/src/ui.h index b6acb55..a0aedce 100644 --- a/src/ui.h +++ b/src/ui.h @@ -3,11 +3,26 @@ #ifndef UI_H #define UI_H +#define EDIT_TIMER_RESET 200 + +enum EditMode { + EM_LOOPS, + EM_BPM, +}; + class UI { private: int m_loop; + int m_bpm; + bool m_quantise; + + EditMode m_edit_mode; + int m_edit_timer; public: + UI(); + ~UI(); + bool Run(Jack &j); };