@@ -5,11 +5,15 @@ use sfml::{
5
5
6
6
// Melody by ryg - https://youtu.be/tCRPUv8V22o?t=176
7
7
struct BitMelody {
8
- buf : [ i16 ; 2048 ] ,
8
+ buf : [ i16 ; BUF_SIZE ] ,
9
9
t : i32 ,
10
- amp : i16 ,
10
+ vol : i16 ,
11
11
}
12
12
13
+ const FULLVOL_DURATION : i32 = 1_048_576 ;
14
+ const INIT_VOL : i16 = 128 ;
15
+ const BUF_SIZE : usize = 2048 ;
16
+
13
17
impl SoundStream for BitMelody {
14
18
fn get_data ( & mut self ) -> ( & mut [ i16 ] , bool ) {
15
19
for buf_sample in self . buf . iter_mut ( ) {
@@ -20,13 +24,13 @@ impl SoundStream for BitMelody {
20
24
let note = t * ( i32:: from ( melody[ index as usize ] ) & 15 ) ;
21
25
let sample = ( ( note / 12 ) & 128 )
22
26
+ ( ( ( ( ( ( t >> 12 ) ^ ( ( t >> 12 ) - 2 ) ) % 11 * t) / 4 ) | t >> 13 ) & 127 ) ;
23
- * buf_sample = sample as i16 * self . amp ;
27
+ * buf_sample = sample as i16 * self . vol ;
24
28
// Fade out after a while
25
- if t > 1_048_576 && t % 4096 == 0 {
26
- self . amp -= 1 ;
29
+ if t > FULLVOL_DURATION && t % 4096 == 0 {
30
+ self . vol -= 1 ;
27
31
}
28
32
}
29
- ( & mut self . buf [ ..] , self . amp > 0 )
33
+ ( & mut self . buf [ ..] , self . vol > 0 )
30
34
}
31
35
fn seek ( & mut self , offset : Time ) {
32
36
// Not exactly correct, but meh.
@@ -43,18 +47,25 @@ impl SoundStream for BitMelody {
43
47
impl BitMelody {
44
48
fn new ( ) -> Self {
45
49
BitMelody {
46
- buf : [ 0 ; 2048 ] ,
50
+ buf : [ 0 ; BUF_SIZE ] ,
47
51
t : 0 ,
48
- amp : 128 ,
52
+ vol : INIT_VOL ,
49
53
}
50
54
}
55
+ fn total_duration_samples ( & self ) -> usize {
56
+ ( FULLVOL_DURATION + INIT_VOL as i32 * 4096 ) as usize
57
+ }
51
58
}
52
59
53
60
fn main ( ) {
54
61
let mut stream = BitMelody :: new ( ) ;
62
+ let total_dur = stream. total_duration_samples ( ) as f32 / stream. sample_rate ( ) as f32 ;
55
63
let mut player = SoundStreamPlayer :: new ( & mut stream) ;
56
64
player. play ( ) ;
57
65
while player. status ( ) == SoundStatus :: PLAYING {
66
+ let current = player. playing_offset ( ) . as_seconds ( ) ;
67
+ eprint ! ( "Playing custom sound stream: {current:06.03}/{total_dur:06.03}\r " ) ;
58
68
std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 100 ) ) ;
59
69
}
70
+ eprintln ! ( ) ;
60
71
}
0 commit comments