#include "sequence.h" void delete_sequence_step(FlizzerTrackerApp *tracker) { uint8_t sequence_position = tracker->tracker_engine.sequence_position; uint8_t *pattern = &tracker->tracker_engine.song->sequence.sequence_step[sequence_position].pattern_indices[tracker->current_channel]; *pattern = 0; } void edit_sequence_step(FlizzerTrackerApp *tracker, int8_t delta) { uint8_t digit = tracker->current_digit; uint8_t sequence_position = tracker->tracker_engine.sequence_position; uint8_t pattern_index = tracker->tracker_engine.song->sequence.sequence_step[sequence_position].pattern_indices[tracker->current_channel]; uint8_t *pattern = &tracker->tracker_engine.song->sequence.sequence_step[sequence_position].pattern_indices[tracker->current_channel]; uint8_t temp_pattern = *pattern; switch (digit) { case 0: // upper nibble { int8_t nibble = ((pattern_index & 0xf0) >> 4); if (nibble + delta < 0) { nibble = 0xf; } else if (nibble + delta > 0xf) { nibble = 0; } else { nibble += delta; } temp_pattern &= 0xf0; temp_pattern |= (nibble << 4); break; } case 1: // lower nibble { int8_t nibble = (pattern_index & 0x0f); if (nibble + delta < 0) { nibble = 0xf; } else if (nibble + delta > 0xf) { nibble = 0; } else { nibble += delta; } temp_pattern &= 0xf0; temp_pattern |= nibble; break; } } if (check_and_allocate_pattern(&tracker->song, temp_pattern)) { *pattern = temp_pattern; } } void sequence_edit_event(FlizzerTrackerApp *tracker, FlizzerTrackerEvent *event) { if (event->input.key == InputKeyOk && event->input.type == InputTypeShort && !tracker->tracker_engine.playing) { tracker->editing = !tracker->editing; } if (event->input.key == InputKeyRight && event->input.type == InputTypeShort && tracker->editing) { tracker->current_digit++; if (tracker->current_digit > 1) { tracker->current_channel++; tracker->current_digit = 0; if (tracker->current_channel > SONG_MAX_CHANNELS - 1) { tracker->current_channel = 0; } } } if (event->input.key == InputKeyLeft && event->input.type == InputTypeShort && tracker->editing) { tracker->current_digit--; if (tracker->current_digit > 1) // unsigned int overflow { tracker->current_channel--; tracker->current_digit = 1; if (tracker->current_channel > SONG_MAX_CHANNELS - 1) // unsigned int overflow { tracker->current_channel = SONG_MAX_CHANNELS - 1; } } } if (event->input.key == InputKeyDown && event->input.type == InputTypeShort) { if (!(tracker->editing)) { tracker->tracker_engine.sequence_position++; if (tracker->tracker_engine.sequence_position >= tracker->tracker_engine.song->num_sequence_steps) { tracker->tracker_engine.sequence_position = 0; } } if (tracker->editing) { edit_sequence_step(tracker, -1); } } if (event->input.key == InputKeyUp && event->input.type == InputTypeShort) { if (!(tracker->editing)) { int16_t temp_sequence_position = tracker->tracker_engine.sequence_position - 1; if (temp_sequence_position < 0) { tracker->tracker_engine.sequence_position = tracker->tracker_engine.song->num_sequence_steps - 1; } else { tracker->tracker_engine.sequence_position--; } } if (tracker->editing) { edit_sequence_step(tracker, 1); } } if (event->input.key == InputKeyBack && event->input.type == InputTypeShort && tracker->editing) { delete_sequence_step(tracker); } }