react-native-tuner-engine 1.0.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 (224) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +188 -0
  3. package/TunerEngine.podspec +32 -0
  4. package/android/build.gradle +86 -0
  5. package/android/src/main/AndroidManifest.xml +3 -0
  6. package/android/src/main/cpp/CMakeLists.txt +31 -0
  7. package/android/src/main/cpp/OboeAudioSource.cpp +101 -0
  8. package/android/src/main/cpp/OboeAudioSource.h +41 -0
  9. package/android/src/main/cpp/TunerEngineJni.cpp +220 -0
  10. package/android/src/main/java/com/tunerengine/TunerEngineModule.kt +183 -0
  11. package/android/src/main/java/com/tunerengine/TunerEnginePackage.kt +31 -0
  12. package/cpp/CMakeLists.txt +25 -0
  13. package/cpp/build/CMakeCache.txt +347 -0
  14. package/cpp/build/CMakeFiles/4.3.2/CMakeCXXCompiler.cmake +102 -0
  15. package/cpp/build/CMakeFiles/4.3.2/CMakeDetermineCompilerABI_CXX.bin +0 -0
  16. package/cpp/build/CMakeFiles/4.3.2/CMakeSystem.cmake +15 -0
  17. package/cpp/build/CMakeFiles/4.3.2/CompilerIdCXX/CMakeCXXCompilerId.cpp +949 -0
  18. package/cpp/build/CMakeFiles/4.3.2/CompilerIdCXX/a.out +0 -0
  19. package/cpp/build/CMakeFiles/4.3.2/CompilerIdCXX/apple-sdk.cpp +1 -0
  20. package/cpp/build/CMakeFiles/CMakeConfigureLog.yaml +1619 -0
  21. package/cpp/build/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  22. package/cpp/build/CMakeFiles/InstallScripts.json +7 -0
  23. package/cpp/build/CMakeFiles/Makefile.cmake +118 -0
  24. package/cpp/build/CMakeFiles/Makefile2 +122 -0
  25. package/cpp/build/CMakeFiles/TargetDirectories.txt +3 -0
  26. package/cpp/build/CMakeFiles/cmake.check_cache +1 -0
  27. package/cpp/build/CMakeFiles/progress.marks +1 -0
  28. package/cpp/build/CMakeFiles/tuner_engine_core.dir/DependInfo.cmake +36 -0
  29. package/cpp/build/CMakeFiles/tuner_engine_core.dir/build.make +322 -0
  30. package/cpp/build/CMakeFiles/tuner_engine_core.dir/cmake_clean.cmake +37 -0
  31. package/cpp/build/CMakeFiles/tuner_engine_core.dir/cmake_clean_target.cmake +3 -0
  32. package/cpp/build/CMakeFiles/tuner_engine_core.dir/compiler_depend.make +2 -0
  33. package/cpp/build/CMakeFiles/tuner_engine_core.dir/compiler_depend.ts +2 -0
  34. package/cpp/build/CMakeFiles/tuner_engine_core.dir/depend.make +2 -0
  35. package/cpp/build/CMakeFiles/tuner_engine_core.dir/flags.make +12 -0
  36. package/cpp/build/CMakeFiles/tuner_engine_core.dir/link.txt +2 -0
  37. package/cpp/build/CMakeFiles/tuner_engine_core.dir/progress.make +16 -0
  38. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/AudioFrameDispatcher.cpp.o +0 -0
  39. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/AudioFrameDispatcher.cpp.o.d +814 -0
  40. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/BiquadHpf.cpp.o +0 -0
  41. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/BiquadHpf.cpp.o.d +206 -0
  42. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/CepstrumPitchDetector.cpp.o +0 -0
  43. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/CepstrumPitchDetector.cpp.o.d +797 -0
  44. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/EnsembleSelector.cpp.o +0 -0
  45. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/EnsembleSelector.cpp.o.d +755 -0
  46. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/NoteMapper.cpp.o +0 -0
  47. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/NoteMapper.cpp.o.d +669 -0
  48. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/OnsetDetector.cpp.o +0 -0
  49. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/OnsetDetector.cpp.o.d +648 -0
  50. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/Pipeline.cpp.o +0 -0
  51. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/Pipeline.cpp.o.d +765 -0
  52. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/PostProcessor.cpp.o +0 -0
  53. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/PostProcessor.cpp.o.d +648 -0
  54. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/PyinPitchDetector.cpp.o +0 -0
  55. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/PyinPitchDetector.cpp.o.d +755 -0
  56. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/SnrEstimator.cpp.o +0 -0
  57. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/SnrEstimator.cpp.o.d +648 -0
  58. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/StringMatcher.cpp.o +0 -0
  59. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/StringMatcher.cpp.o.d +665 -0
  60. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/TunerEngine.cpp.o +0 -0
  61. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/TunerEngine.cpp.o.d +811 -0
  62. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/Window.cpp.o +0 -0
  63. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/Window.cpp.o.d +754 -0
  64. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/YinPitchDetector.cpp.o +0 -0
  65. package/cpp/build/CMakeFiles/tuner_engine_core.dir/src/YinPitchDetector.cpp.o.d +755 -0
  66. package/cpp/build/Makefile +532 -0
  67. package/cpp/build/cmake_install.cmake +61 -0
  68. package/cpp/build/libtuner_engine_core.a +0 -0
  69. package/cpp/include/AudioFrameDispatcher.hpp +87 -0
  70. package/cpp/include/BiquadHpf.hpp +22 -0
  71. package/cpp/include/CepstrumPitchDetector.hpp +33 -0
  72. package/cpp/include/EnsembleSelector.hpp +25 -0
  73. package/cpp/include/Fft.hpp +44 -0
  74. package/cpp/include/IPitchDetector.hpp +21 -0
  75. package/cpp/include/InstrumentPresets.hpp +33 -0
  76. package/cpp/include/NoteMapper.hpp +15 -0
  77. package/cpp/include/OnsetDetector.hpp +37 -0
  78. package/cpp/include/Pipeline.hpp +55 -0
  79. package/cpp/include/PitchResult.hpp +24 -0
  80. package/cpp/include/PostProcessor.hpp +51 -0
  81. package/cpp/include/PyinPitchDetector.hpp +35 -0
  82. package/cpp/include/RingBuffer.hpp +72 -0
  83. package/cpp/include/SnrEstimator.hpp +21 -0
  84. package/cpp/include/StringMatcher.hpp +27 -0
  85. package/cpp/include/TunerEngine.hpp +32 -0
  86. package/cpp/include/TuningPresets.hpp +103 -0
  87. package/cpp/include/Window.hpp +13 -0
  88. package/cpp/include/YinPitchDetector.hpp +37 -0
  89. package/cpp/src/AudioFrameDispatcher.cpp +180 -0
  90. package/cpp/src/BiquadHpf.cpp +35 -0
  91. package/cpp/src/CepstrumPitchDetector.cpp +116 -0
  92. package/cpp/src/EnsembleSelector.cpp +91 -0
  93. package/cpp/src/NoteMapper.cpp +47 -0
  94. package/cpp/src/OnsetDetector.cpp +39 -0
  95. package/cpp/src/Pipeline.cpp +133 -0
  96. package/cpp/src/PostProcessor.cpp +111 -0
  97. package/cpp/src/PyinPitchDetector.cpp +134 -0
  98. package/cpp/src/SnrEstimator.cpp +33 -0
  99. package/cpp/src/StringMatcher.cpp +37 -0
  100. package/cpp/src/TunerEngine.cpp +67 -0
  101. package/cpp/src/Window.cpp +21 -0
  102. package/cpp/src/YinPitchDetector.cpp +118 -0
  103. package/cpp/tests/CMakeLists.txt +23 -0
  104. package/cpp/tests/bench.cpp +160 -0
  105. package/cpp/tests/build/CMakeCache.txt +356 -0
  106. package/cpp/tests/build/CMakeFiles/4.3.2/CMakeCXXCompiler.cmake +102 -0
  107. package/cpp/tests/build/CMakeFiles/4.3.2/CMakeDetermineCompilerABI_CXX.bin +0 -0
  108. package/cpp/tests/build/CMakeFiles/4.3.2/CMakeSystem.cmake +15 -0
  109. package/cpp/tests/build/CMakeFiles/4.3.2/CompilerIdCXX/CMakeCXXCompilerId.cpp +949 -0
  110. package/cpp/tests/build/CMakeFiles/4.3.2/CompilerIdCXX/a.out +0 -0
  111. package/cpp/tests/build/CMakeFiles/4.3.2/CompilerIdCXX/apple-sdk.cpp +1 -0
  112. package/cpp/tests/build/CMakeFiles/CMakeConfigureLog.yaml +1619 -0
  113. package/cpp/tests/build/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  114. package/cpp/tests/build/CMakeFiles/InstallScripts.json +8 -0
  115. package/cpp/tests/build/CMakeFiles/Makefile.cmake +122 -0
  116. package/cpp/tests/build/CMakeFiles/Makefile2 +211 -0
  117. package/cpp/tests/build/CMakeFiles/TargetDirectories.txt +9 -0
  118. package/cpp/tests/build/CMakeFiles/cmake.check_cache +1 -0
  119. package/cpp/tests/build/CMakeFiles/progress.marks +1 -0
  120. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/DependInfo.cmake +23 -0
  121. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/bench.cpp.o +0 -0
  122. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/bench.cpp.o.d +813 -0
  123. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/build.make +114 -0
  124. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/cmake_clean.cmake +11 -0
  125. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/compiler_depend.make +2 -0
  126. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/compiler_depend.ts +2 -0
  127. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/depend.make +2 -0
  128. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/flags.make +12 -0
  129. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/link.txt +1 -0
  130. package/cpp/tests/build/CMakeFiles/tuner_engine_bench.dir/progress.make +3 -0
  131. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/DependInfo.cmake +23 -0
  132. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/build.make +114 -0
  133. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/cmake_clean.cmake +11 -0
  134. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/compiler_depend.make +2 -0
  135. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/compiler_depend.ts +2 -0
  136. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/depend.make +2 -0
  137. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/flags.make +12 -0
  138. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/link.txt +1 -0
  139. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/main.cpp.o +0 -0
  140. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/main.cpp.o.d +823 -0
  141. package/cpp/tests/build/CMakeFiles/tuner_engine_tests.dir/progress.make +3 -0
  142. package/cpp/tests/build/CTestTestfile.cmake +9 -0
  143. package/cpp/tests/build/Makefile +247 -0
  144. package/cpp/tests/build/cmake_install.cmake +66 -0
  145. package/cpp/tests/build/tuner_engine_bench +0 -0
  146. package/cpp/tests/build/tuner_engine_core/CMakeFiles/CMakeDirectoryInformation.cmake +16 -0
  147. package/cpp/tests/build/tuner_engine_core/CMakeFiles/progress.marks +1 -0
  148. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/DependInfo.cmake +36 -0
  149. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/build.make +322 -0
  150. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/cmake_clean.cmake +37 -0
  151. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/cmake_clean_target.cmake +3 -0
  152. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/compiler_depend.make +2 -0
  153. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/compiler_depend.ts +2 -0
  154. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/depend.make +2 -0
  155. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/flags.make +12 -0
  156. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/link.txt +2 -0
  157. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/progress.make +16 -0
  158. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/AudioFrameDispatcher.cpp.o +0 -0
  159. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/AudioFrameDispatcher.cpp.o.d +814 -0
  160. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/BiquadHpf.cpp.o +0 -0
  161. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/BiquadHpf.cpp.o.d +206 -0
  162. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/CepstrumPitchDetector.cpp.o +0 -0
  163. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/CepstrumPitchDetector.cpp.o.d +797 -0
  164. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/EnsembleSelector.cpp.o +0 -0
  165. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/EnsembleSelector.cpp.o.d +755 -0
  166. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/NoteMapper.cpp.o +0 -0
  167. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/NoteMapper.cpp.o.d +669 -0
  168. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/OnsetDetector.cpp.o +0 -0
  169. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/OnsetDetector.cpp.o.d +648 -0
  170. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/Pipeline.cpp.o +0 -0
  171. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/Pipeline.cpp.o.d +765 -0
  172. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/PostProcessor.cpp.o +0 -0
  173. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/PostProcessor.cpp.o.d +648 -0
  174. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/PyinPitchDetector.cpp.o +0 -0
  175. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/PyinPitchDetector.cpp.o.d +755 -0
  176. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/SnrEstimator.cpp.o +0 -0
  177. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/SnrEstimator.cpp.o.d +648 -0
  178. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/StringMatcher.cpp.o +0 -0
  179. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/StringMatcher.cpp.o.d +665 -0
  180. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/TunerEngine.cpp.o +0 -0
  181. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/TunerEngine.cpp.o.d +811 -0
  182. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/Window.cpp.o +0 -0
  183. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/Window.cpp.o.d +754 -0
  184. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/YinPitchDetector.cpp.o +0 -0
  185. package/cpp/tests/build/tuner_engine_core/CMakeFiles/tuner_engine_core.dir/src/YinPitchDetector.cpp.o.d +755 -0
  186. package/cpp/tests/build/tuner_engine_core/Makefile +544 -0
  187. package/cpp/tests/build/tuner_engine_core/cmake_install.cmake +45 -0
  188. package/cpp/tests/build/tuner_engine_core/libtuner_engine_core.a +0 -0
  189. package/cpp/tests/build/tuner_engine_tests +0 -0
  190. package/cpp/tests/main.cpp +624 -0
  191. package/ios/IosAudioSource.h +23 -0
  192. package/ios/IosAudioSource.mm +174 -0
  193. package/ios/TunerBridge.h +24 -0
  194. package/ios/TunerBridge.mm +136 -0
  195. package/ios/TunerEngine.h +6 -0
  196. package/ios/TunerEngine.mm +144 -0
  197. package/lib/module/NativeTunerEngine.js +5 -0
  198. package/lib/module/NativeTunerEngine.js.map +1 -0
  199. package/lib/module/TunerEngine.js +43 -0
  200. package/lib/module/TunerEngine.js.map +1 -0
  201. package/lib/module/index.js +5 -0
  202. package/lib/module/index.js.map +1 -0
  203. package/lib/module/package.json +1 -0
  204. package/lib/module/types.js +2 -0
  205. package/lib/module/types.js.map +1 -0
  206. package/lib/module/useTuner.js +55 -0
  207. package/lib/module/useTuner.js.map +1 -0
  208. package/lib/typescript/package.json +1 -0
  209. package/lib/typescript/src/NativeTunerEngine.d.ts +17 -0
  210. package/lib/typescript/src/NativeTunerEngine.d.ts.map +1 -0
  211. package/lib/typescript/src/TunerEngine.d.ts +18 -0
  212. package/lib/typescript/src/TunerEngine.d.ts.map +1 -0
  213. package/lib/typescript/src/index.d.ts +4 -0
  214. package/lib/typescript/src/index.d.ts.map +1 -0
  215. package/lib/typescript/src/types.d.ts +86 -0
  216. package/lib/typescript/src/types.d.ts.map +1 -0
  217. package/lib/typescript/src/useTuner.d.ts +15 -0
  218. package/lib/typescript/src/useTuner.d.ts.map +1 -0
  219. package/package.json +141 -0
  220. package/src/NativeTunerEngine.ts +17 -0
  221. package/src/TunerEngine.ts +62 -0
  222. package/src/index.tsx +11 -0
  223. package/src/types.ts +109 -0
  224. package/src/useTuner.ts +67 -0
@@ -0,0 +1,4 @@
1
+ export { default as TunerEngine } from './TunerEngine';
2
+ export { useTuner } from './useTuner';
3
+ export type { EngineStatus, Instrument, PitchEvent, QualityPreset, Temperament, TunerConfig, TuningPreset, } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EACV,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,YAAY,GACb,MAAM,SAAS,CAAC"}
@@ -0,0 +1,86 @@
1
+ export type Instrument = 'guitar' | 'bass' | 'violin' | 'viola' | 'cello' | 'ukulele' | 'mandolin' | 'banjo' | 'chromatic';
2
+ export type Temperament = 'equal' | 'just';
3
+ /**
4
+ * Quality preset that maps to a frame size + overlap combination.
5
+ * - low-latency: frameSize=1024, overlap=0 — fastest response, less accuracy on low notes
6
+ * - balanced: frameSize=2048, overlap=0.5 — good for most instruments
7
+ * - high-accuracy: frameSize=4096, overlap=0.75 — best for bass/cello, ~21ms update rate
8
+ */
9
+ export type QualityPreset = 'low-latency' | 'balanced' | 'high-accuracy';
10
+ export type TunerConfig = {
11
+ /** Audio sample rate in Hz. Default: 48000 */
12
+ sampleRate?: number;
13
+ /** DSP frame size in samples. Default: 2048 */
14
+ frameSize?: number;
15
+ /** Noise gate threshold in dBFS. Frames quieter than this are ignored. Default: -55 */
16
+ noiseGateDb?: number;
17
+ /** Minimum detector confidence (0–1) to emit a pitch event. Default: 0.75 */
18
+ confidenceThreshold?: number;
19
+ /** Lowest frequency to detect in Hz. Default: 60 */
20
+ minFrequency?: number;
21
+ /** Highest frequency to detect in Hz. Default: 1200 */
22
+ maxFrequency?: number;
23
+ /** A4 reference pitch in Hz. Default: 440 */
24
+ a4?: number;
25
+ /**
26
+ * PostProcessor EMA smoothing factor (0.05–1.0). Lower = smoother/slower,
27
+ * higher = more responsive but jittery. Default: 0.35
28
+ */
29
+ emaAlpha?: number;
30
+ /**
31
+ * Consecutive frames required to confirm a note change (1–10).
32
+ * Higher = more stable note display, lower = faster switching. Default: 3
33
+ */
34
+ hysteresisFrames?: number;
35
+ /**
36
+ * High-pass filter cutoff in Hz (20–300). Cuts rumble below this frequency.
37
+ * Lower for bass guitar (e.g. 30), higher for violin (e.g. 100). Default: 70
38
+ */
39
+ hpfCutoffHz?: number;
40
+ /**
41
+ * Enable onset detection. When enabled, the PostProcessor resets on note
42
+ * attacks for faster response. Minimal CPU cost (one comparison per frame).
43
+ * Default: false
44
+ */
45
+ onsetDetection?: boolean;
46
+ /**
47
+ * Fraction of the frame that overlaps with the previous frame (0.0–0.75).
48
+ * Higher overlap gives more frequent pitch updates at the cost of CPU.
49
+ * - 0.0: no overlap (default, backward-compatible)
50
+ * - 0.5: 50% overlap (2x update rate)
51
+ * - 0.75: 75% overlap (4x update rate)
52
+ * Default: 0
53
+ */
54
+ overlapRatio?: number;
55
+ /**
56
+ * When true, frame size is automatically selected based on the configured instrument.
57
+ * Bass and cello use 4096 for better low-frequency resolution; others use 2048.
58
+ * Overridden if frameSize is explicitly provided.
59
+ * Default: true
60
+ */
61
+ adaptiveFrameSize?: boolean;
62
+ /**
63
+ * Quality preset that configures frameSize and overlapRatio together.
64
+ * Overrides individual frameSize/overlapRatio if provided.
65
+ */
66
+ quality?: QualityPreset;
67
+ };
68
+ export type TuningPreset = 'guitar_standard' | 'guitar_drop_d' | 'guitar_open_g' | 'bass_standard' | 'bass_drop_d' | 'violin_standard' | 'viola_standard' | 'cello_standard' | 'ukulele_standard';
69
+ export type PitchEvent = {
70
+ hasPitch: boolean;
71
+ frequency: number;
72
+ confidence: number;
73
+ rmsDb: number;
74
+ noteName: string;
75
+ octave: number;
76
+ cents: number;
77
+ /** Nearest string in the active tuning, e.g. "E2". Empty string when no tuning is set. */
78
+ nearestString: string;
79
+ /** Cents deviation from that string's target frequency (negative = flat). */
80
+ stringDeviation: number;
81
+ };
82
+ export type EngineStatus = {
83
+ isRunning: boolean;
84
+ engineReady: boolean;
85
+ };
86
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,OAAO,GACP,OAAO,GACP,SAAS,GACT,UAAU,GACV,OAAO,GACP,WAAW,CAAC;AAEhB,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,UAAU,GAAG,eAAe,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG;IACxB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,eAAe,GACf,aAAa,GACb,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,aAAa,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Instrument, PitchEvent, TunerConfig } from './types';
2
+ type UseTunerOptions = TunerConfig & {
3
+ instrument?: Instrument;
4
+ a4?: number;
5
+ };
6
+ type UseTunerResult = {
7
+ start: () => Promise<void>;
8
+ stop: () => Promise<void>;
9
+ latest: PitchEvent | null;
10
+ isRunning: boolean;
11
+ error: Error | null;
12
+ };
13
+ export declare function useTuner(opts?: UseTunerOptions): UseTunerResult;
14
+ export {};
15
+ //# sourceMappingURL=useTuner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTuner.d.ts","sourceRoot":"","sources":["../../../src/useTuner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEnE,KAAK,eAAe,GAAG,WAAW,GAAG;IACnC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,cAAc,CAiDnE"}
package/package.json ADDED
@@ -0,0 +1,141 @@
1
+ {
2
+ "name": "react-native-tuner-engine",
3
+ "version": "1.0.0",
4
+ "description": "A high-performance React Native Turbo Module for real-time instrument tuning with native audio processing and pitch detection.",
5
+ "main": "./lib/module/index.js",
6
+ "source": "./src/index.tsx",
7
+ "types": "./lib/typescript/src/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "source": "./src/index.tsx",
11
+ "types": "./lib/typescript/src/index.d.ts",
12
+ "default": "./lib/module/index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "files": [
17
+ "src",
18
+ "lib",
19
+ "android",
20
+ "ios",
21
+ "cpp",
22
+ "*.podspec",
23
+ "react-native.config.js",
24
+ "!ios/build",
25
+ "!android/build",
26
+ "!android/gradle",
27
+ "!android/gradlew",
28
+ "!android/gradlew.bat",
29
+ "!android/local.properties",
30
+ "!**/__tests__",
31
+ "!**/__fixtures__",
32
+ "!**/__mocks__",
33
+ "!**/.*"
34
+ ],
35
+ "scripts": {
36
+ "example": "yarn workspace react-native-tuner-engine-example",
37
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
38
+ "prepare": "bob build",
39
+ "typecheck": "tsc",
40
+ "test": "jest",
41
+ "test:cpp": "cmake --build cpp/build --target tuner_engine_tests && ./cpp/build/tuner_engine_tests",
42
+ "lint": "eslint \"**/*.{js,ts,tsx}\""
43
+ },
44
+ "keywords": [
45
+ "react-native",
46
+ "ios",
47
+ "android"
48
+ ],
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "git+https://github.com/denizyesilirmak/react-native-tuner-engine.git"
52
+ },
53
+ "author": "denizyesilirmak <denizyesilirmak@gmail.com> (https://github.com/denizyesilirmak)",
54
+ "license": "MIT",
55
+ "bugs": {
56
+ "url": "https://github.com/denizyesilirmak/react-native-tuner-engine/issues"
57
+ },
58
+ "homepage": "https://github.com/denizyesilirmak/react-native-tuner-engine#readme",
59
+ "publishConfig": {
60
+ "registry": "https://registry.npmjs.org/"
61
+ },
62
+ "devDependencies": {
63
+ "@eslint/compat": "^2.0.3",
64
+ "@eslint/eslintrc": "^3.3.5",
65
+ "@eslint/js": "^10.0.1",
66
+ "@jest/globals": "^30.0.0",
67
+ "@react-native/babel-preset": "0.85.0",
68
+ "@react-native/eslint-config": "0.85.0",
69
+ "@react-native/jest-preset": "0.85.0",
70
+ "@types/react": "^19.2.0",
71
+ "del-cli": "^7.0.0",
72
+ "eslint": "^9.39.4",
73
+ "eslint-config-prettier": "^10.1.8",
74
+ "eslint-plugin-prettier": "^5.5.5",
75
+ "jest": "30.4.1",
76
+ "prettier": "^3.8.1",
77
+ "react": "19.2.3",
78
+ "react-native": "0.85.0",
79
+ "react-native-builder-bob": "^0.41.0",
80
+ "turbo": "^2.8.21",
81
+ "typescript": "^6.0.2"
82
+ },
83
+ "peerDependencies": {
84
+ "react": "*",
85
+ "react-native": "*"
86
+ },
87
+ "workspaces": [
88
+ "example"
89
+ ],
90
+ "packageManager": "yarn@4.11.0",
91
+ "react-native-builder-bob": {
92
+ "source": "src",
93
+ "output": "lib",
94
+ "targets": [
95
+ [
96
+ "module",
97
+ {
98
+ "esm": true
99
+ }
100
+ ],
101
+ [
102
+ "typescript",
103
+ {
104
+ "project": "tsconfig.build.json"
105
+ }
106
+ ]
107
+ ]
108
+ },
109
+ "codegenConfig": {
110
+ "name": "TunerEngineSpec",
111
+ "type": "modules",
112
+ "jsSrcsDir": "src",
113
+ "android": {
114
+ "javaPackageName": "com.tunerengine"
115
+ }
116
+ },
117
+ "jest": {
118
+ "preset": "@react-native/jest-preset",
119
+ "testEnvironment": "node",
120
+ "modulePathIgnorePatterns": [
121
+ "<rootDir>/example/node_modules",
122
+ "<rootDir>/lib/"
123
+ ]
124
+ },
125
+ "prettier": {
126
+ "quoteProps": "consistent",
127
+ "singleQuote": true,
128
+ "tabWidth": 2,
129
+ "trailingComma": "es5",
130
+ "useTabs": false
131
+ },
132
+ "create-react-native-library": {
133
+ "type": "turbo-module",
134
+ "languages": "kotlin-objc",
135
+ "tools": [
136
+ "jest",
137
+ "eslint"
138
+ ],
139
+ "version": "0.62.0"
140
+ }
141
+ }
@@ -0,0 +1,17 @@
1
+ import { TurboModuleRegistry, type TurboModule } from 'react-native';
2
+
3
+ export interface Spec extends TurboModule {
4
+ configure(opts: Object): Promise<void>;
5
+ start(): Promise<void>;
6
+ stop(): Promise<void>;
7
+ setA4(hz: number): void;
8
+ setInstrument(name: string): void;
9
+ setTemperament(name: string): void;
10
+ setTuning(name: string): void;
11
+ requestPermission(): Promise<boolean>;
12
+ getStatus(): Object;
13
+ addListener(eventName: string): void;
14
+ removeListeners(count: number): void;
15
+ }
16
+
17
+ export default TurboModuleRegistry.getEnforcing<Spec>('TunerEngine');
@@ -0,0 +1,62 @@
1
+ import { DeviceEventEmitter } from 'react-native';
2
+ import NativeTunerEngine from './NativeTunerEngine';
3
+ import type {
4
+ EngineStatus,
5
+ Instrument,
6
+ PitchEvent,
7
+ Temperament,
8
+ TunerConfig,
9
+ TuningPreset,
10
+ } from './types';
11
+
12
+ type PitchCallback = (event: PitchEvent) => void;
13
+ type Unsubscribe = () => void;
14
+
15
+ class TunerEngine {
16
+ configure(opts: TunerConfig): Promise<void> {
17
+ return NativeTunerEngine.configure(opts);
18
+ }
19
+
20
+ start(): Promise<void> {
21
+ return NativeTunerEngine.start();
22
+ }
23
+
24
+ stop(): Promise<void> {
25
+ return NativeTunerEngine.stop();
26
+ }
27
+
28
+ requestPermission(): Promise<boolean> {
29
+ return NativeTunerEngine.requestPermission();
30
+ }
31
+
32
+ setA4(hz: number): void {
33
+ NativeTunerEngine.setA4(hz);
34
+ }
35
+
36
+ setInstrument(name: Instrument): void {
37
+ NativeTunerEngine.setInstrument(name);
38
+ }
39
+
40
+ setTemperament(name: Temperament): void {
41
+ NativeTunerEngine.setTemperament(name);
42
+ }
43
+
44
+ setTuning(name: TuningPreset | ''): void {
45
+ NativeTunerEngine.setTuning(name);
46
+ }
47
+
48
+ getStatus(): EngineStatus {
49
+ return NativeTunerEngine.getStatus() as EngineStatus;
50
+ }
51
+
52
+ onPitch(callback: PitchCallback): Unsubscribe {
53
+ (globalThis as any).__tunerEngineOnPitch = callback;
54
+ const sub = DeviceEventEmitter.addListener('onPitch', callback);
55
+ return () => {
56
+ (globalThis as any).__tunerEngineOnPitch = undefined;
57
+ sub.remove();
58
+ };
59
+ }
60
+ }
61
+
62
+ export default new TunerEngine();
package/src/index.tsx ADDED
@@ -0,0 +1,11 @@
1
+ export { default as TunerEngine } from './TunerEngine';
2
+ export { useTuner } from './useTuner';
3
+ export type {
4
+ EngineStatus,
5
+ Instrument,
6
+ PitchEvent,
7
+ QualityPreset,
8
+ Temperament,
9
+ TunerConfig,
10
+ TuningPreset,
11
+ } from './types';
package/src/types.ts ADDED
@@ -0,0 +1,109 @@
1
+ export type Instrument =
2
+ | 'guitar'
3
+ | 'bass'
4
+ | 'violin'
5
+ | 'viola'
6
+ | 'cello'
7
+ | 'ukulele'
8
+ | 'mandolin'
9
+ | 'banjo'
10
+ | 'chromatic';
11
+
12
+ export type Temperament = 'equal' | 'just';
13
+
14
+ /**
15
+ * Quality preset that maps to a frame size + overlap combination.
16
+ * - low-latency: frameSize=1024, overlap=0 — fastest response, less accuracy on low notes
17
+ * - balanced: frameSize=2048, overlap=0.5 — good for most instruments
18
+ * - high-accuracy: frameSize=4096, overlap=0.75 — best for bass/cello, ~21ms update rate
19
+ */
20
+ export type QualityPreset = 'low-latency' | 'balanced' | 'high-accuracy';
21
+
22
+ export type TunerConfig = {
23
+ /** Audio sample rate in Hz. Default: 48000 */
24
+ sampleRate?: number;
25
+ /** DSP frame size in samples. Default: 2048 */
26
+ frameSize?: number;
27
+ /** Noise gate threshold in dBFS. Frames quieter than this are ignored. Default: -55 */
28
+ noiseGateDb?: number;
29
+ /** Minimum detector confidence (0–1) to emit a pitch event. Default: 0.75 */
30
+ confidenceThreshold?: number;
31
+ /** Lowest frequency to detect in Hz. Default: 60 */
32
+ minFrequency?: number;
33
+ /** Highest frequency to detect in Hz. Default: 1200 */
34
+ maxFrequency?: number;
35
+ /** A4 reference pitch in Hz. Default: 440 */
36
+ a4?: number;
37
+ /**
38
+ * PostProcessor EMA smoothing factor (0.05–1.0). Lower = smoother/slower,
39
+ * higher = more responsive but jittery. Default: 0.35
40
+ */
41
+ emaAlpha?: number;
42
+ /**
43
+ * Consecutive frames required to confirm a note change (1–10).
44
+ * Higher = more stable note display, lower = faster switching. Default: 3
45
+ */
46
+ hysteresisFrames?: number;
47
+ /**
48
+ * High-pass filter cutoff in Hz (20–300). Cuts rumble below this frequency.
49
+ * Lower for bass guitar (e.g. 30), higher for violin (e.g. 100). Default: 70
50
+ */
51
+ hpfCutoffHz?: number;
52
+ /**
53
+ * Enable onset detection. When enabled, the PostProcessor resets on note
54
+ * attacks for faster response. Minimal CPU cost (one comparison per frame).
55
+ * Default: false
56
+ */
57
+ onsetDetection?: boolean;
58
+ /**
59
+ * Fraction of the frame that overlaps with the previous frame (0.0–0.75).
60
+ * Higher overlap gives more frequent pitch updates at the cost of CPU.
61
+ * - 0.0: no overlap (default, backward-compatible)
62
+ * - 0.5: 50% overlap (2x update rate)
63
+ * - 0.75: 75% overlap (4x update rate)
64
+ * Default: 0
65
+ */
66
+ overlapRatio?: number;
67
+ /**
68
+ * When true, frame size is automatically selected based on the configured instrument.
69
+ * Bass and cello use 4096 for better low-frequency resolution; others use 2048.
70
+ * Overridden if frameSize is explicitly provided.
71
+ * Default: true
72
+ */
73
+ adaptiveFrameSize?: boolean;
74
+ /**
75
+ * Quality preset that configures frameSize and overlapRatio together.
76
+ * Overrides individual frameSize/overlapRatio if provided.
77
+ */
78
+ quality?: QualityPreset;
79
+ };
80
+
81
+ export type TuningPreset =
82
+ | 'guitar_standard'
83
+ | 'guitar_drop_d'
84
+ | 'guitar_open_g'
85
+ | 'bass_standard'
86
+ | 'bass_drop_d'
87
+ | 'violin_standard'
88
+ | 'viola_standard'
89
+ | 'cello_standard'
90
+ | 'ukulele_standard';
91
+
92
+ export type PitchEvent = {
93
+ hasPitch: boolean;
94
+ frequency: number;
95
+ confidence: number;
96
+ rmsDb: number;
97
+ noteName: string;
98
+ octave: number;
99
+ cents: number;
100
+ /** Nearest string in the active tuning, e.g. "E2". Empty string when no tuning is set. */
101
+ nearestString: string;
102
+ /** Cents deviation from that string's target frequency (negative = flat). */
103
+ stringDeviation: number;
104
+ };
105
+
106
+ export type EngineStatus = {
107
+ isRunning: boolean;
108
+ engineReady: boolean;
109
+ };
@@ -0,0 +1,67 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import TunerEngine from './TunerEngine';
3
+ import type { Instrument, PitchEvent, TunerConfig } from './types';
4
+
5
+ type UseTunerOptions = TunerConfig & {
6
+ instrument?: Instrument;
7
+ a4?: number;
8
+ };
9
+
10
+ type UseTunerResult = {
11
+ start: () => Promise<void>;
12
+ stop: () => Promise<void>;
13
+ latest: PitchEvent | null;
14
+ isRunning: boolean;
15
+ error: Error | null;
16
+ };
17
+
18
+ export function useTuner(opts: UseTunerOptions = {}): UseTunerResult {
19
+ const [latest, setLatest] = useState<PitchEvent | null>(null);
20
+ const [isRunning, setIsRunning] = useState(false);
21
+ const [error, setError] = useState<Error | null>(null);
22
+
23
+ const optsRef = useRef(opts);
24
+ optsRef.current = opts;
25
+
26
+ const unsubscribeRef = useRef<(() => void) | null>(null);
27
+
28
+ const stop = useCallback(async () => {
29
+ unsubscribeRef.current?.();
30
+ unsubscribeRef.current = null;
31
+ await TunerEngine.stop();
32
+ setIsRunning(false);
33
+ }, []);
34
+
35
+ const start = useCallback(async () => {
36
+ setError(null);
37
+ try {
38
+ const granted = await TunerEngine.requestPermission();
39
+ if (!granted) {
40
+ throw new Error('Microphone permission denied');
41
+ }
42
+
43
+ const { instrument, a4, ...config } = optsRef.current;
44
+ await TunerEngine.configure(config);
45
+
46
+ if (instrument) TunerEngine.setInstrument(instrument);
47
+ if (a4 !== undefined) TunerEngine.setA4(a4);
48
+
49
+ unsubscribeRef.current = TunerEngine.onPitch(setLatest);
50
+
51
+ await TunerEngine.start();
52
+ setIsRunning(true);
53
+ } catch (e) {
54
+ setError(e instanceof Error ? e : new Error(String(e)));
55
+ setIsRunning(false);
56
+ }
57
+ }, []);
58
+
59
+ useEffect(() => {
60
+ return () => {
61
+ unsubscribeRef.current?.();
62
+ TunerEngine.stop();
63
+ };
64
+ }, []);
65
+
66
+ return { start, stop, latest, isRunning, error };
67
+ }