/[svn]/linuxsampler/trunk/src/engines/sfz/Voice.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/sfz/Voice.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2015 by iliev, Sun Oct 25 22:22:52 2009 UTC revision 2061 by persson, Tue Feb 23 18:32:31 2010 UTC
# Line 3  Line 3 
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   LinuxSampler - modular, streaming capable sampler                     *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *
6   *   Copyright (C) 2005 - 2009 Christian Schoenebeck                       *   *   Copyright (C) 2005 - 2008 Christian Schoenebeck                       *
7   *   Copyright (C) 2009 Grigor Iliev                                       *   *   Copyright (C) 2009 - 2010 Christian Schoenebeck and Grigor Iliev      *
8   *                                                                         *   *                                                                         *
9   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
10   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 56  namespace LinuxSampler { namespace sfz { Line 56  namespace LinuxSampler { namespace sfz {
56          si.BitDepth         = (pSample->GetFrameSize() / pSample->GetChannelCount()) * 8;          si.BitDepth         = (pSample->GetFrameSize() / pSample->GetChannelCount()) * 8;
57          si.TotalFrameCount  = pSample->GetTotalFrameCount();          si.TotalFrameCount  = pSample->GetTotalFrameCount();
58    
59          si.HasLoops       = false; // TODO:          si.HasLoops       = pRegion->HasLoop();
60          si.LoopStart      = 0; // TODO:          si.LoopStart      = pRegion->GetLoopStart();
61          si.LoopLength     = 0; // TODO:          si.LoopLength     = pRegion->GetLoopEnd() - pRegion->GetLoopStart();
62          si.LoopPlayCount  = 0; // TODO:          si.LoopPlayCount  = pRegion->GetLoopCount();
63          si.Unpitched      = false; // TODO:          si.Unpitched      = pRegion->pitch_keytrack == 0;
64          return si;          return si;
65      }      }
66    
67      Voice::RegionInfo Voice::GetRegionInfo() {      Voice::RegionInfo Voice::GetRegionInfo() {
68          RegionInfo ri;          RegionInfo ri;
69          /*ri.UnityNote = pSample->OriginalPitch;          ri.UnityNote = pRegion->pitch_keycenter;
70          ri.FineTune  = pRegion->tune;          ri.FineTune  = pRegion->tune;
71          ri.Pan       = pRegion->pan;          ri.Pan       = int(pRegion->pan * 0.63); // convert from -100..100 to -64..63
72          ri.SampleStartOffset = pRegion->startAddrsOffset + pRegion->startAddrsCoarseOffset;          ri.SampleStartOffset = 0; // TODO:
73    
74          ri.EG1PreAttack        = 1000;          ri.EG1PreAttack        = pRegion->ampeg_start * 10;
75          ri.EG1Attack           = pRegion->EG1Attack;          ri.EG1Attack           = pRegion->ampeg_attack;
76          ri.EG1Hold             = pRegion->EG1Hold;          ri.EG1Hold             = pRegion->ampeg_hold;
77          ri.EG1Decay1           = pRegion->EG1Decay;          ri.EG1Decay1           = pRegion->ampeg_decay;
78          ri.EG1Decay2           = pRegion->EG1Decay;          ri.EG1Decay2           = pRegion->ampeg_decay;
79          ri.EG1Sustain          = pRegion->EG1Sustain;          ri.EG1Sustain          = pRegion->ampeg_sustain * 10;
80          ri.EG1InfiniteSustain  = true;          ri.EG1InfiniteSustain  = true;
81          ri.EG1Release          = pRegion->EG1Release;          ri.EG1Release          = pRegion->ampeg_release;
82    
83          ri.EG2PreAttack        = 1000;          ri.EG2PreAttack        = pRegion->fileg_start * 10;
84          ri.EG2Attack           = pRegion->EG2Attack;          ri.EG2Attack           = pRegion->fileg_attack;
85          //ri.EG2Hold             = pRegion->EG2Hold; // TODO:          //ri.EG2Hold             = pRegion->fileg_hold; // TODO:
86          ri.EG2Decay1           = pRegion->EG2Decay;          ri.EG2Decay1           = pRegion->fileg_decay;
87          ri.EG2Decay2           = pRegion->EG2Decay;          ri.EG2Decay2           = pRegion->fileg_decay;
88          ri.EG2Sustain          = pRegion->EG2Sustain;          ri.EG2Sustain          = pRegion->fileg_sustain * 10;
89          ri.EG2InfiniteSustain  = true;          ri.EG2InfiniteSustain  = true;
90          ri.EG2Release          = pRegion->EG2Release;          ri.EG2Release          = pRegion->fileg_release;
91    
92          ri.EG3Attack     = 0; // TODO:          ri.EG3Attack     = pRegion->pitcheg_attack;
93          ri.EG3Depth      = 0; // TODO:          ri.EG3Depth      = 0; // TODO:
94          ri.VCFEnabled    = false; // TODO:          ri.VCFEnabled    = false; // TODO:
95          ri.VCFType       = ::gig::vcf_type_lowpass; // TODO:          ri.VCFType       = ::gig::vcf_type_lowpass; // TODO:
96          ri.VCFResonance  = 0; // TODO:          ri.VCFResonance  = 0; // TODO:
97    
98          ri.ReleaseTriggerDecay = 0;*/          // rt_decay is in dB. Precalculate a suitable value for exp in
99            // GetReleaseTriggerAttenuation: -ln(10) / 20 * rt_decay
100            ri.ReleaseTriggerDecay = -0.115129254649702 * pRegion->rt_decay;
101    
102          return ri;          return ri;
103      }      }
# Line 117  namespace LinuxSampler { namespace sfz { Line 119  namespace LinuxSampler { namespace sfz {
119      }      }
120    
121      double Voice::GetVelocityRelease(uint8_t MIDIKeyVelocity) {      double Voice::GetVelocityRelease(uint8_t MIDIKeyVelocity) {
122          return 0.0; // TODO:          return 0.9; // TODO:
123      }      }
124    
125      void Voice::ProcessCCEvent(RTList<Event>::Iterator& itEvent) {      void Voice::ProcessCCEvent(RTList<Event>::Iterator& itEvent) {
# Line 202  namespace LinuxSampler { namespace sfz { Line 204  namespace LinuxSampler { namespace sfz {
204          return eg;          return eg;
205      }      }
206    
207      double Voice::GetEG2ControllerValue(uint8_t MIDIKeyVelocity) {      void Voice::TriggerEG1(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity) {
208    
209            // TODO: controller modulation
210    
211            // first check if there is a v2 EG for amplitude
212            for (int i = 0 ; i < pRegion->eg.size() ; i++) {
213                if (pRegion->eg[i].amplitude > 0) {
214                    // TODO: actually use the value of the amplitude parameter
215                    pEG1 = &EG1;
216                    EG1.trigger(pRegion->eg[i], sampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE, velocity);
217                    return;
218                }
219            }
220    
221            // otherwise use the v1 EGADSR
222            pEG1 = &EGADSR1;
223            EGADSR1.trigger(uint(RgnInfo.EG1PreAttack),
224                            RgnInfo.EG1Attack,
225                            RgnInfo.EG1Hold,
226                            RgnInfo.EG1Decay1,
227                            uint(RgnInfo.EG1Sustain),
228                            RgnInfo.EG1Release,
229                            sampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
230         }
231    
232         double Voice::GetEG2ControllerValue(uint8_t MIDIKeyVelocity) {
233          /*double eg2controllervalue = 0;          /*double eg2controllervalue = 0;
234          switch (pRegion->EG2Controller.type) {          switch (pRegion->EG2Controller.type) {
235              case ::gig::eg2_ctrl_t::type_none: // no controller defined              case ::gig::eg2_ctrl_t::type_none: // no controller defined
# Line 467  namespace LinuxSampler { namespace sfz { Line 494  namespace LinuxSampler { namespace sfz {
494          return 0;          return 0;
495      }      }
496    
497        float Voice::GetReleaseTriggerAttenuation(float noteLength) {
498            // pow(10, -rt_decay * noteLength / 20):
499            return expf(RgnInfo.ReleaseTriggerDecay * noteLength);
500        }
501    
502  }} // namespace LinuxSampler::sfz  }} // namespace LinuxSampler::sfz

Legend:
Removed from v.2015  
changed lines
  Added in v.2061

  ViewVC Help
Powered by ViewVC