diff --git a/package-lock.json b/package-lock.json
index 6aead423..0a10c5b3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "scale-workshop",
- "version": "3.0.0-beta.13",
+ "version": "3.0.0-beta.14",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "scale-workshop",
- "version": "3.0.0-beta.13",
+ "version": "3.0.0-beta.14",
"dependencies": {
"isomorphic-qwerty": "^0.0.2",
"ji-lattice": "^0.0.3",
@@ -14,7 +14,7 @@
"moment-of-symmetry": "^0.4.2",
"pinia": "^2.1.7",
"qs": "^6.12.0",
- "sonic-weave": "github:xenharmonic-devs/sonic-weave#v0.0.17",
+ "sonic-weave": "github:xenharmonic-devs/sonic-weave#v0.0.20",
"sw-synth": "^0.1.0",
"temperaments": "^0.5.3",
"vue": "^3.3.4",
@@ -5400,8 +5400,8 @@
}
},
"node_modules/sonic-weave": {
- "version": "0.0.17",
- "resolved": "git+ssh://git@github.com/xenharmonic-devs/sonic-weave.git#0033a815351b713c76da1da7ca46550065d9b230",
+ "version": "0.0.20",
+ "resolved": "git+ssh://git@github.com/xenharmonic-devs/sonic-weave.git#7d5a97f82ce23a4316a0cf71ab831106f73a7eb5",
"license": "MIT",
"dependencies": {
"moment-of-symmetry": "^0.4.2",
diff --git a/package.json b/package.json
index 85e45ef3..fda1d654 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "scale-workshop",
- "version": "3.0.0-beta.13",
+ "version": "3.0.0-beta.14",
"scripts": {
"dev": "vite",
"build": "run-p type-check \"build-only {@}\" --",
@@ -21,7 +21,7 @@
"moment-of-symmetry": "^0.4.2",
"pinia": "^2.1.7",
"qs": "^6.12.0",
- "sonic-weave": "github:xenharmonic-devs/sonic-weave#v0.0.17",
+ "sonic-weave": "github:xenharmonic-devs/sonic-weave#v0.0.20",
"sw-synth": "^0.1.0",
"temperaments": "^0.5.3",
"vue": "^3.3.4",
diff --git a/src/components/modals/modification/CoalesceDuplicates.vue b/src/components/modals/modification/CoalesceDuplicates.vue
index ede92711..855efaf9 100644
--- a/src/components/modals/modification/CoalesceDuplicates.vue
+++ b/src/components/modals/modification/CoalesceDuplicates.vue
@@ -10,7 +10,7 @@ const modal = useModalStore()
const scale = useScaleStore()
function modify(expand = true) {
- scale.sourceText += `\ncoalesce(${centString(modal.tolerance)}, '${modal.coalescingAction}')`
+ scale.sourceText += `\ncoalesce(${centString(modal.tolerance)}, '${modal.coalescingAction}', ${modal.preserveBoundary})`
if (expand) {
const { visitor, defaults } = scale.getVisitors()
scale.sourceText = visitor.expand(defaults)
@@ -93,6 +93,10 @@ function modify(expand = true) {
+
+
+
+
diff --git a/src/stores/modal.ts b/src/stores/modal.ts
index b7bfbafa..acbae2a5 100644
--- a/src/stores/modal.ts
+++ b/src/stores/modal.ts
@@ -449,6 +449,7 @@ export const useModalStore = defineStore('modal', () => {
const coalescingAction = ref<'avg' | 'havg' | 'geoavg' | 'lowest' | 'highest' | 'simplest'>(
'simplest'
)
+ const preserveBoundary = ref(false)
// Concordance shell
const mediumInteger = ref(32)
@@ -627,6 +628,7 @@ export const useModalStore = defineStore('modal', () => {
// Coalesce
tolerance,
coalescingAction,
+ preserveBoundary,
// Expand
simplify,
diff --git a/src/stores/scale.ts b/src/stores/scale.ts
index 43effe68..b953fa25 100644
--- a/src/stores/scale.ts
+++ b/src/stores/scale.ts
@@ -315,7 +315,7 @@ export const useScaleStore = defineStore('scale', () => {
warn
}
const visitor = getSourceVisitor(true, extraBuiltins)
- visitor.rootContext.gas = gas.value
+ visitor.rootContext!.gas = gas.value
// Declare base nominal and unison frequency
const prefixAst = parseAST(sourcePrefix.value)
@@ -329,8 +329,8 @@ export const useScaleStore = defineStore('scale', () => {
// Methods
function getVisitors() {
const globalVisitor = getGlobalVisitor()
- const visitor = new StatementVisitor(globalVisitor.rootContext, globalVisitor)
- const defaults = visitor.rootContext.clone()
+ const visitor = new StatementVisitor(globalVisitor)
+ const defaults = visitor.rootContext!.clone()
defaults.gas = gas.value
const ast = parseAST(sourceText.value)
@@ -352,7 +352,7 @@ export const useScaleStore = defineStore('scale', () => {
warning.value = ''
latticeIntervals.value = []
const globalVisitor = getGlobalVisitor()
- const visitor = new StatementVisitor(globalVisitor.rootContext, globalVisitor)
+ const visitor = new StatementVisitor(globalVisitor)
const ast = parseAST(sourceText.value)
let userDeclaredPitch = false
for (const statement of ast.body) {
@@ -374,8 +374,8 @@ export const useScaleStore = defineStore('scale', () => {
}
const ratios = relativeIntervals.value.map((i) => i.value.valueOf())
let visitorBaseFrequency = mtof(baseMidiNote.value)
- if (visitor.rootContext.unisonFrequency) {
- visitorBaseFrequency = visitor.rootContext.unisonFrequency.valueOf()
+ if (visitor.rootContext!.unisonFrequency) {
+ visitorBaseFrequency = visitor.rootContext!.unisonFrequency.valueOf()
}
if (ratios.length) {
const name = str.bind(ev)
diff --git a/src/utils.ts b/src/utils.ts
index 3be3ddb4..a0d0e3a5 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -61,8 +61,8 @@ export function splitText(text: string) {
export function expandCode(source: string) {
const globalVisitor = getSourceVisitor()
- const defaults = globalVisitor.rootContext.clone()
- const visitor = new StatementVisitor(globalVisitor.rootContext, globalVisitor)
+ const defaults = globalVisitor.rootContext!.clone()
+ const visitor = new StatementVisitor(globalVisitor)
const ast = parseAST(source)
for (const statement of ast.body) {
const interupt = visitor.visit(statement)