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