Index: apps/plugins/CATEGORIES =================================================================== --- apps/plugins/CATEGORIES (revision 20853) +++ apps/plugins/CATEGORIES (working copy) @@ -1,6 +1,7 @@ alpine_cdc,apps autostart,apps battery_bench,apps +beatbox,apps blackjack,games bounce,demos brickmania,games Index: apps/plugins/SUBDIRS =================================================================== --- apps/plugins/SUBDIRS (revision 20853) +++ apps/plugins/SUBDIRS (working copy) @@ -43,7 +43,7 @@ /* For all the swcodec targets */ #if CONFIG_CODEC == SWCODEC midi -/* beatbox */ +beatbox #ifndef RB_PROFILE mpegplayer #endif Index: apps/plugins/viewers.config =================================================================== --- apps/plugins/viewers.config (revision 20853) +++ apps/plugins/viewers.config (working copy) @@ -1,4 +1,5 @@ ch8,viewers/chip8,0 +bpf,apps/beatbox,0 txt,viewers/viewer,1 nfo,viewers/viewer,1 txt,apps/text_editor,2 @@ -14,7 +15,7 @@ gbc,viewers/rockboy,6 sgb,viewers/rockboy,6 m3u,viewers/iriverify,- -mid,viewers/midi,7 +mid,viewers/midi,7 rmi,viewers/midi,7 rsp,viewers/searchengine,8 sok,games/sokoban,1 Index: apps/plugins/beatbox/beatbox.make =================================================================== --- apps/plugins/beatbox/beatbox.make (revision 0) +++ apps/plugins/beatbox/beatbox.make (revision 0) @@ -0,0 +1,20 @@ +# __________ __ ___. +# Open \______ \ ____ ____ | | _\_ |__ _______ ___ +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +# \/ \/ \/ \/ \/ +# + +BEATBOXSRCDIR := $(APPSDIR)/plugins/beatbox +BEATBOXBUILDDIR := $(BUILDDIR)/apps/plugins/beatbox + +ROCKS += $(BEATBOXBUILDDIR)/beatbox.rock + +BEATBOX_SRC := $(call preprocess, $(BEATBOXSRCDIR)/SOURCES) +BEATBOX_OBJ := $(call c2obj, $(BEATBOX_SRC)) + +# add source files to OTHER_SRC to get automatic dependencies +OTHER_SRC += $(BEATBOX_SRC) + +$(BEATBOXBUILDDIR)/beatbox.rock: $(BEATBOX_OBJ) Property changes on: apps/plugins/beatbox/beatbox.make ___________________________________________________________________ Added: svn:executable + * Index: apps/plugins/beatbox/SOURCES =================================================================== --- apps/plugins/beatbox/SOURCES (revision 20853) +++ apps/plugins/beatbox/SOURCES (working copy) @@ -3,4 +3,4 @@ ../midi/sequencer.c ../midi/guspat.c ../midi/synth.c -beatbox.c \ No newline at end of file +beatbox.c Index: apps/plugins/beatbox/beatbox.c =================================================================== --- apps/plugins/beatbox/beatbox.c (revision 20853) +++ apps/plugins/beatbox/beatbox.c (working copy) @@ -19,94 +19,178 @@ ****************************************************************************/ #include "plugin.h" -#include "midi/guspat.h" -#include "midi/midiutil.h" -#include "midi/synth.h" -#include "midi/sequencer.h" -#include "midi/midifile.h" +#include "../midi/guspat.h" +#include "../midi/midiutil.h" +#include "../midi/synth.h" +#include "../midi/sequencer.h" +#include "../midi/midifile.h" PLUGIN_HEADER PLUGIN_IRAM_DECLARE -/* variable button definitions */ -#if CONFIG_KEYPAD == RECORDER_PAD -#define BTN_QUIT BUTTON_OFF -#define BTN_RIGHT BUTTON_RIGHT -#define BTN_UP BUTTON_UP -#define BTN_DOWN BUTTON_DOWN +/*------------------------------------------------------------------------------ + insanepotato's magical button guess-mapper thing. =D + This will try automatically define keymappings. The mappings defined + by this can be overridden (for comfort or other reasons) bellow. + An example partial mapping overide is done bellow (c200 override) +------------------------------------------------------------------------------*/ +/* attempt to set the directional buttons */ +#ifdef BUTTON_UP + #define BEATBOX_UP BUTTON_UP +#else + #warning No key mapping: no up button +#endif -#elif CONFIG_KEYPAD == ONDIO_PAD -#define BTN_QUIT BUTTON_OFF -#define BTN_RIGHT BUTTON_RIGHT -#define BTN_UP BUTTON_UP -#define BTN_DOWN BUTTON_DOWN +#ifdef BUTTON_DOWN + #define BEATBOX_DOWN BUTTON_DOWN +#else + #warning No key mapping: no down button +#endif -#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD) -#define BTN_QUIT BUTTON_OFF -#define BTN_RIGHT BUTTON_RIGHT -#define BTN_UP BUTTON_UP -#define BTN_DOWN BUTTON_DOWN +#ifdef BUTTON_LEFT + #define BEATBOX_LEFT BUTTON_LEFT +#else + #warning No key mapping: no left button +#endif -#define BTN_RC_QUIT BUTTON_RC_STOP +#ifdef BUTTON_RIGHT + #define BEATBOX_RIGHT BUTTON_RIGHT +#else + #warning No key mapping: no right button +#endif -#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \ - (CONFIG_KEYPAD == IPOD_1G2G_PAD) -#define BTN_QUIT (BUTTON_SELECT | BUTTON_MENU) -#define BTN_RIGHT BUTTON_RIGHT -#define BTN_UP BUTTON_SCROLL_FWD -#define BTN_DOWN BUTTON_SCROLL_BACK +/* attempt to set the select button */ +/* order: select, record, playlist, menu */ +#ifdef BUTTON_SELECT + #define BEATBOX_SELECT BUTTON_SELECT +#else + #ifdef BUTTON_REC + #define BEATBOX_SELECT BUTTON_REC + #else + #ifdef BUTTON_PLAYLIST + #define BEATBOX_SELECT BUTTON_PLAYLIST + #else + #ifdef BUTTON_MENU + #define BEATBOX_SELECT MENU + #else + #warning No key mapping: no select button + #endif + #endif + #endif +#endif -#elif (CONFIG_KEYPAD == GIGABEAT_PAD) -#define BTN_QUIT BUTTON_POWER -#define BTN_RIGHT BUTTON_RIGHT -#define BTN_UP BUTTON_UP -#define BTN_DOWN BUTTON_DOWN +/* attempt to set the play button */ +/* order: play, on, vol_up, scroll_forward */ +#ifdef BUTTON_PLAY + #define BEATBOX_PLAY_PAUSE BUTTON_PLAY +#else + #ifdef BUTTON_ON + #define BEATBOX_PLAY_PAUSE BUTTON_ON + #else + #ifdef BUTTON_VOL_UP + #define BEATBOX_PLAY_PAUSE BUTTON_VOL_UP + #else + #ifdef BUTTON_SCROLL_FWD + #define BEATBOX_PLAY_PAUSE BUTTON_SCROLL_FWD + #else + #warning No key mapping: no play button + #endif + #endif + #endif +#endif -#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \ -(CONFIG_KEYPAD == SANSA_C200_PAD) -#define BTN_QUIT BUTTON_POWER -#define BTN_RIGHT BUTTON_RIGHT -#define BTN_UP BUTTON_UP -#define BTN_DOWN BUTTON_DOWN +/* attempt to set the stop button */ +/* order: stop, off, vol_down, scroll_back, home,power */ +#ifdef BUTTON_STOP + #define BEATBOX_STOP_MENU BUTTON_STOP +#else + #ifdef BUTTON_OFF + #define BEATBOX_STOP_MENU BUTTON_OFF + #else + #ifdef BUTTON_VOL_DOWN + #define BEATBOX_STOP_MENU BUTTON_VOL_DOWN + #else + #ifdef BUTTON_SCROLL_BACK + #define BEATBOX_STOP_MENU BUTTON_SCROLL_BACK + #else + #ifdef BUTTON_POWER + #define BEATBOX_STOP_MENU BUTTON_POWER + #else + #ifdef BUTTON_HOME + #define BEATBOX_STOP_MENU BUTTON_HOME + #else + #warning No key mapping: no stop button + #endif + #endif + #endif + #endif + #endif +#endif -#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD -#define BTN_QUIT BUTTON_POWER -#define BTN_RIGHT BUTTON_RIGHT -#define BTN_UP BUTTON_UP -#define BTN_DOWN BUTTON_DOWN -#elif CONFIG_KEYPAD == IRIVER_H10_PAD -#define BTN_QUIT BUTTON_POWER -#define BTN_RIGHT BUTTON_RIGHT -#define BTN_UP BUTTON_SCROLL_UP -#define BTN_DOWN BUTTON_SCROLL_DOWN +/*------------------------------------------ + Manual overides here +------------------------------------------*/ +#if (CONFIG_KEYPAD == SANSA_E200_PAD) +#define BEATBOX_UP BUTTON_SCROLL_BACK +#define BEATBOX_DOWN BUTTON_SCROLL_FWD +#define BEATBOX_PLAY_PAUSE BUTTON_UP +#define BEATBOX_STOP_MENU BUTTON_POWER -#endif +/* partial override to the c200 keypad, for more intuitive use */ +#elif (CONFIG_KEYPAD == SANSA_C200_PAD) +#define BEATBOX_PLAY_PAUSE BUTTON_REC +#define BEATBOX_STOP_MENU BUTTON_POWER +/* partial override to the h10 keypad, h10 is missing some directional btns */ +#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) +#define BEATBOX_UP BUTTON_SCROLL_UP +#define BEATBOX_DOWN BUTTON_SCROLL_DOWN +#define BEATBOX_SELECT BUTTON_REW +#define BEATBOX_STOP_MENU BUTTON_POWER +/* m3 keypad has weird pad */ +#elif CONFIG_KEYPAD == IAUDIO_M3_PAD +#define BEATBOX_LEFT BUTTON_RC_REW +#define BEATBOX_RIGHT BUTTON_RC_FF +#define BEATBOX_UP BUTTON_RC_VOL_UP +#define BEATBOX_DOWN BUTTON_RC_VOL_DOWN +#define BEATBOX_SELECT BUTTON_RC_REC +#define BEATBOX_PLAY_PAUSE BUTTON_RC_PLAY +#define BEATBOX_STOP_MENU BUTTON_RC_MENU +/* ipods */ +#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \ + (CONFIG_KEYPAD == IPOD_3G_PAD) || \ + (CONFIG_KEYPAD == IPOD_1G2G_PAD) +#define BEATBOX_UP BUTTON_SCROLL_FWD +#define BEATBOX_DOWN BUTTON_SCROLL_BACK +#define BEATBOX_SELECT BUTTON_SELECT +#define BEATBOX_PLAY_PAUSE BUTTON_PLAY +#define BEATBOX_STOP_MENU BUTTON_MENU +#endif + #define FRACTSIZE 10 #ifndef SIMULATOR #if (HW_SAMPR_CAPS & SAMPR_CAP_22) -#define SAMPLE_RATE SAMPR_22 // 44100 22050 11025 +#define SAMPLE_RATE SAMPR_22 /* 44100 22050 11025 */ #else -#define SAMPLE_RATE SAMPR_44 // 44100 22050 11025 +#define SAMPLE_RATE SAMPR_44 /* 44100 22050 11025 */ #endif -#define MAX_VOICES 20 // Note: 24 midi channels is the minimum general midi - // spec implementation +#define MAX_VOICES 20 /* Note: 24 midi channels is the minimum general midi + spec implementation */ -#else // Simulator requires 44100, and we can afford to use more voices +#else /* Simulator requires 44100, and we can afford to use more voices */ #define SAMPLE_RATE SAMPR_44 #define MAX_VOICES 48 #endif - #define BUF_SIZE 256 #define NBUF 2 @@ -118,10 +202,10 @@ struct MIDIfile * mf IBSS_ATTR; -int numberOfSamples IBSS_ATTR; +int num_samples IBSS_ATTR; long bpm IBSS_ATTR; -const unsigned char * drumNames[]={ +const unsigned char * drum_names[]={ "Bass Drum 2 ", "Bass Drum 1 ", "Side Stick ", @@ -185,36 +269,23 @@ #define STATE_PAUSED 1 #define STATE_PLAYING 2 - -#define BEATBOX_UP BUTTON_UP -#define BEATBOX_DOWN BUTTON_DOWN -#define BEATBOX_LEFT BUTTON_LEFT -#define BEATBOX_RIGHT BUTTON_RIGHT -#define BEATBOX_SELECT BUTTON_SELECT - - -#define BEATBOX_PLAY BUTTON_ON -#define BEATBOX_STOP BUTTON_OFF - - #define VAL_NONE 0 #define VAL_ENABLED 1 #define VAL_LOOP 2 #define H_NUMCELLS 24 -#define V_NUMCELLS 8 +#define V_NUMCELLS 10 /* was 8, 2 cells added: clash1 and Mute Triangle */ #define HILIGHT_NONE 0 #define HILIGHT_PLAY 1 #define HILIGHT_USER 2 -#define CELL_XSIZE 9 -#define CELL_YSIZE 9 +#define CELL_XSIZE (LCD_WIDTH/H_NUMCELLS) /* was 9 */ +#define CELL_YSIZE (LCD_HEIGHT/V_NUMCELLS) /* was 9 */ -#define GRID_XPOS 2 -#define GRID_YPOS 10 +#define GRID_XPOS 0 /* was 2 */ +#define GRID_YPOS 0 /* was 10 */ - #define COLOR_NAME_TEXT LCD_RGBPACK(0xFF,0xFF,0xFF) #define COLOR_NORMAL LCD_RGBPACK(0xFF,0xFF,0xFF) #define COLOR_PLAY LCD_RGBPACK(0xFF,0xFF,0x00) @@ -225,14 +296,21 @@ #define EDITSTATE_PATTERN 0 -int xCursor=0, yCursor=0; +int x_cursor=0, y_cursor=0; -int editState=EDITSTATE_PATTERN; +int edit_state = EDITSTATE_PATTERN; -int playState=STATE_STOPPED, stepFlag=0; +int play_state = STATE_STOPPED, step_flag=0; +int number_of_samples IBSS_ATTR; /* the number of samples in the current tick */ +int playing_time IBSS_ATTR; /* How many seconds into the file have we been playing? */ +int samples_this_second IBSS_ATTR; /* How many samples produced during this second so far? */ -enum plugin_status plugin_start(const void* parameter) +bool load_file(const void* file); /* Function defined before menu function */ +int beatboxmain(bool file_loaded); /* Function defined at end of file */ + + +enum plugin_status plugin_start(const void* file) { int retval = 0; @@ -260,10 +338,21 @@ rb->audio_set_input_source(AUDIO_SRC_PLAYBACK, SRCF_PLAYBACK); rb->audio_set_output_source(AUDIO_SRC_PLAYBACK); #endif - rb->pcm_set_frequency(SAMPLE_RATE); // 44100 22050 11025 + rb->pcm_set_frequency(SAMPLE_RATE); /* 44100 22050 11025 */ + bool file_loaded = false; + /* load file */ + if(file) + { + if(!load_file(file)) + { + file_loaded = false; + rb->splash(HZ,"Load failed ;("); + } else + file_loaded = true; + } - retval = beatboxmain(); + retval = beatboxmain(file_loaded); #ifdef RB_PROFILE rb->profstop(); @@ -289,7 +378,7 @@ { long *outptr; register int i; - static int currentSample=0; + static int current_sample=0; int synthtemp[2]; #ifndef SYNC @@ -303,129 +392,133 @@ for(i=0; ilcd_set_foreground(COLOR_NAME_TEXT); - rb->lcd_putsxy(NAME_POSX, NAME_POSY, drumNames[trackMap[trackNum]-35]); + rb->lcd_putsxy(NAME_POSX, NAME_POSY, drum_names[track_map[track_num]-35]); } -void updateDisplay() +void update_display() { int i, j; - int grayOut=0; + int gray_out=0; for(j=0; jlcd_set_foreground(COLOR_GRID); @@ -439,31 +532,31 @@ rb->lcd_update(); } -void drawCell(int i, int j) +void draw_cell(int i, int j) { - int cellX, cellY; + int cell_x, cell_y; - cellX = GRID_XPOS + CELL_XSIZE*i+1; - cellY = GRID_YPOS + CELL_YSIZE*j+1; + cell_x = GRID_XPOS + CELL_XSIZE*i+1; + cell_y = GRID_YPOS + CELL_YSIZE*j+1; rb->lcd_set_foreground(pattern[i][j].color); - rb->lcd_fillrect(cellX, cellY, CELL_XSIZE-1, CELL_YSIZE-1); + rb->lcd_fillrect(cell_x, cell_y, CELL_XSIZE-1, CELL_YSIZE-1); rb->lcd_set_foreground(0); if(pattern[i][j].val == VAL_LOOP) { - rb->lcd_drawline(cellX, cellY, cellX+CELL_XSIZE-2, cellY+CELL_YSIZE-2); + rb->lcd_drawline(cell_x, cell_y, cell_x+CELL_XSIZE-2, cell_y+CELL_YSIZE-2); } if(pattern[i][j].val == VAL_ENABLED) { - rb->lcd_fillrect(cellX+1, cellY+1, CELL_XSIZE-3, CELL_YSIZE-3); + rb->lcd_fillrect(cell_x+1, cell_y+1, CELL_XSIZE-3, CELL_YSIZE-3); } } -void redrawScreen(unsigned char force) +void redraw_screen(unsigned char force) { int i, j; @@ -471,11 +564,11 @@ { for(j=0; jopen(file, O_RDONLY); + if (fd==-1) + return false; - numberOfSamples=44100/10; + /* empty file */ + /* int used for filesize, as its HIGHLY UNLIKELY that bb patern filesize */ + /* will ever exceed the limits of an int */ + int file_size = rb->filesize(fd); + if (file_size==-1) + { + rb->close(fd); + return false; + } + + /* incomplete file */ + /* complete file is one where there is at least */ + /* H_NUMCELLS*V_NUMCELLS characters */ + if (file_size<(H_NUMCELLS*V_NUMCELLS)) + { + rb->close(fd); + return false; + } + + /* begin loading data */ + /* '!' means the line is a comment */ + /* '0' means off */ + /* '1' means on */ + /* 'L' means loop */ + char buf[80]; + int i,len,data_start; + int x=0; + int y=0; + while(rb->read_line(fd, buf, file_size)){ + len = rb->strlen(buf); + len--; + /* skip empty lines and comments */ + for(data_start=0; data_startstrcpy(filename,"/"); + rb->kbd_input(filename,MAX_PATH-4); + rb->strcat(filename, ".bpf"); + } + + /* cant open */ + int fd = rb->open(filename,O_WRONLY|O_CREAT|O_TRUNC); + if (fd==-1) + return false; + + if (!overwrite) + /* current directory may have changed */ + rb->reload_directory(); + + rb->lcd_clear_display(); + + int i,j; + for(i=0; ifdprintf(fd,"0"); + break; + case VAL_ENABLED: + rb->fdprintf(fd,"1"); + break; + case VAL_LOOP: + rb->fdprintf(fd,"L"); + break; + } + } + rb->fdprintf(fd,"\n"); + } + + rb->close(fd); + return true; +} + +/* Adapted from chopper.c =] */ +static int beatbox_menu(int menunum) +{ + int result = (menunum==0)?0:1; + int res = 0; + bool menu_quit = false; + + /*static const struct opt_items levels[2] = { + { "Normal", -1 }, + { "Steep", -1 }, + };*/ + + MENUITEM_STRINGLIST(menu,"Beatbox Menu",NULL,"Save","Clear","Resume","Quit"); + +#ifdef HAVE_LCD_COLOR + rb->lcd_set_foreground(LCD_WHITE); + rb->lcd_set_background(LCD_BLACK); +#elif LCD_DEPTH == 2 + rb->lcd_set_foreground(LCD_BLACK); + rb->lcd_set_background(LCD_WHITE); +#endif + + rb->lcd_clear_display(); + + while (!menu_quit) { + switch(rb->do_menu(&menu, &result, NULL, false)) + { + case 0: /* Save drum pattern */ + menu_quit=true; + res = -1; + if(!save_file(1)) + rb->splash(HZ,"Changes NOT saved"); + + draw_grid(); + update_display(); + redraw_screen(1); + show_drum_name(y_cursor); + break; + case 1: /* Clear drum pattern */ + menu_quit=true; + res = -1; + reset_track_data(); + draw_grid(); + update_display(); + redraw_screen(1); + show_drum_name(y_cursor); + break; + case 2: /* Resume */ + menu_quit=true; + res = -1; + draw_grid(); + update_display(); + redraw_screen(1); + show_drum_name(y_cursor); + break; + case 3: /* Quit */ + menu_quit=true; + res = PLUGIN_OK; + break; + case MENU_ATTACHED_USB: /* USB Plugged in */ + /* TODO: save a tmp pat when USB Plugged in */ + menu_quit=true; + res = PLUGIN_USB_CONNECTED; + break; + } + } +// rb->lcd_clear_display(); + return res; +} + +int beatboxmain(bool file_loaded) +{ + + num_samples=44100/10; synthbuf(); rb->pcm_play_data(&get_more, NULL, 0); rb->lcd_set_background(0x000000); rb->lcd_clear_display(); - resetPosition(); + reset_pos(); - int i, j; + if( !file_loaded ) + { + int i; - /* Start at 16 cells/loop for now. User can un-loop if more are needed */ - for(i=0; ilcd_update(); - drawGrid(); - showDrumName(yCursor); - updateDisplay(); - redrawScreen(1); - - while(!quit) { #ifndef SYNC @@ -554,13 +849,13 @@ #endif rb->yield(); - if(stepFlag) + if(step_flag) { - advancePosition(); - sendEvents(); - updateDisplay(); - redrawScreen(0); - stepFlag=0; + advance_pos(); + send_events(); + update_display(); + redraw_screen(0); + step_flag=0; } /* Prevent idle poweroff */ @@ -569,63 +864,25 @@ /* Code taken from Oscilloscope plugin */ switch(rb->button_get(false)) { - /* - case BTN_UP: - case BTN_UP | BUTTON_REPEAT: - vol = rb->global_settings->volume; - if (vol < rb->sound_max(SOUND_VOLUME)) - { - vol++; - rb->sound_set(SOUND_VOLUME, vol); - rb->global_settings->volume = vol; - } - break; - - case BTN_DOWN: - case BTN_DOWN | BUTTON_REPEAT: - vol = rb->global_settings->volume; - if (vol > rb->sound_min(SOUND_VOLUME)) - { - vol--; - rb->sound_set(SOUND_VOLUME, vol); - rb->global_settings->volume = vol; - } - break; - - case BTN_RIGHT: - { - //pressNote(9, 40, 127); - // resetPosition(); - advancePosition(); - sendEvents(); - updateDisplay(); - redrawScreen(0); - break; - } - - case BUTTON_LEFT: - { - -// isPlaying=1; - resetPosition(); - updateDisplay(); - redrawScreen(0); - //pressNote(9, 39, 127); - break; - } -*/ - case BEATBOX_UP: case BEATBOX_UP | BUTTON_REPEAT: { - if(editState == EDITSTATE_PATTERN) + if(edit_state == EDITSTATE_PATTERN) { - if(yCursor > 0) + if(y_cursor > 0) { - yCursor--; - showDrumName(yCursor); - updateDisplay(); - redrawScreen(0); + y_cursor--; + update_display(); + redraw_screen(0); + show_drum_name(y_cursor); + rb->lcd_update(); + } else + { + y_cursor = V_NUMCELLS-1; + update_display(); + redraw_screen(0); + show_drum_name(y_cursor); + rb->lcd_update(); } } break; @@ -634,14 +891,22 @@ case BEATBOX_DOWN: case BEATBOX_DOWN | BUTTON_REPEAT: { - if(editState == EDITSTATE_PATTERN) + if(edit_state == EDITSTATE_PATTERN) { - if(yCursor < V_NUMCELLS-1) + if(y_cursor < V_NUMCELLS-1) { - yCursor++; - showDrumName(yCursor); - updateDisplay(); - redrawScreen(0); + y_cursor++; + update_display(); + redraw_screen(0); + show_drum_name(y_cursor); + rb->lcd_update(); + } else + { + y_cursor = 0; + update_display(); + redraw_screen(0); + show_drum_name(y_cursor); + rb->lcd_update(); } } break; @@ -650,13 +915,18 @@ case BEATBOX_LEFT: case BEATBOX_LEFT | BUTTON_REPEAT: { - if(editState == EDITSTATE_PATTERN) + if(edit_state == EDITSTATE_PATTERN) { - if(xCursor > 0) + if(x_cursor > 0) { - xCursor--; - updateDisplay(); - redrawScreen(0); + x_cursor--; + update_display(); + redraw_screen(0); + } else + { + x_cursor = H_NUMCELLS-1; + update_display(); + redraw_screen(0); } } break; @@ -665,13 +935,18 @@ case BEATBOX_RIGHT: case BEATBOX_RIGHT | BUTTON_REPEAT: { - if(editState == EDITSTATE_PATTERN) + if(edit_state == EDITSTATE_PATTERN) { - if(xCursor < H_NUMCELLS-1) + if(x_cursor < H_NUMCELLS-1) { - xCursor++; - updateDisplay(); - redrawScreen(0); + x_cursor++; + update_display(); + redraw_screen(0); + }else + { + x_cursor = 0; + update_display(); + redraw_screen(0); } } break; @@ -679,55 +954,56 @@ case BEATBOX_SELECT: { - if(editState == EDITSTATE_PATTERN) + if(edit_state == EDITSTATE_PATTERN) { - int cv = trackData[xCursor][yCursor]; + int cv = track_data[x_cursor][y_cursor]; cv++; if(cv > VAL_LOOP) cv = VAL_NONE; - trackData[xCursor][yCursor] = cv; + track_data[x_cursor][y_cursor] = cv; - updateDisplay(); - redrawScreen(0); + update_display(); + redraw_screen(0); } break; } - case BEATBOX_PLAY: + case BEATBOX_PLAY_PAUSE: { - if(playState == STATE_PLAYING) - playState = STATE_PAUSED; + if(play_state == STATE_PLAYING) + play_state = STATE_PAUSED; else { - updateDisplay(); - redrawScreen(0); - sendEvents(); - playState = STATE_PLAYING; + update_display(); + redraw_screen(0); + send_events(); + play_state = STATE_PLAYING; } break; } - case BEATBOX_STOP: + case BEATBOX_STOP_MENU: { - if(playState == STATE_STOPPED) + if(play_state == STATE_STOPPED) { - quit=1; + /* quit=1; */ + /* instead of quiting, open menu */ + int ret = beatbox_menu(0); + if (ret != -1){ return PLUGIN_OK; } + update_display(); + redraw_screen(0); } else { - playState =STATE_STOPPED; - resetPosition(); - updateDisplay(); - redrawScreen(0); + play_state = STATE_STOPPED; + reset_pos(); + update_display(); + redraw_screen(0); } break; } } - - } - return 0; } -