Home › Forums › Logelloop 6 (English spoken) › Dynamic playback/stretch control of a current Korpus looper › Reply To: Dynamic playback/stretch control of a current Korpus looper
Looks like I managed to implement most of the features I wanted for the modular looper via macros.
The only issue remaining is figuring out a better approach to handling continuous/dense midi messages coming from the pedal.
I did not use the looped macro, as it would mess up speed on counter change, unless I work on smart workarounds.
For now, the triggered macro in a non-looped version does not seem to choke the system nor cause any bad behavior.
I’m sharing my macros below, in case someone finds them useful.
* All these macros assume Korpus running as a Data plugin on 1/1
* All these macros assume modular loopers running on fx channels 1-4
* All these macros add functionality for a *currently selected* looper in Korpus
* I use all of these macros mapped to midi CC commands
Macro#1 – ModLoop Play Mode
Switch current looper between Tape Mode and Extreme Time Stretch
Declare int $k_index$ = $Korpus_data1_rank1_Counter_state$
Declare int $p_mode$ = 0
//PlayerMode 0 ⇀ Tape
//PlayerMode 2 ⇀ Stretch
IfThen { $k_index$ == 1 } Do Set $p_mode$ = $Looper_fx1_rank1_PlayerMode_state$
IfThen { $k_index$ == 2 } Do Set $p_mode$ = $Looper_fx2_rank1_PlayerMode_state$
IfThen { $k_index$ == 3 } Do Set $p_mode$ = $Looper_fx3_rank1_PlayerMode_state$
IfThen { $k_index$ == 4 } Do Set $p_mode$ = $Looper_fx4_rank1_PlayerMode_state$
InsertSendMessage fx[$k_index$] 1 PlayerMode { $p_mode$ == 0 ? 2 : 0 }
Macro#2 – ModLoop Reverse
Reverse current mod looper direction
// Find current looper index
Declare int $k_index$ = $Korpus_data1_rank1_Counter_state$
Declare int $p_mode$ = 0
Declare float $c_speed$ = 1
// Get current player mode
// PlayerMode 0 ⇀ Tape
// PlayerMode 2 ⇀ Stretch
IfThen { $k_index$ == 1 } Do $p_mode$ = $Looper_fx1_rank1_PlayerMode_state$
IfThen { $k_index$ == 2 } Do $p_mode$ = $Looper_fx2_rank1_PlayerMode_state$
IfThen { $k_index$ == 3 } Do $p_mode$ = $Looper_fx3_rank1_PlayerMode_state$
IfThen { $k_index$ == 4 } Do $p_mode$ = $Looper_fx4_rank1_PlayerMode_state$
If {$p_mode$ != 2}
// Only change direction if we're NOT in Extreme Stretch mode
IfThen { $Korpus_data1_rank1_Counter_state$ == 1 } Do $c_speed$ = $Looper_fx1_rank1_SpeedFloat_state$
IfThen { $Korpus_data1_rank1_Counter_state$ == 2 } Do $c_speed$ = $Looper_fx2_rank1_SpeedFloat_state$
IfThen { $Korpus_data1_rank1_Counter_state$ == 3 } Do $c_speed$ = $Looper_fx3_rank1_SpeedFloat_state$
IfThen { $Korpus_data1_rank1_Counter_state$ == 4 } Do $c_speed$ = $Looper_fx4_rank1_SpeedFloat_state$
InsertSendMessage fx[$Korpus_data1_rank1_Counter_state$] 1 SpeedFloat {$c_speed$ * -1}
EndIf
Macro#3 – ModLoop Speed Reset
Resets current looper speed to 1
InsertSendMessage fx[$Korpus_data1_rank1_Counter_state$] 1 SpeedFloat 1
Macro#4 – ModLoop Speed Set
Set current mod looper speed to CC1 Variable.
Freezes on max slowdown in Extreme Stretch
# This macro assumes that speed is set via expression pedal (for example) and stored in CC variable #1
# Requires setting both macro trigger and midi CC listener
# It works in both modes – Extreme Stretch and standard Tape mode.
# In extreme Stretch mode, when reaching minimum speed, it will switch to freeze
# It’s NOT following Philippe’s recommendations, so use at your own risk
// Find current looper index
Declare int $k_index$ = $Korpus_data1_rank1_Counter_state$
Declare float $spd_min1$ = 0.25 // Edit this to set min speed in Standard modes
Declare float $spd_max1$ = 4 // Edit this to set max speed in Extreme Stretch Mode
Declare float $spd_max2$ = 25 // Edit this to set max speed in Extreme Stretch Mode
Declare int $frz$ = 0 // Looper will freeze when reaching max speed
Declare float $spd$ = 1
// Get current player mode
// PlayerMode 0 ⇀ Tape
// PlayerMode 2 ⇀ Stretch
Declare int $p_mode$ = 0
IfThen { $k_index$ == 1 } Do $p_mode$ = $Looper_fx1_rank1_PlayerMode_state$
IfThen { $k_index$ == 2 } Do $p_mode$ = $Looper_fx2_rank1_PlayerMode_state$
IfThen { $k_index$ == 3 } Do $p_mode$ = $Looper_fx3_rank1_PlayerMode_state$
IfThen { $k_index$ == 4 } Do $p_mode$ = $Looper_fx4_rank1_PlayerMode_state$
// Depending on the mode set speeds
If {$p_mode$ == 2}
// Extreme Time Strech
$spd$ = {scale($midiv_cc1$, 3, 126, $spd_max2$, 1)}
IfThen {$spd$ > $spd_max2$ * 0.95} Do $frz$ = 1
InsertSendMessage fx[$k_index$] 1 HTSFreeze $frz$
InsertSendMessage fx[$k_index$] 1 HTSSpeed $spd$
Else
// Tape or similar
// Calculate target speed
$spd$ = {scale($midiv_cc1$, 3, 126, $spd_min1$, $spd_max1$)}
// Check current speed to see if it's reversed or not
IfThen { $Korpus_data1_rank1_Counter_state$ == 1 } Do $c_speed$ = $Looper_fx1_rank1_SpeedFloat_state$
IfThen { $Korpus_data1_rank1_Counter_state$ == 2 } Do $c_speed$ = $Looper_fx2_rank1_SpeedFloat_state$
IfThen { $Korpus_data1_rank1_Counter_state$ == 3 } Do $c_speed$ = $Looper_fx3_rank1_SpeedFloat_state$
IfThen { $Korpus_data1_rank1_Counter_state$ == 4 } Do $c_speed$ = $Looper_fx4_rank1_SpeedFloat_state$
// Reverse if current speed was negative
IfThen { $c_speed$ < 0 } Do $spd$ = { $spd$ * -1 }
// Set Speed
InsertSendMessage fx[$Korpus_data1_rank1_Counter_state$] 1 SpeedFloat $spd$
EndIf