From 9ed583e4e4b66ad674553e17ef3dcbb64eacc927 Mon Sep 17 00:00:00 2001 From: p6nj Date: Wed, 2 Oct 2024 11:22:47 -0400 Subject: [PATCH] bng syntax rules & poc --- poc/poc.yml | 44 ++++++++++++++++++++++++++++++++++++++ src/bng/score.rs | 42 +++++++++++++++++++++++++++++++++++++ src/bng/score/lex.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 ++ 4 files changed, 138 insertions(+) create mode 100644 poc/poc.yml create mode 100644 src/bng/score/lex.rs diff --git a/poc/poc.yml b/poc/poc.yml new file mode 100644 index 0000000..83e7cf7 --- /dev/null +++ b/poc/poc.yml @@ -0,0 +1,44 @@ +# fixed +instruments: + # instrument name + sine: + # fixed + expr: sin(2*PI*f*t) # instrument formula (f is the frequency in Hertz, t is the time in seconds) + square: + expr: v*abs(sin(2*PI*f*t)) + # fixed + vars: + # name of the variable + v: 1 # initial value of the variable +channels: + melody: + instr: sine + score: + aabc. + 'rt°y + +d+d+d--- + /ff/f\\ + ab>c< + # comment?: ;, + # start here: ':' + # glissando: {EXPR, score} + # loop: () + # loop with count: (COUNT, score) + # tuple: [] + # modifier: ! + # volume modifier prefix: v + # octave modifier prefix: o + # length modifier prefix: l + # tempo modifier prefix: t diff --git a/src/bng/score.rs b/src/bng/score.rs index e69de29..26d8e95 100644 --- a/src/bng/score.rs +++ b/src/bng/score.rs @@ -0,0 +1,42 @@ +use fasteval::Instruction; + +mod lex; + +pub(super) enum Atom { + Note(u8), + Rest, + StartHere, + Modifier(Modifier), + QuickModifier(QuickModifier), + Wrapper(WrapperKind, Vec), + EmptyWrapper(WrapperKind), +} + +pub(super) enum Modifier { + Volume(u8), + Octave(u8), + Length(u8), + Tempo(u16), +} + +pub(super) enum QuickModifier { + Volume(bool), + Octave(bool), + Length(bool), + Pizz(bool), +} + +pub(super) enum WrapperKind { + Loop(u8), + Tuple, + Slope(SlopeModifier, Instruction), + Comment, +} + +pub(super) enum SlopeModifier { + Note, + Volume, + Octave, + Length, + Tempo, +} diff --git a/src/bng/score/lex.rs b/src/bng/score/lex.rs new file mode 100644 index 0000000..75ca318 --- /dev/null +++ b/src/bng/score/lex.rs @@ -0,0 +1,50 @@ +use super::{Atom, Modifier, WrapperKind}; +const MORE: bool = true; +const LESS: bool = false; +const ON: bool = true; +const OFF: bool = false; + +struct WrappingTokens; +impl WrappingTokens { + const PARENTHESES: (char, char) = ('(', ')'); + const SQUARE_BRACKETS: (char, char) = ('[', ']'); + const BRACKETS: (char, char) = ('{', '}'); + const SEMICOLON_COMMA: (char, char) = (';', ','); +} + +trait Token { + fn token(self) -> T; +} + +impl Token<(char, char)> for WrapperKind { + fn token(self) -> (char, char) { + match self { + Self::Loop(_) => WrappingTokens::PARENTHESES, + Self::Tuple => WrappingTokens::SQUARE_BRACKETS, + Self::Slope(_, _) => WrappingTokens::BRACKETS, + WrapperKind::Comment => WrappingTokens::SEMICOLON_COMMA, + } + } +} + +impl Token for Modifier { + fn token(self) -> char { + match self { + Self::Volume(_) => 'v', + Self::Octave(_) => 'o', + Self::Length(_) => 'l', + Self::Tempo(_) => 't', + } + } +} + +impl Token for Atom { + fn token(self) -> char { + match self { + Atom::Rest => '.', + Atom::StartHere => ':', + Atom::Modifier(_) => '!', + _ => unimplemented!("not a singleton"), + } + } +} diff --git a/src/main.rs b/src/main.rs index 615cdae..e06d996 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,11 @@ +#![feature(unsize)] use clap::Parser; mod bng; mod cli; fn main() { + // println!("{}", option_env!("TEST").unwrap_or("ok")); let args = cli::BngCli::parse(); #[cfg(debug_assertions)] println!("{:?}", args);