LMMS
Loading...
Searching...
No Matches
Watsyn.h
Go to the documentation of this file.
1/*
2 * Watsyn.h - a 4-oscillator modulating wavetable synth
3 *
4 * Copyright (c) 2014 Vesa Kivimäki <contact/dot/diizy/at/nbl/dot/fi>
5 *
6 * This file is part of LMMS - https://lmms.io
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program (see COPYING); if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA.
22 *
23 */
24
25
26#ifndef WATSYN_H
27#define WATSYN_H
28
29#include "AudioResampler.h"
30#include "Instrument.h"
31#include "InstrumentView.h"
32#include "Graph.h"
33#include "AutomatableModel.h"
34#include "TempoSyncKnob.h"
35#include <samplerate.h>
36
37namespace lmms
38{
39
40#define A1ROW 26
41#define A2ROW 49
42#define B1ROW 72
43#define B2ROW 95
44
45
46const int GRAPHLEN = 220; // don't change - must be same as the size of the widget
47
48const int WAVERATIO = 32; // oversampling ratio
49
51const int PMOD_AMT = WAVELEN / 2;
52
53const int MOD_MIX = 0;
54const int MOD_AM = 1;
55const int MOD_RM = 2;
56const int MOD_PM = 3;
57const int NUM_MODS = 4;
58
59const int A1_OSC = 0;
60const int A2_OSC = 1;
61const int B1_OSC = 2;
62const int B2_OSC = 3;
63const int NUM_OSCS = 4;
64
66
67namespace gui
68{
69class AutomatableButtonGroup;
70class PixmapButton;
71class WatsynView;
72}
73
75{
76public:
77 WatsynObject( float * _A1wave, float * _A2wave,
78 float * _B1wave, float * _B2wave,
79 int _amod, int _bmod, const sample_rate_t _samplerate, NotePlayHandle * _nph, f_cnt_t _frames,
80 WatsynInstrument * _w );
81 virtual ~WatsynObject();
82
83 void renderOutput( f_cnt_t _frames );
84
85 inline SampleFrame* abuf() const
86 {
87 return m_abuf;
88 }
89 inline SampleFrame* bbuf() const
90 {
91 return m_bbuf;
92 }
94 {
95 return m_samplerate;
96 }
97
98private:
99 int m_amod;
101
104
106
108
111
114
119};
120
122{
123 Q_OBJECT
124public:
125 WatsynInstrument( InstrumentTrack * _instrument_track );
126 ~WatsynInstrument() override = default;
127
128 void playNote( NotePlayHandle * _n,
129 SampleFrame* _working_buffer ) override;
130 void deleteNotePluginData( NotePlayHandle * _n ) override;
131
132
133 void saveSettings( QDomDocument & _doc,
134 QDomElement & _this ) override;
135 void loadSettings( const QDomElement & _this ) override;
136
137 QString nodeName() const override;
138
139 float desiredReleaseTimeMs() const override
140 {
141 return 1.5f;
142 }
143
144 gui::PluginView* instantiateView( QWidget * _parent ) override;
145
146public slots:
147 void updateVolumes();
148 void updateFreqA1();
149 void updateFreqA2();
150 void updateFreqB1();
151 void updateFreqB2();
152 void updateWaveA1();
153 void updateWaveA2();
154 void updateWaveB1();
155 void updateWaveB2();
156
157protected:
160
163
164private:
165 inline float leftCh( float _vol, float _pan )
166 {
167 return ( _pan <= 0 ? 1.0 : 1.0 - ( _pan / 100.0 ) ) * _vol / 100.0;
168 }
169
170 inline float rightCh( float _vol, float _pan )
171 {
172 return ( _pan >= 0 ? 1.0 : 1.0 + ( _pan / 100.0 ) ) * _vol / 100.0;
173 }
174
175 // memcpy utilizing libsamplerate (src) for sinc interpolation
176 inline void srccpy(float* _dst, float* _src)
177 {
178 auto srcIndex = f_cnt_t{0};
179 auto dstIndex = f_cnt_t{0};
180
181 m_resampler.reset();
182 m_resampler.setRatio(WAVERATIO);
183
184 while (dstIndex < WAVELEN)
185 {
186 const auto input = InterleavedBufferView<const float, 1>{_src + srcIndex, GRAPHLEN - srcIndex};
187 const auto output = InterleavedBufferView<float, 1>{_dst + dstIndex, WAVELEN - dstIndex};
188 const auto result = m_resampler.process(input, output);
189
190 srcIndex = (srcIndex + result.inputFramesUsed) % GRAPHLEN;
191 dstIndex += result.outputFramesGenerated;
192 }
193 }
194
195 // memcpy utilizing cubic interpolation
196/* inline void cipcpy( float * _dst, float * _src )
197 {
198 // calculate cyclic tangents
199 float tang[GRAPHLEN];
200 tang[0] = ( _src[1] - _src[ GRAPHLEN - 1] ) / 2;
201 tang[ GRAPHLEN - 1 ] = ( _src[0] - _src[ GRAPHLEN - 2 ] ) / 2;
202 for( int i = 1; i < GRAPHLEN-1; i++ )
203 {
204 tang[i] = ( _src[i+1] - _src[i-1] ) / 2;
205 }
206
207 // calculate cspline
208 for( int i=0; i < WAVELEN; i++ )
209 {
210 const float s1 = _src[ i / WAVERATIO ];
211 const float s2 = _src[ ( i / WAVERATIO + 1 ) % GRAPHLEN ];
212 const float m1 = tang[ i / WAVERATIO ];
213 const float m2 = tang[ ( i / WAVERATIO + 1 ) % GRAPHLEN ];
214
215 const float x = static_cast<float>( i % WAVERATIO ) / WAVERATIO;
216 const float x2 = x * x;
217 const float x3 = x * x * x;
218
219 _dst[i] = ( ( x3 * 2.0 - x2 * 3.0 + 1.0 ) * s1 ) +
220 ( ( x3 * -2.0 + x2 * 3.0 ) * s2 ) +
221 ( ( x3 - x2 * 2 + x ) * m1 ) +
222 ( ( x3 - x2 ) * m2 );
223 }
224 }*/
225
227
232
237
242
247
252
257
259
261
265
267
270
272
277
278 friend class WatsynObject;
279 friend class gui::WatsynView;
280};
281
282
283namespace gui
284{
285
286
288{
289 Q_OBJECT
290public:
291 WatsynView( Instrument * _instrument,
292 QWidget * _parent );
293 ~WatsynView() override = default;
294
295protected slots:
296 void updateLayout();
297
298 void sinWaveClicked();
299 void triWaveClicked();
300 void sawWaveClicked();
301 void sqrWaveClicked();
302
303 void smoothClicked();
304 void normalizeClicked();
305 void invertClicked();
306 void phaseLeftClicked();
307 void phaseRightClicked();
308 void loadClicked();
309
310private:
311 void modelChanged() override;
312
313 template<class T = Knob>
314 auto makeKnob(int x, int y, const QString& hint, const QString& unit,
315 const QString& objName) -> T*
316 {
317 T* knob = new T(KnobType::Styled, this);
318 knob->move(x, y);
319 knob->setHintText(hint, unit);
320 knob->setObjectName(objName);
321 knob->setFixedSize(19, 19);
322 return knob;
323 };
324
325// knobs
330
335
340
345
350
352
354
358
360
364
369
380
381};
382
383
384} // namespace gui
385
386} // namespace lmms
387
388#endif
A utility class for resampling interleaved audio buffers using various resampling algorithms.
Definition AudioResampler.h:41
@ SincFastest
Fastest sinc-based resampling.
Definition AudioResampler.h:51
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
Definition AudioBufferView.h:291
Definition NotePlayHandle.h:48
Definition SampleFrame.h:41
Definition TempoSyncKnobModel.h:45
Definition Watsyn.h:122
graphModel b2_graph
Definition Watsyn.h:256
FloatModel m_abmix
Definition Watsyn.h:258
void updateFreqB2()
Definition Watsyn.cpp:635
FloatModel a1_rtune
Definition Watsyn.h:248
void deleteNotePluginData(NotePlayHandle *_n) override
Definition Watsyn.cpp:466
graphModel a2_graph
Definition Watsyn.h:254
FloatModel b1_mult
Definition Watsyn.h:240
FloatModel a2_mult
Definition Watsyn.h:239
FloatModel b2_mult
Definition Watsyn.h:241
void updateFreqB1()
Definition Watsyn.cpp:627
IntModel m_selectedGraph
Definition Watsyn.h:271
WatsynInstrument(InstrumentTrack *_instrument_track)
Definition Watsyn.cpp:250
TempoSyncKnobModel m_envDec
Definition Watsyn.h:264
void updateVolumes()
Definition Watsyn.cpp:595
float B2_wave[WAVELEN]
Definition Watsyn.h:276
FloatModel a2_vol
Definition Watsyn.h:229
FloatModel a2_ltune
Definition Watsyn.h:244
void srccpy(float *_dst, float *_src)
Definition Watsyn.h:176
FloatModel b1_ltune
Definition Watsyn.h:245
FloatModel b1_vol
Definition Watsyn.h:230
~WatsynInstrument() override=default
float m_rfreq[NUM_OSCS]
Definition Watsyn.h:162
void updateWaveB2()
Definition Watsyn.cpp:664
float desiredReleaseTimeMs() const override
Definition Watsyn.h:139
FloatModel b1_rtune
Definition Watsyn.h:250
gui::PluginView * instantiateView(QWidget *_parent) override
Create a view for the model.
Definition Watsyn.cpp:589
FloatModel a2_pan
Definition Watsyn.h:234
void playNote(NotePlayHandle *_n, SampleFrame *_working_buffer) override
Definition Watsyn.cpp:344
FloatModel a1_vol
Definition Watsyn.h:228
FloatModel b2_pan
Definition Watsyn.h:236
float m_lfreq[NUM_OSCS]
Definition Watsyn.h:161
graphModel a1_graph
Definition Watsyn.h:253
void updateFreqA2()
Definition Watsyn.cpp:619
FloatModel b2_vol
Definition Watsyn.h:231
FloatModel m_envAmt
Definition Watsyn.h:260
void saveSettings(QDomDocument &_doc, QDomElement &_this) override
Definition Watsyn.cpp:472
FloatModel a1_ltune
Definition Watsyn.h:243
FloatModel b1_pan
Definition Watsyn.h:235
graphModel b1_graph
Definition Watsyn.h:255
float m_lvol[NUM_OSCS]
Definition Watsyn.h:158
FloatModel a1_pan
Definition Watsyn.h:233
float rightCh(float _vol, float _pan)
Definition Watsyn.h:170
float leftCh(float _vol, float _pan)
Definition Watsyn.h:165
void updateWaveA2()
Definition Watsyn.cpp:650
float B1_wave[WAVELEN]
Definition Watsyn.h:275
float m_rvol[NUM_OSCS]
Definition Watsyn.h:159
FloatModel b2_rtune
Definition Watsyn.h:251
float A2_wave[WAVELEN]
Definition Watsyn.h:274
FloatModel a1_mult
Definition Watsyn.h:238
void updateWaveB1()
Definition Watsyn.cpp:657
void loadSettings(const QDomElement &_this) override
Definition Watsyn.cpp:526
void updateWaveA1()
Definition Watsyn.cpp:643
IntModel m_amod
Definition Watsyn.h:268
TempoSyncKnobModel m_envHold
Definition Watsyn.h:263
QString nodeName() const override
Definition Watsyn.cpp:583
FloatModel m_xtalk
Definition Watsyn.h:266
FloatModel b2_ltune
Definition Watsyn.h:246
friend class WatsynObject
Definition Watsyn.h:278
FloatModel a2_rtune
Definition Watsyn.h:249
void updateFreqA1()
Definition Watsyn.cpp:611
TempoSyncKnobModel m_envAtt
Definition Watsyn.h:262
float A1_wave[WAVELEN]
Definition Watsyn.h:273
AudioResampler m_resampler
Definition Watsyn.h:226
IntModel m_bmod
Definition Watsyn.h:269
SampleFrame * abuf() const
Definition Watsyn.h:85
float m_B1wave[WAVELEN]
Definition Watsyn.h:117
float m_A1wave[WAVELEN]
Definition Watsyn.h:115
float m_B2wave[WAVELEN]
Definition Watsyn.h:118
f_cnt_t m_fpp
Definition Watsyn.h:105
SampleFrame * bbuf() const
Definition Watsyn.h:89
NotePlayHandle * m_nph
Definition Watsyn.h:103
int m_amod
Definition Watsyn.h:99
int m_bmod
Definition Watsyn.h:100
WatsynObject(float *_A1wave, float *_A2wave, float *_B1wave, float *_B2wave, int _amod, int _bmod, const sample_rate_t _samplerate, NotePlayHandle *_nph, f_cnt_t _frames, WatsynInstrument *_w)
Definition Watsyn.cpp:65
virtual ~WatsynObject()
Definition Watsyn.cpp:99
WatsynInstrument * m_parent
Definition Watsyn.h:107
void renderOutput(f_cnt_t _frames)
Definition Watsyn.cpp:106
SampleFrame * m_abuf
Definition Watsyn.h:109
float m_A2wave[WAVELEN]
Definition Watsyn.h:116
float m_lphase[NUM_OSCS]
Definition Watsyn.h:112
float m_rphase[NUM_OSCS]
Definition Watsyn.h:113
const sample_rate_t m_samplerate
Definition Watsyn.h:102
sample_rate_t samplerate() const
Definition Watsyn.h:93
SampleFrame * m_bbuf
Definition Watsyn.h:110
2 dimensional function plot
Definition Graph.h:134
Definition AutomatableButton.h:84
Definition Graph.h:48
Instrument view with fixed LMMS-default size.
Definition InstrumentView.h:66
Definition Knob.h:47
Definition PixmapButton.h:37
Definition PluginView.h:36
Definition TempoSyncKnob.h:41
Definition Watsyn.h:288
Graph * b1_graph
Definition Watsyn.h:367
Knob * m_xtalkKnob
Definition Watsyn.h:359
Knob * b1_rtuneKnob
Definition Watsyn.h:348
AutomatableButtonGroup * m_selectedGraphGroup
Definition Watsyn.h:361
Knob * b1_ltuneKnob
Definition Watsyn.h:343
Knob * b2_multKnob
Definition Watsyn.h:339
Knob * a2_volKnob
Definition Watsyn.h:327
Knob * a1_rtuneKnob
Definition Watsyn.h:346
PixmapButton * m_sawWaveButton
Definition Watsyn.h:372
Knob * m_abmixKnob
Definition Watsyn.h:351
Graph * b2_graph
Definition Watsyn.h:368
void sqrWaveClicked()
Definition Watsyn.cpp:1051
Knob * a1_panKnob
Definition Watsyn.h:331
void sinWaveClicked()
Definition Watsyn.cpp:979
void sawWaveClicked()
Definition Watsyn.cpp:1027
PixmapButton * m_invertButton
Definition Watsyn.h:375
TempoSyncKnob * m_envHoldKnob
Definition Watsyn.h:356
Knob * b1_panKnob
Definition Watsyn.h:333
Graph * a1_graph
Definition Watsyn.h:365
PixmapButton * m_phaseRightButton
Definition Watsyn.h:378
Knob * a1_multKnob
Definition Watsyn.h:336
TempoSyncKnob * m_envDecKnob
Definition Watsyn.h:357
Knob * m_envAmtKnob
Definition Watsyn.h:353
Knob * b2_ltuneKnob
Definition Watsyn.h:344
void normalizeClicked()
Definition Watsyn.cpp:1075
Knob * b1_volKnob
Definition Watsyn.h:328
Knob * a1_volKnob
Definition Watsyn.h:326
AutomatableButtonGroup * m_aModGroup
Definition Watsyn.h:362
PixmapButton * m_loadButton
Definition Watsyn.h:379
void invertClicked()
Definition Watsyn.cpp:1099
PixmapButton * m_triWaveButton
Definition Watsyn.h:371
auto makeKnob(int x, int y, const QString &hint, const QString &unit, const QString &objName) -> T *
Definition Watsyn.h:314
Knob * a2_ltuneKnob
Definition Watsyn.h:342
void smoothClicked()
Definition Watsyn.cpp:1123
Knob * a1_ltuneKnob
Definition Watsyn.h:341
PixmapButton * m_sinWaveButton
Definition Watsyn.h:370
PixmapButton * m_normalizeButton
Definition Watsyn.h:374
void updateLayout()
Definition Watsyn.cpp:946
void triWaveClicked()
Definition Watsyn.cpp:1003
void modelChanged() override
Definition Watsyn.cpp:1220
Knob * a2_multKnob
Definition Watsyn.h:337
void phaseRightClicked()
Definition Watsyn.cpp:1171
Knob * b1_multKnob
Definition Watsyn.h:338
WatsynView(Instrument *_instrument, QWidget *_parent)
Definition Watsyn.cpp:675
PixmapButton * m_phaseLeftButton
Definition Watsyn.h:377
Knob * a2_panKnob
Definition Watsyn.h:332
PixmapButton * m_sqrWaveButton
Definition Watsyn.h:373
Knob * b2_panKnob
Definition Watsyn.h:334
AutomatableButtonGroup * m_bModGroup
Definition Watsyn.h:363
Knob * b2_volKnob
Definition Watsyn.h:329
void phaseLeftClicked()
Definition Watsyn.cpp:1147
Knob * b2_rtuneKnob
Definition Watsyn.h:349
PixmapButton * m_smoothButton
Definition Watsyn.h:376
~WatsynView() override=default
Knob * a2_rtuneKnob
Definition Watsyn.h:347
Graph * a2_graph
Definition Watsyn.h:366
TempoSyncKnob * m_envAttKnob
Definition Watsyn.h:355
void loadClicked()
Definition Watsyn.cpp:1195
int y
Definition inflate.c:1588
unsigned x[BMAX+1]
Definition inflate.c:1586
static PuglViewHint hint
Definition pugl.h:1707
Definition AudioPortAudio.cpp:209
@ Styled
Definition Knob.h:40
Definition AudioAlsa.cpp:35
const int WAVERATIO
Definition Watsyn.h:48
const int MOD_MIX
Definition Monstro.h:121
const int B2_OSC
Definition Watsyn.h:62
std::uint32_t sample_rate_t
Definition LmmsTypes.h:42
const int B1_OSC
Definition Watsyn.h:61
const int WAVELEN
Definition Watsyn.h:50
const int MOD_RM
Definition Watsyn.h:55
const int GRAPHLEN
Definition Watsyn.h:46
const int PMOD_AMT
Definition Watsyn.h:51
const int NUM_MODS
Definition Monstro.h:125
const int A2_OSC
Definition Watsyn.h:60
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
const int MOD_AM
Definition Monstro.h:122
const int NUM_OSCS
Definition Watsyn.h:63
const int MOD_PM
Definition Monstro.h:124
const int A1_OSC
Definition Watsyn.h:59
png_const_structrp png_const_inforp int * unit
Definition png.h:2161
int result
Definition process.c:1455