PE, April 2026
Table of Contents
Introduction
Click here for Google Gemini AI Generated Summary
This page documents the development of Rotation Primitives, a system created by Philip Edelstein for orchestrating rotating loudspeakers within Ableton Live and Max MSP.
The project focuses on extending the control of kinetic audio objects, such as triple-rotator speakers, by using specialized software “nodes” to manage horizontal positions, rotation rates, and vertical speaker independence.
Key Components of the Orchestration Layer
NodeRotMap8: A Max for Live (M4L) utility that integrates the rotator controls directly into Ableton, allowing parameters to be mapped to the DMXIS device for hardware control.
node_single_rotatorV1.maxpat: A Max patch that acts as a spatial controller. It offers two movement modes:
Standard Rotation: Uses a simple circular path driven by a phasor.
Clifford Attractor: Generates complex, chaotic, and organic movement patterns using fractal math.
Proximity Engine: A core node (RotSprk-ProximityCore-v2.amxd) that handles the spatial logic. Newer versions are being developed to support multiple instances by using automatically generated instance numbers.
Notes here are intended to provide necessary details to extend work to date for orchestration of Rotating Speakers to better support devices such as the triple rotators supporting horizontal position or rotation rate and 3 independent vertical speakers.
As part of the Rotating Loudspeaker project orchestration layer, I developed an M4L Device that supports basic rotation controls that can be mapped to Ableton variables and the “Proximity Engine” node.
Node: to date, the RotSprk-ProximityCore-v2.amxd works as a single instance in an Ableton set due to hardcoded Max send and receive objects. A new version of this and the underlying subpatches in progress that uses automatically generated instance numbers to allow multiple instances.

node_single_rotatorV1.maxpat
This is a work in progress for use in Ableton and Max Patches for controlling sound and kinetic objects such as rotating loudspeakers and associated audio contexts.
Google Gemini is used to describe the function of the patch.
Presentation View node_single_rotatorV1.maxpat

Record / Play Control embeded in node_single_rotatorV1.maxpat
A mechanism is provided to record and playback motion.
A pulldown menu provides selection of:

- Stop
- Play
- Loop 0 disables the play loop
- Loop 1 enables the play loop
- Record starts recording the movement
- Read reads a file of the movement
- Write writes a file of the recorded movement
Patching View node_single_rotatorV1.maxpat

Gemini AI explanation of the max patch
Prompt: explain this max patch (text of patch loaded into the browser)
—————– Gemini Response –
This patch, titled node_single_rotatorV1.maxpat, is a sophisticated spatial or parameter controller designed to move a “node” (a data point) in a circular or complex geometric pattern. Based on the file path and objects, it’s part of a “Pepscillator” project, likely used for controlling a Rotary Speaker simulation or a panning effect.
Here is the breakdown of how it works:
1. The Core Engine: Movement
The patch features two distinct modes of movement, controlled by the obj-32 toggle (labeled “Clifford” in the presentation):
- Standard Rotation (The “Simple” Mode): It uses a
phasor~(an audio-rate ramp) converted to control data viasnapshot~. This drives acosandsinrelationship to create perfect circular movement for a node. - Clifford Attractor Mode: When toggled, the data flow shifts to a
bpatchercalledclifford-worker. This uses a mathematical Clifford Attractor (a type of chaotic fractal) to generate more organic, non-repeating, and complex movement patterns rather than simple circles.
2. The “Nodes” System
The patch uses two nodes objects (obj-48 and obj-1). In Max, nodes is a UI object used to map 2D space.
- It appears the patch takes the mathematical output (the circle or the attractor) and uses it to “drive” the position of Node 1.
- This position is then sent out via
send nodectl, likely to an external audio processing patch that handles the actual panning or filtering of the audio.
3. Key Controls (The UI)
You have several parameters that shape the movement:
- Rate (
obj-38): Controls how fast the rotation or the attractor updates. It scales between 0.002 and 0.5. - Scale (
obj-42): Controls the “width” or “depth” of the movement—essentially how large the circle or pattern is. - Phase (
obj-16): Offsets the starting point of the rotation. - Node Number (
obj-70): Allows you to specify which node (if there were multiple) is being commanded.
4. Data Recording & Playback
The bottom-right section (objects like mtr 10, umenu, and obj-75) is a multi-track recorder.
- The
mtrobject allows you to record the movement of the nodes and play it back. - The menu contains standard transport commands:
play,stop,record,loop, andwrite(to save the movement data to a file).
5. Automation & Presets
thispatcher&zoom_ctl: These are utility objects used to manage the window size and UI scaling, making it act more like a professional plugin interface.- Message Boxes (
obj-6andobj-40): These contain “presets” for the Clifford Attractor, instantly setting the $a, b, c, d$ variables to specific values to generate different chaotic shapes.
Summary of Logic Flow:
- Clock: A
metroorphasor~provides the timing. - Generator: Either a Sine/Cosine pair or a Javascript/Clifford math script generates X/Y coordinates.
- Mapping: Those coordinates are scaled and sent to the
nodesobject. - Output: The final X/Y position is broadcast via
s nodectlto affect your sound. - Storage: The
mtrcaptures these movements if you want to repeat a specific performance.
Is there a specific part of the math (like the expr objects) or the recording logic you’d like me to dive deeper into?
node_rotator_manyV1.maxpat
This is a bundle of 4 node_rotator_singleV1.maxpat with the addition of a Mira iPad interface. The “Rotator Many” panel surfaces as a tab in Mira on an iPad and integrates into Ableton via NodeRotMap8.maxpat as adapted from M4LRotSkpkrMap8.amxd.

iPad Mira
here is a screen snapshot of the the Rotator Many tab from an iPad. (needs further explanation)

M4LRotSkpkrMap8.amxd Base
This M4L utility that was developed to Map the Proximity Engine to the DMXIS Device was used as basis for integration of the node_rotator_manyV1.maxpat.

NodeRotMap8
As part of the RotSkpkrMap8.amxd core engine for Rotating Speaker Pepscillator, this utility M4L NodeRotMap8.amxd was developed that integrates the node_rotator_manyV1.maxpat into Ableton extending the earlier M4LRotSkpkrMap8.amxd Base.
The M4LRotSpkrMap8.amxd was used as seed for integrating the node_multi_rotatorV1.maxpat into Ableton via the NodeRotMap8.amxd Ableton M4L device.
Ableton Device View

Pop Out View

File Manifest
Screen Snapshot from File List

Copy and Paste as Text
Externals and subpatcher files for NodeRotMap8:
Abstraction M4L.MapButtonMultiSingle.maxpat M4-T7:/Users/philed/Documents/Max 9/Max for Live Devices/NodeRotMap8 Project/patchers/M4L.MapButtonMultiSingle.maxpat
Abstraction clifford-worker_2025-10-17.maxpat M4-T7:/Users/philed/CLIFFORD/clifford-worker_2025-10-17.maxpat
Abstraction node_rotator_manyV1.maxpat M4-T7:/Users/philed/Desktop/PepscillatorRotSpkr Project/Presets/Audio Effects/Max Audio Effect/node_rotator_manyV1.maxpat
Abstraction node_single_rotatorV1.maxpat M4-T7:/Users/philed/Desktop/PepscillatorRotSpkr Project/Presets/Audio Effects/Max Audio Effect/node_single_rotatorV1.maxpat
Abstraction show_hide_worker.maxpat M4-T7:/Users/philed/Desktop/MAX8/MAXPAT/show_hide_worker.maxpat
Abstraction window_zoom.maxpat M4-T7:/Users/philed/Desktop/MAX8/MAXPAT/window_zoom.maxpat
Abstraction zoom_ctl.maxpat M4-T7:/Users/philed/Desktop/MAX8/MAXPAT/zoom_ctl.maxpat
Other Dependencies
- Install the Mira Package in MAX from the Max Package Manager.
- Install Mira iPad App on iPad from App Store.
To Do
- Further testing
- Usability and UI enhancements to NodRotMap8 and documentation
- Export files to Zip File
- Installation Instructions and guidance
Feature Enhancement
Presets
In addition to the extent controls, consider using the MAX “pattr” objects to store and retrieve presets that can be selected via a Midi control surface (e.g. Novation XL, Akai Mini), Mira or other OSC or Midi interfaces.
This would support both jumps between presets or cross fade between any two.
Click here for detail
I have a MAX abstraction that wraps an MAX abstraction supporting: store and select preset, cross fade, auto-sequence, file save and restore. (add documentation here)
Correlation Control
Link chain by phase.
Mapping for DMX
NodeRotMap8 is coupled to the RotSprk-ProximityCore-V2 “node” instance via Max “send nodectl” message.

Need to verify that the Map instance in NodeRotMap8 are the right range to the DMXIS Device.
rot-spkr-dmx-v5d Ableton Set
Ableton Set with example of the NodeRotMap8.amxd

Preset Storage and Playback (experimental work in progress)
Max provides a robust set of control objects for saving, selecting and manipulating presets. As of April 30, a prototype is presented here combining the generic_patch_state.maxpat custom “pattr” control with the “node_rotator_manyV1.maxpat“.
These initial notes are a review of a possible full implementation for Rotating Loudspeaker orchestration.
Next steps:
- enable all relevant objects (for example include the offset and master node). There are some pre-existing enabled parameters shown as examples.
- consider interactions with the node_rotatorV1 menu (stop, play. loop 0, loop 1)
- identify reasonable means to control from a Midi Control Surface (for example punch between presets, set From->To and fader for interpolation
- integrate into an amxd for using within Ableton.
Notes here showing work in progress using the “pattr” system for node_rotator_manyV1.
A previous MAX object “generic_patch_state” runs in a bpatcher taking for arguments the name of the target patcher for preset automation. The MAX “autopattr” object was added in the target (node_rotator_manyV1).
A new MAX object ” pattr_note_rotator_manyV1.maxpat” was created as a prototype …

A Show/Hide switch selects between a simple “recall” panel with a set of radio buttons that fetches presets 1-9 (see Storage Window)

The Show/Hide button reveals additional controls … (need work on colors for improved legibility).
The added control are for:
- cross fading (interpolating) between Recall presto to the To target
- storing the presets (select storage row and press “set store”
- the “read” and “write” is for labels shown in the base view. (stored in a separate text file for example pattr-labels.txt)
#X set 0 1 Preset 1;
#X set 0 2 Preset 2;
#X set 0 3 My magic numbers;
#X set 0 4 another preset;

Menu Selections

| Selection | Function |
| clientwindow | open Client Window showing current setting |
| storagewindow | open Storage Window showing value of presets |
| readagain | re-read the current preset file |
| writeagain | re-write the current preset file |
| read | read a preset file |
| write | write a preset file |
Client Window

Storage Window

Cross Fade
one of the build in capabilities is crossfading between two presets. This slider (needs a lable).

allows moving interpolates between two presets. For example…

Sample Snippet of the Preset Storage JSON File
This is written and read by the patch and is not typically hand editted. Contains all the values for the storage presets “slots”.

File Control
See MAX documentation

