From dc5081b6a44b576f530955050dd59d6b1bba331f Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sun, 5 Nov 2017 11:05:22 +0200 Subject: Set up web interface to mimic GTK interface --- src/emscripten_api.rs | 3 ++- src/transforms.rs | 17 ++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/emscripten_api.rs b/src/emscripten_api.rs index 0f1bcc7..eeede98 100644 --- a/src/emscripten_api.rs +++ b/src/emscripten_api.rs @@ -3,6 +3,7 @@ use transforms; use std::os::raw::c_char; use std::ffi::CString; use std::slice; +use std::f32; #[no_mangle] pub extern "C" fn find_fundamental_frequency(signal: *const f32, signal_length: isize, sample_rate: f32) -> f32 { @@ -10,7 +11,7 @@ pub extern "C" fn find_fundamental_frequency(signal: *const f32, signal_length: &slice::from_raw_parts(signal, signal_length as usize) }; - transforms::find_fundamental_frequency(&signal_slice, sample_rate).unwrap_or(0.0) + transforms::find_fundamental_frequency(&signal_slice, sample_rate).unwrap_or(f32::NAN) } #[no_mangle] diff --git a/src/transforms.rs b/src/transforms.rs index 2565120..caa1480 100644 --- a/src/transforms.rs +++ b/src/transforms.rs @@ -1,3 +1,5 @@ +use std::f32; + fn remove_mean_offset(signal: &[f32]) -> Vec { let mean = signal.iter().sum::()/signal.len() as f32; signal.iter().map(|x| x - mean).collect() @@ -168,6 +170,10 @@ fn hz_to_midi_number(hz: f32) -> f32 { } pub fn hz_to_cents_error(hz: f32) -> f32 { + if !hz.is_finite() { + return f32::NAN; + } + let midi_number = hz_to_midi_number(hz); let cents = (midi_number - midi_number.floor()) * 100.0; if cents >= 50.0 { @@ -179,8 +185,8 @@ pub fn hz_to_cents_error(hz: f32) -> f32 { } pub fn hz_to_pitch(hz: f32) -> String { - if hz <= 0.0 { - return "< C 1".to_string(); + if hz <= 0.0 || !hz.is_finite() { + return "".to_string(); } let pitch_names = [ @@ -199,14 +205,11 @@ pub fn hz_to_pitch(hz: f32) -> String { ]; let midi_number = hz_to_midi_number(hz); - //midi_number of 0 is C-1. + //midi_number of 0 is C1. let rounded_pitch = midi_number.round() as i32; let name = pitch_names[rounded_pitch as usize % pitch_names.len()]; - let octave = rounded_pitch / pitch_names.len() as i32 - 1; //0 is C-1 - if octave < 0 { - return "< C 1".to_string(); - } + let octave = rounded_pitch / pitch_names.len() as i32 - 1; //0 is C1 format!("{: <2}{}", name, octave) } -- cgit v1.2.3