Esempio n. 1
0
        public override void Load(DescriptorList description, AssetManager assets)
        {
            //read in sfz params
            CustomDescriptor sfzConfig = description.FindCustomDescriptor("sfzi");

            exTarget    = (int)sfzConfig.Objects[0];
            exGroup     = (int)sfzConfig.Objects[1];
            sfzVolume   = (float)sfzConfig.Objects[2];
            sfzPan      = new PanComponent((float)sfzConfig.Objects[3], PanFormulaEnum.Neg3dBCenter);
            ampKeyTrack = (float)sfzConfig.Objects[4];
            ampRootKey  = (byte)sfzConfig.Objects[5];
            ampVelTrack = (float)sfzConfig.Objects[6];
            //read in the generator info
            GeneratorDescriptor gdes = description.GenDescriptions[0];

            if (gdes.SamplerType != WaveformEnum.SampleData)
            {
                throw new Exception("Sfz can only support sample data generators.");
            }
            gen = gdes.ToGenerator(assets);
            //read in the envelope info
            ptch_env = description.EnvelopeDescriptions[0];
            fltr_env = description.EnvelopeDescriptions[1];
            amp_env  = description.EnvelopeDescriptions[2];
            //read in the lfo info
            ptch_lfo = description.LfoDescriptions[0];
            fltr_lfo = description.LfoDescriptions[1];
            amp_lfo  = description.LfoDescriptions[2];
            //read in the filter info
            fltr = description.FilterDescriptions[0];
        }
Esempio n. 2
0
 private void LoadSfzEnvelopes(SfzRegion region)
 {
     EnvelopeDescriptions                 = new EnvelopeDescriptor[3];
     EnvelopeDescriptions[0]              = new EnvelopeDescriptor();
     EnvelopeDescriptions[0].DelayTime    = region.pitchEGDelay;
     EnvelopeDescriptions[0].AttackTime   = region.pitchEGAttack;
     EnvelopeDescriptions[0].HoldTime     = region.pitchEGHold;
     EnvelopeDescriptions[0].DecayTime    = region.pitchEGDecay;
     EnvelopeDescriptions[0].SustainLevel = region.pitchEGSustain / 100f;
     EnvelopeDescriptions[0].ReleaseTime  = region.pitchEGRelease;
     EnvelopeDescriptions[0].StartLevel   = region.pitchEGStart / 100f;
     EnvelopeDescriptions[0].Depth        = region.pitchEGDepth;
     EnvelopeDescriptions[0].Vel2Delay    = region.pitchEGVel2Delay;
     EnvelopeDescriptions[0].Vel2Attack   = region.pitchEGVel2Attack;
     EnvelopeDescriptions[0].Vel2Hold     = region.pitchEGVel2Hold;
     EnvelopeDescriptions[0].Vel2Decay    = region.pitchEGVel2Decay;
     EnvelopeDescriptions[0].Vel2Sustain  = region.pitchEGVel2Sustain;
     EnvelopeDescriptions[0].Vel2Release  = region.pitchEGVel2Release;
     EnvelopeDescriptions[0].Vel2Depth    = region.pitchEGVel2Depth;
     EnvelopeDescriptions[1]              = new EnvelopeDescriptor();
     EnvelopeDescriptions[1].DelayTime    = region.filterEGDelay;
     EnvelopeDescriptions[1].AttackTime   = region.filterEGAttack;
     EnvelopeDescriptions[1].HoldTime     = region.filterEGHold;
     EnvelopeDescriptions[1].DecayTime    = region.filterEGDecay;
     EnvelopeDescriptions[1].SustainLevel = region.filterEGSustain / 100f;
     EnvelopeDescriptions[1].ReleaseTime  = region.filterEGRelease;
     EnvelopeDescriptions[1].StartLevel   = region.filterEGStart / 100f;
     EnvelopeDescriptions[1].Depth        = region.filterEGDepth;
     EnvelopeDescriptions[1].Vel2Delay    = region.filterEGVel2Delay;
     EnvelopeDescriptions[1].Vel2Attack   = region.filterEGVel2Attack;
     EnvelopeDescriptions[1].Vel2Hold     = region.filterEGVel2Hold;
     EnvelopeDescriptions[1].Vel2Decay    = region.filterEGVel2Decay;
     EnvelopeDescriptions[1].Vel2Sustain  = region.filterEGVel2Sustain;
     EnvelopeDescriptions[1].Vel2Release  = region.filterEGVel2Release;
     EnvelopeDescriptions[1].Vel2Depth    = region.filterEGVel2Depth;
     EnvelopeDescriptions[2]              = new EnvelopeDescriptor();
     EnvelopeDescriptions[2].DelayTime    = region.ampEGDelay;
     EnvelopeDescriptions[2].AttackTime   = region.ampEGAttack;
     EnvelopeDescriptions[2].HoldTime     = region.ampEGHold;
     EnvelopeDescriptions[2].DecayTime    = region.ampEGDecay;
     EnvelopeDescriptions[2].SustainLevel = region.ampEGSustain / 100f;
     EnvelopeDescriptions[2].ReleaseTime  = region.ampEGRelease;
     EnvelopeDescriptions[2].StartLevel   = region.ampEGStart / 100f;
     EnvelopeDescriptions[2].Depth        = 1f;
     EnvelopeDescriptions[2].Vel2Delay    = region.ampEGVel2Delay;
     EnvelopeDescriptions[2].Vel2Attack   = region.ampEGVel2Attack;
     EnvelopeDescriptions[2].Vel2Hold     = region.ampEGVel2Hold;
     EnvelopeDescriptions[2].Vel2Decay    = region.ampEGVel2Decay;
     EnvelopeDescriptions[2].Vel2Sustain  = region.ampEGVel2Sustain;
     EnvelopeDescriptions[2].Vel2Release  = region.ampEGVel2Release;
     EnvelopeDescriptions[2].Vel2Depth    = 0f;
 }
Esempio n. 3
0
        public override void Load(DescriptorList description, AssetManager assets)
        {
            CustomDescriptor fmConfig = description.FindCustomDescriptor("fm2c");

            cIndex   = (double)fmConfig.Objects[0];
            mIndex   = (double)fmConfig.Objects[1];
            feedBack = (double)fmConfig.Objects[2];
            sync     = GetSyncModeFromString((string)fmConfig.Objects[3]);
            if (description.GenDescriptions[0].LoopMethod != LoopModeEnum.Continuous || description.GenDescriptions[1].LoopMethod != LoopModeEnum.Continuous)
            {
                throw new Exception("Fm2 patches must have continuous generators with wrapping bounds.");
            }
            cGen = description.GenDescriptions[0].ToGenerator(assets);
            mGen = description.GenDescriptions[1].ToGenerator(assets);
            cEnv = description.EnvelopeDescriptions[0];
            mEnv = description.EnvelopeDescriptions[1];
            lfo  = description.LfoDescriptions[0];
        }
Esempio n. 4
0
 public void QuickSetup(int sampleRate, float velocity, EnvelopeDescriptor envelopeInfo)
 {
     depth = envelopeInfo.Depth + velocity * envelopeInfo.Vel2Depth;
     //Delay
     stages[0].offset = 0;
     stages[0].scale  = 0;
     stages[0].time   = Math.Max(0, (int)(sampleRate * (envelopeInfo.DelayTime + envelopeInfo.Vel2Delay * velocity)));
     //Attack
     stages[1].offset = envelopeInfo.StartLevel;
     stages[1].scale  = envelopeInfo.PeakLevel - envelopeInfo.StartLevel;
     stages[1].time   = Math.Max(0, (int)(sampleRate * (envelopeInfo.AttackTime + envelopeInfo.Vel2Attack * velocity)));
     stages[1].graph  = Tables.EnvelopeTables[envelopeInfo.AttackGraph];
     //Hold
     stages[2].offset = 0;
     stages[2].scale  = envelopeInfo.PeakLevel;
     stages[2].time   = Math.Max(0, (int)(sampleRate * (envelopeInfo.HoldTime + envelopeInfo.Vel2Hold * velocity)));
     //Decay
     stages[3].offset = envelopeInfo.SustainLevel;
     stages[3].scale  = envelopeInfo.PeakLevel - envelopeInfo.SustainLevel;
     stages[3].time   = Math.Max(0, (int)(sampleRate * (envelopeInfo.DecayTime + envelopeInfo.Vel2Decay * velocity)));
     stages[3].graph  = Tables.EnvelopeTables[envelopeInfo.DecayGraph];
     //Sustain
     stages[4].offset = 0;
     stages[4].scale  = envelopeInfo.SustainLevel + envelopeInfo.Vel2Sustain * velocity;
     stages[4].time   = (int)(sampleRate * envelopeInfo.SustainTime);
     //Release
     stages[5].offset = 0;
     stages[5].scale  = (stages[3].time == 0 && stages[4].time == 0) ? envelopeInfo.PeakLevel : stages[4].scale;
     stages[5].time   = Math.Max(0, (int)(sampleRate * (envelopeInfo.ReleaseTime + envelopeInfo.Vel2Release * velocity)));
     stages[5].graph  = Tables.EnvelopeTables[envelopeInfo.ReleaseGraph];
     //None
     stages[6].scale = 0;
     //Reset value, index, and starting state
     index    = 0; value = 0;
     envState = EnvelopeStateEnum.Delay;
     while (stages[(int)envState].time == 0)
     {
         envState++;
     }
     stage = stages[(int)envState];
 }
Esempio n. 5
0
        public DescriptorList(StreamReader reader)
        {
            List <EnvelopeDescriptor>  envList  = new List <EnvelopeDescriptor>();
            List <FilterDescriptor>    fltrList = new List <FilterDescriptor>();
            List <LfoDescriptor>       lfoList  = new List <LfoDescriptor>();
            List <GeneratorDescriptor> genList  = new List <GeneratorDescriptor>();
            List <CustomDescriptor>    cList    = new List <CustomDescriptor>();
            List <string> descList = new List <string>();

            while (!reader.EndOfStream)
            {
                string tag = ReadNextTag(reader, descList);
                switch (tag)
                {
                case "envelope":
                {
                    EnvelopeDescriptor env = new EnvelopeDescriptor();
                    env.Read(descList.ToArray());
                    envList.Add(env);
                    break;
                }

                case "generator":
                {
                    GeneratorDescriptor gen = new GeneratorDescriptor();
                    gen.Read(descList.ToArray());
                    genList.Add(gen);
                    break;
                }

                case "filter":
                {
                    FilterDescriptor fltr = new FilterDescriptor();
                    fltr.Read(descList.ToArray());
                    fltrList.Add(fltr);
                    break;
                }

                case "lfo":
                {
                    LfoDescriptor lfo = new LfoDescriptor();
                    lfo.Read(descList.ToArray());
                    lfoList.Add(lfo);
                    break;
                }

                default:
                    if (!tag.Equals(string.Empty))
                    {
                        CustomDescriptor cus = new CustomDescriptor(tag, 0);
                        cus.Read(descList.ToArray());
                        cList.Add(cus);
                    }
                    break;
                }
                descList.Clear();
            }
            EnvelopeDescriptions = envList.ToArray();
            FilterDescriptions   = fltrList.ToArray();
            LfoDescriptions      = lfoList.ToArray();
            GenDescriptions      = genList.ToArray();
            CustomDescriptions   = cList.ToArray();
        }
Esempio n. 6
0
        public DescriptorList(BinaryReader reader)
        {
            List <EnvelopeDescriptor>  envList  = new List <EnvelopeDescriptor>();
            List <FilterDescriptor>    fltrList = new List <FilterDescriptor>();
            List <LfoDescriptor>       lfoList  = new List <LfoDescriptor>();
            List <GeneratorDescriptor> genList  = new List <GeneratorDescriptor>();
            List <CustomDescriptor>    cList    = new List <CustomDescriptor>();
            int count = reader.ReadInt16();

            for (int x = 0; x < count; x++)
            {
                string id   = new string(IOHelper.Read8BitChars(reader, 4));
                int    size = reader.ReadInt32();
                switch (id.ToLower())
                {
                case EnvelopeDescriptor.ID:
                {
                    EnvelopeDescriptor env = new EnvelopeDescriptor();
                    env.Read(reader);
                    envList.Add(env);
                    break;
                }

                case GeneratorDescriptor.ID:
                {
                    GeneratorDescriptor gen = new GeneratorDescriptor();
                    gen.Read(reader);
                    genList.Add(gen);
                    break;
                }

                case FilterDescriptor.ID:
                {
                    FilterDescriptor fltr = new FilterDescriptor();
                    fltr.Read(reader);
                    fltrList.Add(fltr);
                    break;
                }

                case LfoDescriptor.ID:
                {
                    LfoDescriptor lfo = new LfoDescriptor();
                    lfo.Read(reader);
                    lfoList.Add(lfo);
                    break;
                }

                default:
                {
                    CustomDescriptor cus = new CustomDescriptor(id, size);
                    cus.Read(reader);
                    cList.Add(cus);
                    break;
                }
                }
            }
            EnvelopeDescriptions = envList.ToArray();
            FilterDescriptions   = fltrList.ToArray();
            LfoDescriptions      = lfoList.ToArray();
            GenDescriptions      = genList.ToArray();
            CustomDescriptions   = cList.ToArray();
        }
Esempio n. 7
0
 private void LoadEnvelopes(Sf2Region region)
 {
     //mod env
     mod_env              = new EnvelopeDescriptor();
     mod_env.AttackTime   = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.AttackModulationEnvelope] / 1200.0);
     mod_env.AttackGraph  = 3;
     mod_env.DecayTime    = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.DecayModulationEnvelope] / 1200.0);
     mod_env.DelayTime    = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.DelayModulationEnvelope] / 1200.0);
     mod_env.HoldTime     = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.HoldModulationEnvelope] / 1200.0);
     mod_env.PeakLevel    = 1;
     mod_env.ReleaseTime  = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.ReleaseModulationEnvelope] / 1200.0);
     mod_env.StartLevel   = 0;
     mod_env.SustainLevel = 1f - SynthHelper.Clamp(region.Generators[(int)GeneratorEnum.SustainModulationEnvelope], (short)0, (short)1000) / 1000f;
     //checks
     if (mod_env.AttackTime < 0.001f)
     {
         mod_env.AttackTime = 0.001f;
     }
     else if (mod_env.AttackTime > 100f)
     {
         mod_env.AttackTime = 100f;
     }
     if (mod_env.DecayTime < 0.001f)
     {
         mod_env.DecayTime = 0;
     }
     else if (mod_env.DecayTime > 100f)
     {
         mod_env.DecayTime = 100f;
     }
     if (mod_env.DelayTime < 0.001f)
     {
         mod_env.DelayTime = 0;
     }
     else if (mod_env.DelayTime > 20f)
     {
         mod_env.DelayTime = 20f;
     }
     if (mod_env.HoldTime < 0.001f)
     {
         mod_env.HoldTime = 0;
     }
     else if (mod_env.HoldTime > 20f)
     {
         mod_env.HoldTime = 20f;
     }
     if (mod_env.ReleaseTime < 0.001f)
     {
         mod_env.ReleaseTime = 0.001f;
     }
     else if (mod_env.ReleaseTime > 100f)
     {
         mod_env.ReleaseTime = 100f;
     }
     //volume env
     vel_env              = new EnvelopeDescriptor();
     vel_env.AttackTime   = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.AttackVolumeEnvelope] / 1200.0);
     vel_env.AttackGraph  = 3;
     vel_env.DecayTime    = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.DecayVolumeEnvelope] / 1200.0);
     vel_env.DelayTime    = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.DelayVolumeEnvelope] / 1200.0);
     vel_env.HoldTime     = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.HoldVolumeEnvelope] / 1200.0);
     vel_env.PeakLevel    = 0;
     vel_env.ReleaseTime  = (float)Math.Pow(2, region.Generators[(int)GeneratorEnum.ReleaseVolumeEnvelope] / 1200.0);
     vel_env.StartLevel   = -100;
     vel_env.SustainLevel = SynthHelper.Clamp(region.Generators[(int)GeneratorEnum.SustainVolumeEnvelope], (short)0, (short)1000) / -10f;
     //checks
     if (vel_env.AttackTime < 0.001f)
     {
         vel_env.AttackTime = 0.001f;
     }
     else if (vel_env.AttackTime > 100f)
     {
         vel_env.AttackTime = 100f;
     }
     if (vel_env.DecayTime < 0.001f)
     {
         vel_env.DecayTime = 0;
     }
     else if (vel_env.DecayTime > 100f)
     {
         vel_env.DecayTime = 100f;
     }
     if (vel_env.DelayTime < 0.001f)
     {
         vel_env.DelayTime = 0;
     }
     else if (vel_env.DelayTime > 20f)
     {
         vel_env.DelayTime = 20f;
     }
     if (vel_env.HoldTime < 0.001f)
     {
         vel_env.HoldTime = 0;
     }
     else if (vel_env.HoldTime > 20f)
     {
         vel_env.HoldTime = 20f;
     }
     if (vel_env.ReleaseTime < 0.001f)
     {
         vel_env.ReleaseTime = 0.001f;
     }
     else if (vel_env.ReleaseTime > 100f)
     {
         vel_env.ReleaseTime = 100f;
     }
 }
Esempio n. 8
0
 public void QuickSetupSf2(int sampleRate, int note, short keyNumToHold, short keyNumToDecay, bool isVolumeEnvelope, EnvelopeDescriptor envelopeInfo)
 {
     depth = envelopeInfo.Depth;
     //Delay
     stages[0].offset = 0;
     stages[0].scale  = 0;
     stages[0].time   = Math.Max(0, (int)(sampleRate * (envelopeInfo.DelayTime)));
     //Attack
     stages[1].offset = envelopeInfo.StartLevel;
     stages[1].scale  = envelopeInfo.PeakLevel - envelopeInfo.StartLevel;
     stages[1].time   = Math.Max(0, (int)(sampleRate * (envelopeInfo.AttackTime)));
     stages[1].graph  = Tables.EnvelopeTables[envelopeInfo.AttackGraph];
     //Hold
     stages[2].offset = 0;
     stages[2].scale  = envelopeInfo.PeakLevel;
     stages[2].time   = Math.Max(0, (int)(sampleRate * (envelopeInfo.HoldTime) * Math.Pow(2, ((60 - note) * keyNumToHold) / 1200.0)));
     //Decay
     stages[3].offset = envelopeInfo.SustainLevel;
     stages[3].scale  = envelopeInfo.PeakLevel - envelopeInfo.SustainLevel;
     if (envelopeInfo.SustainLevel == envelopeInfo.PeakLevel)
     {
         stages[3].time = 0;
     }
     else
     {
         stages[3].time = Math.Max(0, (int)(sampleRate * (envelopeInfo.DecayTime) * Math.Pow(2, ((60 - note) * keyNumToDecay) / 1200.0)));
     }
     stages[3].graph = Tables.EnvelopeTables[envelopeInfo.DecayGraph];
     //Sustain
     stages[4].offset = 0;
     stages[4].scale  = envelopeInfo.SustainLevel;
     stages[4].time   = (int)(sampleRate * envelopeInfo.SustainTime);
     //Release
     stages[5].scale = stages[3].time == 0 && stages[4].time == 0 ? envelopeInfo.PeakLevel : stages[4].scale;
     if (isVolumeEnvelope)
     {
         stages[5].offset = -100;
         stages[5].scale += 100;
         stages[6].scale  = -100;
     }
     else
     {
         stages[5].offset = 0;
         stages[6].scale  = 0;
     }
     stages[5].time  = Math.Max(0, (int)(sampleRate * (envelopeInfo.ReleaseTime)));
     stages[5].graph = Tables.EnvelopeTables[envelopeInfo.ReleaseGraph];
     //Reset value, index, and starting state
     index    = 0; value = 0;
     envState = EnvelopeStateEnum.Delay;
     while (stages[(int)envState].time == 0)
     {
         envState++;
     }
     stage = stages[(int)envState];
 }
Esempio n. 9
0
        public void QuickSetupSf2(int sampleRate, int note, short keyNumToHold, short keyNumToDecay, bool isVolumeEnvelope, EnvelopeDescriptor envelopeInfo)
        {
            Depth = envelopeInfo.Depth;
            // Delay
            _stages[0].Offset = 0;
            _stages[0].Scale  = 0;
            _stages[0].Time   = Math.Max(0, (sampleRate * (envelopeInfo.DelayTime)));
            // Attack
            _stages[1].Offset = envelopeInfo.StartLevel;
            _stages[1].Scale  = envelopeInfo.PeakLevel - envelopeInfo.StartLevel;
            _stages[1].Time   = Math.Max(0, (sampleRate * (envelopeInfo.AttackTime)));
            _stages[1].Graph  = Tables.EnvelopeTables(envelopeInfo.AttackGraph);
            // Hold
            _stages[2].Offset = 0;
            _stages[2].Scale  = envelopeInfo.PeakLevel;
            _stages[2].Time   = Math.Max(0, sampleRate * (envelopeInfo.HoldTime) * Math.Pow(2, ((60 - note) * keyNumToHold) / 1200.0));
            // Decay
            _stages[3].Offset = envelopeInfo.SustainLevel;
            _stages[3].Scale  = envelopeInfo.PeakLevel - envelopeInfo.SustainLevel;
            if (envelopeInfo.SustainLevel == envelopeInfo.PeakLevel)
            {
                _stages[3].Time = 0;
            }
            else
            {
                _stages[3].Time = Math.Max(0, (sampleRate * (envelopeInfo.DecayTime) * Math.Pow(2, ((60 - note) * keyNumToDecay) / 1200.0)));
            }
            _stages[3].Graph = Tables.EnvelopeTables(envelopeInfo.DecayGraph);
            // Sustain
            _stages[4].Offset = 0;
            _stages[4].Scale  = envelopeInfo.SustainLevel;
            _stages[4].Time   = (sampleRate * envelopeInfo.SustainTime);
            // Release
            _stages[5].Scale = _stages[3].Time == 0 && _stages[4].Time == 0 ? envelopeInfo.PeakLevel : _stages[4].Scale;
            if (isVolumeEnvelope)
            {
                _stages[5].Offset = -100;
                _stages[5].Scale += 100;
                _stages[6].Scale  = -100;
            }
            else
            {
                _stages[5].Offset = 0;
                _stages[6].Scale  = 0;
            }
            _stages[5].Time  = Math.Max(0, (int)(sampleRate * (envelopeInfo.ReleaseTime)));
            _stages[5].Graph = Tables.EnvelopeTables(envelopeInfo.ReleaseGraph);

            _index       = 0;
            Value        = 0;
            CurrentStage = EnvelopeState.Delay;
            while (Math.Abs(_stages[(int)CurrentStage].Time) < 0.01)
            {
                CurrentStage++;
            }
            _stage = _stages[(int)CurrentStage];
        }
Esempio n. 10
0
 public override void Load(DescriptorList description, AssetManager assets)
 {
     gen = description.GenDescriptions[0].ToGenerator(assets);
     env = description.EnvelopeDescriptions[0];
     lfo = description.LfoDescriptions[0];
 }