it works!!
This commit is contained in:
parent
14c98f484b
commit
5c2607b574
9 changed files with 37 additions and 67 deletions
|
@ -12,5 +12,5 @@ package.keywords = ["databending", "data-bending", "bending", "bend", "art"]
|
||||||
fundsp = "0.18.2"
|
fundsp = "0.18.2"
|
||||||
image = "0.24.9"
|
image = "0.24.9"
|
||||||
anyhow = "1.0.86"
|
anyhow = "1.0.86"
|
||||||
dasp_sample = "0.11.0"
|
|
||||||
bingus = { version = "0.1.0", path = "bingus" }
|
bingus = { version = "0.1.0", path = "bingus" }
|
||||||
|
num-traits = "0.2.19"
|
||||||
|
|
|
@ -14,5 +14,4 @@ keywords.workspace = true
|
||||||
image = { workspace = true }
|
image = { workspace = true }
|
||||||
fundsp = { workspace = true }
|
fundsp = { workspace = true }
|
||||||
anyhow = { workspace = true }
|
anyhow = { workspace = true }
|
||||||
dasp_sample = { workspace = true }
|
|
||||||
bingus = { workspace = true }
|
bingus = { workspace = true }
|
||||||
|
|
|
@ -1,7 +1,39 @@
|
||||||
|
use std::array;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use bingus::convert::samples::BytesToSample;
|
use fundsp::{
|
||||||
|
hacker::{bell_hz, pipei, U12},
|
||||||
|
math::db_amp,
|
||||||
|
};
|
||||||
|
use image::io::Reader as ImageReader;
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
dbg!([1u8, 2, 3].to_sample::<f64>());
|
let mut img = ImageReader::open("bmp/bigsample.bmp")?.decode()?.to_rgb8();
|
||||||
|
let mut equalizer =
|
||||||
|
pipei::<U12, _, _>(|i| bell_hz(1000.0 + 1000.0 * i as f32, 1.0, db_amp(0.0)));
|
||||||
|
img.to_vec()
|
||||||
|
.chunks_exact(3)
|
||||||
|
.map(|px: &[u8]| f32::from_ne_bytes(array::from_fn(|i| px[i % px.len()])))
|
||||||
|
.map(|x| equalizer.filter_mono(x))
|
||||||
|
.flat_map(|px| -> [u8; 3] {
|
||||||
|
let px = px.to_ne_bytes();
|
||||||
|
array::from_fn(move |i| px[i])
|
||||||
|
})
|
||||||
|
.zip(img.as_mut())
|
||||||
|
.for_each(|(filtered, original)| *original = filtered);
|
||||||
|
img.save("bmp/out.bmp")?;
|
||||||
|
|
||||||
|
// let bytes: Vec<u8> = (1u8..7).into_iter().collect();
|
||||||
|
// assert_eq!(
|
||||||
|
// bytes,
|
||||||
|
// bytes
|
||||||
|
// .chunks_exact(3)
|
||||||
|
// .map(|px: &[u8]| f64::from_ne_bytes(array::from_fn(|i| px[i % px.len()])))
|
||||||
|
// .flat_map(|px: f64| -> [u8; 3] {
|
||||||
|
// let px = px.to_ne_bytes();
|
||||||
|
// array::from_fn(move |i| px[i])
|
||||||
|
// })
|
||||||
|
// .collect::<Vec<u8>>()
|
||||||
|
// );
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,4 +11,4 @@ keywords.workspace = true
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
[dependencies]
|
[dependencies]
|
||||||
fundsp = { workspace = true }
|
fundsp = { workspace = true }
|
||||||
dasp_sample = { workspace = true }
|
num-traits = { workspace = true }
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
pub mod samples;
|
|
||||||
|
|
||||||
pub type Byte = u8;
|
|
|
@ -1,6 +0,0 @@
|
||||||
use super::Byte;
|
|
||||||
|
|
||||||
mod from;
|
|
||||||
mod into;
|
|
||||||
|
|
||||||
pub use into::BytesToSample;
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
use std::{
|
|
||||||
array, mem,
|
|
||||||
ops::{BitOr, Shl},
|
|
||||||
};
|
|
||||||
|
|
||||||
use dasp_sample::{FromSample, Sample, U24, U48};
|
|
||||||
use fundsp::Real;
|
|
||||||
|
|
||||||
use super::Byte;
|
|
||||||
|
|
||||||
pub trait BytesToSample<Ir, It, Ii>
|
|
||||||
where
|
|
||||||
Self: IntoIterator<Item = It, IntoIter = Ii> + Sized,
|
|
||||||
Ii: Iterator<Item = It>,
|
|
||||||
Ir: FromSample<It>
|
|
||||||
+ Sample
|
|
||||||
+ Default
|
|
||||||
+ From<u8>
|
|
||||||
+ Shl<Ir, Output = Ir>
|
|
||||||
+ BitOr<Ir, Output = Ir>,
|
|
||||||
It: Sample,
|
|
||||||
{
|
|
||||||
fn to_sample<S>(self) -> S
|
|
||||||
where
|
|
||||||
S: Real + Sample + FromSample<Ir>,
|
|
||||||
{
|
|
||||||
self.into_iter()
|
|
||||||
.map(|it| Ir::from_sample(it))
|
|
||||||
.reduce(|acc, ir| (acc << Ir::from(mem::size_of::<It>() as u8 * 8u8)) | ir)
|
|
||||||
.unwrap()
|
|
||||||
.to_sample()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! impl_bts_for_array_of {
|
|
||||||
($($N:expr, $Ir:ty);*) =>
|
|
||||||
{
|
|
||||||
$(
|
|
||||||
impl BytesToSample<$Ir, Byte, array::IntoIter<Byte, $N>> for [Byte; $N] {}
|
|
||||||
)*
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl_bts_for_array_of! {
|
|
||||||
1, u8;
|
|
||||||
2, u16;
|
|
||||||
3, U24;
|
|
||||||
4, u32;
|
|
||||||
6, U48;
|
|
||||||
8, u64
|
|
||||||
}
|
|
|
@ -1 +1 @@
|
||||||
pub mod convert;
|
|
||||||
|
|
Loading…
Reference in a new issue