OpenWareLaboratory
VoltsPerOctave.cpp
Go to the documentation of this file.
1 #include "VoltsPerOctave.h"
2 #include "message.h"
3 #include "ProgramVector.h"
4 #include "ServiceCall.h"
5 #include <stdint.h>
6 
8  : tune(0.0), offset(o), multiplier(m) {
9 }
10 
11 VoltsPerOctave::VoltsPerOctave(bool input) : tune(0.0) {
12  int32_t volts_offset = 0, volts_scalar = 0;
13  void* args[] = {
14  (void*)(input ? "IO" : "OO"), (void*)&volts_offset,
15  (void*)(input ? "IS" : "OS"), (void*)&volts_scalar
16  };
17  int ret = getProgramVector()->serviceCall(OWL_SERVICE_GET_PARAMETERS, args, 4);
18  if(ret == OWL_SERVICE_OK){
19  multiplier = (float)volts_scalar/UINT16_MAX;
20  offset = (float)volts_offset/UINT16_MAX;
21  }else{
22  if(getProgramVector()->hardware_version == OWL_MODULAR_HARDWARE){
23  if(input){
24  multiplier = -4.29;
25  offset = -0.06382;
26  }else{
27  multiplier = -4.642;
28  offset = 0.1208;
29  }
30  }else{
31  multiplier = 2.0f;
32  offset = 0.0f;
33  }
34  }
35 }
36 
38  ASSERT(output.getSize() >= samples.getSize(), "Output buffer too short");
39  // Block based implementation - this is giving ~1% higher CPU usage, tested on Magus
40  /*
41  output.copyFrom(samples);
42  output.subtract(offset);
43  output.multiply(multiplier);
44  output.add(tune);
45  for(size_t i = 0; i < samples.getSize(); ++i)
46  output[i] = exp2f(output[i]);
47  output.multiply(440.f);
48  */
49 
50  // Sample by sample processing
51  for(size_t i=0; i<samples.getSize(); ++i)
52  output[i] = getFrequency(samples[i]);
53 }
54 
56  getFrequency(samples, samples);
57 }
58 
60  ASSERT(output.getSize() >= frequencies.getSize(), "Output buffer too short");
61  // Block based implementation - this gives the same CPU load as sample
62  // by sample processing, so probably no reason to use it
63  /*
64  for (size_t i = 0; i < output.getSize(); i++)
65  //output[i] = tune - hertzToVolts(output[i]);
66  output[i] = log2f(output[i]);
67  output.add(tune - log2f(440.0f));
68  output.multiply(1.0f / multiplier);
69  output.add(offset);
70  */
71 
72  // Sample by sample processing
73  for(size_t i=0; i < frequencies.getSize(); ++i)
74  output[i] = getSample(frequencies[i]);
75 }
77  getSample(frequencies, frequencies);
78 }
This class contains useful methods for manipulating arrays of floats.
Definition: FloatArray.h:12
size_t getSize() const
Definition: SimpleArray.h:31
float getSample(float frequency)
VoltsPerOctave(bool input=true)
float getFrequency(float sample)
#define ASSERT(cond, msg)
Definition: message.h:16