1 /* B.Harvestr
2  * LV2 Plugin
3  *
4  * Copyright (C) 2018, 2019 by Sven Jähnichen
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3, or (at your option)
9  * any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20 
21 #ifndef BHARVESTR_HPP_
22 #define BHARVESTR_HPP_
23 
24 #define CONTROLLER_CHANGED(con) ((new_controllers[con]) ? (controllers[con] != *(new_controllers[con])) : false)
25 
26 #include <cmath>
27 #include <climits>
28 #include <cstdlib>
29 #include <cstdio>
30 #include <string>
31 #include <vector>
32 #include <array>
33 #include <lv2/lv2plug.in/ns/lv2core/lv2.h>
34 #include <lv2/lv2plug.in/ns/ext/atom/atom.h>
35 #include <lv2/lv2plug.in/ns/ext/atom/util.h>
36 #include <lv2/lv2plug.in/ns/ext/atom/forge.h>
37 #include <lv2/lv2plug.in/ns/ext/urid/urid.h>
38 #include <lv2/lv2plug.in/ns/ext/midi/midi.h>
39 #include <lv2/lv2plug.in/ns/ext/state/state.h>
40 #include "lv2/lv2plug.in/ns/ext/worker/worker.h"
41 #include "LV2_Atom_Ptr.h"
42 #include "definitions.h"
43 #include "Ports.hpp"
44 #include "Urids.hpp"
45 #include "Limit.hpp"
46 #include "LFO.hpp"
47 #include "Sequencer.hpp"
48 #include "Envelope.hpp"
49 #include "Shape.hpp"
50 #include "Sample.hpp"
51 #include "Voice.hpp"
52 #include "Pattern.hpp"
53 #include "StaticArrayList.hpp"
54 #include "PresetInfo.hpp"
55 
56 class BHarvestr
57 {
58 public:
59 	BHarvestr (double samplerate, const LV2_Feature* const* features);
60 	void connect_port(uint32_t port, void *data);
61 	void activate();
62 	void run(uint32_t n_samples);
63 	void deactivate();
64 	LV2_State_Status state_save(LV2_State_Store_Function store, LV2_State_Handle handle, uint32_t flags, const LV2_Feature* const* features);
65 	LV2_State_Status state_restore(LV2_State_Retrieve_Function retrieve, LV2_State_Handle handle, uint32_t flags, const LV2_Feature* const* features);
66 	LV2_Worker_Status work (LV2_Worker_Respond_Function respond, LV2_Worker_Respond_Handle handle, uint32_t size, const void* data);
67 	LV2_Worker_Status work_response (uint32_t size, const void* data);
68 
69 private:
70 	Sample* loadSample (const char* path);
71 	void installSample (Sample* s);
72 	void noteOn (const uint8_t note, const uint8_t velocity, const uint64_t frame);
73 	void noteOff (const uint8_t note, const uint64_t frame);
74 	void allSoundsOff (const uint64_t frame);
75 	void allNotesOff (const uint64_t frame);
76 	void play (const int start, const int end);
77 	double getModulation (const Voice* voiceptr, const int property, const uint64_t frame) const;
78 	LV2_Atom_Forge_Ref forgeSamplePath (LV2_Atom_Forge* forge, LV2_Atom_Forge_Frame* frame, const char* path);
79 	void notifyStatusToGui();
80 	void notifySampleStopToGui();
81 	void notifySelectionStopToGui();
82 	void notifyPatternToGui ();
83 	void notifySamplePathToGui ();
84 	void notifyDisplayToGui ();
85 	void notifyShapeToGui (ShapeIndex index);
86 	void notifyPresetInfoToGui ();
87 	void notifyMessageToGui();
88 
89 	// URIs
90 	BHarvestrURIs uris;
91 	LV2_URID_Map* map;
92 	LV2_URID_Unmap* unmap;
93 
94 	LV2_Worker_Schedule* workerSchedule;
95 
96 	// Control ports: MIDI, DSP <-> GUI communication
97 	const LV2_Atom_Sequence* controlPort;
98 	LV2_Atom_Sequence* notifyPort;
99 
100 	// Audio ports
101 	float* audioOutput1;
102 	float* audioOutput2;
103 
104 	LV2_Atom_Forge notifyForge;
105 	LV2_Atom_Forge_Frame notifyFrame;
106 
107 	// Controllers
108 	float* new_controllers [MAXCONTROLLERS];
109 	float controllers [MAXCONTROLLERS];
110 	const Limit controllerLimits [MAXCONTROLLERS] =
111 	{
112 		{1, 16, 1},		// MAX_VOICES
113 		{1, 63, 1},		// MAX_GRAINS_PER_VOICE
114 		{0, 1, 0},		// SAMPLE_START
115 		{0, 1, 0},		// SAMPLE_END
116 		{10, 20000, 0},		// SAMPLE_FREQ
117 		{0.01, 8.0, 0},		// PATTERN_SIZE
118 		{0, 4, 1},		// PATTERN_TYPE
119 		{1.0, 1000.0, 0},	// GRAIN_SIZE + PROPERTY_VALUE_START
120 		{1.0, 1000.0, 0},	// GRAIN_SIZE + PROPERTY_VALUE_END
121 		{0, 16, 1},		// GRAIN_SIZE + PROPERTY_MODULATORS
122 		{0, 16, 1},		// GRAIN_SIZE + PROPERTY_MODULATORS + 1
123 		{0, 16, 1},		// GRAIN_SIZE + PROPERTY_MODULATORS + 2
124 		{0, 16, 1},		// GRAIN_SIZE + PROPERTY_MODULATORS + 3
125 		{0.1, 100.0, 0},	// GRAIN_RATE + PROPERTY_VALUE_START
126 		{0.1, 100.0, 0},	// GRAIN_RATE + PROPERTY_VALUE_END
127 		{0, 16, 1},		// GRAIN_RATE + PROPERTY_MODULATORS
128 		{0, 16, 1},		// GRAIN_RATE + PROPERTY_MODULATORS + 1
129 		{0, 16, 1},		// GRAIN_RATE + PROPERTY_MODULATORS + 2
130 		{0, 16, 1},		// GRAIN_RATE + PROPERTY_MODULATORS + 3
131 		{-1.0, 1.0, 0},		// GRAIN_PHASE + PROPERTY_VALUE_START
132 		{-1.0, 1.0, 0},		// GRAIN_PHASE + PROPERTY_VALUE_END
133 		{0, 16, 1},		// GRAIN_PHASE + PROPERTY_MODULATORS
134 		{0, 16, 1},		// GRAIN_PHASE + PROPERTY_MODULATORS + 1
135 		{0, 16, 1},		// GRAIN_PHASE + PROPERTY_MODULATORS + 2
136 		{0, 16, 1},		// GRAIN_PHASE + PROPERTY_MODULATORS + 3
137 		{-1.0, 1.0, 0},		// GRAIN_DRIVE + PROPERTY_VALUE_START
138 		{-1.0, 1.0, 0},		// GRAIN_DRIVE + PROPERTY_VALUE_END
139 		{0, 16, 1},		// GRAIN_DRIVE + PROPERTY_MODULATORS
140 		{0, 16, 1},		// GRAIN_DRIVE + PROPERTY_MODULATORS + 1
141 		{0, 16, 1},		// GRAIN_DRIVE + PROPERTY_MODULATORS + 2
142 		{0, 16, 1},		// GRAIN_DRIVE + PROPERTY_MODULATORS + 3
143 		{0.0, 2.0, 0},		// GRAIN_LEVEL + PROPERTY_VALUE_START
144 		{0.0, 2.0, 0},		// GRAIN_LEVEL + PROPERTY_VALUE_END
145 		{0, 16, 1},		// GRAIN_LEVEL + PROPERTY_MODULATORS
146 		{0, 16, 1},		// GRAIN_LEVEL + PROPERTY_MODULATORS + 1
147 		{0, 16, 1},		// GRAIN_LEVEL + PROPERTY_MODULATORS + 2
148 		{0, 16, 1},		// GRAIN_LEVEL + PROPERTY_MODULATORS + 3
149 		{-1.0, 1.0, 0},		// GRAIN_PAN + PROPERTY_VALUE_START
150 		{-1.0, 1.0, 0},		// GRAIN_PAN + PROPERTY_VALUE_END
151 		{0, 16, 1},		// GRAIN_PAN + PROPERTY_MODULATORS
152 		{0, 16, 1},		// GRAIN_PAN + PROPERTY_MODULATORS + 1
153 		{0, 16, 1},		// GRAIN_PAN + PROPERTY_MODULATORS + 2
154 		{0, 16, 1},		// GRAIN_PAN + PROPERTY_MODULATORS + 3
155 		{-12.0, 12.0, 1},	// GRAIN_TUNE + PROPERTY_VALUE_START
156 		{-12.0, 12.0, 1},	// GRAIN_TUNE + PROPERTY_VALUE_END
157 		{0, 16, 1},		// GRAIN_TUNE + PROPERTY_MODULATORS
158 		{0, 16, 1},		// GRAIN_TUNE + PROPERTY_MODULATORS + 1
159 		{0, 16, 1},		// GRAIN_TUNE + PROPERTY_MODULATORS + 2
160 		{0, 16, 1},		// GRAIN_TUNE + PROPERTY_MODULATORS + 3
161 		{-100.0, 100.0, 0},	// GRAIN_FINE + PROPERTY_VALUE_START
162 		{-100.0, 100.0, 0},	// GRAIN_FINE + PROPERTY_VALUE_END
163 		{0, 16, 1},		// GRAIN_FINE + PROPERTY_MODULATORS
164 		{0, 16, 1},		// GRAIN_FINE + PROPERTY_MODULATORS + 1
165 		{0, 16, 1},		// GRAIN_FINE + PROPERTY_MODULATORS + 2
166 		{0, 16, 1},		// GRAIN_FINE + PROPERTY_MODULATORS + 3
167 		{0, 7, 1},		// GRAIN_SHAPE
168 		{0, 13, 1},		// LFO_TYPE
169 		{0.1, 10.0, 0},		// LFO_FREQ
170 		{-1.0, 1.0, 0},		// LFO_PHASE
171 		{0.0, 1.0, 0},		// LFO_AMP
172 		{0, 13, 1},		// LFO_TYPE
173 		{0.1, 10.0, 0},		// LFO_FREQ
174 		{-1.0, 1.0, 0},		// LFO_PHASE
175 		{0.0, 1.0, 0},		// LFO_AMP
176 		{0, 13, 1},		// LFO_TYPE
177 		{0.1, 10.0, 0},		// LFO_FREQ
178 		{-1.0, 1.0, 0},		// LFO_PHASE
179 		{0.0, 1.0, 0},		// LFO_AMP
180 		{0, 13, 1},		// LFO_TYPE
181 		{0.1, 10.0, 0},		// LFO_FREQ
182 		{-1.0, 1.0, 0},		// LFO_PHASE
183 		{0.0, 1.0, 0},		// LFO_AMP
184 		{1, 16, 1},		// SEQ_SIZE
185 		{0.1, 10.0, 0},		// SEQ_FREQ
186 		{-1.0, 1.0, 0},		// SEQ_PHASE
187 		{0.0, 1.0, 0},		// SEQ_STEP
188 		{0.0, 1.0, 0},		// SEQ_STEP + 1
189 		{0.0, 1.0, 0},		// SEQ_STEP + 2
190 		{0.0, 1.0, 0},		// SEQ_STEP + 3
191 		{0.0, 1.0, 0},		// SEQ_STEP + 4
192 		{0.0, 1.0, 0},		// SEQ_STEP + 5
193 		{0.0, 1.0, 0},		// SEQ_STEP + 6
194 		{0.0, 1.0, 0},		// SEQ_STEP + 7
195 		{0.0, 1.0, 0},		// SEQ_STEP + 8
196 		{0.0, 1.0, 0},		// SEQ_STEP + 9
197 		{0.0, 1.0, 0},		// SEQ_STEP + 10
198 		{0.0, 1.0, 0},		// SEQ_STEP + 11
199 		{0.0, 1.0, 0},		// SEQ_STEP + 12
200 		{0.0, 1.0, 0},		// SEQ_STEP + 13
201 		{0.0, 1.0, 0},		// SEQ_STEP + 14
202 		{0.0, 1.0, 0},		// SEQ_STEP + 15
203 		{1, 16, 1},		// SEQ_SIZE
204 		{0.1, 10.0, 0},		// SEQ_FREQ
205 		{-1.0, 1.0, 0},		// SEQ_PHASE
206 		{0.0, 1.0, 0},		// SEQ_STEP
207 		{0.0, 1.0, 0},		// SEQ_STEP + 1
208 		{0.0, 1.0, 0},		// SEQ_STEP + 2
209 		{0.0, 1.0, 0},		// SEQ_STEP + 3
210 		{0.0, 1.0, 0},		// SEQ_STEP + 4
211 		{0.0, 1.0, 0},		// SEQ_STEP + 5
212 		{0.0, 1.0, 0},		// SEQ_STEP + 6
213 		{0.0, 1.0, 0},		// SEQ_STEP + 7
214 		{0.0, 1.0, 0},		// SEQ_STEP + 8
215 		{0.0, 1.0, 0},		// SEQ_STEP + 9
216 		{0.0, 1.0, 0},		// SEQ_STEP + 10
217 		{0.0, 1.0, 0},		// SEQ_STEP + 11
218 		{0.0, 1.0, 0},		// SEQ_STEP + 12
219 		{0.0, 1.0, 0},		// SEQ_STEP + 13
220 		{0.0, 1.0, 0},		// SEQ_STEP + 14
221 		{0.0, 1.0, 0},		// SEQ_STEP + 15
222 		{1, 16, 1},		// SEQ_SIZE
223 		{0.1, 10.0, 0},		// SEQ_FREQ
224 		{-1.0, 1.0, 0},		// SEQ_PHASE
225 		{0.0, 1.0, 0},		// SEQ_STEP
226 		{0.0, 1.0, 0},		// SEQ_STEP + 1
227 		{0.0, 1.0, 0},		// SEQ_STEP + 2
228 		{0.0, 1.0, 0},		// SEQ_STEP + 3
229 		{0.0, 1.0, 0},		// SEQ_STEP + 4
230 		{0.0, 1.0, 0},		// SEQ_STEP + 5
231 		{0.0, 1.0, 0},		// SEQ_STEP + 6
232 		{0.0, 1.0, 0},		// SEQ_STEP + 7
233 		{0.0, 1.0, 0},		// SEQ_STEP + 8
234 		{0.0, 1.0, 0},		// SEQ_STEP + 9
235 		{0.0, 1.0, 0},		// SEQ_STEP + 10
236 		{0.0, 1.0, 0},		// SEQ_STEP + 11
237 		{0.0, 1.0, 0},		// SEQ_STEP + 12
238 		{0.0, 1.0, 0},		// SEQ_STEP + 13
239 		{0.0, 1.0, 0},		// SEQ_STEP + 14
240 		{0.0, 1.0, 0},		// SEQ_STEP + 15
241 		{1, 16, 1},		// SEQ_SIZE
242 		{0.1, 10.0, 0},		// SEQ_FREQ
243 		{-1.0, 1.0, 0},		// SEQ_PHASE
244 		{0.0, 1.0, 0},		// SEQ_STEP
245 		{0.0, 1.0, 0},		// SEQ_STEP + 1
246 		{0.0, 1.0, 0},		// SEQ_STEP + 2
247 		{0.0, 1.0, 0},		// SEQ_STEP + 3
248 		{0.0, 1.0, 0},		// SEQ_STEP + 4
249 		{0.0, 1.0, 0},		// SEQ_STEP + 5
250 		{0.0, 1.0, 0},		// SEQ_STEP + 6
251 		{0.0, 1.0, 0},		// SEQ_STEP + 7
252 		{0.0, 1.0, 0},		// SEQ_STEP + 8
253 		{0.0, 1.0, 0},		// SEQ_STEP + 9
254 		{0.0, 1.0, 0},		// SEQ_STEP + 10
255 		{0.0, 1.0, 0},		// SEQ_STEP + 11
256 		{0.0, 1.0, 0},		// SEQ_STEP + 12
257 		{0.0, 1.0, 0},		// SEQ_STEP + 13
258 		{0.0, 1.0, 0},		// SEQ_STEP + 14
259 		{0.0, 1.0, 0},		// SEQ_STEP + 15
260 		{0.0, 1.0, 0},		// RND_MIN
261 		{0.0, 1.0, 0},		// RND_MAX
262 		{0.0, 1.0, 0},		// RND_MIN
263 		{0.0, 1.0, 0},		// RND_MAX
264 		{0.0, 1.0, 0},		// RND_MIN
265 		{0.0, 1.0, 0},		// RND_MAX
266 		{0.0, 1.0, 0},		// RND_MIN
267 		{0.0, 1.0, 0},		// RND_MAX
268 		{0.0, 4.0, 0},		// ENV_ATTACK
269 		{0.0, 4.0, 0},		// ENV_DECAY
270 		{0.0, 1.0, 0},		// ENV_SUSTAIN
271 		{0.0, 4.0, 0},		// ENV_RELEASE
272 		{0.0, 4.0, 0},		// ENV_ATTACK
273 		{0.0, 4.0, 0},		// ENV_DECAY
274 		{0.0, 1.0, 0},		// ENV_SUSTAIN
275 		{0.0, 4.0, 0},		// ENV_RELEASE
276 		{0.0, 4.0, 0},		// ENV_ATTACK
277 		{0.0, 4.0, 0},		// ENV_DECAY
278 		{0.0, 1.0, 0},		// ENV_SUSTAIN
279 		{0.0, 4.0, 0},		// ENV_RELEASE
280 		{0.0, 4.0, 0},		// ENV_ATTACK
281 		{0.0, 4.0, 0},		// ENV_DECAY
282 		{0.0, 1.0, 0},		// ENV_SUSTAIN
283 		{0.0, 4.0, 0},		// ENV_RELEASE
284 		{0, 2, 0},		// SYNTH_LEVEL + PROPERTY_VALUE_START
285 		{0, 2, 0},		// SYNTH_LEVEL + PROPERTY_VALUE_END
286 		{1, 4, 1},		// SYNTH_LEVEL + PROPERTY_MODULATORS
287 		{0, 16, 1},		// SYNTH_LEVEL + PROPERTY_MODULATORS + 1
288 		{0, 16, 1},		// SYNTH_LEVEL + PROPERTY_MODULATORS + 2
289 		{0, 16, 1}		// SYNTH_LEVEL + PROPERTY_MODULATORS + 3
290 	};
291 
292 	// Pattern
293 	Pattern pattern;
294 
295 	// Sample
296 	Sample* sample;
297 
298 	// Voices
299 	StaticArrayList<Voice, MAXVOICES> voices;
300 
301 	Lfo lfo[NR_LFOS];
302 	Sequencer<NR_SEQ_STEPS> seq[NR_SEQS];
303 	Shape<MAXNODES> shape[MAXSHAPES];
304 	PresetInfo presetInfo;
305 
306 	// Host communicated data
307 	double rate;
308 
309 	// Position data
310 	uint64_t frame;
311 	uint64_t sampleFrame;
312 	uint64_t sampleSelectionFrame;
313 
314 	// Internals
315 	struct Notify
316 	{
317 		bool sampleStop;
318 		bool selectionStop;
319 		bool pattern;
320 		bool sampleDisplay;
321 		bool selectionDisplay;
322 		bool samplePath;
323 		bool shape [USER_SHAPES + NR_USER_SHAPES];
324 		bool presetInfo;
325 		bool message;
326 	};
327 
328 	bool ui_on;
329 	bool activated;
330 	Notify notify;
331 	char message[256];
332 };
333 
334 #endif /* BHARVESTR_HPP_ */
335