static void handler_MonomeConnect(s32 data) { // print_dbg("\r\n// monome connect /////////////////"); key_count = 0; SIZE = monome_size_x(); LENGTH = SIZE - 1; // print_dbg("\r monome size: "); // print_dbg_ulong(SIZE); VARI = monome_is_vari(); // print_dbg("\r monome vari: "); // print_dbg_ulong(VARI); if(VARI) re = &refresh; else re = &refresh_mono; shape_key_count = 0; key_count = 0; timers_set_monome(); monome_set_quadrant_flag(0); monome_set_quadrant_flag(1); // turn on ADC polling, reset hysteresis adc_convert(&adc); reset_hys(); timer_add(&adcTimer,61,&adcTimer_callback, NULL); }
//////////////////////////////////////////////////////////////////////////////// // application grid redraw static void refresh() { u8 i1, i2, i3; // clear grid for(i1=0;i1<128;i1++) monomeLedBuffer[i1] = 0; // SET POSITIONS if(mode == 0) { for(i1=0;i1<8;i1++) { for(i2=m.positions[i1];i2<=m.points[i1];i2++) monomeLedBuffer[i1*16 + i2] = L1; monomeLedBuffer[i1*16 + m.positions[i1]] = L2; } } // SET ROUTING else if(mode == 1) { monomeLedBuffer[edit_row * 16] = L1; monomeLedBuffer[edit_row * 16 + 1] = L1; for(i1=0;i1<8;i1++) { if((m.trig_dests[edit_row] & (1<<i1)) != 0) { for(i2=0;i2<=m.points[i1];i2++) monomeLedBuffer[i1*16 + i2] = L2; } monomeLedBuffer[i1*16 + m.positions[i1]] = L0; } } // SET RULES else if(mode == 2) { monomeLedBuffer[edit_row * 16] = L1; monomeLedBuffer[edit_row * 16 + 1] = L1; for(i1=2;i1<7;i1++) monomeLedBuffer[m.rule_dests[edit_row] * 16 + i1] = L2; for(i1=8;i1<16;i1++) monomeLedBuffer[m.rules[edit_row] * 16 + i1] = L0; for(i1=0;i1<8;i1++) monomeLedBuffer[i1*16 + m.positions[i1]] = L0; for(i1=0;i1<8;i1++) { i3 = sign[m.rules[edit_row]][i1]; for(i2=0;i2<8;i2++) { if((i3 & (1<<i2)) != 0) monomeLedBuffer[i1*16 + 8 + i2] = L2; } } monomeLedBuffer[m.rules[edit_row] * 16 + 7] = L2; } monome_set_quadrant_flag(0); monome_set_quadrant_flag(1); }
static void refresh_preset() { u8 i1,i2; for(i1=0;i1<128;i1++) monomeLedBuffer[i1] = 0; monomeLedBuffer[preset_select * 16] = 11; for(i1=0;i1<8;i1++) for(i2=0;i2<8;i2++) if(glyph[i1] & (1<<i2)) monomeLedBuffer[i1*16+i2+8] = 11; monome_set_quadrant_flag(0); monome_set_quadrant_flag(1); }
//------------------------------------------------- //----- extern function definition void op_step_init(void* mem) { u8 i; // print_dbg("\r\n op_step_init "); op_step_t* op = (op_step_t*)mem; // superclass functions //--- op op->super.in_fn = op_step_in_fn; op->super.pickle = (op_pickle_fn) (&op_step_pickle); op->super.unpickle = (op_unpickle_fn) (&op_step_unpickle); //--- monome op->monome.handler = (monome_handler_t)&op_step_handler; op->monome.op = op; // superclass state op->super.type = eOpStep; op->super.flags |= (1 << eOpFlagMonomeGrid); op->super.numInputs = 3; op->super.numOutputs = 8; op->super.in_val = op->in_val; op->super.out = op->outs; op->super.opString = op_step_opstring; op->super.inString = op_step_instring; op->super.outString = op_step_outstring; op->in_val[0] = &(op->focus); op->in_val[1] = &(op->size); op->outs[0] = -1; op->outs[1] = -1; op->outs[2] = -1; op->outs[3] = -1; op->outs[4] = -1; op->outs[5] = -1; op->outs[6] = -1; op->outs[7] = -1; op->s_start = 0; op->s_end = 7; op->s_length = 7; op->s_now = 0; op->s_cut = 0; op->s_start2 = 0; op->s_end2 = 7; op->s_length2 = 7; op->s_now2 = 0; op->s_cut2 = 0; op->size = monome_size_x(); op->focus = OP_ONE; net_monome_set_focus(&(op->monome), 1); // init monome drawing, maybe should clear first monomeLedBuffer[monome_xy_idx(0, 0)] = 15; monomeLedBuffer[monome_xy_idx(0, 2)] = 15; for(i=0;i<op->size;i++) { monomeLedBuffer[monome_xy_idx(i, 1)] = 15; monomeLedBuffer[monome_xy_idx(i, 3)] = 15; } monome_set_quadrant_flag(0); }
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 op_step_in_step(op_step_t* op, const io_t v) { s8 i; if(op->s_cut == 0) { monomeLedBuffer[monome_xy_idx(op->s_now, 0)] = 0; if(v > 0) { for(i=0;i<v;i++) { if(op->s_now == op->s_end) op->s_now = op->s_start; else { op->s_now++; if(op->s_now == op->size) op->s_now = 0; } } } else { for(i=v;i<0;i++) { if(op->s_now == op->s_start) op->s_now = op->s_end; else if(op->s_now == 0) op->s_now = op->size - 1; else op->s_now--; } } monomeLedBuffer[monome_xy_idx(op->s_now, 0)] = 15; monome_set_quadrant_flag(0); monome_set_quadrant_flag(1); } if(op->s_cut2 == 0) { monomeLedBuffer[monome_xy_idx(op->s_now2, 2)] = 0; if(v > 0) { for(i=0;i<v;i++) { if(op->s_now2 == op->s_end2) op->s_now2 = op->s_start2; else { op->s_now2++; if(op->s_now2 == op->size) op->s_now2 = 0; } } } else { for(i=v;i<0;i++) { if(op->s_now2 == op->s_start2) op->s_now2 = op->s_end2; else if(op->s_now2 == 0) op->s_now2 = op->size - 1; else op->s_now2--; } } monomeLedBuffer[monome_xy_idx(op->s_now2, 2)] = 15; monome_set_quadrant_flag(0); monome_set_quadrant_flag(1); } op->s_cut = 0; op->s_cut2 = 0; net_activate(op->outs[0], op->steps[0][op->s_now], op); net_activate(op->outs[1], op->steps[1][op->s_now], op); net_activate(op->outs[2], op->steps[2][op->s_now], op); net_activate(op->outs[3], op->steps[3][op->s_now], op); i = (op->steps[0][op->s_now]) + (op->steps[1][op->s_now] << 1) + (op->steps[2][op->s_now] << 2) + (op->steps[3][op->s_now] << 3); net_activate(op->outs[4], i, op); net_activate(op->outs[5], op->s_now, op); i = (op->steps[0][op->s_now2]) + (op->steps[1][op->s_now2] << 1) + (op->steps[2][op->s_now2] << 2) + (op->steps[3][op->s_now2] << 3); net_activate(op->outs[6], i, op); net_activate(op->outs[7], op->s_now2, op); }