- Feature: Display hardness and chroma alongside the MOS pattern in Rank 2 modal #379
- Feature: Accept fractional values for CS variety margin #821
- Feature: Add a button for calculating more MOS sizes in Rank 2 modal #832
- Feature: Linear MIDI output mode (uses the numbers in the "#" column and assumes you tune the target device yourself) #834
- Feature: Display a warning when the user tries to create a scale larger than 1024 notes in New scale -> Equal temperament #402
- Bug fix: Fix a crash in Rank 2 caused by temperaments with a negative number of periods per equave #837
- Feature: Implement the missing size inequality operator
~<>
(i.e. the negation of~=
) - Feature: Accept lone vals for
commaBasis
andmappingBasis
- Feature: Admit containers as spread arguments
- Bug fix: Sanitize divisions input in equalize modal #825
- Bug fix: Fix domain error in
realizeWord
#823 - Bug fix: Fix typos in error messages
- Bug fix: Admit cents as the equave when generating equal temperaments #803
- Maintenance: Update npm package dependencies
- Feature: Apply CS margin to variety signature on Analysis tab #796
- Feature: Approximate Tenney-tall fractions on Analysis tab #796
- Regression: Show pitch associated with MIDI base index #795
- Bug fix: Use relative mossteps when J4 doesn't coincide with 1/1 #794
- Feature: Core language switched to from scale-workshop-core to sonic-weave
- Feature: Custom interval labels e.g.
3/2 "my fifth"
- Feature: CSS and RGB colors directly associated with intervals e.g.
400. yellow
- Feature: Relative FJS notation e.g.
M3^5
for5/4
- Feature: Absolute FJS notation e.g.
G4
for3/2
above middle C - Feature: Absolute frequencies e.g.
432 Hz
- Feature: Subgroup monzos e.g.
[-2 -1 1>@2.3.23
for23/12
- Feature: Frequency as a subgroup basis element e.g.
[1 8>@Hz.2
for256 Hz
- Feature: Full interval arithmetic e.g.
3/2 ^ 1/2
=(3÷2) ^ (1÷2)
=sqrt(3/2)
=√3/2
=n3
- Feature: Domain-specific arithmetic e.g.
3/2 + 4/3
=17/6
, butP5 + P4
=P8
- Feature: Domain-independent arithmetic e.g.
3/2 ~* 4/3
=2/1
andP5 ~* P4
=P8
- Feature: Enumerated chord syntax e.g.
5:6:7:8:9:10
- Feature: Vectorized operations e.g.
[4, 7, 12] \ 12
- Feature: Code comments e.g.
(* Nestable (* OCaml *) style comments *)
- Feature: Vals for equal tempering e.g.
<12 19 28]
,17c@
,17[^5]@
- Feature: Ups and downs with tempering e.g.
vM3;P5;P8;22@
for[7, 13, 22] \ 22
- Feature: And much much more e.g.
sort(3^[-1..5] rdc 2);commaList(81/80)
for TE meantone[7] - Feature: Virtual piano now supports up to 4 layers of colors
- Feature: Import scale title from .scl files
- Feature: Aperiodic waveforms for metallic sounds
- Feature: Add a button to select all MIDI inputs #271, #650
- Feature: Character palette with tooltips for syntax beyond ASCII #533
- Feature: Interval matrix simplified by default #536
- Feature: Convert scale to enumeration #538
- Feature: Export interval labels and colors as comments in .scl files #545
- Feature: More MOS coloring options #554
- Feature: Variety and brightness signatures show in the interval matrix #568
- Feature: Periodic equally tempered grids supported on the lattice tab
- Feature: Lattice label sizes customizable #581
- Feature: Lattice colors inverted and scale colors incorporated #586
- Feature: Scott Dakota's prime rings on the lattice tab #551
- Feature: Tonnetz prime ellipse coordinates on the lattice tab #588
- Feature: New
latticeView()
command for displaying the order of intervals (prior to sorting) #597 - Feature: New "repeat" modifier #406
- Feature: Show labels, ratios, cents and frequencies on the tuning table #534
- Feature: Implement multi-channel MIDI mode compatible with the Lumatone #649
- Feature: Call the equave "octave", "tritave", "tetrave" or "pentave" when applicable #694
- Feature: Full width view dedicated to the MOS pyramid #700
- Feature: Add harmonic entropy to the analysis tab and expose as a helper function #726
- Feature: Add equally tempered formatting as on option for the interval matrix #740
- Bug fix: Fix handling of trailing comments when importing .scl files #706, #787
- 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, #632
- Style fix: Make checkbox and radio button labels more consistent #644
- Beta cycle issues: #643, #640, #577, #513, #658, #664, #666, #777, #784 #785, #786
- Alpha cycle issues: #574, #579
- Bug fix: Unison is no longer affected by random variance #613
- Feature: Export scales for Ableton Live 12 #601
- Feature: MOS patterns supported by EDO can be sorted by size or hardness #599
- Bug fix: The frequency for 1/1 is now at MIDI note for base frequency even in "White only" mode #603
- Feature: Rank-2 circle now displays generator ranges of valid MOS patterns #580
- Bug fix: Pressing "More" for EDO inside the MOS modal now produces all supported MOS patterns
- Bug fix: CPS and Span lattice modals now report basis parsing errors #585
- Bug fix: MOS pattern errors no longer steal focus from the subgroup input during rank-2 generation #587
- Bug fix: Fix the bottom row of virtual QWERTY being offset by one #452
- Bug fix: Fix the equave shift keys on virtual QWERTY #564
- Bug fix: Fix rank-2 modal crashing when clearing number of periods #573
- Documentation: Move changelog to a dedicated file #556
- Documentation: Include an example NGINX config #470
- Feature: Be more informative about why vals or commas do not span a rank-2 temperament #540
- Feature: Implement more MOS coloring options #554
- Bug fix: Fix rank-2 modal crashing when changing number of periods #553
- Bug fix: Display custom validation messages on input elements #540
- Bug fix: Implement soft limits to approximation numerators and denominators #544
- Bug fix: Parse nothing-of-EDO #537
- Feature: Support primes as equaves in lattice visualization
- Feature: Clear scale title when clearing scale data #530
- Bug fix: Bypass complex monzo calculations in tuning table #528
- Bug fix: Fix MIDI visualization when base = 0 #526
- Bug fix: Fix MIDI In channel messages leaking to deactivated Out channels
- Refactoring: Use Pinia to manage app state #367
- Refactoring: Persist modal data in Pinia when changing tabs #529
- Feature: Add a link to the Discord channel on About page #468
- Improvement: Improve loading times with asynchronous components #520
- Bug fix: Fix tempering in exotic subgroups #518
- Bug fix: Close Korg export modal when pressing escape #524
- Refactoring: Split isomorhic QWERTY to s re-usable package #336
- Bug fix: Make copy & paste possible outside of scale data #515
- Quality assurance: End-to-end test scale generation / approximation #516
- Quality assurance: Use node version 18 in GitHub Workflows
- Feature: Historical temperaments, target-tempered generator stacks and well temperaments #461, #477
- Bug fix: Fix audio issues in the 404 page #512
- Bug fix: Fix rank-2 generation #514
- Bug fix: Fix merging negative offsets #511
- Refactoring: Use
xen-dev-utils
for circle difference
- Bug fix: Minor type issues
- Refactoring: Re-initialize the Vue project
- Refactoring: Re-format code
- Quality assurance: Implement Cypress test to verify URL encoding #508
- Feature: Add radio buttons for changing interval matrix indexing #499
- Refactoring: Use Pinia to manage app audio state #367
- Documentation: Point README links to plainsound.org
- Documentation: Replace decimal example with pi
- Feature: Stretch scale to match a specified interval
- Feature: Merge an offset copy of the scale with the original
- Feature: On-screen QWERTY keyboard (for playing) can now be enabled in the preferences
- Feature: Light-weight algorithms for tempering in extremely large just intonation subgroups
- Feature: Visualize how the various MIDI mappings assign scale degrees
- Feature: Implement visual MIDI channel indicators
- Feature: Interprete non-integer equal temperaments as cET
- Feature: Implement basic reverb using a ping-pong delay
- Feature: Implement new metric prefixes from quecto to quetta
- Standardization: Rename reference pitch to A4
- Bug fix: Text inputs no longer disappears when filled with invalid intervals
- Bug fix: Import base frequency from Anamark v2 tunings
- Bug fix: Support monzo syntax in most modal dialogs that accept intervals
- Bug fix: Show values that more accurately represent the scale in the interval matrix
- Bug fix: Respect the preferred number of signifying digits when manipulating the scale
- Bug fix: Make sure that the text always fits in the chord wheels on the Analysis tab
- Bug fix: Fix issues with multiple touches on the virtual keyboard
- Bug fix: Prevent garbage lines turning into valid URL data
- Bug fix: Make sure the base MIDI note is an integer
- Bug fix: Adhere to Korg maximum cents limits
- Feature: Improved Korg export including Minilogue XD
- Feature: Export MTS SysEx dumps
- Feature: Single val tempering can now produce N-of-EDO steps
- Bug fix: Fix how
1/1
are spelled1\1
after equalizing the scale
- Bug fix: Make the syntax more consistent
- Feature: A new tab for visualizing 23-limit just intonation lattices
- Bug fix: The "Not Found" page should again produce the intended easter egg
- Feature: New Modify scale option for merging an offset copy with the scale
- Feature: On-screen QWERTY keyboard now available if enabled in the Preferences tab.
- Feature: Loading preset scales now assigns corresponding key colors as well
- Feature: Replaced top export with simple URL copy to clipboard
- Feature: Rank-2 scales can now be manipulated interactively by clicking on the period circle in a new tab inside the modal for New scale → Rank-2 temperament
- Refactoring: Core functionality now at scale-workshop-core for better reusability
- Refactoring: Utility packages xen-dev-utils, moment-of-symmetry and temperaments are now sourced from npm.
- Bug fix: Decimal dots in the interval matrix is now consistent with the tunng table
- Bug fix: Touching the screen in piano layout played multiple notes in unison
- Bug fix: Typing out text in some of the scale creation modals made sound
- Bug fix: Disable browser specific features like quick find on Firefox
- Regression: Korg 'logue exports have been fixed to match Scale Workshop 1
- Optimization: Tuning table frequencies are computed using a faster strategy
- Documentation: Better documentation and logging support for the class that handles keyboard input
- Feature: The synth can now be played while manipulating slider, radio or checkbox inputs
- Bug fix: Scala import wouldn't read plain numbers and didn't ignore line comments
- Bug fix: Using a piano-style layout in all-white/all-black could crash the app
- Bug fix: Tuning table rows were highlighting inconsistently
- Bug fix: Virtual keys got stuck when a click was released outside the virtual keyboard
- Project update: Application rewritten from the ground up. Scale Workshop is now powered by Vue.
- Feature: Equal temperament now supports subsets when generating scales
- Feature: Generate Rank-2 temperaments from vals or comma list
- Feature: Combination product set supports arbitrary equaves besides the octave (2/1)
- Feature: Generate Moment of Symmetry scales
- Feature: Generate Euler-Fokker genera
- Feature: Generate Dwarf scales
- Feature: Generate Cross polytope scales (generalized octahedra in monzo-space)
- Feature: Span lattices of arbitrary rank
- Feature: Approximate by ratios using odd- and prime-limits
- Feature: Temper modifier for converting scales in just intonation to lower ranks
- Feature: Convert intervals to different types
- Feature: New interval type: monzo e.g
[-4 4 -1>
= 2-4·34·5-1 = 81/80 - Feature: New interval type: composite e.g
3/2 - 1.995
≈ 700.0 cents - Feature: Analysis - Interval matrix (modes)
- Feature: Analysis - Visualize currently played chord as otonal or utonal concentric cogs
- Feature: Piano-style virtual keyboard
- Feature: Piano-style mapping for the QWERTY keyboard (layout determined by key colors)
- Feature: Mapping white (physical) MIDI keys to white colored (virtual) scale degrees