<?xml version="1.0"?>
<rss version="2.0"><channel><title>Announcements Latest Topics</title><link>https://opusmodus.com/forums/forum/4-announcements/</link><description>Announcements Latest Topics</description><language>en</language><item><title>Opusmodus 4.0.31432 Update</title><link>https://opusmodus.com/forums/topic/4119-opusmodus-4031432-update/</link><description><![CDATA[<h3>New Opusmodus Documentation Format</h3><p>The Opusmodus documentation is now being delivered in a new Markdown-based interactive format. The updated system introduces a more consistent directory structure, improved cross-linking between related documents, cleaner function pages, and better-organized overview documents. This makes the documentation easier to navigate, easier to maintain, and more effective as a reference environment for functions, examples, and category-based exploration.</p><p></p><h5>Example:<br><br><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4414" src="https://opusmodus.com/forums/uploads/monthly_2026_05/OMMD1.png.608a873b0ac2732d381e99b1b81713ca.png" alt="OMMD1.png" title="OMMD1.png" style="--i-media-width: 960px;" width="2010" height="2360" loading="lazy"><br><br></h5><p>New Opusmodus Analysis Tools open a new way of exploring music from inside the composition environment itself. Instead of treating analysis as a separate stage, Opusmodus brings rhythmic, melodic, harmonic, cadential, textural, and statistical insight directly into the score workflow. With functions such as monophonic-analysis, complex musical material can be transformed into a clear, readable report that reveals patterns, tendencies, and structural relationships across the piece.</p><p></p><h5>Example:</h5><p></p><p><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4415" src="https://opusmodus.com/forums/uploads/monthly_2026_05/analysis1.webp.36936031cbbdb38e75c9745ca0dc37d7.webp" alt="analysis1.webp" title="" style="--i-media-width: 960px;" width="2074" height="1840" loading="lazy"></p><p></p><h3>Best wishes,<br>Janusz</h3>]]></description><guid isPermaLink="false">4119</guid><pubDate>Wed, 27 May 2026 11:51:27 +0000</pubDate></item><item><title>Opusmodus 4.0.31105 Update</title><link>https://opusmodus.com/forums/topic/4104-opusmodus-4031105-update/</link><description><![CDATA[<p><strong>Update: Wave Functions, Monophonic Analysis, and Harmonics</strong><br><br>The wave-function system has been substantially revised and extended.</p><p>Wave generators now support a clearer and more complete modulation model:<br></p><ul><li><p><code>:fm</code> for frequency modulation</p></li><li><p><code>:am</code> for amplitude modulation</p></li><li><p><code>:phase-scaling</code> for per-sample phase scaling<br>This replaces the earlier <code>:modulation</code> keyword.</p></li><li><p><code>:phase-distortion </code>for phase remapping within the waveform cycle<br></p></li></ul><p>These controls are now available consistently across the main wave families, including the generator, additive, modulatory, and half-wave functions. The Pulse family has also been completed and brought into line with the rest of the system.<br></p><p></p><p>The Monophonic Analysis system has now been completed as a full function family, with consistent documentation in the new Markdown format. The analysis set is organised as a unified analytical environment, allowing rhythmic, melodic, harmonic, cadential, formal, textural, density, expressive, and related perspectives to be read together within a single report structure.<br><br>To test the analysis functions, download the file below and place it in the <code>~/Opusmodus/Media/Musicxml</code> folder. This will allow you to evaluate the examples in the documentation directly.<br><br><a class="ipsAttachLink" data-fileid="4405" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4405&amp;key=b01ba2446b48954871c1d32fbb4be130" data-fileext="xml" rel="">Webern-Op.5.xml</a><br></p><p></p><p>The <code>harmonics</code> function has also been enhanced. Its <code>coefficient</code> behaviour now follows the correct spectral model, rather than simple post-scaling, and the function now supports additional control over <code>partial</code> selection, including patterned <code>partial-nth</code> input and the new <code>:size</code> option for result-length handling.<br><br>Best wishes,<br>Janusz</p>]]></description><guid isPermaLink="false">4104</guid><pubDate>Sun, 19 Apr 2026 11:40:58 +0000</pubDate></item><item><title>Opusmodus 4.0.31058 Update</title><link>https://opusmodus.com/forums/topic/4093-opusmodus-4031058-update/</link><description><![CDATA[<p><strong>What’s New in Opusmodus</strong></p><p>The latest Opusmodus update brings a set of practical additions and workflow improvements across composition, analysis, synthesis, and navigation.</p><p></p><p><strong>MIDI Player: Dynamic Display Modes</strong><br>The MIDI Player now includes new velocity-based display modes. In addition to the original instrument-colour view, you can now display MIDI data using velocity colour mapping. Available modes include None, Mono, Plasma, Viridis, Magma, and Blue Ice. This makes it easier to read dynamics directly in the piano-roll display and compare expressive detail across passages.</p><p></p><p></p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4393" src="https://opusmodus.com/forums/uploads/monthly_2026_04/midi-display-plasma.png.ceba74efc298379f274e36918d2f3ade.png" alt="midi-display-plasma.png" title="midi-display-plasma.png" style="--i-media-width: 840px;" width="1596" height="1086" loading="lazy"></p><p style="text-align:center;"></p><p></p><p><strong>New CLM Generators</strong><br>A new collection of CLM generators has been added, expanding the available synthesis and sound-design tools in Opusmodus. These additions provide more options for building instruments, exploring timbre, and integrating CLM more deeply into compositional workflows.<br><br>Download the <strong>CLM 4.0.3158</strong> package here and replace the current CLM folder in your Opusmodus installation with the updated version. Then copy Load CLM Instruments.lisp to the Extensions folder.</p><p></p><div class="ipsEmbeddedOther" data-og-user_text="https://opusmodus.com/forums/files/file/18-clm-4031058/"><iframe src="https://opusmodus.com/forums/files/file/18-clm-4031058/?do=embed" data-embedcontent="" data-internalembed="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="1" data-ipsembed-contentapp="downloads" data-ipsembed-contentclass="downloads_File" data-ipsembed-contentid="18" data-ipsembed-timestamp="1775755188" allowfullscreen="" data-og-user_text="https://opusmodus.com/forums/files/file/18-clm-4031058/" loading="lazy"></iframe></div><p></p><p><strong>Spectral Plot</strong><br>A new spectral-plot function has been added to the Graph Tools. It allows direct plotting of spectral analysis data across frames and partials, making it possible to inspect frequency, pitch, or amplitude distributions visually. Colour mapping support using palettes such as Mono, Plasma, Viridis, Magma, and Blue Ice helps reveal spectral structure more clearly.</p><p></p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4392" src="https://opusmodus.com/forums/uploads/monthly_2026_04/spectral-plot.png.5c6a4d5bd5b9e2f38f5615a10aba9352.png" alt="spectral-plot.png" title="spectral-plot.png" style="--i-media-width: 960px;" width="2034" height="2548" loading="lazy"></p><p></p><p style="text-align:left;"><strong>Spectral Quantize</strong><br>The spectral-quantize workflow has been refined and documented more clearly. It provides a practical way to transform spectral frame data into quantized notation-oriented material, with improved control over normalization and consecutive pitch handling.<br></p><p style="text-align:center;"><br><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4394" src="https://opusmodus.com/forums/uploads/monthly_2026_04/spectral-quantize.png.6afffa0cd4fb9085009d6b91c3b24bed.png" alt="spectral-quantize.png" title="spectral-quantize.png" style="--i-media-width: 960px;" width="2054" height="1632" loading="lazy"></p><p></p><p><strong>Navigator Improvements</strong><br>The Workspace Navigator has been improved so that moving between sections such as Finder, Scores, Documents, Media, and Libraries behaves more consistently. In particular, returning to a section now preserves its position more reliably, making navigation smoother in larger projects.<br><br><strong>Note: after updating the application, please close the Workspace and Assistant windows once. When reopened, both will behave normally again.</strong><br><br>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">4093</guid><pubDate>Thu, 09 Apr 2026 16:25:47 +0000</pubDate></item><item><title>Opusmodus 4.0.30980 Update</title><link>https://opusmodus.com/forums/topic/4085-opusmodus-4030980-update/</link><description><![CDATA[<p>Small change to CLM instrument loading.</p><p>After installing version 4.0.30980, follow the instructions below:<br><br><strong>Installation</strong></p><p>To use the new CLM implementation:</p><p>1. Delete the old <code>CLM</code> directory from your <code>~/Opusmodus</code> folder.</p><p>2. Replace it with the new <code>CLM</code> directory supplied with this update.</p><p>3. Open <code>~/Opusmodus/User Source/Extensions</code>.</p><p>4. Replace <code>Load CLM Instruments.lisp</code> with the updated version.</p><p>5. In <code>Load CLM Instruments.lisp</code>, you can then uncomment the loading expression from within the Opusmodus application in the Navigator pane (L).</p><p>6. Start the Opusmodus application.<br><br>This new installation simplifies the load of the CLM instruments.<br><br><a class="ipsAttachLink" data-fileid="4381" data-fileext="zip" data-extension="zip" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4381&amp;key=a48f5d3bc956fffb3f5ea232cabe72a6" rel="">CLM.zip</a><br><br><a class="ipsAttachLink" data-fileid="4380" data-fileext="lisp" data-extension="lisp" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4380&amp;key=4d972bfaa46670d6304a70e0a46ebad4" rel="">Load CLM Instruments.lisp</a></p>]]></description><guid isPermaLink="false">4085</guid><pubDate>Sun, 29 Mar 2026 12:28:04 +0000</pubDate></item><item><title>Opusmodus 4.0.30748 (Update)</title><link>https://opusmodus.com/forums/topic/4056-opusmodus-4030748-update/</link><description><![CDATA[<p>Improvements to the display of tuplet notation (e.g., 6-, 10-, 14-tuplets).</p><p><br></p><p><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4348" src="https://opusmodus.com/forums/uploads/monthly_2026_02/Screenshot2026-02-15at13_03_11.png.cda36394fdf5fe49a30a43a56958b52e.png" alt="Screenshot 2026-02-15 at 13.03.11.png" title="Screenshot 2026-02-15 at 13.03.11.png" style="--i-media-width: 960px;" width="1552" height="810" loading="lazy"></p><p></p><p></p><p><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4349" src="https://opusmodus.com/forums/uploads/monthly_2026_02/Screenshot2026-02-15at13_03_54.png.58de0c5810a288635a23857fdf8ad0aa.png" alt="Screenshot 2026-02-15 at 13.03.54.png" title="Screenshot 2026-02-15 at 13.03.54.png" style="--i-media-width: 960px;" width="1564" height="352" loading="lazy"></p><p></p><p>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">4056</guid><pubDate>Sun, 15 Feb 2026 12:10:12 +0000</pubDate></item><item><title>Opusmodus 4.0.30671 (Update)</title><link>https://opusmodus.com/forums/topic/4033-opusmodus-4030671-update/</link><description><![CDATA[<p>Additional Ncode functionality (Ncode Manual):<br><br><strong>2.2.4 SETF mode, templates, and pages</strong></p><p style="text-align:justify;">NCODE provides a template-driven mode for constructing structured values via SETF pages. This mode is used when the Function field is SETF and a template is selected. Rather than entering a single expression, the user fills a set of pages; NCODE then reconstructs a quoted value and evaluates a (setf …) form.</p><p style="text-align:justify;"></p><p style="text-align:justify;"></p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4301" src="https://opusmodus.com/forums/uploads/monthly_2026_01/ncode-setf.png.1e74e830a6d95cbcdba0cac8b7921fdf.png" alt="ncode-setf.png" title="ncode-setf.png" style="--i-media-width: 960px;" width="1694" height="574" loading="lazy"></p><p style="text-align:center;"></p><p style="text-align:center;"><em>Figure 3 SETF mode, templates and pages.</em></p><p style="text-align:justify;"></p><p style="text-align:justify;">SETF pages provide a UI method for building complex, repeatable list structures (collections of labelled items) without manual list syntax. This is particularly useful when the value is naturally expressed as multiple items that must be ordered.</p><p style="text-align:justify;"></p><p style="text-align:justify;"><strong>Templates</strong></p><p style="text-align:justify;">A template defines:</p><ul><li><p>the number and organisation of pages, and</p></li><li><p>the fields available on each page (key–value pairs).</p></li></ul><p style="text-align:justify;"></p><p style="text-align:justify;">Selecting a different template changes the page layout and the meaning of the fields. The selected template and page contents are saved in the .omnc session and restored when reopened.</p><p style="text-align:justify;"></p><p style="text-align:justify;">Each page corresponds to one logical item in the resulting value.</p><ul><li><p><strong>Next</strong> page creates a new item.</p></li><li><p><strong>Remove</strong> page removes an item.</p></li></ul><p style="text-align:justify;">Empty pages are ignored when the final value is constructed.</p><p style="text-align:justify;"></p><p style="text-align:justify;"><strong>Field values</strong></p><ul><li><p>Fields accept numbers, strings, keywords, lists, and symbols.</p></li><li><p>Symbols entered without a leading quote may be treated as variable references (for example, previously stored history variables).</p></li><li><p>When a literal symbol is required, enter it as a quoted symbol.</p></li></ul><p style="text-align:justify;"></p><p style="text-align:justify;"><strong>Constructed value</strong></p><p style="text-align:justify;">When evaluated, NCODE converts the populated pages into a single quoted form:</p><ul><li><p>if one page is populated, the value becomes a quoted single item;</p></li><li><p>if multiple pages are populated, the value becomes a quoted list of items.</p></li></ul><p style="text-align:justify;">NCODE then evaluates the corresponding (setf …) form, storing the result in the history like any other entry.</p><p style="text-align:justify;"></p><p style="text-align:justify;"><strong>Reproducibility</strong></p><p style="text-align:justify;">SETF pages are stored as structured page data in the session. When reloading a session or using Refresh All, NCODE reconstructs the same quoted value from the saved pages and re-establishes consistent bindings.</p><p style="text-align:justify;"></p><p style="text-align:justify;"><a rel="" href="https://opusmodus.com/forums/ncode/">https://opusmodus.com/forums/ncode/</a><br></p><hr><p style="text-align:justify;"><br>NCODE is still in beta, but with every update, it is becoming a more stable tool.<br><br>Best wishes,<br>Janusz</p><p style="text-align:justify;"><br>---<br>Here are few files to play with.<br>Add this file into Media/MusicXML folder:<br><br><a class="ipsAttachLink" data-fileid="4303" data-fileext="xml" data-extension="xml" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4303&amp;key=82620e4887f5ada72399c966929ab92d" rel="">Webern-Op.5.xml</a><br><br>Add this files into the Media/Ncode folder:<br><br><a class="ipsAttachLink" data-fileid="4304" data-fileext="omnc" data-extension="omnc" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4304&amp;key=f4bf83018f542f1261f76dd44a839a28" rel="">Maderna.omnc</a> <a class="ipsAttachLink" data-fileid="4306" data-fileext="omnc" data-extension="omnc" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4306&amp;key=70858627410ff374225048f0d59a4f44" rel="">Tonnetz3.omnc</a> <a class="ipsAttachLink" data-fileid="4307" data-fileext="omnc" data-extension="omnc" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4307&amp;key=67b95b8362c14f624dac63f7189685f5" rel="">Ulam-Perc.omnc</a> <a class="ipsAttachLink" data-fileid="4308" data-fileext="omnc" data-extension="omnc" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4308&amp;key=49e9a982c436b5a25fbf9ce1c7bc9a60" rel="">Voice-Variant.omnc</a> <a class="ipsAttachLink" data-fileid="4305" data-fileext="omnc" data-extension="omnc" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4305&amp;key=aec125a137f83e32ea652fd522eafe37" rel="">MusicXML.omnc</a></p>]]></description><guid isPermaLink="false">4033</guid><pubDate>Sat, 10 Jan 2026 17:59:41 +0000</pubDate></item><item><title>Opusmodus 4.0.30631 (Update)</title><link>https://opusmodus.com/forums/topic/4017-opusmodus-4030631-update/</link><description><![CDATA[<p>I am happy to announce a new tool called <strong>NCODE – Interactive Function Exploration and Score Assembly for Opusmodus (NCODE)</strong>.<br>It is designed for users who want to explore algorithmic composition workflows in Opusmodus without writing Lisp code directly.<br>The release of NCODE is just the beginning of developing many Build add-ons that will help users create complex music without direct coding.<br></p><p><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4270" src="https://opusmodus.com/forums/uploads/monthly_2025_12/ncode-var-fun.png.e4532be550137df9983bc6f0175d72ef.png" alt="ncode-var-fun.png" title="ncode-var-fun.png" style="--i-media-width: 800px;" width="1854" height="1622" loading="lazy"></p><p>More information about NCODE you find here:<br><a rel="" href="https://opusmodus.com/forums/ncode/">https://opusmodus.com/forums/ncode/</a><br><br>Best wishes, and happy holidays and New Year,<br>Janusz</p>]]></description><guid isPermaLink="false">4017</guid><pubDate>Tue, 23 Dec 2025 15:12:23 +0000</pubDate></item><item><title>Opusmodus 4.0.30465 (Update)</title><link>https://opusmodus.com/forums/topic/3999-opusmodus-4030465-update/</link><description><![CDATA[<h4>New:</h4><p>Spectral Analysis and Audio tools are now fully implemented on Windows.</p><p>MIDI Clock and MIDI Time Code are available for both Mac and Windows.<br><br><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4249" src="https://opusmodus.com/forums/uploads/monthly_2025_11/MCMTC.png.61022784d6189c8a9f534d108c097900.png" alt="MC:MTC.png" title="MC:MTC.png" style="--i-media-width: 640px;" width="1126" height="856" loading="lazy"><br>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">3999</guid><pubDate>Mon, 17 Nov 2025 15:55:16 +0000</pubDate></item><item><title>Opusmodus 4.0.30320 (Update)</title><link>https://opusmodus.com/forums/topic/3983-opusmodus-4030320-update/</link><description><![CDATA[<p>The new Spectral Analysis Tool and Audio Engine functions are currently available only on macOS. The Windows version will be available shortly.<br><br></p><h2 style="text-align:center;"><strong>Spectral Analysis Tool<br></strong><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4212" src="https://opusmodus.com/forums/uploads/monthly_2025_10/spertral-analysis-tool.png.ea44353991e4b4b37bd5e7ec873ea1e7.png" alt="spertral-analysis-tool.png" title="spertral-analysis-tool.png" style="--i-media-width: 720px;" width="1472" height="1226" loading="lazy"></h2><h4 style="text-align:left;"><strong>Overview</strong></h4><p>The <strong>Spectral Analysis</strong> window provides a <strong>real-time visualisation</strong> and control interface for frequency-domain <strong>analysis of audio signals</strong>. It combines Fast Fourier Transform (FFT) processing with a configurable analysis environment, supporting in-depth inspection of frequency components over time. The display includes magnitude spectra and peak detection, facilitating detailed timbral and <strong>structural audio analysis</strong>.</p><p></p><p>In addition to its analytical capabilities, the environment supports direct integration with compositional workflows. The <strong>Export Partials</strong> function enables the extraction and preservation of <strong>spectral data</strong> in a format compatible with the Opusmodus <strong>library</strong> system. This allows composers to employ spectral data as a generative resource, thereby placing the techniques of <strong>spectral composition</strong>, including orchestration, transformation, and algorithmic modelling, immediately at their disposal.</p><p></p><h5><strong>Spectrum View (Graph Area)</strong></h5><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>X-axis:			(Frequency, logarithmic scale): Ranges from ~8.17 Hz to 20 kHz					(depending on user input).
Y-axis:			(Normalised Amplitude): Ranges from 0.0 to 1.0.
Bars:			Represent the magnitude spectrum at the current frame.
Curve Line:		Shows averaged or smoothed spectral envelope.
Peak:			Display detected frequency peaks (e.g., 21, 69, 144 etc. in Hz).</code></pre><p></p><h5><strong>Top Information Bar</strong></h5><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>Fps:			Frames per second of visual refresh.
RMS:			Root Mean Square amplitude of current frame.
Bars:			Number of spectral bins displayed.
Pos:			Current time/frame position and total duration.
Cen:			Spectral centroid (in Hz).
Roll:			Spectral roll-off frequency (in Hz).
Spr:			Spectral spread (standard deviation from centroid, in Hz).
Flat:			Spectral flatness (0.0 = harmonic; 1.0 = noise-like).</code></pre><p></p><h5><strong>Control Buttons and Options</strong></h5><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>Play			Initiates playback and real-time analysis.
Rewind			Resets position to start of audio buffer.
Scale: Log		Selects frequency scale (e.g., Logarithmic or Linear).
Show Octaves	Displays octave grid overlays.
Analyser		Opens or configures the main Analyser module.</code></pre><p></p><h5><strong>Analysis Parameters</strong></h5><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>FFT size		Number of points in FFT computation; affects
                frequency resolution, default: 16384.
Window size		Size of analysis window (samples); affects time resolution,
				default: 2048.
Hop size		Overlap between windows (samples), default: 1024.
Frame interval	Time interval (seconds) between frames, default: 0.01.
Min peak diff	Minimum difference between adjacent peaks for detection,
				default: 0.01.
Min amp (dB)	Minimum amplitude threshold for rendering spectrum,
				default: -90.
Under-peak (dB)	Threshold below peak for considering partials, default: -60.
Min freq (Hz)	Lower bound of frequency range displayed, default: 8.1758.
Max freq (Hz)	Upper bound of frequency range displayed, default: 12543.855.
Window			Type of windowing function used for FFT (e.g., Hanning,
				Hamming, Blackman). Can be selected live to immediately
                observe its effect on the spectral analysis, default: :hanning.</code></pre><p></p><h5><strong>Inactive Buttons (Context-Sensitive)</strong></h5><p><strong>Export Partials  (Disabled):</strong></p><p>Enables the export of <strong>spectral partials</strong> once sufficient analysis data is available. Upon activation, this function saves the extracted partials in a file conforming to the Opusmodus <strong>library format</strong>. The file is stored in the designated library location and indexed automatically for future retrieval, reuse in composition, or further spectral processing.</p><p></p><p><strong>Resanple Rect (Disabled):</strong><br>Once active, performs rectangular resampling of the analysed audio. The resampled signal is saved as an audio file in the <strong>Media/Audio</strong> directory. The newly generated file is indexed automatically, allowing direct access through the Opusmodus Spectral Analysis or for subsequent processing.<br></p><h5><strong>Interactive Controls and Selection Tools</strong></h5><p><strong>Timeline Selection (Shift + Click &amp; Drag)</strong></p><p>Holding the Shift key while clicking and dragging horizontally across the graph area allows the user to define a temporal selection on the timeline. This operation sets the active region for analysis playback and data export.</p><ul><li><p>The horizontal extent corresponds to the time range (start - end) under analysis.</p></li><li><p>This selected interval can be used to constrain playback or to focus data extraction (e.g., exporting partials within the selected window).</p></li></ul><p></p><h5><strong>Rectangular Selection (Option + Click &amp; Drag)</strong></h5><p>Holding the Option (Alt) key while dragging the mouse enables a rectangular selection within the spectral display. This selection defines both frequency and time bounds.</p><ul><li><p>The vertical axis of the selection restricts frequency range.</p></li><li><p>The horizontal axis restricts time range.</p></li><li><p>This selection becomes active for specific functions such as resampling or focused spectral export.</p></li></ul><p></p><p>Once defined, the rectangular region is visually highlighted and is used as a contextual domain for subsequent operations.</p><p></p><h5><strong>Graphical Labels</strong></h5><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>Peak Frequency:	Numeric labels (e.g., 21, 69, 144) appear above detected spectral
				peaks, denoting the frequency (in Hz) of dominant components.
Cursor Markers:	While hovering or selecting, real-time frequency and amplitude
				information may be displayed depending on implementation.
Time Cursor:	A vertical line or pointer indicates the current playback or analysis
				frame.</code></pre><p></p><h5><strong>Keyboard Shortcuts</strong></h5><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>Spacebar		Play/Pause the analysis. Starts or halts real-time playback.
Return			Rewind to the beginning of the signal buffer.</code></pre><p></p><p></p><h2 style="text-align:center;">Audio Engine</h2><p></p><p><strong><span data-ips-font-size="150"><span style="font-family: Courier, monospace;">audio-play-file</span></span></strong><span style="font-family: Courier, monospace;"> </span><em>audio-file </em>&amp;key<em> start end pos len amp fade-in fade-out</em></p><p></p><p><strong>Arguments and Values:</strong></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>audio-file		Pathname designator (string or pathname).
start			(optional) real ≥ 0. Start time in seconds.
end				(optional) real ≥ 0. End time in seconds (strictly ≥ start).
pos				(optional) real ≥ 0. Start time in seconds.
len				(optional) real ≥ 0. Duration in seconds.
amp				(optional) real in [0.0, 1.0]. Playback gain. Default: 1.0.
fade-in			(optional) real ≥ 0. Fade-in time in seconds. Default: 0.0.
fade-out		(optional) real ≥ 0. Fade-out time in seconds. Default: 0.0.</code></pre><p></p><p><strong>Description:</strong></p><p></p><p>Plays a region of an audio file with optional gain and linear fades. The time window is specified by either (<span style="font-family: Courier, monospace;">:pos p :len l</span>) or (<span style="font-family: Courier, monospace;">:start s :end e</span>); mixed forms (<span style="font-family: Courier, monospace;">:pos</span> with <span style="font-family: Courier, monospace;">:end</span>, or <span style="font-family: Courier, monospace;">:start </span>with <span style="font-family: Courier, monospace;">:len</span>) are accepted. If the argument has no directory component, the function searches the project’s <span style="font-family: Courier, monospace;">media/audio</span> directory for a file of that name. This enables shorthand calls such as: <span style="font-family: Courier, monospace;">"marangona"</span> which looks for <span style="font-family: Courier, monospace;">media/audio/marangona </span>and plays it if found. If the file cannot be located there (and no absolute/relative path was given), an error is signalled.</p><p></p><p><strong>Example:</strong></p><p></p><p>Play the whole file:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-play-file "marangona")</code></pre><p></p><p>Play from <span style="font-family: Courier, monospace;">2.3</span> s for <span style="font-family: Courier, monospace;">2.0</span> s:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-play-file "marangona" :start 2.3 :end 4.3)</code></pre><p></p><p>Play from <span style="font-family: Courier, monospace;">2.3</span> s for <span style="font-family: Courier, monospace;">2.0</span> s, with a short <span style="font-family: Courier, monospace;">fade-in</span> and <span style="font-family: Courier, monospace;">fade-out</span>:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-play-file "marangona" :pos 2.3 :len 2.0 :fade-in 0.5 :fade-out 0.5)</code></pre><p></p><hr><p></p><p><strong><span data-ips-font-size="150"><span style="font-family: Courier, monospace;">audio-mix</span></span></strong><span style="font-family: Courier, monospace;"> </span>&amp;rest<em> tracks</em></p><p></p><p><strong>Arguments and Values:</strong></p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>tracks			Track plists. Two track kinds are recognised:</code></pre><p></p><p><strong>Audio track:</strong></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>:start			Real ≥ 0. Track offset in seconds.
:segments     	List of audio segments (SEGMENT objects or plists).</code></pre><p></p><p><strong>Per-segment keys:</strong></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>:pos/:len
 or
:start/:end		Required; window in seconds (mixed forms allowed).
:amp			(optional) real in [0, 1]. Segment-level gain (applied after track gain).
:fade-in		(optional) real ≥ 0. Fade-in time in seconds.
:fade-out		(optional) real ≥ 0. Fade-out time in seconds.
:silence		(optional) real ≥ 0. Seconds of silence inserted before the next segment.
:audio			String (single file) or list of files. If a list, files are used cyclically across segments.</code></pre><p></p><p>(Note: <span style="font-family: Courier, monospace;">:audio</span> within a segment plist is ignored by the mixer; use the track’s <span style="font-family: Courier, monospace;">:audio</span> list to vary files across segments.)</p><p></p><p><strong>Score track:</strong></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>:start			Real ≥ 0. Track offset in seconds.
:segments		List of score segments (plists).</code></pre><p></p><p><strong>Per-segment keys:</strong></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>:pos/:len
or
:start/:end		bars (integers; :len counts bars inclusively).
:tempo and :ts 	(optional) to compute wall-time when :at is omitted.
:silence		(optional) seconds, or a musical value together with :bpm.
:at 			(optional) seconds; schedules the segment at an absolute wall-time (disables cursor advance).
:score			Score designator (symbol, quoted symbol, or score object).
:ignore-ports	(optional) port filter passed to the sequencer.</code></pre><p></p><p><strong>Description:</strong></p><p></p><p>Starts an audio/MIDI scene immediately. For each track, segments are scheduled on a serial cursor beginning at :start; the cursor advances by each segment’s duration plus any :silence (score segments may instead use absolute :at). Audio segments are rendered through a multichannel mixer; score segments are compiled as required and launched on the same wall-time base.</p><p></p><p><strong>Example:</strong></p><p></p><p>Score track with notated silence:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-mix
'(:start 0.0
   :segments ((:start 1 :len 1)
              (:silence 3/4 :bpm 72)
              (:start 2 :len 1))
   :score (voice-variant1)))</code></pre><p></p><p>Score track with per-segment tempo and metre:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-mix
'(:start 0.0
   :segments ((:start 1 :end 1 :tempo 86 :ts 1/4)
              (:start 5 :end 5 :tempo 72 :ts 2/4))
   :score (voice-variant1 La-Marangona)))</code></pre><p></p><p>Score segments pinned to absolute seconds:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-mix
'(:start 0.0
   :segments ((:pos 1 :len 2 :tempo 90 :ts 4/4 :at 1.0)
              (:pos 5 :len 4 :tempo 90 :ts 4/4 :at 2.0)
              (:pos 9 :len 1 :tempo 120 :ts 3/4 :at 3.2))
   :score (La-Marangona voice-variant1)))</code></pre><p></p><p>Mixed score + audio tracks:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-mix
'(:start 1.0
   :segments ((:pos 3 :len 4) (:pos 2 :len 4))
   :score (La-Marangona voice-variant1))

'(:start 1.0
   :segments ((:start 0.0 :end 4.0 :amp 0.3
               :fade-in 1.0 :fade-out 1.0 :silence 1.0)
              (:start 0.0 :end 3.0 :amp 0.7 :fade-in 1.0 :fade-out 2.5))
   :audio ("dada" "marangona"))
)</code></pre><p></p><p><strong><span style="font-family: Courier, monospace;">AUDIO-MIX</span></strong> constructs graphs and opens resources at call time. With many tracks/segments this can introduce start-up jitter and inter-track skew. For timing-critical playback, compile first (<span style="font-family: Courier, monospace;">audio-compile-scene 'cue …) </span>and then play with</p><p>(audio-play-scene 'cue).</p><p></p><hr><p></p><p><strong><span data-ips-font-size="150"><span style="font-family: Courier, monospace;">audio-compile-scene</span></span></strong> <em><span style="font-family: Courier, monospace;">name </span></em><span style="font-family: Courier, monospace;">&amp;rest</span><em><span style="font-family: Courier, monospace;"> tracks</span></em></p><p></p><p><strong>Arguments and Values:</strong></p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>name			Symbol naming the prepared scene.
tracks			Same track plists as accepted by audio-mix.</code></pre><p></p><p><strong>Description:</strong></p><p></p><p>Prepares a <em>scene</em> for later playback. Audio tracks are stored as normalised arguments; MIDI tracks are preprocessed into runnable jobs (scores are validated/compiled). The prepared <em>scene</em> is placed in an internal registry under <span style="font-family: Courier, monospace;">name</span>. <strong><span style="font-family: Courier, monospace;">AUDIO-COMPILE-SCENE</span></strong> is designed for timing-critical playback. It prepares all audio/MIDI resources ahead of time so that <strong><span style="font-family: Courier, monospace;">AUDIO-PLAY-SCENE</span></strong> can start deterministically with minimal start-up latency.</p><p></p><p><strong>Example:</strong></p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-compile-scene
'demo
'(:audio "vox.wav" :segments ((:pos 0 :len 2.0) (:pos 3 :len 1.0)))
'(:score 'my-score :segments ((:pos 1 :len 8))))</code></pre><p></p><p>Play the <em>scene</em>:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-play-scene 'demo)</code></pre><p></p><p>Deterministic start with minimal launch latency:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-compile-scene
'cue-A
'(:audio "drums1.wav" :segments ((:pos 0 :len 8) (:pos 8 :len 8)))
'(:audio "bass3.wav" :segments ((:pos 0 :len 16)))
'(:score 'click :segments ((:pos 1 :len 16))))

(audio-play-scene 'cue-A)</code></pre><p></p><hr><p></p><p><strong><span data-ips-font-size="150"><span style="font-family: Courier, monospace;">audio-play-scene</span></span></strong> <em><span style="font-family: Courier, monospace;">name</span></em></p><p></p><p><strong>Arguments and Values:</strong></p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>name			A previously compiled scene name (symbol or string).</code></pre><p></p><p><strong>Description:</strong></p><p></p><p>Executes a scene prepared by <strong><span style="font-family: Courier, monospace;">AUDIO-COMPILE-SCENE</span></strong>. Playback starts deterministically, using the precomputed timelines, fades, and resource allocations for minimal launch latency and reliable synchronisation.</p><p></p><p><strong>Example:</strong></p><p></p><p><strong>Minimal compile then play (single audio track):</strong></p><p></p><p>Compiles a simple scene with one audio track containing two segments, then launches it. Precompilation removes set-up latency (file opening, mixer graph initialisation) from the start call.</p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-compile-scene
'mixA
'(:audio "dada"
   :segments ((:pos 0.3 :len 2.0)
              (:pos 1.3 :len 2.0))))

(audio-play-scene 'mixA)</code></pre><p></p><p>Three audio tracks with randomised segments; deterministic launch:</p><p></p><p>Builds three segment lists with <strong><span style="font-family: Courier, monospace;">AUDIO-MAKE-SEGMENTS</span></strong> (six segments each, drawn with <strong><span style="font-family: Courier, monospace;">RND-SAMPLE</span></strong>), schedules the tracks at different absolute offsets, compiles the scene, and plays it. Use a fixed RNG seed if you require reproducibility; otherwise the concrete values will vary per run.</p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(setf seg1 (audio-make-segments
            :start    (rnd-sample 6 '(0.0 3.0 6.0))
            :len      (rnd-sample 6 '(3.0 5.25 4.0))
            :amp      (rnd-sample 6 '(0.1 0.2 0.3))
            :fade-in  (rnd-sample 6 '(0.0 1.5 6.0))
            :fade-out (rnd-sample 6 '(2.5 0.5 6.0))))

(setf seg2 (audio-make-segments
            :start    (rnd-sample 6 '(0.0 3.0 6.0))
            :len      (rnd-sample 6 '(2.5 5.25 2.8))
            :amp      (rnd-sample 6 '(0.6 0.8 0.6))
            :fade-in  (rnd-sample 6 '(0.0 1.5 6.0))
            :fade-out (rnd-sample 6 '(2.5 0.5 6.0))))

(setf seg3 (audio-make-segments
            :start    (rnd-sample 6 '(0.0 3.0 6.0))
            :len      (rnd-sample 6 '(4.0 5.25 6.8))
            :amp      (rnd-sample 6 '(0.4 0.2 0.1))
            :fade-in  (rnd-sample 6 '(0.0 1.5 6.0))
            :fade-out (rnd-sample 6 '(2.5 0.5 6.0))))

(audio-compile-scene
'scene1
'(:start 0.0 :segments seg1 :audio "cello")
'(:start 2.0 :segments seg2 :audio "cello")
'(:start 3.0 :segments seg3 :audio "cello"))

(audio-play-scene 'cello1)</code></pre><p></p><hr><p></p><p><strong><span data-ips-font-size="150"><span style="font-family: Courier, monospace;">resample-to-rect</span></span></strong><span style="font-family: Courier, monospace;"> </span><em>source </em>&amp;key<em> rect out sr bits normalize taps window bp taper-ms remove-dc dither debug</em></p><p></p><p><strong>Arguments and Values:</strong></p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>source			Audio file source. Pathname designator (string or pathname). If no directory
				component is supplied, the short name is resolved in media/audio.

rect 			(optional) time–frequency selection. Supported fields (any subset):

				:time-start/:time-end
				(aliases :t0/:t1 - :u0/:u1), fractions of file length in [0,1].

				:start-sec/:end-sec
				(aliases :t0s/:t1s) - seconds.

				:i0/:i1
				sample indices (half-open: :i0 inclusive, :i1 exclusive).

				:freq-low-hz/:freq-high-hz
				(aliases :hz0/:hz1) - Hz.

				:freq-low/:freq-high
				(aliases :v0/:v1 - :f0/:f1) - Hz.

out 			(optional) base name or path (without extension) for the output file.
				Default: "rs-&lt;source-name&gt;-slice" in the project’s audio output
				location. Name collisions are resolved automatically.

sr				(optional) output sample rate in Hz. Default: 48000.

bits			(optional) output bit depth (e.g., 16, 24, 32). Default: 24.

normalize		(optional) boolean. If true, peak-normalises after DC removal and before
				taper/dither. Default: T.

taps			(optional) FIR length for the band-pass: odd integer or :auto. Default: 1025.
				Even values are promoted to the next odd.

window			(optional) FIR window (e.g., :hanning, :blackman). Default: :hanning.

bp				(optional) boolean. If true, apply a linear-phase band-pass defined by
				the resolved f0/f1 when meaningful. Default: T.

taper-ms		(optional) half-cosine edge taper per end (milliseconds). Default: 5.

remove-dc		(optional) boolean. If true, subtracts the mean per channel before
				normalisation. Default: T.

dither			(optional) boolean. If true and bits = 16, applies TPDF dither
				before quantisation. Default: T.

debug			(optional) boolean. If true, prints processing statistics to the console.
				Default: NIL.</code></pre><p></p><p><strong>Description:</strong></p><p></p><p><strong><span style="font-family: Courier, monospace;">RESAMPLE-TO-RECT</span></strong> extracts a <span style="font-family: Courier, monospace;">rectangular</span> selection in time and frequency from source, optionally applies a symmetric linear-phase band-pass, resamples to <span style="font-family: Courier, monospace;">sr</span>, post-processes to avoid clicks, and writes the result as a WAV file.</p><p></p><p><strong>Selection semantics.</strong></p><p><span style="font-family: Courier, monospace;">rect</span> may express time in fractions, seconds, or sample indices and frequency in Hz. Time bounds are mapped to frame indices using the source rate; frequency bounds are clipped to [<span style="font-family: Courier, monospace;">0</span>, <span style="font-family: Courier, monospace;">Nyquist</span>] with Nyquist = <span style="font-family: Courier, monospace;">src-sr/2</span>. Indices are half-open (<span style="font-family: Courier, monospace;">:i0</span> inclusive; <span style="font-family: Courier, monospace;">:i1</span> exclusive).</p><p></p><p><strong>Filtering.</strong></p><p>If <span style="font-family: Courier, monospace;">bp</span> is true and <span style="font-family: Courier, monospace;">0</span> ≤ <span style="font-family: Courier, monospace;">f0</span> &lt; <span style="font-family: Courier, monospace;">f1</span> ≤ <span style="font-family: Courier, monospace;">Nyquist</span>, a linear-phase FIR (<span style="font-family: Courier, monospace;">taps</span>, <span style="font-family: Courier, monospace;">window</span>) is designed and applied at the source rate. <span style="font-family: Courier, monospace;">:auto</span> chooses an appropriate length; even <span style="font-family: Courier, monospace;">taps</span> are promoted to the next odd. If <span style="font-family: Courier, monospace;">bp</span> is <strong><span style="font-family: Courier, monospace;">NIL</span></strong> or the band spans the full range, filtering is skipped.</p><p></p><p><strong>Resampling and formatting.</strong></p><p>After any filtering, the signal is band-limited resampled to <span style="font-family: Courier, monospace;">sr</span> (or left at the source rate if equal). Quantisation uses <span style="font-family: Courier, monospace;">bits</span>, with optional TPDF dither when bits = <span style="font-family: Courier, monospace;">16</span>. The output container is always WAV/PCM.</p><p></p><p><strong>Anti-click chain.</strong></p><p>Processing order is: DC removal (<span style="font-family: Courier, monospace;">:remove-dc</span>) <span style='font-family: "Times New Roman", Georgia, serif;'>→</span> normalise (<span style="font-family: Courier, monospace;">:normalize</span>) <span style='font-family: "Times New Roman", Georgia, serif;'>→</span> half-cosine taper (<span style="font-family: Courier, monospace;">:taper-ms</span>) <span style='font-family: "Times New Roman", Georgia, serif;'>→</span> optional dither (<span style="font-family: Courier, monospace;">:dither</span>).</p><p></p><p><strong>Example:</strong></p><p></p><p>Audio file data:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-metadata "marangona")
=&gt; (:format "WAVE" :ctype "PCM_16"
    :channels 2 :frames 1079210
    :src-sr 44100.0D0 :src-bits 16
    :out-sr 44100.0D0 :out-bits 16
    :i0 0 :i1 1079210
    :start-sec 0.0D0 :end-sec 24.4718820861678D0
    :f0 0.0D0 :f1 22047.794634103775D0
    :apply-bp t
    :taps 1025
    :window :hanning)</code></pre><p></p><p>The expression below extracts the time segment from sample index <span style="font-family: Courier, monospace;">23445</span> (inclusive) to <span style="font-family: Courier, monospace;">48383</span> (exclusive) of the audio source <span style="font-family: Courier, monospace;">"marangona"</span> and applies a linear-phase band-pass retaining only the frequency range <span style="font-family: Courier, monospace;">40</span>–<span style="font-family: Courier, monospace;">500</span> Hz.</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(resample-to-rect
 "marangona"
 :rect '(:i0 23445 :i1 48383 :hz0 40 :hz1 500))</code></pre><p></p><p>The result is rendered with the default output sampling parameters (sample rate and bit depth inherited from the source unless <span style="font-family: Courier, monospace;">:sr</span> or <span style="font-family: Courier, monospace;">:bits</span> are supplied) and with the original channel count preserved.</p><p></p><p>The resulting audio file is written automatically to <strong>Media/Audio/ </strong>using the project’s naming scheme and the container/encoding of the source unless overridden.</p><p></p><p>More examples:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(resample-to-rect "marangona"
                  :rect '(:u0 0.12 :u1 0.35 :v0 0.045 :v1 0.136)
                  :taps 1025 :out "rs-ma-mid" :sr 48000 :bits 24
                  :normalize t :debug t)

(resample-to-rect "marangona"
                  :rect '(:u0 0.12 :u1 0.35 :v0 0.0127 :v1 0.0136)
                  :bp t :taps 1325 :taper-ms 70 :out "rs-ma-low"
                  :sr 48000 :bits 24 :normalize nil :window :riemann)</code></pre><p></p><p></p><hr><p></p><p><strong><span data-ips-font-size="150"><span style="font-family: Courier, monospace;">audio-metadata</span></span></strong><span style="font-family: Courier, monospace;"> </span><em>source </em>&amp;key<em> rect sr bits taps window bp</em></p><p></p><p><strong>Arguments and Values:</strong></p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>source			Audio file source. Pathname designator (string or pathname).
rect			A time–frequency rectangle understood by your spectral toolkit. If NIL, the full time
				span and [0, Nyquist] frequency span are assumed.
sr 				Optional output sample rate (Hz). Defaults to the source rate.
bits			Optional output bit depth (e.g., 16, 24, 32). Defaults to the source bit depth.
taps			FIR length (odd integer) or :auto. Default 1025. Even values are promoted
				to the next odd.
window 			FIR window specifier (e.g., :hanning, :blackman).
bp				Boolean. If true, apply band-pass defined by f0/f1 (derived from rect)
				when meaningful. Default T.</code></pre><p></p><p><strong>Description:</strong></p><p></p><p><strong><span style="font-family: Courier, monospace;">AUDIO-METADATA</span></strong> computes - without performing any heavy resampling - the concrete parameters that would be applied by <strong><span style="font-family: Courier, monospace;">RESAMPLE-TO-RECT</span></strong> for the given <span style="font-family: Courier, monospace;">source</span> and <span style="font-family: Courier, monospace;">rect</span>. It returns (a) container/codec information; (b) resolved input/output sampling parameters; (c) the time selection both in frames (<span style="font-family: Courier, monospace;">:i0/:i1</span>) and seconds; (d) the frequency selection (<span style="font-family: Courier, monospace;">:f0/:f1</span>); and (e) FIR design settings (length/window) and whether a band-pass should be applied. Time bounds are mapped to frame indices using <span style="font-family: Courier, monospace;">:src-sr</span> and clipped to [<span style="font-family: Courier, monospace;">0</span>, <span style="font-family: Courier, monospace;">:frames</span>]. Frequency bounds are clipped to [<span style="font-family: Courier, monospace;">0</span>, Nyquist] with Nyquist = <span style="font-family: Courier, monospace;">:src-sr/2</span>. Even <span style="font-family: Courier, monospace;">:taps</span> are promoted to the next odd to ensure a symmetric linear-phase design. If <span style="font-family: Courier, monospace;">bp</span> is <strong><span style="font-family: Courier, monospace;">NIL</span></strong>, <span style="font-family: Courier, monospace;">:apply-bp</span> is <strong><span style="font-family: Courier, monospace;">NIL</span></strong> regardless of <span style="font-family: Courier, monospace;">rect</span>.</p><p></p><p><strong>Example:</strong></p><p></p><p>Full-file data. Looks up <strong>Media/Audio/marangona </strong>if no path component is supplied:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(audio-metadata "marangona")
=&gt; (:format "WAVE" :ctype "PCM_16"
    :channels 2 :frames 1079210
    :src-sr 44100.0D0 :src-bits 16
    :out-sr 44100.0D0 :out-bits 16
    :i0 0 :i1 1079210
    :start-sec 0.0D0 :end-sec 24.4718820861678D0
    :f0 0.0D0 :f1 22047.794634103775D0
    :apply-bp t
    :taps 1025
    :window :hanning)</code></pre><p></p><p>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">3983</guid><pubDate>Sat, 25 Oct 2025 16:59:06 +0000</pubDate></item><item><title>Opusmodus 4.0.30095 (Update)</title><link>https://opusmodus.com/forums/topic/3961-opusmodus-4030095-update/</link><description><![CDATA[<p>New:<br><br><code>open-file</code> <em>filename</em></p><p></p><p><strong>Arguments and Values:</strong></p><p><em><span style='font-family: "Courier", monospace'>filename</span></em> - A pathname designator. May be a bare name (no type) or include an extension.</p><p></p><p><strong>Description:</strong></p><p>Opens the file resolved by <code>(get-file-path FILENAME)</code> in the Opusmodus application. Signals an error if the file cannot be resolved or does not exist. The function does not write to or modify the file; it only displays it in the appropriate Opusmodus panel. This function allows you to open series of files at once.</p><p></p><p><strong>Examples:</strong></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>.lisp / .opmo → Assistant editor panel
(open-file "Load CL-Collider.lisp")

MusicXML (.xml) → Notation viewer
(open-file "Giant-Steps.xml")

PDF → Assistant panel
(open-file "IMSLP03959-Pierrot_LunaireOp21.pdf")</code></pre>]]></description><guid isPermaLink="false">3961</guid><pubDate>Mon, 18 Aug 2025 19:40:53 +0000</pubDate></item><item><title>Opusmodus 4.0.30081 (Update)</title><link>https://opusmodus.com/forums/topic/3959-opusmodus-4030081-update/</link><description><![CDATA[<p>New utility function:<br><br><code>get-file-path</code><span style='font-family: "Courier", monospace'> </span><em><span style='font-family: "Courier", monospace'>filename</span></em></p><p></p><p><strong>Arguments and Values:</strong></p><p><em><span style='font-family: "Courier", monospace'>filename</span></em> - A pathname designator. May be a bare name (no type) or include an extension.</p><p></p><p><strong>Description:</strong></p><p>Resolves a file designator to a physical pathname under the Opusmodus root, searching recursively through all subdirectories. If the designator lacks a type, the function will fall back to a list (internal) of given types. On success it returns a namestring of the resolved file. On miss it signals a warning and returns <strong><span style='font-family: "Courier", monospace'>NIL</span></strong>.</p><p></p><p><strong>Examples:</strong></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(get-file-path "Load CL-Collider")
=&gt; "/Users/opmo/Opusmodus/User Source/Extensions/Load CL-Collider.lisp"

(get-file-path "Giant-Steps.xml")
=&gt; "/Users/opmo/Opusmodus/Media/MusicXML/Jazz/Giant-Steps.xml"

(get-file-path "bach-ai")
=&gt; Warning: File "bach-ai" not found under OM root (/Users/opmo/Opusmodus/)</code></pre><p>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">3959</guid><pubDate>Sun, 17 Aug 2025 10:43:25 +0000</pubDate></item><item><title>Opusmodus 4.0.30060 (Update)</title><link>https://opusmodus.com/forums/topic/3951-opusmodus-4030060-update/</link><description><![CDATA[<p>I have added a few new commands to the <strong>Last Score</strong> menu:</p><p></p><ul><li><p>Length Graph</p></li><li><p>Pitch Graph</p></li><li><p>Velocity Graph</p></li><li><p>PPrint Score</p></li><li><p>PPrint Instruments</p></li></ul><p></p><p>I have also made improvements to PPrint Expression.<br></p><p><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4179" src="https://opusmodus.com/forums/uploads/monthly_2025_08/Screenshot2025-08-09at16_12_55.png.bad2c0da32f1295b1cad32c9cf67bd8b.png" alt="Screenshot 2025-08-09 at 16.12.55.png" style="--i-media-width: 440px" width="796" height="768" loading="lazy"></p><p></p><p>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">3951</guid><pubDate>Sat, 09 Aug 2025 14:21:21 +0000</pubDate></item><item><title>Opusmodus 4.0.30052 (Update)</title><link>https://opusmodus.com/forums/topic/3950-opusmodus-4030052-update/</link><description><![CDATA[<p>Fix to dynamic symbols (&lt; &gt;) that stop at the rests.<br><br><img class="ipsImage ipsRichText__align--block" data-fileid="4177" src="https://opusmodus.com/forums/uploads/monthly_2025_08/Screenshot2025-08-07at11_38_07.png.ddc791b5171282ca3b6b51680819bb61.png" alt="Screenshot 2025-08-07 at 11.38.07.png" width="286" height="154" loading="lazy"></p>]]></description><guid isPermaLink="false">3950</guid><pubDate>Thu, 07 Aug 2025 09:39:40 +0000</pubDate></item><item><title>Opusmodus 4.0.30003 (Update)</title><link>https://opusmodus.com/forums/topic/3945-opusmodus-4030003-update/</link><description><![CDATA[<p><strong>Autocompletion improvement.</strong></p><p></p><p>How to Use:</p><p></p><p>Type an open parenthesis followed by a letter.</p><p>Example:</p><p></p><p><code>(r</code></p><p></p><p>Press <strong>Tab</strong> to display a list of functions.</p><p>Continue typing or select a function from the list.</p><p></p><p><img class="ipsImage ipsRichText__align--block ipsRichText__align--width-custom" data-fileid="4166" src="https://opusmodus.com/forums/uploads/monthly_2025_07/Screenshot2025-07-22at15_49_48.png.088784392f0e813949a5bab999246948.png" alt="Screenshot 2025-07-22 at 15.49.48.png" style="--i-media-width: 640px" width="1576" height="1350" loading="lazy"></p>]]></description><guid isPermaLink="false">3945</guid><pubDate>Tue, 22 Jul 2025 13:59:09 +0000</pubDate></item><item><title>Opusmodus 4.0.29978 (Update)</title><link>https://opusmodus.com/forums/topic/3942-opusmodus-4029978-update/</link><description><![CDATA[<h4><strong><span data-ips-font-size="150">Enhancements and additions</span></strong></h4><p><strong><span data-ips-font-size="150">Open in External Editor</span></strong> - direct export of snippets and scores to dedicated notation editor.</p><p><br><img class="ipsImage ipsRichText__align--block" data-fileid="4155" src="https://opusmodus.com/forums/uploads/monthly_2025_07/Screenshot2025-07-17at19_07_49.png.10a25387824c398624d6c77bd22e19fb.png" alt="Screenshot 2025-07-17 at 19.07.49.png" width="1752" height="864" loading="lazy"></p><p></p><p>By default, Opusmodus uses MuseScore 4 as the notation editor:</p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(defparameter *default-notation-editor* "MuseScore 4.app")</code></pre><p></p><p>To set a different editor, replace the string with your preferred application’s name and place the expression in your User Function.lisp file (located at <strong>~/Opusmodus/User Source/Extensions </strong>directory).</p><p></p><p>Examples:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(defparameter *default-notation-editor* "Dorico 6.app")</code></pre><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(defparameter *default-notation-editor* "Sibelius.app")</code></pre><p></p><p><strong><span data-ips-font-size="150">MusicXML to Score</span></strong><span data-ips-font-size="150"> </span>- conversion of musixml file to def-score instants.</p><p></p><p><img class="ipsImage ipsRichText__align--block" data-fileid="4156" src="https://opusmodus.com/forums/uploads/monthly_2025_07/Screenshot2025-07-17at19_05_40.png.bde6a11b62c2a802609545c8eb43787f.png" alt="Screenshot 2025-07-17 at 19.05.40.png" width="1632" height="812" loading="lazy"></p><p></p><p>The output file is automatically created in the <strong>~/Opusmodus/Scores </strong>directory.</p><p></p><p></p><p><strong><span data-ips-font-size="150">Error highlight</span></strong><br></p><p>variable error:</p><p></p><p><img class="ipsImage ipsRichText__align--block" data-fileid="4157" src="https://opusmodus.com/forums/uploads/monthly_2025_07/Screenshot2025-07-17at19_04_45.png.8b7c71ad0d9b6cc7f319b8c4b758b168.png" alt="Screenshot 2025-07-17 at 19.04.45.png" width="1430" height="244" loading="lazy"></p><p></p><p>parameter error:</p><p></p><p><img class="ipsImage ipsRichText__align--block" data-fileid="4158" src="https://opusmodus.com/forums/uploads/monthly_2025_07/Screenshot2025-07-17at19_12_32.png.3ca400eaa568a2b8cb721805f611fe2d.png" alt="Screenshot 2025-07-17 at 19.12.32.png" width="1770" height="184" loading="lazy"></p><p></p><p></p>]]></description><guid isPermaLink="false">3942</guid><pubDate>Thu, 17 Jul 2025 18:31:15 +0000</pubDate></item><item><title>Opusmodus 4.0.29958 (Update)</title><link>https://opusmodus.com/forums/topic/3941-opusmodus-4029958-update/</link><description><![CDATA[<p>Fixed length symbol conversion in omn notation.</p><p>This nasty bug was introduced in the last update.</p>]]></description><guid isPermaLink="false">3941</guid><pubDate>Mon, 14 Jul 2025 13:38:34 +0000</pubDate></item><item><title>Opusmodus 4.0.29957 (Update)</title><link>https://opusmodus.com/forums/topic/3939-opusmodus-4029957-update/</link><description><![CDATA[<p>Improvements to the notation (SeeScore) display.</p><p></p><p>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">3939</guid><pubDate>Fri, 11 Jul 2025 08:19:05 +0000</pubDate></item><item><title>Opusmodus 4.0.29941 (Update)</title><link>https://opusmodus.com/forums/topic/3936-opusmodus-4029941-update/</link><description><![CDATA[<p>All three MusicXML file formats, .xml, .musicxml, and .mxl (compressed) are supported on macOS and Windows.</p><p>Small improvements to notation display.</p>]]></description><guid isPermaLink="false">3936</guid><pubDate>Thu, 03 Jul 2025 19:14:02 +0000</pubDate></item><item><title>Slim/Swank/Emacs is back</title><link>https://opusmodus.com/forums/topic/3929-slimswankemacs-is-back/</link><description><![CDATA[<p>The use of Slim/Swank is back in version 4.0.</p><p>Here are the instructions (file) on how to use it.</p><p></p><p><a class="ipsAttachLink" data-fileid="4147" href="https://opusmodus.com/forums/applications/core/interface/file/attachment.php?id=4147&amp;key=b4e50aac5eb94fe6bbdb3f35364f0fca" data-fileext="lisp" rel="">Emacs-Slime Setup.lisp</a></p><p></p><p>This file needs to be placed in the <strong>~/Opusmodus/User Source/Extensions</strong> directory.</p><p>This functionality is mainly designed for developers and users who enjoy working with the power of Emacs.</p>]]></description><guid isPermaLink="false">3929</guid><pubDate>Wed, 25 Jun 2025 10:41:33 +0000</pubDate></item><item><title>Opusmodus 4.0 (Upgrade)</title><link>https://opusmodus.com/forums/topic/3925-opusmodus-40-upgrade/</link><description><![CDATA[<h3>MusicXML to Opusmodus Notation</h3><h4>Composing • Analysing • Studying • Teaching</h4><p>The newly added functionality allows users to import compositions created in standard notation software, such as Finale, Sibelius, Dorico, or MuseScore, directly into Opusmodus. Imported MusicXML files are automatically devoiced, meaning each notated voice is separated into its own instrument part. This enables detailed computational and analytical work by allowing independent manipulation and examination of individual musical lines. Once imported, users can take full advantage of Opusmodus’s powerful tools to further transform, develop, and vary their scores. For musicologists, the advanced analytical features in Opusmodus make it easy to extract and investigate musical parameters such as pitch-class sets, rhythmic structures, and melodic contours. This algorithmic access to musical data supports rigorous research, in-depth analysis, and creative experimentation, providing a crucial link between traditional music notation and cutting-edge computational techniques within the Opusmodus environment.<span data-ips-font-size="125"><br><br>New:<br></span><span style='font-family: "Andale Mono", monospace'>musicxml-to-score<br>musicxml-to-omn<br>snippert-to-editor<br>subharmonics<br>pitch-stretch<br>harmonic-dist<br>bodeshifter<br>ring-modulation<br>pattern-mirror-symmetry<br>parallel-symmetry</span><span data-ips-font-size="125"><br><br></span>Please note that this is a paid upgrade for users who own versions 1.0 to 3.0.<br>New users who purchased a license within the last six months will receive a new license key for Opusmodus version 4.0.</p><p>The previous version, 3.0, is still available for download.</p><p>With Opusmodus 4.0, we have opened the door to the history of music at your fingertips, including your own work.<br><br>Best wishes,<br>Janusz</p>]]></description><guid isPermaLink="false">3925</guid><pubDate>Mon, 23 Jun 2025 14:23:02 +0000</pubDate></item><item><title>Opusmodus 3.0.29717 (Update)</title><link>https://opusmodus.com/forums/topic/3908-opusmodus-3029717-update/</link><description><![CDATA[<p>Just a reminder about the new functions I added in the last few updates:</p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>respell
find-chord
find-root
find-scale
chromatic-scale
filter-chromatic</code></pre><p>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">3908</guid><pubDate>Fri, 09 May 2025 11:32:20 +0000</pubDate></item><item><title>Opusmodus 3.0.29658 (Update)</title><link>https://opusmodus.com/forums/topic/3888-opusmodus-3029658-update/</link><description><![CDATA[<p>Improved the <code>RESPELL</code> function and fixed the Opusmodus GPT display issue on macOS.<br><br></p><div class="ipsRichTextBox ipsRichTextBox--alwaysopen"><div class="ipsRichTextBox__title"><p>RESPELL</p></div><p>The <strong><span style='font-family: "Courier", monospace'>RESPELL</span></strong> function is used to change the pitch names of chords to prevent the occurrence of identical note names and to avoid enharmonic duplication that could lead to notation display conflicts. This is especially useful in complex harmonic textures or clustered chord voicings, where multiple notes may share the same pitch class but require distinct enharmonic spellings for clarity. By adjusting the spelling of pitches (e.g., converting a <span style='font-family: "Courier", monospace'>cs4 </span>to <span style='font-family: "Courier", monospace'>db4</span>), the function ensures more readable and accurate notation.</p></div>]]></description><guid isPermaLink="false">3888</guid><pubDate>Thu, 10 Apr 2025 10:00:28 +0000</pubDate></item><item><title>Opusmodus 3.0.29556 (split-chord)</title><link>https://opusmodus.com/forums/topic/3837-opusmodus-3029556-split-chord/</link><description><![CDATA[<p>After receiving some feedback on the new function, I decided to expand its functionality further. I hope it will become a useful tool in various contexts of your composition.</p><p> </p><p><strong>Update 3.0.29556</strong><br> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>split-chord (chord-span sequence &amp;key
             lower-size upper-size
             lower-ambitus upper-ambitus
             lower-transposition upper-transposition
             lower-closest-path upper-closest-path
             rotation index)</code></pre><p> </p><p><strong><em>chord-span</em></strong><em> - </em>Either a single integer or a list of integers specifying the maximum span (in semitones) for chord splitting:mSingle integer: Applies the same span to all chord-splitting events. List of integers: The function loops over the list cyclically if there are more splitting events than list elements.</p><p> </p><p><strong><em>sequence</em></strong><em> - </em>An OMN sequence or list of sequences where each chord or event may include duration, pitch, velocity, and articulation.</p><p> </p><p><strong><em>lower-size</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) Specifies the chord size for the lower register: Single integer: Applies the same size to all chords. List of integers: Cycles through the list for successive chords.</p><p> </p><p><strong><em>upper-size</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) Specifies the chord size for the upper register: Single integer: Applies the same size to all chords. List of integers: Cycles through the list for successive chords.</p><p> </p><p><strong><em>lower-ambitus</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) A list of two integers (low high) specifying the ambitus range for the lower register. The ambitus function is applied to the result.</p><p> </p><p><strong><em>upper-ambitus</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) A list of two integers (low high) specifying the ambitus range for the upper register. The ambitus function is applied to the result.</p><p> </p><p><strong><em>lower-transposition</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) An integer specifying the transposition interval for the lower register.</p><p> </p><p><strong><em>upper-transposition</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) An integer specifying the transposition value of the result of the upper register.<br> </p><p><strong><em>lower-closest-path</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) Boolean (<strong>T</strong> or <strong>NIL</strong>). If <strong>T</strong>, the closest-path function is applied to the lower register.</p><p> </p><p><strong><em>upper-closest-path</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) Boolean (<strong>T</strong> or <strong>NIL</strong>). If <strong>T</strong>, the closest-path function is applied to the upper register.</p><p> </p><p><strong><em>rotation</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) A single integer or a list of integers specifying the rotation (harmonic inversion) of the chord. Single integer: Applies the same rotation to all chords. List of integers: Cycles through the list for successive chords.</p><p> </p><p><strong><em>index</em></strong><em> - </em>(optional; default: <strong>NIL</strong>) An optional variable name to which the final two-part structure is assigned. If  <strong>NIL</strong>, the function return a list of two sublists.</p><p> </p><p><strong>Description:</strong></p><p><br><strong>SPLIT-CHORD</strong> reconstructs a chordal OMN sequence into a two-part score, typically representing the left-hand and right-hand parts of a piano performance. The function operates based on chord-span constraints (defining the maximum allowable range in semitones for each individual part after splitting) and chord size constraints (defining the number of pitches assigned to the lower and upper parts). By carefully controlling these parameters, the function enables precise division of complex chordal sequences into manageable and musically meaningful components.</p><p> </p><p><strong>The splitting process adheres to the following rules:</strong></p><p> </p><p><strong>Multi-note chords:</strong> Depending on the specified chord-span and size constraints, multi-note chords are either split into two parts (upper and lower) or assigned entirely to one part, with a rest inserted in the other.</p><p> </p><p><strong>Single pitches:</strong> Individual pitches are allocated based on their range. By default, pitches below 0 (e.g., (0 = c4) -39 to -1) are assigned to the lower part, and pitches between 0 and 48 are assigned to the upper part.</p><p> </p><p><strong>Rests or negative durations:</strong> Events with no pitches or a negative duration are duplicated in both parts, placing identical rests in each.</p><p> </p><p>When chord-span, lower chord size, and upper chord size are provided as lists of integers, the function applies these constraints sequentially to successive chord-splitting events. If the number of chords exceeds the length of one or more lists, the function loops through the lists cyclically. This cyclical behaviour allows for dynamic and evolving splits, creating variation in the resulting two-part score.</p><p> </p><p>For example, if chord-span = '(13 6 4) and the sequence contains five chords to split, the spans used will be 13, 6, 4, 13, and 6, repeating as necessary. Similarly, if :lower-size is (2 0 3) and :upper-size is (1 3 0), the chord sizes for each part will follow these patterns cyclically for successive chords.</p><p> </p><p>The function supports additional flexibility through parameters like rotation, which applies harmonic inversion to chords, and ambitus, which constrains pitches to specified ranges for the lower and upper parts. Transposition and closest-path adjustments can further refine the results, ensuring the output adheres to specific musical or performance requirements.</p><p> </p><p><strong>SPLIT-CHORD</strong> is a versatile tool for converting chordal sequences into structured two-part scores, suitable for piano or other polyphonic instruments, while maintaining control over pitch distribution and musical coherence.</p><p> </p><p><strong>Example 1</strong></p><p> </p><p>Basic chord splitting:</p><p></p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(setf seq1
      '((-e. e. c1cs2bb2b3 p q. e1bb2b3cs4 mp e. bb2b3cs4e4bb4
         s bb2eb3g3b3d4 tie)
        (e bb2eb3g3b3d4 mp h. b2b3d4g4bb4 p e c1cs2bb2b3d4 mp)))</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4044" src="https://opusmodus.com/forums/uploads/monthly_2025_01/sc01.png.7cd211427d8953a02d911c315b815175.png" alt="sc01.png" width="756" height="226" loading="lazy"></p><p style="text-align:center;"> </p><p>In this example, the chord-span is set to 13 semitones, defining the maximum allowable pitch range for each individual part after splitting. No additional constraints are applied to the chord sizes for the upper or lower parts, resulting in a straightforward division into two balanced parts.</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 seq1)</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4029" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc02.png.00498c51bbee2bc67e1d45ed5e1705ce.png" alt="rc02.png" width="842" height="319" loading="lazy"></p><p> </p><p>Varying chord spans per chord:</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord '(6 13 6 13 4 4) seq1)</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4030" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc03.png.340e5b3ec30e2bee176b250d24cd0385.png" alt="rc03.png" width="899" height="296" loading="lazy"></p><p> </p><p>In this example, the chord-span remains at 13 semitones. Chord size constraints are applied such that the upper part is limited to two pitches per chord (:upper-size 2), while the lower part follows a sequence of chord sizes specified as (2 2 0 3 0) (:lower-size). Here, 0 indicates that the chord is replaced by a rest in the lower part. The function cycles through the list for successive chords, creating a texture where the upper part consistently carries harmonic content, while the lower part alternates between chords (two or three pitches) and rests.</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 seq1
             :upper-size 2
             :lower-size '(2 2 0 3 0))</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4031" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc04.png.d09002dfd22436fec72ddd354e5d02b3.png" alt="rc04.png" width="803" height="313" loading="lazy"></p><p> </p><p>In the next example, the chord-span remains at 13 semitones, but both parts alternate between rests and harmonic content. The lower part follows a sequence of sizes (2 0 2 0 2) (:lower-size), where 2 specifies two pitches and 0 indicates a rest. The upper part follows a complementary sequence of (0 2 0 2 0) (:upper-size), where rests alternate with two-note chords. This configuration creates an interlocking rhythmic texture, where one part is active while the other is silent.</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 seq1
             :lower-size '(2 0 2 0 2)
             :upper-size '(0 2 0 2 0))</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4032" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc05.png.dc089657c474471a6b3c9a535834b556.png" alt="rc05.png" width="731" height="328" loading="lazy"></p><p style="text-align:center;"> </p><p> </p><p><strong>Example 2</strong></p><p> </p><p>Chord progression (John Coltrane, Giant Steps):</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(setf giant-steps
      '((h (b3 maj7) (d3 7))
        (h (g3 maj7) (bb3 7))
        (w (eb3 maj7))
        (h (a3 m7) (d3 7))
        (h (g3 maj7) (bb3 7))
        (h (eb3 maj7) (gb3 7))
        (w (b3 maj7)) (h (f3 m7) (bb3 7))
        (w (eb3 maj7)) (h (a3 m7) (d3 7))
        (w (g3 maj7)) (h (cs3 m7) (fs3 7))
        (w (b3 maj7)) (h (f3 m7) (bb3 7))
        (w (eb3 maj7)) (h (cs3 m7) (fs3 7))))</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4033" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc06.png.bd856f3924f8bcb60e4f0e2515148fba.png" alt="rc06.png" width="1048" height="503" loading="lazy"></p><p> </p><p>In this example, the chord-span is set to 13 semitones, which defines the maximum pitch range for each individual part after splitting. Larger chords are divided so that the pitches assigned to the lower part stay within a 13-semitone range, and similarly for the upper part. No additional parameters are specified, so the chords are split purely based on this chord-span constraint.</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 giant-steps)</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4034" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc07.png.2ae4e2a40dec885fe5a20b389e6ef099.png" alt="rc07.png" width="1048" height="691" loading="lazy"></p><p> </p><p>Adding rotation and closest-path adjustment:</p><p> </p><p>In this example, the chord-span remains at 13 semitones, but additional parameters are applied to introduce more complexity and variation:</p><p> </p><p>Rotation (:rotation '(-2 -1 0 1 2 3 2 1 0 -1)): This applies a sequence of harmonic inversions to the chords, shifting their pitches cyclically for successive events. The rotation pattern follows the specified list, repeating as necessary, and introduces harmonic variation to the progression.</p><p> </p><p>Upper closest-path (:upper-closest-path t) Ensures that the notes assigned to the upper part follow the closest pitch progression, minimising leaps between successive chords. This results in smoother melodic movement in the upper part.</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 giant-steps
             :rotation '(-2 -1 0 1 2 3 2 1 0 -1)
             :upper-closest-path t)</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4035" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc08.png.0818d8ef57b56362af038158eab4940c.png" alt="rc08.png" width="1048" height="681" loading="lazy"></p><p style="text-align:center;"> </p><p><strong>Example 3</strong></p><p> </p><p>Alternating chord sizes:</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(setf seq2 '((5q g5eb5g4 mp f5b5eb6 mf d6cs6a5 mp
                 g5eb5b4g4 p b5eb6g6bb6 mp)
             (5q eb6b5 p eb6 pp b5 gs5 g6 mp)
             (5q eb6g6 g5eb5b4g4 p eb6 f b5eb6g6 p f5b5eb6)
             (5q g5b5eb6g6 b5g5eb5 mp g6 p eb6g6 b5g6bb6)))</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4036" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc09.png.c1f463607fdc38caf49a8b065cd30b2b.png" alt="rc09.png" width="1048" height="157" loading="lazy"></p><p style="text-align:center;"> </p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 seq2
             :upper-size 1
             :lower-size 2)</code></pre><p> </p><p>A maximum range of 13 semitones is allowed for splitting each chord. The upper part is limited to a single pitch per chord (:upper-size 1). The lower part is assigned two pitches per chord (:lower-size 2).</p><p style="text-align:center;"> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4037" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc10.png.33ea69a685f224467979e58faf43ff25.png" alt="rc10.png" width="1025" height="369" loading="lazy"></p><p> </p><p>In the next example the chord-span remains at 13 semitones. Chord size constraints in both the upper part and the lower part are restricted to a single pitch per chord (:upper-size 1, :lower-size 1). The rotation (:rotation -1) applies harmonic inversion to each chord, effectively shifting the chord pitches downwards by one position cyclically.</p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 seq2
             :upper-size 1
             :lower-size 1
             :rotation -1)</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4038" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc11.png.7f69319a3721252b9a4cf8d9483db058.png" alt="rc11.png" width="1025" height="317" loading="lazy"></p><p> </p><p> </p><p><strong>Example 4</strong></p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(setf seq3 '((s d3f3gs3c4e4g4 mf gs4 d4 d5)
             (s gs4 d3f3gs3c4e4g4 gs3 f5)
             (s d4 d3c4e4f4gs4d5 g4 gs4)
             (s d3c4e4f4gs4d5 d4 f3 gs5)))</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4039" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc12.png.b6ca0edc3fe314c2f7513ae83b988ee0.png" alt="rc12.png" width="907" height="136" loading="lazy"></p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 seq3
             :upper-size 1
             :lower-size 1
             :rotation 1)</code></pre><p> </p><p>This configuration results in a clear contrapuntal texture with each part featuring a single-note melodic line. The melodic and harmonic content is balanced between the two parts, while the rotation adds variety by altering the internal structure of the chords.</p><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4040" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc13.png.1136faacf1cc9db451b0a133f39d0b5d.png" alt="rc13.png" width="630" height="201" loading="lazy"></p><p> </p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 seq3
             :upper-size 2
             :lower-size 1
             :rotation 1
             :upper-closest-path t)</code></pre><p> </p><p>Closest-path adjustment (:upper-closest-path t )  Ensures that the notes assigned to the upper part follow the closest pitch progression, minimising large leaps in the melodic line.</p><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4041" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc14.png.1d5352917ffbde55580d3ae49bfe45cd.png" alt="rc14.png" width="637" height="210" loading="lazy"></p><p style="text-align:center;"> </p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(split-chord 13 seq3
             :upper-size 1
             :lower-size 3
             :rotation '(-1 0 1)
             :upper-ambitus '(0 24)
             :lower-ambitus '(-24 -6)
             :upper-transposition -12)</code></pre><p> </p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4042" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc15.png.6d8f0aa4c73ea6a48f84b6c5ad123527.png" alt="rc15.png" width="739" height="214" loading="lazy"></p><p style="text-align:center;"> </p><p></p><p>In this example, the chord-span is set to 13 semitones, defining the maximum pitch range for each individual part after splitting. The upper part is restricted to a single pitch per chord (:upper-size 1), while the lower part is assigned three pitches per chord (:lower-size 3). The rotation parameter (:rotation '(-1 0 1)) applies a cyclic harmonic inversion, with each successive chord rotated by -1, 0, or 1 positions, respectively.</p><p> </p><p>The ambitus constraints further refine the pitch ranges: the upper part is limited to pitches between 12 and 24 (:upper-ambitus '(12 24)), and the lower part is constrained to pitches between -24 and -6 (:lower-ambitus '(-24 -6)). Additionally, the upper part is transposed down by an octave (:upper-transposition -12), ensuring that its pitches remain within a specific register.</p><p> </p><p>This configuration results in a two-part split where the lower part features rich, dense harmonies within the specified ambitus, while the upper part provides a sparse, single-note melodic line transposed into a lower register. The combination of rotation, ambitus constraints, and transposition creates a dynamic, texturally varied output with precise control over pitch distribution.</p><p> </p><p></p><p></p><p><strong>Example 5</strong></p><p> </p><p></p><p>In the next example, we process and transform spectral partials into a chordal sequence and then apply the <strong>SPLIT-CHORD</strong> function to divide it into two parts.</p><p> </p><p></p><p></p><p></p><p></p><p></p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>(setf partials (library 'marangona-frames 'partials nil :collect :all))
(setf frames (spectral-to-omn partials
                              :resolution '5q
                              :min-frame-size 2
                              :min-amp 0.01
                              :min-freq 10.0
                              :max-freq 2000.0))

(self events (rnd-sample 40 (single-events frames)))
(self var-par (rnd-sample (length events) '(ro i)))
(self var (pitch-variant events :variant var-par))
(self mel-sec (rndn 6 0 (length var)))
(self mel (pitch-melodize var :section mel-sec))
(setf mat (omn-to-time-signature mel '(1 4)))
(setf trans-par (rndn (length mat) -11 11))
(setf transp (pitch-transpose trans-par mat))
(self section (get-bar '(1..8) (quantize transp '(1 2 5))))

=&gt; ((5q g2g1e1gs1g1f1fs1g1a0bb0b0c1d1eb1g1gs1b1
        cs1fs2f3g3bb3cs4fs4g4b4cs5eb5g5gs5b5eb6 . . .)

(split-chord 13 section :upper-size 3 :lower-size 3)</code></pre><p> </p><p></p><p style="text-align:center;"><img class="ipsImage ipsRichText__align--block" data-fileid="4043" src="https://opusmodus.com/forums/uploads/monthly_2025_01/rc16.png.bb93bfb1103ef5ba360cb8355216b300.png" alt="rc16.png" width="1011" height="626" loading="lazy"></p><p> </p><p></p><p>Best wishes,</p><p>Janusz</p>]]></description><guid isPermaLink="false">3837</guid><pubDate>Fri, 24 Jan 2025 15:25:44 +0000</pubDate></item><item><title>Opusmodus 3.0.29619 (Update)</title><link>https://opusmodus.com/forums/topic/3868-opusmodus-3029619-update/</link><description><![CDATA[<p>Opusmodus GPT has been integrated into the Assistant on Windows.</p>]]></description><guid isPermaLink="false">3868</guid><pubDate>Mon, 17 Feb 2025 14:11:14 +0000</pubDate></item><item><title>Opusmodus GPT</title><link>https://opusmodus.com/forums/topic/3847-opusmodus-gpt/</link><description><![CDATA[<p>ChatGPT (Opusmodus GPT) can be opened directly in the Assistant window.</p><p>This new functionality is available on both Mac, and Windows.</p><p> </p><p><img class="ipsImage ipsRichText__align--block" data-fileid="4048" src="https://opusmodus.com/forums/uploads/monthly_2025_02/chatgpt.jpg.200a14de6ce4a0721ec8a663415a39c3.jpg" alt="chatgpt.jpg" width="5120" height="2867" loading="lazy"></p>]]></description><guid isPermaLink="false">3847</guid><pubDate>Wed, 05 Feb 2025 08:42:10 +0000</pubDate></item></channel></rss>
