react-native-audio-api 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -8
- package/RNAudioAPI.podspec +5 -0
- package/android/CMakeLists.txt +21 -10
- package/android/libs/fftw3/arm64-v8a/libfftw3.a +0 -0
- package/android/libs/fftw3/armeabi-v7a/libfftw3.a +0 -0
- package/android/libs/fftw3/x86/libfftw3.a +0 -0
- package/android/libs/fftw3/x86_64/libfftw3.a +0 -0
- package/android/libs/include/fftw3/fftw3.h +413 -0
- package/android/src/main/cpp/AudioPlayer/AudioPlayer.cpp +23 -2
- package/android/src/main/cpp/AudioPlayer/AudioPlayer.h +5 -2
- package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.cpp +13 -1
- package/common/cpp/HostObjects/AudioContextHostObject.cpp +11 -148
- package/common/cpp/HostObjects/AudioContextHostObject.h +4 -11
- package/common/cpp/HostObjects/AudioNodeHostObject.cpp +0 -6
- package/common/cpp/HostObjects/BaseAudioContextHostObject.cpp +214 -0
- package/common/cpp/HostObjects/BaseAudioContextHostObject.h +39 -0
- package/common/cpp/HostObjects/BiquadFilterNodeHostObject.cpp +44 -0
- package/common/cpp/HostObjects/OscillatorNodeHostObject.cpp +21 -0
- package/common/cpp/HostObjects/OscillatorNodeHostObject.h +1 -0
- package/common/cpp/HostObjects/PeriodicWaveHostObject.cpp +33 -0
- package/common/cpp/HostObjects/PeriodicWaveHostObject.h +33 -0
- package/common/cpp/core/AudioArray.cpp +103 -0
- package/common/cpp/core/AudioArray.h +42 -0
- package/common/cpp/core/AudioBuffer.cpp +23 -83
- package/common/cpp/core/AudioBuffer.h +11 -13
- package/common/cpp/core/AudioBufferSourceNode.cpp +102 -25
- package/common/cpp/core/AudioBufferSourceNode.h +10 -6
- package/common/cpp/core/AudioBus.cpp +357 -0
- package/common/cpp/core/AudioBus.h +63 -0
- package/common/cpp/core/AudioContext.cpp +6 -72
- package/common/cpp/core/AudioContext.h +3 -60
- package/common/cpp/core/AudioDestinationNode.cpp +25 -15
- package/common/cpp/core/AudioDestinationNode.h +15 -7
- package/common/cpp/core/AudioNode.cpp +176 -22
- package/common/cpp/core/AudioNode.h +37 -37
- package/common/cpp/core/AudioNodeManager.cpp +72 -0
- package/common/cpp/core/AudioNodeManager.h +35 -0
- package/common/cpp/core/AudioParam.cpp +8 -11
- package/common/cpp/core/AudioParam.h +8 -8
- package/common/cpp/core/AudioScheduledSourceNode.cpp +19 -5
- package/common/cpp/core/AudioScheduledSourceNode.h +6 -2
- package/common/cpp/core/BaseAudioContext.cpp +157 -0
- package/common/cpp/core/BaseAudioContext.h +80 -0
- package/common/cpp/core/BiquadFilterNode.cpp +90 -69
- package/common/cpp/core/BiquadFilterNode.h +53 -57
- package/common/cpp/core/GainNode.cpp +12 -12
- package/common/cpp/core/GainNode.h +5 -3
- package/common/cpp/core/OscillatorNode.cpp +38 -29
- package/common/cpp/core/OscillatorNode.h +29 -69
- package/common/cpp/core/ParamChange.h +6 -6
- package/common/cpp/core/PeriodicWave.cpp +362 -0
- package/common/cpp/core/PeriodicWave.h +119 -0
- package/common/cpp/core/StereoPannerNode.cpp +28 -30
- package/common/cpp/core/StereoPannerNode.h +6 -6
- package/common/cpp/types/BiquadFilterType.h +19 -0
- package/common/cpp/types/ChannelCountMode.h +10 -0
- package/common/cpp/types/ChannelInterpretation.h +10 -0
- package/common/cpp/types/ContextState.h +10 -0
- package/common/cpp/types/OscillatorType.h +11 -0
- package/common/cpp/utils/FFTFrame.h +63 -0
- package/common/cpp/utils/Locker.h +47 -0
- package/common/cpp/utils/VectorMath.cpp +72 -3
- package/common/cpp/utils/VectorMath.h +7 -1
- package/common/cpp/utils/android/FFTFrame.cpp +22 -0
- package/common/cpp/utils/ios/FFTFrame.cpp +24 -0
- package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.cpp +10 -0
- package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.h +3 -2
- package/common/cpp/wrappers/AudioBufferWrapper.h +5 -5
- package/common/cpp/wrappers/AudioContextWrapper.cpp +7 -60
- package/common/cpp/wrappers/AudioContextWrapper.h +5 -26
- package/common/cpp/wrappers/AudioNodeWrapper.h +5 -5
- package/common/cpp/wrappers/AudioParamWrapper.h +4 -4
- package/common/cpp/wrappers/BaseAudioContextWrapper.cpp +76 -0
- package/common/cpp/wrappers/BaseAudioContextWrapper.h +49 -0
- package/common/cpp/wrappers/BiquadFilterNodeWrapper.cpp +9 -0
- package/common/cpp/wrappers/BiquadFilterNodeWrapper.h +9 -4
- package/common/cpp/wrappers/GainNodeWrapper.h +1 -1
- package/common/cpp/wrappers/OscillatorNodeWrapper.cpp +6 -0
- package/common/cpp/wrappers/OscillatorNodeWrapper.h +5 -2
- package/common/cpp/wrappers/PeriodicWaveWrapper.h +17 -0
- package/common/cpp/wrappers/StereoPannerNodeWrapper.h +1 -1
- package/ios/AudioAPIModule.h +20 -1
- package/ios/AudioAPIModule.mm +3 -3
- package/ios/AudioPlayer/AudioPlayer.h +3 -2
- package/ios/AudioPlayer/AudioPlayer.m +15 -17
- package/ios/AudioPlayer/IOSAudioPlayer.h +8 -4
- package/ios/AudioPlayer/IOSAudioPlayer.mm +30 -7
- package/lib/module/core/AudioBuffer.js +37 -0
- package/lib/module/core/AudioBuffer.js.map +1 -0
- package/lib/module/core/AudioBufferSourceNode.js +28 -0
- package/lib/module/core/AudioBufferSourceNode.js.map +1 -0
- package/lib/module/core/AudioContext.js +10 -0
- package/lib/module/core/AudioContext.js.map +1 -0
- package/lib/module/core/AudioDestinationNode.js +7 -0
- package/lib/module/core/AudioDestinationNode.js.map +1 -0
- package/lib/module/core/AudioNode.js +22 -0
- package/lib/module/core/AudioNode.js.map +1 -0
- package/lib/module/core/AudioParam.js +35 -0
- package/lib/module/core/AudioParam.js.map +1 -0
- package/lib/module/core/AudioScheduledSourceNode.js +28 -0
- package/lib/module/core/AudioScheduledSourceNode.js.map +1 -0
- package/lib/module/core/BaseAudioContext.js +57 -0
- package/lib/module/core/BaseAudioContext.js.map +1 -0
- package/lib/module/core/BiquadFilterNode.js +25 -0
- package/lib/module/core/BiquadFilterNode.js.map +1 -0
- package/lib/module/core/GainNode.js +9 -0
- package/lib/module/core/GainNode.js.map +1 -0
- package/lib/module/core/OscillatorNode.js +24 -0
- package/lib/module/core/OscillatorNode.js.map +1 -0
- package/lib/module/core/PeriodicWave.js +8 -0
- package/lib/module/core/PeriodicWave.js.map +1 -0
- package/lib/module/core/StereoPannerNode.js +9 -0
- package/lib/module/core/StereoPannerNode.js.map +1 -0
- package/lib/module/core/types.js.map +1 -0
- package/lib/module/errors/IndexSizeError.js +8 -0
- package/lib/module/errors/IndexSizeError.js.map +1 -0
- package/lib/module/errors/InvalidAccessError.js +8 -0
- package/lib/module/errors/InvalidAccessError.js.map +1 -0
- package/lib/module/errors/InvalidStateError.js +8 -0
- package/lib/module/errors/InvalidStateError.js.map +1 -0
- package/lib/module/errors/RangeError.js +8 -0
- package/lib/module/errors/RangeError.js.map +1 -0
- package/lib/module/errors/index.js +5 -0
- package/lib/module/errors/index.js.map +1 -0
- package/lib/module/index.js +13 -34
- package/lib/module/index.js.map +1 -1
- package/lib/module/interfaces.js +2 -0
- package/lib/module/interfaces.js.map +1 -0
- package/lib/typescript/core/AudioBuffer.d.ts +12 -0
- package/lib/typescript/core/AudioBuffer.d.ts.map +1 -0
- package/lib/typescript/core/AudioBufferSourceNode.d.ts +12 -0
- package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -0
- package/lib/typescript/core/AudioContext.d.ts +6 -0
- package/lib/typescript/core/AudioContext.d.ts.map +1 -0
- package/lib/typescript/core/AudioDestinationNode.d.ts +7 -0
- package/lib/typescript/core/AudioDestinationNode.d.ts.map +1 -0
- package/lib/typescript/core/AudioNode.d.ts +16 -0
- package/lib/typescript/core/AudioNode.d.ts.map +1 -0
- package/lib/typescript/core/AudioParam.d.ts +14 -0
- package/lib/typescript/core/AudioParam.d.ts.map +1 -0
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts +10 -0
- package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -0
- package/lib/typescript/core/BaseAudioContext.d.ts +26 -0
- package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -0
- package/lib/typescript/core/BiquadFilterNode.d.ts +16 -0
- package/lib/typescript/core/BiquadFilterNode.d.ts.map +1 -0
- package/lib/typescript/core/GainNode.d.ts +9 -0
- package/lib/typescript/core/GainNode.d.ts.map +1 -0
- package/lib/typescript/core/OscillatorNode.d.ts +15 -0
- package/lib/typescript/core/OscillatorNode.d.ts.map +1 -0
- package/lib/typescript/core/PeriodicWave.d.ts +5 -0
- package/lib/typescript/core/PeriodicWave.d.ts.map +1 -0
- package/lib/typescript/core/StereoPannerNode.d.ts +9 -0
- package/lib/typescript/core/StereoPannerNode.d.ts.map +1 -0
- package/lib/typescript/core/types.d.ts +9 -0
- package/lib/typescript/core/types.d.ts.map +1 -0
- package/lib/typescript/errors/IndexSizeError.d.ts +5 -0
- package/lib/typescript/errors/IndexSizeError.d.ts.map +1 -0
- package/lib/typescript/errors/InvalidAccessError.d.ts +5 -0
- package/lib/typescript/errors/InvalidAccessError.d.ts.map +1 -0
- package/lib/typescript/errors/InvalidStateError.d.ts +5 -0
- package/lib/typescript/errors/InvalidStateError.d.ts.map +1 -0
- package/lib/typescript/errors/RangeError.d.ts +5 -0
- package/lib/typescript/errors/RangeError.d.ts.map +1 -0
- package/lib/typescript/errors/index.d.ts +5 -0
- package/lib/typescript/errors/index.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +13 -17
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/interfaces.d.ts +78 -0
- package/lib/typescript/interfaces.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/core/AudioBuffer.ts +68 -0
- package/src/core/AudioBufferSourceNode.ts +35 -0
- package/src/core/AudioContext.ts +12 -0
- package/src/core/AudioDestinationNode.ts +9 -0
- package/src/core/AudioNode.ts +38 -0
- package/src/core/AudioParam.ts +55 -0
- package/src/core/AudioScheduledSourceNode.ts +43 -0
- package/src/core/BaseAudioContext.ts +97 -0
- package/src/core/BiquadFilterNode.ts +49 -0
- package/src/core/GainNode.ts +13 -0
- package/src/core/OscillatorNode.ts +37 -0
- package/src/core/PeriodicWave.ts +10 -0
- package/src/core/StereoPannerNode.ts +13 -0
- package/src/core/types.ts +26 -0
- package/src/errors/IndexSizeError.ts +8 -0
- package/src/errors/InvalidAccessError.ts +8 -0
- package/src/errors/InvalidStateError.ts +8 -0
- package/src/errors/RangeError.ts +8 -0
- package/src/errors/index.ts +4 -0
- package/src/index.ts +19 -73
- package/src/interfaces.ts +120 -0
- package/src/modules/global.d.ts +3 -3
- package/lib/module/types.js.map +0 -1
- package/lib/typescript/types.d.ts +0 -76
- package/lib/typescript/types.d.ts.map +0 -1
- package/src/types.ts +0 -108
- /package/lib/module/{types.js → core/types.js} +0 -0
|
@@ -2,110 +2,106 @@
|
|
|
2
2
|
|
|
3
3
|
#include <algorithm>
|
|
4
4
|
#include <cmath>
|
|
5
|
+
#include <complex>
|
|
5
6
|
#include <memory>
|
|
6
7
|
#include <stdexcept>
|
|
7
8
|
#include <string>
|
|
9
|
+
#include <vector>
|
|
8
10
|
|
|
9
11
|
#include "AudioNode.h"
|
|
10
12
|
#include "AudioParam.h"
|
|
13
|
+
#include "BiquadFilterType.h"
|
|
11
14
|
|
|
12
15
|
namespace audioapi {
|
|
13
16
|
|
|
17
|
+
class AudioBus;
|
|
18
|
+
|
|
14
19
|
class BiquadFilterNode : public AudioNode {
|
|
15
20
|
public:
|
|
16
|
-
explicit BiquadFilterNode(
|
|
21
|
+
explicit BiquadFilterNode(BaseAudioContext *context);
|
|
17
22
|
|
|
18
|
-
std::string getType()
|
|
23
|
+
[[nodiscard]] std::string getType();
|
|
19
24
|
void setType(const std::string &type);
|
|
20
|
-
std::shared_ptr<AudioParam> getFrequencyParam() const;
|
|
21
|
-
std::shared_ptr<AudioParam> getDetuneParam() const;
|
|
22
|
-
std::shared_ptr<AudioParam> getQParam() const;
|
|
23
|
-
std::shared_ptr<AudioParam> getGainParam() const;
|
|
25
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getFrequencyParam() const;
|
|
26
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
|
|
27
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getQParam() const;
|
|
28
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;
|
|
29
|
+
void getFrequencyResponse(
|
|
30
|
+
const std::vector<float> &frequencyArray,
|
|
31
|
+
std::vector<float> &magResponseOutput,
|
|
32
|
+
std::vector<float> &phaseResponseOutput);
|
|
24
33
|
|
|
25
34
|
protected:
|
|
26
|
-
|
|
35
|
+
void processNode(AudioBus *processingBus, int framesToProcess) override;
|
|
27
36
|
|
|
28
37
|
private:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
std::shared_ptr<AudioParam> frequencyParam_;
|
|
39
|
+
std::shared_ptr<AudioParam> detuneParam_;
|
|
40
|
+
std::shared_ptr<AudioParam> QParam_;
|
|
41
|
+
std::shared_ptr<AudioParam> gainParam_;
|
|
42
|
+
audioapi::BiquadFilterType type_;
|
|
43
|
+
|
|
44
|
+
// delayed samples
|
|
45
|
+
float x1_ = 0;
|
|
46
|
+
float x2_ = 0;
|
|
47
|
+
float y1_ = 0;
|
|
48
|
+
float y2_ = 0;
|
|
49
|
+
|
|
50
|
+
// coefficients
|
|
51
|
+
float b0_ = 1.0;
|
|
52
|
+
float b1_ = 0;
|
|
53
|
+
float b2_ = 0;
|
|
54
|
+
float a1_ = 1.0;
|
|
55
|
+
float a2_ = 0;
|
|
56
|
+
|
|
57
|
+
static BiquadFilterType fromString(const std::string &type) {
|
|
41
58
|
std::string lowerType = type;
|
|
42
59
|
std::transform(
|
|
43
60
|
lowerType.begin(), lowerType.end(), lowerType.begin(), ::tolower);
|
|
44
61
|
|
|
45
62
|
if (lowerType == "lowpass")
|
|
46
|
-
return
|
|
63
|
+
return BiquadFilterType::LOWPASS;
|
|
47
64
|
if (lowerType == "highpass")
|
|
48
|
-
return
|
|
65
|
+
return BiquadFilterType::HIGHPASS;
|
|
49
66
|
if (lowerType == "bandpass")
|
|
50
|
-
return
|
|
67
|
+
return BiquadFilterType::BANDPASS;
|
|
51
68
|
if (lowerType == "lowshelf")
|
|
52
|
-
return
|
|
69
|
+
return BiquadFilterType::LOWSHELF;
|
|
53
70
|
if (lowerType == "highshelf")
|
|
54
|
-
return
|
|
71
|
+
return BiquadFilterType::HIGHSHELF;
|
|
55
72
|
if (lowerType == "peaking")
|
|
56
|
-
return
|
|
73
|
+
return BiquadFilterType::PEAKING;
|
|
57
74
|
if (lowerType == "notch")
|
|
58
|
-
return
|
|
75
|
+
return BiquadFilterType::NOTCH;
|
|
59
76
|
if (lowerType == "allpass")
|
|
60
|
-
return
|
|
77
|
+
return BiquadFilterType::ALLPASS;
|
|
61
78
|
|
|
62
79
|
throw std::invalid_argument("Invalid filter type: " + type);
|
|
63
80
|
}
|
|
64
81
|
|
|
65
|
-
static std::string toString(
|
|
82
|
+
static std::string toString(BiquadFilterType type) {
|
|
66
83
|
switch (type) {
|
|
67
|
-
case
|
|
84
|
+
case BiquadFilterType::LOWPASS:
|
|
68
85
|
return "lowpass";
|
|
69
|
-
case
|
|
86
|
+
case BiquadFilterType::HIGHPASS:
|
|
70
87
|
return "highpass";
|
|
71
|
-
case
|
|
88
|
+
case BiquadFilterType::BANDPASS:
|
|
72
89
|
return "bandpass";
|
|
73
|
-
case
|
|
90
|
+
case BiquadFilterType::LOWSHELF:
|
|
74
91
|
return "lowshelf";
|
|
75
|
-
case
|
|
92
|
+
case BiquadFilterType::HIGHSHELF:
|
|
76
93
|
return "highshelf";
|
|
77
|
-
case
|
|
94
|
+
case BiquadFilterType::PEAKING:
|
|
78
95
|
return "peaking";
|
|
79
|
-
case
|
|
96
|
+
case BiquadFilterType::NOTCH:
|
|
80
97
|
return "notch";
|
|
81
|
-
case
|
|
98
|
+
case BiquadFilterType::ALLPASS:
|
|
82
99
|
return "allpass";
|
|
83
100
|
default:
|
|
84
101
|
throw std::invalid_argument("Unknown filter type");
|
|
85
102
|
}
|
|
86
103
|
}
|
|
87
104
|
|
|
88
|
-
private:
|
|
89
|
-
std::shared_ptr<AudioParam> frequencyParam_;
|
|
90
|
-
std::shared_ptr<AudioParam> detuneParam_;
|
|
91
|
-
std::shared_ptr<AudioParam> QParam_;
|
|
92
|
-
std::shared_ptr<AudioParam> gainParam_;
|
|
93
|
-
FilterType type_;
|
|
94
|
-
|
|
95
|
-
// delayed samples
|
|
96
|
-
float x1_ = 0;
|
|
97
|
-
float x2_ = 0;
|
|
98
|
-
float y1_ = 0;
|
|
99
|
-
float y2_ = 0;
|
|
100
|
-
|
|
101
|
-
// coefficients
|
|
102
|
-
float b0_ = 1.0;
|
|
103
|
-
float b1_ = 0;
|
|
104
|
-
float b2_ = 0;
|
|
105
|
-
float a1_ = 1.0;
|
|
106
|
-
float a2_ = 0;
|
|
107
|
-
|
|
108
|
-
static float clamp(float value, float min, float max);
|
|
109
105
|
void resetCoefficients();
|
|
110
106
|
void setNormalizedCoefficients(
|
|
111
107
|
float b0,
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
#include "GainNode.h"
|
|
2
|
-
#include "
|
|
2
|
+
#include "AudioBus.h"
|
|
3
|
+
#include "AudioArray.h"
|
|
4
|
+
#include "BaseAudioContext.h"
|
|
3
5
|
|
|
4
6
|
namespace audioapi {
|
|
5
7
|
|
|
6
|
-
GainNode::GainNode(
|
|
8
|
+
GainNode::GainNode(BaseAudioContext *context) : AudioNode(context) {
|
|
7
9
|
gainParam_ = std::make_shared<AudioParam>(context, 1.0, -MAX_GAIN, MAX_GAIN);
|
|
10
|
+
isInitialized_ = true;
|
|
8
11
|
}
|
|
9
12
|
|
|
10
13
|
std::shared_ptr<AudioParam> GainNode::getGainParam() const {
|
|
11
14
|
return gainParam_;
|
|
12
15
|
}
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
17
|
+
void GainNode::processNode(AudioBus *processingBus, int framesToProcess) {
|
|
18
|
+
double time = context_->getCurrentTime();
|
|
19
|
+
double deltaTime = 1.0 / context_->getSampleRate();
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
for (int i = 0; i < framesToProcess; i += 1) {
|
|
22
|
+
for (int j = 0; j < processingBus->getNumberOfChannels(); j += 1) {
|
|
23
|
+
(*processingBus->getChannel(j))[i] *= gainParam_->getValueAtTime(time);
|
|
24
|
+
}
|
|
21
25
|
|
|
22
|
-
for (int i = 0; i < numFrames * channelCount_; i++) {
|
|
23
|
-
audioData[i] *= gainParam_->getValueAtTime(time);
|
|
24
26
|
time += deltaTime;
|
|
25
27
|
}
|
|
26
|
-
|
|
27
|
-
return true;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
} // namespace audioapi
|
|
@@ -7,14 +7,16 @@
|
|
|
7
7
|
|
|
8
8
|
namespace audioapi {
|
|
9
9
|
|
|
10
|
+
class AudioBus;
|
|
11
|
+
|
|
10
12
|
class GainNode : public AudioNode {
|
|
11
13
|
public:
|
|
12
|
-
explicit GainNode(
|
|
14
|
+
explicit GainNode(BaseAudioContext *context);
|
|
13
15
|
|
|
14
|
-
std::shared_ptr<AudioParam> getGainParam() const;
|
|
16
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;
|
|
15
17
|
|
|
16
18
|
protected:
|
|
17
|
-
|
|
19
|
+
void processNode(AudioBus *processingBus, int framesToProcess) override;
|
|
18
20
|
|
|
19
21
|
private:
|
|
20
22
|
std::shared_ptr<AudioParam> gainParam_;
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
#include "AudioBus.h"
|
|
2
|
+
#include "AudioArray.h"
|
|
1
3
|
#include "OscillatorNode.h"
|
|
2
|
-
#include "
|
|
4
|
+
#include "BaseAudioContext.h"
|
|
3
5
|
|
|
4
6
|
namespace audioapi {
|
|
5
7
|
|
|
6
|
-
OscillatorNode::OscillatorNode(
|
|
8
|
+
OscillatorNode::OscillatorNode(BaseAudioContext *context)
|
|
7
9
|
: AudioScheduledSourceNode(context) {
|
|
8
10
|
frequencyParam_ = std::make_shared<AudioParam>(
|
|
9
11
|
context, 444.0, -NYQUIST_FREQUENCY, NYQUIST_FREQUENCY);
|
|
10
12
|
detuneParam_ =
|
|
11
13
|
std::make_shared<AudioParam>(context, 0.0, -MAX_DETUNE, MAX_DETUNE);
|
|
14
|
+
type_ = OscillatorType::SINE;
|
|
15
|
+
periodicWave_ = context_->getBasicWaveForm(type_);
|
|
16
|
+
isInitialized_ = true;
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
std::shared_ptr<AudioParam> OscillatorNode::getFrequencyParam() const {
|
|
@@ -25,42 +30,46 @@ std::string OscillatorNode::getType() {
|
|
|
25
30
|
|
|
26
31
|
void OscillatorNode::setType(const std::string &type) {
|
|
27
32
|
type_ = OscillatorNode::fromString(type);
|
|
33
|
+
periodicWave_ = context_->getBasicWaveForm(type_);
|
|
28
34
|
}
|
|
29
35
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
auto deltaTime = 1.0 / context_->getSampleRate();
|
|
36
|
-
|
|
37
|
-
for (int i = 0; i < numFrames; ++i) {
|
|
38
|
-
auto detuneRatio =
|
|
39
|
-
std::pow(2.0f, detuneParam_->getValueAtTime(time) / 1200.0f);
|
|
40
|
-
auto detunedFrequency =
|
|
41
|
-
round(frequencyParam_->getValueAtTime(time) * detuneRatio);
|
|
42
|
-
auto phaseIncrement = static_cast<float>(
|
|
43
|
-
2 * M_PI * detunedFrequency / context_->getSampleRate());
|
|
36
|
+
void OscillatorNode::setPeriodicWave(
|
|
37
|
+
const std::shared_ptr<PeriodicWave> &periodicWave) {
|
|
38
|
+
periodicWave_ = periodicWave;
|
|
39
|
+
type_ = OscillatorType::CUSTOM;
|
|
40
|
+
}
|
|
44
41
|
|
|
45
|
-
|
|
42
|
+
void OscillatorNode::processNode(AudioBus* processingBus, int framesToProcess) {
|
|
43
|
+
if (!isPlaying()) {
|
|
44
|
+
processingBus->zero();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
48
|
+
double time = context_->getCurrentTime();
|
|
49
|
+
double deltaTime = 1.0 / context_->getSampleRate();
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
for (int i = 0; i < framesToProcess; i += 1) {
|
|
52
|
+
auto detuneRatio =
|
|
53
|
+
std::pow(2.0f, detuneParam_->getValueAtTime(time) / 1200.0f);
|
|
54
|
+
auto detunedFrequency =
|
|
55
|
+
round(frequencyParam_->getValueAtTime(time) * detuneRatio);
|
|
56
|
+
auto phaseIncrement = detunedFrequency * periodicWave_->getScale();
|
|
53
57
|
|
|
54
|
-
|
|
55
|
-
phase_
|
|
56
|
-
}
|
|
58
|
+
float sample =
|
|
59
|
+
periodicWave_->getSample(detunedFrequency, phase_, phaseIncrement);
|
|
57
60
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
+
for (int j = 0; j < processingBus->getNumberOfChannels(); j += 1) {
|
|
62
|
+
(*processingBus->getChannel(j))[i] = sample;
|
|
61
63
|
}
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
phase_ += phaseIncrement;
|
|
66
|
+
phase_ -=
|
|
67
|
+
floor(
|
|
68
|
+
phase_ / static_cast<float>(periodicWave_->getPeriodicWaveSize())) *
|
|
69
|
+
static_cast<float>(periodicWave_->getPeriodicWaveSize());
|
|
70
|
+
|
|
71
|
+
time += deltaTime;
|
|
64
72
|
}
|
|
65
73
|
}
|
|
74
|
+
|
|
66
75
|
} // namespace audioapi
|
|
@@ -5,108 +5,68 @@
|
|
|
5
5
|
#include <string>
|
|
6
6
|
|
|
7
7
|
#include "AudioParam.h"
|
|
8
|
+
#include "PeriodicWave.h"
|
|
9
|
+
#include "OscillatorType.h"
|
|
8
10
|
#include "AudioScheduledSourceNode.h"
|
|
9
11
|
|
|
10
12
|
namespace audioapi {
|
|
11
13
|
|
|
14
|
+
class AudioBus;
|
|
15
|
+
|
|
12
16
|
class OscillatorNode : public AudioScheduledSourceNode {
|
|
13
17
|
public:
|
|
14
|
-
explicit OscillatorNode(
|
|
18
|
+
explicit OscillatorNode(BaseAudioContext *context);
|
|
15
19
|
|
|
16
|
-
std::shared_ptr<AudioParam> getFrequencyParam() const;
|
|
17
|
-
std::shared_ptr<AudioParam> getDetuneParam() const;
|
|
18
|
-
std::string getType();
|
|
20
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getFrequencyParam() const;
|
|
21
|
+
[[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
|
|
22
|
+
[[nodiscard]] std::string getType();
|
|
19
23
|
void setType(const std::string &type);
|
|
24
|
+
void setPeriodicWave(const std::shared_ptr<PeriodicWave> &periodicWave);
|
|
20
25
|
|
|
21
26
|
protected:
|
|
22
|
-
|
|
27
|
+
void processNode(AudioBus *processingBus, int framesToProcess) override;
|
|
23
28
|
|
|
24
29
|
private:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
static float squareWave(double wavePhase) {
|
|
32
|
-
return static_cast<float>(std::sin(wavePhase) >= 0 ? 1.0 : -1.0);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
static float sawtoothWave(double wavePhase) {
|
|
36
|
-
return static_cast<float>(
|
|
37
|
-
2.0 *
|
|
38
|
-
(wavePhase / (2 * M_PI) - std::floor(wavePhase / (2 * M_PI) + 0.5)));
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
static float triangleWave(double wavePhase) {
|
|
42
|
-
return static_cast<float>(
|
|
43
|
-
2.0 *
|
|
44
|
-
std::abs(
|
|
45
|
-
2.0 *
|
|
46
|
-
(wavePhase / (2 * M_PI) -
|
|
47
|
-
std::floor(wavePhase / (2 * M_PI) + 0.5))) -
|
|
48
|
-
1.0);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
static float getWaveValue(double wavePhase, WaveType type) {
|
|
52
|
-
switch (type) {
|
|
53
|
-
case WaveType::SINE:
|
|
54
|
-
return sineWave(wavePhase);
|
|
55
|
-
case WaveType::SQUARE:
|
|
56
|
-
return squareWave(wavePhase);
|
|
57
|
-
case WaveType::SAWTOOTH:
|
|
58
|
-
return sawtoothWave(wavePhase);
|
|
59
|
-
case WaveType::TRIANGLE:
|
|
60
|
-
return triangleWave(wavePhase);
|
|
61
|
-
default:
|
|
62
|
-
throw std::invalid_argument("Unknown wave type");
|
|
63
|
-
}
|
|
64
|
-
}
|
|
30
|
+
std::shared_ptr<AudioParam> frequencyParam_;
|
|
31
|
+
std::shared_ptr<AudioParam> detuneParam_;
|
|
32
|
+
OscillatorType type_;
|
|
33
|
+
float phase_ = 0.0;
|
|
34
|
+
std::shared_ptr<PeriodicWave> periodicWave_;
|
|
65
35
|
|
|
66
|
-
static
|
|
36
|
+
static OscillatorType fromString(const std::string &type) {
|
|
67
37
|
std::string lowerType = type;
|
|
68
38
|
std::transform(
|
|
69
39
|
lowerType.begin(), lowerType.end(), lowerType.begin(), ::tolower);
|
|
70
40
|
|
|
71
41
|
if (lowerType == "sine")
|
|
72
|
-
return
|
|
42
|
+
return OscillatorType::SINE;
|
|
73
43
|
if (lowerType == "square")
|
|
74
|
-
return
|
|
44
|
+
return OscillatorType::SQUARE;
|
|
75
45
|
if (lowerType == "sawtooth")
|
|
76
|
-
return
|
|
46
|
+
return OscillatorType::SAWTOOTH;
|
|
77
47
|
if (lowerType == "triangle")
|
|
78
|
-
return
|
|
48
|
+
return OscillatorType::TRIANGLE;
|
|
79
49
|
if (lowerType == "custom")
|
|
80
|
-
return
|
|
50
|
+
return OscillatorType::CUSTOM;
|
|
81
51
|
|
|
82
|
-
throw std::invalid_argument("Unknown
|
|
52
|
+
throw std::invalid_argument("Unknown oscillator type: " + type);
|
|
83
53
|
}
|
|
84
54
|
|
|
85
|
-
static std::string toString(
|
|
55
|
+
static std::string toString(OscillatorType type) {
|
|
86
56
|
switch (type) {
|
|
87
|
-
case
|
|
57
|
+
case OscillatorType::SINE:
|
|
88
58
|
return "sine";
|
|
89
|
-
case
|
|
59
|
+
case OscillatorType::SQUARE:
|
|
90
60
|
return "square";
|
|
91
|
-
case
|
|
61
|
+
case OscillatorType::SAWTOOTH:
|
|
92
62
|
return "sawtooth";
|
|
93
|
-
case
|
|
63
|
+
case OscillatorType::TRIANGLE:
|
|
94
64
|
return "triangle";
|
|
95
|
-
case
|
|
65
|
+
case OscillatorType::CUSTOM:
|
|
96
66
|
return "custom";
|
|
97
67
|
default:
|
|
98
|
-
throw std::invalid_argument("Unknown
|
|
68
|
+
throw std::invalid_argument("Unknown oscillator type");
|
|
99
69
|
}
|
|
100
70
|
}
|
|
101
|
-
|
|
102
|
-
static float getWaveBufferElement(double wavePhase, WaveType waveType) {
|
|
103
|
-
return getWaveValue(wavePhase, waveType);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
private:
|
|
107
|
-
std::shared_ptr<AudioParam> frequencyParam_;
|
|
108
|
-
std::shared_ptr<AudioParam> detuneParam_;
|
|
109
|
-
WaveType type_ = WaveType::SINE;
|
|
110
|
-
float phase_ = 0.0;
|
|
111
71
|
};
|
|
112
72
|
} // namespace audioapi
|
|
@@ -15,12 +15,12 @@ class ParamChange {
|
|
|
15
15
|
std::function<float(double, double, float, float, double)>
|
|
16
16
|
calculateValue);
|
|
17
17
|
|
|
18
|
-
double getEndTime() const;
|
|
19
|
-
double getStartTime() const;
|
|
20
|
-
float getEndValue() const;
|
|
21
|
-
float getStartValue() const;
|
|
22
|
-
std::function<float(double, double, float, float, double)>
|
|
23
|
-
|
|
18
|
+
[[nodiscard]] double getEndTime() const;
|
|
19
|
+
[[nodiscard]] double getStartTime() const;
|
|
20
|
+
[[nodiscard]] float getEndValue() const;
|
|
21
|
+
[[nodiscard]] float getStartValue() const;
|
|
22
|
+
[[nodiscard]] std::function<float(double, double, float, float, double)>
|
|
23
|
+
getCalculateValue() const;
|
|
24
24
|
bool operator<(const ParamChange &other) const;
|
|
25
25
|
|
|
26
26
|
private:
|