UNPKG

broken-neees

Version:

A really broken NEEES emulator that introduces glitches and random bugs on purpose!

46 lines (45 loc) 1.88 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _LengthCounter = _interopRequireDefault(require("./LengthCounter")); var _VolumeEnvelope = _interopRequireDefault(require("./VolumeEnvelope")); var _noisePeriods = _interopRequireDefault(require("../lib/apu/noisePeriods")); var _byte = _interopRequireDefault(require("../lib/byte")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } class NoiseChannel { constructor(apu) { this.apu = apu; this.registers = this.apu.registers.noise; this.lengthCounter = new _LengthCounter.default(); this.volumeEnvelope = new _VolumeEnvelope.default(); this.shift = 0b1; // (the shift register is 15 bits wide) this.dividerCount = 0; } sample() { if (!this.isEnabled() || !this.lengthCounter.isActive() || this.isMuted()) return 0; return this.registers.control.constantVolume ? this.registers.control.volumeOrEnvelopePeriod : this.volumeEnvelope.volume; } step() { this.dividerCount++; if (this.dividerCount >= _noisePeriods.default[this.registers.form.periodId]) this.dividerCount = 0;else return; const bitPosition = this.registers.form.mode ? 6 : 1; const bit = _byte.default.getBit(this.shift, bitPosition); const feedback = _byte.default.getBit(this.shift, 0) ^ bit; this.shift = this.shift >> 1 | feedback << 14; } quarterFrame() { this.volumeEnvelope.clock(this.registers.control.volumeOrEnvelopePeriod, this.registers.control.envelopeLoopOrLengthCounterHalt); } halfFrame() { this.lengthCounter.clock(this.isEnabled(), this.registers.control.envelopeLoopOrLengthCounterHalt); } isEnabled() { return !!this.apu.registers.apuControl.enableNoise; } isMuted() { return !_byte.default.getBit(this.shift, 0); } } exports.default = NoiseChannel;