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

#6651
Patrick KiznyPacocreative
Participant

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