#![feature(core)]
extern crate dsp;
use dsp::{Event, Node, Sample, Settings, SoundStream, Wave};
type AudioSample = f32;
type Input = AudioSample;
type Output = AudioSample;
type Phase = f64;
type Frequency = f64;
type Volume = f32;
const A5_HZ: Frequency = 440.0;
const D5_HZ: Frequency = 587.33;
const F5_HZ: Frequency = 698.46;
fn main() {
let mut stream = match SoundStream::<Input, Output>::new().run() {
Ok(stream) => { println!("It begins!"); stream },
Err(err) => panic!("An error occurred while constructing SoundStream: {}", err),
};
let mut synth = Synth([
Oscillator(0.0, A5_HZ, 0.2),
Oscillator(0.0, D5_HZ, 0.1),
Oscillator(0.0, F5_HZ, 0.15)
]);
let mut timer: f64 = 3.0;
for event in stream.by_ref() {
match event {
Event::Out(buffer, settings) => synth.audio_requested(buffer, settings),
Event::Update(dt) => if timer > 0.0 { timer -= dt } else { break },
_ => (),
}
}
match stream.close() {
Ok(()) => println!("Great success!"),
Err(err) => println!("An error occurred while closing SoundStream: {}", err),
}
}
struct Synth([Oscillator; 3]);
impl Node<Output> for Synth {
fn inputs(&mut self) -> Vec<&mut Node<Output>> {
let Synth(ref mut oscillators) = *self;
oscillators.iter_mut().map(|osc| osc as &mut Node<Output>).collect()
}
}
struct Oscillator(Phase, Frequency, Volume);
impl Node<Output> for Oscillator {
fn audio_requested(&mut self, buffer: &mut [Output], settings: Settings) {
let Oscillator(ref mut phase, frequency, volume) = *self;
for frame in buffer.chunks_mut(settings.channels as usize) {
*phase += frequency / settings.sample_hz as f64;
let val = sine_wave(*phase, volume);
for channel in frame.iter_mut() {
*channel = val;
}
}
}
}
fn sine_wave<S: Sample>(phase: Phase, volume: Volume) -> S {
use std::f64::consts::PI_2;
use std::num::Float;
Sample::from_wave((phase * PI_2).sin() as Wave * volume)
}