Building the panner: Implementing the Object and Trigger System

After conceptualizing the panner interface as a core feature of my spatial sound toolkit, the next phase of the project shifted into technical territory. This stage involved developing both the XY panner behavior and a trigger system built directly on top of object positions. In this post, I’ll walk through how I translated the idea into code; using MAX/MSP, Max for Live andJavaScript, creating a mix of visual and hidden logic.

Starting with a simple XY Pad

My starting point was a simple XY pad. At first glance, this seemed like a straightforward way to navigate sound across a room and interact with virtual objects. But I quickly found that in its raw form, it lacked the nuance I needed; it was too binary, too linear. There was no sense of proximity, weight, or sonic gravity between the user and the objects.

So I introduced some kind of attractors.

Introducing Attractors

The new implementation allows each object in the panner to become an attractor within a customizable radius. Here’s how it works:

  1. Each object is placed at a fixed position on the grid; The user can set the position within the interface.
  2. A radius value (default: 0.5; range: 0.5–4 [coordinates]) defines how close the user’s XY slider needs to be in order to activate the attractor. This gets checked via a classic condition.
  3. If the user’s XY position falls within that radius, it triggers the attraction_value abstraction;
  4. This abstraction calculates the distance between the user position and the object using the classic formula:
    d = √([x₂ - x₁]²+[y₂ - y₁]²)
  5. This distance is then normalized between 0 and 1 based on the radius and used to control mapping parameters; in this case, faders that modulate each object’s sound layer.

This system gives users a gradient-based interaction model, where getting closer to an object increases its influence, allowing for more natural and exploratory listening behaviors. To give the creators further possibilities to influence the responsiveness, there is an additional smoothing fader, that allows control over how long panning movements need to take action (100-4000ms).

Trigger System

To complement the panner, I also implemented the trigger system that sits directly on top of the mapped objects.

To keep the patch clean and user-friendly, I wrote a custom JavaScript file;
includeTriggers.js

Using JavaScript in Max/MSP provided me with several advantages:

First of all it allows controlled patch editing without the user needing to dive into patch internals.

Further I could implement accurate placement of the trigger buttons in both the patcher and the presentation mode (which further on equals the UI of the Max for Live-Device).

I could also establish invisible connections to the send object that routes interaction to my event_trigger abstraction.

This script is activated via a simple toggle switch in the user interface. When toggled on, it triggers the following actions:

  1. Finds the correct trigger button templates;
  2. Positions them on top of the corresponding object locations;
  3. Connects them invisibly to the back-end.

When toggled off, a sister script, excludeTriggers.js, removes them from presentation mode, disabling interaction safely without deleting anything.

Using the Max for Live API

When a user activates one of the visible triggers, the event_trigger abstraction takes action. It uses the Max for Live API to launch a clip from Ableton Live’s Session View; playing a sound event specifically assigned to that object.

Each object can hold multiple events, which are randomly triggered using a round-robin system. As pointed out in the previous blog entry, this ensures variation and prevents repetition.

Learning Through the Implementation

This implementation phase was not only functional but also very much educational. Working with Max for Live’s UI elements and the API gave me a much better understanding of the platform’s architecture.

In particular, experimenting with JavaScript within Max/MSP allowed me to see and manipulate the underlying hierarchy of patch elements; something normally hidden from view. It definitely was a somewhat tedious process, that forced me to rely a lot on trial and error, due to a bad documentation. But this experiments resulted in a handful of reusable scripts like e.g. createTriggers.js and deleteTriggers.js, which I may refine further for future iterations. Same thing counts for working with Max for Live. Even though I might not use every approach I have some patches now, that I can easily adapt for other UIs.

Since I already mention, that it’s quite a new challenge for me to work with the idea of a broader usability in mind, some feedback would be really nice: So if you’re working with spatial sound, Max for Live, or experimental interaction systems and would like to test this prototype or collaborate; feel free to reach out.

WebExpo Talk #1: Nadieh Bremer

Creating an effective & beautiful data visualisation from scratch

The field trip to Prague is over, and I’ve been thinking about the really interesting talk by Nadieh Bremer. Nadieh is a freelance data visualization designer from the Netherlands, and her work focuses on turning raw data into interactive and static visual art. It was fascinating to see how she approaches data, especially since my interest in data visualization started a few years ago during my bachelor’s in graphic and information design. This talk made me think in new ways about the potential of visualizing data, and I’m excited to dive deeper into it.

One of the things that stood out to me the most during the talk was how Nadieh works with D3.js, a JavaScript library for creating (interactive) data visualizations. I was amazed by how quickly she could take raw data—just numbers—and turn them into beautiful, meaningful visualizations. She made it look so easy, and the fact that she could transform the data into something visually stunning in such a short amount of time really caught my attention. I had heard about D3.js before and had been meaning to check it out, but like most people, I never had the time. So, this talk came at the perfect moment for me, and it made me realize just how powerful and useful this tool is for working with data.

As someone who has mainly worked with data in print media, I’ve always focused on static visualizations. Most of the techniques I’ve learned are for creating things like printed charts, posters, or other fixed formats. But seeing how Nadieh used D3.js to create interactive, dynamic visualizations opened up a whole new world for me. The idea that data can be more than just something to look at on paper—that it can be experienced and interacted with—was something I hadn’t fully considered before. With D3.js, the data is not just displayed; it’s alive and engaging. You can hover over elements to get more information, zoom in to explore trends, and see the data change in real-time. This is something you simply can’t do with traditional print media, and I’m excited to explore how I could bring this kind of interactivity to my own work.

What I also found really interesting was how data can be art. Nadieh’s visualizations weren’t just about presenting data clearly; they were also about making the data visually appealing and impactful. She showed that data visualization doesn’t have to be cold or purely functional—it can be something beautiful. This idea was a bit of an eye-opener for me, as I’d always thought of data as something to be communicated in a straightforward, no-frills way. But seeing her work made me realize that data can be both informative and artistic, and it’s something I want to try in my own designs.

The talk really showed me the potential of D3.js and how it can take data visualization to a whole new level. It’s not just about making a chart or graph anymore. It’s about telling a story through data, using color, motion, and interactivity to make the information more engaging and easier to understand. This is something that I think would take much longer to achieve using traditional print techniques, and it’s a huge opportunity for people like me who are interested in graphic design and information design.

Overall, I’m really glad I got to experience Nadieh’s talk. It made me realize just how much more there is to data visualization and how powerful tools like D3.js can be for creating engaging, interactive, and even artistic visualizations. I’m excited to start experimenting with D3.js myself and see where it takes me. I’ve learned that data doesn’t have to be static and technical—it can be creative and expressive, even be used in an artistic sense. And that’s a new perspective I learned and will keep in mind as I continue to work with data.