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
41#define makeknob( name, x, y, hint, unit, oname ) \
42 name = new Knob( KnobType::Styled, this ); \
43 name ->move( x, y ); \
44 name ->setHintText( hint, unit ); \
45 name ->setObjectName( oname ); \
46 name ->setFixedSize( 19, 19 );
47
48#define maketsknob( name, x, y, hint, unit, oname ) \
49 name = new TempoSyncKnob( KnobType::Styled, this ); \
50 name ->move( x, y ); \
51 name ->setHintText( hint, unit ); \
52 name ->setObjectName( oname ); \
53 name ->setFixedSize( 19, 19 );
54
55#define A1ROW 26
56#define A2ROW 49
57#define B1ROW 72
58#define B2ROW 95
59
60
61const int GRAPHLEN = 220; // don't change - must be same as the size of the widget
62
63const int WAVERATIO = 32; // oversampling ratio
64
66const int PMOD_AMT = WAVELEN / 2;
67
68const int MOD_MIX = 0;
69const int MOD_AM = 1;
70const int MOD_RM = 2;
71const int MOD_PM = 3;
72const int NUM_MODS = 4;
73
74const int A1_OSC = 0;
75const int A2_OSC = 1;
76const int B1_OSC = 2;
77const int B2_OSC = 3;
78const int NUM_OSCS = 4;
79
81
82namespace gui
83{
84class AutomatableButtonGroup;
85class PixmapButton;
86class WatsynView;
87}
88
90{
91public:
92 WatsynObject( float * _A1wave, float * _A2wave,
93 float * _B1wave, float * _B2wave,
94 int _amod, int _bmod, const sample_rate_t _samplerate, NotePlayHandle * _nph, f_cnt_t _frames,
95 WatsynInstrument * _w );
96 virtual ~WatsynObject();
97
98 void renderOutput( f_cnt_t _frames );
99
100 inline SampleFrame* abuf() const
101 {
102 return m_abuf;
103 }
104 inline SampleFrame* bbuf() const
105 {
106 return m_bbuf;
107 }
109 {
110 return m_samplerate;
111 }
112
113private:
116
119
121
123
126
129
134};
135
137{
138 Q_OBJECT
139public:
140 WatsynInstrument( InstrumentTrack * _instrument_track );
141 ~WatsynInstrument() override = default;
142
143 void playNote( NotePlayHandle * _n,
144 SampleFrame* _working_buffer ) override;
145 void deleteNotePluginData( NotePlayHandle * _n ) override;
146
147
148 void saveSettings( QDomDocument & _doc,
149 QDomElement & _this ) override;
150 void loadSettings( const QDomElement & _this ) override;
151
152 QString nodeName() const override;
153
154 float desiredReleaseTimeMs() const override
155 {
156 return 1.5f;
157 }
158
159 gui::PluginView* instantiateView( QWidget * _parent ) override;
160
161public slots:
162 void updateVolumes();
163 void updateFreqA1();
164 void updateFreqA2();
165 void updateFreqB1();
166 void updateFreqB2();
167 void updateWaveA1();
168 void updateWaveA2();
169 void updateWaveB1();
170 void updateWaveB2();
171
172protected:
175
178
179private:
180 inline float leftCh( float _vol, float _pan )
181 {
182 return ( _pan <= 0 ? 1.0 : 1.0 - ( _pan / 100.0 ) ) * _vol / 100.0;
183 }
184
185 inline float rightCh( float _vol, float _pan )
186 {
187 return ( _pan >= 0 ? 1.0 : 1.0 + ( _pan / 100.0 ) ) * _vol / 100.0;
188 }
189
190 // memcpy utilizing libsamplerate (src) for sinc interpolation
191 inline void srccpy(float* _dst, float* _src)
192 {
193 auto srcIndex = f_cnt_t{0};
194 auto dstIndex = f_cnt_t{0};
195
196 m_resampler.reset();
197 m_resampler.setRatio(WAVERATIO);
198
199 while (dstIndex < WAVELEN)
200 {
201 const auto input = InterleavedBufferView<const float, 1>{_src + srcIndex, GRAPHLEN - srcIndex};
202 const auto output = InterleavedBufferView<float, 1>{_dst + dstIndex, WAVELEN - dstIndex};
203 const auto result = m_resampler.process(input, output);
204
205 srcIndex = (srcIndex + result.inputFramesUsed) % GRAPHLEN;
206 dstIndex += result.outputFramesGenerated;
207 }
208 }
209
210 // memcpy utilizing cubic interpolation
211/* inline void cipcpy( float * _dst, float * _src )
212 {
213 // calculate cyclic tangents
214 float tang[GRAPHLEN];
215 tang[0] = ( _src[1] - _src[ GRAPHLEN - 1] ) / 2;
216 tang[ GRAPHLEN - 1 ] = ( _src[0] - _src[ GRAPHLEN - 2 ] ) / 2;
217 for( int i = 1; i < GRAPHLEN-1; i++ )
218 {
219 tang[i] = ( _src[i+1] - _src[i-1] ) / 2;
220 }
221
222 // calculate cspline
223 for( int i=0; i < WAVELEN; i++ )
224 {
225 const float s1 = _src[ i / WAVERATIO ];
226 const float s2 = _src[ ( i / WAVERATIO + 1 ) % GRAPHLEN ];
227 const float m1 = tang[ i / WAVERATIO ];
228 const float m2 = tang[ ( i / WAVERATIO + 1 ) % GRAPHLEN ];
229
230 const float x = static_cast<float>( i % WAVERATIO ) / WAVERATIO;
231 const float x2 = x * x;
232 const float x3 = x * x * x;
233
234 _dst[i] = ( ( x3 * 2.0 - x2 * 3.0 + 1.0 ) * s1 ) +
235 ( ( x3 * -2.0 + x2 * 3.0 ) * s2 ) +
236 ( ( x3 - x2 * 2 + x ) * m1 ) +
237 ( ( x3 - x2 ) * m2 );
238 }
239 }*/
240
242
247
252
257
262
267
272
274
276
280
282
285
287
292
293 friend class WatsynObject;
294 friend class gui::WatsynView;
295};
296
297
298namespace gui
299{
300
301
303{
304 Q_OBJECT
305public:
306 WatsynView( Instrument * _instrument,
307 QWidget * _parent );
308 ~WatsynView() override = default;
309
310protected slots:
311 void updateLayout();
312
313 void sinWaveClicked();
314 void triWaveClicked();
315 void sawWaveClicked();
316 void sqrWaveClicked();
317
318 void smoothClicked();
319 void normalizeClicked();
320 void invertClicked();
321 void phaseLeftClicked();
322 void phaseRightClicked();
323 void loadClicked();
324
325private:
326 void modelChanged() override;
327
328// knobs
333
338
343
348
353
355
357
361
363
367
372
383
384};
385
386
387} // namespace gui
388
389} // namespace lmms
390
391#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:137
graphModel b2_graph
Definition Watsyn.h:271
FloatModel m_abmix
Definition Watsyn.h:273
void updateFreqB2()
Definition Watsyn.cpp:635
FloatModel a1_rtune
Definition Watsyn.h:263
void deleteNotePluginData(NotePlayHandle *_n) override
Definition Watsyn.cpp:466
graphModel a2_graph
Definition Watsyn.h:269
FloatModel b1_mult
Definition Watsyn.h:255
FloatModel a2_mult
Definition Watsyn.h:254
FloatModel b2_mult
Definition Watsyn.h:256
void updateFreqB1()
Definition Watsyn.cpp:627
IntModel m_selectedGraph
Definition Watsyn.h:286
WatsynInstrument(InstrumentTrack *_instrument_track)
Definition Watsyn.cpp:250
TempoSyncKnobModel m_envDec
Definition Watsyn.h:279
void updateVolumes()
Definition Watsyn.cpp:595
float B2_wave[WAVELEN]
Definition Watsyn.h:291
FloatModel a2_vol
Definition Watsyn.h:244
FloatModel a2_ltune
Definition Watsyn.h:259
void srccpy(float *_dst, float *_src)
Definition Watsyn.h:191
FloatModel b1_ltune
Definition Watsyn.h:260
FloatModel b1_vol
Definition Watsyn.h:245
~WatsynInstrument() override=default
float m_rfreq[NUM_OSCS]
Definition Watsyn.h:177
void updateWaveB2()
Definition Watsyn.cpp:664
float desiredReleaseTimeMs() const override
Definition Watsyn.h:154
FloatModel b1_rtune
Definition Watsyn.h:265
gui::PluginView * instantiateView(QWidget *_parent) override
Create a view for the model.
Definition Watsyn.cpp:589
FloatModel a2_pan
Definition Watsyn.h:249
void playNote(NotePlayHandle *_n, SampleFrame *_working_buffer) override
Definition Watsyn.cpp:344
FloatModel a1_vol
Definition Watsyn.h:243
FloatModel b2_pan
Definition Watsyn.h:251
float m_lfreq[NUM_OSCS]
Definition Watsyn.h:176
graphModel a1_graph
Definition Watsyn.h:268
void updateFreqA2()
Definition Watsyn.cpp:619
FloatModel b2_vol
Definition Watsyn.h:246
FloatModel m_envAmt
Definition Watsyn.h:275
void saveSettings(QDomDocument &_doc, QDomElement &_this) override
Definition Watsyn.cpp:472
FloatModel a1_ltune
Definition Watsyn.h:258
FloatModel b1_pan
Definition Watsyn.h:250
graphModel b1_graph
Definition Watsyn.h:270
float m_lvol[NUM_OSCS]
Definition Watsyn.h:173
FloatModel a1_pan
Definition Watsyn.h:248
float rightCh(float _vol, float _pan)
Definition Watsyn.h:185
float leftCh(float _vol, float _pan)
Definition Watsyn.h:180
void updateWaveA2()
Definition Watsyn.cpp:650
float B1_wave[WAVELEN]
Definition Watsyn.h:290
float m_rvol[NUM_OSCS]
Definition Watsyn.h:174
FloatModel b2_rtune
Definition Watsyn.h:266
float A2_wave[WAVELEN]
Definition Watsyn.h:289
FloatModel a1_mult
Definition Watsyn.h:253
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:283
TempoSyncKnobModel m_envHold
Definition Watsyn.h:278
QString nodeName() const override
Definition Watsyn.cpp:583
FloatModel m_xtalk
Definition Watsyn.h:281
FloatModel b2_ltune
Definition Watsyn.h:261
friend class WatsynObject
Definition Watsyn.h:293
FloatModel a2_rtune
Definition Watsyn.h:264
void updateFreqA1()
Definition Watsyn.cpp:611
TempoSyncKnobModel m_envAtt
Definition Watsyn.h:277
float A1_wave[WAVELEN]
Definition Watsyn.h:288
AudioResampler m_resampler
Definition Watsyn.h:241
IntModel m_bmod
Definition Watsyn.h:284
SampleFrame * abuf() const
Definition Watsyn.h:100
float m_B1wave[WAVELEN]
Definition Watsyn.h:132
float m_A1wave[WAVELEN]
Definition Watsyn.h:130
float m_B2wave[WAVELEN]
Definition Watsyn.h:133
f_cnt_t m_fpp
Definition Watsyn.h:120
SampleFrame * bbuf() const
Definition Watsyn.h:104
NotePlayHandle * m_nph
Definition Watsyn.h:118
int m_amod
Definition Watsyn.h:114
int m_bmod
Definition Watsyn.h:115
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:122
void renderOutput(f_cnt_t _frames)
Definition Watsyn.cpp:106
SampleFrame * m_abuf
Definition Watsyn.h:124
float m_A2wave[WAVELEN]
Definition Watsyn.h:131
float m_lphase[NUM_OSCS]
Definition Watsyn.h:127
float m_rphase[NUM_OSCS]
Definition Watsyn.h:128
const sample_rate_t m_samplerate
Definition Watsyn.h:117
sample_rate_t samplerate() const
Definition Watsyn.h:108
SampleFrame * m_bbuf
Definition Watsyn.h:125
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:303
Graph * b1_graph
Definition Watsyn.h:370
Knob * m_xtalkKnob
Definition Watsyn.h:362
Knob * b1_rtuneKnob
Definition Watsyn.h:351
AutomatableButtonGroup * m_selectedGraphGroup
Definition Watsyn.h:364
Knob * b1_ltuneKnob
Definition Watsyn.h:346
Knob * b2_multKnob
Definition Watsyn.h:342
Knob * a2_volKnob
Definition Watsyn.h:330
Knob * a1_rtuneKnob
Definition Watsyn.h:349
PixmapButton * m_sawWaveButton
Definition Watsyn.h:375
Knob * m_abmixKnob
Definition Watsyn.h:354
Graph * b2_graph
Definition Watsyn.h:371
void sqrWaveClicked()
Definition Watsyn.cpp:1057
Knob * a1_panKnob
Definition Watsyn.h:334
void sinWaveClicked()
Definition Watsyn.cpp:985
void sawWaveClicked()
Definition Watsyn.cpp:1033
PixmapButton * m_invertButton
Definition Watsyn.h:378
TempoSyncKnob * m_envHoldKnob
Definition Watsyn.h:359
Knob * b1_panKnob
Definition Watsyn.h:336
Graph * a1_graph
Definition Watsyn.h:368
PixmapButton * m_phaseRightButton
Definition Watsyn.h:381
Knob * a1_multKnob
Definition Watsyn.h:339
TempoSyncKnob * m_envDecKnob
Definition Watsyn.h:360
Knob * m_envAmtKnob
Definition Watsyn.h:356
Knob * b2_ltuneKnob
Definition Watsyn.h:347
void normalizeClicked()
Definition Watsyn.cpp:1081
Knob * b1_volKnob
Definition Watsyn.h:331
Knob * a1_volKnob
Definition Watsyn.h:329
AutomatableButtonGroup * m_aModGroup
Definition Watsyn.h:365
PixmapButton * m_loadButton
Definition Watsyn.h:382
void invertClicked()
Definition Watsyn.cpp:1105
PixmapButton * m_triWaveButton
Definition Watsyn.h:374
Knob * a2_ltuneKnob
Definition Watsyn.h:345
void smoothClicked()
Definition Watsyn.cpp:1129
Knob * a1_ltuneKnob
Definition Watsyn.h:344
PixmapButton * m_sinWaveButton
Definition Watsyn.h:373
PixmapButton * m_normalizeButton
Definition Watsyn.h:377
void updateLayout()
Definition Watsyn.cpp:952
void triWaveClicked()
Definition Watsyn.cpp:1009
void modelChanged() override
Definition Watsyn.cpp:1226
Knob * a2_multKnob
Definition Watsyn.h:340
void phaseRightClicked()
Definition Watsyn.cpp:1177
Knob * b1_multKnob
Definition Watsyn.h:341
WatsynView(Instrument *_instrument, QWidget *_parent)
Definition Watsyn.cpp:675
PixmapButton * m_phaseLeftButton
Definition Watsyn.h:380
Knob * a2_panKnob
Definition Watsyn.h:335
PixmapButton * m_sqrWaveButton
Definition Watsyn.h:376
Knob * b2_panKnob
Definition Watsyn.h:337
AutomatableButtonGroup * m_bModGroup
Definition Watsyn.h:366
Knob * b2_volKnob
Definition Watsyn.h:332
void phaseLeftClicked()
Definition Watsyn.cpp:1153
Knob * b2_rtuneKnob
Definition Watsyn.h:352
PixmapButton * m_smoothButton
Definition Watsyn.h:379
~WatsynView() override=default
Knob * a2_rtuneKnob
Definition Watsyn.h:350
Graph * a2_graph
Definition Watsyn.h:369
TempoSyncKnob * m_envAttKnob
Definition Watsyn.h:358
void loadClicked()
Definition Watsyn.cpp:1201
Definition AudioPortAudio.cpp:223
Definition AudioAlsa.cpp:35
const int WAVERATIO
Definition Watsyn.h:63
const int MOD_MIX
Definition Monstro.h:147
const int B2_OSC
Definition Watsyn.h:77
std::uint32_t sample_rate_t
Definition LmmsTypes.h:42
const int B1_OSC
Definition Watsyn.h:76
const int WAVELEN
Definition Watsyn.h:65
const int MOD_RM
Definition Watsyn.h:70
const int GRAPHLEN
Definition Watsyn.h:61
const int PMOD_AMT
Definition Watsyn.h:66
const int NUM_MODS
Definition Monstro.h:151
const int A2_OSC
Definition Watsyn.h:75
std::uint64_t f_cnt_t
Definition LmmsTypes.h:43
const int MOD_AM
Definition Monstro.h:148
const int NUM_OSCS
Definition Watsyn.h:78
const int MOD_PM
Definition Monstro.h:150
const int A1_OSC
Definition Watsyn.h:74
int result
Definition process.c:1455