snapshot
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
declare filename "pitchShifter.dsp";
|
||||
declare name "pitchShifter";
|
||||
declare name "pitchShifter";
|
||||
declare version "1.0";
|
||||
declare author "Grame";
|
||||
declare license "BSD";
|
||||
declare copyright "(c)GRAME 2006";
|
||||
|
||||
//--------------------------------------
|
||||
// very simple real time pitch shifter
|
||||
//--------------------------------------
|
||||
|
||||
import("stdfaust.lib");
|
||||
|
||||
pitchshifter = vgroup("Pitch Shifter", ef.transpose(
|
||||
hslider("window (samples)", 1000, 50, 10000, 1),
|
||||
hslider("xfade (samples)", 10, 1, 10000, 1),
|
||||
hslider("shift (semitones) ", 0, -12, +12, 0.1)
|
||||
)
|
||||
);
|
||||
|
||||
process = (pitchshifter, pitchshifter);
|
||||
@@ -0,0 +1,172 @@
|
||||
/* ------------------------------------------------------------
|
||||
author: "Grame"
|
||||
copyright: "(c)GRAME 2006"
|
||||
license: "BSD"
|
||||
name: "pitchShifter"
|
||||
version: "1.0"
|
||||
Code generated with Faust 2.68.1 (https://faust.grame.fr)
|
||||
Compilation options: -lang cpp -ct 1 -es 1 -mcd 16 -single -ftz 0
|
||||
------------------------------------------------------------ */
|
||||
|
||||
#ifndef __mydsp_H__
|
||||
#define __mydsp_H__
|
||||
|
||||
#ifndef FAUSTFLOAT
|
||||
#define FAUSTFLOAT float
|
||||
#endif
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstdint>
|
||||
|
||||
#ifndef FAUSTCLASS
|
||||
#define FAUSTCLASS mydsp
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#define exp10f __exp10f
|
||||
#define exp10 __exp10
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
#define RESTRICT __restrict
|
||||
#else
|
||||
#define RESTRICT __restrict__
|
||||
#endif
|
||||
|
||||
|
||||
class mydsp : public dsp {
|
||||
|
||||
private:
|
||||
|
||||
FAUSTFLOAT fHslider0;
|
||||
FAUSTFLOAT fHslider1;
|
||||
float fRec0[2];
|
||||
FAUSTFLOAT fHslider2;
|
||||
int IOTA0;
|
||||
float fVec0[131072];
|
||||
float fVec1[131072];
|
||||
int fSampleRate;
|
||||
|
||||
public:
|
||||
mydsp() {}
|
||||
|
||||
void metadata(Meta* m) {
|
||||
m->declare("author", "Grame");
|
||||
m->declare("compile_options", "-lang cpp -ct 1 -es 1 -mcd 16 -single -ftz 0");
|
||||
m->declare("copyright", "(c)GRAME 2006");
|
||||
m->declare("delays.lib/name", "Faust Delay Library");
|
||||
m->declare("delays.lib/version", "1.1.0");
|
||||
m->declare("filename", "pitchShifter.dsp");
|
||||
m->declare("license", "BSD");
|
||||
m->declare("maths.lib/author", "GRAME");
|
||||
m->declare("maths.lib/copyright", "GRAME");
|
||||
m->declare("maths.lib/license", "LGPL with exception");
|
||||
m->declare("maths.lib/name", "Faust Math Library");
|
||||
m->declare("maths.lib/version", "2.6.0");
|
||||
m->declare("misceffects.lib/name", "Misc Effects Library");
|
||||
m->declare("misceffects.lib/version", "2.1.0");
|
||||
m->declare("name", "pitchShifter");
|
||||
m->declare("version", "1.0");
|
||||
}
|
||||
|
||||
virtual int getNumInputs() {
|
||||
return 2;
|
||||
}
|
||||
virtual int getNumOutputs() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
static void classInit(int sample_rate) {
|
||||
}
|
||||
|
||||
virtual void instanceConstants(int sample_rate) {
|
||||
fSampleRate = sample_rate;
|
||||
}
|
||||
|
||||
virtual void instanceResetUserInterface() {
|
||||
fHslider0 = FAUSTFLOAT(0.0f);
|
||||
fHslider1 = FAUSTFLOAT(1e+03f);
|
||||
fHslider2 = FAUSTFLOAT(1e+01f);
|
||||
}
|
||||
|
||||
virtual void instanceClear() {
|
||||
for (int l0 = 0; l0 < 2; l0 = l0 + 1) {
|
||||
fRec0[l0] = 0.0f;
|
||||
}
|
||||
IOTA0 = 0;
|
||||
for (int l1 = 0; l1 < 131072; l1 = l1 + 1) {
|
||||
fVec0[l1] = 0.0f;
|
||||
}
|
||||
for (int l2 = 0; l2 < 131072; l2 = l2 + 1) {
|
||||
fVec1[l2] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void init(int sample_rate) {
|
||||
classInit(sample_rate);
|
||||
instanceInit(sample_rate);
|
||||
}
|
||||
|
||||
virtual void instanceInit(int sample_rate) {
|
||||
instanceConstants(sample_rate);
|
||||
instanceResetUserInterface();
|
||||
instanceClear();
|
||||
}
|
||||
|
||||
virtual mydsp* clone() {
|
||||
return new mydsp();
|
||||
}
|
||||
|
||||
virtual int getSampleRate() {
|
||||
return fSampleRate;
|
||||
}
|
||||
|
||||
virtual void buildUserInterface(UI* ui_interface) {
|
||||
ui_interface->openVerticalBox("Pitch Shifter");
|
||||
ui_interface->addHorizontalSlider("shift (semitones)", &fHslider0, FAUSTFLOAT(0.0f), FAUSTFLOAT(-12.0f), FAUSTFLOAT(12.0f), FAUSTFLOAT(0.1f));
|
||||
ui_interface->addHorizontalSlider("window (samples)", &fHslider1, FAUSTFLOAT(1e+03f), FAUSTFLOAT(5e+01f), FAUSTFLOAT(1e+04f), FAUSTFLOAT(1.0f));
|
||||
ui_interface->addHorizontalSlider("xfade (samples)", &fHslider2, FAUSTFLOAT(1e+01f), FAUSTFLOAT(1.0f), FAUSTFLOAT(1e+04f), FAUSTFLOAT(1.0f));
|
||||
ui_interface->closeBox();
|
||||
}
|
||||
|
||||
virtual void compute(int count, FAUSTFLOAT** RESTRICT inputs, FAUSTFLOAT** RESTRICT outputs) {
|
||||
FAUSTFLOAT* input0 = inputs[0];
|
||||
FAUSTFLOAT* input1 = inputs[1];
|
||||
FAUSTFLOAT* output0 = outputs[0];
|
||||
FAUSTFLOAT* output1 = outputs[1];
|
||||
float fSlow0 = std::pow(2.0f, 0.083333336f * float(fHslider0));
|
||||
float fSlow1 = float(fHslider1);
|
||||
float fSlow2 = 1.0f / float(fHslider2);
|
||||
for (int i0 = 0; i0 < count; i0 = i0 + 1) {
|
||||
fRec0[0] = std::fmod(fSlow1 + (fRec0[1] + 1.0f - fSlow0), fSlow1);
|
||||
float fTemp0 = std::min<float>(fSlow2 * fRec0[0], 1.0f);
|
||||
float fTemp1 = 1.0f - fTemp0;
|
||||
float fTemp2 = float(input0[i0]);
|
||||
fVec0[IOTA0 & 131071] = fTemp2;
|
||||
float fTemp3 = fSlow1 + fRec0[0];
|
||||
int iTemp4 = int(fTemp3);
|
||||
int iTemp5 = std::min<int>(65537, std::max<int>(0, iTemp4 + 1));
|
||||
float fTemp6 = std::floor(fTemp3);
|
||||
float fTemp7 = fSlow1 + (fRec0[0] - fTemp6);
|
||||
float fTemp8 = 1.0f - fRec0[0];
|
||||
float fTemp9 = fTemp6 + fTemp8 - fSlow1;
|
||||
int iTemp10 = std::min<int>(65537, std::max<int>(0, iTemp4));
|
||||
int iTemp11 = int(fRec0[0]);
|
||||
int iTemp12 = std::min<int>(65537, std::max<int>(0, iTemp11 + 1));
|
||||
float fTemp13 = std::floor(fRec0[0]);
|
||||
float fTemp14 = fRec0[0] - fTemp13;
|
||||
float fTemp15 = fTemp13 + fTemp8;
|
||||
int iTemp16 = std::min<int>(65537, std::max<int>(0, iTemp11));
|
||||
output0[i0] = FAUSTFLOAT((fVec0[(IOTA0 - iTemp16) & 131071] * fTemp15 + fTemp14 * fVec0[(IOTA0 - iTemp12) & 131071]) * fTemp0 + (fVec0[(IOTA0 - iTemp10) & 131071] * fTemp9 + fTemp7 * fVec0[(IOTA0 - iTemp5) & 131071]) * fTemp1);
|
||||
float fTemp17 = float(input1[i0]);
|
||||
fVec1[IOTA0 & 131071] = fTemp17;
|
||||
output1[i0] = FAUSTFLOAT(fTemp0 * (fVec1[(IOTA0 - iTemp16) & 131071] * fTemp15 + fTemp14 * fVec1[(IOTA0 - iTemp12) & 131071]) + fTemp1 * (fTemp9 * fVec1[(IOTA0 - iTemp10) & 131071] + fTemp7 * fVec1[(IOTA0 - iTemp5) & 131071]));
|
||||
fRec0[1] = fRec0[0];
|
||||
IOTA0 = IOTA0 + 1;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* @file streams-i2s-faust_pitchshift-i2s.ino
|
||||
* @author Phil Schatzmann
|
||||
* @brief Example how to use Faust for pitch shifting in stereo
|
||||
* @version 0.1
|
||||
* @date 2022-04-22
|
||||
*
|
||||
* @copyright Copyright (c) 2022
|
||||
*
|
||||
*/
|
||||
|
||||
#include "AudioTools.h"
|
||||
#include "AudioTools/AudioLibs/AudioBoardStream.h"
|
||||
#include "AudioTools/AudioLibs/AudioFaust.h"
|
||||
#include "pitchShifter.h"
|
||||
|
||||
AudioBoardStream io(AudioKitEs8388V1);
|
||||
FaustStream<mydsp> faust(io); // final output to io
|
||||
StreamCopy copier(faust, io); // copy mic to faust
|
||||
|
||||
// Arduino Setup
|
||||
void setup(void) {
|
||||
// Open Serial
|
||||
Serial.begin(115200);
|
||||
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);
|
||||
|
||||
// Setup Faust
|
||||
auto cfg = faust.defaultConfig();
|
||||
faust.begin(cfg);
|
||||
|
||||
|
||||
// start I2S
|
||||
auto cfg_i2s = io.defaultConfig(RXTX_MODE);
|
||||
cfg_i2s.copyFrom(cfg);
|
||||
io.begin(cfg_i2s);
|
||||
|
||||
}
|
||||
|
||||
// Arduino loop - copy sound to out
|
||||
void loop() {
|
||||
copier.copy();
|
||||
}
|
||||
Reference in New Issue
Block a user