LMMS
Loading...
Searching...
No Matches
Lb302.h
Go to the documentation of this file.
1/*
2 * Lb302.h - declaration of class Lb302 which is a bass synth attempting to
3 * emulate the Roland TB-303 bass synth
4 *
5 * Copyright (c) 2006-2008 Paul Giblock <pgib/at/users.sourceforge.net>
6 *
7 * This file is part of LMMS - https://lmms.io
8 *
9 * Lb302FilterIIR2 is based on the gsyn filter code by Andy Sloane.
10 *
11 * Lb302Filter3Pole is based on the TB-303 instrument written by
12 * Josep M Comajuncosas for the CSounds library
13 *
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public
16 * License as published by the Free Software Foundation; either
17 * version 2 of the License, or (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public
25 * License along with this program (see COPYING); if not, write to the
26 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
27 * Boston, MA 02110-1301 USA.
28 *
29 */
30
31
32#ifndef LB302_H
33#define LB302_H
34
35#include "Instrument.h"
36#include "InstrumentView.h"
37#include "NotePlayHandle.h"
38#include <QMutex>
39
40namespace lmms
41{
42
43
44static const int NUM_FILTERS = 2;
45
46
47namespace DspEffectLibrary
48{
49class Distortion;
50}
51
52namespace gui
53{
54class AutomatableButtonGroup;
55class Knob;
56class Lb302SynthView;
57class LedCheckBox;
58}
59
60
62{
63 public:
64 float cutoff;
65 float reso;
66 float envmod;
67 float envdecay;
68 float dist;
69};
70
71
73{
74 public:
76 virtual ~Lb302Filter() = default;
77
78 virtual void recalc();
79 virtual void envRecalc();
80 virtual float process(const float& samp)=0;
81 virtual void playNote();
82
83 protected:
85
86 // Filter Decay
87 float vcf_c0; // c0=e1 on retrigger; c0*=ed every sample; cutoff=e0+c0
88 float vcf_e0, // e0 and e1 for interpolation
90 float vcf_rescoeff; // Resonance coefficient [0.30,9.54]
91};
92
94{
95 public:
97 ~Lb302FilterIIR2() override;
98
99 void recalc() override;
100 void envRecalc() override;
101 float process(const float& samp) override;
102
103 protected:
104 float vcf_d1, // d1 and d2 are added back into the sample with
105 vcf_d2; // vcf_a and b as coefficients. IIR2 resonance
106 // loop.
107
108 // IIR2 Coefficients for mixing dry and delay.
109 float vcf_a, // Mixing coefficients for the final sound.
112
114};
115
116
118{
119 public:
121
122 //virtual void recalc();
123 void envRecalc() override;
124 void recalc() override;
125 float process(const float& samp) override;
126
127 protected:
128 float kfcn,
133 float ay1,
138};
139
140
141
143{
144public:
145 float vco_inc;
146 bool dead;
147};
148
149
150class Lb302Synth : public Instrument
151{
152 Q_OBJECT
153public:
154 Lb302Synth( InstrumentTrack * _instrument_track );
155 ~Lb302Synth() override;
156
157 void play( SampleFrame* _working_buffer ) override;
158 void playNote( NotePlayHandle * _n,
159 SampleFrame* _working_buffer ) override;
160 void deleteNotePluginData( NotePlayHandle * _n ) override;
161
162
163 void saveSettings( QDomDocument & _doc, QDomElement & _parent ) override;
164 void loadSettings( const QDomElement & _this ) override;
165
166 QString nodeName() const override;
167
168 gui::PluginView* instantiateView( QWidget * _parent ) override;
169
170private:
171 void processNote( NotePlayHandle * n );
172
173 void initNote(Lb302Note *Note);
174 void initSlide();
175
176private:
181
183
187
192
193
194public slots:
195 void filterChanged();
196 void db24Toggled();
197
198private:
199 // Oscillator
200 float vco_inc, // Sample increment for the frequency. Creates Sawtooth.
201 vco_k, // Raw oscillator sample [-0.5,0.5]
202 vco_c; // Raw oscillator sample [-0.5,0.5]
203
204 float vco_slide, //* Current value of slide exponential curve. Nonzero=sliding
205 vco_slideinc, //* Slide base to use in next node. Nonzero=slide next note
206 vco_slidebase; //* The base vco_inc while sliding.
207
211
212 // Filters (just keep both loaded and switch)
214
215 // User settings
217 QAtomicPointer<Lb302Filter> vcf;
218
220
221 // More States
222 int vcf_envpos; // Update counter. Updates when >= ENVINC
223
224 float vca_attack, // Amp attack
225 vca_a0, // Initial amplifier coefficient
226 vca_a; // Amplifier coefficient.
227
228 // Envelope State
229 enum class VcaMode
230 {
232 Decay = 1,
233 Idle = 2,
235 };
237
238 // My hacks
240
242
245
248
249 void recalcFilter();
250
251 int process(SampleFrame* outbuf, const std::size_t size);
252
254
258} ;
259
260
261namespace gui
262{
263
264
266{
267 Q_OBJECT
268public:
269 Lb302SynthView( Instrument * _instrument,
270 QWidget * _parent );
271 ~Lb302SynthView() override = default;
272
273private:
274 void modelChanged() override;
275
280
284
286 /*LedCheckBox * m_accentToggle;*/ // removed pending accent implementation
289
290} ;
291
292
293} // namespace gui
294
295} // namespace lmms
296
297#endif // LB302_H
Definition noise.cpp:45
Definition AutomatableModel.h:497
Definition DspEffectLibrary.h:301
Definition AutomatableModel.h:463
Definition Instrument.h:52
Instrument(InstrumentTrack *_instrument_track, const Descriptor *_descriptor, const Descriptor::SubPluginFeatures::Key *key=nullptr, Flags flags=Flag::NoFlags)
Definition Instrument.cpp:38
Definition InstrumentTrack.h:62
Definition AutomatableModel.h:481
float value
Definition Lb302.h:137
float aout
Definition Lb302.h:135
float ay1
Definition Lb302.h:133
float kp
Definition Lb302.h:129
Lb302Filter3Pole(Lb302FilterKnobState *p_fs)
Definition Lb302.cpp:200
float kfcn
Definition Lb302.h:128
float lastin
Definition Lb302.h:136
float ay2
Definition Lb302.h:134
float kp1h
Definition Lb302.h:131
float kp1
Definition Lb302.h:130
float process(const float &samp) override
Definition Lb302.cpp:254
void envRecalc() override
Definition Lb302.cpp:219
float kres
Definition Lb302.h:132
void recalc() override
Definition Lb302.cpp:210
Definition Lb302.h:73
float vcf_rescoeff
Definition Lb302.h:90
virtual ~Lb302Filter()=default
virtual float process(const float &samp)=0
float vcf_e1
Definition Lb302.h:89
virtual void recalc()
Definition Lb302.cpp:111
Lb302Filter(Lb302FilterKnobState *p_fs)
Definition Lb302.cpp:102
virtual void envRecalc()
Definition Lb302.cpp:123
float vcf_c0
Definition Lb302.h:87
virtual void playNote()
Definition Lb302.cpp:130
Lb302FilterKnobState * fs
Definition Lb302.h:84
float vcf_e0
Definition Lb302.h:88
Lb302FilterIIR2(Lb302FilterKnobState *p_fs)
Definition Lb302.cpp:140
float process(const float &samp) override
Definition Lb302.cpp:181
float vcf_d1
Definition Lb302.h:104
float vcf_d2
Definition Lb302.h:105
float vcf_c
Definition Lb302.h:111
void recalc() override
Definition Lb302.cpp:160
DspEffectLibrary::Distortion * m_dist
Definition Lb302.h:113
float vcf_a
Definition Lb302.h:109
float vcf_b
Definition Lb302.h:110
void envRecalc() override
Definition Lb302.cpp:168
~Lb302FilterIIR2() override
Definition Lb302.cpp:154
Definition Lb302.h:62
float dist
Definition Lb302.h:68
float cutoff
Definition Lb302.h:64
float reso
Definition Lb302.h:65
float envmod
Definition Lb302.h:66
float envdecay
Definition Lb302.h:67
Definition Lb302.h:143
float vco_inc
Definition Lb302.h:145
bool dead
Definition Lb302.h:146
FloatModel vco_fine_detune_knob
Definition Lb302.h:182
void deleteNotePluginData(NotePlayHandle *_n) override
Definition Lb302.cpp:803
float vca_a0
Definition Lb302.h:225
int sample_cnt
Definition Lb302.h:239
float vco_k
Definition Lb302.h:201
QMutex m_notesMutex
Definition Lb302.h:257
gui::PluginView * instantiateView(QWidget *_parent) override
Create a view for the model.
Definition Lb302.cpp:813
void loadSettings(const QDomElement &_this) override
Definition Lb302.cpp:389
void db24Toggled()
Definition Lb302.cpp:426
QString nodeName() const override
Definition Lb302.cpp:435
void playNote(NotePlayHandle *_n, SampleFrame *_working_buffer) override
Definition Lb302.cpp:727
Lb302Synth(InstrumentTrack *_instrument_track)
Definition Lb302.cpp:282
FloatModel vcf_cut_knob
Definition Lb302.h:177
float vco_inc
Definition Lb302.h:200
BoolModel slideToggle
Definition Lb302.h:188
void recalcFilter()
Definition Lb302.cpp:442
Lb302FilterKnobState fs
Definition Lb302.h:216
int vcf_envpos
Definition Lb302.h:222
FloatModel vcf_mod_knob
Definition Lb302.h:179
void saveSettings(QDomDocument &_doc, QDomElement &_parent) override
Definition Lb302.cpp:371
QAtomicPointer< Lb302Filter > vcf
Definition Lb302.h:217
void initSlide()
Definition Lb302.cpp:712
IntModel wave_shape
Definition Lb302.h:185
int last_offset
Definition Lb302.h:241
VcaMode vca_mode
Definition Lb302.h:236
FloatModel dist_knob
Definition Lb302.h:184
NotePlayHandle * m_playingNote
Definition Lb302.h:255
bool new_freq
Definition Lb302.h:246
void filterChanged()
Definition Lb302.cpp:409
BoolModel accentToggle
Definition Lb302.h:189
float vca_a
Definition Lb302.h:226
float true_freq
Definition Lb302.h:247
void play(SampleFrame *_working_buffer) override
Definition Lb302.cpp:786
float vco_c
Definition Lb302.h:202
void initNote(Lb302Note *Note)
Definition Lb302.cpp:669
int catch_decay
Definition Lb302.h:244
~Lb302Synth() override
Definition Lb302.cpp:362
float vco_slideinc
Definition Lb302.h:205
NotePlayHandleList m_notes
Definition Lb302.h:256
float vco_slide
Definition Lb302.h:204
BoolModel db24Toggle
Definition Lb302.h:191
Lb302Filter * vcfs[NUM_FILTERS]
Definition Lb302.h:213
int catch_frame
Definition Lb302.h:243
FloatModel vcf_dec_knob
Definition Lb302.h:180
f_cnt_t release_frame
Definition Lb302.h:219
FloatModel slide_dec_knob
Definition Lb302.h:186
FloatModel vcf_res_knob
Definition Lb302.h:178
VcoShape vco_shape
Definition Lb302.h:210
int process(SampleFrame *outbuf, const std::size_t size)
Definition Lb302.cpp:463
VcaMode
Definition Lb302.h:230
@ Decay
Definition Lb302.h:232
@ Attack
Definition Lb302.h:231
@ Idle
Definition Lb302.h:233
@ NeverPlayed
Definition Lb302.h:234
float vca_attack
Definition Lb302.h:224
float vco_slidebase
Definition Lb302.h:206
void processNote(NotePlayHandle *n)
Definition Lb302.cpp:751
BoolModel deadToggle
Definition Lb302.h:190
VcoShape
Definition Lb302.h:208
@ BLSquare
Definition Lb302.h:209
@ BLTriangle
Definition Lb302.h:209
@ Moog
Definition Lb302.h:208
@ Triangle
Definition Lb302.h:208
@ Sine
Definition Lb302.h:208
@ RoundSquare
Definition Lb302.h:208
@ BLMoog
Definition Lb302.h:209
@ Exponential
Definition Lb302.h:208
@ Sawtooth
Definition Lb302.h:208
@ Square
Definition Lb302.h:208
@ BLSawtooth
Definition Lb302.h:209
Definition Note.h:101
Definition NotePlayHandle.h:48
Definition SampleFrame.h:41
Definition AutomatableButton.h:84
Instrument view with fixed LMMS-default size.
Definition InstrumentView.h:66
Definition Knob.h:47
Definition Lb302.h:266
Knob * m_vcfResKnob
Definition Lb302.h:277
Knob * m_vcfCutKnob
Definition Lb302.h:276
LedCheckBox * m_slideToggle
Definition Lb302.h:285
Lb302SynthView(Instrument *_instrument, QWidget *_parent)
Definition Lb302.cpp:822
Knob * m_vcfModKnob
Definition Lb302.h:279
Knob * m_distKnob
Definition Lb302.h:281
Knob * m_vcfDecKnob
Definition Lb302.h:278
LedCheckBox * m_db24Toggle
Definition Lb302.h:288
void modelChanged() override
Definition Lb302.cpp:1002
AutomatableButtonGroup * m_waveBtnGrp
Definition Lb302.h:283
LedCheckBox * m_deadToggle
Definition Lb302.h:287
~Lb302SynthView() override=default
Knob * m_slideDecKnob
Definition Lb302.h:282
Definition LedCheckBox.h:37
Definition PluginView.h:36
Definition DspEffectLibrary.h:35
Definition AudioPortAudio.cpp:223
Definition AudioAlsa.cpp:35
static const int NUM_FILTERS
Definition Lb302.h:44
QList< NotePlayHandle * > NotePlayHandleList
Definition NotePlayHandle.h:44
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
GUI::ui_handle_t gui
Definition main.cpp:50
int n
Definition crypt.c:458
ulg size
Definition extract.c:2350