mirror of
https://github.com/thestk/stk
synced 2026-01-13 13:01:52 +00:00
Version 3.0
This commit is contained in:
committed by
Stephen Sinclair
parent
7c0ee03d60
commit
868787a5f9
106
effects/PitShift.cpp
Normal file
106
effects/PitShift.cpp
Normal file
@@ -0,0 +1,106 @@
|
||||
/*********************************************/
|
||||
/* PitchShift Effect */
|
||||
/* by Perry Cook, 1996 */
|
||||
/*********************************************/
|
||||
|
||||
#include "PitShift.h"
|
||||
|
||||
PitShift :: PitShift()
|
||||
{
|
||||
delayLine[0] = new DLineL((long) 1024);
|
||||
delayLine[1] = new DLineL((long) 1024);
|
||||
delay[0] = 12;
|
||||
delay[1] = 512;
|
||||
delayLine[0]->setDelay(delay[0]);
|
||||
delayLine[1]->setDelay(delay[1]);
|
||||
effectMix = (MY_FLOAT) 0.5;
|
||||
rate = 1.0;
|
||||
}
|
||||
|
||||
PitShift :: ~PitShift()
|
||||
{
|
||||
delete delayLine[0];
|
||||
delete delayLine[1];
|
||||
}
|
||||
|
||||
void PitShift :: setEffectMix(MY_FLOAT mix)
|
||||
{
|
||||
effectMix = mix;
|
||||
}
|
||||
|
||||
void PitShift :: setShift(MY_FLOAT shift)
|
||||
{
|
||||
if (shift < 1.0) {
|
||||
rate = 1.0 - shift;
|
||||
}
|
||||
else if (shift > 1.0) {
|
||||
rate = 1.0 - shift;
|
||||
}
|
||||
else {
|
||||
rate = 0.0;
|
||||
delay[0] = 512;
|
||||
}
|
||||
}
|
||||
|
||||
MY_FLOAT PitShift :: lastOutput()
|
||||
{
|
||||
return lastOut;
|
||||
}
|
||||
|
||||
MY_FLOAT PitShift :: tick(MY_FLOAT input)
|
||||
{
|
||||
delay[0] = delay[0] + rate;
|
||||
while (delay[0] > 1012) delay[0] -= 1000;
|
||||
while (delay[0] < 12) delay[0] += 1000;
|
||||
delay[1] = delay[0] + 500;
|
||||
while (delay[1] > 1012) delay[1] -= 1000;
|
||||
while (delay[1] < 12) delay[1] += 1000;
|
||||
delayLine[0]->setDelay(delay[0]);
|
||||
delayLine[1]->setDelay(delay[1]);
|
||||
env[1] = fabs(delay[0] - 512) * 0.002;
|
||||
env[0] = 1.0 - env[1];
|
||||
lastOut = env[0] * delayLine[0]->tick(input);
|
||||
lastOut += env[1] * delayLine[1]->tick(input);
|
||||
lastOut *= effectMix;
|
||||
lastOut += (1.0 - effectMix) * input;
|
||||
return lastOut;
|
||||
}
|
||||
|
||||
/************** Test Main Program *********************/
|
||||
/*
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
FILE *soundIn,*soundOut;
|
||||
short data;
|
||||
float efMix,pitchshift;
|
||||
PitShift *effect;
|
||||
|
||||
if (argc==5) {
|
||||
soundIn = fopen(argv[3],"rb");
|
||||
soundOut = fopen(argv[4],"wb");
|
||||
if (soundIn && soundOut) {
|
||||
efMix = atof(argv[1]);
|
||||
pitchshift = atof(argv[2]);
|
||||
effect = new PitShift();
|
||||
effect->setShift(pitchshift);
|
||||
effect->setEffectMix(efMix);
|
||||
while (fread(&data,2,1,soundIn)) {
|
||||
data = effect->tick(data);
|
||||
fwrite(&data,2,1,soundOut);
|
||||
}
|
||||
delete effect;
|
||||
fclose(soundIn);
|
||||
fclose(soundOut);
|
||||
}
|
||||
else {
|
||||
printf("Can't open one of the files\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("useage: pitshift mix shiftRate soundIn.snd soundOut.snd\n");
|
||||
printf("0.0 <= mix <= 1.0\n");
|
||||
printf("maxDelay is in samples\n");
|
||||
printf("soundfiles are 16 bit linear mono or stereo\n");
|
||||
}
|
||||
}
|
||||
*/
|
||||
Reference in New Issue
Block a user