-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-908dd8d2e907master
parent
070414d450
commit
1671959cea
130
src/ui.cpp
130
src/ui.cpp
|
@ -54,41 +54,51 @@ int getch()
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int bpm = 120;
|
|
||||||
int color_map[4];
|
int color_map[4];
|
||||||
char status[1024];
|
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)
|
bool UI::Run(Jack &j)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
static bool first = true;
|
|
||||||
if (first) {
|
|
||||||
set_conio_terminal_mode();
|
|
||||||
first = false;
|
|
||||||
m_loop = 0;
|
|
||||||
|
|
||||||
initscr();
|
snprintf(buf, sizeof buf, " mloop -- %d bpm", m_bpm);
|
||||||
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);
|
|
||||||
bkgdset(color_map[1]);
|
bkgdset(color_map[1]);
|
||||||
attrset(color_map[1]);
|
attrset(color_map[1]);
|
||||||
mvaddstr(0, 0, buf);
|
mvaddstr(0, 0, buf);
|
||||||
|
@ -101,7 +111,7 @@ bool UI::Run(Jack &j)
|
||||||
bkgdset(color_map[0]);
|
bkgdset(color_map[0]);
|
||||||
attrset(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);
|
mvaddstr(i + 1, 0, buf);
|
||||||
clrtoeol();
|
clrtoeol();
|
||||||
|
|
||||||
|
@ -114,12 +124,14 @@ bool UI::Run(Jack &j)
|
||||||
case LS_RECORDING: c = "R"; break;
|
case LS_RECORDING: c = "R"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bkgdset(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 ? 2 : k]);
|
attrset(color_map[(m_loop == i && m_edit_mode == EM_LOOPS) ? 2 : k]);
|
||||||
|
|
||||||
mvaddstr(i + 1, 2, c);
|
mvaddstr(i + 1, 2, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_edit_timer > 0) m_edit_timer--;
|
||||||
|
|
||||||
if (!kbhit()) {
|
if (!kbhit()) {
|
||||||
refresh();
|
refresh();
|
||||||
return false;
|
return false;
|
||||||
|
@ -129,12 +141,10 @@ bool UI::Run(Jack &j)
|
||||||
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 3:
|
case 3:
|
||||||
endwin();
|
|
||||||
reset_terminal_mode();
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
j.ToggleRecording(m_loop, quantise ? bpm : 0);
|
j.ToggleRecording(m_loop, m_quantise ? m_bpm : 0);
|
||||||
if (j.Recording()) {
|
if (j.Recording()) {
|
||||||
snprintf(status, sizeof status, "Start recording loop %d", m_loop);
|
snprintf(status, sizeof status, "Start recording loop %d", m_loop);
|
||||||
} else {
|
} else {
|
||||||
|
@ -152,8 +162,17 @@ bool UI::Run(Jack &j)
|
||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
m_loop = (c - '0');
|
if (m_edit_mode == EM_BPM) {
|
||||||
snprintf(status, sizeof status, "Selected loop %d", m_loop);
|
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;
|
break;
|
||||||
|
|
||||||
case 'z':
|
case 'z':
|
||||||
|
@ -173,18 +192,45 @@ bool UI::Run(Jack &j)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'q':
|
case 'q':
|
||||||
quantise = !quantise;
|
m_quantise = !m_quantise;
|
||||||
snprintf(status, sizeof status, "Set quantise %s", quantise ? "on" : "off");
|
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;
|
break;
|
||||||
|
|
||||||
case KEY_UP:
|
case KEY_UP:
|
||||||
m_loop--;
|
if (m_edit_mode == EM_BPM) {
|
||||||
if (m_loop == -1) m_loop = NUM_LOOPS - 1;
|
m_bpm++;
|
||||||
|
} else {
|
||||||
|
m_loop--;
|
||||||
|
if (m_loop == -1) m_loop = NUM_LOOPS - 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KEY_DOWN:
|
case KEY_DOWN:
|
||||||
m_loop++;
|
if (m_edit_mode == EM_BPM) {
|
||||||
if (m_loop == NUM_LOOPS) m_loop = 0;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
15
src/ui.h
15
src/ui.h
|
@ -3,11 +3,26 @@
|
||||||
#ifndef UI_H
|
#ifndef UI_H
|
||||||
#define UI_H
|
#define UI_H
|
||||||
|
|
||||||
|
#define EDIT_TIMER_RESET 200
|
||||||
|
|
||||||
|
enum EditMode {
|
||||||
|
EM_LOOPS,
|
||||||
|
EM_BPM,
|
||||||
|
};
|
||||||
|
|
||||||
class UI {
|
class UI {
|
||||||
private:
|
private:
|
||||||
int m_loop;
|
int m_loop;
|
||||||
|
int m_bpm;
|
||||||
|
bool m_quantise;
|
||||||
|
|
||||||
|
EditMode m_edit_mode;
|
||||||
|
int m_edit_timer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
UI();
|
||||||
|
~UI();
|
||||||
|
|
||||||
bool Run(Jack &j);
|
bool Run(Jack &j);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue