From 46d565277b3782dcc74a4706e05f018cea3a1753 Mon Sep 17 00:00:00 2001 From: Marc Sabat Date: Mon, 15 Apr 2024 19:29:15 +0200 Subject: [PATCH 1/4] multichannel-to-equave implemented --- package-lock.json | 199 ++++++++++++++++++++-------------------- package.json | 2 +- src/App.vue | 17 +++- src/stores/midi.ts | 11 ++- src/views/AboutView.vue | 1 + src/views/MidiView.vue | 30 +++++- 6 files changed, 152 insertions(+), 108 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc0ed4bf..f03870ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "vue-router": "^4.3.0", "webmidi": "^3.1.8", "xen-dev-utils": "^0.2.9", - "xen-midi": "^0.1.3" + "xen-midi": "^0.2.0" }, "devDependencies": { "@rushstack/eslint-patch": "^1.8.0", @@ -61,9 +61,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -72,9 +72,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -649,9 +649,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -802,9 +802,9 @@ } }, "node_modules/@rushstack/eslint-patch": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.8.0.tgz", - "integrity": "sha512-0HejFckBN2W+ucM6cUOlwsByTKt9/+0tWhqUffNIcHqCXkthY/mZ7AuYPK/2IIaGWhdl0h+tICDO0ssLMd6XMQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==", "dev": true }, "node_modules/@sideway/address": { @@ -844,15 +844,15 @@ } }, "node_modules/@tsconfig/node18": { - "version": "18.2.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.3.tgz", - "integrity": "sha512-5GKTU9bfn4L37G9IdK8wcHfvyMijzw1uKNCd2Rs75V7fZK/l2OjGJ8Aa2myqNnESjekm/udpCnFH9qR9yPCtmw==", + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", + "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", - "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==", + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", + "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==", "dev": true }, "node_modules/@types/chai-subset": { @@ -882,9 +882,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.19.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz", - "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==", + "version": "18.19.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", + "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1712,12 +1712,12 @@ "dev": true }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -2004,9 +2004,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.4.tgz", + "integrity": "sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -2177,9 +2177,9 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cypress": { - "version": "13.7.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.1.tgz", - "integrity": "sha512-4u/rpFNxOFCoFX/Z5h+uwlkBO4mWzAjveURi3vqdSu56HPvVdyGTxGw4XKGWt399Y1JwIn9E1L9uMXQpc0o55w==", + "version": "13.7.3", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.3.tgz", + "integrity": "sha512-uoecY6FTCAuIEqLUYkTrxamDBjMHTYak/1O7jtgwboHiTnS1NaMOoR08KcTrbRZFCBvYOiS4tEkQRmsV+xcrag==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -2692,9 +2692,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.24.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz", - "integrity": "sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==", + "version": "9.25.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz", + "integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -2710,7 +2710,7 @@ "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-scope": { @@ -3073,9 +3073,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -3265,16 +3265,16 @@ } }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -3414,9 +3414,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -3782,9 +3782,9 @@ } }, "node_modules/joi": { - "version": "17.12.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", - "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", + "version": "17.12.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz", + "integrity": "sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==", "dev": true, "dependencies": { "@hapi/hoek": "^9.3.0", @@ -3982,9 +3982,9 @@ } }, "node_modules/jzz": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/jzz/-/jzz-1.8.0.tgz", - "integrity": "sha512-mkEdizFQB3gIk9NzwIsbsKdXtu+t2uL9dCldU0AKct8YK9t5XT68V5IgZ0opfk16FkFXB0QA0Q+IEJEn7M0MQg==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/jzz/-/jzz-1.8.2.tgz", + "integrity": "sha512-LOnNrDMdwZ41mUERNrNDbziQJXqxNxqPXb2DBax40WIaq/AIkfIajZYHPZZsuNR9wGHdHpZLi+aYEai9GXhkOQ==", "optional": true, "dependencies": { "@types/webmidi": "^2.0.10", @@ -4203,9 +4203,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", - "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "version": "0.30.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", + "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -4220,11 +4220,11 @@ "dev": true }, "node_modules/mathjs": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.0.tgz", - "integrity": "sha512-4Moy0RNjwMSajEkGGxNUyMMC/CZAcl87WBopvNsJWB4E4EFebpTedr+0/rhqmnOSTH3Wu/3WfiWiw6mqiaHxVw==", + "version": "12.4.1", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-12.4.1.tgz", + "integrity": "sha512-welnW3khgwYjPYvECFHO+xkCxAx9IKIIPDDWPi8B5rKAvmgoEHnQX9slEmHKZTNaJiE+OS4qrJJcB4sfDn/4sw==", "dependencies": { - "@babel/runtime": "^7.23.9", + "@babel/runtime": "^7.24.0", "complex.js": "^2.1.1", "decimal.js": "^10.4.3", "escape-latex": "^1.2.0", @@ -4654,12 +4654,12 @@ } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -4814,9 +4814,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -4834,16 +4834,16 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -4994,9 +4994,9 @@ } }, "node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", "dependencies": { "side-channel": "^1.0.6" }, @@ -5311,16 +5311,16 @@ } }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5416,7 +5416,6 @@ "node_modules/sonic-weave": { "version": "0.0.12", "resolved": "git+ssh://git@github.com/xenharmonic-devs/sonic-weave.git#771e2e17fd1336a867d90db08b9b2625c448b251", - "license": "MIT", "dependencies": { "moment-of-symmetry": "^0.4.2", "xen-dev-utils": "^0.2.9" @@ -5433,9 +5432,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -5756,9 +5755,9 @@ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "node_modules/tinybench": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", - "integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.7.0.tgz", + "integrity": "sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==", "dev": true }, "node_modules/tinypool": { @@ -5837,9 +5836,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", - "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { "node": ">=16" @@ -5957,9 +5956,9 @@ } }, "node_modules/ufo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", - "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, "node_modules/undici-types": { @@ -6215,9 +6214,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.7.tgz", - "integrity": "sha512-7e12Evdll7JcTIocojgnCgwocX4WzIYStGClBQ+QuWPinZo/vQolv2EMq4a3lg16TKfwWafLimG77bxb56UauA==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.13.tgz", + "integrity": "sha512-xNO5B7DstNWETnoYflLkVgh8dK8h2ZDgxY1M2O0zrqGeBNq5yAZ8a10yCS9+HnixouNGYNX+ggU9MQQq86HTpg==", "dev": true }, "node_modules/vue-eslint-parser": { @@ -6541,9 +6540,9 @@ } }, "node_modules/xen-midi": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xen-midi/-/xen-midi-0.1.3.tgz", - "integrity": "sha512-M1e5HKn9ntKLUFAG9uenzVPA5RpenZB/EzjLvY8a1TjAgvj3TCOmOYG0FAax9f9gwaQLQEbUL8+V2+X5+4fCvA==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/xen-midi/-/xen-midi-0.2.0.tgz", + "integrity": "sha512-MqGiCuF2kJMmDkThd/HX5s3UmcNg9FXREJnBK32QOn6+qTmpoahct3qOgFCPETGgI49qgSG37lnzF2Y5rA9yFQ==", "dependencies": { "webmidi": "^3.1.8", "xen-dev-utils": "^0.2.8" diff --git a/package.json b/package.json index 7229d52b..312fd1d4 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "vue-router": "^4.3.0", "webmidi": "^3.1.8", "xen-dev-utils": "^0.2.9", - "xen-midi": "^0.1.3" + "xen-midi": "^0.2.0" }, "devDependencies": { "@rushstack/eslint-patch": "^1.8.0", diff --git a/src/App.vue b/src/App.vue index d6be3113..5530fbab 100644 --- a/src/App.vue +++ b/src/App.vue @@ -13,7 +13,7 @@ import { useAudioStore } from '@/stores/audio' import { useStateStore } from './stores/state' import { useMidiStore } from './stores/midi' import { useScaleStore } from './stores/scale' -import { clamp } from 'xen-dev-utils' +import { clamp, mmod } from 'xen-dev-utils' import { parseScaleWorkshop2Line, setNumberOfComponents } from 'sonic-weave' // === Pinia-managed state === @@ -71,15 +71,26 @@ function sendNoteOn(frequency: number, rawAttack: number) { return off } -function midiNoteOn(index: number, rawAttack?: number) { +function midiNoteOn(index: number, rawAttack?: number, channel?: number) { + + // in multichannel-to-equave mode calculate an offset based on the incoming channel + if (midi.multichannelToEquave && channel !== undefined) { + let offset = mmod(channel - midi.multichannelCenter + midi.multichannelEquavesDown, midi.multichannelNumEquaves) - midi.multichannelEquavesDown + offset = offset * scale.scale.size + index = index + offset + } + if (rawAttack === undefined) { rawAttack = 80 } - let frequency = scale.frequencies[index] + if (!midi.velocityOn) { rawAttack = 80 } + // since index can go out of range in multichannel-to-equave mode, use getFrequency() + let frequency = scale.getFrequency(index) + // Store state to ensure consistent note off. const info = midiKeyInfo(index) const whiteMode = midi.whiteMode diff --git a/src/stores/midi.ts b/src/stores/midi.ts index 10dae0e4..1eadb984 100644 --- a/src/stores/midi.ts +++ b/src/stores/midi.ts @@ -8,6 +8,11 @@ export const useMidiStore = defineStore('midi', () => { // Channel 10 is reserved for percussion const outputChannels = ref(new Set([1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16])) const velocityOn = ref(true) + // Lumatone multichannel-to-equave mode + const multichannelToEquave = ref(false) + const multichannelCenter = ref(3) + const multichannelNumEquaves = ref(8) + const multichannelEquavesDown = ref(4) const whiteMode = ref<'off' | 'simple' | 'blackAverage' | 'keyColors'>('off') @@ -15,7 +20,11 @@ export const useMidiStore = defineStore('midi', () => { // State input, output, - outputChannels, + outputChannels, + multichannelToEquave, + multichannelCenter, + multichannelNumEquaves, + multichannelEquavesDown, velocityOn, whiteMode } diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue index 9d1fcb82..8280a798 100644 --- a/src/views/AboutView.vue +++ b/src/views/AboutView.vue @@ -52,6 +52,7 @@ const tagline = computed(() => TAGLINES[Math.floor(Math.random() * TAGLINES.leng Forrest Cahoon - developer
Videco - developer
Inthar - developer
+ Marc Sabat - composer / developer
Kraig Grady - lattice advisor
Abnormality - quality assurance
Kite Giedraitis - notation advisor
diff --git a/src/views/MidiView.vue b/src/views/MidiView.vue index 9e15dabe..20548bde 100644 --- a/src/views/MidiView.vue +++ b/src/views/MidiView.vue @@ -178,9 +178,24 @@ onUnmounted(() => { /> -
- - +
+ + + + + + + + +
+ +
+ Center channel + + Total equaves + + Equaves down +
@@ -288,6 +303,15 @@ div.channels-wrapper span { text-align: center; } +div.checkbox-group-scoped { + flex-flow: unset; + gap: 0.15rem 1rem; +} + +div.multichannel-input-scoped { + gap: 0.15rem 1rem; +} + .active { background-color: greenyellow; } From 655f24ba29f2ae2376694e3c57891e00bad3f4d9 Mon Sep 17 00:00:00 2001 From: Marc Sabat Date: Mon, 15 Apr 2024 20:18:07 +0200 Subject: [PATCH 2/4] fixes suggested by frostburn --- src/App.vue | 7 +++++-- src/stores/midi.ts | 2 +- src/views/AboutView.vue | 2 +- src/views/MidiView.vue | 44 ++++++++++++++++++++++++++++++++++------- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/App.vue b/src/App.vue index 5530fbab..1d49371a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -72,10 +72,13 @@ function sendNoteOn(frequency: number, rawAttack: number) { } function midiNoteOn(index: number, rawAttack?: number, channel?: number) { - // in multichannel-to-equave mode calculate an offset based on the incoming channel if (midi.multichannelToEquave && channel !== undefined) { - let offset = mmod(channel - midi.multichannelCenter + midi.multichannelEquavesDown, midi.multichannelNumEquaves) - midi.multichannelEquavesDown + let offset = + mmod( + channel - midi.multichannelCenter + midi.multichannelEquavesDown, + midi.multichannelNumEquaves + ) - midi.multichannelEquavesDown offset = offset * scale.scale.size index = index + offset } diff --git a/src/stores/midi.ts b/src/stores/midi.ts index 1eadb984..f622cdca 100644 --- a/src/stores/midi.ts +++ b/src/stores/midi.ts @@ -20,7 +20,7 @@ export const useMidiStore = defineStore('midi', () => { // State input, output, - outputChannels, + outputChannels, multichannelToEquave, multichannelCenter, multichannelNumEquaves, diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue index 8280a798..c0cebea5 100644 --- a/src/views/AboutView.vue +++ b/src/views/AboutView.vue @@ -52,7 +52,7 @@ const tagline = computed(() => TAGLINES[Math.floor(Math.random() * TAGLINES.leng Forrest Cahoon - developer
Videco - developer
Inthar - developer
- Marc Sabat - composer / developer
+ Marc Sabat - developer / notation-hardware advisor
Kraig Grady - lattice advisor
Abnormality - quality assurance
Kite Giedraitis - notation advisor
diff --git a/src/views/MidiView.vue b/src/views/MidiView.vue index 20548bde..731712df 100644 --- a/src/views/MidiView.vue +++ b/src/views/MidiView.vue @@ -178,7 +178,7 @@ onUnmounted(() => { />
-
+
@@ -189,12 +189,42 @@ onUnmounted(() => {
-
- Center channel +
+ + Center channel + - Total equaves + + Total equaves + - Equaves down + + Equaves down +
@@ -303,12 +333,12 @@ div.channels-wrapper span { text-align: center; } -div.checkbox-group-scoped { +div.checkbox-group { flex-flow: unset; gap: 0.15rem 1rem; } -div.multichannel-input-scoped { +div.multichannel-input { gap: 0.15rem 1rem; } From 85cd5ff72f7529498b25462e0a556c702cad6aa8 Mon Sep 17 00:00:00 2001 From: Marc Sabat Date: Mon, 15 Apr 2024 20:21:49 +0200 Subject: [PATCH 3/4] eliminated ' ' spacers in channels --- src/views/MidiView.vue | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/views/MidiView.vue b/src/views/MidiView.vue index 731712df..a283be22 100644 --- a/src/views/MidiView.vue +++ b/src/views/MidiView.vue @@ -167,9 +167,7 @@ onUnmounted(() => {
- + {
- + Date: Mon, 15 Apr 2024 20:59:57 +0200 Subject: [PATCH 4/4] minor changes in html and css --- src/views/MidiView.vue | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/views/MidiView.vue b/src/views/MidiView.vue index a283be22..2cb1a7ca 100644 --- a/src/views/MidiView.vue +++ b/src/views/MidiView.vue @@ -4,6 +4,7 @@ import { Input, Output, WebMidi, type NoteMessageEvent, type MessageEvent } from import MidiPiano from '@/components/MidiPiano.vue' import { useMidiStore } from '@/stores/midi' import { useScaleStore } from '@/stores/scale' +import { divNodes } from 'sonic-weave' const props = defineProps<{ midiInputChannels: Set @@ -177,18 +178,18 @@ onUnmounted(() => {
- +
- - +
+
- +
-
- +
+
Center channel { type="number" min="1" max="16" - value="3" v-model="midi.multichannelCenter" /> - - +
+
Total equaves { type="number" min="1" max="16" - value="8" v-model="midi.multichannelNumEquaves" /> - - +
+
Equaves down { type="number" min="0" max="15" - value="4" v-model="midi.multichannelEquavesDown" /> - +
@@ -336,7 +334,7 @@ div.checkbox-group { gap: 0.15rem 1rem; } -div.multichannel-input { +div.multichannel-input-container { gap: 0.15rem 1rem; }