Beispiel #1
0
// 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);
}
Beispiel #2
0
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);

}
Beispiel #3
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);
    }
  }
}
Beispiel #4
0
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);
		}
	}
}