Vital
Loading...
Searching...
No Matches
operators.h
Go to the documentation of this file.
1#pragma once
2
3#include "futils.h"
4#include "processor.h"
5#include "utils.h"
6
7namespace vital {
8
16 class Operator : public Processor {
17 public:
24 Operator(int num_inputs, int num_outputs, bool control_rate = false)
25 : Processor(num_inputs, num_outputs, control_rate) {
26 externally_enabled_ = true;
27 Processor::enable(false);
28 }
29
35 return connectedInputs() > 0;
36 }
37
41 void setEnabled() {
42 bool will_enable = hasEnoughInputs() && externally_enabled_;
43 Processor::enable(will_enable);
44 if (!will_enable) {
45 // If not enabled, clear output buffer and perform a minimal process.
46 for (int i = 0; i < numOutputs(); ++i)
47 output(i)->clearBuffer();
48 process(1);
49 }
50 }
51
55 void numInputsChanged() override {
57 setEnabled();
58 }
59
64 void enable(bool enable) override {
65 externally_enabled_ = enable;
66 setEnabled();
67 }
68
73 virtual bool hasState() const override { return false; }
74
75 private:
79 Operator() : Processor(0, 0), externally_enabled_(false) { }
80
81 bool externally_enabled_;
82
83 JUCE_LEAK_DETECTOR(Operator)
84 };
85
90 class Clamp : public Operator {
91 public:
97 Clamp(mono_float min = -1, mono_float max = 1)
98 : Operator(1, 1), min_(min), max_(max) { }
99
100 virtual Processor* clone() const override { return new Clamp(*this); }
101
106 void process(int num_samples) override;
107
108 private:
109 mono_float min_, max_;
110
111 JUCE_LEAK_DETECTOR(Clamp)
112 };
113
118 class Negate : public Operator {
119 public:
120 Negate() : Operator(1, 1) { }
121
122 virtual Processor* clone() const override { return new Negate(*this); }
123
128 void process(int num_samples) override;
129
130 private:
131 JUCE_LEAK_DETECTOR(Negate)
132 };
133
140 class Inverse : public Operator {
141 public:
142 Inverse() : Operator(1, 1) { }
143
144 virtual Processor* clone() const override { return new Inverse(*this); }
145
150 void process(int num_samples) override;
151
152 private:
153 JUCE_LEAK_DETECTOR(Inverse)
154 };
155
160 class LinearScale : public Operator {
161 public:
166 LinearScale(mono_float scale = 1.0f) : Operator(1, 1), scale_(scale) { }
167
168 virtual Processor* clone() const override { return new LinearScale(*this); }
169
174 void process(int num_samples) override;
175
176 private:
177 mono_float scale_;
178
179 JUCE_LEAK_DETECTOR(LinearScale)
180 };
181
186 class Square : public Operator {
187 public:
188 Square() : Operator(1, 1) { }
189 virtual Processor* clone() const override { return new Square(*this); }
190
195 void process(int num_samples) override;
196
197 private:
198 JUCE_LEAK_DETECTOR(Square)
199 };
200
205 class Add : public Operator {
206 public:
207 Add() : Operator(2, 1) { }
208
209 virtual Processor* clone() const override { return new Add(*this); }
210
215 void process(int num_samples) override;
216
217 private:
218 JUCE_LEAK_DETECTOR(Add)
219 };
220
228 class VariableAdd : public Operator {
229 public:
234 VariableAdd(int num_inputs = 0) : Operator(num_inputs, 1) { }
235
236 virtual Processor* clone() const override {
237 return new VariableAdd(*this);
238 }
239
244 void process(int num_samples) override;
245
246 private:
247 JUCE_LEAK_DETECTOR(VariableAdd)
248 };
249
256 class ModulationSum : public Operator {
257 public:
258 enum {
261 };
262
267 ModulationSum(int num_inputs = 0)
268 : Operator(num_inputs + kNumStaticInputs, 1) {
270 }
271
272 virtual Processor* clone() const override {
273 return new ModulationSum(*this);
274 }
275
280 void process(int num_samples) override;
281
286 virtual bool hasState() const override { return true; }
287
288 private:
289 poly_float control_value_;
290
291 JUCE_LEAK_DETECTOR(ModulationSum)
292 };
293
298 class Subtract : public Operator {
299 public:
300 Subtract() : Operator(2, 1) { }
301
302 virtual Processor* clone() const override { return new Subtract(*this); }
303
308 void process(int num_samples) override;
309
310 private:
311 JUCE_LEAK_DETECTOR(Subtract)
312 };
313
318 class Multiply : public Operator {
319 public:
320 Multiply() : Operator(2, 1) { }
321
322 virtual ~Multiply() { }
323
324 virtual Processor* clone() const override { return new Multiply(*this); }
325
330 void process(int num_samples) override;
331
332 private:
333 JUCE_LEAK_DETECTOR(Multiply)
334 };
335
342 class SmoothMultiply : public Operator {
343 public:
344 enum {
349 };
350
352 virtual ~SmoothMultiply() { }
353
354 virtual Processor* clone() const override { return new SmoothMultiply(*this); }
355
360 bool hasState() const override { return true; }
361
366 virtual void process(int num_samples) override;
367
368 protected:
374 void processMultiply(int num_samples, poly_float multiply);
375
377
378 private:
379 JUCE_LEAK_DETECTOR(SmoothMultiply)
380 };
381
389 public:
390 static constexpr int kDb = kControlRate;
391 static constexpr mono_float kMinDb = -80.0f;
392 static constexpr mono_float kDefaultMaxDb = 12.2f;
393
398 SmoothVolume(mono_float max_db = kDefaultMaxDb) : SmoothMultiply(), max_db_(max_db) { }
399 virtual ~SmoothVolume() { }
400
401 virtual Processor* clone() const override { return new SmoothVolume(*this); }
402
407 void process(int num_samples) override;
408
409 private:
410 mono_float max_db_;
411
412 JUCE_LEAK_DETECTOR(SmoothVolume)
413 };
414
419 class Interpolate : public Operator {
420 public:
421 enum {
427 };
428
430
431 virtual Processor* clone() const override { return new Interpolate(*this); }
432
437 void process(int num_samples) override;
438
439 private:
440 poly_float fraction_;
441
442 JUCE_LEAK_DETECTOR(Interpolate)
443 };
444
452 public:
453 enum {
461 };
462
466 static const int kPositionStart = kTopLeft;
467
469
470 virtual Processor* clone() const override {
471 return new BilinearInterpolate(*this);
472 }
473
478 void process(int num_samples) override;
479
480 private:
481 JUCE_LEAK_DETECTOR(BilinearInterpolate)
482 };
483
489 public:
491
492 virtual Processor* clone() const override {
493 return new SampleAndHoldBuffer(*this);
494 }
495
500 void process(int num_samples) override;
501
502 private:
503 JUCE_LEAK_DETECTOR(SampleAndHoldBuffer)
504 };
505
512 class StereoEncoder : public Operator {
513 public:
514 enum {
519 };
520
521 enum {
525 };
526
531 StereoEncoder(bool decoding = false) : Operator(kNumInputs, 1), cos_mult_(0.0f), sin_mult_(0.0f) {
532 decoding_mult_ = 1.0f;
533 if (decoding)
534 decoding_mult_ = -1.0f;
535 }
536
537 virtual Processor* clone() const override {
538 return new StereoEncoder(*this);
539 }
540
545 void process(int num_samples) override;
546
551 bool hasState() const override { return true; }
552
553 protected:
558 void processRotate(int num_samples);
559
564 void processCenter(int num_samples);
565
569
570 private:
571 JUCE_LEAK_DETECTOR(StereoEncoder)
572 };
573
580 class TempoChooser : public Operator {
581 public:
582 enum {
589 };
590
591 enum {
600 };
601
606
607 virtual Processor* clone() const override {
608 return new TempoChooser(*this);
609 }
610
615 void process(int num_samples) override;
616
617 private:
618 JUCE_LEAK_DETECTOR(TempoChooser)
619 };
620
621 //-----------------------------------------------------------------------------------------------
622 // The following classes are within the 'cr' namespace, indicating control-rate operators
623 // that typically process a single sample rather than an entire audio block.
624 //-----------------------------------------------------------------------------------------------
625 namespace cr {
626
631 class Clamp : public Operator {
632 public:
638 Clamp(mono_float min = -1, mono_float max = 1)
639 : Operator(1, 1, true), min_(min), max_(max) { }
640
641 virtual Processor* clone() const override { return new Clamp(*this); }
642
647 void process(int num_samples) override {
648 output()->buffer[0] = utils::clamp(input()->at(0), min_, max_);
649 }
650
651 private:
652 mono_float min_, max_;
653 JUCE_LEAK_DETECTOR(Clamp)
654 };
655
660 class LowerBound : public Operator {
661 public:
662 LowerBound(mono_float min = 0.0f) : Operator(1, 1, true), min_(min) { }
663
664 virtual Processor* clone() const override { return new LowerBound(*this); }
665
666 void process(int num_samples) override {
667 output()->buffer[0] = utils::max(input()->at(0), min_);
668 }
669
670 private:
671 mono_float min_;
672
673 JUCE_LEAK_DETECTOR(LowerBound)
674 };
675
680 class UpperBound : public Operator {
681 public:
682 UpperBound(mono_float max = 0.0f) : Operator(1, 1, true), max_(max) { }
683
684 virtual Processor* clone() const override { return new UpperBound(*this); }
685
686 void process(int num_samples) override {
687 output()->buffer[0] = utils::min(input()->at(0), max_);
688 }
689
690 private:
691 mono_float max_;
692
693 JUCE_LEAK_DETECTOR(UpperBound)
694 };
695
700 class Add : public Operator {
701 public:
702 Add() : Operator(2, 1, true) {
703 }
704
705 virtual Processor* clone() const override { return new Add(*this); }
706
707 void process(int num_samples) override {
708 output()->buffer[0] = input(0)->at(0) + input(1)->at(0);
709 }
710
711 private:
712 JUCE_LEAK_DETECTOR(Add)
713 };
714
719 class Multiply : public Operator {
720 public:
721 Multiply() : Operator(2, 1, true) {
722 }
723
724 virtual ~Multiply() { }
725
726 virtual Processor* clone() const override { return new Multiply(*this); }
727
728 void process(int num_samples) override {
729 output()->buffer[0] = input(0)->at(0) * input(1)->at(0);
730 }
731
732 private:
733 JUCE_LEAK_DETECTOR(Multiply)
734 };
735
740 class Interpolate : public Operator {
741 public:
742 enum {
747 };
748
750
751 virtual Processor* clone() const override { return new Interpolate(*this); }
752
753 void process(int num_samples) override {
754 poly_float from = input(kFrom)->at(0);
755 poly_float to = input(kTo)->at(0);
756 poly_float fraction = input(kFractional)->at(0);
757 output()->buffer[0] = utils::interpolate(from, to, fraction);
758 }
759
760 private:
761 JUCE_LEAK_DETECTOR(Interpolate)
762 };
763
768 class Square : public Operator {
769 public:
770 Square() : Operator(1, 1, true) { }
771 virtual Processor* clone() const override { return new Square(*this); }
772
773 void process(int num_samples) override {
774 poly_float value = utils::max(input()->at(0), 0.0f);
775 output()->buffer[0] = value * value;
776 }
777
778 private:
779 JUCE_LEAK_DETECTOR(Square)
780 };
781
786 class Cube : public Operator {
787 public:
788 Cube() : Operator(1, 1, true) { }
789 virtual Processor* clone() const override { return new Cube(*this); }
790
791 void process(int num_samples) override {
792 poly_float value = utils::max(input()->at(0), 0.0f);
793 output()->buffer[0] = value * value * value;
794 }
795
796 private:
797 JUCE_LEAK_DETECTOR(Cube)
798 };
799
804 class Quart : public Operator {
805 public:
806 Quart() : Operator(1, 1, true) { }
807 virtual Processor* clone() const override { return new Quart(*this); }
808
809 void process(int num_samples) override {
810 poly_float value = utils::max(input()->at(0), 0.0f);
811 value *= value;
812 output()->buffer[0] = value * value;
813 }
814
815 private:
816 JUCE_LEAK_DETECTOR(Quart)
817 };
818
823 class Quadratic : public Operator {
824 public:
826 : Operator(1, 1, true), offset_(offset) { }
827
828 virtual Processor* clone() const override { return new Quadratic(*this); }
829
830 void process(int num_samples) override {
831 poly_float value = utils::max(input()->at(0), 0.0f);
832 output()->buffer[0] = value * value + offset_;
833 }
834
835 private:
836 mono_float offset_;
837
838 JUCE_LEAK_DETECTOR(Quadratic)
839 };
840
845 class Cubic : public Operator {
846 public:
848 : Operator(1, 1, true), offset_(offset) { }
849
850 virtual Processor* clone() const override { return new Cubic(*this); }
851
852 void process(int num_samples) override {
853 poly_float value = utils::max(input()->at(0), 0.0f);
854 output()->buffer[0] = value * value * value + offset_;
855 }
856
857 private:
858 mono_float offset_;
859
860 JUCE_LEAK_DETECTOR(Cubic)
861 };
862
867 class Quartic : public Operator {
868 public:
870 : Operator(1, 1, true), offset_(offset) { }
871
872 virtual Processor* clone() const override { return new Quartic(*this); }
873
874 void process(int num_samples) override {
875 poly_float value = utils::max(input()->at(0), 0.0f);
876 value *= value;
877 output()->buffer[0] = value * value + offset_;
878 }
879
880 private:
881 mono_float offset_;
882
883 JUCE_LEAK_DETECTOR(Quartic)
884 };
885
890 class Root : public Operator {
891 public:
893 : Operator(1, 1, true), offset_(offset) { }
894
895 virtual Processor* clone() const override { return new Root(*this); }
896
897 void process(int num_samples) override {
898 poly_float value = utils::max(input()->at(0), 0.0f);
899 output()->buffer[0] = utils::sqrt(value) + offset_;
900 }
901
902 private:
903 mono_float offset_;
904
905 JUCE_LEAK_DETECTOR(Root)
906 };
907
912 class ExponentialScale : public Operator {
913 public:
920 ExponentialScale(mono_float min, mono_float max, mono_float scale = 1, mono_float offset = 0.0f)
921 : Operator(1, 1, true), min_(min), max_(max), scale_(scale), offset_(offset) { }
922
923 virtual Processor* clone() const override {
924 return new ExponentialScale(*this);
925 }
926
927 void process(int num_samples) override {
928 output()->buffer[0] = futils::pow(scale_, utils::clamp(input()->at(0), min_, max_));
929 }
930
931 private:
932 mono_float min_;
933 mono_float max_;
934 mono_float scale_;
935 mono_float offset_;
936
937 JUCE_LEAK_DETECTOR(ExponentialScale)
938 };
939
944 class VariableAdd : public Operator {
945 public:
946 VariableAdd(int num_inputs = 0) : Operator(num_inputs, 1, true) {
947 }
948
949 virtual Processor* clone() const override {
950 return new VariableAdd(*this);
951 }
952
953 void process(int num_samples) override {
954 int num_inputs = static_cast<int>(inputs_->size());
955 poly_float value = 0.0;
956
957 for (int in = 0; in < num_inputs; ++in)
958 value += input(in)->at(0);
959
960 output()->buffer[0] = value;
961 }
962
963 private:
964 JUCE_LEAK_DETECTOR(VariableAdd)
965 };
966
971 class FrequencyToPhase : public Operator {
972 public:
973 FrequencyToPhase() : Operator(1, 1, true) { }
974
975 virtual Processor* clone() const override {
976 return new FrequencyToPhase(*this);
977 }
978
979 void process(int num_samples) override {
980 output()->buffer[0] = input()->at(0) * (1.0f / getSampleRate());
981 }
982
983 private:
984 JUCE_LEAK_DETECTOR(FrequencyToPhase)
985 };
986
992 public:
993 FrequencyToSamples() : Operator(1, 1, true) { }
994
995 virtual Processor* clone() const override {
996 return new FrequencyToSamples(*this);
997 }
998
999 void process(int num_samples) override {
1000 output()->buffer[0] = poly_float(getSampleRate()) / input()->at(0);
1001 }
1002
1003 private:
1004 JUCE_LEAK_DETECTOR(FrequencyToSamples)
1005 };
1006
1011 class TimeToSamples : public Operator {
1012 public:
1013 TimeToSamples() : Operator(1, 1, true) { }
1014
1015 virtual Processor* clone() const override {
1016 return new TimeToSamples(*this);
1017 }
1018
1019 void process(int num_samples) override {
1020 output()->buffer[0] = input()->at(0) * getSampleRate();
1021 }
1022
1023 private:
1024 JUCE_LEAK_DETECTOR(TimeToSamples)
1025 };
1026
1031 class MagnitudeScale : public Operator {
1032 public:
1033 MagnitudeScale() : Operator(1, 1, true) { }
1034
1035 virtual Processor* clone() const override {
1036 return new MagnitudeScale(*this);
1037 }
1038
1039 void process(int num_samples) override {
1040 output()->buffer[0] = futils::dbToMagnitude(input()->at(0));
1041 }
1042
1043 private:
1044 JUCE_LEAK_DETECTOR(MagnitudeScale)
1045 };
1046
1051 class MidiScale : public Operator {
1052 public:
1053 MidiScale() : Operator(1, 1, true) { }
1054
1055 virtual Processor* clone() const override {
1056 return new MidiScale(*this);
1057 }
1058
1059 void process(int num_samples) override {
1061 }
1062
1063 private:
1064 JUCE_LEAK_DETECTOR(MidiScale)
1065 };
1066
1072 public:
1073 enum {
1082
1086 static const int kPositionStart = kTopLeft;
1087
1089
1090 virtual Processor* clone() const override {
1091 return new BilinearInterpolate(*this);
1092 }
1093
1098 void process(int num_samples) override {
1100 input(kTopRight)->at(0),
1101 input(kXPosition)->at(0));
1103 input(kBottomRight)->at(0),
1104 input(kXPosition)->at(0));
1105 output()->buffer[0] = utils::interpolate(top, bottom, input(kYPosition)->at(0));
1106 }
1107
1108 private:
1109 JUCE_LEAK_DETECTOR(BilinearInterpolate)
1110 };
1111
1112 } // namespace cr
1113} // namespace vital
Adds two input buffers sample-by-sample.
Definition operators.h:205
Add()
Definition operators.h:207
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:209
void process(int num_samples) override
Processes two input buffers and writes their sum to the output.
Definition operators.cpp:81
Performs bilinear interpolation among four corners (top-left, top-right, bottom-left,...
Definition operators.h:451
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:470
static const int kPositionStart
Index of the first corner input for convenience.
Definition operators.h:466
BilinearInterpolate()
Definition operators.h:468
@ kTopRight
Definition operators.h:455
@ kYPosition
Definition operators.h:459
@ kBottomRight
Definition operators.h:457
@ kBottomLeft
Definition operators.h:456
@ kXPosition
Definition operators.h:458
@ kNumInputs
Definition operators.h:460
@ kTopLeft
Definition operators.h:454
void process(int num_samples) override
Processes the corner values, interpolating horizontally and then vertically.
Definition operators.cpp:208
Clamps each sample to a specified [min, max] range.
Definition operators.h:90
void process(int num_samples) override
Processes the input buffer, clamping each sample between min_ and max_.
Definition operators.cpp:10
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:100
Clamp(mono_float min=-1, mono_float max=1)
Constructs a Clamp operator with the given min and max range.
Definition operators.h:97
Interpolates between two input buffers (From, To) based on a fractional value [0.....
Definition operators.h:419
void process(int num_samples) override
Processes two input buffers and interpolates them by a fractional control input.
Definition operators.cpp:176
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:431
Interpolate()
Definition operators.h:429
@ kReset
Definition operators.h:425
@ kNumInputs
Definition operators.h:426
@ kTo
Definition operators.h:423
@ kFrom
Definition operators.h:422
@ kFractional
Definition operators.h:424
Computes 1 / x for each sample.
Definition operators.h:140
Inverse()
Definition operators.h:142
void process(int num_samples) override
Processes the input buffer, storing the inverse of each sample.
Definition operators.cpp:38
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:144
Multiplies each sample by a fixed scale factor.
Definition operators.h:160
LinearScale(mono_float scale=1.0f)
Constructs a LinearScale operator with an initial scale factor.
Definition operators.h:166
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:168
void process(int num_samples) override
Processes each sample, multiplying by the scale factor.
Definition operators.cpp:52
A special sum operator that can accumulate control-rate and audio-rate modulation signals.
Definition operators.h:256
ModulationSum(int num_inputs=0)
Constructs a ModulationSum with optional dynamic inputs, plus static inputs (kNumStaticInputs).
Definition operators.h:267
void process(int num_samples) override
Processes control-rate inputs by smoothing them over the block, and adds audio-rate inputs sample by ...
Definition operators.cpp:270
virtual bool hasState() const override
Indicates that this operator has a small amount of state (the smoothed control value).
Definition operators.h:286
@ kNumStaticInputs
Definition operators.h:260
@ kReset
Definition operators.h:259
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:272
Multiplies two input buffers sample-by-sample.
Definition operators.h:318
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:324
Multiply()
Definition operators.h:320
virtual ~Multiply()
Definition operators.h:322
void process(int num_samples) override
Processes two inputs, storing the product of each sample pair.
Definition operators.cpp:113
Negates each sample (multiplies by -1).
Definition operators.h:118
void process(int num_samples) override
Processes the input buffer, negating each sample.
Definition operators.cpp:24
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:122
Negate()
Definition operators.h:120
Base class for operator nodes that perform arithmetic or other transformations in the processing grap...
Definition operators.h:16
void numInputsChanged() override
Called when the number of inputs changes (e.g., dynamically connected or disconnected).
Definition operators.h:55
Operator(int num_inputs, int num_outputs, bool control_rate=false)
Constructs an Operator with a specified number of inputs/outputs and control-rate setting.
Definition operators.h:24
virtual bool hasState() const override
Indicates whether this operator has internal state that must be preserved or reset.
Definition operators.h:73
void enable(bool enable) override
Enables or disables the Operator, storing the external enable state.
Definition operators.h:64
void setEnabled()
Updates this operator’s enabled state based on connected inputs and external status.
Definition operators.h:41
force_inline bool hasEnoughInputs()
Checks if this Operator has at least one connected input.
Definition operators.h:34
Base class for all signal-processing units in Vital.
Definition processor.h:212
force_inline int numOutputs() const
Returns the total number of Output pointers (owned or otherwise).
Definition processor.h:564
virtual void numInputsChanged()
Called when the number of inputs changes (e.g., new connections). Subclasses may override for dynamic...
Definition processor.h:501
force_inline Input * input(unsigned int index=0) const
Retrieves the Input pointer at a given index.
Definition processor.h:587
force_inline int getSampleRate() const
Retrieves the current (effective) sample rate.
Definition processor.h:326
std::shared_ptr< std::vector< Input * > > inputs_
All inputs, owned or external.
Definition processor.h:660
int connectedInputs()
Counts how many inputs are connected to a real source (not null_source_).
Definition processor.cpp:149
virtual void process(int num_samples)=0
Main processing function. Called by the ProcessorRouter.
force_inline Output * output(unsigned int index=0) const
Retrieves the Output pointer at a given index.
Definition processor.h:616
void setPluggingStart(int start)
Sets the position at which plugNext starts searching for an open input.
Definition processor.h:635
virtual void enable(bool enable)
Enables or disables this Processor.
Definition processor.h:318
Grabs the first sample from the input, then repeats it for all samples in the output.
Definition operators.h:488
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:492
void process(int num_samples) override
Processes the input buffer, outputting a constant value (first sample) for the entire block.
Definition operators.cpp:313
SampleAndHoldBuffer()
Definition operators.h:490
Multiplies an audio-rate input by a smoothly changing control-rate parameter over one block.
Definition operators.h:342
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:354
virtual void process(int num_samples) override
Processes the audio input, multiplying by a smoothed control-rate value.
Definition operators.cpp:129
SmoothMultiply()
Definition operators.h:351
@ kControlRate
Definition operators.h:346
@ kReset
Definition operators.h:347
@ kAudioRate
Definition operators.h:345
@ kNumInputs
Definition operators.h:348
void processMultiply(int num_samples, poly_float multiply)
Internal function to perform the per-sample smoothing of the multiplier and multiplication.
Definition operators.cpp:138
poly_float multiply_
Definition operators.h:376
bool hasState() const override
Indicates that this operator has internal state (the last multiplier).
Definition operators.h:360
virtual ~SmoothMultiply()
Definition operators.h:352
A specialized SmoothMultiply that interprets the control-rate input in dB for volume adjustments.
Definition operators.h:388
static constexpr mono_float kDefaultMaxDb
Definition operators.h:392
static constexpr mono_float kMinDb
Definition operators.h:391
void process(int num_samples) override
Processes volume in dB, smoothing across one audio block before multiplying the audio input.
Definition operators.cpp:161
SmoothVolume(mono_float max_db=kDefaultMaxDb)
Constructs a SmoothVolume operator with a specified maximum dB level.
Definition operators.h:398
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:401
virtual ~SmoothVolume()
Definition operators.h:399
static constexpr int kDb
Definition operators.h:390
Squares each sample (sample * sample).
Definition operators.h:186
void process(int num_samples) override
Processes the input buffer, squaring each sample.
Definition operators.cpp:66
Square()
Definition operators.h:188
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:189
Encodes or decodes a stereo signal by rotating or centering the phase of the left and right channels.
Definition operators.h:512
poly_float cos_mult_
Definition operators.h:566
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:537
StereoEncoder(bool decoding=false)
Constructs a StereoEncoder. If decoding is true, the math is adjusted for decoding instead of encodin...
Definition operators.h:531
@ kMode
Definition operators.h:517
@ kAudio
Definition operators.h:515
@ kEncodingValue
Definition operators.h:516
@ kNumInputs
Definition operators.h:518
void processRotate(int num_samples)
Processes the stereo signal in rotate mode (phase rotation).
Definition operators.cpp:340
poly_float sin_mult_
Definition operators.h:567
@ kNumStereoModes
Definition operators.h:524
@ kRotate
Definition operators.h:523
@ kSpread
Definition operators.h:522
bool hasState() const override
Indicates that this operator has internal state (cos/sin multipliers) that may change over time.
Definition operators.h:551
mono_float decoding_mult_
Definition operators.h:568
void processCenter(int num_samples)
Processes the stereo signal in spread/center mode.
Definition operators.cpp:373
void process(int num_samples) override
Processes the stereo input, either applying rotation or a center/spread mix.
Definition operators.cpp:329
Subtracts the second input buffer from the first, sample-by-sample.
Definition operators.h:298
Subtract()
Definition operators.h:300
void process(int num_samples) override
Processes two inputs, storing the result of left - right.
Definition operators.cpp:97
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:302
Chooses a frequency based on tempo sync or direct frequency modes.
Definition operators.h:580
@ kTempoIndex
Definition operators.h:593
@ kSync
Definition operators.h:595
@ kKeytrackTune
Definition operators.h:598
@ kNumInputs
Definition operators.h:599
@ kKeytrackTranspose
Definition operators.h:597
@ kFrequency
Definition operators.h:592
@ kMidi
Definition operators.h:596
@ kBeatsPerSecond
Definition operators.h:594
TempoChooser()
Constructs a TempoChooser operating at control rate.
Definition operators.h:605
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:607
@ kTripletMode
Definition operators.h:586
@ kFrequencyMode
Definition operators.h:583
@ kTempoMode
Definition operators.h:584
@ kKeytrack
Definition operators.h:587
@ kDottedMode
Definition operators.h:585
@ kNumSyncModes
Definition operators.h:588
void process(int num_samples) override
Reads sync mode and other parameters, producing a final frequency.
Definition operators.cpp:402
Adds together an arbitrary number of inputs.
Definition operators.h:228
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:236
void process(int num_samples) override
Sums all input channels for each sample and writes the result to the output.
Definition operators.cpp:236
VariableAdd(int num_inputs=0)
Constructs a VariableAdd operator with a specified number of inputs.
Definition operators.h:234
Control-rate addition of two values.
Definition operators.h:700
Add()
Definition operators.h:702
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:705
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:707
Control-rate bilinear interpolation between four corner values.
Definition operators.h:1071
void process(int num_samples) override
Reads corner values and interpolation positions (X, Y), then performs bilinear interpolation.
Definition operators.h:1098
@ kTopRight
Definition operators.h:1075
@ kYPosition
Definition operators.h:1079
@ kBottomRight
Definition operators.h:1077
@ kNumInputs
Definition operators.h:1080
@ kBottomLeft
Definition operators.h:1076
@ kXPosition
Definition operators.h:1078
@ kTopLeft
Definition operators.h:1074
static const int kPositionStart
Index of the first corner input for convenience.
Definition operators.h:1086
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:1090
BilinearInterpolate()
Definition operators.h:1088
Control-rate clamping of a single value.
Definition operators.h:631
Clamp(mono_float min=-1, mono_float max=1)
Constructs a control-rate Clamp operator for single-value clamping.
Definition operators.h:638
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:641
void process(int num_samples) override
Processes one control sample, clamping it to [min_, max_].
Definition operators.h:647
Control-rate operator cubing a single value.
Definition operators.h:786
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:791
Cube()
Definition operators.h:788
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:789
Control-rate operator computing x^3 + offset.
Definition operators.h:845
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:850
Cubic(mono_float offset)
Definition operators.h:847
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:852
Raises scale_ to the power of the input value (clamped to [min_, max_]).
Definition operators.h:912
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:927
ExponentialScale(mono_float min, mono_float max, mono_float scale=1, mono_float offset=0.0f)
Definition operators.h:920
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:923
Converts a frequency to a normalized phase increment (freq / sample_rate).
Definition operators.h:971
FrequencyToPhase()
Definition operators.h:973
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:979
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:975
Converts a frequency to a period in samples (sample_rate / freq).
Definition operators.h:991
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:999
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:995
FrequencyToSamples()
Definition operators.h:993
Control-rate interpolation between two values based on a fraction.
Definition operators.h:740
@ kFrom
Definition operators.h:743
@ kNumInputs
Definition operators.h:746
@ kFractional
Definition operators.h:745
@ kTo
Definition operators.h:744
Interpolate()
Definition operators.h:749
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:751
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:753
Clamps a single control value to be at least min_.
Definition operators.h:660
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:664
LowerBound(mono_float min=0.0f)
Definition operators.h:662
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:666
Converts a dB value to a linear magnitude at control rate.
Definition operators.h:1031
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:1039
MagnitudeScale()
Definition operators.h:1033
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:1035
Converts a MIDI note (in semitones) to a frequency at control rate.
Definition operators.h:1051
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:1059
MidiScale()
Definition operators.h:1053
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:1055
Control-rate multiplication of two values.
Definition operators.h:719
virtual ~Multiply()
Definition operators.h:724
Multiply()
Definition operators.h:721
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:728
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:726
Control-rate operator computing x^2 + offset.
Definition operators.h:823
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:830
Quadratic(mono_float offset)
Definition operators.h:825
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:828
Control-rate operator raising a single value to the 4th power.
Definition operators.h:804
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:809
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:807
Quart()
Definition operators.h:806
Control-rate operator computing x^4 + offset.
Definition operators.h:867
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:874
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:872
Quartic(mono_float offset)
Definition operators.h:869
Control-rate operator computing sqrt(x) + offset.
Definition operators.h:890
Root(mono_float offset)
Definition operators.h:892
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:895
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:897
Control-rate operator squaring a single value.
Definition operators.h:768
Square()
Definition operators.h:770
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:771
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:773
Converts a time in seconds to a number of samples (time * sample_rate).
Definition operators.h:1011
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:1019
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:1015
TimeToSamples()
Definition operators.h:1013
Clamps a single control value to be at most max_.
Definition operators.h:680
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:684
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:686
UpperBound(mono_float max=0.0f)
Definition operators.h:682
Control-rate version of summing multiple inputs into one.
Definition operators.h:944
VariableAdd(int num_inputs=0)
Definition operators.h:946
virtual Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition operators.h:949
void process(int num_samples) override
Main processing function. Called by the ProcessorRouter.
Definition operators.h:953
#define force_inline
Definition common.h:23
Contains faster but less accurate versions of utility math functions, such as exponential,...
force_inline mono_float pow(mono_float base, mono_float exponent)
Definition futils.h:141
force_inline mono_float dbToMagnitude(mono_float decibels)
Converts decibels (dB) to magnitude (linear).
Definition futils.h:217
force_inline poly_float clamp(poly_float value, mono_float min, mono_float max)
Clamps each lane of a vector to [min, max].
Definition poly_utils.h:306
force_inline poly_float min(poly_float left, poly_float right)
Returns the minimum of two poly_floats lane-by-lane.
Definition poly_utils.h:334
force_inline poly_float max(poly_float left, poly_float right)
Returns the maximum of two poly_floats lane-by-lane.
Definition poly_utils.h:327
force_inline poly_float sqrt(poly_float value)
Computes the square root of each element in a poly_float.
Definition poly_utils.h:169
force_inline poly_float interpolate(poly_float from, poly_float to, mono_float t)
Performs a linear interpolation between two poly_floats using a scalar t in [0..1].
Definition poly_utils.h:182
force_inline poly_float midiCentsToFrequency(poly_float value)
Converts MIDI cents to frequency (vectorized).
Definition poly_utils.h:116
Contains classes and functions used within the Vital synthesizer framework.
float mono_float
Definition common.h:33
Declares the Processor class and related structures for handling audio processing in a polyphonic con...
force_inline poly_float at(int i) const
Returns the sample at index i from the source buffer.
Definition processor.h:141
void clearBuffer()
Zeros out the entire output buffer.
Definition processor.h:81
poly_float * buffer
Pointer to the output buffer.
Definition processor.h:110
Represents a vector of floating-point values using SIMD instructions.
Definition poly_values.h:600
Provides various utility functions, classes, and constants for audio, math, and general-purpose opera...