///////////////////////////////////////////////////////////////////////////// // resets all note stacks ///////////////////////////////////////////////////////////////////////////// s32 SEQ_MIDI_IN_ResetAllStacks(void) { s32 status = 0; status |= SEQ_MIDI_IN_ResetTransArpStacks(); status |= SEQ_MIDI_IN_ResetChangerStacks(); return status; }
///////////////////////////////////////////////////////////////////////////// // Local encoder callback function // Should return: // 1 if value has been changed // 0 if value hasn't been changed // -1 if invalid or unsupported encoder ///////////////////////////////////////////////////////////////////////////// static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer) { seq_midi_router_node_t *n = &seq_midi_router_node[selected_router_node]; if( encoder <= SEQ_UI_ENCODER_GP8 ) { switch( encoder ) { case SEQ_UI_ENCODER_GP1: case SEQ_UI_ENCODER_GP2: selected_subpage = SUBPAGE_TRANSPOSE; ui_selected_item = ITEM_IN_BUS; break; case SEQ_UI_ENCODER_GP3: case SEQ_UI_ENCODER_GP4: selected_subpage = SUBPAGE_SECTIONS; ui_selected_item = ITEM_S_PORT; break; case SEQ_UI_ENCODER_GP5: case SEQ_UI_ENCODER_GP6: selected_subpage = SUBPAGE_ROUTER; ui_selected_item = ITEM_R_NODE; break; case SEQ_UI_ENCODER_GP7: selected_subpage = SUBPAGE_EXT_CTRL; ui_selected_item = ITEM_EXT_PORT; break; default: selected_subpage = SUBPAGE_MISC; ui_selected_item = ITEM_BLM_SCALAR_PORT; } return 1; } switch( selected_subpage ) { case SUBPAGE_TRANSPOSE: switch( encoder ) { case SEQ_UI_ENCODER_GP9: ui_selected_item = ITEM_IN_BUS; break; case SEQ_UI_ENCODER_GP10: ui_selected_item = ITEM_IN_PORT; break; case SEQ_UI_ENCODER_GP11: ui_selected_item = ITEM_IN_CHN; break; case SEQ_UI_ENCODER_GP12: ui_selected_item = ITEM_IN_LOWER; break; case SEQ_UI_ENCODER_GP13: ui_selected_item = ITEM_IN_UPPER; break; case SEQ_UI_ENCODER_GP14: ui_selected_item = ITEM_IN_MODE; break; case SEQ_UI_ENCODER_GP15: return -1; // not mapped case SEQ_UI_ENCODER_GP16: ui_selected_item = ITEM_RESET_STACKS; break; } break; case SUBPAGE_SECTIONS: switch( encoder ) { case SEQ_UI_ENCODER_GP9: ui_selected_item = ITEM_S_PORT; break; case SEQ_UI_ENCODER_GP10: ui_selected_item = ITEM_S_CHN; break; case SEQ_UI_ENCODER_GP11: ui_selected_item = ITEM_S_OCT_G1; break; case SEQ_UI_ENCODER_GP12: ui_selected_item = ITEM_S_OCT_G2; break; case SEQ_UI_ENCODER_GP13: ui_selected_item = ITEM_S_OCT_G3; break; case SEQ_UI_ENCODER_GP14: ui_selected_item = ITEM_S_OCT_G4; break; case SEQ_UI_ENCODER_GP15: ui_selected_item = ITEM_S_FWD_PORT; break; case SEQ_UI_ENCODER_GP16: ui_selected_item = ITEM_S_RESET_STACKS; break; } break; case SUBPAGE_ROUTER: switch( encoder ) { case SEQ_UI_ENCODER_GP9: ui_selected_item = ITEM_R_NODE; break; case SEQ_UI_ENCODER_GP10: ui_selected_item = ITEM_R_SRC_PORT; break; case SEQ_UI_ENCODER_GP11: ui_selected_item = ITEM_R_SRC_CHN; break; case SEQ_UI_ENCODER_GP12: ui_selected_item = ITEM_R_DST_PORT; break; case SEQ_UI_ENCODER_GP13: ui_selected_item = ITEM_R_DST_CHN; break; case SEQ_UI_ENCODER_GP14: return -1; // not used (yet) case SEQ_UI_ENCODER_GP15: case SEQ_UI_ENCODER_GP16: ui_selected_item = ITEM_DEF_PORT; break; } break; case SUBPAGE_EXT_CTRL: switch( encoder ) { case SEQ_UI_ENCODER_GP9: ui_selected_item = ITEM_EXT_PORT; break; case SEQ_UI_ENCODER_GP10: ui_selected_item = ITEM_EXT_PORT_OUT; break; case SEQ_UI_ENCODER_GP11: ui_selected_item = ITEM_EXT_CHN; break; case SEQ_UI_ENCODER_GP12: case SEQ_UI_ENCODER_GP13: case SEQ_UI_ENCODER_GP14: ui_selected_item = ITEM_EXT_CTRL; break; case SEQ_UI_ENCODER_GP15: case SEQ_UI_ENCODER_GP16: ui_selected_item = ITEM_EXT_VALUE; break; } break; case SUBPAGE_MISC: switch( encoder ) { case SEQ_UI_ENCODER_GP9: case SEQ_UI_ENCODER_GP10: ui_selected_item = ITEM_BLM_SCALAR_PORT; break; case SEQ_UI_ENCODER_GP11: case SEQ_UI_ENCODER_GP12: case SEQ_UI_ENCODER_GP13: case SEQ_UI_ENCODER_GP14: return -1; // not used (yet) case SEQ_UI_ENCODER_GP15: case SEQ_UI_ENCODER_GP16: // enter midi monitor page SEQ_UI_PageSet(SEQ_UI_PAGE_MIDIMON); return 1; } break; default: return -1; // unsupported subpage } // for GP encoders and Datawheel switch( ui_selected_item ) { case ITEM_IN_BUS: { if( SEQ_UI_Var8_Inc(&selected_bus, 0, SEQ_MIDI_IN_NUM_BUSSES-1, incrementer) >= 0 ) { return 1; // value changed } return 0; // no change } break; case ITEM_IN_PORT: { u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_port[selected_bus]); if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1-4, incrementer) >= 0 ) { // don't allow selection of Bus1..Bus4 seq_midi_in_port[selected_bus] = SEQ_MIDI_PORT_InPortGet(port_ix); store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_IN_CHN: if( SEQ_UI_Var8_Inc(&seq_midi_in_channel[selected_bus], 0, 16, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_IN_LOWER: if( SEQ_UI_Var8_Inc(&seq_midi_in_lower[selected_bus], 0, 127, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_IN_UPPER: if( SEQ_UI_Var8_Inc(&seq_midi_in_upper[selected_bus], 0, 127, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_IN_MODE: { u8 fwd = seq_midi_in_options[selected_bus].MODE_PLAY; if( SEQ_UI_Var8_Inc(&fwd, 0, 1, incrementer) >= 0 ) { seq_midi_in_options[selected_bus].MODE_PLAY = fwd; store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_RESET_STACKS: { SEQ_MIDI_IN_ResetTransArpStacks(); SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Transposer/Arp.", "Stacks cleared!"); // send to external SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_ALL_NOTES_OFF, 127, 0); return 1; } break; case ITEM_S_PORT: { u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_sect_port); if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) { seq_midi_in_sect_port = SEQ_MIDI_PORT_InPortGet(port_ix); store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_S_CHN: if( SEQ_UI_Var8_Inc(&seq_midi_in_sect_channel, 0, 16, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_S_OCT_G1: { u8 oct = seq_midi_in_sect_note[0] / 12; if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) { seq_midi_in_sect_note[0] = 12*oct; store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_S_OCT_G2: { u8 oct = seq_midi_in_sect_note[1] / 12; if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) { seq_midi_in_sect_note[1] = 12*oct; store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_S_OCT_G3: { u8 oct = seq_midi_in_sect_note[2] / 12; if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) { seq_midi_in_sect_note[2] = 12*oct; store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_S_OCT_G4: { u8 oct = seq_midi_in_sect_note[3] / 12; if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) { seq_midi_in_sect_note[3] = 12*oct; store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_S_FWD_PORT: { u8 port_ix = SEQ_MIDI_PORT_OutIxGet(seq_midi_in_sect_fwd_port); if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) { seq_midi_in_sect_fwd_port = SEQ_MIDI_PORT_OutPortGet(port_ix); store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_S_RESET_STACKS: { SEQ_MIDI_IN_ResetChangerStacks(); SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Section Changer", "Stacks cleared!"); // send to external SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_ALL_NOTES_OFF, 127, 0); return 1; } break; case ITEM_R_NODE: if( SEQ_UI_Var8_Inc(&selected_router_node, 0, SEQ_MIDI_ROUTER_NUM_NODES-1, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_R_SRC_PORT: { u8 port_ix = SEQ_MIDI_PORT_InIxGet(n->src_port); if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) { n->src_port = SEQ_MIDI_PORT_InPortGet(port_ix); store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_R_SRC_CHN: if( SEQ_UI_Var8_Inc(&n->src_chn, 0, 17, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_R_DST_PORT: { u8 port_ix = SEQ_MIDI_PORT_OutIxGet(n->dst_port); if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) { n->dst_port = SEQ_MIDI_PORT_OutPortGet(port_ix); store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_R_DST_CHN: if( SEQ_UI_Var8_Inc(&n->dst_chn, 0, 19, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_DEF_PORT: { u8 port_ix = SEQ_MIDI_PORT_OutIxGet(MIOS32_MIDI_DefaultPortGet()); if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) { MIOS32_MIDI_DefaultPortSet(SEQ_MIDI_PORT_OutPortGet(port_ix)); store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_EXT_PORT: { u8 numPorts = SEQ_MIDI_PORT_InNumGet(); u8 port_ix = (seq_midi_in_ext_ctrl_port == 0xff) ? numPorts : SEQ_MIDI_PORT_InIxGet(seq_midi_in_ext_ctrl_port); if( SEQ_UI_Var8_Inc(&port_ix, 0, numPorts, incrementer) >= 0 ) { seq_midi_in_ext_ctrl_port = (port_ix == numPorts) ? 0xff : SEQ_MIDI_PORT_InPortGet(port_ix); store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_EXT_PORT_OUT: { u8 port_ix = SEQ_MIDI_PORT_OutIxGet(seq_midi_in_ext_ctrl_out_port); if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) { seq_midi_in_ext_ctrl_out_port = SEQ_MIDI_PORT_OutPortGet(port_ix); store_file_required = 1; return 1; // value changed } return 0; // no change } break; case ITEM_EXT_CHN: if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_channel, 0, 16, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_EXT_CTRL: if( SEQ_UI_Var8_Inc(&selected_ext_ctrl, 0, SEQ_MIDI_IN_EXT_CTRL_NUM-1, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } return 0; // no change case ITEM_EXT_VALUE: if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_NRPN_ENABLED ) { if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, 1, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } } else if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_PC_MODE ) { if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, SEQ_MIDI_IN_EXT_CTRL_PC_MODE_NUM-1, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } } else if( selected_ext_ctrl <= SEQ_MIDI_IN_EXT_CTRL_NUM ) { if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, 128, incrementer) >= 0 ) { store_file_required = 1; return 1; // value changed } } return 0; // no change case ITEM_BLM_SCALAR_PORT: { u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_blm_port); if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) { seq_blm_port = SEQ_MIDI_PORT_InPortGet(port_ix); MUTEX_MIDIOUT_TAKE; blm_timeout_ctr = 0; // fake timeout (so that "BLM not found" message will be displayed) SEQ_BLM_SYSEX_SendRequest(0x00); // request layout from BLM_SCALAR MUTEX_MIDIOUT_GIVE; store_file_required = 1; return 1; // value changed } return 0; // no change } break; } return -1; // invalid or unsupported encoder }