diff --git a/src/studio/editors/music.c b/src/studio/editors/music.c index 57093606f..f405b445a 100644 --- a/src/studio/editors/music.c +++ b/src/studio/editors/music.c @@ -28,24 +28,11 @@ #define TRACKER_ROWS (MUSIC_PATTERN_ROWS / 4) #define CHANNEL_COLS 8 #define TRACKER_COLS (TIC_SOUND_CHANNELS * CHANNEL_COLS) -#define PIANO_PATTERN_HEADER 10 #define CMD_STRING(_, c, ...) DEF2STR(c) static const char MusicCommands[] = MUSIC_CMD_LIST(CMD_STRING); #undef CMD_STRING -enum PianoEditColumns -{ - PianoChannel1Column = 0, - PianoChannel2Column, - PianoChannel3Column, - PianoChannel4Column, - PianoSfxColumn, - PianoXYColumn, - - PianoColumnsCount -}; - enum { ColumnNote = 0, @@ -592,7 +579,7 @@ static void playTrackFromNow(Music* music) { tic_mem* tic = music->tic; - tic_api_music(tic, music->track, music->frame, music->tab == MUSIC_TRACKER_TAB ? music->tracker.edit.y : -1, music->loop, music->sustain, -1, -1); + tic_api_music(tic, music->track, music->frame, music->tracker.edit.y, music->loop, music->sustain, -1, -1); } static void playFrame(Music* music) @@ -659,76 +646,7 @@ typedef struct u8 size; } ClipboardHeader; -static void copyPianoToClipboard(Music* music, bool cut) -{ - tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - - if(pattern) - { - ClipboardHeader header = {MUSIC_PATTERN_ROWS}; - - enum{HeaderSize = sizeof(ClipboardHeader), Size = sizeof(tic_track_pattern) + HeaderSize}; - - u8* data = malloc(Size); - - if(data) - { - memcpy(data, &header, HeaderSize); - memcpy(data + HeaderSize, pattern->rows, sizeof(tic_track_pattern)); - - toClipboard(data, Size, true); - - free(data); - - if(cut) - { - memset(pattern->rows, 0, sizeof(tic_track_pattern)); - history_add(music->history); - } - } - } -} - -static void copyPianoFromClipboard(Music* music) -{ - tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - - if(pattern && tic_sys_clipboard_has()) - { - char* clipboard = tic_sys_clipboard_get(); - - if(clipboard) - { - s32 size = (s32)strlen(clipboard)/2; - - enum{RowSize = sizeof(tic_track_pattern) / MUSIC_PATTERN_ROWS, HeaderSize = sizeof(ClipboardHeader)}; - - if(size > HeaderSize) - { - u8* data = malloc(size); - - tic_tool_str2buf(clipboard, (s32)strlen(clipboard), data, true); - - ClipboardHeader header = {0}; - - memcpy(&header, data, HeaderSize); - - if(size == header.size * RowSize + HeaderSize - && size == sizeof(tic_track_pattern) + HeaderSize) - { - memcpy(pattern->rows, data + HeaderSize, header.size * RowSize); - history_add(music->history); - } - - free(data); - } - - tic_sys_clipboard_free(clipboard); - } - } -} - -static void copyTrackerToClipboard(Music* music, bool cut) +static void copyToClipboard(Music* music, bool cut) { tic_track_pattern* pattern = getChannelPattern(music); @@ -769,7 +687,7 @@ static void copyTrackerToClipboard(Music* music, bool cut) } } -static void copyTrackerFromClipboard(Music* music) +static void copyFromClipboard(Music* music) { tic_track_pattern* pattern = getChannelPattern(music); @@ -810,24 +728,6 @@ static void copyTrackerFromClipboard(Music* music) } } -static void copyToClipboard(Music* music, bool cut) -{ - switch (music->tab) - { - case MUSIC_TRACKER_TAB: copyTrackerToClipboard(music, cut); break; - case MUSIC_PIANO_TAB: copyPianoToClipboard(music, cut); break; - } -} - -static void copyFromClipboard(Music* music) -{ - switch (music->tab) - { - case MUSIC_TRACKER_TAB: copyTrackerFromClipboard(music); break; - case MUSIC_PIANO_TAB: copyPianoFromClipboard(music); break; - } -} - static void setChannelPatternValue(Music* music, s32 pattern, s32 frame, s32 channel) { if(pattern < 0) pattern = MUSIC_PATTERNS; @@ -1285,212 +1185,11 @@ static void processPatternKeyboard(Music* music) } } -static void updatePianoEditPos(Music* music) -{ - music->piano.edit.x = CLAMP(music->piano.edit.x, 0, PianoColumnsCount * 2 - 1); - - switch(music->piano.edit.x / 2) - { - case PianoSfxColumn: - case PianoXYColumn: - if(music->piano.edit.y < 0) - music->scroll.pos += music->piano.edit.y; - - if(music->piano.edit.y > TRACKER_ROWS-1) - music->scroll.pos += music->piano.edit.y - (TRACKER_ROWS - 1); - - updateScroll(music); - break; - } - - music->piano.edit.y = CLAMP(music->piano.edit.y, 0, MUSIC_FRAMES-1); -} - -static void updatePianoEditCol(Music* music) -{ - if(music->piano.edit.x & 1) - { - music->piano.edit.x--; - music->piano.edit.y++; - } - else music->piano.edit.x++; - - updatePianoEditPos(music); -} - static inline s32 rowIndex(Music* music, s32 row) { return row + music->scroll.pos; } -static tic_track_row* getPianoRow(Music* music) -{ - tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - return pattern ? &pattern->rows[rowIndex(music, music->piano.edit.y)] : NULL; -} - -static s32 getPianoValue(Music* music) -{ - s32 col = music->piano.edit.x / 2; - tic_track_row* row = getPianoRow(music); - - switch(col) - { - case PianoChannel1Column: - case PianoChannel2Column: - case PianoChannel3Column: - case PianoChannel4Column: - return getDigit(1 - music->piano.edit.x & 1, tic_tool_get_pattern_id(getTrack(music), music->piano.edit.y, col)); - - case PianoSfxColumn: - return row && row->note >= NoteStart ? getDigit(1 - music->piano.edit.x & 1, tic_tool_get_track_row_sfx(row)) : -1; - - case PianoXYColumn: - return row && row->command > tic_music_cmd_empty ? (music->piano.edit.x & 1 ? row->param2 : row->param1) : -1; - } - - return -1; -} - -static void setPianoValue(Music* music, char sym) -{ - s32 col = music->piano.edit.x / 2; - s32 dec = sym2dec(sym); - s32 hex = sym2hex(sym); - s32 delta = sym == '+' ? +1 : -1; - - tic_track_row* row = getPianoRow(music); - - switch(col) - { - case PianoChannel1Column: - case PianoChannel2Column: - case PianoChannel3Column: - case PianoChannel4Column: - switch (sym) - { - case '+': - case '-': - setChannelPattern(music, delta, music->piano.edit.x / 2); - break; - } - - if(dec >= 0) - { - s32 pattern = setDigit(1 - music->piano.edit.x & 1, - tic_tool_get_pattern_id(getTrack(music), music->piano.edit.y, col), dec); - - if(pattern <= MUSIC_PATTERNS) - { - setChannelPatternValue(music, pattern, music->piano.edit.y, col); - updatePianoEditCol(music); - } - } - break; - case PianoSfxColumn: - if(row && row->note >= NoteStart) - { - switch (sym) - { - case '+': - case '-': - tic_tool_set_track_row_sfx(row, tic_modulo(tic_tool_get_track_row_sfx(row) + delta, SFX_COUNT)); - break; - default: - if(dec >= 0) - { - s32 sfx = setDigit(1 - music->piano.edit.x & 1, tic_tool_get_track_row_sfx(row), dec); - tic_tool_set_track_row_sfx(row, sfx); - updatePianoEditCol(music); - } - } - - history_add(music->history); - music->last.sfx = tic_tool_get_track_row_sfx(row); - playNote(music, row); - } - break; - - case PianoXYColumn: - if(row && row->command > tic_music_cmd_empty) - { - switch (sym) - { - case '+': - case '-': - if(music->piano.edit.x & 1) - row->param2 += delta; - else row->param1 += delta; - break; - default: - if(hex >= 0) - { - if(music->piano.edit.x & 1) - row->param2 = hex; - else row->param1 = hex; - updatePianoEditCol(music); - } - } - - history_add(music->history); - } - break; - } -} - -static void processPianoKeyboard(Music* music) -{ - tic_mem* tic = music->tic; - - if(keyWasPressed(music->studio, tic_key_up)) music->piano.edit.y--; - else if(keyWasPressed(music->studio, tic_key_down)) music->piano.edit.y++; - else if(keyWasPressed(music->studio, tic_key_left)) music->piano.edit.x--; - else if(keyWasPressed(music->studio, tic_key_right)) music->piano.edit.x++; - else if(keyWasPressed(music->studio, tic_key_home)) music->piano.edit.x = PianoChannel1Column; - else if(keyWasPressed(music->studio, tic_key_end)) music->piano.edit.x = PianoColumnsCount*2+1; - else if(keyWasPressed(music->studio, tic_key_pageup)) music->piano.edit.y -= TRACKER_ROWS; - else if(keyWasPressed(music->studio, tic_key_pagedown)) music->piano.edit.y += TRACKER_ROWS; - - updatePianoEditPos(music); - - if(keyWasPressed(music->studio, tic_key_delete)) - { - s32 col = music->piano.edit.x / 2; - switch(col) - { - case PianoChannel1Column: - case PianoChannel2Column: - case PianoChannel3Column: - case PianoChannel4Column: - setChannelPatternValue(music, 00, music->piano.edit.y, col); - break; - case PianoSfxColumn: - { - tic_track_row* row = getPianoRow(music); - if(row) - { - tic_tool_set_track_row_sfx(row, 0); - history_add(music->history); - } - } - break; - case PianoXYColumn: - { - tic_track_row* row = getPianoRow(music); - if(row) - { - row->param1 = row->param2 = 0; - history_add(music->history); - } - } - break; - } - } - - if(getKeyboardText(music->studio)) - setPianoValue(music, getKeyboardText(music->studio)); -} - static void selectAll(Music* music) { resetSelection(music); @@ -1548,17 +1247,9 @@ static void processKeyboard(Music* music) : stopTrack(music); } - switch (music->tab) - { - case MUSIC_TRACKER_TAB: - music->tracker.edit.y >= 0 - ? processTrackerKeyboard(music) - : processPatternKeyboard(music); - break; - case MUSIC_PIANO_TAB: - processPianoKeyboard(music); - break; - } + music->tracker.edit.y >= 0 + ? processTrackerKeyboard(music) + : processPatternKeyboard(music); } } @@ -1992,58 +1683,12 @@ static void drawPlayButtons(Music* music) } } -static void drawModeTabs(Music* music) -{ - static const u8 Icons[] = {tic_icon_piano, tic_icon_tracker}; - - enum { Width = 7, Height = 7, Count = COUNT_OF(Icons) }; - - for (s32 i = 0; i < Count; i++) - { - tic_rect rect = { TIC80_WIDTH - Width * (Count - i), 0, Width, Height }; - - static const s32 Tabs[] = { MUSIC_PIANO_TAB, MUSIC_TRACKER_TAB }; - - bool over = false; - - if (checkMousePos(music->studio, &rect)) - { - setCursor(music->studio, tic_cursor_hand); - over = true; - - static const char* Tooltips[] = { "PIANO MODE", "TRACKER MODE" }; - showTooltip(music->studio, Tooltips[i]); - - if (checkMouseClick(music->studio, &rect, tic_mouse_left)) - music->tab = Tabs[i]; - } - - if (music->tab == Tabs[i]) - { - tic_api_rect(music->tic, rect.x, rect.y, rect.w, rect.h, tic_color_grey); - drawBitIcon(music->studio, Icons[i], rect.x, rect.y + 1, tic_color_black); - } - - drawBitIcon(music->studio, Icons[i], rect.x, rect.y, music->tab == Tabs[i] ? tic_color_white : over ? tic_color_grey : tic_color_light_grey); - } -} - static void drawMusicToolbar(Music* music) { tic_api_rect(music->tic, 0, 0, TIC80_WIDTH, TOOLBAR_SIZE, tic_color_white); drawPlayButtons(music); - drawModeTabs(music); -} - -static void drawPianoCursor(Music* music, s32 x, s32 y, const char* val) -{ - tic_mem* tic = music->tic; - - s32 subCol = music->piano.edit.x & 1; - tic_point pos = {x + subCol * TIC_FONT_WIDTH, y}; - tic_api_rect(tic, pos.x - 1, pos.y - 1, TIC_FONT_WIDTH + 1, TIC_FONT_HEIGHT + 1, tic_color_red); - tic_api_print(tic, (char[]){val[subCol], '\0'}, pos.x, pos.y, tic_color_black, true, 1, false); + //drawModeTabs(music); } static const char* getPatternLabel(Music* music, s32 frame, s32 channel) @@ -2060,112 +1705,6 @@ static const char* getPatternLabel(Music* music, s32 frame, s32 channel) return index; } -static void drawPianoFrames(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - - enum {Width = 66, Height = 106, Header = 10, ColWidth = TIC_FONT_WIDTH * 2 + 1}; - - drawEditPanel(music, x, y, Width, Height); - - tic_api_print(tic, "FRM", x + 1, y + 2, tic_color_grey, true, 1, true); - - { - const tic_music_state* pos = getMusicPos(music); - s32 playFrame = pos->music.track == music->track ? pos->music.frame : -1; - - char index[] = "99"; - for(s32 i = 0; i < MUSIC_FRAMES; i++) - { - sprintf(index, "%02i", i); - tic_api_print(tic, index, x + 1, y + Header + i * TIC_FONT_HEIGHT, playFrame == i ? tic_color_white : music->frame == i? tic_color_grey : tic_color_dark_grey, true, 1, false); - } - - if(playFrame >= 0) - { - drawBitIcon(music->studio, tic_icon_right, x - TIC_ALTFONT_WIDTH - 1, y + playFrame * TIC_FONT_HEIGHT + Header, tic_color_black); - drawBitIcon(music->studio, tic_icon_right, x - TIC_ALTFONT_WIDTH - 1, y + playFrame * TIC_FONT_HEIGHT + (Header - 1), tic_color_white); - } - } - - x += ColWidth + 1; - - { - tic_rect rect = {x, y + Header - 1, (TIC_FONT_WIDTH * 2 + 1) * TIC_SOUND_CHANNELS, MUSIC_FRAMES * TIC_FONT_HEIGHT + 1}; - - if(checkMousePos(music->studio, &rect)) - { - setCursor(music->studio, tic_cursor_hand); - - bool left = checkMouseClick(music->studio, &rect, tic_mouse_left); - if(left || checkMouseClick(music->studio, &rect, tic_mouse_right)) - { - s32 col = (tic_api_mouse(tic).x - rect.x) * TIC_SOUND_CHANNELS / rect.w; - s32 row = (tic_api_mouse(tic).y - rect.y) * MUSIC_FRAMES / rect.h; - - // move edit cursor if pattern already selected only - if(col == music->piano.col && row == music->frame) - { - tic_point pos = {(tic_api_mouse(tic).x - rect.x) * TIC_SOUND_CHANNELS * 2 / rect.w, row}; - if(MEMCMP(music->piano.edit, pos)) - { - s32 step = getStep(music); - setChannelPattern(music, left ? +step : -step, pos.x / 2); - } - else music->piano.edit = pos; - } - - music->piano.col = col; - - if(getMusicState(music) == tic_music_stop || !music->follow) - music->frame = row; - } - } - } - - for(s32 c = 0; c < TIC_SOUND_CHANNELS; c++) - { - tic_api_rect(tic, x + c * ColWidth, y + 1, - ColWidth, MUSIC_FRAMES * TIC_FONT_HEIGHT + (Header - 1), c & 1 ? tic_color_black : tic_color_dark_grey); - - tic_api_print(tic, (char[]){'1' + c, '\0'}, x + (ColWidth - (TIC_ALTFONT_WIDTH - 1)) / 2 + c * ColWidth, y + 2, - tic_color_grey, true, 1, true); - - - for(s32 i = 0; i < MUSIC_FRAMES; i++) - { - const char* index = getPatternLabel(music, i, c); - - tic_point pos = {x + 1 + c * ColWidth, y + Header + i * TIC_FONT_HEIGHT}; - tic_api_print(tic, index, pos.x, pos.y, c & 1 ? tic_color_dark_grey : tic_color_grey, true, 1, false); - } - - drawTumbler(music, x + 3 + c * ColWidth, y + 110, c); - } - - { - const char* index = getPatternLabel(music, music->frame, music->piano.col); - - tic_point pos = {x + 1 + music->piano.col * ColWidth, y + Header + music->frame * TIC_FONT_HEIGHT}; - tic_api_print(tic, index, pos.x, pos.y + 1, tic_color_black, true, 1, false); - tic_api_print(tic, index, pos.x, pos.y, tic_color_white, true, 1, false); - - } - - // draw edit cursor - switch(music->piano.edit.x / 2) - { - case PianoChannel1Column: - case PianoChannel2Column: - case PianoChannel3Column: - case PianoChannel4Column: - { - const char* label = getPatternLabel(music, music->piano.edit.y, music->piano.edit.x / 2); - drawPianoCursor(music, x + 1 + music->piano.edit.x / 2 * ColWidth, y + Header + music->piano.edit.y * TIC_FONT_HEIGHT, label); - } - } -} - static void drawStereoSeparator(Music* music, s32 x, s32 y) { tic_mem* tic = music->tic; @@ -2181,605 +1720,7 @@ static void drawStereoSeparator(Music* music, s32 x, s32 y) tic_api_rect(tic, x + 27 - i * 4, y, 4, 1, Colors[i]); } -static void drawPianoRoll(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - - static const struct Button {u8 note; u8 up; u8 down; u8 offset; u8 flip;} Buttons[] = - { - {0, 39, 40, 0, tic_no_flip}, - {2, 39, 40, 3, tic_horz_flip}, - {2, 39, 40, 8, tic_no_flip}, - {4, 39, 40, 11, tic_horz_flip}, - {5, 39, 40, 20, tic_no_flip}, - {7, 39, 40, 23, tic_horz_flip}, - {7, 39, 40, 28, tic_no_flip}, - {9, 39, 40, 31, tic_horz_flip}, - {9, 39, 40, 36, tic_no_flip}, - {11, 39, 40, 39, tic_horz_flip}, - {1, 41, 42, 0, tic_no_flip}, - {3, 41, 42, 8, tic_no_flip}, - {6, 41, 42, 20, tic_no_flip}, - {8, 41, 42, 28, tic_no_flip}, - {10, 41, 42, 36, tic_no_flip}, - }; - - tiles2ram(tic->ram, &getConfig(music->studio)->cart->bank0.tiles); - - for(s32 i = 0; i < COUNT_OF(Buttons); i++) - { - const struct Button* btn = &Buttons[i]; - tic_api_spr(tic, btn->note == music->piano.note[music->piano.col] ? btn->down : btn->up, - x + btn->offset, y, 1, 1, (u8[]){tic_color_orange}, 1, 1, btn->flip, tic_no_rotate); - } -} - -static void drawPianoRowColumn(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - const tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - - enum{Header = PIANO_PATTERN_HEADER}; - - tic_rect rect = {x, y, TIC_FONT_WIDTH*2 + 1, TRACKER_ROWS*TIC_FONT_HEIGHT + Header}; - - if(checkMousePos(music->studio, &rect)) - { - if(checkMouseDown(music->studio, &rect, tic_mouse_left) || checkMouseDown(music->studio, &rect, tic_mouse_right)) - { - setCursor(music->studio, tic_cursor_hand); - - if(music->scroll.active) - { - music->scroll.pos = (music->scroll.start - tic_api_mouse(tic).y) / TIC_FONT_HEIGHT; - updateScroll(music); - } - else - { - music->scroll.active = true; - music->scroll.start = tic_api_mouse(tic).y + music->scroll.pos * TIC_FONT_HEIGHT; - } - } - else music->scroll.active = false; - } - - tic_api_print(tic, "ROW", x + 1, y + 2, tic_color_grey, true, 1, true); - - for(s32 r = 0; r < TRACKER_ROWS; r++) - { - s32 index = rowIndex(music, r); - - char label[sizeof "00"]; - sprintf(label, "%02i", index); - tic_api_print(tic, label, x + 1, y + Header + r * TIC_FONT_HEIGHT, pattern && noteBeat(music, index) ? tic_color_grey : tic_color_dark_grey, true, 1, false); - } -} - -static void drawPianoNoteStatus(Music* music, s32 x, s32 y, s32 xpos, s32 ypos) -{ - tic_mem* tic = music->tic; - - enum{Header = PIANO_PATTERN_HEADER, NoteWidth = 4, NoteHeight = TIC_FONT_HEIGHT}; - - tic_rect rect = {x, y + Header, NoteWidth * NOTES - 1, NoteHeight * TRACKER_ROWS - 1}; - - if(checkMousePos(music->studio, &rect)) - { - { - static const char Notes[] = "C D EF G A B"; - tic_api_print(tic, Notes, xpos, ypos, tic_color_dark_grey, true, 1, true); - } - - showTooltip(music->studio, "set note"); - - static const char* Notes[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"}; - static const s32 Offsets[] = {0, 0, 2, 2, 4, 5, 5, 7, 7, 9, 9, 11}; - s32 note = (tic_api_mouse(tic).x - rect.x) / NoteWidth; - - tic_api_print(tic, Notes[note], xpos + Offsets[note] * NoteWidth, ypos, tic_color_yellow, true, 1, true); - } -} - -static void drawPianoNoteColumn(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - - enum{Header = PIANO_PATTERN_HEADER, NoteWidth = 4, NoteHeight = TIC_FONT_HEIGHT}; - - drawPianoRoll(music, x, y + 1); - - tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - if(pattern) - { - drawPianoNoteStatus(music, x, y, 87, 129); - - for(s32 r = 0; r < TRACKER_ROWS; r++) - { - s32 index = rowIndex(music, r); - - tic_track_row* row = &pattern->rows[index]; - - // draw piano roll - for(s32 n = 0; n < NOTES; n++) - { - tic_rect rect = {x + n * NoteWidth, y + Header + r * NoteHeight, NoteWidth - 1, NoteHeight - 1}; - - bool over = false; - if(checkMousePos(music->studio, &rect)) - { - setCursor(music->studio, tic_cursor_hand); - over = true; - - if(checkMouseClick(music->studio, &rect, tic_mouse_left)) - { - switch(row->note) - { - case NoteNone: - row->note = NoteStart + n; - row->octave = music->last.octave; - tic_tool_set_track_row_sfx(row, music->last.sfx); - playNote(music, row); - break; - case NoteStop: - row->note = NoteNone; - row->octave = 0; - break; - default: - if(row->note - NoteStart == n) - { - row->note = NoteStop; - row->octave = 0; - } - else - { - row->note = NoteStart + n; - playNote(music, row); - } - } - - history_add(music->history); - } - else if(checkMouseClick(music->studio, &rect, tic_mouse_right)) - { - switch(row->note) - { - case NoteNone: - row->note = NoteStop; - row->octave = 0; - break; - case NoteStop: - row->note = NoteStart + n; - row->octave = music->last.octave; - tic_tool_set_track_row_sfx(row, music->last.sfx); - playNote(music, row); - break; - default: - if(row->note - NoteStart == n) - { - row->note = NoteNone; - row->octave = 0; - } - else - { - row->note = NoteStart + n; - playNote(music, row); - } - } - - history_add(music->history); - } - } - - if(row->note == NoteStop) - { - // draw stop note - tic_api_rect(tic, rect.x, rect.y, rect.w, rect.h, tic_color_dark_grey); - tic_api_rect(tic, x + 1 + n * NoteWidth, y + r * NoteHeight + (Header + NoteHeight / 2 - 1), 1, 1, tic_color_red); - } - else tic_api_rect(tic, rect.x, rect.y, rect.w, rect.h, over ? tic_color_grey : tic_color_dark_grey); - } - - if(noteBeat(music, index) && row->note != NoteStop) - { - static u8 Colors[NOTES] = - { - tic_color_grey, tic_color_grey, tic_color_light_grey, - tic_color_light_grey, tic_color_light_grey, tic_color_white, - tic_color_white, tic_color_light_grey, tic_color_light_grey, - tic_color_light_grey, tic_color_grey, tic_color_grey - }; - - for(s32 i = 0; i < COUNT_OF(Colors); i++) - tic_api_rect(tic, x + i * NoteWidth, y + r * NoteHeight + (Header + NoteHeight / 2 - 1), NoteWidth - 1, 1, Colors[i]); - } - - if (row->note >= NoteStart) - tic_api_rect(tic, x + (row->note - NoteStart) * NoteWidth, y + Header + r * NoteHeight, NoteWidth - 1, NoteHeight - 1, tic_color_light_green); - } - } - else - for(s32 r = 0; r < TRACKER_ROWS; r++) - for(s32 i = 0; i < NOTES; i++) - tic_api_rect(tic, x + i * NoteWidth, y + r * NoteHeight + (Header + NoteHeight / 2 - 1), NoteWidth - 1, 1, tic_color_dark_grey); -} - -static void drawPianoOctaveStatus(Music* music, s32 x, s32 y, s32 xpos, s32 ypos) -{ - tic_mem* tic = music->tic; - - enum{Header = PIANO_PATTERN_HEADER, OctaveWidth = 4, OctaveHeight = TIC_FONT_HEIGHT}; - - tic_rect rect = {x, y + Header, OctaveWidth * OCTAVES - 1, OctaveHeight * TRACKER_ROWS - 1}; - - if(checkMousePos(music->studio, &rect)) - { - s32 octave = (tic_api_mouse(tic).x - rect.x) / OctaveWidth; - s32 r = (tic_api_mouse(tic).y - rect.y) / OctaveHeight; - - tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - const tic_track_row* row = &pattern->rows[rowIndex(music, r)]; - - if(row->note >= NoteStart) - { - showTooltip(music->studio, "set octave"); - - tic_api_print(tic, "12345678", xpos, ypos, tic_color_dark_grey, true, 1, true); - tic_api_print(tic, (char[]){octave + '1', '\0'}, xpos + octave * OctaveWidth, ypos, tic_color_yellow, true, 1, true); - } - } -} - -static void drawPianoOctaveColumn(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - - enum{Header = PIANO_PATTERN_HEADER, OctaveWidth = 4, OctaveHeight = TIC_FONT_HEIGHT}; - - tic_api_print(tic, "OCTAVE", x + 4, y + 2, tic_color_grey, true, 1, true); - drawStereoSeparator(music, x, y + 8); - - tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - if(pattern) - { - drawPianoOctaveStatus(music, x, y, 136, 129); - - for(s32 r = 0; r < TRACKER_ROWS; r++) - { - s32 index = rowIndex(music, r); - tic_track_row* row = &pattern->rows[index]; - - if(row->note >= NoteStart) - { - for(s32 n = 0; n < OCTAVES; n++) - { - tic_rect rect = {x + n * OctaveWidth, y + Header + r * OctaveHeight, OctaveWidth - 1, OctaveHeight - 1}; - - bool over = false; - if(checkMousePos(music->studio, &rect)) - { - setCursor(music->studio, tic_cursor_hand); - over = true; - - if(checkMouseClick(music->studio, &rect, tic_mouse_left)) - { - music->last.octave = row->octave = n; - history_add(music->history); - playNote(music, row); - } - } - - tic_api_rect(tic, rect.x, rect.y, rect.w, rect.h, over ? tic_color_grey : tic_color_dark_grey); - } - } - else - for(s32 i = 0; i < OCTAVES; i++) - tic_api_rect(tic, x + i * OctaveWidth, y + r * OctaveHeight + (Header + OctaveHeight / 2 - 1), OctaveWidth - 1, 1, tic_color_dark_grey); - - if(noteBeat(music, index)) - { - static u8 Colors[OCTAVES] = - { - tic_color_grey, tic_color_grey, tic_color_light_grey, tic_color_white, - tic_color_white, tic_color_light_grey, tic_color_grey, tic_color_grey - }; - - for(s32 i = 0; i < COUNT_OF(Colors); i++) - tic_api_rect(tic, x + i * OctaveWidth, y + r * OctaveHeight + (Header + OctaveHeight / 2 - 1), OctaveWidth - 1, 1, Colors[i]); - } - - if(row->note >= NoteStart) - tic_api_rect(tic, x + row->octave * OctaveWidth, y + Header + r * OctaveHeight, OctaveWidth - 1, OctaveHeight - 1, tic_color_orange); - } - } - else - for(s32 r = 0; r < TRACKER_ROWS; r++) - for(s32 i = 0; i < OCTAVES; i++) - tic_api_rect(tic, x + i * OctaveWidth, y + r * OctaveHeight + (Header + OctaveHeight / 2 - 1), OctaveWidth - 1, 1, tic_color_dark_grey); -} - -static void drawPianoSfxColumn(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - - enum{Header = PIANO_PATTERN_HEADER}; - - { - tic_rect rect = {x, y + Header - 1, TIC_FONT_WIDTH * 2, TIC_FONT_HEIGHT * MUSIC_FRAMES}; - - if(checkMousePos(music->studio, &rect)) - { - setCursor(music->studio, tic_cursor_hand); - - showTooltip(music->studio, "set sfx"); - - bool left = checkMouseClick(music->studio, &rect, tic_mouse_left); - if(left || checkMouseClick(music->studio, &rect, tic_mouse_right)) - { - tic_point pos = {PianoSfxColumn * 2 + (tic_api_mouse(tic).x - rect.x) / TIC_FONT_WIDTH, (tic_api_mouse(tic).y - rect.y) / TIC_FONT_HEIGHT}; - - if(MEMCMP(pos, music->piano.edit)) - { - tic_track_row* row = getPianoRow(music); - - if(row && row->note >= NoteStart) - { - s32 step = getStep(music); - s32 sfx = tic_tool_get_track_row_sfx(row) + (left ? +step : -step); - tic_tool_set_track_row_sfx(row, tic_modulo(sfx, SFX_COUNT)); - music->last.sfx = tic_tool_get_track_row_sfx(row); - history_add(music->history); - playNote(music, row); - } - } - else music->piano.edit = pos; - } - } - } - - tic_api_rect(tic, x, y + 1, TIC_FONT_WIDTH*2 + 1, Header + TRACKER_ROWS * TIC_FONT_HEIGHT - 1, tic_color_dark_grey); - tic_api_print(tic, "SFX", x + 1, y + 2, tic_color_grey, true, 1, true); - - const tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - if(pattern) - { - for(s32 r = 0; r < TRACKER_ROWS; r++) - { - s32 index = rowIndex(music, r); - const tic_track_row* row = &pattern->rows[index]; - - if (row->note >= NoteStart) - { - tic_rect rect = {x, y + Header + r * TIC_FONT_HEIGHT - 1, TIC_FONT_WIDTH*2+1, TIC_FONT_HEIGHT+1}; - - char sfx[sizeof "00"]; - sprintf(sfx, "%02i", tic_tool_get_track_row_sfx(row)); - tic_api_print(tic, sfx, rect.x + 1, rect.y + 2, tic_color_black, true, 1, false); - tic_api_print(tic, sfx, rect.x + 1, rect.y + 1, tic_color_yellow, true, 1, false); - } - else - tic_api_print(tic, "--", - x + 1, y + Header + r * TIC_FONT_HEIGHT, - noteBeat(music, index) ? tic_color_light_grey : tic_color_grey, true, 1, false); - } - } - else - for(s32 r = 0; r < TRACKER_ROWS; r++) - tic_api_print(tic, "--", x + 1, y + Header + r * TIC_FONT_HEIGHT, tic_color_grey, true, 1, false); - - if(music->piano.edit.x / 2 == PianoSfxColumn) - { - char sfx[] = "--"; - const tic_track_row* row = getPianoRow(music); - if (row && row->note >= NoteStart) - sprintf(sfx, "%02i", tic_tool_get_track_row_sfx(row)); - - drawPianoCursor(music, x + 1, y + Header + music->piano.edit.y * TIC_FONT_HEIGHT, sfx); - } -} - -static void drawPianoCommandColumn(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - - enum{Header = PIANO_PATTERN_HEADER}; - - tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - tic_music_command command = tic_music_cmd_empty; - s32 overRow = -1; - if(pattern) - { - tic_rect rect = {x, y + Header - 1, TIC_FONT_WIDTH * (tic_music_cmd_count - 1), TIC_FONT_HEIGHT * MUSIC_FRAMES}; - - if(checkMousePos(music->studio, &rect)) - { - setCursor(music->studio, tic_cursor_hand); - - showTooltip(music->studio, "set command"); - - command = (tic_api_mouse(tic).x - rect.x) / TIC_FONT_WIDTH + 1; - overRow = (tic_api_mouse(tic).y - rect.y) / TIC_FONT_HEIGHT; - - if(command != tic_music_cmd_empty) - { - #define MUSIC_CMD_HINT(_, letter, hint) "[" #letter "] " hint, - static const char* Hints[] = - { - MUSIC_CMD_LIST(MUSIC_CMD_HINT) - }; - #undef MUSIC_CMD_HINT - - tic_api_print(tic, Hints[command], 73, 129, tic_color_yellow, false, 1, true); - } - - if(checkMouseClick(music->studio, &rect, tic_mouse_left)) - { - tic_track_row* row = &pattern->rows[rowIndex(music, overRow)]; - - row->command = command != row->command ? command : tic_music_cmd_empty; - - if(row->command == tic_music_cmd_empty) - row->param1 = row->param2 = 0; - else - setCommandDefaults(row); - - history_add(music->history); - } - } - } - - tic_api_print(tic, "COMMAND", x + 8, y + 2, tic_color_grey, true, 1, true); - drawStereoSeparator(music, x + 6, y + 8); - - if(pattern) - { - for(s32 r = 0; r < TRACKER_ROWS; r++) - { - s32 index = rowIndex(music, r); - const tic_track_row* row = &pattern->rows[index]; - - tic_api_print(tic, MusicCommands + 1, - x + 1, y + Header + r * TIC_FONT_HEIGHT, - noteBeat(music, index) ? tic_color_grey : tic_color_dark_grey, true, 1, false); - - if(overRow == r && command > tic_music_cmd_empty) - tic_api_print(tic, (char[]){MusicCommands[command], '\0'}, - x + 1 + (command - 1) * TIC_FONT_WIDTH, y + Header + r * TIC_FONT_HEIGHT, - noteBeat(music, index) ? tic_color_light_grey : tic_color_grey, true, 1, false); - - if(row->command > tic_music_cmd_empty) - tic_api_print(tic, (char[]){MusicCommands[row->command], '\0'}, - x + 1 + (row->command - 1) * TIC_FONT_WIDTH, y + Header + r * TIC_FONT_HEIGHT, - tic_color_light_blue, true, 1, false); - } - } - else - for(s32 r = 0; r < TRACKER_ROWS; r++) - tic_api_print(tic, MusicCommands + 1, - x + 1, y + Header + r * TIC_FONT_HEIGHT, - tic_color_dark_grey, true, 1, false); -} - -static void drawPianoXYColumn(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - - enum{Header = PIANO_PATTERN_HEADER}; - - const tic_track_pattern* pattern = getFramePattern(music, music->piano.col, music->frame); - { - tic_rect rect = {x, y + Header - 1, TIC_FONT_WIDTH * 2, TIC_FONT_HEIGHT * MUSIC_FRAMES}; - - if(checkMousePos(music->studio, &rect)) - { - setCursor(music->studio, tic_cursor_hand); - showTooltip(music->studio, "set command XY"); - - if(pattern) - { - s32 r = (tic_api_mouse(tic).y - rect.y) / TIC_FONT_HEIGHT; - const tic_track_row* row = &pattern->rows[rowIndex(music, r)]; - - if(row->command != tic_music_cmd_empty) - { - char val[sizeof "XY=000"]; - sprintf(val, "XY=%03i", (row->param1 << 4) | row->param2); - tic_api_print(tic, val, 213, 129, tic_color_yellow, false, 1, true); - } - } - - bool left = checkMouseClick(music->studio, &rect, tic_mouse_left); - if(left || checkMouseClick(music->studio, &rect, tic_mouse_right)) - { - tic_point pos = {PianoXYColumn * 2 + (tic_api_mouse(tic).x - rect.x) / TIC_FONT_WIDTH, (tic_api_mouse(tic).y - rect.y) / TIC_FONT_HEIGHT}; - - if(MEMCMP(music->piano.edit, pos)) - { - tic_track_row* row = getPianoRow(music); - if(row && row->command > tic_music_cmd_empty) - { - s32 step = getStep(music); - s32 delta = left ? +step : -step; - if(music->piano.edit.x & 1) - row->param2 += delta; - else row->param1 += delta; - - history_add(music->history); - } - } - else music->piano.edit = pos; - } - } - } - - tic_api_rect(tic, x, y + 1, TIC_FONT_WIDTH*2 + 1, Header + TRACKER_ROWS * TIC_FONT_HEIGHT - 1, tic_color_dark_grey); - tic_api_print(tic, "X", x + 2, y + 2, tic_color_grey, true, 1, true); - tic_api_print(tic, "Y", x + 8, y + 2, tic_color_grey, true, 1, true); - - if(pattern) - { - - for(s32 r = 0; r < TRACKER_ROWS; r++) - { - s32 index = rowIndex(music, r); - const tic_track_row* row = &pattern->rows[index]; - - tic_music_command command = MusicCommands[row->command]; - - if(row->command > tic_music_cmd_empty) - { - char xy[sizeof "00"]; - tic_api_print(tic, xy, x + 1, y + Header + r * TIC_FONT_HEIGHT, tic_color_dark_grey, true, 1, false); - sprintf(xy, "%01X%01X", row->param1, row->param2); - tic_api_print(tic, xy, x + 1, y + Header + r * TIC_FONT_HEIGHT + 1, tic_color_black, true, 1, false); - tic_api_print(tic, xy, x + 1, y + Header + r * TIC_FONT_HEIGHT, tic_color_light_blue, true, 1, false); - } - else - tic_api_print(tic, "--", - x + 1, y + Header + r * TIC_FONT_HEIGHT, - noteBeat(music, index) ? tic_color_light_grey : tic_color_grey, true, 1, false); - } - } - else - for(s32 r = 0; r < TRACKER_ROWS; r++) - tic_api_print(tic, "--", x + 1, y + Header + r * TIC_FONT_HEIGHT, tic_color_grey, true, 1, false); - - if(music->piano.edit.x / 2 == PianoXYColumn) - { - char xy[] = "--"; - const tic_track_row* row = getPianoRow(music); - if(row && row->command > tic_music_cmd_empty) - sprintf(xy, "%01X%01X", row->param1, row->param2); - - drawPianoCursor(music, x + 1, y + Header + music->piano.edit.y * TIC_FONT_HEIGHT, xy); - } -} - -static void drawPianoPattern(Music* music, s32 x, s32 y) -{ - tic_mem* tic = music->tic; - - enum{Width = 164, Height = 106}; - drawEditPanel(music, x, y, Width, Height); - - // draw playing row - if(checkPlayFrame(music, music->frame)) - { - const tic_music_state* pos = getMusicPos(music); - s32 index = pos->music.row - music->scroll.pos; - - if(index >= 0 && index < TRACKER_ROWS) - tic_api_rect(tic, x, y + PIANO_PATTERN_HEADER + index * TIC_FONT_HEIGHT - 1, Width, TIC_FONT_HEIGHT + 1, tic_color_light_grey); - } - - drawPianoRowColumn(music, x, y); - drawPianoNoteColumn(music, x + 14, y); - drawPianoOctaveColumn(music, x + 63, y); - drawPianoSfxColumn(music, x + 95, y); - drawPianoCommandColumn(music, x + 108, y); - drawPianoXYColumn(music, x + 151, y); -} - -static void drawBeatButton(Music* music, s32 x, s32 y) +static void drawBeatButton(Music* music, s32 x, s32 y) { tic_mem* tic = music->tic; @@ -2805,13 +1746,6 @@ static void drawBeatButton(Music* music, s32 x, s32 y) tic_api_print(tic, music->beat34 ? Label34 : Label44, x, y + (down ? 1 : 0), tic_color_white, true, 1, true); } -static void drawPianoLayout(Music* music) -{ - drawPianoFrames(music, 3, 20); - drawPianoPattern(music, 73, 20); - drawBeatButton(music, 4, 129); -} - static void scrollNotes(Music* music, s32 delta) { tic_track_pattern* pattern = getChannelPattern(music); @@ -2880,35 +1814,6 @@ static void drawWaveform(Music* music, s32 x, s32 y) } } -static void updatePianoRollState(Music* music) -{ - if(getMusicState(music) != tic_music_stop) - { - s32 channel = music->piano.col; - const tic_music_state* pos = getMusicPos(music); - - for(s32 c = 0; c < TIC_SOUND_CHANNELS; c++) - { - const tic_track_pattern* pattern = getFramePattern(music, c, pos->music.frame); - if(pattern) - { - const tic_track_row* row = &pattern->rows[pos->music.row]; - - if(pos->music.row == 0 && !music->sustain) - music->piano.note[c] = -1; - - if(row->note >= NoteStart) - music->piano.note[c] = row->note - NoteStart; - else if(row->note == NoteStop || (row->note == NoteNone && pos->music.row == 0 && !music->sustain)) - music->piano.note[c] = -1; - } - else if(!music->sustain) - music->piano.note[c] = -1; - } - } - else memset(music->piano.note, -1, sizeof music->piano.note); -} - static void tick(Music* music) { tic_mem* tic = music->tic; @@ -2955,17 +1860,11 @@ static void tick(Music* music) if(!music->on[i]) tic->ram->registers[i].volume = 0; - updatePianoRollState(music); - tic_api_cls(music->tic, tic_color_grey); drawTopPanel(music, 2, TOOLBAR_SIZE + 3); drawWaveform(music, 205, 9); - switch (music->tab) - { - case MUSIC_TRACKER_TAB: drawTrackerLayout(music, 7, 35); break; - case MUSIC_PIANO_TAB: drawPianoLayout(music); break; - } + drawTrackerLayout(music, 7, 35); drawMusicToolbar(music); drawToolbar(music->studio, music->tic, false); @@ -3033,7 +1932,7 @@ void initMusic(Music* music, Studio* studio, tic_music* src) }, .tickCounter = 0, - .tab = MUSIC_PIANO_TAB, + //.tab = MUSIC_PIANO_TAB, .history = history_create(src, sizeof(tic_music)), .event = onStudioEvent, }; diff --git a/src/studio/studio.c b/src/studio/studio.c index c04c0ddc8..f4cb9ce58 100644 --- a/src/studio/studio.c +++ b/src/studio/studio.c @@ -1241,7 +1241,7 @@ void setStudioMode(Studio* studio, EditorMode mode) else if(mode == TIC_MUSIC_MODE) { Music* music = studio->banks.music[studio->bank.index.music]; - music->tab = (music->tab + 1) % MUSIC_TAB_COUNT; + //music->tab = MUSIC_TRACKER_TAB;//(music->tab + 1) % MUSIC_TAB_COUNT; } #endif }