commit 320054cc37da48112e13bbb61ad909aef3c4251f Author: Kelvin Sherlock Date: Sat Oct 9 09:15:13 2021 -0400 initial check in diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9557609 --- /dev/null +++ b/Makefile @@ -0,0 +1,22 @@ + + +all: js/application.js js/preact.min.js | js + +js/application.js : src/main.jsx src/application.jsx + esbuild --bundle --jsx-factory=preact.h --format=esm src/main.jsx --outfile=js/application.js + + +js/preact.min.js : node_modules/preact/dist/preact.min.js + cp node_modules/preact/dist/preact.min.js js/preact.min.js + +js : + mkdir js + +# js/application.js: src/application.jsx +# babel --react --transform-react-jsx pragma=h --loose --no-comments --runtime polyfill=false \ +# --minify-constant-folding --minify-numeric-literals \ +# -o $@ $< + +.PHONY: clean +clean: + $(RM) js/application.js diff --git a/css/application.css b/css/application.css new file mode 100644 index 0000000..6ce6f9c --- /dev/null +++ b/css/application.css @@ -0,0 +1,17 @@ +html { + line-height: 4ex; +} +#form div { + line-height: 4ex; +} + +#form label { + display: inline-block; + width: 6em; +} +#form label:after { + content: ": "; +} +sub { + font-style: italic; +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..8db32d9 --- /dev/null +++ b/index.html @@ -0,0 +1,19 @@ + + + + Ensoniq Buddy + + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..1159bc5 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "preact": "^10.5.14" + } +} diff --git a/src/application.jsx b/src/application.jsx new file mode 100644 index 0000000..d019218 --- /dev/null +++ b/src/application.jsx @@ -0,0 +1,205 @@ + +// 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') + ); +}); +*/ diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..f6a07e4 --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,10 @@ + +import { Application } from './application'; + +window.addEventListener('load', function(){ + + preact.render( + , + document.getElementById('application') + ); +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..fa8ba17 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +preact@^10.5.14: + version "10.5.14" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.14.tgz#0b14a2eefba3c10a57116b90d1a65f5f00cd2701" + integrity sha512-KojoltCrshZ099ksUZ2OQKfbH66uquFoxHSbnwKbTJHeQNvx42EmC7wQVWNuDt6vC5s3nudRHFtKbpY4ijKlaQ==