LMMS
Loading...
Searching...
No Matches
Organic.h
Go to the documentation of this file.
1/*
2 * Organic.h - additive synthesizer for organ-like sounds
3 *
4 * Copyright (c) 2006-2015 Andreas Brandmaier <andy/at/brandmaier/dot/de>
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#ifndef LMMS_ORGANIC_H
26#define LMMS_ORGANIC_H
27
28#include <QString>
29
30#include "Instrument.h"
31#include "InstrumentView.h"
32#include "AutomatableModel.h"
33
34
35namespace lmms
36{
37
38
39class NotePlayHandle; // IWYU pragma: keep
40class Oscillator;
41
42namespace gui
43{
44class Knob;
45class PixmapButton;
47} // namespace gui
48
49const int NUM_OSCILLATORS = 8;
50const int NUM_HARMONICS = 18;
51const QString HARMONIC_NAMES[NUM_HARMONICS] = {
52 "Octave below",
53 "Fifth below",
54 "Fundamental",
55 "2nd harmonic",
56 "3rd harmonic",
57 "4th harmonic",
58 "5th harmonic",
59 "6th harmonic",
60 "7th harmonic",
61 "8th harmonic",
62 "9th harmonic",
63 "10th harmonic",
64 "11th harmonic",
65 "12th harmonic",
66 "13th harmonic",
67 "14th harmonic",
68 "15th harmonic",
69 "16th harmonic"
70 };
71
72const QString WAVEFORM_NAMES[6] = {
73 "Sine wave",
74 "Saw wave",
75 "Square wave",
76 "Triangle wave",
77 "Moog saw wave",
78 "Exponential wave"
79 };
80
81const float CENT = 1.0f / 1200.0f;
82
83class OscillatorObject : public Model
84{
85 Q_OBJECT
86private:
94
97 // normalized detuning -> x/sampleRate
100 // normalized offset -> x/360
103
104 OscillatorObject( Model * _parent, int _index );
105 ~OscillatorObject() override = default;
106
107 friend class OrganicInstrument;
109
110
111private slots:
112 void oscButtonChanged();
113 void updateVolume();
114 void updateDetuning();
115
116} ;
117
118
120{
121 Q_OBJECT
122public:
123 OrganicInstrument( InstrumentTrack * _instrument_track );
124 ~OrganicInstrument() override;
125
126 void playNote( NotePlayHandle * _n,
127 SampleFrame* _working_buffer ) override;
128 void deleteNotePluginData( NotePlayHandle * _n ) override;
129
130
131 void saveSettings(QDomDocument& doc, QDomElement& elem) override;
132 void loadSettings(const QDomElement& elem) override;
133
134 QString nodeName() const override;
135
136 static float * s_harmonics;
137
138public slots:
139 void randomiseSettings();
140
141
142private:
143 float inline waveshape(float in, float amount);
144
145
146 // fast atan, fast rather than accurate
147 inline float fastatan( float x )
148 {
149 return (x / (1.0 + 0.28 * (x * x)));
150 }
151
153
155
163
165
168
169 gui::PluginView* instantiateView( QWidget * _parent ) override;
170
171
172private slots:
173 void updateAllDetuning();
174
176} ;
177
178namespace gui
179{
180
181
183{
184 Q_OBJECT
185public:
186 OrganicInstrumentView( Instrument * _instrument, QWidget * _parent );
187 ~OrganicInstrumentView() override;
188
189private:
190 void modelChanged() override;
191
193 {
195 Knob * h,
196 Knob * v,
197 Knob * o,
198 Knob * p,
199 Knob * dt ) :
200 m_harmKnob( h ),
201 m_volKnob( v ),
202 m_oscKnob( o ),
203 m_panKnob( p ),
205 {
206 }
207 OscillatorKnobs() = default;
208
214 } ;
215
217
221
223
224
225protected slots:
226 void updateKnobHint();
227};
228
229
230} // namespace gui
231
232} // namespace lmms
233
234#endif // LMMS_ORGANIC_H
static float dt(char val)
Definition EnvelopeFreeEdit.cpp:124
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
Model(Model *parent, QString displayName=QString(), bool defaultConstructed=false)
Definition Model.cpp:30
Definition NotePlayHandle.h:48
OscillatorObject ** m_osc
Definition Organic.h:154
FloatModel m_fx1Model
Definition Organic.h:166
FloatModel m_volModel
Definition Organic.h:167
void updateAllDetuning()
Definition Organic.cpp:353
gui::PluginView * instantiateView(QWidget *_parent) override
Create a view for the model.
Definition Organic.cpp:362
float waveshape(float in, float amount)
Definition Organic.cpp:334
float fastatan(float x)
Definition Organic.h:147
void playNote(NotePlayHandle *_n, SampleFrame *_working_buffer) override
Definition Organic.cpp:223
QString nodeName() const override
Definition Organic.cpp:215
const IntModel m_modulationAlgo
Definition Organic.h:164
OrganicInstrument(InstrumentTrack *_instrument_track)
Definition Organic.cpp:74
static float * s_harmonics
Definition Organic.h:136
void loadSettings(const QDomElement &elem) override
Definition Organic.cpp:179
int m_numOscillators
Definition Organic.h:152
void saveSettings(QDomDocument &doc, QDomElement &elem) override
Definition Organic.cpp:159
void deleteNotePluginData(NotePlayHandle *_n) override
Definition Organic.cpp:311
~OrganicInstrument() override
Definition Organic.cpp:151
void randomiseSettings()
Definition Organic.cpp:341
Definition Oscillator.h:49
Definition Organic.h:84
void updateVolume()
Definition Organic.cpp:564
float m_phaseOffsetLeft
Definition Organic.h:101
FloatModel m_oscModel
Definition Organic.h:89
FloatModel m_volModel
Definition Organic.h:91
IntModel m_waveShape
Definition Organic.h:88
float m_phaseOffsetRight
Definition Organic.h:102
void updateDetuning()
Definition Organic.cpp:575
float m_volumeLeft
Definition Organic.h:95
friend class OrganicInstrument
Definition Organic.h:107
void oscButtonChanged()
Definition Organic.cpp:544
FloatModel m_harmModel
Definition Organic.h:90
float m_volumeRight
Definition Organic.h:96
FloatModel m_panModel
Definition Organic.h:92
float m_detuningRight
Definition Organic.h:99
OscillatorObject(Model *_parent, int _index)
Definition Organic.cpp:525
float m_detuningLeft
Definition Organic.h:98
FloatModel m_detuneModel
Definition Organic.h:93
int m_numOscillators
Definition Organic.h:87
~OscillatorObject() override=default
Definition SampleFrame.h:41
Instrument view with fixed LMMS-default size.
Definition InstrumentView.h:66
Definition Knob.h:47
Definition Organic.h:183
void modelChanged() override
Definition Organic.cpp:433
OscillatorKnobs * m_oscKnobs
Definition Organic.h:216
Knob * m_fx1Knob
Definition Organic.h:218
void updateKnobHint()
Definition Organic.cpp:506
OrganicInstrumentView(Instrument *_instrument, QWidget *_parent)
Definition Organic.cpp:384
~OrganicInstrumentView() override
Definition Organic.cpp:427
int m_numOscillators
Definition Organic.h:222
PixmapButton * m_randBtn
Definition Organic.h:220
Knob * m_volKnob
Definition Organic.h:219
Definition PixmapButton.h:37
Definition PluginView.h:36
unsigned v[N_MAX]
Definition inflate.c:1584
unsigned x[BMAX+1]
Definition inflate.c:1586
float in
Definition lilv_test.c:1460
Definition AudioPortAudio.cpp:223
Definition AudioAlsa.cpp:35
const QString WAVEFORM_NAMES[6]
Definition Organic.h:72
const float CENT
Definition Organic.h:81
const int NUM_HARMONICS
Definition Organic.h:50
const int NUM_OSCILLATORS
Definition Organic.h:49
const QString HARMONIC_NAMES[NUM_HARMONICS]
Definition Organic.h:51
Definition Organic.h:157
float phaseOffsetLeft[NUM_OSCILLATORS]
Definition Organic.h:160
Oscillator * oscLeft
Definition Organic.h:158
Oscillator * oscRight
Definition Organic.h:159
float phaseOffsetRight[NUM_OSCILLATORS]
Definition Organic.h:161
Knob * m_oscKnob
Definition Organic.h:211
Knob * m_volKnob
Definition Organic.h:210
Knob * m_harmKnob
Definition Organic.h:209
Knob * m_detuneKnob
Definition Organic.h:213
OscillatorKnobs(Knob *h, Knob *v, Knob *o, Knob *p, Knob *dt)
Definition Organic.h:194
Knob * m_panKnob
Definition Organic.h:212
uch * p
Definition crypt.c:594
uch h[RAND_HEAD_LEN]
Definition crypt.c:459