33 int midiNoteForNormalPitch,
34 double attackTimeSecs,
35 double releaseTimeSecs,
36 double maxSampleLengthSeconds)
38 sourceSampleRate (source.sampleRate),
40 midiRootNote (midiNoteForNormalPitch)
45 (
int) (maxSampleLengthSeconds * sourceSampleRate));
49 source.
read (data.get(), 0, length + 4, 0,
true,
true);
51 params.
attack =
static_cast<float> (attackTimeSecs);
52 params.
release =
static_cast<float> (releaseTimeSecs);
62 return midiNotes[midiNoteNumber];
76 return dynamic_cast<const SamplerSound*
> (sound) !=
nullptr;
83 pitchRatio = std::pow (2.0, (midiNoteNumber - sound->midiRootNote) / 12.0)
86 sourceSamplePosition = 0.0;
122 auto& data = *playingSound->data;
123 const float*
const inL = data.getReadPointer (0);
124 const float*
const inR = data.getNumChannels() > 1 ? data.getReadPointer (1) :
nullptr;
129 while (--numSamples >= 0)
131 auto pos = (int) sourceSamplePosition;
132 auto alpha = (float) (sourceSamplePosition - pos);
133 auto invAlpha = 1.0f - alpha;
136 float l = (inL[pos] * invAlpha + inL[pos + 1] * alpha);
137 float r = (inR !=
nullptr) ? (inR[pos] * invAlpha + inR[pos + 1] * alpha)
142 l *= lgain * envelopeValue;
143 r *= rgain * envelopeValue;
152 *outL++ += (l + r) * 0.5f;
155 sourceSamplePosition += pitchRatio;
157 if (sourceSamplePosition > playingSound->length)
void setSampleRate(double sampleRate)
void setParameters(const Parameters &newParameters)
Type * getWritePointer(int channelNumber) noexcept
int getNumChannels() const noexcept
bool appliesToChannel(int midiChannel) override
SamplerSound(const String &name, AudioFormatReader &source, const BigInteger &midiNotes, int midiNoteForNormalPitch, double attackTimeSecs, double releaseTimeSecs, double maxSampleLengthSeconds)
bool appliesToNote(int midiNoteNumber) override
void startNote(int midiNoteNumber, float velocity, SynthesiserSound *, int pitchWheel) override
void controllerMoved(int controllerNumber, int newValue) override
bool canPlaySound(SynthesiserSound *) override
void renderNextBlock(AudioBuffer< float > &, int startSample, int numSamples) override
void pitchWheelMoved(int newValue) override
void stopNote(float velocity, bool allowTailOff) override
double getSampleRate() const noexcept
SynthesiserSound::Ptr getCurrentlyPlayingSound() const noexcept