27 ampeg_.setExponentialDecay(
true);
35 int currentPitchWheelPosition)
45 int velocity =
static_cast<int>(floatVelocity * 127.0);
51 if ((
region_ ==
nullptr) || (
region_->sample ==
nullptr) || (
region_->sample->getBuffer() ==
nullptr))
72 double velocityGainDB = -20.0 * log10((127.0 * 127.0) / (velocity * velocity));
73 velocityGainDB *=
region_->amp_veltrack / 100.0;
74 noteGainDB += velocityGainDB;
79 double adjustedPan = (
region_->pan + 100.0) / 200.0;
97 if (
region_->sample->getLoopStart() <
region_->sample->getLoopEnd())
124 if (!allowTailOff || (
region_ ==
nullptr))
174 const float *inL = buffer->getReadPointer(0, 0);
175 const float *inR = buffer->getNumChannels() > 1 ? buffer->getReadPointer(1, 0) :
nullptr;
180 int bufferNumSamples = buffer->getNumSamples();
185 float ampegGain =
ampeg_.getLevel();
186 float ampegSlope =
ampeg_.getSlope();
187 int samplesUntilNextAmpSegment =
ampeg_.getSamplesUntilNextSegment();
188 bool ampSegmentIsExponential =
ampeg_.getSegmentIsExponential();
189 float loopStart =
static_cast<float>(this->
loopStart_);
190 float loopEnd =
static_cast<float>(this->
loopEnd_);
191 float sampleEnd =
static_cast<float>(this->
sampleEnd_);
193 while (--numSamples >= 0)
195 const int pos =
static_cast<int>(sourceSamplePosition);
198 float alpha =
static_cast<float>(sourceSamplePosition - pos);
199 float invAlpha = 1.0f - alpha;
200 int nextPos = pos + 1;
201 if ((loopStart < loopEnd) && (nextPos > loopEnd))
203 nextPos =
static_cast<int>(loopStart);
207 float nextL = nextPos < bufferNumSamples ? inL[nextPos] : inL[pos];
208 float nextR = inR ? (nextPos < bufferNumSamples ? inR[nextPos] : inR[pos]) : nextL;
209 float l = (inL[pos] * invAlpha + nextL * alpha);
210 float r = inR ? (inR[pos] * invAlpha + nextR * alpha) :
l;
229 *outL++ += (
l +
r) * 0.5f;
234 if ((loopStart < loopEnd) && (sourceSamplePosition > loopEnd))
236 sourceSamplePosition = loopStart;
241 if (ampSegmentIsExponential)
243 ampegGain *= ampegSlope;
247 ampegGain += ampegSlope;
249 if (--samplesUntilNextAmpSegment < 0)
251 ampeg_.setLevel(ampegGain);
253 ampegGain =
ampeg_.getLevel();
254 ampegSlope =
ampeg_.getSlope();
255 samplesUntilNextAmpSegment =
ampeg_.getSamplesUntilNextSegment();
256 ampSegmentIsExponential =
ampeg_.getSegmentIsExponential();
259 if ((sourceSamplePosition >= sampleEnd) ||
ampeg_.isDone())
267 ampeg_.setLevel(ampegGain);
268 ampeg_.setSamplesUntilNextSegment(samplesUntilNextAmpSegment);
283 const char *egSegmentNames[] = {
"delay",
"attack",
"hold",
"decay",
"sustain",
"release",
"done"};
285 const static int numEGSegments(
sizeof(egSegmentNames) /
sizeof(egSegmentNames[0]));
287 const char *egSegmentName =
"-Invalid-";
288 int egSegmentIndex =
ampeg_.segmentIndex();
289 if ((egSegmentIndex >= 0) && (egSegmentIndex < numEGSegments))
291 egSegmentName = egSegmentNames[egSegmentIndex];
307 double adjustedPitch =
region_->pitch_keycenter + (note -
region_->pitch_keycenter) * (
region_->pitch_keytrack / 100.0);
313 adjustedPitch += wheel *
region_->bend_up / 100.0;
317 adjustedPitch += wheel *
region_->bend_down / -100.0;
336 return freqOfA * pow(2.0, note / 12.0);
#define CARLA_SAFE_ASSERT_CONTINUE(cond)
Definition CarlaDefines.h:189
#define nullptr
Definition DistrhoDefines.h:75
Region * getRegionFor(int note, int velocity, Region::Trigger trigger=Region::attack)
Definition SFZSound.cpp:103
water::int64 sampleEnd_
Definition SFZVoice.h:52
bool isPlayingNoteDown()
Definition SFZVoice.cpp:271
water::int64 getOffBy()
Definition SFZVoice.cpp:277
Voice()
Definition SFZVoice.cpp:23
bool isPlayingOneShot()
Definition SFZVoice.cpp:273
water::int64 loopStart_
Definition SFZVoice.h:53
void killNote()
Definition SFZVoice.cpp:325
void pitchWheelMoved(int newValue) override
Definition SFZVoice.cpp:154
float noteGainRight_
Definition SFZVoice.h:49
int curPitchWheel_
Definition SFZVoice.h:47
void renderNextBlock(water::AudioSampleBuffer &outputBuffer, int startSample, int numSamples) override
Definition SFZVoice.cpp:166
int curMidiNote_
Definition SFZVoice.h:47
void setRegion(Region *nextRegion)
Definition SFZVoice.cpp:279
water::String infoString()
Definition SFZVoice.cpp:281
float noteGainLeft_
Definition SFZVoice.h:49
int curVelocity_
Definition SFZVoice.h:57
double fractionalMidiNoteInHz(double note, double freqOfA=440.0)
Definition SFZVoice.cpp:331
int numLoops_
Definition SFZVoice.h:56
void stopNoteForGroup()
Definition SFZVoice.cpp:141
double sourceSamplePosition_
Definition SFZVoice.h:50
Region * region_
Definition SFZVoice.h:46
void startNote(int midiNoteNumber, float velocity, water::SynthesiserSound *sound, int currentPitchWheelPosition) override
Definition SFZVoice.cpp:34
void stopNoteQuick()
Definition SFZVoice.cpp:153
void calcPitchRatio()
Definition SFZVoice.cpp:300
double pitchRatio_
Definition SFZVoice.h:48
void stopNote(float velocity, bool allowTailOff) override
Definition SFZVoice.cpp:122
bool canPlaySound(water::SynthesiserSound *sound) override
Definition SFZVoice.cpp:32
int getGroup()
Definition SFZVoice.cpp:275
virtual ~Voice()
Definition SFZVoice.cpp:30
water::int64 loopEnd_
Definition SFZVoice.h:53
void controllerMoved(int controllerNumber, int newValue) override
Definition SFZVoice.cpp:165
EG ampeg_
Definition SFZVoice.h:51
Definition AudioSampleBuffer.h:42
uint32_t getNumChannels() const noexcept
Definition AudioSampleBuffer.h:212
float * getWritePointer(const uint32_t channelNumber) noexcept
Definition AudioSampleBuffer.h:254
static double getMidiNoteInHertz(int noteNumber, double frequencyOfA=440.0) noexcept
Definition MidiMessage.cpp:913
Definition Synthesiser.h:52
void clearCurrentNote()
Definition Synthesiser.cpp:69
double getSampleRate() const noexcept
Definition Synthesiser.h:218
int * l
Definition inflate.c:1579
struct backing_store_struct * info
Definition jmemsys.h:183
Definition SFZDebug.cpp:11
static const float globalGain
Definition SFZVoice.cpp:21
long long int64
Definition water.h:100
Definition SFZRegion.h:30
@ fast
Definition SFZRegion.h:50
@ release
Definition SFZRegion.h:34
LoopMode
Definition SFZRegion.h:40
@ no_loop
Definition SFZRegion.h:42
@ sample_loop
Definition SFZRegion.h:41
@ loop_sustain
Definition SFZRegion.h:45
@ one_shot
Definition SFZRegion.h:43
@ loop_continuous
Definition SFZRegion.h:44
int r
Definition crypt.c:458