1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
ix!();

use crate::{
    WTOscillator,
};

impl WTOscillator {

    #[inline] pub fn get_ipos(&mut self, fm: bool, vidx: usize) -> u32
    {
        let p24 = 1 << 24;

        let ipos: u32 = match fm {
            true => (
                (p24 as f32) * 
                (
                    self.blitter.oscstate[vidx] * 
                    self.blitter.pitchmult_inv * 
                    self.fm_mul_inv
                )
            ) as u32,
            false =>  (
                (p24 as f32) * 
                (
                    self.blitter.oscstate[vidx] * 
                    self.blitter.pitchmult_inv
                )
            ) as u32,
        };
        ipos
    }

    #[inline] pub fn get_newlevel(&mut self, vidx: usize, block_pos: f32) -> f32
    {
        let tblip_ipol: f32 = lerp(block_pos, self.last_tableipol, self.tableipol);

        let newlevel: f32 = {

            let mipidx  = self.mipmap[vidx] as usize;
            let tidx    = self.tableid as usize;
            let blitidx = self.blitter.state[vidx] as usize;

            let lerpx   = tblip_ipol;
            let lerpa   = self.wave_wavetable.data[[mipidx,tidx,blitidx]] as f32;
            let lerpb   = self.wave_wavetable.data[[mipidx,tidx + 1,blitidx]] as f32;

            let interpd = lerp(lerpx, lerpa, lerpb);

            self.distort_level( interpd )
        };
        newlevel
    }
}