code format

This commit is contained in:
Felix Roos 2022-12-13 21:32:03 +01:00
parent 67ad82d52e
commit bf1ba6efc0
17 changed files with 75 additions and 78 deletions

View file

@ -5,3 +5,4 @@
**/out **/out
**/dist **/dist
packages/mini/krill-parser.js packages/mini/krill-parser.js
packages/xen/tunejs.js

View file

@ -1,16 +1,15 @@
{ {
"printWidth": 120, "printWidth": 120,
"useTabs": false, "useTabs": false,
"tabWidth": 2, "tabWidth": 2,
"semi": true, "semi": true,
"singleQuote": true, "singleQuote": true,
"jsxSingleQuote": false, "jsxSingleQuote": false,
"trailingComma": "all", "trailingComma": "all",
"bracketSpacing": true, "bracketSpacing": true,
"jsxBracketSameLine": false, "jsxBracketSameLine": false,
"arrowParens": "always", "arrowParens": "always",
"proseWrap": "preserve", "proseWrap": "preserve",
"htmlWhitespaceSensitivity": "css", "htmlWhitespaceSensitivity": "css",
"endOfLine": "lf" "endOfLine": "lf"
} }

View file

@ -16,7 +16,7 @@ evalScope(
import('@strudel.cycles/tonal'), import('@strudel.cycles/tonal'),
); );
setStringParser(mini) setStringParser(mini);
const { evaluate } = repl({ const { evaluate } = repl({
defaultOutput: webaudioOutput, defaultOutput: webaudioOutput,

View file

@ -80,16 +80,16 @@ export class Hap {
} }
show(compact = false) { show(compact = false) {
const value = typeof this.value === 'object' const value =
? compact typeof this.value === 'object'
? compact
? JSON.stringify(this.value).slice(1, -1).replaceAll('"', '').replaceAll(',', ' ') ? JSON.stringify(this.value).slice(1, -1).replaceAll('"', '').replaceAll(',', ' ')
: JSON.stringify(this.value) : JSON.stringify(this.value)
: this.value : this.value;
var spans = ''; var spans = '';
if (this.whole == undefined) { if (this.whole == undefined) {
spans = '~' + this.part.show; spans = '~' + this.part.show;
} } else {
else {
var is_whole = this.whole.begin.equals(this.part.begin) && this.whole.end.equals(this.part.end); var is_whole = this.whole.begin.equals(this.part.begin) && this.whole.end.equals(this.part.end);
if (!this.whole.begin.equals(this.part.begin)) { if (!this.whole.begin.equals(this.part.begin)) {
spans = this.whole.begin.show() + ' ⇜ '; spans = this.whole.begin.show() + ' ⇜ ';
@ -102,12 +102,10 @@ export class Hap {
spans += ')'; spans += ')';
} }
if (!this.whole.end.equals(this.part.end)) { if (!this.whole.end.equals(this.part.end)) {
spans += ' ⇝ ' + this.whole.end.show() spans += ' ⇝ ' + this.whole.end.show();
} }
} }
return ( return '[ ' + spans + ' | ' + value + ' ]';
'[ ' + spans + ' | ' + value + ' ]'
);
} }
showWhole(compact = false) { showWhole(compact = false) {

View file

@ -541,35 +541,34 @@ export class Pattern {
defragmentHaps() { defragmentHaps() {
// remove continuous haps // remove continuous haps
const pat = this.discreteOnly(); const pat = this.discreteOnly();
return pat.withHaps((haps) => { return pat.withHaps((haps) => {
const result = []; const result = [];
for (var i=0; i < haps.length; ++i) { for (var i = 0; i < haps.length; ++i) {
var searching = true; var searching = true;
var a = haps[i]; var a = haps[i];
while (searching) { while (searching) {
const a_value = JSON.stringify(haps[i].value); const a_value = JSON.stringify(haps[i].value);
var found = false; var found = false;
for(var j=i+1; j<haps.length; j++) { for (var j = i + 1; j < haps.length; j++) {
const b = haps[j]; const b = haps[j];
if (a.whole.equals(b.whole)) { if (a.whole.equals(b.whole)) {
if (a.part.begin.eq(b.part.end)) { if (a.part.begin.eq(b.part.end)) {
if (a_value === JSON.stringify(b.value)) { if (a_value === JSON.stringify(b.value)) {
// eat the matching hap into 'a' // eat the matching hap into 'a'
a = new Hap(a.whole, new TimeSpan(b.part.begin, a.part.end), a.value) a = new Hap(a.whole, new TimeSpan(b.part.begin, a.part.end), a.value);
haps.splice(j,1); haps.splice(j, 1);
// restart the search // restart the search
found = true; found = true;
break; break;
} }
} } else if (b.part.begin.eq(a.part.end)) {
else if (b.part.begin.eq(a.part.end)) {
if (a_value == JSON.stringify(b.value)) { if (a_value == JSON.stringify(b.value)) {
// eat the matching hap into 'a' // eat the matching hap into 'a'
a = new Hap(a.whole, new TimeSpan(a.part.begin, b.part.end), a.value) a = new Hap(a.whole, new TimeSpan(a.part.begin, b.part.end), a.value);
haps.splice(j,1); haps.splice(j, 1);
// restart the search // restart the search
found = true; found = true;
break; break;
@ -577,7 +576,7 @@ export class Pattern {
} }
} }
} }
searching = found; searching = found;
} }
result.push(a); result.push(a);

View file

@ -917,20 +917,18 @@ describe('Pattern', () => {
}); });
describe('defragmentHaps', () => { describe('defragmentHaps', () => {
it('Can merge two touching haps with same whole and value', () => { it('Can merge two touching haps with same whole and value', () => {
expect(stack(pure('a').mask(1,0), pure('a').mask(0,1)).defragmentHaps().firstCycle().length) expect(stack(pure('a').mask(1, 0), pure('a').mask(0, 1)).defragmentHaps().firstCycle().length).toStrictEqual(1);
.toStrictEqual(1);
}); });
it('Doesnt merge two overlapping haps', () => { it('Doesnt merge two overlapping haps', () => {
expect(stack(pure('a').mask(1,1,0), pure('a').mask(0,1)).defragmentHaps().firstCycle().length) expect(stack(pure('a').mask(1, 1, 0), pure('a').mask(0, 1)).defragmentHaps().firstCycle().length).toStrictEqual(
.toStrictEqual(2); 2,
);
}); });
it('Doesnt merge two touching haps with different values', () => { it('Doesnt merge two touching haps with different values', () => {
expect(stack(pure('a').mask(1,0), pure('b').mask(0,1)).defragmentHaps().firstCycle().length) expect(stack(pure('a').mask(1, 0), pure('b').mask(0, 1)).defragmentHaps().firstCycle().length).toStrictEqual(2);
.toStrictEqual(2);
}); });
it('Doesnt merge two touching haps with different wholes', () => { it('Doesnt merge two touching haps with different wholes', () => {
expect(stack(sequence('a', silence), pure('a').mask(0,1)).defragmentHaps().firstCycle().length) expect(stack(sequence('a', silence), pure('a').mask(0, 1)).defragmentHaps().firstCycle().length).toStrictEqual(2);
.toStrictEqual(2);
}); });
}); });
}); });

View file

@ -20,9 +20,9 @@ export class TimeSpan {
// Support zero-width timespans // Support zero-width timespans
if (begin.equals(end)) { if (begin.equals(end)) {
return([new TimeSpan(begin, end)]); return [new TimeSpan(begin, end)];
} }
while (end.gt(begin)) { while (end.gt(begin)) {
// If begin and end are in the same cycle, we're done. // If begin and end are in the same cycle, we're done.
if (begin.sam().equals(end_sam)) { if (begin.sam().equals(end_sam)) {

View file

@ -25,8 +25,6 @@ const config = {
}, },
}; };
const osc = new OSC({ plugin: new OSC.BridgePlugin(config) }); const osc = new OSC({ plugin: new OSC.BridgePlugin(config) });
osc.open(); // start a WebSocket server on port 8080 osc.open(); // start a WebSocket server on port 8080

View file

@ -1,7 +1,7 @@
import { defineConfig } from 'vite' import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react' import react from '@vitejs/plugin-react';
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [react()] plugins: [react()],
}) });

View file

@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<!-- <link rel="icon" type="image/svg+xml" href="/src/favicon.svg" /> --> <!-- <link rel="icon" type="image/svg+xml" href="/src/favicon.svg" /> -->
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Strudel React Components</title> <title>Strudel React Components</title>
</head> </head>

View file

@ -9,4 +9,4 @@ module.exports = {
tailwindcss: {}, tailwindcss: {},
autoprefixer: {}, autoprefixer: {},
}, },
} };

View file

@ -1,5 +1,10 @@
import React from 'react' import React from 'react';
import ReactDOM from 'react-dom' import ReactDOM from 'react-dom';
import App from './App' import App from './App';
ReactDOM.render(<React.StrictMode><App /></React.StrictMode>,document.getElementById('root')) ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root'),
);

View file

@ -23,17 +23,16 @@ export async function getWriter(br = 38400) {
const encoder = new TextEncoder(); const encoder = new TextEncoder();
const writer = port.writable.getWriter(); const writer = port.writable.getWriter();
writeMessage = function (message, chk) { writeMessage = function (message, chk) {
const encoded = encoder.encode(message) const encoded = encoder.encode(message);
if (!chk) { if (!chk) {
writer.write(encoded); writer.write(encoded);
} } else {
else {
const bytes = new Uint8Array(4); const bytes = new Uint8Array(4);
bytes[0] = 124; // | symbol bytes[0] = 124; // | symbol
bytes[1] = (chk >> 8) & 0xFF; bytes[1] = (chk >> 8) & 0xff;
bytes[2] = chk & 0xFF; bytes[2] = chk & 0xff;
bytes[3] = 59; // semicolon bytes[3] = 59; // semicolon
const withchk = new Uint8Array(encoded.length+4) const withchk = new Uint8Array(encoded.length + 4);
withchk.set(encoded); withchk.set(encoded);
withchk.set(bytes, encoded.length); withchk.set(bytes, encoded.length);
writer.write(withchk); writer.write(withchk);
@ -48,12 +47,12 @@ const latency = 0.1;
// crc16 (CCITT-FALSE) https://gist.github.com/tijnkooijmans/10981093 // crc16 (CCITT-FALSE) https://gist.github.com/tijnkooijmans/10981093
function crc16(data) { function crc16(data) {
const length = data.length const length = data.length;
if (length == 0) { if (length == 0) {
return 0; return 0;
} }
var crc = 0xFFFF; var crc = 0xffff;
for (var i = 0; i < length; ++i) { for (var i = 0; i < length; ++i) {
crc ^= data.charCodeAt(i) << 8; crc ^= data.charCodeAt(i) << 8;
for (var j = 0; j < 8; ++j) { for (var j = 0; j < 8; ++j) {
@ -64,7 +63,7 @@ function crc16(data) {
return crc & 0xffff; return crc & 0xffff;
} }
Pattern.prototype.serial = function (br=38400,sendcrc=false,singlecharids=false) { Pattern.prototype.serial = function (br = 38400, sendcrc = false, singlecharids = false) {
return this.withHap((hap) => { return this.withHap((hap) => {
if (!writeMessage) { if (!writeMessage) {
getWriter(br); getWriter(br);
@ -96,7 +95,7 @@ Pattern.prototype.serial = function (br=38400,sendcrc=false,singlecharids=false)
} }
message += ')'; message += ')';
if (sendcrc) { if (sendcrc) {
chk = crc16(message) chk = crc16(message);
} }
} else { } else {
for (const [key, val] of Object.entries(hap.value)) { for (const [key, val] of Object.entries(hap.value)) {
@ -108,7 +107,9 @@ Pattern.prototype.serial = function (br=38400,sendcrc=false,singlecharids=false)
} }
const offset = (time - currentTime + latency) * 1000; const offset = (time - currentTime + latency) * 1000;
window.setTimeout(function () {writeMessage(message, chk)}, offset); window.setTimeout(function () {
writeMessage(message, chk);
}, offset);
}; };
return hap.setContext({ ...hap.context, onTrigger, dominantTrigger: true }); return hap.setContext({ ...hap.context, onTrigger, dominantTrigger: true });
}); });

View file

@ -42,7 +42,7 @@ export const instruments = [
'0031_FluidR3_GM_sf2_file', '0031_FluidR3_GM_sf2_file',
'0031_GeneralUserGS_sf2_file', '0031_GeneralUserGS_sf2_file',
'0031_SoundBlasterOld_sf2', // pianos until here '0031_SoundBlasterOld_sf2', // pianos until here
'0040_Aspirin_sf2_file', '0040_Aspirin_sf2_file',
'0040_Chaos_sf2_file', '0040_Chaos_sf2_file',
'0040_FluidR3_GM_sf2_file', // rhodes '0040_FluidR3_GM_sf2_file', // rhodes
'0040_GeneralUserGS_sf2_file', // staccato rhodes '0040_GeneralUserGS_sf2_file', // staccato rhodes
@ -59,7 +59,7 @@ export const instruments = [
'0046_GeneralUserGS_sf2_file', // ? '0046_GeneralUserGS_sf2_file', // ?
'0050_Aspirin_sf2_file', // glass organ '0050_Aspirin_sf2_file', // glass organ
'0050_Chaos_sf2_file', // short glass organ '0050_Chaos_sf2_file', // short glass organ
'0050_FluidR3_GM_sf2_file',// long glass organ ! '0050_FluidR3_GM_sf2_file', // long glass organ !
'0050_GeneralUserGS_sf2_file', // short glass organ '0050_GeneralUserGS_sf2_file', // short glass organ
'0050_JCLive_sf2_file', // glass organ '0050_JCLive_sf2_file', // glass organ
'0050_SBLive_sf2', // ? '0050_SBLive_sf2', // ?
@ -1635,7 +1635,7 @@ export const drums = [
'81_4_Chaos_sf2_file', '81_4_Chaos_sf2_file',
]; ];
// see https://www.midi.org/specifications-old/item/gm-level-1-sound-set // see https://www.midi.org/specifications-old/item/gm-level-1-sound-set
export const instrumentNames = []; export const instrumentNames = [];
instrumentNames[0] = 'Acoustic Grand Piano: Piano'; instrumentNames[0] = 'Acoustic Grand Piano: Piano';
instrumentNames[1] = 'Bright Acoustic Piano: Piano'; instrumentNames[1] = 'Bright Acoustic Piano: Piano';

View file

@ -9,4 +9,4 @@ module.exports = {
tailwindcss: {}, tailwindcss: {},
autoprefixer: {}, autoprefixer: {},
}, },
} };

View file

@ -1,13 +1,11 @@
body { body {
margin: 0; margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 'Droid Sans', 'Helvetica Neue', sans-serif;
sans-serif;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
code { code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
monospace;
} }

View file

@ -9,4 +9,4 @@ module.exports = {
tailwindcss: {}, tailwindcss: {},
autoprefixer: {}, autoprefixer: {},
}, },
} };