summaryrefslogtreecommitdiff
path: root/servers/audio/effects/audio_effect_pitch_shift.h
blob: d1343a0745059aad624994474e913443613342b9 (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
#ifndef AUDIO_EFFECT_PITCH_SHIFT_H
#define AUDIO_EFFECT_PITCH_SHIFT_H


#include "servers/audio/audio_effect.h"

class SMBPitchShift {

	enum {
		MAX_FRAME_LENGTH=8192
	};

	float gInFIFO[MAX_FRAME_LENGTH];
	float gOutFIFO[MAX_FRAME_LENGTH];
	float gFFTworksp[2*MAX_FRAME_LENGTH];
	float gLastPhase[MAX_FRAME_LENGTH/2+1];
	float gSumPhase[MAX_FRAME_LENGTH/2+1];
	float gOutputAccum[2*MAX_FRAME_LENGTH];
	float gAnaFreq[MAX_FRAME_LENGTH];
	float gAnaMagn[MAX_FRAME_LENGTH];
	float gSynFreq[MAX_FRAME_LENGTH];
	float gSynMagn[MAX_FRAME_LENGTH];
	long gRover;

	void smbFft(float *fftBuffer, long fftFrameSize, long sign);
public:
	void PitchShift(float pitchShift, long numSampsToProcess, long fftFrameSize, long osamp, float sampleRate, float *indata, float *outdata, int stride);

	SMBPitchShift() {
		gRover=0;
		memset(gInFIFO, 0, MAX_FRAME_LENGTH*sizeof(float));
		memset(gOutFIFO, 0, MAX_FRAME_LENGTH*sizeof(float));
		memset(gFFTworksp, 0, 2*MAX_FRAME_LENGTH*sizeof(float));
		memset(gLastPhase, 0, (MAX_FRAME_LENGTH/2+1)*sizeof(float));
		memset(gSumPhase, 0, (MAX_FRAME_LENGTH/2+1)*sizeof(float));
		memset(gOutputAccum, 0, 2*MAX_FRAME_LENGTH*sizeof(float));
		memset(gAnaFreq, 0, MAX_FRAME_LENGTH*sizeof(float));
		memset(gAnaMagn, 0, MAX_FRAME_LENGTH*sizeof(float));
	}


};


class AudioEffectPitchShift;

class AudioEffectPitchShiftInstance : public AudioEffectInstance {
	GDCLASS(AudioEffectPitchShiftInstance,AudioEffectInstance)
friend class AudioEffectPitchShift;
	Ref<AudioEffectPitchShift> base;

	SMBPitchShift shift_l;
	SMBPitchShift shift_r;


public:

	virtual void process(const AudioFrame *p_src_frames,AudioFrame *p_dst_frames,int p_frame_count);

};


class AudioEffectPitchShift : public AudioEffect {
	GDCLASS(AudioEffectPitchShift,AudioEffect)

friend class AudioEffectPitchShiftInstance;

	float pitch_scale;
	int window_size;
	float wet;
	float dry;
	bool filter;

protected:

	static void _bind_methods();
public:


	Ref<AudioEffectInstance> instance();

	void set_pitch_scale(float p_adjust);
	float get_pitch_scale() const;

	AudioEffectPitchShift();
};


#endif // AUDIO_EFFECT_PITCH_SHIFT_H