nes-emu
Version:
A NES emulator
46 lines (40 loc) • 1.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _config = _interopRequireDefault(require("../../config"));
var _constants = _interopRequireDefault(require("../../constants"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const APU_SAMPLE_RATE = 44100;
/** A pulse wave generator. */
class PulseOscillator {
constructor() {
this.volume = _constants.default.APU_MAX_VOLUME;
this.dutyCycle = 0; // (0~1)
this.frequency = 0;
this._phase = 0; // (0~1)
}
/** Generates a new sample. */
sample(isNewSample) {
if (isNewSample) this._phase = (this._phase + this.frequency / APU_SAMPLE_RATE) % 1;
return (this._phase < this.dutyCycle ? this.volume : 0) * _config.default.PULSE_CHANNEL_VOLUME;
}
/** Returns a snapshot of the current state. */
getSaveState() {
return {
volume: this.volume,
dutyCycle: this.dutyCycle,
frequency: this.frequency,
phase: this._phase
};
}
/** Restores state from a snapshot. */
setSaveState(saveState) {
this.volume = saveState.volume;
this.dutyCycle = saveState.dutyCycle;
this.frequency = saveState.frequency;
this._phase = saveState.phase;
}
}
exports.default = PulseOscillator;