Compare commits

...

2 Commits

Author SHA1 Message Date
Kelvin Sherlock 320bcf3dca add rate to sample tab 2023-05-27 14:24:16 -04:00
Kelvin Sherlock 7a91750238 Timer - display actual time
Note - display actual hz
simplify 1 * n sample display.
don't display invalid samples.
2023-05-27 13:58:24 -04:00
3 changed files with 119 additions and 16 deletions

View File

@ -272,6 +272,19 @@ function DurationToSeconds(x) {
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 {
constructor(props) {
super(props);
@ -358,16 +371,19 @@ function simplify(res, freq) {
}
function SampleDisplay(props) {
var { shift, freq } = props;
if (freq == 0)
return [];
var freq2 = log2(freq);
var fspan = /* @__PURE__ */ preact.h("span", {
title: "Frequency"
}, 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 = [];
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(
/* @__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 >= shift) {
@ -394,14 +410,28 @@ function NoteDisplay(props) {
var best_res = 0;
var best_freq = 0;
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)
break;
best_res = res;
best_freq = tmp;
}
[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(RateDisplay, {
wave: 0,
osc,
freq: best_freq,
res: best_res
}), /* @__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 RateDisplay(props) {
const { osc, wave, freq, res } = props;
const sr = calc_sr(osc);
const shift = 1 << calc_shift(res, wave);
const size = 256 << wave;
const rate = sr / (size * shift / freq);
return /* @__PURE__ */ preact.h("div", null, "Rate: ", rate.toFixed(2), " Hz");
}
function ResampleDisplay(props) {
var { osc, size, freq } = props;
@ -431,25 +461,37 @@ function HyperDisplay(props) {
return /* @__PURE__ */ preact.h("div", null, "Relative: ", relative);
}
function TimerDisplay(props) {
var { osc, time } = props;
var { osc, duration } = props;
const [time, units] = DurationSplit(duration);
const sr = calc_sr(osc);
const cycles = time * sr;
const size = 0;
var best_res = 0;
var best_freq = 0;
var actual = 0;
best = [];
for (var res = 0; res < 8; ++res) {
var shift = 1 << calc_shift(res, size);
var f = Math.round(shift * 256 / cycles);
if (f >= 65536)
continue;
var actual = Math.ceil(256 * shift / f);
actual = Math.ceil(256 * shift / f);
best_res = res;
best_freq = f;
}
[best_res, best_freq] = simplify(best_res, best_freq);
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,
shift: best_shift
}));
@ -562,7 +604,13 @@ var Application = class extends preact.Component {
})), /* @__PURE__ */ preact.h("div", null, /* @__PURE__ */ preact.h("label", null, "Frequency"), " ", /* @__PURE__ */ preact.h(Frequency, {
value: freq,
onChange: this._freqChange
})), /* @__PURE__ */ preact.h(SampleDisplay, {
})), /* @__PURE__ */ preact.h(RateDisplay, {
wave,
osc,
freq,
shift,
res
}), /* @__PURE__ */ preact.h(SampleDisplay, {
freq,
shift
}));
@ -621,7 +669,7 @@ var Application = class extends preact.Component {
onChange: this._durationChange
})), /* @__PURE__ */ preact.h(TimerDisplay, {
osc,
time: DurationToSeconds(duration)
duration
}));
}
hyperChildren() {

View File

@ -8,7 +8,7 @@ import { WaveData } from './wave_data';
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;
@ -32,21 +32,24 @@ function SampleDisplay(props) {
var { shift, freq } = props;
if (freq == 0) return [];
var freq2 = log2(freq);
var fspan = <span title="Frequency">{freq}</span>;
var fspann = freq == 1 ? <i>n</i> : <>({fspan} * <i>n</i>)</>;
var rv = [];
rv.push(
<div>
Sample<sub>n</sub> = RAM[ ({fspan} * <i>n</i>) &gt;&gt; {shift} ]
Sample<sub>n</sub> = RAM[ {fspann} &gt;&gt; {shift} ]
</div>
);
rv.push(
<div>
Sample<sub>n</sub> = RAM[ ({fspan} * <i>n</i>) / {1 << shift} ]
Sample<sub>n</sub> = RAM[ {fspann} / {1 << shift} ]
</div>
);
@ -92,7 +95,8 @@ function NoteDisplay(props) {
var best_res = 0;
var best_freq = 0;
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;
best_res = res;
best_freq = tmp;
@ -102,6 +106,7 @@ function NoteDisplay(props) {
return (
<>
<RateDisplay wave={0} osc={osc} freq={best_freq} res={best_res} />
<div>Wave Size: 256</div>
<div>Resolution: {best_res}</div>
<div>Frequency: {best_freq}</div>
@ -110,6 +115,20 @@ function NoteDisplay(props) {
);
}
function RateDisplay(props) {
const { osc, wave, freq, res} = props;
const sr = calc_sr(osc);
const shift = (1 << calc_shift(res, wave));
const size = 256 << wave;
const rate = sr / (size * shift / freq);
return <div>Rate: {rate.toFixed(2)} Hz</div>;
}
function ResampleDisplay(props) {
var { osc, size, freq } = props;
@ -165,8 +184,10 @@ function HyperDisplay(props) {
function TimerDisplay(props) {
var {osc, time } = props;
var {osc, duration } = props;
const [time, units] = DurationSplit(duration);
const sr = calc_sr(osc);
const cycles = time * sr;
@ -182,6 +203,7 @@ function TimerDisplay(props) {
var best_res = 0;
var best_freq = 0;
var actual = 0;
best = []
for (var res = 0; res < 8; ++res) {
@ -189,7 +211,7 @@ function TimerDisplay(props) {
var f = Math.round(shift * 256 / cycles);
if (f >= 0x10000) continue; // break;
var actual = Math.ceil(256 * shift / f);
actual = Math.ceil(256 * shift / f);
best_res = res;
best_freq = f;
@ -198,8 +220,15 @@ function TimerDisplay(props) {
[best_res, best_freq] = simplify(best_res, best_freq);
var best_shift = calc_shift(best_res, size);
switch(units) {
case "s": break;
case "ms": actual *= 1000; break;
case "ticks": actual *= 60; break;
}
return (
<>
<div>Time: { actual ? (actual / sr).toFixed(2) + " " + units : "N/A" }</div>
<div>Resolution: {best_res ? best_res : "N/A"}</div>
<div>Frequency: {best_freq ? best_freq : "N/A"}</div>
<SampleDisplay freq={best_freq} shift={best_shift} />
@ -338,6 +367,8 @@ export class Application extends preact.Component {
<label>Frequency</label> <Frequency value={freq} onChange={this._freqChange} />
</div>
<RateDisplay wave={wave} osc={osc} freq={freq} shift={shift} res={res} />
<SampleDisplay freq={freq} shift={shift} />
</>
);
@ -417,7 +448,7 @@ export class Application extends preact.Component {
<label>Duration</label> <DurationInput value={duration} onChange={this._durationChange} />
</div>
<TimerDisplay osc={osc} time={DurationToSeconds(duration)} />
<TimerDisplay osc={osc} duration={duration} />
</>
);
}

View File

@ -13,6 +13,18 @@ function split_value(x) {
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) {
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 {
constructor(props) {