use cute_dsp::curves::{Linear, Cubic, CubicSegmentCurve, Reciprocal};
fn main() {
println!("Curves Example");
println!("==============");
linear_example();
cubic_example();
cubic_segment_curve_example();
reciprocal_example();
}
fn linear_example() {
println!("\nLinear Interpolation Example:");
let linear = Linear::<f32>::from_points(0.0, 1.0, 1.0, 3.0);
println!("Value at x=0.0: {}", linear.evaluate(0.0));
println!("Value at x=0.5: {}", linear.evaluate(0.5));
println!("Value at x=1.0: {}", linear.evaluate(1.0));
println!("Derivative (slope): {}", linear.derivative());
let inverse = linear.inverse();
println!("Inverse mapping of y=2.0: {}", inverse.evaluate(2.0));
}
fn cubic_example() {
println!("\nCubic Curve Example:");
let cubic = Cubic::<f32>::hermite(0.0, 1.0, 0.0, 1.0, 0.0, 2.0);
println!("Value at x=0.0: {}", cubic.evaluate(0.0));
println!("Value at x=0.25: {}", cubic.evaluate(0.25));
println!("Value at x=0.5: {}", cubic.evaluate(0.5));
println!("Value at x=0.75: {}", cubic.evaluate(0.75));
println!("Value at x=1.0: {}", cubic.evaluate(1.0));
println!("Derivative at x=0.5: {}", cubic.derivative_at(0.5));
let x0 = 0.0;
let x1 = 1.0;
let x2 = 2.0;
let x3 = 3.0;
let y0 = 0.0;
let y1 = 2.0;
let y2 = 1.0;
let y3 = 3.0;
let g1 = (y2 - y0) / (x2 - x0);
let g2 = (y3 - y1) / (x3 - x1);
let smooth = Cubic::<f32>::hermite(x1, x2, y1, y2, g1, g2);
println!("Smooth curve value at x=1.5: {}", smooth.evaluate(1.5));
}
fn cubic_segment_curve_example() {
println!("\nCubic Segment Curve Example:");
let mut curve = CubicSegmentCurve::<f32>::new();
curve.add(0.0, 0.0, false)
.add(1.0, 2.0, false)
.add(2.0, 1.0, false)
.add(3.0, 3.0, false);
curve.update(true, false, 1.0);
println!("Value at x=0.5: {}", curve.evaluate(0.5));
println!("Value at x=1.5: {}", curve.evaluate(1.5));
println!("Value at x=2.5: {}", curve.evaluate(2.5));
println!("Derivative at x=1.0: {}", curve.derivative_at(1.0));
println!("Number of segments: {}", curve.segments().len());
}
fn reciprocal_example() {
println!("\nReciprocal Curve Example:");
let reciprocal = Reciprocal::<f32>::from_points(100.0, 1000.0, 10000.0, 0.0, 1.0, 2.0);
println!("Value at 100 Hz: {}", reciprocal.evaluate(100.0));
println!("Value at 500 Hz: {}", reciprocal.evaluate(500.0));
println!("Value at 1000 Hz: {}", reciprocal.evaluate(1000.0));
println!("Value at 5000 Hz: {}", reciprocal.evaluate(5000.0));
println!("Value at 10000 Hz: {}", reciprocal.evaluate(10000.0));
let bark = Reciprocal::<f32>::bark_scale();
println!("Bark value at 100 Hz: {}", bark.evaluate(100.0));
println!("Bark value at 1000 Hz: {}", bark.evaluate(1000.0));
println!("Bark value at 10000 Hz: {}", bark.evaluate(10000.0));
let bark_range = Reciprocal::<f32>::bark_range(20.0, 20000.0);
println!("Normalized Bark value at 100 Hz: {}", bark_range.evaluate(100.0));
println!("Normalized Bark value at 1000 Hz: {}", bark_range.evaluate(1000.0));
println!("Normalized Bark value at 10000 Hz: {}", bark_range.evaluate(10000.0));
}