LMMS
Loading...
Searching...
No Matches
ModFilter.cpp
Go to the documentation of this file.
1/*
2 ZynAddSubFX - a software synthesizer
3
4 ModFilter.cpp - Modulated Filter
5 Copyright (C) 2016 Mark McCurry
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11*/
12#include "ModFilter.h"
13#include "Envelope.h"
14#include "LFO.h"
15#include "../Misc/Util.h"
16#include "../Misc/Allocator.h"
18#include "../DSP/Filter.h"
19#include "../DSP/SVFilter.h"
20#include "../DSP/AnalogFilter.h"
22#include <cassert>
23
24namespace zyncarla {
25
27 const SYNTH_T &synth_,
28 const AbsTime &time_,
29 Allocator &alloc_,
30 bool stereo,
31 float notefreq)
32 :pars(pars_), synth(synth_), time(time_), alloc(alloc_),
33 baseQ(pars.getq()), baseFreq(pars.getfreq()),
34 noteFreq(notefreq),
35 left(nullptr),
37 env(nullptr),
38 lfo(nullptr)
39{
40 tracking = pars.getfreqtracking(notefreq);
41 baseQ = pars.getq();
42 baseFreq = pars.getfreq();
43
45 synth.samplerate, synth.buffersize);
46
47 if(stereo)
49 synth.samplerate, synth.buffersize);
50}
51
53{
54 alloc.dealloc(left);
55 alloc.dealloc(right);
56}
57
59{
60 lfo = &lfo_;
61}
62
64{
65 env = &env_;
66}
67
68//Recompute Filter Parameters
69void ModFilter::update(float relfreq, float relq)
70{
71 if(pars.last_update_timestamp == time.time()) {
73 if(right)
75
76 baseFreq = pars.getfreq();
77 baseQ = pars.getq();
78 tracking = pars.getfreqtracking(noteFreq);
79 }
80
81 //Controller Free Center Frequency
82 const float Fc = baseFreq
83 + sense
84 + (env ? env->envout() : 0)
85 + (lfo ? lfo->lfoout() : 0);
86
87 const float Fc_mod = Fc + relfreq + tracking;
88
89 //Convert into Hz
90 const float Fc_Hz = Filter::getrealfreq(Fc_mod);
91
92 const float q = baseQ * relq;
93
94 left->setfreq_and_q(Fc_Hz, q);
95 if(right)
96 right->setfreq_and_q(Fc_Hz, q);
97}
98
99void ModFilter::updateNoteFreq(float noteFreq_)
100{
101 noteFreq = noteFreq_;
102 tracking = pars.getfreqtracking(noteFreq);
103}
104
105void ModFilter::updateSense(float velocity, uint8_t scale,
106 uint8_t func)
107{
108 const float velScale = scale / 127.0f;
109 sense = velScale * 6.0f * (VelF(velocity, func) - 1);
110}
111
112void ModFilter::filter(float *l, float *r)
113{
114 if(left && l)
115 left->filterout(l);
116 if(right && r)
117 right->filterout(r);
118}
119
121{
122 if(dynamic_cast<AnalogFilter*>(f))
123 return 0;
124 else if(dynamic_cast<FormantFilter*>(f))
125 return 1;
126 else if(dynamic_cast<SVFilter*>(f))
127 return 2;
128
129 assert(false);
130 return -1;
131}
132
134{
135 //Common parameters
136 baseQ = pars.getq();
137 baseFreq = pars.getfreq();
138
139 if(current_category(f) != pars.Pcategory) {
140 alloc.dealloc(f);
142 synth.samplerate, synth.buffersize);
143 return;
144 }
145
146 if(auto *sv = dynamic_cast<SVFilter*>(f))
147 svParamUpdate(*sv);
148 else if(auto *an = dynamic_cast<AnalogFilter*>(f))
149 anParamUpdate(*an);
150}
151
153{
154 sv.settype(pars.Ptype);
155 sv.setstages(pars.Pstages);
156}
157
159{
160 an.settype(pars.Ptype);
161 an.setstages(pars.Pstages);
162 an.setgain(pars.getgain());
163}
164
165}
#define nullptr
Definition DistrhoDefines.h:75
assert(0)
Definition Time.h:19
Definition Allocator.h:22
Definition AnalogFilter.h:28
void settype(int type_)
Definition AnalogFilter.cpp:309
void setgain(float dBgain)
Definition AnalogFilter.cpp:315
void setstages(int stages_)
Definition AnalogFilter.cpp:321
Definition Envelope.h:24
Definition Filter.h:22
static float getrealfreq(float freqpitch)
Definition Filter.cpp:66
static Filter * generate(Allocator &memory, const FilterParams *pars, unsigned int srate, int bufsize)
Definition Filter.cpp:35
Definition FilterParams.h:24
Definition FormantFilter.h:23
Definition LFO.h:25
Allocator & alloc
Definition ModFilter.h:53
const SYNTH_T & synth
Definition ModFilter.h:51
void svParamUpdate(SVFilter &sv)
Definition ModFilter.cpp:152
Filter * right
Definition ModFilter.h:65
void updateNoteFreq(float noteFreq_)
Definition ModFilter.cpp:99
const AbsTime & time
Definition ModFilter.h:52
~ModFilter(void)
Definition ModFilter.cpp:52
float tracking
Definition ModFilter.h:60
float baseFreq
Definition ModFilter.h:58
LFO * lfo
Definition ModFilter.h:67
void addMod(LFO &lfo)
Definition ModFilter.cpp:58
Envelope * env
Definition ModFilter.h:66
void anParamUpdate(AnalogFilter &an)
Definition ModFilter.cpp:158
const FilterParams & pars
Definition ModFilter.h:50
void updateSense(float velocity, uint8_t scale, uint8_t func)
Definition ModFilter.cpp:105
void filter(float *l, float *r)
Definition ModFilter.cpp:112
void paramUpdate(Filter *&f)
Definition ModFilter.cpp:133
float sense
Definition ModFilter.h:61
Filter * left
Definition ModFilter.h:64
float baseQ
Definition ModFilter.h:57
void update(float relfreq, float relq)
Definition ModFilter.cpp:69
ModFilter(const FilterParams &pars, const SYNTH_T &synth, const AbsTime &time, Allocator &alloc, bool stereo, float notefreq_)
Definition ModFilter.cpp:26
float noteFreq
Definition ModFilter.h:59
Definition SVFilter.h:23
void setstages(int stages_)
Definition SVFilter.cpp:162
void settype(int type_)
Definition SVFilter.cpp:150
int * l
Definition inflate.c:1579
unsigned f
Definition inflate.c:1572
unsigned char uint8_t
Definition mid.cpp:98
Definition zynaddsubfx-src.cpp:569
float VelF(float velocity, unsigned char scaling)
Definition Util.cpp:48
static int current_category(Filter *f)
Definition ModFilter.cpp:120
Definition globals.h:294
int r
Definition crypt.c:458
register uch * q
Definition fileio.c:817