summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/emscripten_api.rs17
-rw-r--r--web/main.js28
2 files changed, 43 insertions, 2 deletions
diff --git a/src/emscripten_api.rs b/src/emscripten_api.rs
index c371d86..0f1bcc7 100644
--- a/src/emscripten_api.rs
+++ b/src/emscripten_api.rs
@@ -2,10 +2,10 @@ use transforms;
use std::os::raw::c_char;
use std::ffi::CString;
+use std::slice;
#[no_mangle]
pub extern "C" fn find_fundamental_frequency(signal: *const f32, signal_length: isize, sample_rate: f32) -> f32 {
- use std::slice;
let signal_slice = unsafe {
&slice::from_raw_parts(signal, signal_length as usize)
};
@@ -25,3 +25,18 @@ pub extern "C" fn hz_to_pitch(hz: f32) -> *mut c_char {
.unwrap()
.into_raw()
}
+
+#[no_mangle]
+pub extern "C" fn correlation(signal: *mut f32, signal_length: isize) {
+ let signal_slice = unsafe {
+ &slice::from_raw_parts(signal, signal_length as usize)
+ };
+
+ let correlated_signal = transforms::correlation(&signal_slice);
+
+ unsafe {
+ for (i, cor) in correlated_signal.iter().enumerate() {
+ *signal.offset(i as isize) = *cor;
+ }
+ }
+}
diff --git a/web/main.js b/web/main.js
index 5b58f9d..ace739f 100644
--- a/web/main.js
+++ b/web/main.js
@@ -13,13 +13,31 @@ function jsArrayToF32ArrayPtr(jsArray, callback) {
var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes);
dataHeap.set(new Uint8Array(data.buffer));
- var result = callback(dataHeap.byteOffset, jsArray.length);
+ var result = callback(dataPtr, jsArray.length);
Module._free(dataPtr);
return result;
}
+function jsArrayToF32ArrayPtrMutateInPlace(jsArray, mutate) {
+ var data = new Float32Array(jsArray);
+ var nDataBytes = data.length * data.BYTES_PER_ELEMENT;
+ var dataPtr = Module._malloc(nDataBytes);
+
+ var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes);
+ dataHeap.set(new Uint8Array(data.buffer));
+
+ mutate(dataPtr, jsArray.length);
+
+ var mutatedData = new Float32Array(Module.HEAPU8.buffer, dataPtr, jsArray.length);
+ var result = Array.prototype.slice.call(mutatedData);
+
+ Module._free(dataPtr);
+
+ return result;
+}
+
function findFundamentalFrequency(data, samplingRate) {
return jsArrayToF32ArrayPtr(data, function(dataPtr, dataLength) {
return Module._find_fundamental_frequency(dataPtr, dataLength, samplingRate);
@@ -35,13 +53,21 @@ function hzToPitch(hz) {
return wrapped(hz);
}
+function correlation(data) {
+ return jsArrayToF32ArrayPtrMutateInPlace(data, function(dataPtr, dataLength) {
+ Module._correlation(dataPtr, dataLength);
+ });
+}
+
function main() {
var data = [1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0];
var fundamental = findFundamentalFrequency(data, 44100.0);
+ var correlated = correlation(data);
var error = hzToCentsError(450.0);
var pitch = hzToPitch(450.0);
console.log("Javascript here. Our fundamental frequency according to Rust is " + fundamental + "Hz");
console.log("The other math shows a pitch of " + pitch + ", and an error of " + error);
+ console.log("Correlation of the array is " + correlated);
}