Skip to content

Commit d7f9547

Browse files
committed
use accurate audio sampling
1 parent de86379 commit d7f9547

1 file changed

Lines changed: 37 additions & 40 deletions

File tree

emu/src/apu/mod.rs

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,29 @@ use serde::{Deserialize, Serialize};
1010

1111
// Precompute lookup tables for sampling
1212
// See https://www.nesdev.org/wiki/APU_Mixer#Lookup_Table
13-
const PULSE_TABLE: [f32; 31] = const {
14-
let mut pulse_table = [0.0; 31];
15-
16-
let mut n = 1;
17-
while n < 31 {
18-
pulse_table[n] = 95.52 / (8128.0 / (n as f32) + 100.0);
19-
n += 1;
20-
}
21-
22-
pulse_table
23-
};
24-
25-
const TND_TABLE: [f32; 203] = const {
26-
let mut tnd_table = [0.0; 203];
27-
28-
let mut n = 1;
29-
while n < 203 {
30-
tnd_table[n] = 163.67 / (24329.0 / (n as f32) + 100.0);
31-
n += 1;
32-
}
33-
34-
tnd_table
35-
};
13+
// const PULSE_TABLE: [f32; 31] = const {
14+
// let mut pulse_table = [0.0; 31];
15+
//
16+
// let mut n = 1;
17+
// while n < 31 {
18+
// pulse_table[n] = 95.52 / (8128.0 / (n as f32) + 100.0);
19+
// n += 1;
20+
// }
21+
//
22+
// pulse_table
23+
// };
24+
//
25+
// const TND_TABLE: [f32; 203] = const {
26+
// let mut tnd_table = [0.0; 203];
27+
//
28+
// let mut n = 1;
29+
// while n < 203 {
30+
// tnd_table[n] = 163.67 / (24329.0 / (n as f32) + 100.0);
31+
// n += 1;
32+
// }
33+
//
34+
// tnd_table
35+
// };
3636

3737
#[derive(Clone, Serialize, Deserialize)]
3838
enum SequenceMode {
@@ -85,28 +85,25 @@ impl Apu {
8585
// See: https://www.nesdev.org/wiki/APU_Mixer
8686
let p1 = self.pulse1.sample();
8787
let p2 = self.pulse2.sample();
88-
let pulse_out = PULSE_TABLE[(p1 + p2) as usize];
89-
// let pulse_out = match (p1, p2) {
90-
// (0, 0) => 0.0,
91-
// _ => 95.88 / ((8128.0 / (p1 as f32 + p2 as f32)) + 100.0),
92-
// };
88+
let pulse_out = match (p1, p2) {
89+
(0, 0) => 0.0,
90+
_ => 95.88 / ((8128.0 / (p1 as f32 + p2 as f32)) + 100.0),
91+
};
9392

9493
let triangle = self.triangle.sample();
9594
let noise = self.noise.sample();
9695
let dmc = self.dmc.sample();
9796

98-
let tnd_out = TND_TABLE[(3 * triangle + 2 * noise + dmc) as usize];
99-
100-
// let tnd_out = match (triangle, noise, dmc) {
101-
// (0, 0, 0) => 0.0,
102-
// _ => {
103-
// let tnd = 1.0
104-
// / ((triangle as f32 / 8227.0)
105-
// + (noise as f32 / 12241.0)
106-
// + (dmc as f32 / 22638.0));
107-
// 159.79 / (tnd + 100.0)
108-
// }
109-
// };
97+
let tnd_out = match (triangle, noise, dmc) {
98+
(0, 0, 0) => 0.0,
99+
_ => {
100+
let tnd = 1.0
101+
/ ((triangle as f32 / 8227.0)
102+
+ (noise as f32 / 12241.0)
103+
+ (dmc as f32 / 22638.0));
104+
159.79 / (tnd + 100.0)
105+
}
106+
};
110107

111108
pulse_out + tnd_out
112109
}

0 commit comments

Comments
 (0)