it works!!

This commit is contained in:
Ponj 2024-07-10 18:58:11 +02:00
parent 14c98f484b
commit 5c2607b574
Signed by: p6nj
GPG Key ID: CEAB625B75A836B2
9 changed files with 37 additions and 67 deletions

View File

@ -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"

View File

@ -14,5 +14,4 @@ keywords.workspace = true
image = { workspace = true }
fundsp = { workspace = true }
anyhow = { workspace = true }
dasp_sample = { workspace = true }
bingus = { workspace = true }

View File

@ -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(())
}

View File

@ -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 }

View File

@ -1,3 +0,0 @@
pub mod samples;
pub type Byte = u8;

View File

@ -1,6 +0,0 @@
use super::Byte;
mod from;
mod into;
pub use into::BytesToSample;

View File

@ -1 +0,0 @@

View File

@ -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
}

View File

@ -1 +1 @@
pub mod convert;