Update: I've made progress and now have a completed piece that uses Tidal with OSC and audio output to MaxMSP. There are some limitations to my OSC parsing in Max, so there is more work to do. But I'm happy to have a working solution with a finished piece.
- Livecoding with screen recording: Scrapes - composed livecoding performance with TidalCycles - YouTube
- Code files in GitHub: livecoding/tidal/scrapes at main · HighHarmonics2/livecoding · GitHub
The objective was to be able to use custom signal processing and effects in Max, from the livecoding interface in Tidal. Additionally, I wanted to route both audio (from SuperDirt/SuperCollider) and OSC to to Max while controlling changes in Tidal.
Audio processing
- custom samples in SuperDirt/SuperCollider
- customized SuperDirt start file, with 24 channel ~dirt.orbit routing
- Loopback audio device for multi channel routing (Blackhole also works)
- Max audio input from Loopback device
- routing in Max to use VST/AU filter plugin for each channel
- output from Loopback to OBS for screen recording with audio
OSC processing (Tidal)
- Used the "Multiple targets" model defined in the Configuration > OSC section of the Tidal Docs (OSC goes to SuperDirt and to MaxMSP)
- Code added for OSC target, parameter mapping, OSC stream, etc.
- Mapped parameters for effects & plugins hosted in Max
- Stereo delay: delayTimeL, delayTimeR, feedbackL, feedbackR
- VST plugin filters: VSTparam1-6
OSC processing (Max)
- udpreceive object -> route the OSC /play address defined in OSC target
- route an OSC address for each Tidal channel (x1, x2, x3, etc)
- In each Max channel:
- unpack (break out the OSC list values)
- send individual parameter values to the delay and VST plugin objects
NOTE added after writing this post. This limitation is incorrect. (See below.)
Limitation: I do not have detailed time based processing of OSC messages in Max. The OSC messages come at the beginning of the cycle. Each message does contain timing values, which can be evaluated and processed in Max for precise timing of any parameter changes. But that was more work and learning than I was up for! For this usage - I was content with changing effects values with the cycle and quickly adapted to that in my livecoding.
For any Max users interested - the GitHub link above includes all of my code - the Tidal livecoding, Tidal OSC mapping, and the MaxMSP patch.