What's on my plate right now? Improving Custom Controls!

I’m not a big fan of pre-announcing features before they’re done—especially since so many of them don’t end up making it past the finish line! So please, keep that in mind as you read on. We get a surprising number of emails about improving this area of Capo, so I’m excited to be working on something that I know will please many of you!

Right now, only users on macOS get to enjoy the use of MIDI and Keyboard shortcuts to control Capo’s features, and that needs to change! But even on macOS, this functionality could be much better than it is now.

I’ve been working on a complete overhaul of this stuff in Capo for a little while, and it’s easily one of the most complicated pieces of functionality I’ve tried to tackle! Unfortunately, it’s not something I can introduce in small pieces—there are a lot of moving parts that all need to come together at once:

  1. UI Design. This isn’t just about an attractive interface, but making something that isn’t fussy to use. I’ve experienced enough keyboard & MIDI automation UIs to know that this is tricky to get right. Also? Capo is offered in 8 languages (!) which complicates things a bit.
  2. Back-End Dispatch. Capo uses Apple’s target/action mechanism in Cocoa right now to send your Keyboard & MIDI commands on the Mac—the same system used by the main menu. This setup is not quite the same on iOS, and it’s both fragile and limited on macOS. So I have to build a replacement system, because it also needs…
  3. Support for Variable MIDI Controls. Wouldn’t it be cool if you could use a knob on a control surface, or a volume pedal attached to a MIDI floorboard controller, to control Capo’s speed on the fly. Or maybe mess with Capo’s output volume during a loop so you could hear your own playing better?
  4. Assign keyDown/keyUp Events Separately. Slightly related to the MIDI stuff, it’d be nice if you could set Capo up so that it runs playback only while a key is held down. Used in concert with the Transcription Playhead, this would make the process very responsive.
  5. A Comprehensive Dictionary of Commands. In order to make the above features work well, I need to make sure that you can do a lot with Capo.

An example of how this could work:

You would be able to assign a MIDI floor pedal separate commands when you press on it, and when you raise your foot:

  • On Press: setVolume(of: song, to: 25%)
  • On Release: setVolume(of: song, to: 100%)

Now you can temporarily duck the playback volume while looping: listen once at full volume, hold down the switch while you play, listen again on the next loop, and keep going until you’re playing what you hear.


To build these commands, I need to design a little programming language of sorts. You won’t actually be writing programs, but Capo needs to ensure that some basic rules are followed. For example, you won’t be able to ask Capo to checkMyEmail or deleteMyHomeFolder, but we also need to make sure you don’t accidentally try to setVolume(of: song, to: 350%). [1]

Anyhow, if the above “code” makes you nervous: don’t worry! This is not something that I plan to expose in this form alone. I’d like to offer something closer to Apple’s Shortcuts, or the Automator app—friendly, visual programming environments.[2]

So that’s where most of my development time’s being directed at the moment. Feel free to reply below to let us know what you think!


  1. Sure, I could just ignore these errors when you enter those commands. But I would much rather give you feedback in case you make a mistake. You don’t want to be stomping away on your floor pedal wondering why nothing’s happening, only to squint at the command you typed and find out that you missed a letter—frustrating! ↩︎

  2. I think those are a little bit too simplified (and full-featured) for this sort of thing, so we’ll see where this all ends up. ↩︎