Ejemplo n.º 1
0
        public (short, short) GetSample(int index, double sampleRate, Tone t)
        {
            var time = MidiTimingConverter.GetTime(index, (int)sampleRate);


            var i = (int)((index % (100)) * (32 * 0.01));

            if (i > 31)
            {
                i -= 32;
            }
            var          o = Wave[i];
            float        vol;
            EnvelopeFlag flag = EnvelopeFlag.Attack;

            if (time > Envelope.A)
            {
                flag = EnvelopeFlag.Decay;
            }
            if (time > Envelope.A + Envelope.D)
            {
                flag = EnvelopeFlag.Sustain;
            }
            switch (flag)
            {
            case EnvelopeFlag.Attack:
                vol = (float)MathHelper.Linear(time, 0, Envelope.A, 0, 1);
                break;

            case EnvelopeFlag.Decay:
                vol = (float)MathHelper.Linear(time, Envelope.A, Envelope.A + Envelope.D, 1, Envelope.S * 0.0039);
                break;

            case EnvelopeFlag.Sustain:
                vol = Envelope.S * 0.0039f;
                break;

            case EnvelopeFlag.Release:
            case EnvelopeFlag.None:
            default:
                vol = 0;
                break;
            }
            if (t != null)
            {
                t.EnvVolume = vol;
            }
            short a = (short)(Math.Min(short.MaxValue, Math.Max(short.MinValue, o * vol)));

            return(a, a);
        }
Ejemplo n.º 2
0
        public (short l, short r) GetSample(int index, double sampleRate)
        {
            var time = MidiTimingConverter.GetTime(index, (int)sampleRate);
            //var cycle = sampleRate / freq;
            //if (cycle == 0)
            //	return (0, 0);

            var i = (int)((index % (100)) * (32 / 100d));

            //var i = index;
            if (i > 31)
            {
                i -= 32;
            }
            var          o = Wave[i];
            float        vol;
            EnvelopeFlag flag = EnvelopeFlag.Attack;

            if (time > Envelope.A)
            {
                flag = EnvelopeFlag.Decay;
            }
            if (time > Envelope.A + Envelope.D)
            {
                flag = EnvelopeFlag.Sustain;
            }
            switch (flag)
            {
            case EnvelopeFlag.Attack:
                vol = (float)MathHelper.Linear(time, 0, Envelope.A, 0, 1);
                break;

            case EnvelopeFlag.Decay:
                vol = (float)MathHelper.Linear(time, Envelope.A + 1, Envelope.D, 1, Envelope.S / 255d);
                break;

            case EnvelopeFlag.Sustain:
                vol = Envelope.S / 255f;
                break;

            case EnvelopeFlag.Release:
            case EnvelopeFlag.None:
            default:
                vol = 0;
                break;
            }
            return((short)(o * vol), (short)(o * vol));
        }
Ejemplo n.º 3
0
 public void Stop()
 {
     ReleasedVolume = OutVolume;
     Envflag = EnvelopeFlag.Release;
     Tick = 0;
     IsStopping = true;
     //Console.WriteLine("[DEBUG]音源再生終了リクエスト受信");
 }
Ejemplo n.º 4
0
 public void StartPlay(int miditick, int gate)
 {
     _outvolume = 0;
     Playing = true;
     DX.ChangeVolumeSoundMem(0, Handle);
     DX.SetFrequencySoundMem((int) (GetFreq(Pitch, 4) * 100), Handle);
     if (Octave > 6)
         DX.SetFrequencySoundMem((int) (GetFreq(Pitch, Octave - 2) * 100), Handle);
     DX.PlaySoundMem(Handle, DX.DX_PLAYTYPE_LOOP);
     //DX.ChangeVolumeSoundMem(0, Handle);
     Envflag = EnvelopeFlag.Attack;
     Tick = (int) (Envelope.AttackTime / 1.2);
     Bmilisec = DX.GetNowCount();
     StartedMidiTick = miditick;
     Gate = gate;
     //Console.WriteLine("[DEBUG]音源再生開始");
 }
Ejemplo n.º 5
0
        public void PlayLoop(int miditick)
        {
            if (!Playing)
                return;
            if (IsNew && _beforenew)
                IsNew = false;
            if (!_beforenew)
                _beforenew = true;
            //if (DX.GetNowCount() - bmilisec <= 0)
            //	return;

            #region ふるいの

            /*
                                                switch (envflag)
                                                {
                                                    case EnvelopeFlag.Attack:
                                                        if (Envelope.AttackTime <= 1)
                                                        {
                                                            tick = -1;
                                                            envflag = EnvelopeFlag.Decay;
                                                            break;
                                                        }
                                                        if (tick >= Envelope.AttackTime)
                                                        {
                                                            tick = -1;
                                                            envflag = EnvelopeFlag.Decay;
                                                            break;
                                                        }
                                                        _outvolume = (int)((tick) * ((float)Volume / (Envelope.AttackTime - 1)));
                                                        break;
                                                    case EnvelopeFlag.Decay:
                                                        if (Envelope.DecayTime == 0)
                                                        {
                                                            tick = -1;
                                                            envflag = EnvelopeFlag.Sustain;
                                                            break;
                                                        }
                                                        if (tick >= Envelope.DecayTime)
                                                        {
                                                            tick = -1;
                                                            envflag = EnvelopeFlag.Sustain;
                                                            break;
                                                        }
                                                        _outvolume = (int)(Volume - (tick + 1) * ((float)(Volume - Envelope.SustainLevel * (Volume / 255.0)) / Envelope.DecayTime));
                                                        break;
                                                    case EnvelopeFlag.Release:
                                                        if (tick >= Envelope.ReleaseTime)
                                                        {
                                                            Abort();
                                                            return;
                                                        }
                                                        _outvolume = (int)(releasedVolume - (tick + 1) * ((float)releasedVolume / Envelope.ReleaseTime));
                                                        break;
                                                }
                                                */

            #endregion

            switch (Envflag)
            {
                case EnvelopeFlag.Attack:
                    if (Envelope.AttackTime == 0)
                    {
                        _outvolume = 255;
                        Envflag = EnvelopeFlag.Decay;
                        break;
                    }
                    var zoubun = 255f / Envelope.AttackTime;
                    _outvolume = _outvolume + zoubun * Tick;
                    if (_outvolume >= 255)
                    {
                        _outvolume = 255;
                        Envflag = EnvelopeFlag.Decay;
                    }
                    break;
                case EnvelopeFlag.Decay:
                    if (Envelope.DecayTime == 0)
                    {
                        _outvolume = Envelope.SustainLevel;
                        Envflag = EnvelopeFlag.Sustain;
                        break;
                    }
                    var genbun = (255f - Envelope.SustainLevel) / Envelope.DecayTime;
                    _outvolume = _outvolume - genbun * Tick;
                    if (_outvolume <= Envelope.SustainLevel)
                    {
                        _outvolume = Envelope.SustainLevel;
                        Envflag = EnvelopeFlag.Sustain;
                    }
                    break;
                case EnvelopeFlag.Release:
                    if (Envelope.ReleaseTime == 0)
                    {
                        Abort();
                        break;
                    }
                    var genbun2 = (float) ReleasedVolume / Envelope.ReleaseTime;
                    _outvolume = _outvolume - genbun2 * Tick;
                    if (_outvolume <= 0)
                    {
                        _outvolume = 0;
                        Abort();
                    }
                    break;
            }

            NowMidiTick = miditick;
            if ((NowMidiTick - StartedMidiTick > Gate) && (Gate != -1) && (Envflag != EnvelopeFlag.Release))
                Stop();
            Tick = DX.GetNowCount() - Bmilisec;

            Bmilisec = DX.GetNowCount();
            //Console.WriteLine("[DEBUG]音源ループ: {0}, {1}, {2}", outVolume, tick, envflag);
        }
Ejemplo n.º 6
0
        public void Abort()
        {
            Tick = 0;
            Envflag = EnvelopeFlag.None;
            DX.StopSoundMem(Handle);
            DX.DeleteSoundMem(Handle);
            Playing = false;

            //Console.WriteLine("[DEBUG]音源再生終了");
        }