Changes in version 0.4.0.9000 - ineqsym() now returns the correct permutation matrix when involution=TRUE. Previously, the involution parameter affected returned sets but not returned permutation matrices. - make_infrared_ineqmat() now defaults to TRUE rather than FALSE for its include_wraparound argument. - New vl_signvector() is a wrapper for signvector() that interprets inputs as voice leadings rather than scales. - New monochrome_vl() detects instances where the voice leading between two modes of a scale cannot be decomposed by passing through some mode of a given contrasting scale. - New vignette (mct_symmetries.Rmd) explains the use of ineqsym() and related functions. Changes in version 0.4.0 (2026-02-27) New functions - New move_to_hyperplane() finds the point where a chosen line and hyperplane intersect. - New point_on_flat() generates a concrete point on any given flat of a hyperplane arrangement. Updates to function ineqsym() - The function can now return a permutation matrix rather than a scale, which it does if set is NULL. New parameter card goes along with this change: it is necessary to specify the size of the permutation matrix if set is NULL. - Default value of parameter set is now NULL. - Change to the way the parameter a is interpreted. Essentially it is now the inverse (mod card) of the previous implementation of a. The new method enhances consistency with other standards and with the permutation-matrix view of the function. - Changes to the internal logic of the function, emphasizing the role of permutation matrices in implementing the symmetries of the space. Bug fixes and minor functionality updates - Fixes for clampitt_q(), so that it gives correct results when set includes transpositionally symmetrical subsets or doubled notes. - ianring() gains is_interactive parameter which allows explicit control over whether the function opens a browser window (mainly to disable the browser during tests). - project_onto() now works for hyperplane arrangements that are not central, such as those from make_roth_ineqmat() and make_rosy_ineqmat(). - scale_palette() gains an ineqmat parameter, which improves completeness of results for arrangements other than the modal color theory arrangement. Changes in version 0.3.0 (2025-11-03) - brightness_comparisons() and brightnessgraph() gain a goal parameter that allows voice-leading brightness relationships between different sets to be studied. - New clampitt_q() finds the sets that are "Q-related" to an input (Clampitt 1997, 2007). - colornum() now tries to automatically match a signvector list to the specified ineqmat when the parameter signvector_list is NULL. (For instance, colornum(set, ineqmat="pastel") searches the global environment for pastel_signvectors.) - New fpmod() allows for safer modulo division in contexts with octave equivalence. - New inter_vlsig() finds elementary voice leadings between sets of different Tn-types. - New make_infrared_ineqmat() adds a new family of hyperplane arrangements for studying voice leading. - minimize_vl() now returns better results when method="hamming" by allowing for voice crossings (#4). - primary_colornum() gains a signvector_list parameter to pass to colornum(), allowing it to work properly for hyperplane arrangements other than the "modal color theory" arrangement. - Parameter n for tni() gains a default value of NULL, in which case the index n is chosen to create the contextual inversion which keeps the first and last entries of set fixed. - vl_generators() now gives correct results for sets which fail optc_test(). - vlsig() parameter index now defaults to NULL, returning a matrix of all elementary voice-leadings. More flexible handling of OPTIC symmetries - New normal_form() calculates the normal form of a set under any combination of OPTIC symmetries, following the algorithm described by Hook (2023, 416-8). - Set theory functions including tn(), tni(), startzero(), and so on gain an optic parameter, which allows the user to specify the OPTIC symmetries to consider. Anaglyph Arrangements - New make_anaglyph_ineqmat() allows construction of a new family of hyperplane arrangements (anaglyph arrangements) which study voice leadings between sets of different set classes. - New anazero_fingerprint() provides granular information about the types of hyperplanes that a pair of sets lie on in the anaglyph arrangement. - New behavior for howfree() and colornum() because anaglyph arrangements require special handling. Changes in version 0.2.0 (2025-07-21) New ineqmat features - New make_black_ineqmat() and make_gray_ineqmat() allow new transposition-sensitive hyperplane arrangements to be studied; ineqmat parameter for other functions (e.g. signvector() now accepts "black" and "gray" as options. - New make_offset_ineqmat() creates version of standard ineqmats (MCT, white, black, etc.) which have been translated to be centered on an arbitrary set. - Creation functions for ineqmats (makeineqmat(), make_black_ineqmat(), make_white_ineqmat(), make_roth_ineqmat()) now return a consistent value (integer(0)) rather than various errors when card is small. - New data set roth_ineqmats.rda with precomputed results from make_roth_ineqmat(); accessed with new get_roth_ineqmat(). - New data sets for pastel and white arrangements (for cardinalities <= 6) uploaded to modalcolortheory repository and linked in the documentation for make_white_ineqmat(). New behaviors for quantization functions - Affected functions are quantize_color(), quantize_hue(), and set_from_signvector(). - Upon failure, quantization functions now return a result whose format matches expected success format depending on value of reconvert parameter. That is, if reconvert=TRUE, failure to quantize results in a NA vector (as before), but if reconvert=FALSE, failure to quantize results in a list with entries set and edo, both of which are NA. - Quantization functions gain a target_edo parameter, which allows user to search for desired scales in a specific edo rather than all possible edos. New Functions - New clockface() offers a simple plotting mechanism to visualize sets on a pitch-class clockface (with numbers corresponding to any equal temperament). - New ianring() creates a convenient way to open a browser window to information about the input set on Ian Ring's website The Exciting Universe of Music Theory. - New functions for basic applications of the DFT to set theory are added. These include set_to_distribution(), distribution_to_set(), and dft(). Updates to Existing Functions - brightnessgraph() now returns an invisible copy of the igraph graph object underlying the plotted brightness graph, instead of an invisible NULL. - sim() gains a goal parameter, which allows it to calculate the interscalar interval matrix for two sets. - vl_generators() now throws a warning instead of an error when set is perfectly even, returning a 2-by-0 matrix. Changes in version 0.1.2 (2025-06-05) - Updated writeSCL() to require user to enter a path. - Updated vignette "Visualizing Higher Dimensions" to reset par() changes. Changes in version 0.1.1 - Removed extraneous license file. Changes in version 0.1.0 - Initial CRAN submission.