static void file_monome_out(rove_file_t *self, rove_monome_t *monome) { rove_monome_position_t pos; unsigned int row[2] = {0, 0}; uint16_t r; calculate_monome_pos(self->file_length * self->channels, rove_file_get_play_pos(self), self->row_span, (self->columns) ? self->columns : monome->cols, &pos); if( MONOME_POS_CMP(&pos, &self->monome_pos_old) || self->force_monome_update ) { if( self->force_monome_update ) { if( !self->group->active_loop ) monome_led_off(self->mapped_monome->dev, self->group->idx, 0); else monome_led_on(self->mapped_monome->dev, self->group->idx, 0); monome->dirty_field &= ~(1 << self->y); self->force_monome_update = 0; } if( pos.y != self->monome_pos_old.y ) monome_led_row_16(monome->dev, self->y + self->monome_pos_old.y, row); MONOME_POS_CPY(&self->monome_pos_old, &pos); if( rove_file_is_active(self) ) { r = 1 << pos.x; row[0] = r & 0x00FF; row[1] = r >> 8; } monome_led_row_16(monome->dev, self->y + pos.y, row); } MONOME_POS_CPY(&self->monome_pos, &pos); }
// TODO nomenclature is rather bad here, lets rename this to better fit the api direction void loop_playback_midi_event(const monome_event_t * e, void * user_data) { // TODO Refactor with play_midi in dispatch_functions.c unsigned char * midi_data; //midi_data = (unsigned char *) midi_data_from_monome_event(midi_data, e, user_data); int midi_note_message_len = 3; midi_data = (unsigned char *) calloc(midi_note_message_len, sizeof(unsigned char)); int event_x, event_y, event_type; mumble_t *mumble = (mumble_t *) user_data; event_x = e->grid.x; event_y = e->grid.y; event_type = e->event_type; int midi_note = ((mumble->root * (event_y + 1)) + event_x); midi_data[1] = midi_note; midi_data[2] = mumble->velocity; if(e->event_type == MONOME_BUTTON_DOWN) { midi_data[0] = MIDI_NOTE_ON; monome_led_on(e->monome, e->grid.x, e->grid.y); } else { midi_data[0] = MIDI_NOTE_OFF; monome_led_off(e->monome, e->grid.x, e->grid.y); } mumble_write_to_midi_device(mumble, midi_data); }
/** * this function gets registered with monome_register_handler * it gets called whenever a button is pressed */ void handle_press(const monome_event_t *e, void *data) { uint x, y; x = e->x; y = e->y; if( grid[x][y] ) monome_led_off(e->monome, x, y); else monome_led_on(e->monome, x, y); /* toggle the button */ grid[x][y] = !grid[x][y]; }