File KarplusString.h¶
File List > DaisySP > Source > PhysicalModeling > KarplusString.h
Go to the documentation of this file
Source Code¶
/*
Copyright (c) 2020 Electrosmith, Corp, Emilie Gillet
Use of this source code is governed by an MIT-style
license that can be found in the LICENSE file or at
https://opensource.org/licenses/MIT.
*/
#pragma once
#ifndef DSY_STRING_H
#define DSY_STRING_H
#include <stdint.h>
#include "Dynamics/crossfade.h"
#include "Utility/dcblock.h"
#include "Utility/delayline.h"
#include "Filters/onepole.h"
#ifdef __cplusplus
namespace daisysp
{
class String
{
public:
String() {}
~String() {}
void Init(float sample_rate);
void Reset();
float Process(const float in);
void SetFreq(float freq);
void SetNonLinearity(float non_linearity_amount);
void SetBrightness(float brightness);
void SetDamping(float damping);
private:
static constexpr size_t kDelayLineSize = 1024;
enum StringNonLinearity
{
NON_LINEARITY_CURVED_BRIDGE,
NON_LINEARITY_DISPERSION
};
template <String::StringNonLinearity non_linearity>
float ProcessInternal(const float in);
DelayLine<float, kDelayLineSize> string_;
DelayLine<float, kDelayLineSize / 4> stretch_;
float frequency_, non_linearity_amount_, brightness_, damping_;
float sample_rate_;
OnePole iir_damping_filter_;
DcBlock dc_blocker_;
CrossFade crossfade_;
float dispersion_noise_;
float curved_bridge_;
// Very crappy linear interpolation upsampler used for low pitches that
// do not fit the delay line. Rarely used.
float src_phase_;
float out_sample_[2];
};
} // namespace daisysp
#endif
#endif