UNPKG

nes-emu

Version:

A NES emulator

48 lines (42 loc) 1.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _config = _interopRequireDefault(require("../../config")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const DUTY_SEQUENCE = [[0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 0, 0, 0], [1, 0, 0, 1, 1, 1, 1, 1]]; /** A square wave generator. */ class PulseOscillator { constructor() { this.volume = 1; this.dutyCycle = 0; this._frequency = 0; } /** Generates a new sample. */ sample(time) { const period = 1 / this._frequency; const phase = time % period; const step = Math.floor(phase / (period / 8)); return DUTY_SEQUENCE[this.dutyCycle][step] * this.volume * _config.default.PULSE_CHANNEL_VOLUME; } /** Returns a snapshot of the current state. */ getSaveState() { return { volume: this.volume, dutyCycle: this.dutyCycle, frequency: this._frequency }; } /** Restores state from a snapshot. */ setSaveState(saveState) { this.volume = saveState.volume; this.dutyCycle = saveState.dutyCycle; this.frequency = saveState.frequency; } /** Sets the frequency, but only if the change is above a minimum threshold (this sounds better). */ set frequency(value) { if (Math.abs(this._frequency - value) > _config.default.MIN_FREQUENCY_CHANGE) this._frequency = value; } } exports.default = PulseOscillator;