diff --git a/CHANGELOG.md b/CHANGELOG.md index 56598f5f..1cd4d22b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * Feature: New "repeat" modifier [#406](https://github.com/xenharmonic-devs/scale-workshop/issues/406) * Feature: Implement multi-channel MIDI mode compatible with the Lumatone [#649](https://github.com/xenharmonic-devs/scale-workshop/pull/649) * Feature: Show labels, ratios, cents and frequencies on the tuning table [#534](https://github.com/xenharmonic-devs/scale-workshop/issues/534) + * Feature: Full width view dedicated to the MOS pyramid [#700](https://github.com/xenharmonic-devs/scale-workshop/issues/700) * Bug fix: Extreme ratios now only break parts of the tuning table that do not have IEEE floating point representation and format better when non-finite [#631](https://github.com/xenharmonic-devs/scale-workshop/issues/631), [#632](https://github.com/xenharmonic-devs/scale-workshop/issues/632) * Style fix: Make checkbox and radio button labels more consistent [#644](https://github.com/xenharmonic-devs/scale-workshop/issues/644) * Beta cycle issues: [#643](https://github.com/xenharmonic-devs/scale-workshop/issues/643), [#640](https://github.com/xenharmonic-devs/scale-workshop/issues/640), [#577](https://github.com/xenharmonic-devs/scale-workshop/issues/577), [#513](https://github.com/xenharmonic-devs/scale-workshop/issues/513), [#658](https://github.com/xenharmonic-devs/scale-workshop/issues/658), [#664](https://github.com/xenharmonic-devs/scale-workshop/issues/664), [#666](https://github.com/xenharmonic-devs/scale-workshop/issues/666) diff --git a/package-lock.json b/package-lock.json index 69e943d8..9a9f6d55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,10 @@ "isomorphic-qwerty": "^0.0.2", "ji-lattice": "^0.0.3", "jszip": "^3.10.1", - "moment-of-symmetry": "^0.5.2", + "moment-of-symmetry": "^0.6.0", "pinia": "^2.1.7", "qs": "^6.12.0", - "sonic-weave": "^0.2.0", + "sonic-weave": "^0.3.1", "sw-synth": "^0.1.0", "temperaments": "^0.5.3", "values.js": "^2.1.1", @@ -4381,9 +4381,9 @@ } }, "node_modules/moment-of-symmetry": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/moment-of-symmetry/-/moment-of-symmetry-0.5.3.tgz", - "integrity": "sha512-+CTxeGrJioy71uyYzNn7Kk5F73fqbSVIAXE69O+6/0sdNWxwgcVw7eCnjX5AHW4tJelhvHVeJyaAgP2CCLnzrg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/moment-of-symmetry/-/moment-of-symmetry-0.6.0.tgz", + "integrity": "sha512-0dpJfCm4bcsEAhQazehWvQxm75UM1B2aZsKPNmeUgsLW/DvL9EOL2/qSVE472mGG+opFe9G7Ou02PN59sJPBPA==", "dependencies": { "xen-dev-utils": "^0.7.0" }, @@ -5455,11 +5455,11 @@ } }, "node_modules/sonic-weave": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sonic-weave/-/sonic-weave-0.2.0.tgz", - "integrity": "sha512-dc9Gd0V5hSR2Xc1nXopLjuqas39UcDEfqRDl6GmQQ3riHW/eaLCSlSfhh2Xo91L2sZHnL1n9oJEbnEbxNSmQBw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/sonic-weave/-/sonic-weave-0.3.1.tgz", + "integrity": "sha512-Eovb+KrRXsIJiMHEzM+Ft96NEf6CoyUWnN3XDfysgSCVyr8Rlzcfqv9Vquz9zINC3vXcs1ACC7rT4ecPhOeI/Q==", "dependencies": { - "moment-of-symmetry": "^0.5.3", + "moment-of-symmetry": "^0.6.0", "xen-dev-utils": "^0.7.0" }, "bin": { diff --git a/package.json b/package.json index 6c97fb3f..c5750449 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,10 @@ "isomorphic-qwerty": "^0.0.2", "ji-lattice": "^0.0.3", "jszip": "^3.10.1", - "moment-of-symmetry": "^0.5.2", + "moment-of-symmetry": "^0.6.0", "pinia": "^2.1.7", "qs": "^6.12.0", - "sonic-weave": "^0.2.0", + "sonic-weave": "^0.3.1", "sw-synth": "^0.1.0", "temperaments": "^0.5.3", "values.js": "^2.1.1", diff --git a/src/App.vue b/src/App.vue index 61a4a162..a0ac7174 100644 --- a/src/App.vue +++ b/src/App.vue @@ -474,6 +474,9 @@ function panic() { Sw
  • Build Scale
  • +
  • + MOS +
  • Analysis
  • Lattice
  • Virtual Keyboard
  • @@ -610,6 +613,7 @@ nav a:first-of-type { line-height: 1; padding-right: 1em; text-align: right; + color: var(--color-text-mute); } #app-footer a { color: var(--color-text-mute); diff --git a/src/components/MosPyramid.vue b/src/components/MosPyramid.vue new file mode 100644 index 00000000..0e65d984 --- /dev/null +++ b/src/components/MosPyramid.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/components/ScaleRule.vue b/src/components/ScaleRule.vue index bccfca2a..c9ebcca1 100644 --- a/src/components/ScaleRule.vue +++ b/src/components/ScaleRule.vue @@ -3,9 +3,13 @@ import type { Scale } from '@/scale' import { computed } from 'vue' import { mmod, valueToCents } from 'xen-dev-utils' -const props = defineProps<{ - scale: Scale -}>() +const props = withDefaults( + defineProps<{ + scale: Scale + orientation: 'horizontal' | 'vertical' + }>(), + { orientation: 'horizontal' } +) const ticksAndColors = computed(() => { const equaveCents = valueToCents(props.scale.equaveRatio) @@ -32,7 +36,7 @@ const ticksAndColors = computed(() => { diff --git a/src/components/modals/generation/MosScale.vue b/src/components/modals/generation/MosScale.vue index d6a4d190..22799120 100644 --- a/src/components/modals/generation/MosScale.vue +++ b/src/components/modals/generation/MosScale.vue @@ -311,6 +311,9 @@ function edoClick(info: MosScaleInfo) { >{{ modal.hardness }} {{ modal.previewName }} + @@ -327,6 +330,9 @@ function edoClick(info: MosScaleInfo) { .pyramid button { font-size: small; } +.right { + margin-left: auto; +} @media only screen and (max-width: 38rem) { .pyramid { text-align: left; diff --git a/src/router/index.ts b/src/router/index.ts index 677804c3..5b85c763 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -87,6 +87,11 @@ const router = createRouter({ name: 'qwerty', component: () => import('../views/VirtualQwerty.vue') }, + { + path: '/mos', + name: 'mos', + component: () => import('../views/MosView.vue') + }, // Root aliases mainly for compatibility with old SW1 URLs. { path: '/index.html', diff --git a/src/stores/state.ts b/src/stores/state.ts index 23463e62..93b1dad7 100644 --- a/src/stores/state.ts +++ b/src/stores/state.ts @@ -22,6 +22,7 @@ export const useStateStore = defineStore('state', () => { const centsFractionDigits = ref(parseInt(storage.getItem('centsFractionDigits') ?? '3', 10)) const decimalFractionDigits = ref(parseInt(storage.getItem('decimalFractionDigits') ?? '5', 10)) const showVirtualQwerty = ref(storage.getItem('showVirtualQwerty') === 'true') + const showMosTab = ref(storage.getItem('showMosTab') === 'true') const showKeyboardLabel = ref(storage.getItem('showKeyboardLabel') !== 'false') const showKeyboardCents = ref(storage.getItem('showKeyboardCents') !== 'false') const showKeyboardRatio = ref(storage.getItem('showKeyboardRatio') !== 'false') @@ -55,6 +56,7 @@ export const useStateStore = defineStore('state', () => { centsFractionDigits, decimalFractionDigits, showVirtualQwerty, + showMosTab, showKeyboardLabel, showKeyboardCents, showKeyboardRatio, @@ -92,6 +94,7 @@ export const useStateStore = defineStore('state', () => { centsFractionDigits, decimalFractionDigits, showVirtualQwerty, + showMosTab, showKeyboardLabel, showKeyboardCents, showKeyboardRatio, diff --git a/src/views/MosView.vue b/src/views/MosView.vue new file mode 100644 index 00000000..029e9aba --- /dev/null +++ b/src/views/MosView.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/src/views/PreferencesView.vue b/src/views/PreferencesView.vue index 958ce4a3..a3abbeaf 100644 --- a/src/views/PreferencesView.vue +++ b/src/views/PreferencesView.vue @@ -38,6 +38,10 @@ const scale = useScaleStore()

    Advanced

    +
    + + +