diff --git a/js/application.js b/js/application.js index b5d070e..3b39aba 100644 --- a/js/application.js +++ b/js/application.js @@ -402,11 +402,14 @@ function SampleDisplay(props) { return rv; } function NoteDisplay(props) { - var { osc, note } = props; + const { osc, note } = props; + return PitchDisplay({ osc, pitch: NoteFrequency(note) }); +} +function PitchDisplay(props) { + var { osc, pitch } = props; const wave = 0; const sr = calc_sr(osc); - const note_frq = NoteFrequency(note); - const f = note_frq / (sr / (1 << 8 + wave)); + const f = pitch / (sr / (1 << 8 + wave)); var best_res = 0; var best_freq = 0; for (var res = 0; res < 8; ++res) { @@ -504,6 +507,7 @@ var Application = class extends preact.Component { this._resChange = this.resChange.bind(this); this._freqChange = this.freqChange.bind(this); this._noteChange = this.noteChange.bind(this); + this._pitchChange = this.pitchChange.bind(this); this._durationChange = this.durationChange.bind(this); this._tabChange = this.tabChange.bind(this); this._asmChange = this.asmChange.bind(this); @@ -522,7 +526,8 @@ var Application = class extends preact.Component { shape: 0, in_freq: 44100, in_size: 0, - indeterminate: false + indeterminate: false, + pitch: 440 }; } oscChange(e) { @@ -540,6 +545,15 @@ var Application = class extends preact.Component { var v = +e.target.value || 0; this.setState({ res: v }); } + pitchChange(e) { + e.preventDefault(); + var v = +e.target.value; + if (v < 0) + v = 0; + if (v > 65535) + v = 65535; + this.setState({ pitch: v }); + } freqChange(e) { e.preventDefault(); var v = +e.target.value >> 0; @@ -629,6 +643,20 @@ var Application = class extends preact.Component { wave })); } + pitchChildren() { + var { osc, wave, pitch } = this.state; + return /* @__PURE__ */ preact.h(preact.Fragment, null, /* @__PURE__ */ preact.h("div", null, /* @__PURE__ */ preact.h("label", null, "Oscillators"), " ", /* @__PURE__ */ preact.h(Oscillators, { + value: osc, + onChange: this._oscChange + })), /* @__PURE__ */ preact.h("div", null, /* @__PURE__ */ preact.h("label", null, "Pitch"), " ", /* @__PURE__ */ preact.h(Frequency, { + value: pitch, + onChange: this._pitchChange + }), " Hz"), /* @__PURE__ */ preact.h(PitchDisplay, { + osc, + pitch, + wave + })); + } waveChildren() { var { assembler, shape } = this.state; return /* @__PURE__ */ preact.h(preact.Fragment, null, /* @__PURE__ */ preact.h("div", null, /* @__PURE__ */ preact.h("label", null, "Assembler"), " ", /* @__PURE__ */ preact.h(Assembler, { @@ -710,16 +738,20 @@ var Application = class extends preact.Component { children = this.noteChildren(); break; case 3: - children = this.waveChildren(); + children = this.pitchChildren(); break; case 4: - children = this.timerChildren(); + children = this.waveChildren(); break; case 5: + children = this.timerChildren(); + break; + case 6: children = this.hyperChildren(); break; } - var options = ["Sample", "Resample", "Note", "Wave", "Timer", "HyperCard Pitch"].map((o, ix) => { + const Labels = ["Sample", "Resample", "Note", "Pitch", "Wave", "Timer", "HyperCard Pitch"]; + var options = Labels.map((o, ix) => { return /* @__PURE__ */ preact.h("option", { key: ix, value: ix diff --git a/src/application.jsx b/src/application.jsx index 3235c86..474fab1 100644 --- a/src/application.jsx +++ b/src/application.jsx @@ -77,6 +77,7 @@ function SampleDisplay(props) { } +/* function NoteDisplay(props) { @@ -114,6 +115,48 @@ function NoteDisplay(props) { ); } +*/ +function NoteDisplay(props) { + const { osc, note } = props; + return PitchDisplay({osc: osc, pitch: NoteFrequency(note)}); +} +function PitchDisplay(props) { + + + var { osc, pitch } = props; + + const wave = 0; // 256 + + const sr = calc_sr(osc); + + const f = pitch / (sr / (1 << (8 + wave))); + + // best_res = 7 - Math.ceil(Math.log2(f)) ? + // best_freq = f * (1 << calc_shift(best_res, 0)) ? + + var best_res = 0; + var best_freq = 0; + for (var res = 0; res < 8; ++res) { + const shift = (1 << calc_shift(res, wave)); + const tmp = Math.round(f * shift); + if (tmp >= 0x10000) break; + best_res = res; + best_freq = tmp; + } + + [best_res, best_freq] = simplify(best_res, best_freq); + + return ( + <> + +
Wave Size: 256
+
Resolution: {best_res}
+
Frequency: {best_freq}
+ + + ); +} + function RateDisplay(props) { const { osc, wave, freq, res} = props; @@ -254,6 +297,7 @@ export class Application extends preact.Component { this._resChange = this.resChange.bind(this); this._freqChange = this.freqChange.bind(this); this._noteChange = this.noteChange.bind(this); + this._pitchChange = this.pitchChange.bind(this); this._durationChange = this.durationChange.bind(this); this._tabChange = this.tabChange.bind(this); this._asmChange = this.asmChange.bind(this); @@ -267,6 +311,7 @@ export class Application extends preact.Component { note: C4, assembler: 0, shape: 0, in_freq: 44100, in_size: 0, indeterminate: false, + pitch: 440, }; } @@ -288,6 +333,15 @@ export class Application extends preact.Component { this.setState( { res: v } ); } + pitchChange(e) { + e.preventDefault(); + var v = +e.target.value; + if (v < 0) v = 0; + if (v > 65535) v = 65535; + this.setState( { pitch: v } ); + } + + freqChange(e) { e.preventDefault(); var v = +e.target.value >> 0; @@ -393,6 +447,26 @@ export class Application extends preact.Component { } + pitchChildren() { + + var { osc, wave, pitch } = this.state; + + return ( + <> +
+ +
+
+ Hz +
+ + + + ); + + + } + waveChildren() { var { assembler, shape } = this.state; @@ -500,12 +574,14 @@ export class Application extends preact.Component { case 0: children = this.sampleChildren(); break; case 1: children = this.resampleChildren(); break; case 2: children = this.noteChildren(); break; - case 3: children = this.waveChildren(); break; - case 4: children = this.timerChildren(); break; - case 5: children = this.hyperChildren(); break; + case 3: children = this.pitchChildren(); break; + case 4: children = this.waveChildren(); break; + case 5: children = this.timerChildren(); break; + case 6: children = this.hyperChildren(); break; } - var options = ["Sample", "Resample", "Note", "Wave", "Timer", "HyperCard Pitch",].map( (o, ix) => { + const Labels = ["Sample", "Resample", "Note", "Pitch", "Wave", "Timer", "HyperCard Pitch"]; + var options = Labels.map( (o, ix) => { return ; });