Switched back to SVF bacause of the instability of Resonant Filter
This commit is contained in:
@ -7,7 +7,6 @@
|
|||||||
// This code is licenced under GPL v3 or later
|
// This code is licenced under GPL v3 or later
|
||||||
|
|
||||||
// todo:
|
// todo:
|
||||||
// debug accent handling that overloads the filter, also accent can be too short or too long if it's relying on midi note
|
|
||||||
// add overdrive
|
// add overdrive
|
||||||
// frequency from CV (noteFreq) could be Q16n16 for consistency
|
// frequency from CV (noteFreq) could be Q16n16 for consistency
|
||||||
|
|
||||||
@ -15,7 +14,8 @@
|
|||||||
#include <MIDI.h>
|
#include <MIDI.h>
|
||||||
#include <Oscil.h>
|
#include <Oscil.h>
|
||||||
#include <MetaOscil.h>
|
#include <MetaOscil.h>
|
||||||
#include <ResonantFilter.h>
|
//#include <ResonantFilter.h>
|
||||||
|
#include <StateVariable.h>
|
||||||
#include <Ead.h>
|
#include <Ead.h>
|
||||||
#include <Portamento.h>
|
#include <Portamento.h>
|
||||||
#include <mozzi_midi.h>
|
#include <mozzi_midi.h>
|
||||||
@ -99,16 +99,20 @@ Oscil <SAW_MAX_8192_AT_16384_512_NUM_CELLS, MOZZI_AUDIO_RATE> aSaw8192(SAW_MAX_8
|
|||||||
MetaOscil<SAW_MAX_138_AT_16384_512_NUM_CELLS, MOZZI_AUDIO_RATE, 16> aSaw {&aSaw138, &aSaw154, &aSaw182, &aSaw240, &aSaw292, &aSaw341, &aSaw390, &aSaw431, &aSaw512, &aSaw630, &aSaw744, &aSaw1170, &aSaw1638, &aSaw2730, &aSaw4096, &aSaw8192};
|
MetaOscil<SAW_MAX_138_AT_16384_512_NUM_CELLS, MOZZI_AUDIO_RATE, 16> aSaw {&aSaw138, &aSaw154, &aSaw182, &aSaw240, &aSaw292, &aSaw341, &aSaw390, &aSaw431, &aSaw512, &aSaw630, &aSaw744, &aSaw1170, &aSaw1638, &aSaw2730, &aSaw4096, &aSaw8192};
|
||||||
|
|
||||||
IntMap kMapNote( 0, 4095, 24 * pitchSubSteps, 84 * pitchSubSteps );
|
IntMap kMapNote( 0, 4095, 24 * pitchSubSteps, 84 * pitchSubSteps );
|
||||||
IntMap kMapCutoff( 0, 1023, 26, 100 );
|
//IntMap kMapCutoff( 0, 1023, 26, 100 ); //for lpf
|
||||||
|
//IntMap kMapResonance( 0, 1023, 0, 255 );
|
||||||
|
IntMap kMapCutoff( 0, 1023, 400, 3600 );
|
||||||
|
IntMap kMapResonance( 0, 1023, 200, 64 );
|
||||||
IntMap kMapEnvMod( 0, 1023, 0, 140 );
|
IntMap kMapEnvMod( 0, 1023, 0, 140 );
|
||||||
IntMap kMapResonance( 0, 1023, 0, 255 );
|
|
||||||
IntMap kMapDrive( 0, 1023, 0, 400 );
|
IntMap kMapDrive( 0, 1023, 0, 400 );
|
||||||
IntMap kMapAttack( 0, 1023, 1, 100 );
|
IntMap kMapAttack( 0, 1023, 1, 100 );
|
||||||
IntMap kMapDecay( 0, 1023, 100, 1500 );
|
IntMap kMapDecay( 0, 1023, 100, 1500 );
|
||||||
IntMap kMapAccentLevel( 0, 1023, 0, 128 );
|
IntMap kMapAccentLevel( 0, 1023, 0, 128 );
|
||||||
|
|
||||||
Ead kEnvelope(MOZZI_CONTROL_RATE);
|
Ead kEnvelope(MOZZI_CONTROL_RATE);
|
||||||
LowPassFilter lpfr;
|
//LowPassFilter lpf;
|
||||||
|
StateVariable <LOWPASS> svf;
|
||||||
|
|
||||||
Portamento <MOZZI_CONTROL_RATE> kGlide;
|
Portamento <MOZZI_CONTROL_RATE> kGlide;
|
||||||
|
|
||||||
//Global variables
|
//Global variables
|
||||||
@ -271,8 +275,11 @@ void updateControl(){
|
|||||||
//Remap the values and assign to parameters
|
//Remap the values and assign to parameters
|
||||||
int accentLevel = kMapAccentLevel(knobSVal);
|
int accentLevel = kMapAccentLevel(knobSVal);
|
||||||
int baseCutoff = kMapCutoff(knob1Val);
|
int baseCutoff = kMapCutoff(knob1Val);
|
||||||
int cutoff = accent? (baseCutoff + (((long)accentLevel * (100 - baseCutoff)) >> 7)) : baseCutoff;
|
//int cutoff = accent? (baseCutoff + (((long)accentLevel * (100 - baseCutoff)) >> 7)) : baseCutoff; //lpf version
|
||||||
int resonance = accent? (255 - (((long)(128 - accentLevel) * (255 - kMapResonance(knob2Val))) >> 7)) : kMapResonance(knob2Val);
|
int cutoff = accent? (baseCutoff + (((long)accentLevel * (3600 - baseCutoff)) >> 7)) : baseCutoff; //svf version
|
||||||
|
//int resonance = accent? (255 - (((long)(128 - accentLevel) * (255 - kMapResonance(knob2Val))) >> 7)) : kMapResonance(knob2Val); //lpf version
|
||||||
|
int baseResonance = kMapResonance(knob2Val);
|
||||||
|
int resonance = accent? (baseResonance - (((long)accentLevel * (baseResonance - 64)) >> 7)) : baseResonance;
|
||||||
int envMod = kMapEnvMod(knob3Val);
|
int envMod = kMapEnvMod(knob3Val);
|
||||||
driveAmount = kMapDrive(knob4Val);
|
driveAmount = kMapDrive(knob4Val);
|
||||||
|
|
||||||
@ -319,7 +326,9 @@ void updateControl(){
|
|||||||
|
|
||||||
gain = accent? constrain(env + (((long)env * accentLevel) >> 7), 0, 255) : env; //needs finetuning
|
gain = accent? constrain(env + (((long)env * accentLevel) >> 7), 0, 255) : env; //needs finetuning
|
||||||
|
|
||||||
lpfr.setCutoffFreqAndResonance(constrain(cutoff + (((long)env * envMod * cutoff)>>16), 0, 255), resonance);
|
//lpf.setCutoffFreqAndResonance(constrain(cutoff + (((long)env * envMod * cutoff)>>16), 0, 255), resonance);
|
||||||
|
svf.setCentreFreq(cutoff + (((long)env * envMod * cutoff)>>16));
|
||||||
|
svf.setResonance(resonance);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioOutput updateAudio(){
|
AudioOutput updateAudio(){
|
||||||
@ -329,7 +338,8 @@ AudioOutput updateAudio(){
|
|||||||
} else {
|
} else {
|
||||||
signal = aSaw.next();
|
signal = aSaw.next();
|
||||||
}
|
}
|
||||||
signal = lpfr.next(signal); //filter
|
//signal = lpf.next(signal); //filter
|
||||||
|
signal = svf.next(signal);
|
||||||
signal = (signal * gain); //envelope
|
signal = (signal * gain); //envelope
|
||||||
//signal = softClip((signal * (127 + driveAmount)) >> 9); //overdrive
|
//signal = softClip((signal * (127 + driveAmount)) >> 9); //overdrive
|
||||||
//signal = (signal * makeupGain) >> 7; //makeup gain compensation
|
//signal = (signal * makeupGain) >> 7; //makeup gain compensation
|
||||||
|
|||||||
Reference in New Issue
Block a user