s32 SEQ_TERMINAL_PrintTracks(void *_output_function) { void (*out)(char *format, ...) = _output_function; char str_buffer[128]; MUTEX_MIDIOUT_TAKE; out("Track Overview:\n"); out("===============\n"); out("| Track | Mode | Layer P/T/I | Steps P/T | Length | Port | Chn. | Muted |\n"); out("+-------+-------+-------------+-----------+--------+-------+------+-------+\n"); u8 track; for(track=0; track<SEQ_CORE_NUM_TRACKS; ++track) { seq_event_mode_t event_mode = SEQ_CC_Get(track, SEQ_CC_MIDI_EVENT_MODE); u16 num_instruments = SEQ_TRG_NumInstrumentsGet(track); u16 num_par_layers = SEQ_PAR_NumLayersGet(track); u16 num_par_steps = SEQ_PAR_NumStepsGet(track); u16 num_trg_layers = SEQ_TRG_NumLayersGet(track); u16 num_trg_steps = SEQ_TRG_NumStepsGet(track); u16 length = (u16)SEQ_CC_Get(track, SEQ_CC_LENGTH) + 1; mios32_midi_port_t midi_port = SEQ_CC_Get(track, SEQ_CC_MIDI_PORT); u8 midi_chn = SEQ_CC_Get(track, SEQ_CC_MIDI_CHANNEL) + 1; sprintf(str_buffer, "| G%dT%d | %s |", (track/4)+1, (track%4)+1, SEQ_LAYER_GetEvntModeName(event_mode)); sprintf((char *)(str_buffer + strlen(str_buffer)), " %2d/%2d/%2d | %3d/%3d | %3d | %s%c | %2d |", num_par_layers, num_trg_layers, num_instruments, num_par_steps, num_trg_steps, length, SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(midi_port)), SEQ_MIDI_PORT_OutCheckAvailable(midi_port) ? ' ' : '*', midi_chn); if( seq_core_trk_muted & (1 << track) ) sprintf((char *)(str_buffer + strlen(str_buffer)), " yes |\n"); else if( seq_core_trk[track].layer_muted ) sprintf((char *)(str_buffer + strlen(str_buffer)), " layer |\n"); else sprintf((char *)(str_buffer + strlen(str_buffer)), " no |\n"); out(str_buffer); } out("+-------+-------+-------------+-----------+--------+-------+------+-------+\n"); out("done.\n"); MUTEX_MIDIOUT_GIVE; return 0; // no error }
///////////////////////////////////////////////////////////////////////////// // 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) { u8 visible_track = SEQ_UI_VisibleTrackGet(); u8 event_mode = SEQ_CC_Get(visible_track, SEQ_CC_MIDI_EVENT_MODE); if( encoder <= SEQ_UI_ENCODER_GP16 ) { // select new layer/instrument if( event_mode == SEQ_EVENT_MODE_Drum ) { if( encoder >= SEQ_TRG_NumInstrumentsGet(visible_track) ) return -1; ui_selected_instrument = encoder; } else { if( encoder >= SEQ_TRG_NumLayersGet(visible_track) ) return -1; ui_selected_trg_layer = encoder; } if( seq_hwcfg_button_beh.par_layer ) { // if toggle function active: jump back to previous menu // this is especially useful for the emulated MBSEQ, where we can only click on a single button // (trigger gets deactivated when clicking on GP button or moving encoder) seq_ui_button_state.TRG_LAYER_SEL = 0; SEQ_UI_PageSet(ui_trglayer_prev_page); } return 1; // value changed } else if( encoder == SEQ_UI_ENCODER_Datawheel ) { if( event_mode == SEQ_EVENT_MODE_Drum ) { return SEQ_UI_Var8_Inc(&ui_selected_instrument, 0, SEQ_TRG_NumInstrumentsGet(visible_track)-1, incrementer); } else { return SEQ_UI_Var8_Inc(&ui_selected_trg_layer, 0, SEQ_TRG_NumLayersGet(visible_track)-1, incrementer); } } return -1; // invalid or unsupported encoder }
///////////////////////////////////////////////////////////////////////////// // Local button callback function // Should return: // 1 if value has been changed // 0 if value hasn't been changed // -1 if invalid or unsupported button ///////////////////////////////////////////////////////////////////////////// static s32 Button_Handler(seq_ui_button_t button, s32 depressed) { if( depressed ) return 0; // ignore when button depressed #if 0 // leads to: comparison is always true due to limited range of data type if( button >= SEQ_UI_BUTTON_GP1 && button <= SEQ_UI_BUTTON_GP16 ) { #else if( button <= SEQ_UI_BUTTON_GP16 ) { #endif // -> same handling like for encoders return Encoder_Handler(button, 0); } switch( button ) { case SEQ_UI_BUTTON_Select: return -1; // unsupported (yet) case SEQ_UI_BUTTON_Right: case SEQ_UI_BUTTON_Up: if( depressed ) return 0; // ignore when button depressed return Encoder_Handler(SEQ_UI_ENCODER_Datawheel, 1); case SEQ_UI_BUTTON_Left: case SEQ_UI_BUTTON_Down: if( depressed ) return 0; // ignore when button depressed return Encoder_Handler(SEQ_UI_ENCODER_Datawheel, -1); } return -1; // invalid or unsupported button } ///////////////////////////////////////////////////////////////////////////// // Local Display Handler function // IN: <high_prio>: if set, a high-priority LCD update is requested ///////////////////////////////////////////////////////////////////////////// static s32 LCD_Handler(u8 high_prio) { // layout normal mode: // 00000000001111111111222222222233333333330000000000111111111122222222223333333333 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789 // <--------------------------------------><--------------------------------------> // Gate Acc. Roll Glide Skip R.G R.V No Fx // A B C D E F G H // layout drum mode (lower line shows drum labels): // 00000000001111111111222222222233333333330000000000111111111122222222223333333333 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789 // <--------------------------------------><--------------------------------------> // Select Drum Instrument: // BD SD LT MT HT CP MA RS CB CY OH CH Smp1 Smp2 Smp3 Smp4 // ...horizontal VU meters... u8 visible_track = SEQ_UI_VisibleTrackGet(); u8 event_mode = SEQ_CC_Get(visible_track, SEQ_CC_MIDI_EVENT_MODE); if( high_prio && event_mode == SEQ_EVENT_MODE_Drum ) { /////////////////////////////////////////////////////////////////////////// // frequently update VU meters SEQ_LCD_CursorSet(0, 1); u8 drum; u8 num_instruments = SEQ_TRG_NumInstrumentsGet(visible_track); for(drum=0; drum<num_instruments; ++drum) { if( seq_core_trk[visible_track].layer_muted & (1 << drum) ) SEQ_LCD_PrintString("Mute "); else SEQ_LCD_PrintHBar((seq_layer_vu_meter[drum] >> 3) & 0xf); } return 0; // no error }
} else { if( !seq_ui_button_state.SELECT_PRESSED && (seq_core_trk_synched_mute & mask) ) { SEQ_LCD_PrintFormattedString("M%3d ", remaining_steps); } else { SEQ_LCD_PrintHBar(t->vu_meter >> 3); } } } } else { /////////////////////////////////////////////////////////////////////////// SEQ_LCD_CursorSet(0, 0); u8 track; u8 visible_track = SEQ_UI_VisibleTrackGet(); u8 event_mode = SEQ_CC_Get(visible_track, SEQ_CC_MIDI_EVENT_MODE); u8 num_layers = (event_mode == SEQ_EVENT_MODE_Drum) ? SEQ_TRG_NumInstrumentsGet(visible_track) : SEQ_PAR_NumLayersGet(visible_track); for(track=0; track<16; ++track) { if( ui_cursor_flash && seq_ui_button_state.SELECT_PRESSED ) SEQ_LCD_PrintSpaces(5); else { if( seq_ui_button_state.MUTE_PRESSED ) { if( track >= num_layers ) SEQ_LCD_PrintSpaces(5); else { if( event_mode == SEQ_EVENT_MODE_Drum ) SEQ_LCD_PrintTrackDrum(visible_track, track, (char *)seq_core_trk[visible_track].name); else SEQ_LCD_PrintString(SEQ_PAR_AssignedTypeStr(visible_track, track)); } } else {