react-native-simple-note-pitch-detector 0.6.1 → 0.7.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 (37) hide show
  1. package/android/src/main/java/expo/modules/simplenotepitchdetector/PitchAnalyzer.kt +2 -2
  2. package/build/ReactNativeSimpleNotePitchDetector.types.d.ts +0 -3
  3. package/build/ReactNativeSimpleNotePitchDetector.types.d.ts.map +1 -1
  4. package/build/ReactNativeSimpleNotePitchDetector.types.js.map +1 -1
  5. package/build/index.d.ts +5 -5
  6. package/build/index.d.ts.map +1 -1
  7. package/build/index.js +2 -5
  8. package/build/index.js.map +1 -1
  9. package/package.json +6 -4
  10. package/src/ReactNativeSimpleNotePitchDetector.types.ts +0 -4
  11. package/src/index.ts +7 -17
  12. package/android/.gradle/9.0-milestone-1/checksums/checksums.lock +0 -0
  13. package/android/.gradle/9.0-milestone-1/fileChanges/last-build.bin +0 -0
  14. package/android/.gradle/9.0-milestone-1/fileHashes/fileHashes.lock +0 -0
  15. package/android/.gradle/9.0-milestone-1/gc.properties +0 -0
  16. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  17. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  18. package/android/.gradle/config.properties +0 -2
  19. package/android/.gradle/vcs-1/gc.properties +0 -0
  20. package/android/.idea/AndroidProjectSystem.xml +0 -6
  21. package/android/.idea/caches/deviceStreaming.xml +0 -1318
  22. package/android/.idea/gradle.xml +0 -13
  23. package/android/.idea/migrations.xml +0 -10
  24. package/android/.idea/misc.xml +0 -9
  25. package/android/.idea/runConfigurations.xml +0 -17
  26. package/android/.idea/vcs.xml +0 -6
  27. package/android/local.properties +0 -8
  28. package/build/ReactNativeSimpleNotePitchDetector.web.d.ts +0 -4
  29. package/build/ReactNativeSimpleNotePitchDetector.web.d.ts.map +0 -1
  30. package/build/ReactNativeSimpleNotePitchDetector.web.js +0 -7
  31. package/build/ReactNativeSimpleNotePitchDetector.web.js.map +0 -1
  32. package/build/ReactNativeSimpleNotePitchDetectorView.d.ts +0 -4
  33. package/build/ReactNativeSimpleNotePitchDetectorView.d.ts.map +0 -1
  34. package/build/ReactNativeSimpleNotePitchDetectorView.js +0 -7
  35. package/build/ReactNativeSimpleNotePitchDetectorView.js.map +0 -1
  36. package/src/ReactNativeSimpleNotePitchDetector.web.tsx +0 -13
  37. package/src/ReactNativeSimpleNotePitchDetectorView.tsx +0 -11
@@ -35,8 +35,8 @@ class PitchAnalyzer {
35
35
  // Smaller buffer = better high frequency detection, less latency
36
36
  private var bufferSize = 2048
37
37
  // Configurable algorithm - can be changed from JS
38
- private var algorithm = PitchEstimationAlgorithm.FFT_YIN
39
- private var algorithmName = "fft_yin"
38
+ private var algorithm = PitchEstimationAlgorithm.MPM
39
+ private var algorithmName = "mpm"
40
40
 
41
41
  private var dispatcher: AudioDispatcher? = null
42
42
  private var processor: AudioProcessor? = null
@@ -8,7 +8,4 @@ export type ChangeEventPayload = {
8
8
  /** Offset from perfect pitch as percentage (-50 to +50, negative = flat, positive = sharp) */
9
9
  offset: number;
10
10
  };
11
- export type ReactNativeSimpleNotePitchDetectorViewProps = {
12
- name: string;
13
- };
14
11
  //# sourceMappingURL=ReactNativeSimpleNotePitchDetector.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReactNativeSimpleNotePitchDetector.types.d.ts","sourceRoot":"","sources":["../src/ReactNativeSimpleNotePitchDetector.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,2CAA2C,GAAG;IACxD,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
1
+ {"version":3,"file":"ReactNativeSimpleNotePitchDetector.types.d.ts","sourceRoot":"","sources":["../src/ReactNativeSimpleNotePitchDetector.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReactNativeSimpleNotePitchDetector.types.js","sourceRoot":"","sources":["../src/ReactNativeSimpleNotePitchDetector.types.ts"],"names":[],"mappings":"","sourcesContent":["export type ChangeEventPayload = {\n /** Note name without octave (e.g., \"C#\", \"D\", \"Eb\") */\n note: string;\n /** Octave number (e.g., 4 for middle C) */\n octave: number;\n /** Raw frequency in Hz */\n frequency: number;\n /** Offset from perfect pitch as percentage (-50 to +50, negative = flat, positive = sharp) */\n offset: number;\n};\n\nexport type ReactNativeSimpleNotePitchDetectorViewProps = {\n name: string;\n};\n"]}
1
+ {"version":3,"file":"ReactNativeSimpleNotePitchDetector.types.js","sourceRoot":"","sources":["../src/ReactNativeSimpleNotePitchDetector.types.ts"],"names":[],"mappings":"","sourcesContent":["export type ChangeEventPayload = {\n /** Note name without octave (e.g., \"C#\", \"D\", \"Eb\") */\n note: string;\n /** Octave number (e.g., 4 for middle C) */\n octave: number;\n /** Raw frequency in Hz */\n frequency: number;\n /** Offset from perfect pitch as percentage (-50 to +50, negative = flat, positive = sharp) */\n offset: number;\n};\n"]}
package/build/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Subscription } from "expo-modules-core";
2
- import { ChangeEventPayload, ReactNativeSimpleNotePitchDetectorViewProps } from "./ReactNativeSimpleNotePitchDetector.types";
1
+ import { EventSubscription } from "expo-modules-core";
2
+ import { ChangeEventPayload } from "./ReactNativeSimpleNotePitchDetector.types";
3
3
  export declare function start(): any;
4
4
  export declare function stop(): any;
5
5
  export declare function isRecording(): any;
@@ -66,7 +66,7 @@ export declare function setAlgorithm(algorithm: string): any;
66
66
  * @returns Current algorithm name
67
67
  */
68
68
  export declare function getAlgorithm(): string;
69
- export declare function onChangeNote(listener: (event: ChangeEventPayload) => void): Subscription;
69
+ export declare function onChangeNote(listener: (event: ChangeEventPayload) => void): EventSubscription;
70
70
  export interface StatusEventPayload {
71
71
  level: "debug" | "error" | "verbose";
72
72
  message: string;
@@ -76,6 +76,6 @@ export interface StatusEventPayload {
76
76
  * Useful for debugging audio initialization issues.
77
77
  * @param listener - Callback that receives status events with level and message
78
78
  */
79
- export declare function onStatus(listener: (event: StatusEventPayload) => void): Subscription;
80
- export { ReactNativeSimpleNotePitchDetectorViewProps, ChangeEventPayload };
79
+ export declare function onStatus(listener: (event: StatusEventPayload) => void): EventSubscription;
80
+ export { ChangeEventPayload };
81
81
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACb,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,kBAAkB,EAClB,2CAA2C,EAC5C,MAAM,4CAA4C,CAAC;AAEpD,wBAAgB,KAAK,QAEpB;AAED,wBAAgB,IAAI,QAEnB;AAED,wBAAgB,WAAW,QAE1B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,OAElD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,OAEzC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,OAE7C;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAOD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAC5C,YAAY,CAEd;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAC5C,YAAY,CAEd;AAED,OAAO,EAAE,2CAA2C,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAEhF,wBAAgB,KAAK,QAEpB;AAED,wBAAgB,IAAI,QAEnB;AAED,wBAAgB,WAAW,QAE1B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,OAElD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,OAEzC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,OAE7C;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAC5C,iBAAiB,CAEnB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAC5C,iBAAiB,CAEnB;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
package/build/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import { NativeModulesProxy, EventEmitter, } from "expo-modules-core";
2
1
  import ReactNativeSimpleNotePitchDetectorModule from "./ReactNativeSimpleNotePitchDetectorModule";
3
2
  export function start() {
4
3
  return ReactNativeSimpleNotePitchDetectorModule.start();
@@ -82,10 +81,8 @@ export function setAlgorithm(algorithm) {
82
81
  export function getAlgorithm() {
83
82
  return ReactNativeSimpleNotePitchDetectorModule.getAlgorithm();
84
83
  }
85
- const emitter = new EventEmitter(ReactNativeSimpleNotePitchDetectorModule ??
86
- NativeModulesProxy.ReactNativeSimpleNotePitchDetector);
87
84
  export function onChangeNote(listener) {
88
- return emitter.addListener("onChangeNote", listener);
85
+ return ReactNativeSimpleNotePitchDetectorModule.addListener("onChangeNote", listener);
89
86
  }
90
87
  /**
91
88
  * Listen for status/debug messages from the native module.
@@ -93,6 +90,6 @@ export function onChangeNote(listener) {
93
90
  * @param listener - Callback that receives status events with level and message
94
91
  */
95
92
  export function onStatus(listener) {
96
- return emitter.addListener("onStatus", listener);
93
+ return ReactNativeSimpleNotePitchDetectorModule.addListener("onStatus", listener);
97
94
  }
98
95
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,YAAY,GAEb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,wCAAwC,MAAM,4CAA4C,CAAC;AAMlG,MAAM,UAAU,KAAK;IACnB,OAAO,wCAAwC,CAAC,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,OAAO,wCAAwC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,wCAAwC,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO,wCAAwC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,wCAAwC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,wCAAwC,CAAC,aAAa,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,wCAAwC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,wCAAwC,CAAC,YAAY,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,YAAY,CAC9B,wCAAwC;IACtC,kBAAkB,CAAC,kCAAkC,CACxD,CAAC;AAEF,MAAM,UAAU,YAAY,CAC1B,QAA6C;IAE7C,OAAO,OAAO,CAAC,WAAW,CAAqB,cAAc,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CACtB,QAA6C;IAE7C,OAAO,OAAO,CAAC,WAAW,CAAqB,UAAU,EAAE,QAAQ,CAAC,CAAC;AACvE,CAAC","sourcesContent":["import {\n NativeModulesProxy,\n EventEmitter,\n Subscription,\n} from \"expo-modules-core\";\n\nimport ReactNativeSimpleNotePitchDetectorModule from \"./ReactNativeSimpleNotePitchDetectorModule\";\nimport {\n ChangeEventPayload,\n ReactNativeSimpleNotePitchDetectorViewProps,\n} from \"./ReactNativeSimpleNotePitchDetector.types\";\n\nexport function start() {\n return ReactNativeSimpleNotePitchDetectorModule.start();\n}\n\nexport function stop() {\n return ReactNativeSimpleNotePitchDetectorModule.stop();\n}\n\nexport function isRecording() {\n return ReactNativeSimpleNotePitchDetectorModule.isRecording();\n}\n\n/**\n * Set the minimum audio level threshold for pitch detection.\n * Values are in dB (e.g., -30 means sounds quieter than -30dB are ignored).\n * Lower values = more sensitive (picks up quieter sounds).\n * Default is -30.\n * @param threshold - Level threshold in dB (e.g., -30, -35, -40)\n */\nexport function setLevelThreshold(threshold: number) {\n return ReactNativeSimpleNotePitchDetectorModule.setLevelThreshold(threshold);\n}\n\n/**\n * Set the buffer size for pitch detection.\n * Must be called before start() or will restart the engine if already running.\n *\n * Buffer size affects the trade-off between frequency range and responsiveness:\n * - Smaller buffer (2048-4096): Better for high frequencies, faster response, but less accurate for low notes\n * - Larger buffer (8192-16384): Better for low frequencies, more accurate, but slightly more latency\n *\n * iOS defaults to 8192, Android defaults to 2048.\n *\n * Recommended values:\n * - 4096: Good balance for most use cases\n * - 8192: Better for bass instruments or full piano range (iOS default)\n * - 2048: Better for high-pitched instruments, faster response (Android default)\n *\n * @param size - Buffer size (must be power of 2: 1024, 2048, 4096, 8192, 16384)\n */\nexport function setBufferSize(size: number) {\n return ReactNativeSimpleNotePitchDetectorModule.setBufferSize(size);\n}\n\n/**\n * Get the current buffer size.\n * @returns Current buffer size\n */\nexport function getBufferSize(): number {\n return ReactNativeSimpleNotePitchDetectorModule.getBufferSize();\n}\n\n/**\n * Set the pitch estimation algorithm.\n * Must be called before start() or will restart the engine if already running.\n *\n * Available algorithms differ by platform:\n *\n * **iOS (Beethoven library):**\n * - \"yin\" (default) - YIN algorithm, good for monophonic instruments\n * - \"hps\" - Harmonic Product Spectrum\n * - \"barycentric\" - Barycentric interpolation\n * - \"quadradic\" - Quadratic interpolation\n * - \"jains\" - Jain's method\n * - \"quinnsFirst\" - Quinn's first estimator\n * - \"quinnsSecond\" - Quinn's second estimator\n * - \"maxValue\" - Maximum value method\n *\n * **Android (TarsosDSP library):**\n * - \"fft_yin\" (default) - FFT-based YIN, faster than pure YIN\n * - \"yin\" - Pure YIN algorithm\n * - \"mpm\" - McLeod Pitch Method, good for speech and music\n * - \"fft_pitch\" - FFT bin with most energy\n * - \"dynamic_wavelet\" - Dynamic wavelet algorithm\n * - \"amdf\" - Average Magnitude Difference Function\n *\n * @param algorithm - Algorithm name (case-insensitive)\n */\nexport function setAlgorithm(algorithm: string) {\n return ReactNativeSimpleNotePitchDetectorModule.setAlgorithm(algorithm);\n}\n\n/**\n * Get the current algorithm name.\n * @returns Current algorithm name\n */\nexport function getAlgorithm(): string {\n return ReactNativeSimpleNotePitchDetectorModule.getAlgorithm();\n}\n\nconst emitter = new EventEmitter(\n ReactNativeSimpleNotePitchDetectorModule ??\n NativeModulesProxy.ReactNativeSimpleNotePitchDetector\n);\n\nexport function onChangeNote(\n listener: (event: ChangeEventPayload) => void\n): Subscription {\n return emitter.addListener<ChangeEventPayload>(\"onChangeNote\", listener);\n}\n\nexport interface StatusEventPayload {\n level: \"debug\" | \"error\" | \"verbose\";\n message: string;\n}\n\n/**\n * Listen for status/debug messages from the native module.\n * Useful for debugging audio initialization issues.\n * @param listener - Callback that receives status events with level and message\n */\nexport function onStatus(\n listener: (event: StatusEventPayload) => void\n): Subscription {\n return emitter.addListener<StatusEventPayload>(\"onStatus\", listener);\n}\n\nexport { ReactNativeSimpleNotePitchDetectorViewProps, ChangeEventPayload };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,wCAAwC,MAAM,4CAA4C,CAAC;AAGlG,MAAM,UAAU,KAAK;IACnB,OAAO,wCAAwC,CAAC,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,OAAO,wCAAwC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,wCAAwC,CAAC,WAAW,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO,wCAAwC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,wCAAwC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,wCAAwC,CAAC,aAAa,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,wCAAwC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,wCAAwC,CAAC,YAAY,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAA6C;IAE7C,OAAO,wCAAwC,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AACxF,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CACtB,QAA6C;IAE7C,OAAO,wCAAwC,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC","sourcesContent":["import {\n EventSubscription,\n} from \"expo-modules-core\";\n\nimport ReactNativeSimpleNotePitchDetectorModule from \"./ReactNativeSimpleNotePitchDetectorModule\";\nimport { ChangeEventPayload } from \"./ReactNativeSimpleNotePitchDetector.types\";\n\nexport function start() {\n return ReactNativeSimpleNotePitchDetectorModule.start();\n}\n\nexport function stop() {\n return ReactNativeSimpleNotePitchDetectorModule.stop();\n}\n\nexport function isRecording() {\n return ReactNativeSimpleNotePitchDetectorModule.isRecording();\n}\n\n/**\n * Set the minimum audio level threshold for pitch detection.\n * Values are in dB (e.g., -30 means sounds quieter than -30dB are ignored).\n * Lower values = more sensitive (picks up quieter sounds).\n * Default is -30.\n * @param threshold - Level threshold in dB (e.g., -30, -35, -40)\n */\nexport function setLevelThreshold(threshold: number) {\n return ReactNativeSimpleNotePitchDetectorModule.setLevelThreshold(threshold);\n}\n\n/**\n * Set the buffer size for pitch detection.\n * Must be called before start() or will restart the engine if already running.\n *\n * Buffer size affects the trade-off between frequency range and responsiveness:\n * - Smaller buffer (2048-4096): Better for high frequencies, faster response, but less accurate for low notes\n * - Larger buffer (8192-16384): Better for low frequencies, more accurate, but slightly more latency\n *\n * iOS defaults to 8192, Android defaults to 2048.\n *\n * Recommended values:\n * - 4096: Good balance for most use cases\n * - 8192: Better for bass instruments or full piano range (iOS default)\n * - 2048: Better for high-pitched instruments, faster response (Android default)\n *\n * @param size - Buffer size (must be power of 2: 1024, 2048, 4096, 8192, 16384)\n */\nexport function setBufferSize(size: number) {\n return ReactNativeSimpleNotePitchDetectorModule.setBufferSize(size);\n}\n\n/**\n * Get the current buffer size.\n * @returns Current buffer size\n */\nexport function getBufferSize(): number {\n return ReactNativeSimpleNotePitchDetectorModule.getBufferSize();\n}\n\n/**\n * Set the pitch estimation algorithm.\n * Must be called before start() or will restart the engine if already running.\n *\n * Available algorithms differ by platform:\n *\n * **iOS (Beethoven library):**\n * - \"yin\" (default) - YIN algorithm, good for monophonic instruments\n * - \"hps\" - Harmonic Product Spectrum\n * - \"barycentric\" - Barycentric interpolation\n * - \"quadradic\" - Quadratic interpolation\n * - \"jains\" - Jain's method\n * - \"quinnsFirst\" - Quinn's first estimator\n * - \"quinnsSecond\" - Quinn's second estimator\n * - \"maxValue\" - Maximum value method\n *\n * **Android (TarsosDSP library):**\n * - \"fft_yin\" (default) - FFT-based YIN, faster than pure YIN\n * - \"yin\" - Pure YIN algorithm\n * - \"mpm\" - McLeod Pitch Method, good for speech and music\n * - \"fft_pitch\" - FFT bin with most energy\n * - \"dynamic_wavelet\" - Dynamic wavelet algorithm\n * - \"amdf\" - Average Magnitude Difference Function\n *\n * @param algorithm - Algorithm name (case-insensitive)\n */\nexport function setAlgorithm(algorithm: string) {\n return ReactNativeSimpleNotePitchDetectorModule.setAlgorithm(algorithm);\n}\n\n/**\n * Get the current algorithm name.\n * @returns Current algorithm name\n */\nexport function getAlgorithm(): string {\n return ReactNativeSimpleNotePitchDetectorModule.getAlgorithm();\n}\n\nexport function onChangeNote(\n listener: (event: ChangeEventPayload) => void\n): EventSubscription {\n return ReactNativeSimpleNotePitchDetectorModule.addListener(\"onChangeNote\", listener);\n}\n\nexport interface StatusEventPayload {\n level: \"debug\" | \"error\" | \"verbose\";\n message: string;\n}\n\n/**\n * Listen for status/debug messages from the native module.\n * Useful for debugging audio initialization issues.\n * @param listener - Callback that receives status events with level and message\n */\nexport function onStatus(\n listener: (event: StatusEventPayload) => void\n): EventSubscription {\n return ReactNativeSimpleNotePitchDetectorModule.addListener(\"onStatus\", listener);\n}\n\nexport { ChangeEventPayload };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-simple-note-pitch-detector",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "a simple react native library to detect the pitch of the input recording",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -13,7 +13,9 @@
13
13
  "prepublishOnly": "expo-module prepublishOnly",
14
14
  "expo-module": "expo-module",
15
15
  "open:ios": "open -a \"Xcode\" example/ios",
16
- "open:android": "open -a \"Android Studio\" example/android"
16
+ "open:android": "open -a \"Android Studio\" example/android",
17
+ "android": "expo run:android",
18
+ "ios": "expo run:ios"
17
19
  },
18
20
  "keywords": [
19
21
  "react-native",
@@ -30,9 +32,9 @@
30
32
  "homepage": "https://github.com/derekhdawson/react-native-simple-note-pitch-detector#readme",
31
33
  "dependencies": {},
32
34
  "devDependencies": {
33
- "@types/react": "^18.0.25",
35
+ "@types/react": "~19.1.10",
34
36
  "expo-module-scripts": "^3.0.11",
35
- "expo-modules-core": "^1.5.7"
37
+ "expo-modules-core": "~3.0.29"
36
38
  },
37
39
  "peerDependencies": {
38
40
  "expo": "*",
@@ -8,7 +8,3 @@ export type ChangeEventPayload = {
8
8
  /** Offset from perfect pitch as percentage (-50 to +50, negative = flat, positive = sharp) */
9
9
  offset: number;
10
10
  };
11
-
12
- export type ReactNativeSimpleNotePitchDetectorViewProps = {
13
- name: string;
14
- };
package/src/index.ts CHANGED
@@ -1,14 +1,9 @@
1
1
  import {
2
- NativeModulesProxy,
3
- EventEmitter,
4
- Subscription,
2
+ EventSubscription,
5
3
  } from "expo-modules-core";
6
4
 
7
5
  import ReactNativeSimpleNotePitchDetectorModule from "./ReactNativeSimpleNotePitchDetectorModule";
8
- import {
9
- ChangeEventPayload,
10
- ReactNativeSimpleNotePitchDetectorViewProps,
11
- } from "./ReactNativeSimpleNotePitchDetector.types";
6
+ import { ChangeEventPayload } from "./ReactNativeSimpleNotePitchDetector.types";
12
7
 
13
8
  export function start() {
14
9
  return ReactNativeSimpleNotePitchDetectorModule.start();
@@ -100,15 +95,10 @@ export function getAlgorithm(): string {
100
95
  return ReactNativeSimpleNotePitchDetectorModule.getAlgorithm();
101
96
  }
102
97
 
103
- const emitter = new EventEmitter(
104
- ReactNativeSimpleNotePitchDetectorModule ??
105
- NativeModulesProxy.ReactNativeSimpleNotePitchDetector
106
- );
107
-
108
98
  export function onChangeNote(
109
99
  listener: (event: ChangeEventPayload) => void
110
- ): Subscription {
111
- return emitter.addListener<ChangeEventPayload>("onChangeNote", listener);
100
+ ): EventSubscription {
101
+ return ReactNativeSimpleNotePitchDetectorModule.addListener("onChangeNote", listener);
112
102
  }
113
103
 
114
104
  export interface StatusEventPayload {
@@ -123,8 +113,8 @@ export interface StatusEventPayload {
123
113
  */
124
114
  export function onStatus(
125
115
  listener: (event: StatusEventPayload) => void
126
- ): Subscription {
127
- return emitter.addListener<StatusEventPayload>("onStatus", listener);
116
+ ): EventSubscription {
117
+ return ReactNativeSimpleNotePitchDetectorModule.addListener("onStatus", listener);
128
118
  }
129
119
 
130
- export { ReactNativeSimpleNotePitchDetectorViewProps, ChangeEventPayload };
120
+ export { ChangeEventPayload };
File without changes
@@ -1,2 +0,0 @@
1
- #Mon Feb 02 16:29:03 PST 2026
2
- gradle.version=9.0-milestone-1
@@ -1,2 +0,0 @@
1
- #Mon Feb 02 16:28:55 PST 2026
2
- java.home=/Applications/Android Studio.app/Contents/jbr/Contents/Home
File without changes
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="AndroidProjectSystem">
4
- <option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
5
- </component>
6
- </project>