diff --git a/Cargo.toml b/Cargo.toml index dbeb371..10353de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,18 +14,9 @@ nom = "7.1.3" serde = "1.0.209" serde_yml = "0.0.12" splines = "4.3.1" -strum = { version = "0.26", features = ["derive"] } -strum_macros = "0.26" tinyaudio = { version = "0.1", optional = true } -bng_macros = { path = "bng_macros" } [features] default = ["play", "save"] play = ["dep:tinyaudio"] save = [] - -[workspace] -members = ["bng_macros"] - -[lints.rust] -unused = "allow" diff --git a/bng_macros/Cargo.toml b/bng_macros/Cargo.toml deleted file mode 100644 index 1f75c20..0000000 --- a/bng_macros/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "bng_macros" -version = "0.1.0" -edition = "2021" - -[lib] -proc-macro = true - -[dependencies] -proc-macro2 = "1.0" -quote = "1.0" -syn = { version = "2.0", features = ["full"] } diff --git a/bng_macros/src/lib.rs b/bng_macros/src/lib.rs deleted file mode 100644 index bca0a42..0000000 --- a/bng_macros/src/lib.rs +++ /dev/null @@ -1,79 +0,0 @@ -extern crate proc_macro; -use proc_macro::TokenStream; -use quote::quote; -use syn::{parse_macro_input, Data, DataEnum, DeriveInput, Fields}; - -#[proc_macro_derive(ModifierParser)] -pub fn modifier_parser(input: TokenStream) -> TokenStream { - let ast = parse_macro_input!(input as DeriveInput); - impl_modifier_parser(ast) -} - -#[proc_macro_derive(SlopeModifierParser)] -pub fn slope_modifier_parser(input: TokenStream) -> TokenStream { - let ast = parse_macro_input!(input as DeriveInput); - impl_slope_modifier_parser(ast) -} - -fn impl_modifier_parser(ast: DeriveInput) -> TokenStream { - let name = &ast.ident; - if let Data::Enum(DataEnum { variants, .. }) = ast.data { - let match_arms = variants.iter().map(|variant| { - let variant_name = &variant.ident; - let variant_type = if let Fields::Unnamed(ref fields) = variant.fields { - &fields.unnamed[0].ty - } else { - panic!("Expected unnamed fields in enum variants"); - }; - - quote! { - nom::combinator::map( - nom::sequence::preceded( - nom::character::complete::char(#name::#variant_name(Default::default()).token()), - nom::character::complete::#variant_type - ), - #name::#variant_name - ) - } - }); - - quote! { - impl lex::lexer::Parse for #name { - fn parse(input: &str) -> nom::IResult<&str, #name> { - nom::branch::alt(( - #(#match_arms),* - ))(input) - } - } - } - .into() - } else { - panic!("this macro only works on enums") - } -} - -fn impl_slope_modifier_parser(ast: DeriveInput) -> TokenStream { - let name = &ast.ident; - if let Data::Enum(DataEnum { variants, .. }) = ast.data { - let match_arms = variants.iter().map(|variant| { - let variant_name = &variant.ident; - quote! { - tag(#name::#variant_name) - } - }); - - quote! { - impl lex::lexer::Parse for #name { - fn parse(input: &str) -> nom::IResult<&str, #name> { - let tag = |sm: SlopeModifier| nom::combinator::value(sm, nom::character::complete::char(sm.token())); - nom::branch::alt(( - #(#match_arms),* - ))(input) - } - } - } - .into() - } else { - panic!("this macro only works on enums") - } -} diff --git a/poc/poc.yml b/poc/poc.yml index c6f23c4..83e7cf7 100644 --- a/poc/poc.yml +++ b/poc/poc.yml @@ -24,7 +24,7 @@ channels: (3deff) (deff) [ffe] - {l 1-cos((PI*x)/2),acced} + {1-cos((PI*x)/2),acced} abbc!o5cc!v15feed!l4fedd!t60hdd # rest: . # pizz.: '° @@ -33,12 +33,7 @@ channels: # octave: >< # comment?: ;, # start here: ':' - # slope: {MODIFIER EXPR, score} - # note modifier prefix: n - # volume modifier prefix: v - # octave modifier prefix: o - # length modifier prefix: l - # tempo modifier prefix: t + # glissando: {EXPR, score} # loop: () # loop with count: (COUNT, score) # tuple: [] diff --git a/src/bng/score.rs b/src/bng/score.rs index 27573ce..26d8e95 100644 --- a/src/bng/score.rs +++ b/src/bng/score.rs @@ -1,8 +1,6 @@ -use bng_macros::{ModifierParser, SlopeModifierParser}; use fasteval::Instruction; mod lex; -use lex::Token; pub(super) enum Atom { Note(u8), @@ -14,7 +12,6 @@ pub(super) enum Atom { EmptyWrapper(WrapperKind), } -#[derive(ModifierParser)] pub(super) enum Modifier { Volume(u8), Octave(u8), @@ -36,7 +33,6 @@ pub(super) enum WrapperKind { Comment, } -#[derive(Clone, Copy, SlopeModifierParser)] pub(super) enum SlopeModifier { Note, Volume, diff --git a/src/bng/score/lex.rs b/src/bng/score/lex.rs index f8b9dfe..75ca318 100644 --- a/src/bng/score/lex.rs +++ b/src/bng/score/lex.rs @@ -1,7 +1,4 @@ -use super::{Atom, Modifier, SlopeModifier, WrapperKind}; - -pub(super) mod lexer; - +use super::{Atom, Modifier, WrapperKind}; const MORE: bool = true; const LESS: bool = false; const ON: bool = true; @@ -15,7 +12,7 @@ impl WrappingTokens { const SEMICOLON_COMMA: (char, char) = (';', ','); } -pub(super) trait Token { +trait Token { fn token(self) -> T; } @@ -41,18 +38,6 @@ impl Token for Modifier { } } -impl Token for SlopeModifier { - fn token(self) -> char { - match self { - Self::Note => 'n', - Self::Volume => 'v', - Self::Octave => 'o', - Self::Length => 'l', - Self::Tempo => 't', - } - } -} - impl Token for Atom { fn token(self) -> char { match self { diff --git a/src/bng/score/lex/lexer.rs b/src/bng/score/lex/lexer.rs deleted file mode 100644 index ee3999b..0000000 --- a/src/bng/score/lex/lexer.rs +++ /dev/null @@ -1,5 +0,0 @@ -use nom::IResult; - -pub(crate) trait Parse: Sized { - fn parse(input: &str) -> IResult<&str, Self>; -}