void enter_note(void) { // Check if any of the note buttons have been pressed: uint8_t note = 0xFF; for (uint8_t i = 0; i < 16; i++) { if (button_pressed(i)) note = btn_to_note(i); } // If none of the on-board keys were pressed, check MIDI: if (sequencer_midi_note != 0xFF) note = sequencer_midi_note; if (note != 0xFF) { sequencer_pattern.notes[current_channel][current_note].note = note; sequencer_pattern.notes[current_channel][current_note].length = channel_length[current_channel]; enter_note_exit(); } // Other button presses: else if (button_pressed(BTN_NOTE_CLEAR)) { sequencer_pattern.notes[current_channel][current_note].length = 0; enter_note_exit(); } else if (button_on(BTN_OCTAVE)) { leds_7seg_two_digit_set(3, 4, channel_octave[current_channel]); ui_updown((int8_t*)&channel_octave[current_channel], 1, 7); } else if (button_pressed(BTN_OK)) enter_note_exit(); else { leds_7seg_two_digit_set(3, 4, channel_length[current_channel]); ui_updown((int8_t*)&channel_length[current_channel], 1, 4); } }
static void play_pattern(void) { for (uint8_t i = 0; i < 16; i++) button_led_off(i); leds_7seg_two_digit_set(3, 4, sequencer_tempo_count); ui_updown((int8_t*)&sequencer_tempo_count, 1, 99); if (button_pressed(BTN_PLAY)) { sequencer_stop(); state = STATE_TOPLEVEL; } else button_led_on(sequencer_cur_position); }
void programmer(void) /* Handles the front panel functions when at the top level The whole thing is basically a large loop going through the array of possible button presses and combinations. */ { static int8_t patchno = 0; // Display the selected patch number leds_7seg_two_digit_set(3, 4, patchno); int8_t last_patchno = patchno; // Handle UP and DOWN presses ui_updown(&patchno, PATCH_MIN, PATCH_MAX); if (state == STATE_SAVE) { patch_save(patchno); state = STATE_TOPLEVEL; } else if (patchno != last_patchno) patch_load(patchno); if (button_pressed(BTN_SAVE)) { ui_getvalue_session.button1 = BTN_SAVE; ui_getvalue_session.button2 = 0xFF; ui_getvalue_session.parameter.target = &patchno; ui_getvalue_session.parameter.type = RANGE; ui_getvalue_session.parameter.min = PATCH_MIN; ui_getvalue_session.parameter.max = PATCH_MAX; mode |= MODE_GETVALUE; state = STATE_SAVE; return; } sq1.enabled ? button_led_on(BTN_SQ1) : button_led_off(BTN_SQ1); sq2.enabled ? button_led_on(BTN_SQ2) : button_led_off(BTN_SQ2); tri.enabled ? button_led_on(BTN_TRI) : button_led_off(BTN_TRI); noise.enabled ? button_led_on(BTN_NOISE) : button_led_off(BTN_NOISE); dmc.enabled ? button_led_on(BTN_DMC) : button_led_off(BTN_DMC); toplevel_handler(); }
/* Pattern selection state */ void select_pattern(void) { if (state == STATE_SAVE) { sequencer_pattern_save(current_pattern); state = STATE_TOPLEVEL; } else if (ui_updown((int8_t*)¤t_pattern, 0, 99)) sequencer_pattern_load(current_pattern); else if (button_pressed(BTN_SAVE)) { save_init(¤t_pattern); } for (uint8_t b = 0; b < 5; b++) { if (button_pressed(b)) { current_channel = b; state = STATE_SELECT_NOTE; } } if (button_pressed(BTN_PLAY)) { sequencer_play(); state = STATE_PLAYING; } if (button_pressed(BTN_SCALE)) { getvalue.button1 = BTN_SCALE; getvalue.button2 = 0xFF; getvalue.parameter.target = &sequencer_pattern.scale; getvalue.parameter.type = SCALE; getvalue.parameter.min = 0; getvalue.parameter.max = 2; getvalue.previous_mode = mode; mode = MODE_GETVALUE; } leds_7seg_two_digit_set(3, 4, current_pattern); }
void ui_getvalue_handler() /* Handles getting a parameter value. A new getvalue-session is initiated by using ui_getvalue_session. This structure holds the current parameter to be changed, which buttons to blink, and the state. */ { static int8_t value; // If the state just changed to GETVALUE, set the value to the parameter's value // and last pot value to the current. if (ui_getvalue_session.state == SESSION_INACTIVE) { if (ui_getvalue_session.parameter.type == INVRANGE) value = ui_getvalue_session.parameter.max - *ui_getvalue_session.parameter.target; else value = *ui_getvalue_session.parameter.target; button_led_blink(ui_getvalue_session.button1); if (ui_getvalue_session.button2 != 0xFF) { button_led_blink(ui_getvalue_session.button2 & 0x7F); if ((ui_getvalue_session.button2 & 0x80) != 0) { // button_leds[BTN_SHIFT] = 1; // leds_set(BTN_SHIFT, 0); button_led_blink(BTN_SHIFT); } } ui_getvalue_session.state = SESSION_ACTIVE; } // Handle up and down buttons ui_updown(&value, ui_getvalue_session.parameter.min, ui_getvalue_session.parameter.max); // When SET is pressed, store the new value in the parameter and disable LED blinking. // If type is VALTYPE_INVRANGE, the value is inverted. if (button_pressed(BTN_SAVE)) { if (ui_getvalue_session.parameter.type == INVRANGE) *ui_getvalue_session.parameter.target = ui_getvalue_session.parameter.max - value; else *ui_getvalue_session.parameter.target = value; button_led_off(ui_getvalue_session.button1); if (ui_getvalue_session.button2 != 0xFF) { button_led_off(ui_getvalue_session.button2 & 0x7F); //if ((ui_getvalue_session.button2 & 0x80) != 0) //button_leds[BTN_SHIFT] = 1; //button_led_on } ui_getvalue_session.state = SESSION_INACTIVE; mode &= 0x7F; } if (ui_getvalue_session.parameter.min < 0) { if (value < 0) { leds_7seg_set(3, LEDS_7SEG_MINUS); leds_7seg_set(4, -value); } else { leds_7seg_clear(3); leds_7seg_set(4, value); } } else leds_7seg_two_digit_set(3, 4, value); }