summaryrefslogtreecommitdiff
path: root/muse_qt4_evolution/synti/zynaddsubfx/Synth/OscilGen.h
blob: 1d9980a98464e8b5f4db03c19abc5cb62d4b5c3e (plain)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/*
  ZynAddSubFX - a software synthesizer

  OscilGen.h - Waveform generator for ADnote
  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

*/

#ifndef OSCIL_GEN_H
#define OSCIL_GEN_H

#include "../globals.h"
#include "../Misc/XMLwrapper.h"
#include "Resonance.h"
#include "../DSP/FFTwrapper.h"  
#include "../Params/Presets.h"

class OscilGen:public Presets{
    public:
	OscilGen(FFTwrapper *fft_,Resonance *res_);
	~OscilGen();

        //computes the full spectrum of oscil from harmonics,phases and basefunc
	void prepare();

	//do the antialiasing(cut off higher freqs.),apply randomness and do a IFFT
	short get(REALTYPE *smps,REALTYPE freqHz);//returns where should I start getting samples, used in block type randomness
	short get(REALTYPE *smps,REALTYPE freqHz,int resonance);
	//if freqHz is smaller than 0, return the "un-randomized" sample for UI
	
        void getbasefunction(REALTYPE *smps);

	//called by UI
	void getspectrum(int n,REALTYPE *spc,int what);//what=0 pt. oscil,1 pt. basefunc
        void getcurrentbasefunction(REALTYPE *smps);
	void useasbase();//convert oscil to base function

    	void add2XML(XMLwrapper *xml);
	void defaults();
	void getfromXML(XMLwrapper *xml);

	void convert2sine(int magtype);
	
	//Parameters
			
	/* 
	  The hmag and hphase starts counting from 0, so the first harmonic(1) has the index 0,
	  2-nd harmonic has index 1, ..the 128 harminic has index 127
	*/
	unsigned char Phmag[MAX_AD_HARMONICS],Phphase[MAX_AD_HARMONICS];//the MIDI parameters for mag. and phases
	
	
	/*The Type of magnitude:
	    0 - Linear
	    1 - dB scale (-40)
	    2 - dB scale (-60)
	    3 - dB scale (-80)
	    4 - dB scale (-100)*/
	unsigned char Phmagtype;

	unsigned char Pcurrentbasefunc;//The base function used - 0=sin, 1=...
	unsigned char Pbasefuncpar;//the parameter of the base function
	
	unsigned char Pbasefuncmodulation;//what modulation is applied to the basefunc
	unsigned char Pbasefuncmodulationpar1,Pbasefuncmodulationpar2,Pbasefuncmodulationpar3;//the parameter of the base function modulation

	/*the Randomness:
	  64=no randomness
	  63..0 - block type randomness - 0 is maximum
	  65..127 - each harmonic randomness - 127 is maximum*/
	unsigned char Prand;
	unsigned char Pwaveshaping,Pwaveshapingfunction;
	unsigned char Pfiltertype,Pfilterpar1,Pfilterpar2;
	unsigned char Pfilterbeforews;
	unsigned char Psatype,Psapar;//spectrum adjust

	unsigned char Pamprandpower, Pamprandtype;//amplitude randomness
	int Pharmonicshift;//how the harmonics are shifted
	int Pharmonicshiftfirst;//if the harmonic shift is done before waveshaping and filter

	unsigned char Padaptiveharmonics;//the adaptive harmonics status (off=0,on=1,etc..)
	unsigned char Padaptiveharmonicsbasefreq;//the base frequency of the adaptive harmonic (30..3000Hz)
	unsigned char Padaptiveharmonicspower;//the strength of the effect (0=off,100=full)
	unsigned char Padaptiveharmonicspar;//the parameters in 2,3,4.. modes of adaptive harmonics

	unsigned char Pmodulation;//what modulation is applied to the oscil
	unsigned char Pmodulationpar1,Pmodulationpar2,Pmodulationpar3;//the parameter of the parameters


	//makes a new random seed for Amplitude Randomness
	//this should be called every note on event
	void newrandseed(unsigned int randseed);
	
	bool ADvsPAD;//if it is used by ADsynth or by PADsynth

	static REALTYPE *tmpsmps;//this array stores some termporary data and it has SOUND_BUFFER_SIZE elements
	static FFTFREQS outoscilFFTfreqs;

    private:
	
	REALTYPE hmag[MAX_AD_HARMONICS],hphase[MAX_AD_HARMONICS];//the magnituides and the phases of the sine/nonsine harmonics
//    private:
	FFTwrapper *fft;
	//computes the basefunction and make the FFT; newbasefunc<0  = same basefunc
	void changebasefunction();
	//Waveshaping
	void waveshape();

	//Filter the oscillator accotding to Pfiltertype and Pfilterpar
	void oscilfilter();

	//Adjust the spectrum
	void spectrumadjust();
	
	//Shift the harmonics
	void shiftharmonics();
    
	//Do the oscil modulation stuff
	void modulation();

	//Do the adaptive harmonic stuff
	void adaptiveharmonic(FFTFREQS f,REALTYPE freq);
	
	//Do the adaptive harmonic postprocessing (2n+1,2xS,2xA,etc..)
	//this function is called even for the user interface
	//this can be called for the sine and components, and for the spectrum 
	//(that's why the sine and cosine components should be processed with a separate call)
	void adaptiveharmonicpostprocess(REALTYPE *f, int size);
		
    	//Basic/base functions (Functiile De Baza)
	REALTYPE basefunc_pulse(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_saw(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_triangle(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_power(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_gauss(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_diode(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_abssine(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_pulsesine(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_stretchsine(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_chirp(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_absstretchsine(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_chebyshev(REALTYPE x,REALTYPE a);
	REALTYPE basefunc_sqr(REALTYPE x,REALTYPE a);

	//Internal Data
	unsigned char oldbasefunc,oldbasepar,oldhmagtype,oldwaveshapingfunction,oldwaveshaping;
	int oldfilterpars,oldsapars,oldbasefuncmodulation,oldbasefuncmodulationpar1,oldbasefuncmodulationpar2,oldbasefuncmodulationpar3,oldharmonicshift;
	int oldmodulation,oldmodulationpar1,oldmodulationpar2,oldmodulationpar3;


	FFTFREQS basefuncFFTfreqs;//Base Function Frequencies
	FFTFREQS oscilFFTfreqs;//Oscillator Frequencies - this is different than the hamonics set-up by the user, it may contains time-domain data if the antialiasing is turned off
	int oscilprepared;//1 if the oscil is prepared, 0 if it is not prepared and is need to call ::prepare() before ::get()
	
	Resonance *res;	
	
	unsigned int randseed;
	
};


#endif