mirror of
https://github.com/ksherlock/ensoniq-buddy.git
synced 2025-02-07 08:30:24 +00:00
add Wave section with sine/square/triangle/sawtooth generator
This commit is contained in:
parent
f0ee46793d
commit
0cda8a7783
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
all: js/application.js js/preact.min.js | js
|
all: js/application.js js/preact.min.js | js
|
||||||
|
|
||||||
js/application.js : src/main.jsx src/application.jsx src/note_input.jsx src/sine_wave_data.jsx
|
js/application.js : src/main.jsx src/application.jsx src/note_input.jsx src/wave_data.jsx
|
||||||
esbuild --bundle --jsx-factory=preact.h --jsx-fragment=preact.Fragment --format=esm \
|
esbuild --bundle --jsx-factory=preact.h --jsx-fragment=preact.Fragment --format=esm \
|
||||||
src/main.jsx --outfile=js/application.js
|
src/main.jsx --outfile=js/application.js
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
import { NoteInput, NoteFrequency } from './note_input';
|
import { NoteInput, NoteFrequency } from './note_input';
|
||||||
import { RadioGroup } from './radio_group';
|
import { RadioGroup } from './radio_group';
|
||||||
import { SineWaveData } from './sine_wave_data';
|
import { WaveData } from './wave_data';
|
||||||
|
|
||||||
function calc_sr(osc) {
|
function calc_sr(osc) {
|
||||||
// iigs is ~7.14Mhz / 8. Mirage is 8Mhz / 8
|
// iigs is ~7.14Mhz / 8. Mirage is 8Mhz / 8
|
||||||
@ -67,6 +67,26 @@ function Frequency(props) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function Assembler(props) {
|
||||||
|
|
||||||
|
var options = ["Merlin", "ORCA/M"].map( (o, ix) => {
|
||||||
|
return <option key={ix} value={ix}>{o}</option>;
|
||||||
|
});
|
||||||
|
|
||||||
|
return <select {...props}>{options}</select>;
|
||||||
|
}
|
||||||
|
|
||||||
|
function WaveShape(props) {
|
||||||
|
|
||||||
|
var options = ["Sine", "Square", "Triangle", "Sawtooth"].map( (o, ix) => {
|
||||||
|
return <option key={ix} value={ix}>{o}</option>;
|
||||||
|
});
|
||||||
|
|
||||||
|
return <select {...props}>{options}</select>;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function nmultiply(x) {
|
function nmultiply(x) {
|
||||||
if (x == 0) return 0;
|
if (x == 0) return 0;
|
||||||
if (x == 1) return <i>n</i>;
|
if (x == 1) return <i>n</i>;
|
||||||
@ -148,7 +168,6 @@ function NoteDisplay(props) {
|
|||||||
<div>Wave Size: 256</div>
|
<div>Wave Size: 256</div>
|
||||||
<div>Resolution: {best_res}</div>
|
<div>Resolution: {best_res}</div>
|
||||||
<div>Frequency: {Math.round(best_freq)}</div>
|
<div>Frequency: {Math.round(best_freq)}</div>
|
||||||
<SineWaveData />
|
|
||||||
</>
|
</>
|
||||||
|
|
||||||
);
|
);
|
||||||
@ -172,8 +191,10 @@ export class Application extends preact.Component {
|
|||||||
this._freqChange = this.freqChange.bind(this);
|
this._freqChange = this.freqChange.bind(this);
|
||||||
this._noteChange = this.noteChange.bind(this);
|
this._noteChange = this.noteChange.bind(this);
|
||||||
this._tabChange = this.tabChange.bind(this);
|
this._tabChange = this.tabChange.bind(this);
|
||||||
|
this._asmChange = this.asmChange.bind(this);
|
||||||
|
this._shapeChange = this.shapeChange.bind(this);
|
||||||
|
|
||||||
this.state = { osc: 32, wave: 0, res: 0, freq: 512, tab: 0, note: 4*12 };
|
this.state = { osc: 32, wave: 0, res: 0, freq: 512, tab: 0, note: 4*12, assembler: 0, shape: 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
oscChange(e) {
|
oscChange(e) {
|
||||||
@ -212,6 +233,18 @@ export class Application extends preact.Component {
|
|||||||
this.setState({ note: v });
|
this.setState({ note: v });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asmChange(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var v = +e.target.value;
|
||||||
|
this.setState({ assembler: v});
|
||||||
|
}
|
||||||
|
|
||||||
|
shapeChange(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var v = +e.target.value;
|
||||||
|
this.setState({ shape: v});
|
||||||
|
}
|
||||||
|
|
||||||
sampleChildren() {
|
sampleChildren() {
|
||||||
|
|
||||||
var { osc, wave, res, freq } = this.state;
|
var { osc, wave, res, freq } = this.state;
|
||||||
@ -257,6 +290,24 @@ export class Application extends preact.Component {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
waveChildren() {
|
||||||
|
|
||||||
|
var { assembler, shape } = this.state;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div>
|
||||||
|
<label>Assembler</label> <Assembler value={assembler} onChange={this._asmChange} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label>Wave Type</label> <WaveShape value={shape} onChange={this._shapeChange} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<WaveData assembler={assembler} shape={shape} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
|
||||||
@ -268,9 +319,10 @@ export class Application extends preact.Component {
|
|||||||
switch(tab){
|
switch(tab){
|
||||||
case 0: children = this.sampleChildren(); break;
|
case 0: children = this.sampleChildren(); break;
|
||||||
case 1: children = this.noteChildren(); break;
|
case 1: children = this.noteChildren(); break;
|
||||||
|
case 2: children = this.waveChildren(); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
var options = ["Sample", "Note"].map( (o, ix) => {
|
var options = ["Sample", "Note", "Wave"].map( (o, ix) => {
|
||||||
return <option key={ix} value={ix}>{o}</option>;
|
return <option key={ix} value={ix}>{o}</option>;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
export function SineWaveData() {
|
|
||||||
|
|
||||||
var data = [];
|
|
||||||
for (var n = 0; n < 256; ++n) {
|
|
||||||
var x = 128 + Math.round(127 * Math.sin(n * Math.PI / 128));
|
|
||||||
data.push( x || 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
var hex = data.map( (x) => x < 0x10 ? "0" + x.toString(16) : x.toString(16) );
|
|
||||||
|
|
||||||
var code = [];
|
|
||||||
for (var n = 0; n < 16; ++n) {
|
|
||||||
var line = "\t hex " + hex.slice(n * 16, n * 16 + 16).join("") + "\n"
|
|
||||||
code.push(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<code>
|
|
||||||
<pre>
|
|
||||||
{code}
|
|
||||||
</pre>
|
|
||||||
</code>
|
|
||||||
);
|
|
||||||
}
|
|
82
src/wave_data.jsx
Normal file
82
src/wave_data.jsx
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function sine() {
|
||||||
|
|
||||||
|
var rv = [];
|
||||||
|
for (var n = 0; n < 256; ++n) {
|
||||||
|
var x = 128 + Math.round(127 * Math.sin(n * Math.PI / 128));
|
||||||
|
rv.push( x || 1 );
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function square() {
|
||||||
|
|
||||||
|
var rv = [];
|
||||||
|
for (var n = 0; n < 128; ++n) rv.push(255);
|
||||||
|
for (var n = 0; n < 128; ++n) rv.push(1);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
function triangle() {
|
||||||
|
// 0x80 -> 0xff [25%] -> 0x80 [50%] -> 0x01 [75%] -> 0x80 [100%]
|
||||||
|
var rv = [];
|
||||||
|
for (var n = 0; n < 64; ++n) rv.push(0x80 + n * 2);
|
||||||
|
for (var n = 0; n < 128; ++n) rv.push(0xff - n * 2);
|
||||||
|
for (var n = 0; n < 64; ++n) rv.push(0x01 + n * 2);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function sawtooth() {
|
||||||
|
|
||||||
|
var rv = [];
|
||||||
|
for (var n = 0; n < 128; ++n) rv.push(0x80 + n);
|
||||||
|
for (var n = 0; n < 128; ++n) rv.push(0x01 + n);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function WaveData(props) {
|
||||||
|
|
||||||
|
|
||||||
|
var {assembler, shape} = props;
|
||||||
|
|
||||||
|
var data;
|
||||||
|
switch(shape) {
|
||||||
|
case 0: data = sine(); break;
|
||||||
|
case 1: data = square(); break;
|
||||||
|
case 2: data = triangle(); break;
|
||||||
|
case 3: data = sawtooth(); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hex = data.map( (x) => x < 0x10 ? "0" + x.toString(16) : x.toString(16) );
|
||||||
|
|
||||||
|
var code = [];
|
||||||
|
if (assembler == 0) {
|
||||||
|
// merlin
|
||||||
|
for (var n = 0; n < 16; ++n) {
|
||||||
|
var line = " hex " + hex.slice(n * 16, n * 16 + 16).join("") + "\n"
|
||||||
|
code.push(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assembler == 1) {
|
||||||
|
// orca/m
|
||||||
|
for (var n = 0; n < 16; ++n) {
|
||||||
|
var line = " dc h'" + hex.slice(n * 16, n * 16 + 16).join("") + "'\n"
|
||||||
|
code.push(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<code>
|
||||||
|
<pre>
|
||||||
|
{code}
|
||||||
|
</pre>
|
||||||
|
</code>
|
||||||
|
);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user