summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics/src/audio/data.rs8
-rw-r--r--graphics/src/audio/mod.rs4
-rw-r--r--graphics/src/audio/parse/lex.rs7
-rw-r--r--graphics/src/audio/parse/parser.rs4
-rw-r--r--graphics/src/audio/program.rs8
5 files changed, 23 insertions, 8 deletions
diff --git a/graphics/src/audio/data.rs b/graphics/src/audio/data.rs
index 8cbdf45..5011758 100644
--- a/graphics/src/audio/data.rs
+++ b/graphics/src/audio/data.rs
@@ -3,13 +3,14 @@ use crate::audio::{parse, program::Program};
const MELODY: &str = r#"
; setup
a v100 d50
+o120
%define notes
a p$1 v100 - a v0 -
a p$1 v100 - a v0 -
a pd4 v100 -- a v0 --
a pa4 v100 -- a v0 -- --
-a pg3s v100 - a v0 - --
+a pg3# v100 - a v0 - --
a pg3 v100 - a v0 - --
a pf3 v100 --- a v0 -
a pd3 v100 - a v0 -
@@ -20,12 +21,12 @@ a pg3 v100 - a v0 -
notes d3
notes c3
notes b3
-notes b3f
+notes b3b
notes d3
notes c3
notes b3
-notes b3f
+notes b3b
"#;
const BASE: &str = r#"
@@ -33,6 +34,7 @@ const BASE: &str = r#"
; setup
b v100 d50
+o120
%define notes
b p$1 v100 -- b v0 --
diff --git a/graphics/src/audio/mod.rs b/graphics/src/audio/mod.rs
index 473c05b..a8c24ad 100644
--- a/graphics/src/audio/mod.rs
+++ b/graphics/src/audio/mod.rs
@@ -12,7 +12,9 @@ mod data;
mod parse;
mod program;
-pub const TIME_SLICE: Duration = Duration::from_millis(1000 / 60);
+const AUDIO_FPS: u32 = 60;
+
+pub const TIME_SLICE: Duration = Duration::from_millis(1000 / AUDIO_FPS as u64);
/// Holds each audio channel
pub struct Channels {
diff --git a/graphics/src/audio/parse/lex.rs b/graphics/src/audio/parse/lex.rs
index f2500da..a349c53 100644
--- a/graphics/src/audio/parse/lex.rs
+++ b/graphics/src/audio/parse/lex.rs
@@ -13,6 +13,7 @@ pub enum Token {
LineSeparator,
Pause(usize),
Jump(usize),
+ Tempo(u32),
ChanSpec(ChanSpec),
SetVolume(u8),
SetPitch(u8),
@@ -96,11 +97,11 @@ impl<'s> Lexer<'s> {
}?;
let off = match self.peek()? {
- 's' => {
+ '#' => {
self.next()?;
1
}
- 'f' => {
+ 'b' => {
self.next()?;
-1
}
@@ -178,6 +179,8 @@ impl<'s> Lexer<'s> {
'-' => self.next_pause()?,
// jump
'j' => T::Jump(self.next_int()?),
+ // tempO
+ 'o' => T::Tempo(self.next_int()?),
// eof
'\0' => T::Eof,
// new line
diff --git a/graphics/src/audio/parse/parser.rs b/graphics/src/audio/parse/parser.rs
index fbe5f4c..23ba8a4 100644
--- a/graphics/src/audio/parse/parser.rs
+++ b/graphics/src/audio/parse/parser.rs
@@ -87,6 +87,10 @@ impl<'s> Parser<'s> {
self.next()?;
prog.push(Instruction::Jump(pc));
}
+ Token::Tempo(tempo) => {
+ self.next()?;
+ prog.push(Instruction::Tempo(tempo));
+ }
_ => self.parse_line(&mut prog)?,
}
}
diff --git a/graphics/src/audio/program.rs b/graphics/src/audio/program.rs
index f31be06..91f0608 100644
--- a/graphics/src/audio/program.rs
+++ b/graphics/src/audio/program.rs
@@ -1,5 +1,5 @@
use crate::audio::{
- Channels,
+ AUDIO_FPS, Channels,
channel::{Channel, DutyCycle},
parse,
};
@@ -16,6 +16,7 @@ pub enum ChanSpec {
pub enum Instruction {
Pause,
Jump(usize),
+ Tempo(u32),
SetVolume(ChanSpec, u8),
SetPitch(ChanSpec, u8),
SetPulseDutyA(DutyCycle),
@@ -98,11 +99,14 @@ impl Program {
match ins {
I::Pause => {
// pause execution until next `exec` call
- self.pause = self.tempo / 60;
+ self.pause = (AUDIO_FPS * 4) / self.tempo.clamp(1, 240);
}
I::Jump(pc) => {
self.pc = pc;
}
+ I::Tempo(tempo) => {
+ self.tempo = tempo;
+ }
I::SetVolume(chan_spec, volume) => {
// set the volume (amplitude) on a given channel
use ChanSpec as C;