// var h = preact.h; function calc_sr(osc) { // iigs is ~7.14Mhz / 8. Mirage is 8Mhz / 8 return (28.63636*1000*1000/32) / (osc + 2); } function calc_shift(res,ws) { return res + 9 - ws; } function log2(x) { var y = Math.log2(x); return (y >> 0) === y ? y : false; } function Oscillators(props) { var options = [] for (var i = 1; i < 33; ++i) { options.push(); } return ; } function WaveSize(props) { var options = [] for (var i = 8; i < 16; ++i) { var ext = 1 << i; var int = i - 8; options.push(); } return ; } function Resolution(props) { var options = [] for (var i = 0; i < 8; ++i) { options.push(); } return ; } function Frequency(props) { /* number, min, max are not as strict as they ought to be */ return ; } function nmultiply(x) { if (x == 0) return 0; if (x == 1) return n; return {x} * n; // return paren ? ({x} * n) : {x} * n; } function SampleDisplay(props) { var { shift, freq } = props; var freq2 = log2(freq); var fspan = {freq}; var rv = []; rv.push(
Samplen = RAM[ ({fspan} * n) >> {shift} ]
); rv.push(
Samplen = RAM[ ({fspan} * n) / {1 << shift} ]
); if (freq2) { if (freq2 >= shift) { rv.push(
Samplen = RAM[ { nmultiply(freq / ( 1 << shift)) } ]
); } else { rv.push(
Samplen = RAM[ { nmultiply(freq >> freq2) } >> {shift - freq2} ]
); rv.push(
Samplen = RAM[ { nmultiply(freq >> freq2) } / { 1 << (shift - freq2) } ]
); } } return rv; } // oscillators generate addresses, not samples. // accumulator is 24-bit. // frequency is 16-bit. // accumulator n = freq * n // sample n = memory[(freq * n) >> res. shift] export class Application extends preact.Component { constructor(props) { super(props); this._oscChange = this.oscChange.bind(this); this._waveChange = this.waveChange.bind(this); this._resChange = this.resChange.bind(this); this._freqChange = this.freqChange.bind(this); this.state = { osc: 32, wave: 0, res: 0, freq: 512 }; } oscChange(e) { e.preventDefault(); var v = +e.target.value || 0; this.setState( { osc: v } ); } waveChange(e) { e.preventDefault(); var v = +e.target.value || 0; this.setState( { wave: v } ); } resChange(e) { e.preventDefault(); var v = +e.target.value || 0; this.setState( { res: v } ); } freqChange(e) { e.preventDefault(); var v = +e.target.value >> 0; if (v < 0) v = 0; if (v > 65535) v = 65535; this.setState( { freq: v } ); } form() { var { osc, wave, res, freq } = this.state; return (
); } render() { var { osc, wave, res, freq } = this.state; var shift = calc_shift(res, wave); return (
{ this.form() }
Scan Rate: { (calc_sr(osc) / 1000 ).toFixed(2) } kHz
); } } /* window.addEventListener('load', function(){ preact.render( , document.getElementById('application') ); }); */