I’d like to share a project that @quilime and I released this week.
Seaquence is a music app for iOS that enables you to compose sounds with collections of organic creatures, each with their own synth voice. It’s a full C++ rewrite of a Flash website that I co-created with Gabe Dunne and Dan Massey some years ago. More info here.
Obligatory App Store download link (It’s free)
Seaquence is built with Cinder from the ground up. We use ci::app
, ci::audio
and ci::gl
pretty heavily, along with a couple blocks that I maintain: Cinder-PureDataNode and Cinder-NanoVG.
Synth / Pure Data
Audio in Seaquence is synthesized in real time using Pure Data (via libpd) and piped into Cinder’s audio graph via a custom Node. I designed the initial sequencer implementation in Pd but the current synth is mostly @quilime’s work. My knowledge of synthesis has improved a lot since starting this project but Gabe really took the lead in designing the key features.
Pd always looks pretty messy, but I think our patch is actually fairly clean. You can see here our clock implementation, wavetables, sequencer, tone allocation, and fx chain.
Layout / Debug GUI
On a project this complex, compile times get annoying real fast. Fortunately @Simon wrote Cinder-ImGui which makes integrating Dear ImGui into Cinder projects super easy.
Over time our “Debug GUI” grew into a fairly flexible layout editor. The ability to move UI components around, change colors, test different screen sizes, and inspect values while the app is running became integral to our workflow. I think on future apps I would actually go deeper into building custom tooling. The time invested comes back in terms of quality and productivity.
Profiling
If you haven’t used a performance visualizer on your code I highly suggest doing so. Visualizers allow you to see a timeline of code execution across all threads of your application. They make it much easier to track down performance problems that are not apparent in a traditional profiler, such as lock contention and graphics pipeline stalls.
We used Microprofile, an open source profiler. There are also commercial options like Telemetry, but for a small team like ours the license was prohibitively expensive.
Microprofile runs a web server in your app which connects over a WebSocket to a browser. The detailed timeline view looks like this:
Thanks
I looked at many many different frameworks, game engines and languages before deciding to start work with C++, Cinder and Pure Data. I’m really happy that we ended up using this stack. Kudos to the Cinder team for making such a robust and portable framework \(^__^)/
I’m happy to answer any questions about Seaquence, how we used Cinder, our process, iOS dev, or any of the other tools we used.
ryan