pulse width
This commit is contained in:
parent
eee3444c4d
commit
a36313341d
62
src/blip.rs
62
src/blip.rs
|
@ -1,5 +1,37 @@
|
||||||
|
use core::fmt;
|
||||||
|
use std::fmt::Formatter;
|
||||||
use crate::note::Note;
|
use crate::note::Note;
|
||||||
|
|
||||||
|
pub enum PulseWidth {
|
||||||
|
/// 50% duty cycle
|
||||||
|
Half,
|
||||||
|
/// 25% duty cycle
|
||||||
|
Quarter,
|
||||||
|
/// 12.5% duty cycle
|
||||||
|
Eighth,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PulseWidth {
|
||||||
|
fn from(str: &str) -> Result<PulseWidth, crate::Error> {
|
||||||
|
match str {
|
||||||
|
"P2" => Ok(PulseWidth::Half),
|
||||||
|
"P4" => Ok(PulseWidth::Quarter),
|
||||||
|
"P8" => Ok(PulseWidth::Eighth),
|
||||||
|
_ => Err(crate::Error::PulseWidth),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for PulseWidth {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "SQR {}", match self {
|
||||||
|
PulseWidth::Half => "P2",
|
||||||
|
PulseWidth::Quarter => "P4",
|
||||||
|
PulseWidth::Eighth => "P8",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// thanks to Rumple_Frumpkins from Bitsy Talk for his help in figuring out the blip format.
|
/// thanks to Rumple_Frumpkins from Bitsy Talk for his help in figuring out the blip format.
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct Blip {
|
pub struct Blip {
|
||||||
|
@ -11,8 +43,34 @@ pub struct Blip {
|
||||||
/// first value is milliseconds per note;
|
/// first value is milliseconds per note;
|
||||||
/// second value is a modifier to the first note (add or subtract milliseconds)
|
/// second value is a modifier to the first note (add or subtract milliseconds)
|
||||||
beat: [i16; 2],
|
beat: [i16; 2],
|
||||||
/// I think this is probably pulse width. apparently the potential values are P2, P4 and P8.
|
/// potential values are P2, P4 and P8.
|
||||||
square: String,
|
pulse_width: PulseWidth,
|
||||||
/// Notes can sound repeatedly, or just once as the blip fades out.
|
/// Notes can sound repeatedly, or just once as the blip fades out.
|
||||||
repeat: bool,
|
repeat: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<&str> for Blip {
|
||||||
|
fn from(str: &str) -> Self {
|
||||||
|
let mut id = String::new();
|
||||||
|
let mut notes = vec![];
|
||||||
|
let mut name = None;
|
||||||
|
let mut envelope = [0; 5];
|
||||||
|
let mut beat = [0; 2];
|
||||||
|
let mut pulse_width = PulseWidth::Half;
|
||||||
|
let mut repeat = false;
|
||||||
|
|
||||||
|
for line in str.lines() {
|
||||||
|
if line.starts_with("BLIP ") {
|
||||||
|
id = line.replace("BLIP ", "");
|
||||||
|
} else if line.starts_with("NAME ") {
|
||||||
|
name = Some(line.replace("NAME ", ""));
|
||||||
|
} else if line.starts_with("ENV ") {
|
||||||
|
let envelope_temp: Vec<u8> = line.replace("ENV ", "").split(' ').map(|v| v.parse().unwrap()).collect();
|
||||||
|
} else {
|
||||||
|
// notes = line.split(',').map(|n| Note::from(n)).collect().unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Self { id, notes, name, envelope, beat, pulse_width, repeat }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue