OpenWareLaboratory
VosimOscillator.h
Go to the documentation of this file.
1 #ifndef __VosimOscillator_h
2 #define __VosimOscillator_h
3 
4 #include "Oscillator.h"
5 #include "PolyBlepOscillator.h"
6 
11 class VosimOscillator : public OscillatorTemplate<VosimOscillator> {
12 private:
13  SineOscillator* formant1;
14  SineOscillator* formant2;
15 public:
17  formant1(osc1), formant2(osc2) {}
18  static constexpr float begin_phase = 0;
19  static constexpr float end_phase = 1;
20  float waveshape = 0;
21  float getSample(){
22  // return 1 - phase;
23  float square = phase < 0 ? 0.0f : 1.0f;
24  float saw = phase;
25  float sample = saw + (square - saw) * waveshape;
26  return 1 - sample * (1 - waveshape*0.5);
27  // return 1 - (1-waveshape)*phase + waveshape*sinf(phase*2*M_PI);
28  }
29  void setWaveshape(float value){
30  waveshape = value*0.25;
31  }
32  float getFormant1(){
33  return formant1->getFrequency();
34  }
35  float getFormant2(){
36  return formant1->getFrequency();
37  }
38  void setFormant1(float frequency){
39  formant1->setFrequency(frequency);
40  }
41  void setFormant2(float frequency){
42  formant2->setFrequency(frequency);
43  }
44  float generate(float fm){
45  float sample = getSample();
46  float s1 = formant1->generate();
47  float s2 = formant2->generate();
48  sample = (s1*s1 + s2*s2)*sample - 1;
49  phase += incr * (1 + fm);
50  if(phase >= end_phase){
52 #if 0
53  float ph = getPhase();
54  formant1->setPhase(ph);
55  formant2->setPhase(ph);
56 #else
57  formant1->reset();
58  formant2->reset();
59 #endif
60  }
61  return sample;
62  }
63  float generate(){
64  return generate(0);
65  }
66  void generate(FloatArray output){
67  float* out = output.getData();
68  size_t len = output.getSize();
69  float sample, s1, s2;
70  while(len--){
71  sample = getSample() * (1 - 0.4*waveshape);
72  s1 = formant1->generate();
73  s2 = formant2->generate();
74  *out++ = (s1*s1 + s2*s2)*sample;
75  phase += incr;
76  if(phase >= end_phase){
78  formant1->reset();
79  formant2->reset();
80  }
81  }
82  }
83  void generate(FloatArray output, FloatArray input){
84  float* out = output.getData();
85  float* fm = input.getData();
86  size_t len = output.getSize();
87  float sample, s1, s2;
88  while(len--){
89  sample = getSample() * (1 - 0.4*waveshape);
90  s1 = formant1->generate();
91  s2 = formant2->generate();
92  *out++ = (s1*s1 + s2*s2)*sample;
93  phase += incr * (1 + *fm++);
94  if(phase >= end_phase){
96  formant1->reset();
97  formant2->reset();
98  }
99  }
100  }
101  static VosimOscillator* create(float sr){
104  VosimOscillator* osc = new VosimOscillator(f1, f2);
105  osc->setSampleRate(sr);
106  return osc;
107  }
108  static void destroy(VosimOscillator* obj){
109  SineOscillator::destroy(obj->formant1);
110  SineOscillator::destroy(obj->formant2);
111  delete obj;
112  }
113 };
114 
115 #endif /* __VosimOscillator_h */
This class contains useful methods for manipulating arrays of floats.
Definition: FloatArray.h:12
void setFrequency(float freq)
Set oscillator frequency in Hertz.
Definition: Oscillator.h:83
void setPhase(float ph)
Set current oscillator phase in radians.
Definition: Oscillator.h:89
float getFrequency()
Get oscillator frequency in Hertz.
Definition: Oscillator.h:86
void reset()
Reset oscillator (typically resets phase)
Definition: Oscillator.h:96
static SineOscillator * create(float sr)
Definition: Oscillator.h:115
void setSampleRate(float sr)
Set oscillator sample rate.
Definition: Oscillator.h:75
static void destroy(SineOscillator *osc)
Definition: Oscillator.h:120
size_t getSize() const
Definition: SimpleArray.h:31
T * getData()
Get the data stored in the Array.
Definition: SimpleArray.h:27
void generate(FloatArray output)
Produce a block of samples.
VOSIM-type oscillator based on Rob Hordijk's Nord Modular patch.
void generate(FloatArray output)
Produce a block of samples.
static VosimOscillator * create(float sr)
VosimOscillator(SineOscillator *osc2, SineOscillator *osc1)
static void destroy(VosimOscillator *obj)
float generate()
Produce the next consecutive sample.
void setFormant1(float frequency)
void setFormant2(float frequency)
static constexpr float begin_phase
void setWaveshape(float value)
float generate(float fm)
Produce a sample with frequency modulation.
void generate(FloatArray output, FloatArray input)
Produce a block of samples with frequency modulation.
static constexpr float end_phase