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); }
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)); }
public void Stop() { ReleasedVolume = OutVolume; Envflag = EnvelopeFlag.Release; Tick = 0; IsStopping = true; //Console.WriteLine("[DEBUG]音源再生終了リクエスト受信"); }
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]音源再生開始"); }
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); }
public void Abort() { Tick = 0; Envflag = EnvelopeFlag.None; DX.StopSoundMem(Handle); DX.DeleteSoundMem(Handle); Playing = false; //Console.WriteLine("[DEBUG]音源再生終了"); }