Timer - display actual time

Note - display actual hz
simplify 1 * n sample display.
don't display invalid samples.
This commit is contained in:
Kelvin Sherlock 2023-05-27 13:58:24 -04:00
parent 2e68a2c0e0
commit 7a91750238
3 changed files with 88 additions and 15 deletions

View File

@ -272,6 +272,19 @@ function DurationToSeconds(x) {
return 0; return 0;
} }
} }
function DurationSplit(x) {
let [time, unit] = split_value2(x);
switch (+unit) {
case 0:
return [+time, "s"];
case 1:
return [+time / 1e3, "ms"];
case 2:
return [+time / 60, "ticks"];
default:
return [0, ""];
}
}
var DurationInput = class extends preact.Component { var DurationInput = class extends preact.Component {
constructor(props) { constructor(props) {
super(props); super(props);
@ -358,16 +371,19 @@ function simplify(res, freq) {
} }
function SampleDisplay(props) { function SampleDisplay(props) {
var { shift, freq } = props; var { shift, freq } = props;
if (freq == 0)
return [];
var freq2 = log2(freq); var freq2 = log2(freq);
var fspan = /* @__PURE__ */ preact.h("span", { var fspan = /* @__PURE__ */ preact.h("span", {
title: "Frequency" title: "Frequency"
}, freq); }, freq);
var fspann = freq == 1 ? /* @__PURE__ */ preact.h("i", null, "n") : /* @__PURE__ */ preact.h(preact.Fragment, null, "(", fspan, " * ", /* @__PURE__ */ preact.h("i", null, "n"), ")");
var rv = []; var rv = [];
rv.push( rv.push(
/* @__PURE__ */ preact.h("div", null, "Sample", /* @__PURE__ */ preact.h("sub", null, "n"), " = RAM[ (", fspan, " * ", /* @__PURE__ */ preact.h("i", null, "n"), ") >> ", shift, " ]") /* @__PURE__ */ preact.h("div", null, "Sample", /* @__PURE__ */ preact.h("sub", null, "n"), " = RAM[ ", fspann, " >> ", shift, " ]")
); );
rv.push( rv.push(
/* @__PURE__ */ preact.h("div", null, "Sample", /* @__PURE__ */ preact.h("sub", null, "n"), " = RAM[ (", fspan, " * ", /* @__PURE__ */ preact.h("i", null, "n"), ") / ", 1 << shift, " ]") /* @__PURE__ */ preact.h("div", null, "Sample", /* @__PURE__ */ preact.h("sub", null, "n"), " = RAM[ ", fspann, " / ", 1 << shift, " ]")
); );
if (freq2) { if (freq2) {
if (freq2 >= shift) { if (freq2 >= shift) {
@ -393,15 +409,18 @@ function NoteDisplay(props) {
const f = note_frq / (sr / (1 << 8 + wave)); const f = note_frq / (sr / (1 << 8 + wave));
var best_res = 0; var best_res = 0;
var best_freq = 0; var best_freq = 0;
var actual = 0;
for (var res = 0; res < 8; ++res) { for (var res = 0; res < 8; ++res) {
var tmp = Math.round(f * (1 << calc_shift(res, wave))); const shift = 1 << calc_shift(res, wave);
const tmp = Math.round(f * shift);
if (tmp >= 65536) if (tmp >= 65536)
break; break;
best_res = res; best_res = res;
best_freq = tmp; best_freq = tmp;
actual = sr / (256 * shift / tmp);
} }
[best_res, best_freq] = simplify(best_res, best_freq); [best_res, best_freq] = simplify(best_res, best_freq);
return /* @__PURE__ */ preact.h(preact.Fragment, null, /* @__PURE__ */ preact.h("div", null, "Wave Size: 256"), /* @__PURE__ */ preact.h("div", null, "Resolution: ", best_res), /* @__PURE__ */ preact.h("div", null, "Frequency: ", best_freq)); return /* @__PURE__ */ preact.h(preact.Fragment, null, /* @__PURE__ */ preact.h("div", null, "Note: ", actual.toFixed(2), " Hz"), /* @__PURE__ */ preact.h("div", null, "Wave Size: 256"), /* @__PURE__ */ preact.h("div", null, "Resolution: ", best_res), /* @__PURE__ */ preact.h("div", null, "Frequency: ", best_freq));
} }
function ResampleDisplay(props) { function ResampleDisplay(props) {
var { osc, size, freq } = props; var { osc, size, freq } = props;
@ -431,25 +450,37 @@ function HyperDisplay(props) {
return /* @__PURE__ */ preact.h("div", null, "Relative: ", relative); return /* @__PURE__ */ preact.h("div", null, "Relative: ", relative);
} }
function TimerDisplay(props) { function TimerDisplay(props) {
var { osc, time } = props; var { osc, duration } = props;
const [time, units] = DurationSplit(duration);
const sr = calc_sr(osc); const sr = calc_sr(osc);
const cycles = time * sr; const cycles = time * sr;
const size = 0; const size = 0;
var best_res = 0; var best_res = 0;
var best_freq = 0; var best_freq = 0;
var actual = 0;
best = []; best = [];
for (var res = 0; res < 8; ++res) { for (var res = 0; res < 8; ++res) {
var shift = 1 << calc_shift(res, size); var shift = 1 << calc_shift(res, size);
var f = Math.round(shift * 256 / cycles); var f = Math.round(shift * 256 / cycles);
if (f >= 65536) if (f >= 65536)
continue; continue;
var actual = Math.ceil(256 * shift / f); actual = Math.ceil(256 * shift / f);
best_res = res; best_res = res;
best_freq = f; best_freq = f;
} }
[best_res, best_freq] = simplify(best_res, best_freq); [best_res, best_freq] = simplify(best_res, best_freq);
var best_shift = calc_shift(best_res, size); var best_shift = calc_shift(best_res, size);
return /* @__PURE__ */ preact.h(preact.Fragment, null, /* @__PURE__ */ preact.h("div", null, "Resolution: ", best_res ? best_res : "N/A"), /* @__PURE__ */ preact.h("div", null, "Frequency: ", best_freq ? best_freq : "N/A"), /* @__PURE__ */ preact.h(SampleDisplay, { switch (units) {
case "s":
break;
case "ms":
actual *= 1e3;
break;
case "ticks":
actual *= 60;
break;
}
return /* @__PURE__ */ preact.h(preact.Fragment, null, /* @__PURE__ */ preact.h("div", null, "Time: ", actual ? (actual / sr).toFixed(2) + " " + units : "N/A"), /* @__PURE__ */ preact.h("div", null, "Resolution: ", best_res ? best_res : "N/A"), /* @__PURE__ */ preact.h("div", null, "Frequency: ", best_freq ? best_freq : "N/A"), /* @__PURE__ */ preact.h(SampleDisplay, {
freq: best_freq, freq: best_freq,
shift: best_shift shift: best_shift
})); }));
@ -621,7 +652,7 @@ var Application = class extends preact.Component {
onChange: this._durationChange onChange: this._durationChange
})), /* @__PURE__ */ preact.h(TimerDisplay, { })), /* @__PURE__ */ preact.h(TimerDisplay, {
osc, osc,
time: DurationToSeconds(duration) duration
})); }));
} }
hyperChildren() { hyperChildren() {

View File

@ -8,7 +8,7 @@ import { WaveData } from './wave_data';
import { Oscillators, WaveSize, Resolution, Frequency, Assembler, WaveShape, CheckBox } from './input'; import { Oscillators, WaveSize, Resolution, Frequency, Assembler, WaveShape, CheckBox } from './input';
import { DurationInput, DurationToSeconds } from './duration_input'; import { DurationInput, DurationSplit } from './duration_input';
const C4 = 4*12; const C4 = 4*12;
@ -32,21 +32,24 @@ function SampleDisplay(props) {
var { shift, freq } = props; var { shift, freq } = props;
if (freq == 0) return [];
var freq2 = log2(freq); var freq2 = log2(freq);
var fspan = <span title="Frequency">{freq}</span>; var fspan = <span title="Frequency">{freq}</span>;
var fspann = freq == 1 ? <i>n</i> : <>({fspan} * <i>n</i>)</>;
var rv = []; var rv = [];
rv.push( rv.push(
<div> <div>
Sample<sub>n</sub> = RAM[ ({fspan} * <i>n</i>) &gt;&gt; {shift} ] Sample<sub>n</sub> = RAM[ {fspann} &gt;&gt; {shift} ]
</div> </div>
); );
rv.push( rv.push(
<div> <div>
Sample<sub>n</sub> = RAM[ ({fspan} * <i>n</i>) / {1 << shift} ] Sample<sub>n</sub> = RAM[ {fspann} / {1 << shift} ]
</div> </div>
); );
@ -91,17 +94,22 @@ function NoteDisplay(props) {
var best_res = 0; var best_res = 0;
var best_freq = 0; var best_freq = 0;
var actual = 0;
for (var res = 0; res < 8; ++res) { for (var res = 0; res < 8; ++res) {
var tmp = Math.round(f * (1 << calc_shift(res, wave))); const shift = (1 << calc_shift(res, wave));
const tmp = Math.round(f * shift);
if (tmp >= 0x10000) break; if (tmp >= 0x10000) break;
best_res = res; best_res = res;
best_freq = tmp; best_freq = tmp;
actual = sr / ( 256 * shift / tmp);
} }
[best_res, best_freq] = simplify(best_res, best_freq); [best_res, best_freq] = simplify(best_res, best_freq);
return ( return (
<> <>
<div>Note: { actual.toFixed(2)} Hz</div>
<div>Wave Size: 256</div> <div>Wave Size: 256</div>
<div>Resolution: {best_res}</div> <div>Resolution: {best_res}</div>
<div>Frequency: {best_freq}</div> <div>Frequency: {best_freq}</div>
@ -165,8 +173,10 @@ function HyperDisplay(props) {
function TimerDisplay(props) { function TimerDisplay(props) {
var {osc, time } = props; var {osc, duration } = props;
const [time, units] = DurationSplit(duration);
const sr = calc_sr(osc); const sr = calc_sr(osc);
const cycles = time * sr; const cycles = time * sr;
@ -182,6 +192,7 @@ function TimerDisplay(props) {
var best_res = 0; var best_res = 0;
var best_freq = 0; var best_freq = 0;
var actual = 0;
best = [] best = []
for (var res = 0; res < 8; ++res) { for (var res = 0; res < 8; ++res) {
@ -189,7 +200,7 @@ function TimerDisplay(props) {
var f = Math.round(shift * 256 / cycles); var f = Math.round(shift * 256 / cycles);
if (f >= 0x10000) continue; // break; if (f >= 0x10000) continue; // break;
var actual = Math.ceil(256 * shift / f); actual = Math.ceil(256 * shift / f);
best_res = res; best_res = res;
best_freq = f; best_freq = f;
@ -198,8 +209,15 @@ function TimerDisplay(props) {
[best_res, best_freq] = simplify(best_res, best_freq); [best_res, best_freq] = simplify(best_res, best_freq);
var best_shift = calc_shift(best_res, size); var best_shift = calc_shift(best_res, size);
switch(units) {
case "s": break;
case "ms": actual *= 1000; break;
case "ticks": actual *= 60; break;
}
return ( return (
<> <>
<div>Time: { actual ? (actual / sr).toFixed(2) + " " + units : "N/A" }</div>
<div>Resolution: {best_res ? best_res : "N/A"}</div> <div>Resolution: {best_res ? best_res : "N/A"}</div>
<div>Frequency: {best_freq ? best_freq : "N/A"}</div> <div>Frequency: {best_freq ? best_freq : "N/A"}</div>
<SampleDisplay freq={best_freq} shift={best_shift} /> <SampleDisplay freq={best_freq} shift={best_shift} />
@ -417,7 +435,7 @@ export class Application extends preact.Component {
<label>Duration</label> <DurationInput value={duration} onChange={this._durationChange} /> <label>Duration</label> <DurationInput value={duration} onChange={this._durationChange} />
</div> </div>
<TimerDisplay osc={osc} time={DurationToSeconds(duration)} /> <TimerDisplay osc={osc} duration={duration} />
</> </>
); );
} }

View File

@ -13,6 +13,18 @@ function split_value(x) {
return [ "", 0]; return [ "", 0];
} }
export function DurationToUnits(x) {
let [ time, unit ] = split_value(x);
switch (+unit) {
case 0: "seconds"; // seconds;
case 1: "milliseconds" ; // milliseconds;
case 2: "ticks"; // ticks
default: return "";
}
}
export function DurationToSeconds(x) { export function DurationToSeconds(x) {
let [ time, unit ] = split_value(x); let [ time, unit ] = split_value(x);
@ -24,6 +36,18 @@ export function DurationToSeconds(x) {
} }
} }
export function DurationSplit(x) {
let [ time, unit ] = split_value(x);
switch (+unit) {
case 0: return [+time, "s"]; // seconds;
case 1: return [+time / 1000, "ms"]; // milliseconds;
case 2: return [+time / 60, "ticks"]; // ticks
default: return [0, ""];
}
}
export class DurationInput extends preact.Component { export class DurationInput extends preact.Component {
constructor(props) { constructor(props) {