31 |
|
|
32 |
namespace LinuxSampler { namespace sfz { |
namespace LinuxSampler { namespace sfz { |
33 |
|
|
34 |
Voice::Voice() { |
typedef LinuxSampler::VoiceBase<EngineChannel, ::sfz::Region, Sample, DiskThread> SfzVoice; |
35 |
|
Voice::Voice(): SignalRack(this), SfzVoice(&SignalRack) { |
36 |
pEngine = NULL; |
pEngine = NULL; |
37 |
} |
} |
38 |
|
|
72 |
ri.UnityNote = pRegion->pitch_keycenter; |
ri.UnityNote = pRegion->pitch_keycenter; |
73 |
ri.FineTune = pRegion->tune + pRegion->transpose * 100; |
ri.FineTune = pRegion->tune + pRegion->transpose * 100; |
74 |
ri.Pan = int(pRegion->pan * 0.63); // convert from -100..100 to -64..63 |
ri.Pan = int(pRegion->pan * 0.63); // convert from -100..100 to -64..63 |
75 |
ri.SampleStartOffset = 0; // TODO: |
ri.SampleStartOffset = pRegion->offset ? *(pRegion->offset) : 0; |
|
|
|
|
ri.EG1PreAttack = pRegion->ampeg_start * 10; |
|
|
ri.EG1Attack = pRegion->ampeg_attack; |
|
|
ri.EG1Hold = pRegion->ampeg_hold; |
|
|
ri.EG1Decay1 = pRegion->ampeg_decay; |
|
|
ri.EG1Decay2 = pRegion->ampeg_decay; |
|
|
ri.EG1Sustain = pRegion->ampeg_sustain * 10; |
|
|
ri.EG1InfiniteSustain = true; |
|
|
ri.EG1Release = pRegion->ampeg_release; |
|
76 |
|
|
77 |
ri.EG2PreAttack = pRegion->fileg_start * 10; |
ri.EG2PreAttack = pRegion->fileg_start * 10; |
78 |
ri.EG2Attack = pRegion->fileg_attack; |
ri.EG2Attack = pRegion->fileg_attack; |
253 |
|
|
254 |
// otherwise use the v1 EGADSR |
// otherwise use the v1 EGADSR |
255 |
pEG1 = &EGADSR1; |
pEG1 = &EGADSR1; |
256 |
EGADSR1.trigger(uint(RgnInfo.EG1PreAttack), |
EGADSR1.trigger(uint(pRegion->ampeg_start * 10), |
257 |
std::max(0.0, RgnInfo.EG1Attack + pRegion->ampeg_vel2attack * velrelease), |
std::max(0.0, pRegion->ampeg_attack + pRegion->ampeg_vel2attack * velrelease), |
258 |
std::max(0.0, RgnInfo.EG1Hold + pRegion->ampeg_vel2hold * velrelease), |
std::max(0.0, pRegion->ampeg_hold + pRegion->ampeg_vel2hold * velrelease), |
259 |
std::max(0.0, RgnInfo.EG1Decay1 + pRegion->ampeg_vel2decay * velrelease), |
std::max(0.0, pRegion->ampeg_decay + pRegion->ampeg_vel2decay * velrelease), |
260 |
uint(std::min(std::max(0.0, RgnInfo.EG1Sustain + 10 * pRegion->ampeg_vel2sustain * velrelease), 1000.0)), |
uint(std::min(std::max(0.0, 10 * (pRegion->ampeg_sustain + pRegion->ampeg_vel2sustain * velrelease)), 1000.0)), |
261 |
std::max(0.0, RgnInfo.EG1Release + pRegion->ampeg_vel2release * velrelease), |
std::max(0.0, pRegion->ampeg_release + pRegion->ampeg_vel2release * velrelease), |
262 |
sampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
sampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
263 |
} |
} |
264 |
|
|
518 |
EnterReleaseStage(); |
EnterReleaseStage(); |
519 |
} else { |
} else { |
520 |
// kill the voice fast |
// kill the voice fast |
521 |
pEG1->enterFadeOutStage(); |
SignalRack.EnterFadeOutStage(); |
522 |
} |
} |
523 |
} |
} |
524 |
} |
} |
525 |
|
|
526 |
|
void Voice::SetSampleStartOffset() { |
527 |
|
if (DiskVoice && RgnInfo.SampleStartOffset > pSample->MaxOffset) { |
528 |
|
// The offset is applied to the RAM buffer |
529 |
|
finalSynthesisParameters.dPos = 0; |
530 |
|
Pos = 0; |
531 |
|
} else { |
532 |
|
finalSynthesisParameters.dPos = RgnInfo.SampleStartOffset; // offset where we should start playback of sample |
533 |
|
Pos = RgnInfo.SampleStartOffset; |
534 |
|
} |
535 |
|
} |
536 |
|
|
537 |
}} // namespace LinuxSampler::sfz |
}} // namespace LinuxSampler::sfz |