Пример #1
0
        public void KeyOn(byte note, byte velo, TownsAudio_WaveTable w)
        {
            SetupLoop(w.loopStart, w.loopLen);
            SetNote(note, w, _reserved);
            SetVelo(velo);

            if (_reserved)
            {
                _activeEffect = true;
            }
            else
            {
                _keyPressed = _activeKey = true;
            }

            _activeOutput = true;
        }
Пример #2
0
        void SetNote(byte note, TownsAudio_WaveTable w, bool stepLimit)
        {
            _note = note;
            sbyte  diff = (sbyte)(_note - w.baseNote);
            ushort r    = (ushort)(w.rate + w.rateOffs);
            ushort bl   = 0;
            uint   s    = 0;

            if (diff < 0)
            {
                diff *= -1;
                bl    = (ushort)(diff % 12);
                diff /= 12;
                s     = (uint)(r >> diff);
                if (bl != 0)
                {
                    s = (s * _pcmPhase2[bl]) >> 16;
                }
            }
            else if (diff > 0)
            {
                bl    = (ushort)(diff % 12);
                diff /= 12;
                s     = (uint)(r << diff);
                if (bl != 0)
                {
                    s += ((s * _pcmPhase1[bl]) >> 16);
                }
            }
            else
            {
                s = r;
            }

            _stepNote = (ushort)(s & 0xffff);
            _step     = (ushort)((s * _stepPitch) >> 14);

            if (stepLimit && _step > 2048)
            {
                _step = 2048;
            }
        }
Пример #3
0
        public int InitInstrument(ref byte note, TownsAudio_WaveTable[] tables, int numTables, out TownsAudio_WaveTable table)
        {
            int i = 0;
            table = null;
            for (; i < 8; i++)
            {
                if (note <= _curInstrument[16 + 2 * i])
                    break;
            }

            if (i == 8)
                return 8;

            var d = (i << 3) + 64;
            _envTotalLevel = _curInstrument[d];
            _envAttackRate = _curInstrument[d + 1];
            _envDecayRate = _curInstrument[d + 2];
            _envSustainLevel = _curInstrument[d + 3];
            _envSustainRate = _curInstrument[d + 4];
            _envReleaseRate = _curInstrument[d + 5];
            _envStep = 0;
            note += _curInstrument[d + 6];

            int id = _curInstrument.ToInt32(i * 4 + 32);

            for (i = 0; i < numTables; i++)
            {
                if (id == tables[i].id)
                    break;
            }

            if (i == numTables)
                return 9;

            table = tables[i];
            return 0;
        }
Пример #4
0
        public int InitInstrument(ref byte note, TownsAudio_WaveTable[] tables, int numTables, out TownsAudio_WaveTable table)
        {
            int i = 0;

            table = null;
            for (; i < 8; i++)
            {
                if (note <= _curInstrument[16 + 2 * i])
                {
                    break;
                }
            }

            if (i == 8)
            {
                return(8);
            }

            var d = (i << 3) + 64;

            _envTotalLevel   = _curInstrument[d];
            _envAttackRate   = _curInstrument[d + 1];
            _envDecayRate    = _curInstrument[d + 2];
            _envSustainLevel = _curInstrument[d + 3];
            _envSustainRate  = _curInstrument[d + 4];
            _envReleaseRate  = _curInstrument[d + 5];
            _envStep         = 0;
            note            += _curInstrument[d + 6];

            int id = _curInstrument.ToInt32(i * 4 + 32);

            for (i = 0; i < numTables; i++)
            {
                if (id == tables[i].id)
                {
                    break;
                }
            }

            if (i == numTables)
            {
                return(9);
            }

            table = tables[i];
            return(0);
        }
Пример #5
0
 public void LoadData(TownsAudio_WaveTable w)
 {
     _data    = w.data;
     _dataEnd = w.size;
 }
Пример #6
0
 public void LoadData(TownsAudio_WaveTable w)
 {
     _data = w.data;
     _dataEnd = w.size;
 }
Пример #7
0
        void SetNote(byte note, TownsAudio_WaveTable w, bool stepLimit)
        {
            _note = note;
            sbyte diff = (sbyte)(_note - w.baseNote);
            ushort r = (ushort)(w.rate + w.rateOffs);
            ushort bl = 0;
            uint s = 0;

            if (diff < 0)
            {
                diff *= -1;
                bl = (ushort)(diff % 12);
                diff /= 12;
                s = (uint)(r >> diff);
                if (bl != 0)
                    s = (s * _pcmPhase2[bl]) >> 16;

            }
            else if (diff > 0)
            {
                bl = (ushort)(diff % 12);
                diff /= 12;
                s = (uint)(r << diff);
                if (bl != 0)
                    s += ((s * _pcmPhase1[bl]) >> 16);

            }
            else
            {
                s = r;
            }

            _stepNote = (ushort)(s & 0xffff);
            _step = (ushort)((s * _stepPitch) >> 14);

            if (stepLimit && _step > 2048)
                _step = 2048;
        }
Пример #8
0
        public void KeyOn(byte note, byte velo, TownsAudio_WaveTable w)
        {
            SetupLoop(w.loopStart, w.loopLen);
            SetNote(note, w, _reserved);
            SetVelo(velo);

            if (_reserved)
                _activeEffect = true;
            else
                _keyPressed = _activeKey = true;

            _activeOutput = true;
        }