Playback is not tactility
Sonify started as a group project for Digital Accessibility, around one question: how does a student who cannot see a graph find out what it looks like?
The established answer is tactile. A board with pins, wire, and rubber bands. The student builds the curve and runs a finger along it, as slowly as they want, back and forth, over the same bend as many times as it takes. The pace belongs to the reader.
Most sonification tools at the time only played a curve back at you. Press play, hear it, or step through it point by point. The question we were actually trying to answer was how you make a digital version tactile, and we wanted to answer it with real-time audio generation, with the tone produced for the position you are at right now, so that dragging backwards sounds like going backwards.
Stepping with the arrow keys was in the early versions and it works fine. It was never the thing, though. The victory was continuous mouse movement in both directions. Put the pointer partway up a slope, move it back and forth, and hear the pitch follow you.
What real time cost
Python could not do it. Early builds could not keep up even with arrow-key stepping, let alone a hand dragging across the x-axis.
What made it work was pyo, a Python module with a C core built for real-time DSP. The trick is to stop thinking of it as generating audio per position: start one tone playing and keep it playing, then modify its frequency as x changes. The mapping is deliberately narrow: y drives frequency between 220 and 800 Hz, sitting at 550 when y is zero. Wide enough to hear clearly, not so wide that a tall curve becomes unpleasant to sit with.
Even with pyo, the hardware still showed. On a 2020 MacBook Air the audio lagged behind fast mouse movement; on a current desktop it never did.
There is a ceiling on the approach regardless. Neuhoff’s point in Is Sonification Doomed to Fail? is that pitch needs roughly twice the change of visual length before a person notices it, and that precision is higher visually than audibly in almost every dimension except time. He still holds that sonification has potential, provided you account for what gets lost converting a visual medium into an auditory one.
All of the above is the version we handed in at the end of the course. What the project page and the browser demo describe is a later one, which I kept working on in my own time once the course was over and which is what the repository holds now: PySide6 in place of wxPython, and any expression sympy can parse in place of three preset curves, plus control over the x-domain, timbre, and pitch range. The scrubbing interaction is the part that carried over unchanged. The original still exists on a separate branch, digital-accessibility-project, where the whole thing is one file.