diff --git a/apps/sequencers/midibox_seq_v4/Makefile b/apps/sequencers/midibox_seq_v4/Makefile index dbb9de401..09e727bb7 100644 --- a/apps/sequencers/midibox_seq_v4/Makefile +++ b/apps/sequencers/midibox_seq_v4/Makefile @@ -15,7 +15,7 @@ LCD = $(MIOS32_LCD) ################################################################################ #################################### -# RIO: Added PROTEUS files +# RIO: Added NEW files #################################### THUMB_SOURCE = core/app.c \ @@ -85,6 +85,7 @@ THUMB_SOURCE = core/app.c \ core/seq_blm.c \ core/seq_cc.c \ core/seq_cc_labels.c \ + core/seq_pp_labels.c \ core/seq_core.c \ core/seq_scale.c \ core/seq_groove.c \ diff --git a/apps/sequencers/midibox_seq_v4/core/seq_core.c b/apps/sequencers/midibox_seq_v4/core/seq_core.c index 71e88a7f4..f684353d5 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_core.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_core.c @@ -2318,7 +2318,11 @@ s32 SEQ_CORE_NotifyIncomingMIDIEvent(u8 track, mios32_midi_package_t p) } } break; - //case PolyPressure: + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + + case PolyPressure: case CC: case ProgramChange: //case Aftertouch: @@ -2336,6 +2340,15 @@ s32 SEQ_CORE_NotifyIncomingMIDIEvent(u8 track, mios32_midi_package_t p) apply_mask = 1; } } break; + case SEQ_PAR_Type_PolyPressure: { + if( p.event == PolyPressure && p.cc_number == tcc->lay_const[1*16 + par_layer] ) { + apply_mask = 1; + } + } break; + + //#################################### + //# RIO: END MODIFICATION + //#################################### case SEQ_PAR_Type_PitchBend: { if( p.event == PitchBend ) { diff --git a/apps/sequencers/midibox_seq_v4/core/seq_layer.c b/apps/sequencers/midibox_seq_v4/core/seq_layer.c index 720c28676..a7bc035f1 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_layer.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_layer.c @@ -424,11 +424,35 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u for(par_layer=0; par_layer= 0x80 || + (tcc->lfo_waveform && tcc->lfo_cc == cc_number && tcc->lfo_enable_flags.POLYPRESSURE) ) + break; + + // don't send CC if value hasn't changed (== invalid value) + // but only if LFO not assigned to CC layer in POLYPRESSURE mode + if( !tcc->lfo_enable_flags.CC && !tcc->lfo_enable_flags.POLYPRESSURE && + ( value >= 0x80 || value == cc_last_value[track][drum][par_layer]) ) { + break; + } + + } else { + // new: don't send CC if assigned to invalid CC number // new: don't send if CC is assigned to LFO extra CC function if( cc_number >= 0x80 || @@ -441,6 +465,8 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u ( value >= 0x80 || value == cc_last_value[track][drum][par_layer]) ) { break; } + } + cc_last_value[track][drum][par_layer] = value; } @@ -448,9 +474,9 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u seq_layer_evnt_t *e = &layer_events[num_events]; mios32_midi_package_t *p = &e->midi_package; - p->type = CC; + p->type = *layer_type_ptr == SEQ_PAR_Type_PolyPressure ? PolyPressure : CC; p->cable = track; - p->event = CC; + p->event = *layer_type_ptr == SEQ_PAR_Type_PolyPressure ? PolyPressure : CC; p->chn = tcc->midi_chn; p->cc_number = cc_number; p->value = value; @@ -458,6 +484,10 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u e->layer_tag = drum; ++num_events; + //#################################### + //# RIO: END MODIFICATION + //#################################### + // morph it if( !insert_empty_notes && tcc->morph_mode ) SEQ_MORPH_EventCC(track, step, e, drum, par_layer); @@ -757,6 +787,11 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u } break; + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + + case SEQ_PAR_Type_PolyPressure: case SEQ_PAR_Type_CC: { seq_layer_evnt_t *e = &layer_events[num_events]; mios32_midi_package_t *p = &e->midi_package; @@ -764,6 +799,24 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u u8 value = SEQ_PAR_Get(track, step, par_layer, instrument); if( !insert_empty_notes ) { + + if (*layer_type_ptr == SEQ_PAR_Type_PolyPressure) { + + // new: don't send CC if assigned to invalid CC number + // new: don't send if CC is assigned to LFO extra CC function in POLYPRESSURE mode + if( cc_number >= 0x80 || + (tcc->lfo_waveform && tcc->lfo_cc == cc_number && tcc->lfo_enable_flags.POLYPRESSURE) ) + break; + + // don't send CC if value hasn't changed (== invalid value) + // but only if LFO not assigned to CC layer in POLYPRESSURE mode + if( !tcc->lfo_enable_flags.CC && !tcc->lfo_enable_flags.POLYPRESSURE && + ( value >= 0x80 || value == cc_last_value[track][0][par_layer]) ) { + break; + } + + } else { + // new: don't send CC if assigned to invalid CC number // new: don't send if CC is assigned to LFO extra CC function if( cc_number >= 0x80 || @@ -776,7 +829,9 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u ( value >= 0x80 || value == cc_last_value[track][0][par_layer]) ) { break; } - cc_last_value[track][0][par_layer] = value; + } + + cc_last_value[track][0][par_layer] = value; } if( @@ -784,9 +839,9 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u (tcc->event_mode != SEQ_EVENT_MODE_CC || gate) && #endif (insert_empty_notes || !(layer_muted & (1 << par_layer))) ) { - p->type = CC; + p->type = *layer_type_ptr == SEQ_PAR_Type_PolyPressure ? PolyPressure : CC; p->cable = track; - p->event = CC; + p->event = *layer_type_ptr == SEQ_PAR_Type_PolyPressure ? PolyPressure : CC; p->chn = tcc->midi_chn; p->cc_number = cc_number; p->value = value; @@ -794,6 +849,10 @@ s32 SEQ_LAYER_GetEvents(u8 track, u16 step, seq_layer_evnt_t layer_events[16], u e->layer_tag = par_layer; ++num_events; + //#################################### + //# RIO: END MODIFICATION + //#################################### + // morph it if( !insert_empty_notes && tcc->morph_mode ) SEQ_MORPH_EventCC(track, step, e, instrument, par_layer); @@ -1231,7 +1290,12 @@ s32 SEQ_LAYER_DirectSendEvent(u8 track, u8 par_layer) p.cable = track; p.chn = tcc->midi_chn; + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + switch( layer_type ) { + case SEQ_PAR_Type_PolyPressure: case SEQ_PAR_Type_CC: { u8 cc_number = tcc->lay_const[1*16 + par_layer]; u8 value = (cc_last_value[track][0][par_layer] < 0x80) ? cc_last_value[track][0][par_layer] : 0x40; @@ -1239,12 +1303,16 @@ s32 SEQ_LAYER_DirectSendEvent(u8 track, u8 par_layer) if( cc_number >= 0x80 ) return -1; // CC disabled - p.type = CC; - p.event = CC; + p.type = layer_type == SEQ_PAR_Type_PolyPressure ? PolyPressure : CC; + p.event = layer_type == SEQ_PAR_Type_PolyPressure ? PolyPressure : CC; p.cc_number = tcc->lay_const[1*16 + par_layer]; p.value = value; } break; + //#################################### + //# RIO: END MODIFICATION + //#################################### + case SEQ_PAR_Type_PitchBend: { u8 value = (pb_last_value[track] < 0x80) ? pb_last_value[track] : 0x40; diff --git a/apps/sequencers/midibox_seq_v4/core/seq_lcd.c b/apps/sequencers/midibox_seq_v4/core/seq_lcd.c index 6f62ff942..9c69770f2 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_lcd.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_lcd.c @@ -816,6 +816,13 @@ s32 SEQ_LCD_PrintLayerValue(u8 track, u8 par_layer, u8 par_value) SEQ_LCD_PrintGatelength(par_value); break; + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + case SEQ_PAR_Type_PolyPressure: + //#################################### + //# RIO: END MODIFICATION + //#################################### case SEQ_PAR_Type_CC: case SEQ_PAR_Type_ProgramChange: case SEQ_PAR_Type_PitchBend: @@ -1007,6 +1014,13 @@ s32 SEQ_LCD_PrintLayerEvent(u8 track, u8 step, u8 par_layer, u8 instrument, u8 s SEQ_LCD_PrintGatelength(layer_event.len); break; + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + case SEQ_PAR_Type_PolyPressure: + //#################################### + //# RIO: END MODIFICATION + //#################################### case SEQ_PAR_Type_CC: case SEQ_PAR_Type_ProgramChange: case SEQ_PAR_Type_PitchBend: diff --git a/apps/sequencers/midibox_seq_v4/core/seq_lfo.c b/apps/sequencers/midibox_seq_v4/core/seq_lfo.c index 03e2b48e0..338135175 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_lfo.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_lfo.c @@ -262,12 +262,18 @@ s32 SEQ_LFO_FastCC_Event(u8 track, u32 bpm_tick, mios32_midi_package_t *p, u8 ig else if( lfo_value > 127 ) lfo_value = 127; - p->type = CC; + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + p->type = (tcc->lfo_enable_flags.POLYPRESSURE) ? PolyPressure : CC; p->cable = track; - p->event = CC; + p->event = (tcc->lfo_enable_flags.POLYPRESSURE) ? PolyPressure : CC; p->chn = tcc->midi_chn; p->cc_number = tcc->lfo_cc; p->value = lfo_value; + //#################################### + //# RIO: END MODIFICATION + //#################################### return 1; // returned 1 event } diff --git a/apps/sequencers/midibox_seq_v4/core/seq_lfo.h b/apps/sequencers/midibox_seq_v4/core/seq_lfo.h index b6ffd23df..fcf211855 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_lfo.h +++ b/apps/sequencers/midibox_seq_v4/core/seq_lfo.h @@ -177,8 +177,9 @@ typedef union { u8 VELOCITY:1; u8 LENGTH:1; u8 CC:1; - u8 REVERSE:1; // RIO: added Reverse - u8 FADEUP:1; // RIO: added Fade OUT + u8 REVERSE:1; // RIO: added Reverse + u8 FADEUP:1; // RIO: added Fade OUT + u8 POLYPRESSURE:1; // RIO: added PolyPressure }; } seq_lfo_enable_flags_t; diff --git a/apps/sequencers/midibox_seq_v4/core/seq_par.c b/apps/sequencers/midibox_seq_v4/core/seq_par.c index e9c03f67b..ac4665973 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_par.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_par.c @@ -63,9 +63,9 @@ static const char seq_par_type_names[SEQ_PAR_NUM_TYPES][6] = { "Root ", // 16 "Scale", // 17 "Chrd3", // 18 -//#################################### -//# RIO: MUTES LAYER -//#################################### +//######################################## +//# RIO: MUTES LAYER / POLYPHONIC PRESSURE +//######################################## "Mute1", // 19 "Mute2", // 20 "Mute3", // 21 @@ -82,9 +82,10 @@ static const char seq_par_type_names[SEQ_PAR_NUM_TYPES][6] = { "Mut14", // 32 "Mut15", // 33 "Mut16", // 34 -//#################################### + " PP ", // 35 +//######################################## //# RIO: END MODIFICATION -//#################################### +//######################################## }; static const u8 seq_par_map[SEQ_PAR_NUM_TYPES] = { // allows to change the order for the UI selection @@ -96,6 +97,13 @@ static const u8 seq_par_map[SEQ_PAR_NUM_TYPES] = { // allows to change the order SEQ_PAR_Type_Velocity, SEQ_PAR_Type_Length, SEQ_PAR_Type_CC, +//#################################### +//# RIO: POLYPHONIC PRESSURE +//#################################### + SEQ_PAR_Type_PolyPressure, +//#################################### +//# RIO: END MODIFICATION +//#################################### SEQ_PAR_Type_PitchBend, SEQ_PAR_Type_Aftertouch, SEQ_PAR_Type_ProgramChange, @@ -151,9 +159,9 @@ static const u8 seq_par_default_value[SEQ_PAR_NUM_TYPES] = { 0, // Root: C 0, // Scale: 0 0x01, // Chord3: 1 -//#################################### -//# RIO: MUTES LAYER -//#################################### +//######################################## +//# RIO: MUTES LAYER / POLYPHONIC PRESSURE +//######################################## 0, // Mute1: 0 0, // Mute2: 0 0, // Mute3: 0 @@ -170,9 +178,10 @@ static const u8 seq_par_default_value[SEQ_PAR_NUM_TYPES] = { 0, // Mute14: 0 0, // Mute15: 0 0, // Mute16: 0 -//#################################### + 0x80, // PolyPressure +//######################################## //# RIO: END MODIFICATION -//#################################### +//######################################## }; static const u8 seq_par_max_value[SEQ_PAR_NUM_TYPES] = { @@ -195,9 +204,9 @@ static const u8 seq_par_max_value[SEQ_PAR_NUM_TYPES] = { 0x7f, // Root 0x7f, // Scale 0x7f, // Chord3 -//#################################### -//# RIO: MUTES LAYER -//#################################### +//######################################## +//# RIO: MUTES LAYER / POLYPHONIC PRESSURE +//######################################## 2, // Mute1 2, // Mute2 2, // Mute3 @@ -214,9 +223,10 @@ static const u8 seq_par_max_value[SEQ_PAR_NUM_TYPES] = { 2, // Mute14 2, // Mute15 2, // Mute16 -//#################################### + 0x80, // PolyPressure +//######################################## //# RIO: END MODIFICATION -//#################################### +//######################################## }; diff --git a/apps/sequencers/midibox_seq_v4/core/seq_par.h b/apps/sequencers/midibox_seq_v4/core/seq_par.h index 41b690ae9..3cbbaa8e6 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_par.h +++ b/apps/sequencers/midibox_seq_v4/core/seq_par.h @@ -53,9 +53,9 @@ typedef enum { SEQ_PAR_Type_Root=16, SEQ_PAR_Type_Scale=17, SEQ_PAR_Type_Chord3=18, -//#################################### -//# RIO: MUTES LAYER -//#################################### +//######################################## +//# RIO: MUTES LAYER / POLYPHONIC PRESSURE +//######################################## SEQ_PAR_Type_Mute1=19, SEQ_PAR_Type_Mute2=20, SEQ_PAR_Type_Mute3=21, @@ -72,12 +72,13 @@ typedef enum { SEQ_PAR_Type_Mute14=32, SEQ_PAR_Type_Mute15=33, SEQ_PAR_Type_Mute16=34, + SEQ_PAR_Type_PolyPressure=35, } seq_par_layer_type_t; -#define SEQ_PAR_NUM_TYPES 35 -//#################################### +#define SEQ_PAR_NUM_TYPES 36 +//######################################## //# RIO: END MODIFICATION -//#################################### +//######################################## // NOTE: numbers have to be aligned with the strings in SEQ_LCD_PrintNthMode! #define SEQ_PAR_TYPE_NTH_OFF 0 diff --git a/apps/sequencers/midibox_seq_v4/core/seq_pp_labels.c b/apps/sequencers/midibox_seq_v4/core/seq_pp_labels.c new file mode 100644 index 000000000..ed3c0ab1a --- /dev/null +++ b/apps/sequencers/midibox_seq_v4/core/seq_pp_labels.c @@ -0,0 +1,195 @@ +// $Id$ +/* + * PP Label array + * + * ========================================================================== + * + * Access Virus Page B - PolyPressure Assignments + * Licensed for personal non-commercial use only. + * All other rights reserved. + * + * ========================================================================== + */ + +///////////////////////////////////////////////////////////////////////////// +// Include files +///////////////////////////////////////////////////////////////////////////// + +#include + +#include "seq_pp_labels.h" + + +///////////////////////////////////////////////////////////////////////////// +// Local variables +///////////////////////////////////////////////////////////////////////////// + +static const char pp_labels[128][9] = { + // 0x00..0x0f + " ", + "Arp Mode", + "Arp PSel", + "Arp Oct ", + "Arp Hold", + "Arp NLen", + "Arp Swng", + "LF3 Rate", + "LF3 Shpe", + "LF3 Mode", + "LF3 KeyF", + "LF3 Dest", + "LF3 Amnt", + "LF3 Fade", + " ", + " ", + + // 0x10..0x1f + "Clk Tmpo", + "Arp Clk ", + "LF1 Clk ", + "LF2 Clk ", + "Dly Clk ", + "LF3 Clk ", + " ", + " ", + " ", + "Ctr Smoo", + "Bnd Up ", + "Bnd Down", + "Bnd Scle", + " ", + "FL1 EPol", + "FL2 EPol", + + // 0x20..0x2f + "FL2 Link", + "FLt Base", + "OSC FM M", + "OSC Phas", + "PunchInt", + " ", + "InFollow", + "Voc Mode", + " ", + "OS3 Mode", + "OS3 Vol ", + "OS3 Semi", + "OS3 Detu", + " ", + " ", + "OS1 SVel", + + // 0x30..0x3f + "OS2 SVel", + "PW Velo", + "FM AVel", + " ", + " ", + " ", + "FL1 EAVe", + "FL2 EAVe", + "RE1 Velo", + "RE2 Velo", + "Out2 Bal", + " ", + "Amp Velo", + "Pan Velo", + "Def1 Sng", + "Def2 Sng", + + // 0x40..0x4f + "As1 Src ", + "As1 Dest", + "As1 Amt ", + "As2 Src ", + "As2 Des1", + "As2 Amt1", + "As2 Des2", + "As2 Amt2", + "As3 Src ", + "As3 Des1", + "As3 Amt1", + "As3 Des2", + "As3 Amt2", + "As3 Des3", + "As3 Amt3", + "LF1 AsDs", + + // 0x50..0x5f + "LF1 AsAm", + "LF2 AsDs", + "LF2 AsAm", + " ", + "Phs Mode", + "Phs Mix ", + "Phs Rate", + "Phs Deph", + "Phs Freq", + "Phs Feed", + "Phs Sprd", + " ", + " ", + " ", + " ", + " ", + + // 0x60..0x6f + " ", + "BassInt ", + "BassTune", + "InRingMo", + "DistCurv", + "DistInt ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + + // 0x70..0x7f + "SNameCh1", + "SNameCh2", + "SNameCh3", + "SNameCh4", + "SNameCh5", + "SNameCh6", + "SNameCh7", + "SNameCh8", + "SNameCh9", + "SNameC10", + "FLT Sel ", + "Categor1", + "Categor2", + " ", + " ", + " ", +}; + + + +///////////////////////////////////////////////////////////////////////////// +// Initialisation +///////////////////////////////////////////////////////////////////////////// +s32 SEQ_PP_LABELS_Init(u32 mode) +{ + // here we could also generate the labels in RAM... + + return 0; // no error +} + + +///////////////////////////////////////////////////////////////////////////// +// Returns PP label +///////////////////////////////////////////////////////////////////////////// +const char *SEQ_PP_LABELS_Get(u8 pp) +{ + if( pp >= 128 ) + pp = 0; // just to avoid buffer overruns if invalid PP number selected + + return pp_labels[pp]; +} diff --git a/apps/sequencers/midibox_seq_v4/core/seq_pp_labels.h b/apps/sequencers/midibox_seq_v4/core/seq_pp_labels.h new file mode 100644 index 000000000..24eed3e5c --- /dev/null +++ b/apps/sequencers/midibox_seq_v4/core/seq_pp_labels.h @@ -0,0 +1,42 @@ +// $Id$ +/* + * Header file for PP label array + * + * ========================================================================== + * + * Copyright (C) 2008 Thorsten Klose (tk@midibox.org) + * Licensed for personal non-commercial use only. + * All other rights reserved. + * + * ========================================================================== + */ + +#ifndef _SEQ_PP_LABELS_H +#define _SEQ_PP_LABELS_H + + +///////////////////////////////////////////////////////////////////////////// +// Global definitions +///////////////////////////////////////////////////////////////////////////// + +#define SEQ_PP_LABELS_NUM 128 // for PP0..127 +#define SEQ_PP_LABELS_WIDTH 9 // 8 characters + \0 terminator + + +///////////////////////////////////////////////////////////////////////////// +// Global Types +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Prototypes +///////////////////////////////////////////////////////////////////////////// + +extern s32 SEQ_PP_LABELS_Init(u32 mode); +extern const char *SEQ_PP_LABELS_Get(u8 pp); + +///////////////////////////////////////////////////////////////////////////// +// Export global variables +///////////////////////////////////////////////////////////////////////////// + +#endif /* _SEQ_PP_LABELS_H */ diff --git a/apps/sequencers/midibox_seq_v4/core/seq_ui.c b/apps/sequencers/midibox_seq_v4/core/seq_ui.c index 1909218c6..c2b22b8e6 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_ui.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_ui.c @@ -268,6 +268,13 @@ s32 SEQ_UI_InitEncSpeed(u32 auto_config) switch( SEQ_PAR_AssignmentGet(SEQ_UI_VisibleTrackGet(), ui_selected_par_layer) ) { case SEQ_PAR_Type_Velocity: case SEQ_PAR_Type_Length: + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + case SEQ_PAR_Type_PolyPressure: + //#################################### + //# RIO: END MODIFICATION + //#################################### case SEQ_PAR_Type_CC: case SEQ_PAR_Type_PitchBend: case SEQ_PAR_Type_Probability: @@ -666,8 +673,9 @@ static s32 SEQ_UI_Button_Pause(s32 depressed) s32 SEQ_UI_Button_Play(s32 depressed) { + //################################################### - //# RIO: START PLAYBACK ONCE - fixed bouncing button + //# RIO: Start playback once - fixed bouncing button //################################################### if( depressed || SEQ_BPM_IsRunning() ) return -1; // ignore when button depressed diff --git a/apps/sequencers/midibox_seq_v4/core/seq_ui_edit.c b/apps/sequencers/midibox_seq_v4/core/seq_ui_edit.c index 9a67efb73..d821f07d4 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_ui_edit.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_ui_edit.c @@ -1073,8 +1073,10 @@ s32 SEQ_UI_EDIT_LCD_Handler(u8 high_prio, seq_ui_edit_mode_t edit_mode) SEQ_LCD_CursorSet(40, 0); SEQ_LCD_PrintFormattedString("Step%3d ", ui_selected_step+1); - - if( layer_event.midi_package.event == CC ) { +//#################################### +//# RIO: POLYPHONIC PRESSURE +//#################################### + if( layer_event.midi_package.event == CC || layer_event.midi_package.event == PolyPressure) { mios32_midi_port_t port = SEQ_CC_Get(visible_track, SEQ_CC_MIDI_PORT); u8 loopback = port == 0xf0; @@ -1082,13 +1084,16 @@ s32 SEQ_UI_EDIT_LCD_Handler(u8 high_prio, seq_ui_edit_mode_t edit_mode) SEQ_LCD_PrintString((char *)SEQ_CC_LABELS_Get(port, layer_event.midi_package.cc_number)); else { if( layer_event.midi_package.cc_number >= 0x80 ) { - SEQ_LCD_PrintFormattedString(" CC#off"); + SEQ_LCD_PrintFormattedString(" %s#off", (layer_event.midi_package.event == CC) ? "CC" : "PP"); } else { - SEQ_LCD_PrintFormattedString(" CC#%3d", layer_event.midi_package.cc_number); + SEQ_LCD_PrintFormattedString(" %s#%3d", (layer_event.midi_package.event == CC) ? "CC" : "PP", layer_event.midi_package.cc_number); } } SEQ_LCD_PrintFormattedString(" %3d ", layer_event.midi_package.value); SEQ_LCD_PrintVBar(layer_event.midi_package.value >> 4); +//#################################### +//# RIO: END MODIFICATION +//#################################### } else { SEQ_LCD_PrintSpaces(2); @@ -1481,14 +1486,20 @@ static s32 ChangeSingleEncValue(u8 track, u16 par_step, u16 trg_step, s32 increm if( !dont_change_gate ) { u8 event_mode = SEQ_CC_Get(track, SEQ_CC_MIDI_EVENT_MODE); + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### // we do this always regardless if value has been changed or not (e.g. increment if value already 127) - if( event_mode == SEQ_EVENT_MODE_CC && layer_type == SEQ_PAR_Type_CC ) { + if( event_mode == SEQ_EVENT_MODE_CC && (layer_type == SEQ_PAR_Type_CC || layer_type == SEQ_PAR_Type_PolyPressure) ) { // in this mode gates are used to disable CC // if a CC value has been changed, set gate if( !seq_ui_options.PRINT_AND_MODIFY_WITHOUT_GATES ) { SEQ_TRG_GateSet(track, trg_step, ui_selected_instrument, 1); } } + //#################################### + //# RIO: END MODIFICATION + //#################################### } // take over if changed diff --git a/apps/sequencers/midibox_seq_v4/core/seq_ui_fx_lfo.c b/apps/sequencers/midibox_seq_v4/core/seq_ui_fx_lfo.c index d61e69c27..a806e8c31 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_ui_fx_lfo.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_ui_fx_lfo.c @@ -45,7 +45,10 @@ // Local definitions ///////////////////////////////////////////////////////////////////////////// -#define NUM_OF_ITEMS 14 +//#################################### +//# RIO: POLYPHONIC PRESSURE +//#################################### +#define NUM_OF_ITEMS 15 #define ITEM_GXTY 0 #define ITEM_WAVEFORM 1 #define ITEM_AMPLITUDE 2 @@ -59,8 +62,11 @@ #define ITEM_ENABLE_CC 10 #define ITEM_CC 11 #define ITEM_CC_OFFSET 12 -#define ITEM_CC_PPQN 13 - +#define ITEM_ENABLE_PP 13 +#define ITEM_CC_PPQN 14 +//#################################### +//# RIO: END MODIFICATION +//#################################### ///////////////////////////////////////////////////////////////////////////// // Local variables @@ -89,8 +95,15 @@ static s32 LED_Handler(u16 *gp_leds) case ITEM_ENABLE_VELOCITY: *gp_leds = 0x0200; break; case ITEM_ENABLE_LENGTH: *gp_leds = 0x0400; break; case ITEM_ENABLE_CC: *gp_leds = 0x0800; break; - case ITEM_CC: *gp_leds = 0x1000; break; - case ITEM_CC_OFFSET: *gp_leds = 0x2000; break; + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + case ITEM_ENABLE_PP: *gp_leds = 0x1000; break; + //#################################### + //# RIO: END MODIFICATION + //#################################### + case ITEM_CC: *gp_leds = 0x2000; break; + case ITEM_CC_OFFSET: *gp_leds = 0x4000; break; case ITEM_CC_PPQN: *gp_leds = 0x8000; break; } @@ -164,8 +177,15 @@ static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer) ui_selected_item = ITEM_ENABLE_CC; break; + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### case SEQ_UI_ENCODER_GP13: - return -1; // not mapped + ui_selected_item = ITEM_ENABLE_PP; + break; + //#################################### + //# RIO: END MODIFICATION + //#################################### case SEQ_UI_ENCODER_GP14: // CC number selection now has to be confirmed with GP button @@ -238,11 +258,15 @@ static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer) case ITEM_STEPS: return SEQ_UI_CC_Inc(SEQ_CC_LFO_STEPS, 0, 255, incrementer); case ITEM_STEPS_RST: return SEQ_UI_CC_Inc(SEQ_CC_LFO_STEPS_RST, 0, 255, incrementer); + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### case ITEM_ENABLE_ONE_SHOT: case ITEM_ENABLE_NOTE: case ITEM_ENABLE_VELOCITY: case ITEM_ENABLE_LENGTH: - case ITEM_ENABLE_CC: { + case ITEM_ENABLE_CC: + case ITEM_ENABLE_PP: { u8 flag = ui_selected_item - ITEM_ENABLE_ONE_SHOT; u8 mask = 1 << flag; u8 value = SEQ_CC_Get(visible_track, SEQ_CC_LFO_ENABLE_FLAGS); @@ -253,6 +277,9 @@ static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer) else SEQ_UI_CC_SetFlags(SEQ_CC_LFO_ENABLE_FLAGS, mask, 0); } break; + //#################################### + //# RIO: END MODIFICATION + //#################################### case ITEM_CC: { // CC number selection now has to be confirmed with GP button @@ -391,7 +418,7 @@ static s32 LCD_Handler(u8 high_prio) else if (SEQ_CC_Get(visible_track, SEQ_CC_LFO_PHASE) > 100) sprintf(buffer2, "Dly."); else sprintf(buffer2, "Phs."); - SEQ_LCD_PrintFormattedString("Trk. %s%cAmp. %s Steps Rst OneShot Note Vel. Len. CC ExtraCC# Offs. PPQN",buffer1,ch,buffer2); + SEQ_LCD_PrintFormattedString("Trk. %s%cAmp. %s Steps Rst OneShot Note Vel. Len. CC Extra%s# Offs. PPQN",buffer1,ch,buffer2, (SEQ_CC_Get(visible_track, SEQ_CC_LFO_ENABLE_FLAGS) & (1 << 7)) ? "PP" : "CC"); //############################## //# RIO: END MODIFICATION diff --git a/apps/sequencers/midibox_seq_v4/core/seq_ui_trkevnt.c b/apps/sequencers/midibox_seq_v4/core/seq_ui_trkevnt.c index b27e67809..fa6086d77 100644 --- a/apps/sequencers/midibox_seq_v4/core/seq_ui_trkevnt.c +++ b/apps/sequencers/midibox_seq_v4/core/seq_ui_trkevnt.c @@ -29,6 +29,7 @@ #include "seq_midi_port.h" #include "seq_label.h" #include "seq_cc_labels.h" +#include "seq_pp_labels.h" #include "seq_midi_in.h" #include "file.h" @@ -553,18 +554,25 @@ static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer) if( ui_selected_item == ITEM_LAYER_CONTROL ) assignment = edit_layer_type; - if( assignment == SEQ_PAR_Type_CC ) { + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### + if( assignment == SEQ_PAR_Type_CC || assignment == SEQ_PAR_Type_PolyPressure ) { // CC number selection now has to be confirmed with GP button if( incrementer ) { if( ui_selected_item != ITEM_LAYER_PAR ) { edit_cc_number = SEQ_CC_Get(visible_track, SEQ_CC_LAY_CONST_B1 + ui_selected_par_layer); ui_selected_item = ITEM_LAYER_PAR; } - SEQ_UI_Msg(SEQ_UI_MSG_USER, 2000, "Please confirm CC", "with GP button!"); + if (assignment == SEQ_PAR_Type_PolyPressure) + SEQ_UI_Msg(SEQ_UI_MSG_USER, 2000, "Please confirm PP", "with GP button!"); + else SEQ_UI_Msg(SEQ_UI_MSG_USER, 2000, "Please confirm CC", "with GP button!"); } else { if( edit_cc_number != SEQ_CC_Get(visible_track, SEQ_CC_LAY_CONST_B1 + ui_selected_par_layer) ) { SEQ_CC_Set(visible_track, SEQ_CC_LAY_CONST_B1 + ui_selected_par_layer, edit_cc_number); - SEQ_UI_Msg(SEQ_UI_MSG_USER, 2000, "CC number", "has been changed."); + if (assignment == SEQ_PAR_Type_PolyPressure) + SEQ_UI_Msg(SEQ_UI_MSG_USER, 2000, "PP number", "has been changed."); + else SEQ_UI_Msg(SEQ_UI_MSG_USER, 2000, "CC number", "has been changed."); } else { // send MIDI event if( SEQ_LAYER_DirectSendEvent(visible_track, ui_selected_par_layer) >= 0 ) { @@ -572,6 +580,9 @@ static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer) } } } + //#################################### + //# RIO: END MODIFICATION + //#################################### } else { return -1; // ignore } @@ -1369,24 +1380,31 @@ static s32 LCD_Handler(u8 high_prio) if( ui_selected_item == ITEM_LAYER_CONTROL ) assignment = edit_layer_type; + //#################################### + //# RIO: POLYPHONIC PRESSURE + //#################################### switch( assignment ) { + case SEQ_PAR_Type_PolyPressure: case SEQ_PAR_Type_CC: { mios32_midi_port_t port = SEQ_CC_Get(visible_track, SEQ_CC_MIDI_PORT); u8 current_value = SEQ_CC_Get(visible_track, SEQ_CC_LAY_CONST_B1 + ui_selected_par_layer); u8 edit_value = ui_selected_item == ITEM_LAYER_PAR ? edit_cc_number : current_value; if( edit_value >= 0x80 ) { - SEQ_LCD_PrintFormattedString("off%c(no CC ) ", (current_value != edit_value) ? '!' : ' '); + SEQ_LCD_PrintFormattedString("off%c(no %s ) ", (current_value != edit_value) ? '!' : ' ', (assignment == SEQ_PAR_Type_PolyPressure) ? "PP" : "CC"); } else { SEQ_LCD_PrintFormattedString("%03d%c(%s) ", edit_value, (current_value != edit_value) ? '!' : ' ', - SEQ_CC_LABELS_Get(port, edit_value)); + (assignment == SEQ_PAR_Type_PolyPressure) ? SEQ_PP_LABELS_Get(edit_value) : SEQ_CC_LABELS_Get(port, edit_value)); } } break; default: SEQ_LCD_PrintSpaces(15); } + //#################################### + //# RIO: END MODIFICATION + //#################################### } SEQ_LCD_PrintString("PRESETS INIT");