use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Keyboard {
#[serde(with = "big_array_120")]
pub sample_for_pitch: [Option<usize>; 120],
#[serde(with = "big_array_120")]
pub note_for_pitch: [Option<u8>; 120],
}
impl Default for Keyboard {
fn default() -> Self {
Self {
sample_for_pitch: [None; 120],
note_for_pitch: [None; 120],
}
}
}
impl Keyboard {
pub fn map_all_to(&mut self, sample_index: usize) {
self.sample_for_pitch
.iter_mut()
.for_each(|elem| *elem = Some(sample_index));
}
}
mod big_array_120 {
use core::fmt;
use core::marker::PhantomData;
use serde::de::{Error, SeqAccess, Visitor};
use serde::ser::SerializeTuple;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
const N: usize = 120;
pub fn serialize<S, T>(arr: &[T; N], ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: Serialize,
{
let mut tup = ser.serialize_tuple(N)?;
for v in arr {
tup.serialize_element(v)?;
}
tup.end()
}
pub fn deserialize<'de, D, T>(de: D) -> Result<[T; N], D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de> + Default + Copy,
{
struct ArrayVisitor<T> {
_t: PhantomData<T>,
}
impl<'de, T> Visitor<'de> for ArrayVisitor<T>
where
T: Deserialize<'de> + Default + Copy,
{
type Value = [T; N];
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "an array of length {N}")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<[T; N], A::Error> {
let mut out = [T::default(); N];
for (i, slot) in out.iter_mut().enumerate() {
*slot = seq
.next_element()?
.ok_or_else(|| A::Error::invalid_length(i, &self))?;
}
Ok(out)
}
}
de.deserialize_tuple(N, ArrayVisitor { _t: PhantomData })
}
}