From c576d32bf9c4b2e480246ae016c5fc9cfb173f5a Mon Sep 17 00:00:00 2001 From: codicusmaximus Date: Sat, 8 Jul 2017 13:32:44 -0400 Subject: [PATCH] Many note mode tweaks for usability and implementation of feature request for highlighting notes in scale --- include/colors.h | 11 +++++ include/data.h | 1 + include/interface.h | 1 + include/keyboard.h | 4 +- include/layout.h | 7 +++ include/scale.h | 12 +++++ include/sequence.h | 3 +- resources/subsequencely.syx | Bin 48923 -> 49891 bytes src/colors.c | 66 +++++++++++++++++++++++-- src/grid.c | 4 +- src/keyboard.c | 19 ++++++-- src/layout.c | 95 +++++++++++++++++++++++++++++------- src/scale.c | 21 ++++++++ src/seq.c | 19 ++++++-- 14 files changed, 229 insertions(+), 34 deletions(-) diff --git a/include/colors.h b/include/colors.h index b4cc95e..134e777 100644 --- a/include/colors.h +++ b/include/colors.h @@ -5,13 +5,24 @@ extern const uint8_t root_note_color[3]; extern const uint8_t white_note_color[3]; extern const uint8_t black_note_color[3]; +extern const uint8_t invalid_note_color[3]; extern const uint8_t c_note_color[3]; extern const uint8_t no_note_color[3]; + +extern const uint8_t layout_octave_color[3]; +extern const uint8_t layout_transpose_color[3]; + extern const uint8_t white_key_color[3]; extern const uint8_t black_key_color[3]; extern const uint8_t slider_color[3]; extern const uint8_t off_color[3]; extern const uint8_t on_color[3]; + +extern const uint8_t note_octave_up_colors[10][3]; +extern const uint8_t note_octave_down_colors[10][3]; +extern const uint8_t note_transpose_up_colors[12][3]; +extern const uint8_t note_transpose_down_colors[12][3]; + extern const uint8_t sequence_colors[8][3]; extern const uint8_t number_colors[4][3]; extern const uint8_t drum_colors[4][3]; diff --git a/include/data.h b/include/data.h index 095e13f..635d9ce 100644 --- a/include/data.h +++ b/include/data.h @@ -74,6 +74,7 @@ extern Note* lp_note_storage; extern Scale lp_scale; extern Voices lp_voices; extern PadNotes lp_pad_notes; +extern PadNotes lp_pad_highlights; extern Sequencer lp_sequencer; // Setup UI elements diff --git a/include/interface.h b/include/interface.h index c15226c..40de8c8 100644 --- a/include/interface.h +++ b/include/interface.h @@ -48,6 +48,7 @@ #define VELOCITY_CHECKBOX_POS (41) #define MOD_WHEEL_CHECKBOX_POS (43) #define MOD_CC_CHECKBOX_POS (53) +#define NOTE_HIGHLIGHT_ONLY_POS (28) #define DRUM_CHECKBOX_POS (45) #define MULTICHANNEL_CHECKBOX_POS (55) #define CONTROL_CHECKBOX_POS (81) diff --git a/include/keyboard.h b/include/keyboard.h index 41143dc..ae3c51c 100644 --- a/include/keyboard.h +++ b/include/keyboard.h @@ -30,10 +30,10 @@ typedef struct void keyboard_init(Keyboard* k, Layout* l); /// Toggles a note on or off and updates the layout and scale to match. -uint8_t keyboard_handle_press(Keyboard* k, uint8_t index, uint8_t value); +uint8_t keyboard_handle_press(Keyboard* k, uint8_t index, uint8_t value, uint8_t is_highlight_press); /// Draws the keyboard to the grid. -void keyboard_draw(Keyboard* k); +void keyboard_draw(Keyboard* k, uint8_t draw_highlighted); /// When a change is made to the layout or scale, this function updates the /// keyboard to reflect the current state. diff --git a/include/layout.h b/include/layout.h index 649e43e..cbf658b 100644 --- a/include/layout.h +++ b/include/layout.h @@ -10,6 +10,8 @@ #include "voices.h" #include "util.h" +#define LAYOUT_DEFAULT_OCTAVE 3 + /// The bits where row offset lives. Excludes the drum flag bit, so that /// the drums state doesn't get trashed when you use the row offset slider. #define ROW_OFFSET_MASK (0x7F) @@ -26,6 +28,9 @@ typedef enum /// calculating every time a pad is pressed. typedef int8_t PadNotes[GRID_SIZE][GRID_SIZE]; +/// Cache of which pads are highlighted for note mode +typedef int8_t PadHighlights[GRID_SIZE]; + /// Represents a layout of a scale on a grid. Determines which note and octave /// to start from, and the distance in scale steps between rows of the grid. typedef struct @@ -64,6 +69,8 @@ void layout_set_drums(Layout* l); /// Toggles the note in the scale, and updates the layout. void layout_toggle_note(Layout* l, uint8_t note); +/// Toggles the note highlight +void layout_toggle_highlight(Layout* l, uint8_t note_highlight); /// Draws the layout onto the grid. void layout_draw(Layout* l); diff --git a/include/scale.h b/include/scale.h index 0f29cdb..bdd6852 100644 --- a/include/scale.h +++ b/include/scale.h @@ -15,6 +15,11 @@ typedef struct /// note) is enabled. [0] (the root note) is always on. uint16_t notes; + /// Bitfield indicating whether the nth note is lighted or not + /// which applies if the highlight setting is turned on + /// Otherwise, white keys are lighted and black keys are dark + uint16_t notes_highlighted; + /// Array of ints indicating how many half steps the nth scale note is /// offset from the root note (only the first num_notes entries are set) int8_t offsets[NUM_NOTES]; @@ -28,6 +33,10 @@ void scale_init(Scale* s); /// root note) is contained in the scale. uint8_t scale_contains_note(Scale* s, uint8_t note); +/// Returns true or false depending on whether then nth note (counted from the +/// root note) is contained in the scale's highlight list +uint8_t scale_contains_highlight(Scale* s, uint8_t note); + /// Sets all the notes of the scale at once. void scale_set_notes(Scale* s, uint16_t notes); @@ -35,4 +44,7 @@ void scale_set_notes(Scale* s, uint16_t notes); /// offsets. void scale_toggle_note(Scale* s, uint8_t note); +/// Toggles the nth note's highlight +void scale_toggle_highlight(Scale* s, uint8_t note); + #endif diff --git a/include/sequence.h b/include/sequence.h index 9aa42cf..8fcde68 100644 --- a/include/sequence.h +++ b/include/sequence.h @@ -43,7 +43,8 @@ typedef enum SEQ_DRUM_MULTICHANNEL = 1 << 11, // Send each note on its own channel SEQ_FULL_VELOCITY = 1 << 12, // Always send notes at full velocity SEQ_MOD_WHEEL = 1 << 13, // Show the mod wheel in notes mode - SEQ_MOD_CC = 1 << 14 // Send CC from mod wheel instead of aftertouch + SEQ_MOD_CC = 1 << 14, // Send CC from mod wheel instead of aftertouch + NOTE_HIGHLIGHT_ONLY = 1 << 15 // Always show all notes and only highlight the ones in the scale } SequenceFlags; #define SEQ_QUEUED_OFFSET (4) diff --git a/resources/subsequencely.syx b/resources/subsequencely.syx index 175ce3c5626a5349ee95c39b22bee2eeae40d8e6..1c52164a9f17d8c038d4ba224ab08f1e2bb33e81 100644 GIT binary patch literal 49891 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 literal 48923 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 Bo0|Xt diff --git a/src/colors.c b/src/colors.c index 5eb0a07..08adae6 100644 --- a/src/colors.c +++ b/src/colors.c @@ -2,18 +2,78 @@ #include "app.h" #include "colors.h" -const uint8_t root_note_color[3] = {0x0F, 0x04, 0x04}; -const uint8_t white_note_color[3] = {0x02, 0x02, 0x06}; -const uint8_t black_note_color[3] = {0x00, 0x00, 0x00}; +const uint8_t root_note_color[3] = {0x78, 0x20, 0x20}; +const uint8_t white_note_color[3] = {0x10, 0x10, 0x30}; +const uint8_t black_note_color[3] = {0x04, 0x04, 0x04}; +const uint8_t invalid_note_color[3] = {0x3F, 0x00, 0x00}; const uint8_t c_note_color[3] = {0x02, 0x06, 0x02}; const uint8_t no_note_color[3] = {0x0F, 0x00, 0x00}; +const uint8_t layout_octave_color[3] = {0x00, 0x00, 0xFF}; +const uint8_t layout_transpose_color[3] = {0x00, 0xFF, 0x00}; + const uint8_t white_key_color[3] = {0x0F, 0x2F, 0x7F}; const uint8_t black_key_color[3] = {0x3F, 0x00, 0x17}; const uint8_t slider_color[3] = {0x07, 0x7F, 0x0F}; const uint8_t off_color[3] = {0x00, 0x00, 0x00}; const uint8_t on_color[3] = {0xFF, 0xFF, 0xFF}; +const uint8_t note_octave_up_colors[10][3] = { + {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x02}, + {0x00, 0x00, 0x08}, + {0x00, 0x00, 0x20}, // Default Octave + {0x00, 0x00, 0x28}, + {0x00, 0x00, 0x30}, + {0x00, 0x00, 0x3F}, + {0x10, 0x00, 0x3F}, + {0x3F, 0x00, 0x20}, + {0x3F, 0x00, 0x00} +}; + +const uint8_t note_octave_down_colors[10][3] = { + {0x00, 0x00, 0x3F}, + {0x00, 0x00, 0x30}, + {0x00, 0x00, 0x28}, + {0x00, 0x00, 0x20}, // Default Octave + {0x00, 0x00, 0x08}, + {0x00, 0x00, 0x02}, + {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00} +}; + +const uint8_t note_transpose_up_colors[12][3] = { + {0x00, 0x00, 0x00}, // 0 (default / no transposition) + {0x00, 0x04, 0x00}, // +1 + {0x00, 0x20, 0x00}, // +2 + {0x00, 0x3F, 0x00}, // +3 + {0x0F, 0x37, 0x00}, // +4 + {0x1F, 0x2F, 0x00}, // +5 + {0x2F, 0x27, 0x00}, //+-6 + {0x00, 0x00, 0x00}, // -5 + {0x00, 0x00, 0x00}, // -4 + {0x00, 0x00, 0x00}, // -3 + {0x00, 0x00, 0x00}, // -2 + {0x00, 0x00, 0x00} // -1 +}; + +const uint8_t note_transpose_down_colors[12][3] = { + {0x00, 0x00, 0x00}, // 0 (default / no transposition) + {0x00, 0x00, 0x00}, // +1 + {0x00, 0x00, 0x00}, // +2 + {0x00, 0x00, 0x00}, // +3 + {0x00, 0x00, 0x00}, // +4 + {0x00, 0x00, 0x00}, // +5 + {0x2F, 0x27, 0x00}, //+-6 + {0x1F, 0x2F, 0x00}, // -5 + {0x0F, 0x37, 0x00}, // -4 + {0x00, 0x3F, 0x00}, // -3 + {0x00, 0x20, 0x00}, // -2 + {0x00, 0x04, 0x00} // -1 +}; + const uint8_t sequence_colors[8][3] = { {0x7F, 0x00, 0x00}, {0x3F, 0x0F, 0x00}, diff --git a/src/grid.c b/src/grid.c index 60b5f04..ebc1a02 100644 --- a/src/grid.c +++ b/src/grid.c @@ -23,7 +23,7 @@ void grid_update_cache(Sequencer* sr, int8_t translation) } else if (translation == -1) { - uint8_t scale_deg = (s->y + GRID_SIZE) % lp_scale.num_notes; + //uint8_t scale_deg = (s->y + GRID_SIZE) % lp_scale.num_notes; for (uint8_t i = GRID_SIZE; i > 0; i--) { note_numbers[i] = note_numbers[i - 1]; @@ -63,7 +63,7 @@ void grid_draw(Sequencer* sr) for (uint8_t x = 0; x < GRID_SIZE; x++) { uint8_t seq_x = grid_to_sequence_x(s, x); - Note* n; + Note* n = 0; uint8_t y; for (uint8_t n_i = 0; n_i < zoom; n_i++) diff --git a/src/keyboard.c b/src/keyboard.c index 2fca073..4e45cae 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -58,7 +58,7 @@ uint8_t keyboard_index_is_key(Keyboard* k, uint8_t index) return k->index_to_note[index - FIRST_KEYBOARD_PAD] != -1; } -uint8_t keyboard_handle_press(Keyboard* k, uint8_t index, uint8_t value) +uint8_t keyboard_handle_press(Keyboard* k, uint8_t index, uint8_t value, uint8_t is_highlight_press) { if (value == 0 || !keyboard_index_is_key(k, index)) { @@ -68,12 +68,18 @@ uint8_t keyboard_handle_press(Keyboard* k, uint8_t index, uint8_t value) uint8_t deg = (k->index_to_note[index - FIRST_KEYBOARD_PAD] - k->layout->root_note + NUM_NOTES) % NUM_NOTES; - layout_toggle_note(k->layout, deg); - + if (is_highlight_press) + { + layout_toggle_highlight(k->layout, deg); + } + else + { + layout_toggle_note(k->layout, deg); + } return 1; } -void keyboard_draw(Keyboard* k) +void keyboard_draw(Keyboard* k, uint8_t draw_highlighted) { const uint8_t* color = white_key_color; @@ -99,7 +105,10 @@ void keyboard_draw(Keyboard* k) } int8_t deg = (note + NUM_NOTES - k->layout->root_note) % NUM_NOTES; - uint8_t is_in_scale = scale_contains_note(&lp_scale, deg); + if (draw_highlighted && !scale_contains_note(&lp_scale, deg)) { + color = invalid_note_color; + } + uint8_t is_in_scale = draw_highlighted ? scale_contains_highlight(&lp_scale, deg) : scale_contains_note(&lp_scale, deg); uint8_t dimness = !is_in_scale * 4; plot_pad_dim(i + FIRST_KEYBOARD_PAD, color, dimness); } diff --git a/src/layout.c b/src/layout.c index 706d2b1..3aec9ce 100644 --- a/src/layout.c +++ b/src/layout.c @@ -9,7 +9,7 @@ void layout_init(Layout* l) { l->root_note = 0; - l->octave = 2; + l->octave = LAYOUT_DEFAULT_OCTAVE; l->row_offset = 5; } @@ -105,6 +105,7 @@ void layout_assign_scale(Layout* l) note_number += lp_scale.offsets[scale_deg]; lp_pad_notes[y][x] = note_number; + lp_pad_highlights[y][x] = scale_contains_highlight(&lp_scale, lp_scale.offsets[scale_deg]); } start_scale_deg += l->row_offset; @@ -117,9 +118,18 @@ void layout_toggle_note(Layout* l, uint8_t note) layout_assign_pads(l); } +void layout_toggle_highlight(Layout* l, uint8_t note_highlight) +{ + scale_toggle_highlight(&lp_scale, note_highlight); + layout_assign_pads(l); +} + void layout_transpose(Layout* l, int8_t direction) { - if (direction == -1 && l->root_note == 0 && l->octave > 0) + if (direction == 0) { + l->root_note = 0; + } + else if (direction == -1 && l->root_note == 0 && l->octave > 0) { l->octave -= 1; l->root_note = NUM_NOTES -1; @@ -138,7 +148,11 @@ void layout_transpose(Layout* l, int8_t direction) void layout_transpose_octave(Layout* l, int8_t direction) { - l->octave = clamp(l->octave + direction, 0, NUM_OCTAVES - 1); + if (direction == 0) { + l->octave = LAYOUT_DEFAULT_OCTAVE; + } else { + l->octave = clamp(l->octave + direction, 0, NUM_OCTAVES - 1); + } layout_assign_pads(l); } @@ -196,19 +210,17 @@ void layout_light_scale(Layout* l, uint8_t note_number, uint8_t on) { uint8_t index = FIRST_PAD; const uint8_t* color = off_color; + uint8_t dimness = 3; if (on) { color = on_color; + dimness = 0; } else if (layout_is_root_note(l, note_number)) { color = root_note_color; } - else if (note_number % NUM_NOTES == 0) - { - color = c_note_color; - } else if (diatonic_notes[note_number % NUM_NOTES]) { color = white_note_color; @@ -218,6 +230,14 @@ void layout_light_scale(Layout* l, uint8_t note_number, uint8_t on) color = black_note_color; } + if (note_number < 0) { + color = invalid_note_color; + } + else if (note_number % NUM_NOTES == 0) + { + dimness = 0; + } + for (uint8_t y = 0; y < GRID_SIZE; y++) { if (lp_pad_notes[y][GRID_SIZE - 1] < note_number) @@ -238,7 +258,7 @@ void layout_light_scale(Layout* l, uint8_t note_number, uint8_t on) continue; } - plot_pad(coord_to_index(x, y), color); + plot_pad_dim(coord_to_index(x, y), color, dimness); index++; } @@ -250,35 +270,53 @@ void layout_light_scale(Layout* l, uint8_t note_number, uint8_t on) /******************************************************************************* * Event handling functions ******************************************************************************/ - +uint8_t last_pressed = 0; uint8_t layout_handle_transpose(Layout* l, uint8_t index, uint8_t value) { if (value == 0) { + last_pressed = 0; return 0; } if (index == LP_TRANSPOSE_UP) { - layout_transpose(l, 1); + if (last_pressed == LP_TRANSPOSE_DOWN) { + layout_transpose(l, 0); // Reset to default + } else { + layout_transpose(l, 1); + } } else if (index == LP_TRANSPOSE_DOWN) { - layout_transpose(l, -1); + if (last_pressed == LP_TRANSPOSE_UP) { + layout_transpose(l, 0); // Reset to default + } else { + layout_transpose(l, -1); + } } else if (index == LP_OCTAVE_UP) { - layout_transpose_octave(l, 1); + if (last_pressed == LP_OCTAVE_DOWN) { + layout_transpose_octave(l, 0); // Reset to default + } else { + layout_transpose_octave(l, 1); + } } else if (index == LP_OCTAVE_DOWN) { - layout_transpose_octave(l, -1); + if (last_pressed == LP_OCTAVE_UP) { + layout_transpose_octave(l, 0); // Reset to default + } else { + layout_transpose_octave(l, -1); + } } else { + last_pressed = 0; return 0; } - + last_pressed = index; return 1; } @@ -302,21 +340,30 @@ void layout_draw(Layout* l) void layout_draw_scale(Layout* l) { uint8_t index = FIRST_PAD; + uint8_t draw_using_highlights = flag_is_set(sequencer_get_active(&lp_sequencer)->flags, NOTE_HIGHLIGHT_ONLY); for (uint8_t y = 0; y < GRID_SIZE; y++) { for (uint8_t x = 0; x < GRID_SIZE; x++) { const uint8_t* color = off_color; + uint8_t dimness = 3; int8_t note_number = lp_pad_notes[y][x]; if (layout_is_root_note(l, note_number)) { color = root_note_color; } - else if (note_number % NUM_NOTES == 0) + else if (draw_using_highlights) { - color = c_note_color; + if (lp_pad_highlights[y][x]) + { + color = white_note_color; + } + else + { + color = black_note_color; + } } else if (diatonic_notes[note_number % NUM_NOTES]) { @@ -327,12 +374,26 @@ void layout_draw_scale(Layout* l) color = black_note_color; } - plot_pad(index, color); + if (note_number < 0) { + color = invalid_note_color; + } + else if (note_number % NUM_NOTES == 0) + { + dimness = 0; + } + + plot_pad_dim(index, color, dimness); index++; } index += ROW_GAP; } + + plot_pad(LP_OCTAVE_UP, note_octave_up_colors[l->octave]); + plot_pad(LP_OCTAVE_DOWN, note_octave_down_colors[l->octave]); + plot_pad(LP_TRANSPOSE_UP, note_transpose_up_colors[l->root_note]); + plot_pad(LP_TRANSPOSE_DOWN, note_transpose_down_colors[l->root_note]); + } void layout_draw_drums(Layout* l) diff --git a/src/scale.c b/src/scale.c index 9884e1a..8a93072 100644 --- a/src/scale.c +++ b/src/scale.c @@ -6,6 +6,7 @@ void scale_init(Scale* s) { s->num_notes = NUM_NOTES; s->notes = 0x0FFF; + s->notes_highlighted = 0x0AB5; for (uint8_t i = 0; i < NUM_NOTES; i++) { @@ -42,6 +43,11 @@ uint8_t scale_contains_note(Scale* s, uint8_t note) return flag_is_set(s->notes, 1 << note); } +uint8_t scale_contains_highlight(Scale* s, uint8_t note) +{ + return flag_is_set(s->notes_highlighted, 1 << note); +} + void scale_set_notes(Scale* s, uint16_t notes) { s->notes = notes; @@ -56,6 +62,11 @@ void scale_set_notes(Scale* s, uint16_t notes) scale_update_offsets(s); } +void scale_set_highlights(Scale* s, uint16_t notes_highlighted) +{ + s->notes_highlighted = notes_highlighted; +} + void scale_toggle_note(Scale* s, uint8_t note) { if (note < 1 || note >= NUM_NOTES) @@ -79,4 +90,14 @@ void scale_toggle_note(Scale* s, uint8_t note) scale_update_offsets(s); } +void scale_toggle_highlight(Scale* s, uint8_t note) +{ + if (note < 1 || note >= NUM_NOTES) + { + return; + } + s->notes_highlighted = toggle_flag(s->notes_highlighted, 1 << note); +} + + diff --git a/src/seq.c b/src/seq.c index d2e6a6f..deb4de1 100644 --- a/src/seq.c +++ b/src/seq.c @@ -6,8 +6,8 @@ ******************************************************************************/ // Global settings -uint8_t lp_midi_port = USBMIDI; -uint8_t lp_rcv_clock_port = USBMIDI; +uint8_t lp_midi_port = DINMIDI; +uint8_t lp_rcv_clock_port = DINMIDI; // Program state LpState lp_state = LP_NUM_MODES; @@ -26,6 +26,7 @@ Note* lp_note_storage = (Note*)(lp_buffer + sizeof(uint32_t)) + NOTE_BANK_SIZE; Scale lp_scale; Voices lp_voices; PadNotes lp_pad_notes; +PadNotes lp_pad_highlights; Sequencer lp_sequencer; // UI @@ -363,7 +364,7 @@ void notes_setup_draw() Sequence* s = sequencer_get_active(&lp_sequencer); Layout* l = &s->layout; - keyboard_draw(&lp_keyboard); + keyboard_draw(&lp_keyboard, flag_is_set(s->flags, NOTE_HIGHLIGHT_ONLY)); slider_draw(&lp_row_offset_slider, ROW_OFFSET_POS, ROW_OFFSET_COLOR); checkbox_draw(s->flags, SEQ_RECORD_CONTROL, CONTROL_CHECKBOX_POS); @@ -372,6 +373,7 @@ void notes_setup_draw() checkbox_draw(s->flags, SEQ_FULL_VELOCITY, VELOCITY_CHECKBOX_POS); checkbox_draw(s->flags, SEQ_MOD_WHEEL, MOD_WHEEL_CHECKBOX_POS); checkbox_draw(s->flags, SEQ_MOD_CC, MOD_CC_CHECKBOX_POS); + checkbox_draw(s->flags, NOTE_HIGHLIGHT_ONLY, NOTE_HIGHLIGHT_ONLY_POS); number_draw(s->control_code, CC_POS, CC_BITS, CC_COLOR); @@ -441,6 +443,12 @@ uint8_t notes_setup_handle_press(uint8_t index, uint8_t value) if (slider_handle_press(&lp_row_offset_slider, index, value, ROW_OFFSET_POS)) { layout_set_row_offset(l, lp_row_offset_slider.value + 1); + } + else if (checkbox_handle_press( + s->flags, NOTE_HIGHLIGHT_ONLY, + index, value, NOTE_HIGHLIGHT_ONLY_POS)) + { + } else if (checkbox_handle_press( s->flags, SEQ_RECORD_CONTROL, @@ -519,7 +527,10 @@ uint8_t notes_setup_handle_press(uint8_t index, uint8_t value) { keyboard_update_indices(&lp_keyboard); } - else if (keyboard_handle_press(&lp_keyboard, index, value)) { } + else if (keyboard_handle_press(&lp_keyboard, index, value, flag_is_set(s->flags, NOTE_HIGHLIGHT_ONLY))) + { + + } else { return 0;