示例#1
0
 //--Public Methods
 /// <summary>
 /// A simple echo effect.
 /// </summary>
 /// <param name="synth">A constructed synthesizer instance.</param>
 /// <param name="delaytime">Echo delay in seconds.</param>
 /// <param name="decay">Controls the volume of the echo.</param>
 public Echo(StreamSynthesizer synth, float delaytime, float decay)
     : base()
 {
     if (delaytime <= 0.0f)
     {
         throw new ArgumentException("delay time must be positive non-zero for echo effect.");
     }
     this.decay         = SynthHelper.Clamp(decay, 0.0f, 1.0f);
     this.EffectBuffer  = new float[synth.Channels, SynthHelper.getSampleFromTime(synth.SampleRate, delaytime)];
     channels           = this.EffectBuffer.GetLength(0);
     secondarybufferlen = this.EffectBuffer.GetLength(1);
 }
示例#2
0
 public override void enforceSampleRate(int sampleRate)
 {
     if (sampleRate != this.SampleRate)
     {
         //Proper calculation of voice states
         _attack         = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_ATTACK);
         _release        = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_RELEASE);
         _decay          = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_DECAY);
         _hold           = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_HOLD);
         this.SampleRate = sampleRate;
     }
 }
示例#3
0
 //--Public Methods
 public FMInstrument(string fmProgramFile, int sampleRate)
     : base()
 {
     this.SampleRate = sampleRate;
     //Proper calculation of voice states
     _attack  = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_ATTACK);
     _release = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_RELEASE);
     _decay   = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_DECAY);
     _hold    = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_HOLD);
     //open fm program file
     loadProgramFile(fmProgramFile);
     //set base attribute name
     base.Name = System.IO.Path.GetFileNameWithoutExtension(fmProgramFile);
 }
示例#4
0
 //--Public Methods
 public AnalogInstrument(SynthHelper.WaveFormType waveformtype, int sampleRate)
     : base()
 {
     //set type
     this.type       = waveformtype;
     this.SampleRate = sampleRate;
     //Proper calculation of voice states
     _attack  = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_ATTACK);
     _release = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_RELEASE);
     _decay   = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_DECAY);
     _hold    = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_HOLD);
     //set base attribute name
     base.Name = waveformtype.ToString();
 }
示例#5
0
 //--Public Methods
 public FMInstrument(string fmProgramFile, int sampleRate)
     : base()
 {
     this.SampleRate = sampleRate;
     //Proper calculation of voice states
     _attack  = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_ATTACK);
     _release = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_RELEASE);
     _decay   = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_DECAY);
     _hold    = SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_HOLD);
     //open fm program file
     loadProgramFile(fmProgramFile);
     //set base attribute name
     //base.Name = System.IO.Path.GetFileNameWithoutExtension(fmProgramFile);
     System.Diagnostics.Debug.WriteLine(fmProgramFile.LastIndexOf("/"));
     System.Diagnostics.Debug.WriteLine(fmProgramFile.Length);
     base.Name = fmProgramFile.Substring(fmProgramFile.LastIndexOf("/"), fmProgramFile.Length - fmProgramFile.LastIndexOf("/"));
 }
示例#6
0
        private void SetTime(TimeSpan time)
        {
            int _stime = SynthHelper.getSampleFromTime(synth.SampleRate, (float)time.TotalSeconds);

            if (_stime > sampleTime)
            {
                SilentProcess(_stime - sampleTime);
            }
            else if (_stime < sampleTime)
            {//we have to restart the midi to make sure we get the right temp, instrument, etc
                synth.Stop();
                sampleTime = 0;
                Array.Clear(currentPrograms, 0, currentPrograms.Length);
                ResetControllers();
                _MidiFile.BeatsPerMinute = 120;
                eventIndex = 0;
                SilentProcess(_stime);
            }
        }
        private void ParseInstrumentData(string[] text, string InstrumentPath, InstrumentBank bank)
        {
            allSamplesHaveDualChannels = true;
            SfzRegion Group = new SfzRegion();

            bool[]           groupValues = new bool[21];
            List <Sample>    Samples     = new List <Sample>();
            List <string>    SampleNames = new List <string>();
            List <SfzRegion> Regions     = new List <SfzRegion>();

            for (int x = 0; x < text.Length; x++)
            {
                string line = text[x].Trim();
                if (line != "")
                {
                    switch (line.Substring(0, 1).ToLower())
                    {
                    case "<":
                        if (line == "<group>")
                        {
                            while (text[x] != "")
                            {
                                x++;
                                if (x >= text.Length)
                                {
                                    break;
                                }
                                string[] Rvalue = text[x].Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                                if (Rvalue.Length == 2)
                                {
                                    switch (Rvalue[0])
                                    {
                                    case "sample":
                                        Rvalue[1]      = System.IO.Path.GetFileNameWithoutExtension(Rvalue[1]);
                                        groupValues[0] = true;
                                        if (SampleNames.Contains(Rvalue[1]))        //its in the local list so no need to check the master list
                                        {
                                            Group.SampleIndex = SampleNames.IndexOf(Rvalue[1]);
                                        }
                                        else
                                        {
                                            SampleNames.Add(Rvalue[1]);
                                            //check if the sample is in the master list.
                                            int    sampNum = bank.SampleNameList.IndexOf(Rvalue[1]);
                                            Sample s;
                                            if (sampNum > -1)        //its in the list
                                            {
                                                s = bank.SampleList[sampNum];
                                            }
                                            else        //its not in the list
                                            {
                                                s = new Sample(InstrumentPath + "SAMPLES/" + Rvalue[1] + ".wav");
                                                bank.SampleList.Add(s);
                                                bank.SampleNameList.Add(Rvalue[1]);
                                            }
                                            if (s.isDualChannel == false)
                                            {
                                                allSamplesHaveDualChannels = false;
                                            }
                                            Samples.Add(s);
                                            Group.SampleIndex = SampleNames.Count - 1;
                                        }
                                        break;

                                    case "hikey":
                                        Group.HiNote   = (byte)int.Parse(Rvalue[1]);
                                        groupValues[1] = true;
                                        break;

                                    case "lokey":
                                        Group.LoNote   = (byte)int.Parse(Rvalue[1]);
                                        groupValues[2] = true;
                                        break;

                                    case "loop_start":
                                        Group.LoopStart = int.Parse(Rvalue[1]);
                                        groupValues[3]  = true;
                                        break;

                                    case "loop_end":
                                        Group.LoopEnd  = int.Parse(Rvalue[1]);
                                        groupValues[4] = true;
                                        break;

                                    case "tune":
                                        Group.Tune     = int.Parse(Rvalue[1]) / 100.0f;
                                        groupValues[5] = true;
                                        break;

                                    case "pitch_keycenter":
                                        Group.Root     = int.Parse(Rvalue[1]);
                                        groupValues[6] = true;
                                        break;

                                    case "volume":
                                        Group.Volume   = float.Parse(Rvalue[1]);
                                        groupValues[7] = true;
                                        break;

                                    case "loop_mode":
                                        groupValues[8] = true;
                                        switch (Rvalue[1])
                                        {
                                        case "loop_continuous":
                                            Group.LoopMode = 1;
                                            break;

                                        case "loop_sustain":
                                            Group.LoopMode = 2;
                                            break;

                                        default:
                                            Group.LoopMode = 0;
                                            break;
                                        }
                                        break;

                                    case "ampeg_release":
                                        groupValues[9] = true;
                                        Group.Release  = SynthHelper.getSampleFromTime(this.SampleRate, float.Parse(Rvalue[1]));
                                        break;

                                    case "ampeg_attack":
                                        groupValues[10] = true;
                                        Group.Attack    = SynthHelper.getSampleFromTime(this.SampleRate, float.Parse(Rvalue[1]));
                                        break;

                                    case "ampeg_decay":
                                        groupValues[11] = true;
                                        Group.Decay     = SynthHelper.getSampleFromTime(this.SampleRate, float.Parse(Rvalue[1]));
                                        break;

                                    case "ampeg_hold":
                                        groupValues[12] = true;
                                        Group.Hold      = SynthHelper.getSampleFromTime(this.SampleRate, float.Parse(Rvalue[1]));
                                        break;

                                    case "lovel":
                                        groupValues[13]  = true;
                                        Group.LoVelocity = (byte)int.Parse(Rvalue[1]);
                                        break;

                                    case "hivel":
                                        groupValues[14]  = true;
                                        Group.HiVelocity = (byte)int.Parse(Rvalue[1]);
                                        break;

                                    case "lochan":
                                        groupValues[15] = true;
                                        Group.LoChannel = (byte)(int.Parse(Rvalue[1]) - 1);
                                        break;

                                    case "hichan":
                                        groupValues[16] = true;
                                        Group.HiChannel = (byte)(int.Parse(Rvalue[1]) - 1);
                                        break;

                                    case "key":
                                        Group.Root     = int.Parse(Rvalue[1]);
                                        groupValues[6] = true;
                                        Group.HiNote   = (byte)Group.Root;
                                        groupValues[1] = true;
                                        Group.LoNote   = (byte)Group.Root;
                                        groupValues[2] = true;
                                        break;

                                    case "offset":
                                        groupValues[17] = true;
                                        Group.Offset    = int.Parse(Rvalue[1]);
                                        break;

                                    case "pan":
                                        groupValues[18] = true;
                                        Group.Pan       = float.Parse(Rvalue[1]);
                                        break;

                                    case "effect1":
                                        groupValues[19] = true;
                                        Group.Effect1   = float.Parse(Rvalue[1]);
                                        break;

                                    case "effect2":
                                        groupValues[20] = true;
                                        Group.Effect2   = float.Parse(Rvalue[1]);
                                        break;

                                    default:
                                        break;
                                    }
                                }
                            }
                        }
                        else if (line == "<region>")
                        {
                            SfzRegion r = new SfzRegion();
                            while (text[x] != "")
                            {
                                x++;
                                if (x >= text.Length)
                                {
                                    break;
                                }
                                string[] Rvalue = text[x].Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
                                if (Rvalue.Length == 2)
                                {
                                    switch (Rvalue[0])
                                    {
                                    case "sample":
                                        Rvalue[1] = System.IO.Path.GetFileNameWithoutExtension(Rvalue[1]); //remove ending .wav
                                        if (SampleNames.Contains(Rvalue[1]))                               //its in the local list so no need to check the master list
                                        {
                                            r.SampleIndex = SampleNames.IndexOf(Rvalue[1]);
                                        }
                                        else
                                        {
                                            SampleNames.Add(Rvalue[1]);
                                            //check if the sample is in the master list.
                                            int    sampNum = bank.SampleNameList.IndexOf(Rvalue[1]);
                                            Sample s;
                                            if (sampNum > -1)        //its in the list
                                            {
                                                s = bank.SampleList[sampNum];
                                            }
                                            else        //its not in the list
                                            {
                                                s = new Sample(InstrumentPath + "SAMPLES/" + Rvalue[1] + ".wav");
                                                bank.SampleList.Add(s);
                                                bank.SampleNameList.Add(Rvalue[1]);
                                            }
                                            if (s.isDualChannel == false)
                                            {
                                                allSamplesHaveDualChannels = false;
                                            }
                                            Samples.Add(s);
                                            r.SampleIndex = SampleNames.Count - 1;
                                        }
                                        break;

                                    case "hikey":
                                        r.HiNote = (byte)int.Parse(Rvalue[1]);
                                        break;

                                    case "lokey":
                                        r.LoNote = (byte)int.Parse(Rvalue[1]);
                                        break;

                                    case "loop_start":
                                        r.LoopStart = int.Parse(Rvalue[1]);
                                        break;

                                    case "loop_end":
                                        r.LoopEnd = int.Parse(Rvalue[1]);
                                        break;

                                    case "tune":
                                        r.Tune = int.Parse(Rvalue[1]) / 100.0f;
                                        break;

                                    case "pitch_keycenter":
                                        r.Root = int.Parse(Rvalue[1]);
                                        break;

                                    case "volume":
                                        r.Volume = float.Parse(Rvalue[1]);
                                        break;

                                    case "loop_mode":
                                        switch (Rvalue[1])
                                        {
                                        case "loop_continuous":
                                            r.LoopMode = 1;
                                            break;

                                        case "loop_sustain":
                                            r.LoopMode = 2;
                                            break;

                                        default:
                                            r.LoopMode = 0;
                                            break;
                                        }
                                        break;

                                    case "ampeg_release":
                                        r.Release = SynthHelper.getSampleFromTime(this.SampleRate, float.Parse(Rvalue[1]));
                                        break;

                                    case "ampeg_attack":
                                        r.Attack = SynthHelper.getSampleFromTime(this.SampleRate, float.Parse(Rvalue[1]));
                                        break;

                                    case "ampeg_decay":
                                        r.Decay = SynthHelper.getSampleFromTime(this.SampleRate, float.Parse(Rvalue[1]));
                                        break;

                                    case "ampeg_hold":
                                        r.Hold = SynthHelper.getSampleFromTime(this.SampleRate, float.Parse(Rvalue[1]));
                                        break;

                                    case "lovel":
                                        r.LoVelocity = (byte)int.Parse(Rvalue[1]);
                                        break;

                                    case "hivel":
                                        r.HiVelocity = (byte)int.Parse(Rvalue[1]);
                                        break;

                                    case "lochan":
                                        r.LoChannel = (byte)(int.Parse(Rvalue[1]) - 1);
                                        break;

                                    case "hichan":
                                        r.HiChannel = (byte)(int.Parse(Rvalue[1]) - 1);
                                        break;

                                    case "key":
                                        r.Root   = int.Parse(Rvalue[1]);
                                        r.HiNote = (byte)r.Root;
                                        r.LoNote = (byte)r.Root;
                                        break;

                                    case "offset":
                                        r.Offset = int.Parse(Rvalue[1]);
                                        break;

                                    case "pan":
                                        r.Pan = float.Parse(Rvalue[1]);
                                        break;

                                    case "effect1":
                                        r.Effect1 = float.Parse(Rvalue[1]);
                                        break;

                                    case "effect2":
                                        r.Effect2 = float.Parse(Rvalue[1]);
                                        break;

                                    default:
                                        break;
                                    }
                                }
                            }
                            if (Regions.Contains(r) == false)
                            {
                                Regions.Add(r);
                            }
                        }
                        break;

                    default:
                        break;
                    }
                }
            }
            //Apply group values here
            for (int x = 0; x < Regions.Count; x++)
            {
                if (groupValues[0] == true)
                {
                    Regions[x].SampleIndex = Group.SampleIndex;
                }
                if (groupValues[1] == true)
                {
                    Regions[x].HiNote = Group.HiNote;
                }
                if (groupValues[2] == true)
                {
                    Regions[x].LoNote = Group.LoNote;
                }
                if (groupValues[3] == true)
                {
                    Regions[x].LoopStart = Group.LoopStart;
                }
                if (groupValues[4] == true)
                {
                    Regions[x].LoopEnd = Group.LoopEnd;
                }
                if (groupValues[5] == true)
                {
                    Regions[x].Tune = Group.Tune;
                }
                if (groupValues[6] == true)
                {
                    Regions[x].Root = Group.Root;
                }
                if (groupValues[7] == true)
                {
                    Regions[x].Volume = Group.Volume;
                }
                if (groupValues[8] == true)
                {
                    Regions[x].LoopMode = Group.LoopMode;
                }
                if (groupValues[9] == true)
                {
                    Regions[x].Release = Group.Release;
                }
                if (groupValues[10] == true)
                {
                    Regions[x].Attack = Group.Attack;
                }
                if (groupValues[11] == true)
                {
                    Regions[x].Decay = Group.Decay;
                }
                if (groupValues[12] == true)
                {
                    Regions[x].Hold = Group.Hold;
                }
                if (groupValues[13] == true)
                {
                    Regions[x].LoVelocity = Group.LoVelocity;
                }
                if (groupValues[14] == true)
                {
                    Regions[x].HiVelocity = Group.HiVelocity;
                }
                if (groupValues[15] == true)
                {
                    Regions[x].LoChannel = Group.LoChannel;
                }
                if (groupValues[16] == true)
                {
                    Regions[x].HiChannel = Group.HiChannel;
                }
                if (groupValues[17] == true)
                {
                    Regions[x].Offset = Group.Offset;
                }
                if (groupValues[18] == true)
                {
                    Regions[x].Pan = Group.Pan;
                }
                if (groupValues[19] == true)
                {
                    Regions[x].Effect1 = Group.Effect1;
                }
                if (groupValues[20] == true)
                {
                    Regions[x].Effect2 = Group.Effect2;
                }
            }
            base.SampleList = Samples.ToArray();
            regions         = Regions.ToArray();
            //Fix parameters so enforce isn't needed
            for (int x = 0; x < regions.Length; x++)
            {
                Sample s      = base.SampleList[regions[x].SampleIndex];
                float  factor = (this.SampleRate / (float)s.OriginalSampleRate);
                regions[x].LoopEnd   = (int)(regions[x].LoopEnd * factor);
                regions[x].LoopStart = (int)(regions[x].LoopStart * factor);
                regions[x].Offset    = (int)(regions[x].Offset * factor);
                //Set loopend to end of sample if none is provided
                if (regions[x].LoopEnd <= 0)
                {
                    if (this.SampleRate != s.SampleRate)
                    {
                        regions[x].LoopEnd = (int)(base.SampleList[regions[x].SampleIndex].SamplesPerChannel * factor) - 1;
                    }
                    else
                    {
                        regions[x].LoopEnd = (int)(base.SampleList[regions[x].SampleIndex].SamplesPerChannel) - 1;
                    }
                }
            }
            //Resample as well
            for (int x = 0; x < base.SampleList.Length; x++)
            {
                Sample s      = base.SampleList[x];
                float  factor = this.SampleRate / (float)s.SampleRate;
                if (factor != 1.0f)
                {
                    s.setAllSampleData(WaveHelper.ReSample(this.SampleRate, s.SampleRate, s.getAllSampleData()));
                    s.SampleRate = this.SampleRate;
                }
            }
        }
示例#8
0
 //--Private Methods
 private int DeltaTimetoSamples(uint DeltaTime)
 {
     return(SynthHelper.getSampleFromTime(synth.SampleRate, (DeltaTime * (60.0f / (((int)_MidiFile.BeatsPerMinute) * _MidiFile.MidiHeader.DeltaTiming)))));
 }
示例#9
0
 public virtual int getDecay(int note)
 {
     return(SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_DECAY));
 }
示例#10
0
 public virtual int getHold(int note)
 {
     return(SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_HOLD));
 }
示例#11
0
 public virtual int getRelease(int note)
 {
     return(SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_RELEASE));
 }
示例#12
0
 public virtual int getAttack(int note)
 {
     return(SynthHelper.getSampleFromTime(sampleRate, SynthHelper.DEFAULT_ATTACK));
 }