diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/src/main.rs b/src/main.rs index 57271f5..262c822 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,30 +1,56 @@ +use std::{io::{self, Write}, time::Duration}; use unicode_width::UnicodeWidthStr; -use std::io::Write; +use rodio::{OutputStream, Sink, source::{SineWave, Source}}; +use clap::Parser; -use std::time::Duration; -use rodio::{OutputStream, Sink}; -use rodio::source::{SineWave, Source}; +#[derive(Parser, Debug)] +#[clap(version, about, long_about = None)] +struct Args { + /// How many spaces a tab character counts as + #[clap(short, long, value_parser, default_value_t = 4)] + tab_width: usize, + + /// Frequency of tones. Multiplied by line length + #[clap(short, long, value_parser, default_value_t = 20.0)] + frequency: f32, + + /// Duration of each tone, in seconds + #[clap(short, long, value_parser, default_value_t = 0.1)] + duration: f32, + + /// Amplifier of tones + #[clap(short, long, value_parser, default_value_t = 1.0)] + amplifier: f32, +} fn main() { + let args = Args::parse(); + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); let sink = Sink::try_new(&stream_handle).unwrap(); - let mut stdout = std::io::stdout().lock(); + let mut stdout = io::stdout().lock(); - for line in std::io::stdin().lines() { + for line in io::stdin().lines() { let line: String = line .unwrap() .chars() - .map(|c| if c == '\t' { String::from(" ").repeat(8) } else { c.to_string() }) + .map(|c| + if c == '\t' { + String::from(" ").repeat(args.tab_width) + } else { + c.to_string() + } + ) .collect(); let len = UnicodeWidthStr::width(&*line) as f32; stdout.write_fmt(format_args!("{}\n", line)).unwrap(); - sink.append(SineWave::new(44.0 * len) - .take_duration(Duration::from_secs_f32(0.1)) - .amplify(0.20)); + sink.append(SineWave::new(args.frequency * len) + .take_duration(Duration::from_secs_f32(args.duration)) + .amplify(args.amplifier)); sink.sleep_until_end(); } } |