diff --git a/code/project/src/main.rs b/code/project/src/main.rs
index ac50862..933c45f 100644
--- a/code/project/src/main.rs
+++ b/code/project/src/main.rs
@@ -16,6 +16,7 @@ use microbit::{
gpio::{p0::P0_05, Floating, Input},
saadc::SaadcConfig,
timer::Timer,
+ timer::Timer,
Saadc,
},
pac::TIMER1,
@@ -27,9 +28,8 @@ use ordered_float::NotNan;
use panic_rtt_target as _;
use rtt_target::{rprintln, rtt_init_print};
-// Microbit-spectrum
+// Microbit-spectrum ported constants
const FFT_WIDTH: usize = 64;
-/// ADC is signed; it is configured for a sample precision of 10 bits. Must match below.
const ADC_MAX: usize = 512;
const NOTES: [&str; 12] = [
@@ -96,6 +96,7 @@ const NOTE_IMAGE_BITMAPS: [[[u8; 5]; 5]; 7] = [
],
];
+// Read FFT-WIDTH numer of samples from the saadc channel. Collect these sequentially and return the array
fn read_samples(saadc: &mut Saadc, mic_in: &mut P0_05>) -> [i16; FFT_WIDTH] {
let mut result = [0; FFT_WIDTH];
for r in &mut result {
@@ -104,7 +105,7 @@ fn read_samples(saadc: &mut Saadc, mic_in: &mut P0_05>) -> [i16;
result
}
-// Microbit-spectrum - read function
+// Adapted from Microbit-spectrum - `fn spectrum`
fn samples_to_freq(
samples: [i16; FFT_WIDTH],
window: [f32; FFT_WIDTH],
@@ -133,11 +134,15 @@ fn samples_to_freq(
*freqs
}
+// When complete, getting the dominant frequency should be about as follows:
+// 1) window the data in a sensible way
+// 2) Take an FFT of the window
+// 3) Identify the fft frequency with the largest magnitude in the window and return it
fn get_dominant_freq(_freqs: [Complex; FFT_WIDTH / 2]) -> f32 {
- // todo!();
0.0
}
+// Simple frequencry to rounded note/octave value
fn get_note(freq: f32) -> (usize, f32) {
if freq > 0.0 {
let note_num = log2f(freq / 440.0) * 12.0;
@@ -148,6 +153,7 @@ fn get_note(freq: f32) -> (usize, f32) {
(0, 0.0)
}
+// Return the pre-defined base image, which matches the offset of the node
fn get_image(noctive: (usize, f32)) -> [[u8; 5]; 5] {
let (note, _octive) = noctive; // TODO - Add octive and flat modifier to display
if note > 0 {
@@ -171,7 +177,7 @@ fn init() -> ! {
let _ = mic_run.set_high();
- let saadc_config: SaadcConfig = SaadcConfig::default();
+ let saadc_config: SaadcConfig = SaadcConfig::default(); // Testing may show that more explicit Saadc configuration is needed
let mut saadc: Saadc = Saadc::new(board.ADC, saadc_config);
@@ -186,10 +192,10 @@ fn init() -> ! {
let samples: [i16; FFT_WIDTH] = read_samples(&mut saadc, &mut mic_in);
let freqs: [Complex; FFT_WIDTH / 2] = samples_to_freq(samples, window);
let dominant_freq: f32 = get_dominant_freq(freqs);
- let noctive: (usize, f32) = get_note(dominant_freq); //note + octive tuple
+ let noctive: (usize, f32) = get_note(dominant_freq); //noctive = note + octive tuple
let bitmap: [[u8; 5]; 5] = get_image(noctive);
DISPLAY.with_lock(|display: &mut Display| {
- display.show(&BitImage::new(&bitmap)); // XXX Not the most memory efficient - Improve
+ display.show(&BitImage::new(&bitmap)); // A better place can be found for the new constructor
});
rprintln!("{}", NOTES[noctive.0]);
timer.delay(400);