File: filter.cpp

package info (click to toggle)
zyn 1%2Bgit.20100609%2Bdfsg0-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 1,296 kB
  • ctags: 2,633
  • sloc: python: 10,629; cpp: 5,828; ansic: 5,427; sh: 31; makefile: 13
file content (93 lines) | stat: -rw-r--r-- 2,327 bytes parent folder | download | duplicates (3)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
  ZynAddSubFX - a software synthesizer
 
  Filter.C - Filters, uses analog,formant,etc. filters
  Copyright (C) 2002-2005 Nasca Octavian Paul
  Author: Nasca Octavian Paul

  This program is free software; you can redistribute it and/or modify
  it under the terms of version 2 of the GNU General Public License 
  as published by the Free Software Foundation.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License (version 2) for more details.

  You should have received a copy of the GNU General Public License (version 2)
  along with this program; if not, write to the Free Software Foundation,
  Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA

*/

#include <math.h>
#include <stdio.h>
#include <assert.h>

#include "globals.h"
#include "filter_base.h"
#include "filter_parameters.h"
#include "analog_filter.h"
#include "sv_filter.h"
#include "formant_filter.h"
#include "filter.h"

void
Filter::init(float sample_rate, FilterParams *pars)
{
  unsigned char Ftype=pars->Ptype;

  m_category = pars->m_category;

  switch (m_category)
  {
  case ZYN_FILTER_TYPE_FORMANT:
    m_formant_filter.init(sample_rate, pars);
    m_filter = &m_formant_filter;
    break;
  case ZYN_FILTER_TYPE_STATE_VARIABLE:
    m_sv_filter.init(sample_rate, Ftype, 1000.0, pars->getq(), pars->m_additional_stages, pars->m_gain);
    m_filter = &m_sv_filter;
    break;
  case ZYN_FILTER_TYPE_ANALOG:
    m_analog_filter.init(sample_rate, Ftype, 1000.0, pars->getq(), pars->m_additional_stages, pars->m_gain);
    m_filter = &m_analog_filter;
    break;
  default:
    assert(0);
  }
}

void Filter::filterout(REALTYPE *smp)
{
  m_filter->filterout(smp);
}

void Filter::setfreq(REALTYPE frequency)
{
  m_filter->setfreq(frequency);
}

void Filter::setfreq_and_q(REALTYPE frequency,REALTYPE q_)
{
  m_filter->setfreq_and_q(frequency,q_);
}

void Filter::setq(REALTYPE q_)
{
  m_filter->setq(q_);
}

REALTYPE
Filter::getrealfreq(REALTYPE freqpitch)
{
  if (m_category == ZYN_FILTER_TYPE_ANALOG ||
      m_category == ZYN_FILTER_TYPE_STATE_VARIABLE)
  {
    return pow(2.0,freqpitch+9.96578428); // log2(1000)=9.95748
  }
  else
  {
    return freqpitch;
  }
}