From ab60d99e2ef778842726660d9016ab05c61cd005 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 10 Jun 2021 14:34:51 +0200 Subject: Add initial piano roll prototype --- src/sequencer.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 123 insertions(+), 5 deletions(-) diff --git a/src/sequencer.c b/src/sequencer.c index 3e34d68..205cb73 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -301,9 +301,9 @@ static ChannelWave ch3 = { #define TRIG_W 15 #define TRIG_H 24 -#define TRIG_START_X 66 +#define TRIG_START_X 64 #define TRIG_START_Y 90 -#define TRIG_OFFSET_X (TRIG_W + 4) +#define TRIG_OFFSET_X (TRIG_W + 3) #define TRIG_OFFSET_Y (TRIG_H + 7) void @@ -402,9 +402,9 @@ draw_channels(void) { } u8 clr = active ? COL_FG : COL_GREY; size_t y = CHAN_START_Y + i * CHAN_OFFSET_Y; - draw_tile(CHAN_START_X, y, channel_tiles + k++, clr, false); - draw_tile(CHAN_START_X + 8, y, channel_tiles + k++, clr, false); - draw_tile(CHAN_START_X + 16, y, channel_tiles + k++, clr, false); + draw_tile(CHAN_START_X, y, channel_tiles + k++, clr, true); + draw_tile(CHAN_START_X + 8, y, channel_tiles + k++, clr, true); + draw_tile(CHAN_START_X + 16, y, channel_tiles + k++, clr, true); } } @@ -418,6 +418,123 @@ draw_channel_cursor(size_t i, u8 clr) { draw_line(x0, y, x1, y, clr); } +#define PIANO_W 170 +#define PIANO_H 20 +#define PIANO_START_X 35 +#define PIANO_START_Y 65 +#define PIANO_NOTE_W 2 + +void +draw_note(u8 note, u8 clr) { + size_t octave = note / 12; + size_t value = note % 12; + + size_t x0; + size_t y0; + size_t x1; + size_t y1; + switch (value) { + // White notes. + case 0:{ + x0 = PIANO_START_X + 2 + octave * 28; + x1 = x0 + 1; + y0 = PIANO_START_Y + 2; + y1 = PIANO_START_Y - 2 + PIANO_H; + draw_filled_rect(x0, y0, x1, y1, clr); + x0 = PIANO_START_X + 2 + octave * 28 + 2; + x1 = x0; + y0 = y0 + 9; + draw_filled_rect(x0, y0, x1, y1, clr); + } break; + case 2:{ + x0 = PIANO_START_X + 2 + octave * 28 + 5; + x1 = x0; + y0 = PIANO_START_Y + 2; + y1 = PIANO_START_Y - 2 + 12; + draw_filled_rect(x0, y0, x1, y1, clr); + x0 = PIANO_START_X + 2 + octave * 28 + 4; + x1 = x0 + 2; + y0 = PIANO_START_Y - 2 + 13; + y1 = y0 + 7; + draw_filled_rect(x0, y0, x1, y1, clr); + } break; + case 4:{ + x0 = PIANO_START_X + 2 + octave * 28 + 9; + x1 = x0 + 1; + y0 = PIANO_START_Y + 2; + y1 = PIANO_START_Y - 2 + 12; + draw_filled_rect(x0, y0, x1, y1, clr); + x0 = PIANO_START_X + 2 + octave * 28 + 8; + x1 = x0 + 2; + y0 = PIANO_START_Y - 2 + 13; + y1 = y0 + 7; + draw_filled_rect(x0, y0, x1, y1, clr); + } break; + case 5:{ + x0 = PIANO_START_X + 2 + octave * 28 + 12; + x1 = x0 + 1; + y0 = PIANO_START_Y + 2; + y1 = PIANO_START_Y - 2 + PIANO_H; + draw_filled_rect(x0, y0, x1, y1, clr); + x0 = PIANO_START_X + 2 + octave * 28 + 14; + x1 = x0; + y0 = y0 + 9; + draw_filled_rect(x0, y0, x1, y1, clr); + } break; + case 7:{ + x0 = PIANO_START_X + 2 + octave * 28 + 17; + x1 = x0; + y0 = PIANO_START_Y + 2; + y1 = PIANO_START_Y - 2 + 12; + draw_filled_rect(x0, y0, x1, y1, clr); + x0 = PIANO_START_X + 2 + octave * 28 + 16; + x1 = x0 + 2; + y0 = PIANO_START_Y - 2 + 13; + y1 = y0 + 7; + draw_filled_rect(x0, y0, x1, y1, clr); + } break; + case 9:{ + x0 = PIANO_START_X + 2 + octave * 28 + 21; + x1 = x0; + y0 = PIANO_START_Y + 2; + y1 = PIANO_START_Y - 2 + 12; + draw_filled_rect(x0, y0, x1, y1, clr); + x0 = PIANO_START_X + 2 + octave * 28 + 20; + x1 = x0 + 2; + y0 = PIANO_START_Y - 2 + 13; + y1 = y0 + 7; + draw_filled_rect(x0, y0, x1, y1, clr); + } break; + case 11: { + x0 = PIANO_START_X + 2 + octave * 28 + 25; + x1 = x0 + 1; + y0 = PIANO_START_Y + 2; + y1 = PIANO_START_Y - 2 + 12; + draw_filled_rect(x0, y0, x1, y1, clr); + x0 = PIANO_START_X + 2 + octave * 28 + 24; + x1 = x0 + 2; + y0 = PIANO_START_Y - 2 + 13; + y1 = y0 + 7; + draw_filled_rect(x0, y0, x1, y1, clr); + } break; + default: + // TODO: + return; + } +} + +void +draw_piano(void) { + size_t x0 = PIANO_START_X; + size_t x1 = PIANO_START_X + PIANO_W; + size_t y0 = PIANO_START_Y; + size_t y1 = PIANO_START_Y + PIANO_H; + draw_rect(x0, y0, x1, y1, COL_FG); + for (size_t i = 0; i < 12 * 6; i++) { + draw_note(i, COL_FG); + } +} + void irq_timer(void) { if (ch1.active) { @@ -963,6 +1080,7 @@ sequencer_init(void) { // Initialize background objects and sprites. draw_triggers(); draw_channels(); + draw_piano(); // Initialize input handler. channel_selection_loc = 2; // DEBUG: Starting on CH3 -- cgit v1.2.1