raw sound samples
This commit is contained in:
parent
68b90af755
commit
76ced9bb9d
3 changed files with 84 additions and 0 deletions
|
@ -17,3 +17,5 @@ infer = "0.16"
|
||||||
thiserror = "2.0"
|
thiserror = "2.0"
|
||||||
derive-new = "0.7"
|
derive-new = "0.7"
|
||||||
strum = { version = "0.26", features = ["derive"] }
|
strum = { version = "0.26", features = ["derive"] }
|
||||||
|
dasp_sample = "0.11.0"
|
||||||
|
derive_wrapper = "0.1"
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
pub use dasp_sample::Sample;
|
||||||
|
mod raw;
|
||||||
|
pub use raw::RawSamples;
|
79
bingus/src/snd/raw.rs
Normal file
79
bingus/src/snd/raw.rs
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
use super::Sample;
|
||||||
|
use derive_wrapper::{AsRef, From};
|
||||||
|
use num::{
|
||||||
|
traits::{FromBytes, ToBytes},
|
||||||
|
Zero,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::{Bendable, IntoDataBytes, TryFromDataBytes};
|
||||||
|
|
||||||
|
#[derive(From, AsRef)]
|
||||||
|
pub struct RawSamples<T>(Vec<T>)
|
||||||
|
where
|
||||||
|
T: Sample;
|
||||||
|
|
||||||
|
impl<T> IntoDataBytes for RawSamples<T>
|
||||||
|
where
|
||||||
|
T: Sample + ToBytes,
|
||||||
|
{
|
||||||
|
fn into_bytes(self) -> crate::Bytes {
|
||||||
|
self.as_ref()
|
||||||
|
.iter()
|
||||||
|
.flat_map(|subpixel| subpixel.to_ne_bytes().as_ref().to_vec())
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> TryFromDataBytes for RawSamples<T>
|
||||||
|
where
|
||||||
|
T: Sample + FromBytes + ToBytes + Zero,
|
||||||
|
<T as FromBytes>::Bytes: Sized + for<'a> TryFrom<&'a [u8]>,
|
||||||
|
{
|
||||||
|
type Error = ();
|
||||||
|
type Format = ();
|
||||||
|
fn try_from_bytes(
|
||||||
|
bytes: crate::Bytes,
|
||||||
|
_format: Self::Format,
|
||||||
|
crop: crate::Crop,
|
||||||
|
) -> Result<Self, Self::Error>
|
||||||
|
where
|
||||||
|
Self: Sized,
|
||||||
|
{
|
||||||
|
Ok(match crop {
|
||||||
|
crate::Crop::End => bytes
|
||||||
|
.chunks_exact(T::zero().to_ne_bytes().as_ref().len())
|
||||||
|
.map(|p| {
|
||||||
|
T::from_ne_bytes(&match <T as FromBytes>::Bytes::try_from(p) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(_) => unreachable!("you messed up chunk size!"),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect::<Vec<T>>(),
|
||||||
|
crate::Crop::Start => bytes
|
||||||
|
.rchunks_exact(T::zero().to_ne_bytes().as_ref().len())
|
||||||
|
.map(|p| {
|
||||||
|
T::from_ne_bytes(&match <T as FromBytes>::Bytes::try_from(p) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(_) => unreachable!("you messed up chunk size!"),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect::<Vec<T>>(),
|
||||||
|
}
|
||||||
|
.into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Bendable for RawSamples<T>
|
||||||
|
where
|
||||||
|
T: Sample + FromBytes + ToBytes + Zero,
|
||||||
|
<T as FromBytes>::Bytes: Sized + for<'a> TryFrom<&'a [u8]>,
|
||||||
|
{
|
||||||
|
type Unit = T;
|
||||||
|
fn map<F: Fn(&Self::Unit) -> Self::Unit + Sync>(mut self, f: F) -> Self {
|
||||||
|
self.0.iter_mut().for_each(|e| *e = f(e));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
fn format() -> crate::dynamic::Format {
|
||||||
|
crate::Format::Sound
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue