Mercurial > spc_convert
comparison snes_spc/SPC_Filter.cpp @ 0:e38dacceb958
initial import
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Fri, 21 Oct 2011 05:53:11 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e38dacceb958 |
---|---|
1 // snes_spc 0.9.0. http://www.slack.net/~ant/ | |
2 | |
3 #include "SPC_Filter.h" | |
4 | |
5 #include <string.h> | |
6 | |
7 /* Copyright (C) 2007 Shay Green. This module is free software; you | |
8 can redistribute it and/or modify it under the terms of the GNU Lesser | |
9 General Public License as published by the Free Software Foundation; either | |
10 version 2.1 of the License, or (at your option) any later version. This | |
11 module is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
13 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more | |
14 details. You should have received a copy of the GNU Lesser General Public | |
15 License along with this module; if not, write to the Free Software Foundation, | |
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ | |
17 | |
18 #include "blargg_source.h" | |
19 | |
20 void SPC_Filter::clear() { memset( ch, 0, sizeof ch ); } | |
21 | |
22 SPC_Filter::SPC_Filter() | |
23 { | |
24 gain = gain_unit; | |
25 bass = bass_norm; | |
26 clear(); | |
27 } | |
28 | |
29 void SPC_Filter::run( short* io, int count ) | |
30 { | |
31 require( (count & 1) == 0 ); // must be even | |
32 | |
33 int const gain = this->gain; | |
34 int const bass = this->bass; | |
35 chan_t* c = &ch [2]; | |
36 do | |
37 { | |
38 // cache in registers | |
39 int sum = (--c)->sum; | |
40 int pp1 = c->pp1; | |
41 int p1 = c->p1; | |
42 | |
43 for ( int i = 0; i < count; i += 2 ) | |
44 { | |
45 // Low-pass filter (two point FIR with coeffs 0.25, 0.75) | |
46 int f = io [i] + p1; | |
47 p1 = io [i] * 3; | |
48 | |
49 // High-pass filter ("leaky integrator") | |
50 int delta = f - pp1; | |
51 pp1 = f; | |
52 int s = sum >> (gain_bits + 2); | |
53 sum += (delta * gain) - (sum >> bass); | |
54 | |
55 // Clamp to 16 bits | |
56 if ( (short) s != s ) | |
57 s = (s >> 31) ^ 0x7FFF; | |
58 | |
59 io [i] = (short) s; | |
60 } | |
61 | |
62 c->p1 = p1; | |
63 c->pp1 = pp1; | |
64 c->sum = sum; | |
65 ++io; | |
66 } | |
67 while ( c != ch ); | |
68 } |