And, for illustrative purposes, the code.
//
#include "usermodfx.h"
#include <math.h>
static float lpan,rpan;
void MODFX_INIT(uint32_t platform, uint32_t api)
{
lpan = 0.5;
rpan = 0.5;
}
void MODFX_PROCESS(const float *main_xn, float *main_yn,
const float *sub_xn, float *sub_yn,
uint32_t frames)
{
for (uint32_t i = 0; i < frames; i++)
{
float inL = main_xn[i*2];
float inR = main_xn[i*2 + 1];
main_yn[i*2] = (inL * sinf (lpan * PI / 2)) + (inR * sinf (rpan * PI / 2));
main_yn[i*2+1] = (inL * cosf (lpan * PI / 2)) + (inR * cosf (rpan * PI / 2));
}
}
void MODFX_PARAM(uint8_t index, int32_t value)
{
const float valf = q31_to_f32(value);
switch (index)
{
case k_user_modfx_param_time:
lpan = valf;
break;
case k_user_modfx_param_depth:
rpan = valf;
break;
default:
break;
}
}