// use led state buffer and dirty flags static void monome_grid_key_loopback(void* op, u32 edata) { u8 x, y, z; /// FIXME: this stuff should really be abstracted monome_grid_key_parse_event_data(edata, &x, &y, &z); monomeLedBuffer[x | (y << 4)] = z; monome_calc_quadrant_flag(x, y); }
static void handle_monome_grid_key(u32 data) { u8 x, y, z; /// FIXME: this stuff should really be abstracted monome_grid_key_parse_event_data(data, &x, &y, &z); monomeLedBuffer[x | (y << 4)] = z; monome_calc_quadrant_flag(x, y); }
static void op_step_handler(op_monome_t* op_monome, u32 edata) { static u8 x, y, z; u8 i; op_step_t* op = (op_step_t*)(op_monome->op); monome_grid_key_parse_event_data(edata, &x, &y, &z); // only care about key-downs if(z) { // row 0 = postion cut, set start point if(y==0) { op->s_start = x; monomeLedBuffer[monome_xy_idx(op->s_now, 0)] = 0; op->s_now = x; monomeLedBuffer[monome_xy_idx(op->s_now, 0)] = 15; op->s_end = op->s_start + op->s_length; if(op->s_end > (op->size-1)) op->s_end -= op->size; if(op->s_end >= op->s_start) for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 1)] = (i >= op->s_start && i <= op->s_end) * 15; } else { for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 1)] = (i >= op->s_start || i <= op->s_end) * 15; } } monome_set_quadrant_flag(0); if(op->size>8) monome_set_quadrant_flag(1); op->s_cut = 1; // row 1 = change loop point } else if(y==1) { op->s_end = x; op->s_length = op->s_end - op->s_start; if(op->s_length < 0) op->s_length += op->size; if(op->s_end >= op->s_start) for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 1)] = (i >= op->s_start && i <= op->s_end) * 15; } else { for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 1)] = (i >= op->s_start || i <= op->s_end) * 15; } } monome_set_quadrant_flag(0); if(op->size>8) monome_set_quadrant_flag(1); // set loop start 2 } else if(y==2) { op->s_start2 = x; monomeLedBuffer[monome_xy_idx(op->s_now2, 2)] = 0; op->s_now2 = x; monomeLedBuffer[monome_xy_idx(op->s_now2, 2)] = 15; op->s_end2 = op->s_start2 + op->s_length2; if(op->s_end2 > (op->size-1)) op->s_end2 -= op->size; if(op->s_end2 >= op->s_start2) for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 3)] = (i >= op->s_start2 && i <= op->s_end2) * 15; } else { for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 3)] = (i >= op->s_start2 || i <= op->s_end2) * 15; } } monome_set_quadrant_flag(0); if(op->size>8) monome_set_quadrant_flag(1); op->s_cut2 = 1; // row 3 = change loop point 2 } else if(y==3) { op->s_end2 = x; op->s_length2 = op->s_end2 - op->s_start2; if(op->s_length2 < 0) op->s_length2 += op->size; if(op->s_end2 >= op->s_start2) for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 3)] = (i >= op->s_start2 && i <= op->s_end2) * 15; } else { for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 3)] = (i >= op->s_start2 || i <= op->s_end2) * 15; } } monome_set_quadrant_flag(0); if(op->size>8) monome_set_quadrant_flag(1); // rows 4-7: set steps } else if(y>3 && y<8) { op->steps[y-4][x] ^= 15; monomeLedBuffer[monome_xy_idx(x, y)] = op->steps[y-4][x] * 15; monome_calc_quadrant_flag(x, y); } } }
static void handler_MonomeGridKey(s32 data) { u8 x, y, z, index, i1, found; monome_grid_key_parse_event_data(data, &x, &y, &z); // print_dbg("\r\n monome event; x: "); // print_dbg_hex(x); // print_dbg("; y: 0x"); // print_dbg_hex(y); // print_dbg("; z: 0x"); // print_dbg_hex(z); //// TRACK LONG PRESSES index = y*16 + x; if(z) { held_keys[key_count] = index; key_count++; key_times[index] = 10; //// THRESHOLD key hold time } else { found = 0; // "found" for(i1 = 0; i1<key_count; i1++) { if(held_keys[i1] == index) found++; if(found) held_keys[i1] = held_keys[i1+1]; } key_count--; // FAST PRESS if(key_times[index] > 0) { if(preset_mode == 1) { if(x == 0 && y != preset_select) { preset_select = y; for(i1=0;i1<8;i1++) glyph[i1] = flashy.glyph[preset_select][i1]; } else if(x==0 && y == preset_select) { flash_read(); preset_mode = 0; } monomeFrameDirty++; } // print_dbg("\r\nfast press: "); // print_dbg_ulong(index); // print_dbg(": "); // print_dbg_ulong(key_times[index]); } } // PRESET SCREEN if(preset_mode) { // glyph magic if(z && x>7) { glyph[y] ^= 1<<(x-8); } monomeFrameDirty++; } // NOT PRESET else { prev_mode = mode; // mode check if(x == 0) { kcount += (z<<1)-1; if(kcount < 0) kcount = 0; // print_dbg("\r\nkey count: "); // print_dbg_ulong(kcount); if(kcount == 1 && z == 1) mode = 1; else if(kcount == 0) mode = 0; if(z == 1 && mode == 1) { edit_row = y; monomeFrameDirty++; } } else if(x == 1 && mode != 0) { if(mode == 1 && z == 1) mode = 2; else if(mode == 2 && z == 0) mode = 1; } else if(mode == 0 && z == 1) { m.points[y] = x; m.points_save[y] = x; m.positions[y] = x; monomeFrameDirty++; } else if(mode == 1 && z == 1) { if(x > 1 && x < 7) { if(y != edit_row) { // filter out self-triggering m.trig_dests[edit_row] ^= (1<<y); monomeFrameDirty++; // post("\ntrig_dests", edit_row, ":", trig_dests[edit_row]); } } else if(x == 15) m.freezes[y] ^= 1; else if(x == 14) m.mutes[y] ^= 1; } else if(mode == 2 && z == 1) { if(x > 1 && x < 7) { m.rule_dests[edit_row] = y; monomeFrameDirty++; // post("\nrule_dests", edit_row, ":", rule_dests[edit_row]); } else if(x > 6) { m.rules[edit_row] = y; monomeFrameDirty++; // post("\nrules", edit_row, ":", rules[edit_row]); } } if(mode != prev_mode) { monomeFrameDirty++; // post("\nnew mode", mode); } } }