-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
master
petern 2009-07-22 09:58:01 +00:00
parent 070414d450
commit 1671959cea
2 changed files with 103 additions and 42 deletions

View File

@ -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;
}

View File

@ -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);
};