react-native-audio-api 0.0.1 → 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.
Files changed (242) hide show
  1. package/README.md +60 -1
  2. package/RNAudioAPI.podspec +46 -0
  3. package/android/CMakeLists.txt +74 -0
  4. package/android/build.gradle +194 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/libs/fftw3/arm64-v8a/libfftw3.a +0 -0
  7. package/android/libs/fftw3/armeabi-v7a/libfftw3.a +0 -0
  8. package/android/libs/fftw3/x86/libfftw3.a +0 -0
  9. package/android/libs/fftw3/x86_64/libfftw3.a +0 -0
  10. package/android/libs/include/fftw3/fftw3.h +413 -0
  11. package/android/src/main/AndroidManifest.xml +3 -0
  12. package/android/src/main/AndroidManifestNew.xml +2 -0
  13. package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.cpp +22 -0
  14. package/android/src/main/cpp/AudioAPIInstaller/AudioAPIInstaller.h +48 -0
  15. package/android/src/main/cpp/AudioPlayer/AudioPlayer.cpp +66 -0
  16. package/android/src/main/cpp/AudioPlayer/AudioPlayer.h +33 -0
  17. package/android/src/main/cpp/OnLoad.cpp +9 -0
  18. package/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt +14 -0
  19. package/android/src/main/java/com/swmansion/audioapi/module/AudioAPIInstaller.kt +21 -0
  20. package/android/src/main/java/com/swmansion/audioapi/nativemodules/AudioAPIModule.kt +25 -0
  21. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.cpp +52 -0
  22. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerHostObject.h +45 -0
  23. package/common/cpp/AudioAPIInstaller/AudioAPIInstallerWrapper.h +38 -0
  24. package/common/cpp/AudioAPIInstaller/android/AudioAPIInstallerWrapper.cpp +16 -0
  25. package/common/cpp/AudioAPIInstaller/ios/AudioAPIInstallerWrapper.cpp +12 -0
  26. package/common/cpp/HostObjects/AudioBufferHostObject.cpp +143 -0
  27. package/common/cpp/HostObjects/AudioBufferHostObject.h +33 -0
  28. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.cpp +79 -0
  29. package/common/cpp/HostObjects/AudioBufferSourceNodeHostObject.h +37 -0
  30. package/common/cpp/HostObjects/AudioContextHostObject.cpp +54 -0
  31. package/common/cpp/HostObjects/AudioContextHostObject.h +36 -0
  32. package/common/cpp/HostObjects/AudioDestinationNodeHostObject.cpp +33 -0
  33. package/common/cpp/HostObjects/AudioDestinationNodeHostObject.h +31 -0
  34. package/common/cpp/HostObjects/AudioNodeHostObject.cpp +102 -0
  35. package/common/cpp/HostObjects/AudioNodeHostObject.h +29 -0
  36. package/common/cpp/HostObjects/AudioParamHostObject.cpp +115 -0
  37. package/common/cpp/HostObjects/AudioParamHostObject.h +34 -0
  38. package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.cpp +73 -0
  39. package/common/cpp/HostObjects/AudioScheduledSourceNodeHostObject.h +31 -0
  40. package/common/cpp/HostObjects/BaseAudioContextHostObject.cpp +214 -0
  41. package/common/cpp/HostObjects/BaseAudioContextHostObject.h +39 -0
  42. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.cpp +125 -0
  43. package/common/cpp/HostObjects/BiquadFilterNodeHostObject.h +42 -0
  44. package/common/cpp/HostObjects/Constants.h +22 -0
  45. package/common/cpp/HostObjects/GainNodeHostObject.cpp +41 -0
  46. package/common/cpp/HostObjects/GainNodeHostObject.h +32 -0
  47. package/common/cpp/HostObjects/OscillatorNodeHostObject.cpp +88 -0
  48. package/common/cpp/HostObjects/OscillatorNodeHostObject.h +41 -0
  49. package/common/cpp/HostObjects/PeriodicWaveHostObject.cpp +33 -0
  50. package/common/cpp/HostObjects/PeriodicWaveHostObject.h +33 -0
  51. package/common/cpp/HostObjects/StereoPannerNodeHostObject.cpp +41 -0
  52. package/common/cpp/HostObjects/StereoPannerNodeHostObject.h +36 -0
  53. package/common/cpp/core/AudioArray.cpp +103 -0
  54. package/common/cpp/core/AudioArray.h +42 -0
  55. package/common/cpp/core/AudioBuffer.cpp +55 -0
  56. package/common/cpp/core/AudioBuffer.h +40 -0
  57. package/common/cpp/core/AudioBufferSourceNode.cpp +135 -0
  58. package/common/cpp/core/AudioBufferSourceNode.h +30 -0
  59. package/common/cpp/core/AudioBus.cpp +357 -0
  60. package/common/cpp/core/AudioBus.h +63 -0
  61. package/common/cpp/core/AudioContext.cpp +24 -0
  62. package/common/cpp/core/AudioContext.h +16 -0
  63. package/common/cpp/core/AudioDestinationNode.cpp +45 -0
  64. package/common/cpp/core/AudioDestinationNode.h +32 -0
  65. package/common/cpp/core/AudioNode.cpp +222 -0
  66. package/common/cpp/core/AudioNode.h +74 -0
  67. package/common/cpp/core/AudioNodeManager.cpp +72 -0
  68. package/common/cpp/core/AudioNodeManager.h +35 -0
  69. package/common/cpp/core/AudioParam.cpp +133 -0
  70. package/common/cpp/core/AudioParam.h +50 -0
  71. package/common/cpp/core/AudioScheduledSourceNode.cpp +53 -0
  72. package/common/cpp/core/AudioScheduledSourceNode.h +34 -0
  73. package/common/cpp/core/BaseAudioContext.cpp +157 -0
  74. package/common/cpp/core/BaseAudioContext.h +80 -0
  75. package/common/cpp/core/BiquadFilterNode.cpp +385 -0
  76. package/common/cpp/core/BiquadFilterNode.h +124 -0
  77. package/common/cpp/core/GainNode.cpp +30 -0
  78. package/common/cpp/core/GainNode.h +25 -0
  79. package/common/cpp/core/OscillatorNode.cpp +75 -0
  80. package/common/cpp/core/OscillatorNode.h +72 -0
  81. package/common/cpp/core/ParamChange.cpp +46 -0
  82. package/common/cpp/core/ParamChange.h +34 -0
  83. package/common/cpp/core/PeriodicWave.cpp +362 -0
  84. package/common/cpp/core/PeriodicWave.h +119 -0
  85. package/common/cpp/core/StereoPannerNode.cpp +56 -0
  86. package/common/cpp/core/StereoPannerNode.h +26 -0
  87. package/common/cpp/types/BiquadFilterType.h +19 -0
  88. package/common/cpp/types/ChannelCountMode.h +10 -0
  89. package/common/cpp/types/ChannelInterpretation.h +10 -0
  90. package/common/cpp/types/ContextState.h +10 -0
  91. package/common/cpp/types/OscillatorType.h +11 -0
  92. package/common/cpp/utils/FFTFrame.h +63 -0
  93. package/common/cpp/utils/Locker.h +47 -0
  94. package/common/cpp/utils/VectorMath.cpp +678 -0
  95. package/common/cpp/utils/VectorMath.h +71 -0
  96. package/common/cpp/utils/android/FFTFrame.cpp +22 -0
  97. package/common/cpp/utils/ios/FFTFrame.cpp +24 -0
  98. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.cpp +45 -0
  99. package/common/cpp/wrappers/AudioBufferSourceNodeWrapper.h +26 -0
  100. package/common/cpp/wrappers/AudioBufferWrapper.cpp +46 -0
  101. package/common/cpp/wrappers/AudioBufferWrapper.h +30 -0
  102. package/common/cpp/wrappers/AudioContextWrapper.cpp +17 -0
  103. package/common/cpp/wrappers/AudioContextWrapper.h +19 -0
  104. package/common/cpp/wrappers/AudioDestinationNodeWrapper.h +16 -0
  105. package/common/cpp/wrappers/AudioNodeWrapper.cpp +37 -0
  106. package/common/cpp/wrappers/AudioNodeWrapper.h +25 -0
  107. package/common/cpp/wrappers/AudioParamWrapper.cpp +42 -0
  108. package/common/cpp/wrappers/AudioParamWrapper.h +25 -0
  109. package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.cpp +23 -0
  110. package/common/cpp/wrappers/AudioScheduledSourceNodeWrapper.h +23 -0
  111. package/common/cpp/wrappers/BaseAudioContextWrapper.cpp +76 -0
  112. package/common/cpp/wrappers/BaseAudioContextWrapper.h +49 -0
  113. package/common/cpp/wrappers/BiquadFilterNodeWrapper.cpp +60 -0
  114. package/common/cpp/wrappers/BiquadFilterNodeWrapper.h +37 -0
  115. package/common/cpp/wrappers/GainNodeWrapper.cpp +14 -0
  116. package/common/cpp/wrappers/GainNodeWrapper.h +20 -0
  117. package/common/cpp/wrappers/OscillatorNodeWrapper.cpp +44 -0
  118. package/common/cpp/wrappers/OscillatorNodeWrapper.h +31 -0
  119. package/common/cpp/wrappers/PeriodicWaveWrapper.h +17 -0
  120. package/common/cpp/wrappers/StereoPannerNodeWrapper.cpp +16 -0
  121. package/common/cpp/wrappers/StereoPannerNodeWrapper.h +21 -0
  122. package/ios/AudioAPIModule.h +24 -0
  123. package/ios/AudioAPIModule.mm +44 -0
  124. package/ios/AudioPlayer/AudioPlayer.h +28 -0
  125. package/ios/AudioPlayer/AudioPlayer.m +119 -0
  126. package/ios/AudioPlayer/IOSAudioPlayer.h +33 -0
  127. package/ios/AudioPlayer/IOSAudioPlayer.mm +57 -0
  128. package/lib/module/core/AudioBuffer.js +37 -0
  129. package/lib/module/core/AudioBuffer.js.map +1 -0
  130. package/lib/module/core/AudioBufferSourceNode.js +28 -0
  131. package/lib/module/core/AudioBufferSourceNode.js.map +1 -0
  132. package/lib/module/core/AudioContext.js +10 -0
  133. package/lib/module/core/AudioContext.js.map +1 -0
  134. package/lib/module/core/AudioDestinationNode.js +7 -0
  135. package/lib/module/core/AudioDestinationNode.js.map +1 -0
  136. package/lib/module/core/AudioNode.js +22 -0
  137. package/lib/module/core/AudioNode.js.map +1 -0
  138. package/lib/module/core/AudioParam.js +35 -0
  139. package/lib/module/core/AudioParam.js.map +1 -0
  140. package/lib/module/core/AudioScheduledSourceNode.js +28 -0
  141. package/lib/module/core/AudioScheduledSourceNode.js.map +1 -0
  142. package/lib/module/core/BaseAudioContext.js +57 -0
  143. package/lib/module/core/BaseAudioContext.js.map +1 -0
  144. package/lib/module/core/BiquadFilterNode.js +25 -0
  145. package/lib/module/core/BiquadFilterNode.js.map +1 -0
  146. package/lib/module/core/GainNode.js +9 -0
  147. package/lib/module/core/GainNode.js.map +1 -0
  148. package/lib/module/core/OscillatorNode.js +24 -0
  149. package/lib/module/core/OscillatorNode.js.map +1 -0
  150. package/lib/module/core/PeriodicWave.js +8 -0
  151. package/lib/module/core/PeriodicWave.js.map +1 -0
  152. package/lib/module/core/StereoPannerNode.js +9 -0
  153. package/lib/module/core/StereoPannerNode.js.map +1 -0
  154. package/lib/module/core/types.js +2 -0
  155. package/lib/module/core/types.js.map +1 -0
  156. package/lib/module/errors/IndexSizeError.js +8 -0
  157. package/lib/module/errors/IndexSizeError.js.map +1 -0
  158. package/lib/module/errors/InvalidAccessError.js +8 -0
  159. package/lib/module/errors/InvalidAccessError.js.map +1 -0
  160. package/lib/module/errors/InvalidStateError.js +8 -0
  161. package/lib/module/errors/InvalidStateError.js.map +1 -0
  162. package/lib/module/errors/RangeError.js +8 -0
  163. package/lib/module/errors/RangeError.js.map +1 -0
  164. package/lib/module/errors/index.js +5 -0
  165. package/lib/module/errors/index.js.map +1 -0
  166. package/lib/module/index.js +18 -0
  167. package/lib/module/index.js.map +1 -0
  168. package/lib/module/interfaces.js +2 -0
  169. package/lib/module/interfaces.js.map +1 -0
  170. package/lib/module/modules/global.d.js +2 -0
  171. package/lib/module/modules/global.d.js.map +1 -0
  172. package/lib/module/utils/install.js +22 -0
  173. package/lib/module/utils/install.js.map +1 -0
  174. package/lib/typescript/core/AudioBuffer.d.ts +12 -0
  175. package/lib/typescript/core/AudioBuffer.d.ts.map +1 -0
  176. package/lib/typescript/core/AudioBufferSourceNode.d.ts +12 -0
  177. package/lib/typescript/core/AudioBufferSourceNode.d.ts.map +1 -0
  178. package/lib/typescript/core/AudioContext.d.ts +6 -0
  179. package/lib/typescript/core/AudioContext.d.ts.map +1 -0
  180. package/lib/typescript/core/AudioDestinationNode.d.ts +7 -0
  181. package/lib/typescript/core/AudioDestinationNode.d.ts.map +1 -0
  182. package/lib/typescript/core/AudioNode.d.ts +16 -0
  183. package/lib/typescript/core/AudioNode.d.ts.map +1 -0
  184. package/lib/typescript/core/AudioParam.d.ts +14 -0
  185. package/lib/typescript/core/AudioParam.d.ts.map +1 -0
  186. package/lib/typescript/core/AudioScheduledSourceNode.d.ts +10 -0
  187. package/lib/typescript/core/AudioScheduledSourceNode.d.ts.map +1 -0
  188. package/lib/typescript/core/BaseAudioContext.d.ts +26 -0
  189. package/lib/typescript/core/BaseAudioContext.d.ts.map +1 -0
  190. package/lib/typescript/core/BiquadFilterNode.d.ts +16 -0
  191. package/lib/typescript/core/BiquadFilterNode.d.ts.map +1 -0
  192. package/lib/typescript/core/GainNode.d.ts +9 -0
  193. package/lib/typescript/core/GainNode.d.ts.map +1 -0
  194. package/lib/typescript/core/OscillatorNode.d.ts +15 -0
  195. package/lib/typescript/core/OscillatorNode.d.ts.map +1 -0
  196. package/lib/typescript/core/PeriodicWave.d.ts +5 -0
  197. package/lib/typescript/core/PeriodicWave.d.ts.map +1 -0
  198. package/lib/typescript/core/StereoPannerNode.d.ts +9 -0
  199. package/lib/typescript/core/StereoPannerNode.d.ts.map +1 -0
  200. package/lib/typescript/core/types.d.ts +9 -0
  201. package/lib/typescript/core/types.d.ts.map +1 -0
  202. package/lib/typescript/errors/IndexSizeError.d.ts +5 -0
  203. package/lib/typescript/errors/IndexSizeError.d.ts.map +1 -0
  204. package/lib/typescript/errors/InvalidAccessError.d.ts +5 -0
  205. package/lib/typescript/errors/InvalidAccessError.d.ts.map +1 -0
  206. package/lib/typescript/errors/InvalidStateError.d.ts +5 -0
  207. package/lib/typescript/errors/InvalidStateError.d.ts.map +1 -0
  208. package/lib/typescript/errors/RangeError.d.ts +5 -0
  209. package/lib/typescript/errors/RangeError.d.ts.map +1 -0
  210. package/lib/typescript/errors/index.d.ts +5 -0
  211. package/lib/typescript/errors/index.d.ts.map +1 -0
  212. package/lib/typescript/index.d.ts +14 -0
  213. package/lib/typescript/index.d.ts.map +1 -0
  214. package/lib/typescript/interfaces.d.ts +78 -0
  215. package/lib/typescript/interfaces.d.ts.map +1 -0
  216. package/lib/typescript/utils/install.d.ts +7 -0
  217. package/lib/typescript/utils/install.d.ts.map +1 -0
  218. package/package.json +104 -5
  219. package/src/core/AudioBuffer.ts +68 -0
  220. package/src/core/AudioBufferSourceNode.ts +35 -0
  221. package/src/core/AudioContext.ts +12 -0
  222. package/src/core/AudioDestinationNode.ts +9 -0
  223. package/src/core/AudioNode.ts +38 -0
  224. package/src/core/AudioParam.ts +55 -0
  225. package/src/core/AudioScheduledSourceNode.ts +43 -0
  226. package/src/core/BaseAudioContext.ts +97 -0
  227. package/src/core/BiquadFilterNode.ts +49 -0
  228. package/src/core/GainNode.ts +13 -0
  229. package/src/core/OscillatorNode.ts +37 -0
  230. package/src/core/PeriodicWave.ts +10 -0
  231. package/src/core/StereoPannerNode.ts +13 -0
  232. package/src/core/types.ts +26 -0
  233. package/src/errors/IndexSizeError.ts +8 -0
  234. package/src/errors/InvalidAccessError.ts +8 -0
  235. package/src/errors/InvalidStateError.ts +8 -0
  236. package/src/errors/RangeError.ts +8 -0
  237. package/src/errors/index.ts +4 -0
  238. package/src/index.ts +25 -0
  239. package/src/interfaces.ts +120 -0
  240. package/src/modules/global.d.ts +10 -0
  241. package/src/utils/install.ts +39 -0
  242. package/index.ts +0 -1
@@ -0,0 +1,124 @@
1
+ #pragma once
2
+
3
+ #include <algorithm>
4
+ #include <cmath>
5
+ #include <complex>
6
+ #include <memory>
7
+ #include <stdexcept>
8
+ #include <string>
9
+ #include <vector>
10
+
11
+ #include "AudioNode.h"
12
+ #include "AudioParam.h"
13
+ #include "BiquadFilterType.h"
14
+
15
+ namespace audioapi {
16
+
17
+ class AudioBus;
18
+
19
+ class BiquadFilterNode : public AudioNode {
20
+ public:
21
+ explicit BiquadFilterNode(BaseAudioContext *context);
22
+
23
+ [[nodiscard]] std::string getType();
24
+ void setType(const std::string &type);
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);
33
+
34
+ protected:
35
+ void processNode(AudioBus *processingBus, int framesToProcess) override;
36
+
37
+ private:
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) {
58
+ std::string lowerType = type;
59
+ std::transform(
60
+ lowerType.begin(), lowerType.end(), lowerType.begin(), ::tolower);
61
+
62
+ if (lowerType == "lowpass")
63
+ return BiquadFilterType::LOWPASS;
64
+ if (lowerType == "highpass")
65
+ return BiquadFilterType::HIGHPASS;
66
+ if (lowerType == "bandpass")
67
+ return BiquadFilterType::BANDPASS;
68
+ if (lowerType == "lowshelf")
69
+ return BiquadFilterType::LOWSHELF;
70
+ if (lowerType == "highshelf")
71
+ return BiquadFilterType::HIGHSHELF;
72
+ if (lowerType == "peaking")
73
+ return BiquadFilterType::PEAKING;
74
+ if (lowerType == "notch")
75
+ return BiquadFilterType::NOTCH;
76
+ if (lowerType == "allpass")
77
+ return BiquadFilterType::ALLPASS;
78
+
79
+ throw std::invalid_argument("Invalid filter type: " + type);
80
+ }
81
+
82
+ static std::string toString(BiquadFilterType type) {
83
+ switch (type) {
84
+ case BiquadFilterType::LOWPASS:
85
+ return "lowpass";
86
+ case BiquadFilterType::HIGHPASS:
87
+ return "highpass";
88
+ case BiquadFilterType::BANDPASS:
89
+ return "bandpass";
90
+ case BiquadFilterType::LOWSHELF:
91
+ return "lowshelf";
92
+ case BiquadFilterType::HIGHSHELF:
93
+ return "highshelf";
94
+ case BiquadFilterType::PEAKING:
95
+ return "peaking";
96
+ case BiquadFilterType::NOTCH:
97
+ return "notch";
98
+ case BiquadFilterType::ALLPASS:
99
+ return "allpass";
100
+ default:
101
+ throw std::invalid_argument("Unknown filter type");
102
+ }
103
+ }
104
+
105
+ void resetCoefficients();
106
+ void setNormalizedCoefficients(
107
+ float b0,
108
+ float b1,
109
+ float b2,
110
+ float a0,
111
+ float a1,
112
+ float a2);
113
+ void setLowpassCoefficients(float frequency, float Q);
114
+ void setHighpassCoefficients(float frequency, float Q);
115
+ void setBandpassCoefficients(float frequency, float Q);
116
+ void setLowshelfCoefficients(float frequency, float gain);
117
+ void setHighshelfCoefficients(float frequency, float gain);
118
+ void setPeakingCoefficients(float frequency, float Q, float gain);
119
+ void setNotchCoefficients(float frequency, float Q);
120
+ void setAllpassCoefficients(float frequency, float Q);
121
+ void applyFilter();
122
+ };
123
+
124
+ } // namespace audioapi
@@ -0,0 +1,30 @@
1
+ #include "GainNode.h"
2
+ #include "AudioBus.h"
3
+ #include "AudioArray.h"
4
+ #include "BaseAudioContext.h"
5
+
6
+ namespace audioapi {
7
+
8
+ GainNode::GainNode(BaseAudioContext *context) : AudioNode(context) {
9
+ gainParam_ = std::make_shared<AudioParam>(context, 1.0, -MAX_GAIN, MAX_GAIN);
10
+ isInitialized_ = true;
11
+ }
12
+
13
+ std::shared_ptr<AudioParam> GainNode::getGainParam() const {
14
+ return gainParam_;
15
+ }
16
+
17
+ void GainNode::processNode(AudioBus *processingBus, int framesToProcess) {
18
+ double time = context_->getCurrentTime();
19
+ double deltaTime = 1.0 / context_->getSampleRate();
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
+ }
25
+
26
+ time += deltaTime;
27
+ }
28
+ }
29
+
30
+ } // namespace audioapi
@@ -0,0 +1,25 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+
5
+ #include "AudioNode.h"
6
+ #include "AudioParam.h"
7
+
8
+ namespace audioapi {
9
+
10
+ class AudioBus;
11
+
12
+ class GainNode : public AudioNode {
13
+ public:
14
+ explicit GainNode(BaseAudioContext *context);
15
+
16
+ [[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;
17
+
18
+ protected:
19
+ void processNode(AudioBus *processingBus, int framesToProcess) override;
20
+
21
+ private:
22
+ std::shared_ptr<AudioParam> gainParam_;
23
+ };
24
+
25
+ } // namespace audioapi
@@ -0,0 +1,75 @@
1
+ #include "AudioBus.h"
2
+ #include "AudioArray.h"
3
+ #include "OscillatorNode.h"
4
+ #include "BaseAudioContext.h"
5
+
6
+ namespace audioapi {
7
+
8
+ OscillatorNode::OscillatorNode(BaseAudioContext *context)
9
+ : AudioScheduledSourceNode(context) {
10
+ frequencyParam_ = std::make_shared<AudioParam>(
11
+ context, 444.0, -NYQUIST_FREQUENCY, NYQUIST_FREQUENCY);
12
+ detuneParam_ =
13
+ std::make_shared<AudioParam>(context, 0.0, -MAX_DETUNE, MAX_DETUNE);
14
+ type_ = OscillatorType::SINE;
15
+ periodicWave_ = context_->getBasicWaveForm(type_);
16
+ isInitialized_ = true;
17
+ }
18
+
19
+ std::shared_ptr<AudioParam> OscillatorNode::getFrequencyParam() const {
20
+ return frequencyParam_;
21
+ }
22
+
23
+ std::shared_ptr<AudioParam> OscillatorNode::getDetuneParam() const {
24
+ return detuneParam_;
25
+ }
26
+
27
+ std::string OscillatorNode::getType() {
28
+ return OscillatorNode::toString(type_);
29
+ }
30
+
31
+ void OscillatorNode::setType(const std::string &type) {
32
+ type_ = OscillatorNode::fromString(type);
33
+ periodicWave_ = context_->getBasicWaveForm(type_);
34
+ }
35
+
36
+ void OscillatorNode::setPeriodicWave(
37
+ const std::shared_ptr<PeriodicWave> &periodicWave) {
38
+ periodicWave_ = periodicWave;
39
+ type_ = OscillatorType::CUSTOM;
40
+ }
41
+
42
+ void OscillatorNode::processNode(AudioBus* processingBus, int framesToProcess) {
43
+ if (!isPlaying()) {
44
+ processingBus->zero();
45
+ return;
46
+ }
47
+
48
+ double time = context_->getCurrentTime();
49
+ double deltaTime = 1.0 / context_->getSampleRate();
50
+
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();
57
+
58
+ float sample =
59
+ periodicWave_->getSample(detunedFrequency, phase_, phaseIncrement);
60
+
61
+ for (int j = 0; j < processingBus->getNumberOfChannels(); j += 1) {
62
+ (*processingBus->getChannel(j))[i] = sample;
63
+ }
64
+
65
+ phase_ += phaseIncrement;
66
+ phase_ -=
67
+ floor(
68
+ phase_ / static_cast<float>(periodicWave_->getPeriodicWaveSize())) *
69
+ static_cast<float>(periodicWave_->getPeriodicWaveSize());
70
+
71
+ time += deltaTime;
72
+ }
73
+ }
74
+
75
+ } // namespace audioapi
@@ -0,0 +1,72 @@
1
+ #pragma once
2
+
3
+ #include <cmath>
4
+ #include <memory>
5
+ #include <string>
6
+
7
+ #include "AudioParam.h"
8
+ #include "PeriodicWave.h"
9
+ #include "OscillatorType.h"
10
+ #include "AudioScheduledSourceNode.h"
11
+
12
+ namespace audioapi {
13
+
14
+ class AudioBus;
15
+
16
+ class OscillatorNode : public AudioScheduledSourceNode {
17
+ public:
18
+ explicit OscillatorNode(BaseAudioContext *context);
19
+
20
+ [[nodiscard]] std::shared_ptr<AudioParam> getFrequencyParam() const;
21
+ [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;
22
+ [[nodiscard]] std::string getType();
23
+ void setType(const std::string &type);
24
+ void setPeriodicWave(const std::shared_ptr<PeriodicWave> &periodicWave);
25
+
26
+ protected:
27
+ void processNode(AudioBus *processingBus, int framesToProcess) override;
28
+
29
+ private:
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_;
35
+
36
+ static OscillatorType fromString(const std::string &type) {
37
+ std::string lowerType = type;
38
+ std::transform(
39
+ lowerType.begin(), lowerType.end(), lowerType.begin(), ::tolower);
40
+
41
+ if (lowerType == "sine")
42
+ return OscillatorType::SINE;
43
+ if (lowerType == "square")
44
+ return OscillatorType::SQUARE;
45
+ if (lowerType == "sawtooth")
46
+ return OscillatorType::SAWTOOTH;
47
+ if (lowerType == "triangle")
48
+ return OscillatorType::TRIANGLE;
49
+ if (lowerType == "custom")
50
+ return OscillatorType::CUSTOM;
51
+
52
+ throw std::invalid_argument("Unknown oscillator type: " + type);
53
+ }
54
+
55
+ static std::string toString(OscillatorType type) {
56
+ switch (type) {
57
+ case OscillatorType::SINE:
58
+ return "sine";
59
+ case OscillatorType::SQUARE:
60
+ return "square";
61
+ case OscillatorType::SAWTOOTH:
62
+ return "sawtooth";
63
+ case OscillatorType::TRIANGLE:
64
+ return "triangle";
65
+ case OscillatorType::CUSTOM:
66
+ return "custom";
67
+ default:
68
+ throw std::invalid_argument("Unknown oscillator type");
69
+ }
70
+ }
71
+ };
72
+ } // namespace audioapi
@@ -0,0 +1,46 @@
1
+ #include "ParamChange.h"
2
+
3
+ #include <utility>
4
+
5
+ namespace audioapi {
6
+
7
+ ParamChange::ParamChange(
8
+ double startTime,
9
+ double endTime,
10
+ float startValue,
11
+ float endValue,
12
+ std::function<float(double, double, float, float, double)> calculateValue)
13
+ : startTime_(startTime),
14
+ endTime_(endTime),
15
+ startValue_(startValue),
16
+ endValue_(endValue),
17
+ calculateValue_(std::move(calculateValue)) {}
18
+
19
+ double ParamChange::getEndTime() const {
20
+ return endTime_;
21
+ }
22
+
23
+ double ParamChange::getStartTime() const {
24
+ return startTime_;
25
+ }
26
+
27
+ float ParamChange::getEndValue() const {
28
+ return endValue_;
29
+ }
30
+
31
+ float ParamChange::getStartValue() const {
32
+ return startValue_;
33
+ }
34
+
35
+ std::function<float(double, double, float, float, double)>
36
+ ParamChange::getCalculateValue() const {
37
+ return calculateValue_;
38
+ }
39
+
40
+ bool ParamChange::operator<(const ParamChange &other) const {
41
+ if (startTime_ != other.startTime_)
42
+ return startTime_ < other.startTime_;
43
+ return endTime_ < other.endTime_;
44
+ }
45
+
46
+ } // namespace audioapi
@@ -0,0 +1,34 @@
1
+ #pragma once
2
+
3
+ #include <functional>
4
+ #include <memory>
5
+
6
+ namespace audioapi {
7
+
8
+ class ParamChange {
9
+ public:
10
+ explicit ParamChange(
11
+ double startTime,
12
+ double endTime,
13
+ float startValue,
14
+ float endValue,
15
+ std::function<float(double, double, float, float, double)>
16
+ calculateValue);
17
+
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
+ bool operator<(const ParamChange &other) const;
25
+
26
+ private:
27
+ double startTime_;
28
+ double endTime_;
29
+ float startValue_;
30
+ float endValue_;
31
+ std::function<float(double, double, float, float, double)> calculateValue_;
32
+ };
33
+
34
+ } // namespace audioapi