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"
|
||||
image = "0.24.9"
|
||||
anyhow = "1.0.86"
|
||||
dasp_sample = "0.11.0"
|
||||
bingus = { version = "0.1.0", path = "bingus" }
|
||||
num-traits = "0.2.19"
|
||||
|
|
|
@ -14,5 +14,4 @@ keywords.workspace = true
|
|||
image = { workspace = true }
|
||||
fundsp = { workspace = true }
|
||||
anyhow = { workspace = true }
|
||||
dasp_sample = { workspace = true }
|
||||
bingus = { workspace = true }
|
||||
|
|
|
@ -1,7 +1,39 @@
|
|||
use std::array;
|
||||
|
||||
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<()> {
|
||||
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(())
|
||||
}
|
||||
|
|
|
@ -11,4 +11,4 @@ keywords.workspace = true
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
[dependencies]
|
||||
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