nes-emu
Version:
A NES emulator
40 lines (35 loc) • 1.2 kB
JavaScript
;
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 APU_SAMPLE_RATE = 44100;
const TRIANGLE_SEQUENCE = [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
/** A triangle wave generator. */
class TriangleOscillator {
constructor() {
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;
const step = Math.floor(this._phase * TRIANGLE_SEQUENCE.length);
return TRIANGLE_SEQUENCE[step] * _config.default.TRIANGLE_CHANNEL_VOLUME;
}
/** Returns a snapshot of the current state. */
getSaveState() {
return {
frequency: this.frequency,
phase: this._phase
};
}
/** Restores state from a snapshot. */
setSaveState(saveState) {
this.frequency = saveState.frequency;
this._phase = saveState.phase;
}
}
exports.default = TriangleOscillator;