/[svn]/linuxsampler/trunk/src/engines/gig/Filter.h
ViewVC logotype

Contents of /linuxsampler/trunk/src/engines/gig/Filter.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 319 - (show annotations) (download) (as text)
Mon Dec 13 00:46:42 2004 UTC (13 years, 6 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 7622 byte(s)
* introduced 'synthesis mode' to reduce the amount of code and conditionals
  for the current synthesis case in the main synthesis loop
* support for MMX and SSE(1) in the core synthesis algorithms (CPU feature
  detection at runtime, only x86 so far)

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the Free Software *
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
20 * MA 02111-1307 USA *
21 ***************************************************************************/
22
23 #ifndef __LS_GIG_FILTER_H__
24 #define __LS_GIG_FILTER_H__
25
26 #include "../../common/global.h"
27
28 #if DEBUG_HEADERS
29 # warning Filter.h included
30 #endif // DEBUG_HEADERS
31
32 #include "../common/BiquadFilter.h"
33
34 // TODO: Gigasampler's "Turbo Lowpass" and "Bandreject" filters not implemented yet
35
36 #include "../../lib/fileloader/libgig/gig.h"
37
38 #define LSF_BW 0.9
39 #define LSF_FB 0.9f
40
41 namespace LinuxSampler { namespace gig {
42
43 /**
44 * These are filters similar to the ones from Gigasampler.
45 */
46 class Filter {
47 protected:
48 BandpassFilter BasicBPFilter;
49 HighpassFilter HPFilter;
50 BandpassFilter BPFilter;
51 LowpassFilter LPFilter;
52 BiquadFilter* pFilter;
53 bq_t scale;
54 bq_t resonance;
55 bq_t cutoff;
56 ::gig::vcf_type_t Type;
57 static const float fFB = LSF_FB;
58 public:
59
60 Filter() {
61 // set filter type to 'lowpass' by default
62 pFilter = &LPFilter;
63 Type = ::gig::vcf_type_lowpass;
64 }
65
66 inline bq_t Cutoff() { return cutoff; }
67
68 inline bq_t Resonance() { return resonance; }
69
70 inline void SetType(::gig::vcf_type_t FilterType) {
71 switch (FilterType) {
72 case ::gig::vcf_type_highpass:
73 pFilter = &HPFilter;
74 break;
75 case ::gig::vcf_type_bandreject: //TODO: not implemented yet
76 Type = ::gig::vcf_type_bandpass;
77 case ::gig::vcf_type_bandpass:
78 pFilter = &BPFilter;
79 break;
80 case ::gig::vcf_type_lowpassturbo: //TODO: not implemented yet
81 default:
82 Type = ::gig::vcf_type_lowpass;
83 case ::gig::vcf_type_lowpass:
84 pFilter = &LPFilter;
85
86 }
87 Type = FilterType;
88 }
89
90 inline void SetParameters(bq_t cutoff, bq_t resonance, bq_t fs) {
91 BasicBPFilter.SetParameters(cutoff, 0.7, fs);
92 switch (Type) {
93 case ::gig::vcf_type_highpass:
94 HPFilter.SetParameters(cutoff, 1.0 - resonance * LSF_BW, fs);
95 break;
96 case ::gig::vcf_type_bandpass:
97 BPFilter.SetParameters(cutoff, 1.0 - resonance * LSF_BW, fs);
98 break;
99 case ::gig::vcf_type_lowpass:
100 LPFilter.SetParameters(cutoff, 1.0 - resonance * LSF_BW, fs);
101 break;
102 }
103 this->scale = 1.0f - resonance * 0.7f;
104 this->resonance = resonance;
105 this->cutoff = cutoff;
106 }
107
108 inline void SetParameters(biquad_param_t* base, biquad_param_t* main, bq_t cutoff, bq_t resonance, bq_t fs) {
109 BasicBPFilter.SetParameters(base, cutoff, 0.7, fs);
110 switch (Type) {
111 case ::gig::vcf_type_highpass:
112 HPFilter.SetParameters(main, cutoff, 1.0 - resonance * LSF_BW, fs);
113 break;
114 case ::gig::vcf_type_bandpass:
115 BPFilter.SetParameters(main, cutoff, 1.0 - resonance * LSF_BW, fs);
116 break;
117 case ::gig::vcf_type_lowpass:
118 LPFilter.SetParameters(main, cutoff, 1.0 - resonance * LSF_BW, fs);
119 break;
120 }
121 this->scale = 1.0f - resonance * 0.7f;
122 this->resonance = resonance;
123 this->cutoff = cutoff;
124 }
125
126 void Reset() {
127 BasicBPFilter.Reset();
128 HPFilter.Reset();
129 BPFilter.Reset();
130 LPFilter.Reset();
131 }
132
133 inline bq_t Apply(const bq_t in) {
134 return pFilter->Apply(in) * this->scale +
135 BasicBPFilter.ApplyFB(in, this->resonance * LSF_FB) * this->resonance;
136 }
137
138 inline bq_t Apply(biquad_param_t* base, biquad_param_t* main, const bq_t in) {
139 return pFilter->Apply(main, in) * this->scale +
140 BasicBPFilter.ApplyFB(base, in, this->resonance * LSF_FB) * this->resonance;
141 }
142
143 // expects to find input in xmm0 and leaves output in xmm7
144 inline void Apply4StepsSSE(biquad_param_t* base, biquad_param_t* main) {
145 float fb;
146 __asm__ __volatile__ (
147 "movss %0, %%xmm4\n\t"
148 "mulss %1, %%xmm4 # this->resonance * LSF_FB\n\t"
149 "movss %%xmm4, %2\n\t"
150 :: "m" (fFB), /* %0 */
151 "m" (resonance), /* %1 */
152 "m" (fb) /* %2 */
153 );
154 BasicBPFilter.ApplyFB4StepsSSE(base, fb); // leaves output in xmm7
155 __asm__ __volatile__ (
156 "movss %0, %%xmm4\n\t"
157 "shufps $0, %%xmm4, %%xmm4 # copy to other 3 cells\n\t"
158 "mulps %%xmm4, %%xmm7 # ApplyFB() * this->resonance\n\t"
159 :: "m" (resonance) /* %0 */
160 );
161 pFilter->Apply4StepsSSE(main); // leaves output in xmm6
162 __asm__ __volatile__ (
163 "movss %0, %%xmm5\n\t"
164 "shufps $0, %%xmm5, %%xmm5 # copy to other 3 cells\n\t"
165 "mulps %%xmm5, %%xmm6 # Apply() * this->scale\n\t"
166 "addps %%xmm6, %%xmm7 # xmm7 = result\n\t"
167 :: "m" (scale) /* %0 */
168 );
169 }
170 };
171
172 }} //namespace LinuxSampler::gig
173
174 #endif // __LS_GIG_FILTER_H__

  ViewVC Help
Powered by ViewVC