Files
JaySynth/Source/synth/voice.h
T
jens 843c6e300c - initial import
git-svn-id: http://moon:8086/svn/software/trunk/projects/JaySynth@37 b431acfa-c32f-4a4a-93f1-934dc6c82436
2014-10-25 07:27:55 +00:00

323 lines
8.0 KiB
C

// --------------------------------------------------------------
// --------------------------------------------------------------
#ifndef _VOICE_H_
#define _VOICE_H_
#include "synth_defs.h"
#include "env.h"
#include "vco.h"
#include "vcf.h"
#include "lfo.h"
#include "smooth.h"
#define VOICE_OSC_SPREAD_PHASE_AMT 0.01
// --------------------------------------------------------------
// Types
// --------------------------------------------------------------
enum
{
VOICE_PARAM_MASTER_TUNE = 0,
VOICE_PARAM_MASTER_FREF,
VOICE_PARAM_VOICE_PAN,
VOICE_PARAM_PORTAMENTO_TIME,
VOICE_PARAM_OSC_0_ENABLE,
VOICE_PARAM_OSC_1_ENABLE,
VOICE_PARAM_OSC_0_RESTART_ON_TRIGGER,
VOICE_PARAM_OSC_1_RESTART_ON_TRIGGER,
VOICE_PARAM_OSC_0_LEVEL,
VOICE_PARAM_OSC_1_LEVEL,
VOICE_PARAM_OSC_0_PHASE,
VOICE_PARAM_OSC_1_PHASE,
VOICE_PARAM_OSC_0_DUTYCYCLE,
VOICE_PARAM_OSC_1_DUTYCYCLE,
VOICE_PARAM_OSC_0_DETUNE,
VOICE_PARAM_OSC_1_DETUNE,
VOICE_PARAM_OSC_0_TRANSPOSE,
VOICE_PARAM_OSC_1_TRANSPOSE,
VOICE_PARAM_OSC_0_SCALE,
VOICE_PARAM_OSC_1_SCALE,
VOICE_PARAM_OSC_0_WAVEFORM,
VOICE_PARAM_OSC_1_WAVEFORM,
VOICE_PARAM_OSC_0_FM_AMT_0,
VOICE_PARAM_OSC_1_FM_AMT_0,
VOICE_PARAM_OSC_0_FM_AMT_1,
VOICE_PARAM_OSC_1_FM_AMT_1,
VOICE_PARAM_OSC_0_FM_SRC_0,
VOICE_PARAM_OSC_1_FM_SRC_0,
VOICE_PARAM_OSC_0_FM_SRC_1,
VOICE_PARAM_OSC_1_FM_SRC_1,
VOICE_PARAM_OSC_0_FM_SRC_OP,
VOICE_PARAM_OSC_1_FM_SRC_OP,
VOICE_PARAM_OSC_0_AM_AMT_0,
VOICE_PARAM_OSC_1_AM_AMT_0,
VOICE_PARAM_OSC_0_AM_AMT_1,
VOICE_PARAM_OSC_1_AM_AMT_1,
VOICE_PARAM_OSC_0_AM_SRC_0,
VOICE_PARAM_OSC_1_AM_SRC_0,
VOICE_PARAM_OSC_0_AM_SRC_1,
VOICE_PARAM_OSC_1_AM_SRC_1,
VOICE_PARAM_OSC_0_AM_SRC_OP,
VOICE_PARAM_OSC_1_AM_SRC_OP,
VOICE_PARAM_OSC_0_PWM_AMT_0,
VOICE_PARAM_OSC_1_PWM_AMT_0,
VOICE_PARAM_OSC_0_PWM_AMT_1,
VOICE_PARAM_OSC_1_PWM_AMT_1,
VOICE_PARAM_OSC_0_PWM_SRC_0,
VOICE_PARAM_OSC_1_PWM_SRC_0,
VOICE_PARAM_OSC_0_PWM_SRC_1,
VOICE_PARAM_OSC_1_PWM_SRC_1,
VOICE_PARAM_OSC_0_PWM_SRC_OP,
VOICE_PARAM_OSC_1_PWM_SRC_OP,
VOICE_PARAM_NOISE_ENABLE,
VOICE_PARAM_NOISE_LEVEL,
VOICE_PARAM_NOISE_SHAPE,
VOICE_PARAM_KEY,
VOICE_PARAM_VCA_ENV_GAIN,
VOICE_PARAM_VCA_AM_AMT_0,
VOICE_PARAM_VCA_AM_SRC_0,
VOICE_PARAM_VCA_PAN_AMT_0,
VOICE_PARAM_VCA_PAN_SRC_0,
VOICE_PARAM_ENV_0_A, VOICE_PARAM_VCF_ENV_A = VOICE_PARAM_ENV_0_A,
VOICE_PARAM_ENV_1_A, VOICE_PARAM_VCA_ENV_A = VOICE_PARAM_ENV_1_A,
VOICE_PARAM_ENV_2_A,
VOICE_PARAM_ENV_3_A,
VOICE_PARAM_ENV_0_S, VOICE_PARAM_VCF_ENV_S = VOICE_PARAM_ENV_0_S,
VOICE_PARAM_ENV_1_S, VOICE_PARAM_VCA_ENV_S = VOICE_PARAM_ENV_1_S,
VOICE_PARAM_ENV_2_S,
VOICE_PARAM_ENV_3_S,
VOICE_PARAM_ENV_0_D, VOICE_PARAM_VCF_ENV_D = VOICE_PARAM_ENV_0_D,
VOICE_PARAM_ENV_1_D, VOICE_PARAM_VCA_ENV_D = VOICE_PARAM_ENV_1_D,
VOICE_PARAM_ENV_2_D,
VOICE_PARAM_ENV_3_D,
VOICE_PARAM_ENV_0_R, VOICE_PARAM_VCF_ENV_R = VOICE_PARAM_ENV_0_R,
VOICE_PARAM_ENV_1_R, VOICE_PARAM_VCA_ENV_R = VOICE_PARAM_ENV_1_R,
VOICE_PARAM_ENV_2_R,
VOICE_PARAM_ENV_3_R,
VOICE_PARAM_VCF_TYPE,
VOICE_PARAM_VCF_ORDER,
VOICE_PARAM_VCF_F,
VOICE_PARAM_VCF_Q,
VOICE_PARAM_VCF_Q_GAIN_0,
VOICE_PARAM_VCF_Q_CTRL_0,
VOICE_PARAM_VCF_ENV_GAIN,
VOICE_PARAM_VCF_F_AMT_0,
VOICE_PARAM_VCF_F_AMT_1,
VOICE_PARAM_VCF_F_SRC_0,
VOICE_PARAM_VCF_F_SRC_1,
VOICE_PARAM_VCF_F_SRC_OP,
VOICE_PARAM_VCF_Q_AMT_0,
VOICE_PARAM_VCF_Q_AMT_1,
VOICE_PARAM_VCF_Q_SRC_0,
VOICE_PARAM_VCF_Q_SRC_1,
VOICE_PARAM_VCF_Q_SRC_OP,
VOICE_PARAM_LFO_0_SPEED,
VOICE_PARAM_LFO_1_SPEED,
VOICE_PARAM_LFO_2_SPEED,
VOICE_PARAM_LFO_3_SPEED,
VOICE_PARAM_LFO_0_SMOOTH,
VOICE_PARAM_LFO_1_SMOOTH,
VOICE_PARAM_LFO_2_SMOOTH,
VOICE_PARAM_LFO_3_SMOOTH,
VOICE_PARAM_LFO_0_DELAY,
VOICE_PARAM_LFO_1_DELAY,
VOICE_PARAM_LFO_2_DELAY,
VOICE_PARAM_LFO_3_DELAY,
VOICE_PARAM_LFO_0_ATTACK,
VOICE_PARAM_LFO_1_ATTACK,
VOICE_PARAM_LFO_2_ATTACK,
VOICE_PARAM_LFO_3_ATTACK,
VOICE_PARAM_LFO_0_SHAPE,
VOICE_PARAM_LFO_1_SHAPE,
VOICE_PARAM_LFO_2_SHAPE,
VOICE_PARAM_LFO_3_SHAPE,
VOICE_PARAM_LFO_0_MODE,
VOICE_PARAM_LFO_1_MODE,
VOICE_PARAM_LFO_2_MODE,
VOICE_PARAM_LFO_3_MODE,
VOICE_PARAM_LFO_0_SYNC,
VOICE_PARAM_LFO_1_SYNC,
VOICE_PARAM_LFO_2_SYNC,
VOICE_PARAM_LFO_3_SYNC,
VOICE_PARAM_LFO_0_SYMMETRY,
VOICE_PARAM_LFO_1_SYMMETRY,
VOICE_PARAM_LFO_2_SYMMETRY,
VOICE_PARAM_LFO_3_SYMMETRY,
VOICE_NUM_PARAMS
};
enum
{
VOICE_ENV_ENV_0 = 0,
VOICE_ENV_VCF = VOICE_ENV_ENV_0,
VOICE_ENV_ENV_1,
VOICE_ENV_VCA = VOICE_ENV_ENV_1,
VOICE_ENV_2,
VOICE_ENV_3,
};
enum
{
VOICE_MOD_SRC_ZEROS = 0,
VOICE_MOD_SRC_LFO_0,
VOICE_MOD_SRC_LFO_1,
VOICE_MOD_SRC_LFO_2,
VOICE_MOD_SRC_LFO_3,
VOICE_MOD_SRC_ENV_0,
VOICE_MOD_SRC_ENV_1,
VOICE_MOD_SRC_ENV_2,
VOICE_MOD_SRC_ENV_3,
VOICE_MOD_SRC_VCO_0,
VOICE_MOD_SRC_VCO_1,
VOICE_NUM_MOD_SOURCES
};
enum
{
VOICE_MOD_SRC_0_DISABLED = 0,
VOICE_MOD_SRC_0_LFO_0,
VOICE_MOD_SRC_0_LFO_1,
VOICE_MOD_SRC_0_LFO_2,
VOICE_MOD_SRC_0_LFO_3,
VOICE_MOD_SRC_0_ENV_0,
VOICE_MOD_SRC_0_ENV_1,
VOICE_MOD_SRC_0_ENV_2,
VOICE_MOD_SRC_0_ENV_3,
VOICE_MOD_SRC_0_VCO_0,
VOICE_NUM_MOD_SOURCES_0
};
enum
{
VOICE_MOD_SRC_1_DISABLED = 0,
VOICE_MOD_SRC_1_LFO_0,
VOICE_MOD_SRC_1_LFO_1,
VOICE_MOD_SRC_1_LFO_2,
VOICE_MOD_SRC_1_LFO_3,
VOICE_MOD_SRC_1_ENV_0,
VOICE_MOD_SRC_1_ENV_1,
VOICE_MOD_SRC_1_ENV_2,
VOICE_MOD_SRC_1_ENV_3,
VOICE_NUM_MOD_SOURCES_1
};
enum
{
VOICE_MOD_SRC_OP_ADD = 0,
VOICE_MOD_SRC_OP_MUL,
VOICE_NUM_MOD_OPS
};
enum
{
VOICE_LFO_MODE_GLOBAL,
VOICE_LFO_MODE_INDIVIDUAL,
VOICE_LFO_NUM_MODES
};
enum
{
VOICE_LFO_SYNC_FREE,
VOICE_LFO_SYNC_RESTART,
VOICE_LFO_NUM_SYNCS
};
enum
{
VOICE_NOISE_SHAPE_WHITE,
VOICE_NOISE_SHAPE_PINK,
VOICE_NOISE_NUM_SHAPES
};
enum
{
note_state_idle = 0,
note_state_triggered,
note_state_released
};
enum
{
voice_event_shutdown = 0,
voice_event_trigger,
voice_event_retrigger,
voice_event_release
};
typedef struct _svoice_common_t
{
synth_float_t freqTab[NUM_FREQS];
// Global LFO
lfo_t glfo[VOICE_NUM_LFO];
// Global Envelopes
envgen_t genv[VOICE_NUM_ENV];
// Global VCF
vcf_t gvcf[2];
// Global Noise generator
noise_gen_t gnoise;
synth_float_t pBuf_zeros[SYNTH_MAX_BUFSIZE];
synth_float_t pBuf_ones[SYNTH_MAX_BUFSIZE];
synth_float_t *pBuf_LFO_gbl[VOICE_NUM_LFO];
synth_float_t *pBuf_ENV_gbl[VOICE_NUM_ENV];
synth_float_t *pBuf_VCF_gbl_in;
synth_float_t *pBuf_VCF_gbl_out;
synth_float_t noise_out[SYNTH_MAX_BUFSIZE];
vco_common_t vco;
vcf_common_t vcf;
} voice_common_t;
typedef struct _svoice_t
{
voice_common_t *pCom;
UINT32 id;
UINT32 state;
UINT32 bufsize;
envgen_t env[VOICE_NUM_ENV];
synth_float_t fs;
osc_t vco[VOICE_NUM_OSC];
lfo_t lfo[VOICE_NUM_LFO];
vcf_t vcf;
synth_float_t param[VOICE_NUM_PARAMS];
synth_float_t *pBuf_Q;
smooth_t smooth_vco_enable[VOICE_NUM_OSC];
smooth_t smooth_vco_portamento[VOICE_NUM_OSC];
synth_float_t vco_pitch[VOICE_NUM_OSC];
// smooth_t *pParam_smoother[VOICE_NUM_PARAMS];
// synth_float_t param_smoothed[VOICE_NUM_PARAMS][SYNTH_MAX_BUFSIZE];
} voice_t;
// --------------------------------------------------------------
#if defined(__cplusplus)
extern "C" {
#endif
// --------------------------------------------------------------
// Exported functions
// --------------------------------------------------------------
void Voice_ModInit(voice_common_t *pCom);
void Voice_ModFree(voice_common_t *pCom);
void VoiceInit(voice_t *pObj, voice_common_t *pCom, UINT32 id, synth_float_t fs);
void VoiceFree(voice_t *pObj);
void VoiceSetFS(voice_t *pObj, synth_float_t fs);
void VoiceSetBufsize(voice_t *pObj, UINT32 size);
void VoiceEvent(voice_t *pObj, UINT32 type);
void VoiceParam2Set(voice_t *pObj, UINT32 type, synth_float_t value);
synth_float_t VoiceParamGet(voice_t *pObj, UINT32 type);
UINT32 VoiceStateGet(voice_t *pObj);
void VoiceProcessDataV(voice_t *pObj, float *pOut1, float *pOut2, UINT32 len);
void VoiceProcessDataV_Common(voice_t *pObj, float *pOut1, float *pOut2, UINT32 len);
#if defined(__cplusplus)
}
#endif
// --------------------------------------------------------------
#endif // _VOICE_H_