Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

macstatic

macrumors 68020
Original poster
Oct 21, 2005
2,010
163
Norway
Is it possible to control the transport controls (play, rec, rewind etc.) in Garageband from a USB controller (regardless of brand/model)?
If so, does anyone know what types of codes and values are needed to make this work?

My Roland A-800 Pro keyboard controller is supposed to work with Garageband, but the built-in control map surely doesn't. However, it comes with an editor called appropriately A-Pro Editor which allows me to assign any sort of message to any of its buttons, knobs, faders and pads. If it at all is possible from a USB controller, with the correct MIDI CC or sysex code I suppose I could reassign the controls of my A-800 Pro myself and make it work.


Screenshot 2024-01-09 at 13.38.38.png



So far I've gone through all CC numbers (0 to 127), assigning them to the transport buttons and knobs.
Unfortunately very few of the CC numbers do anything. None of them did anything with the transport controls and there was little consistency. I added a few tracks to an empty Garageband (10.3.5) project with some of Logic's own instruments -mainly "Vintage B3 organ", "Vintage Mellotron" and "Vintage electric piano". Seems like the B3 organ takes most advatange of MIDI CC control. Here's a preliminary list of my findings (there may be other instruments with other controls that work):

  • 1 (Modulation wheel) ----- B3 organ DRAWBAR combinations/Classic electric piano TREMOLO
  • 7 (Channel volume) ----- selected track's volume
  • 10 (Pan) ----- selected track's pan
  • 64 (Damper pedal) ----- B3 organ LESLIE ROTATION SLOW-FAST/Classic electric piano HOLD notes
  • 65 (Portamento on/off) ----- B3 organ CHORUS/Classic electr. piano
  • 70 (Sound variation) ----- B3 organ 1ST DRAWBAR/Vintage Mellotron BLEND
  • 71 (Timbre/Harm. intensity) ----- B3 organ 2ND DRAWBAR
  • 72 (Release time) ----- B3 organ 3RD DRAWBAR/Vintage Mellotron RELEASE
  • 73 (Attack time) ----- B3 organ 4TH DRAWBAR/Vintage Mellotron ATTACK
  • 74 (Brightness) ----- B3 organ 5TH DRAWBAR
  • 75 (Decay time) ----- B3 organ 6TH DRAWBAR/Vintage Mellotron TAPE SPEED
  • 76 (Vibrato rate) ----- B3 organ 7TH DRAWBAR/Vintage Mellotron TONE
  • 77 (Vibrato depth) ----- B3 organ 8TH DRAWBAR
  • 78 (Vibrato delay) ----- B3 organ 9TH DRAWBAR
  • 79 (Sound control 10) ----- B3 organ 7TH+8TH DRAWBAR
  • 80 (General purpose) ----- B3 organ LESLIE ROTATION SLOW-BRAKE-FAST
  • 82 (General purpose 7) ----- B3 organ ORGAN VERB
  • 85 (Controller 85) ----- B3 organ CHORUS
  • 91 (Reverb send level) ----- B3 organ ORGAN VERB
  • 92 (Tremolo depth) ----- B3 organ LESLIE ROTATION SLOW-BRAKE-FAST
  • 94 (Celeste detune depth ----- B3 organ PERCUSSION OFF-2ND (only works if CC 95 is in PERCUSSION 2ND mode)
  • 95 (Phaser depth ----- B3 organ PERCUSSION OFF-2ND (only works if CC 94 is in PERCUSSION 2ND mode)
  • 111 (Controller 111) ----- B3 organ DISTORTION
  • 113 (Controller 113) ----- B3 organ CLICK

So, having tried all of the MIDI CC numbers, what else can I try, and which values? I'm thinking if any USB controller does work with Garageband (I believe having read that Korg NanoKontrol/NanoKontrol 2 does, but I can't confirm this as I don't have one) then they might be using MIDI sysex (which would be quite a lot trickier than just checking the 127 different CC numbers, as I'd need the exact codes...)
Anyone know more about this?
 
Last edited:

mteep

macrumors newbie
Aug 8, 2016
6
3
Yes, there are at least two ways, depending on which versions of GarageBand you are able to run on your Macs.

For older versions, up to at least GarageBand 10.4.3 (on Intel processors), you can download a "Control Surface Plug-in for Logic and GarageBand" from Roland. It seems you'll find it here. You could try that first.

In newer versions of GarageBand, starting with 10.4.4, for both Intel and Apple Silicon, the use of compiled "MIDI Device Plug-ins" has been replaced with scripts in the Lua language. (On Intel, there may be versions where both plug-ins and scripts work.)

Unfortunately, at a quick glance I couldn't find any obvious such "MIDI Device Scripts" from Roland. It is possible to create such a script yourself, but it is somewhat involved as the format is undocumented. However, a lot could likely be pieced together from the A-500Pro Lua script already hidden deep in your GarageBand app and existing "Control Surface Scripts" from Korg or Native Instruments.

I won't go into detail on how this works right now, but basically any MIDI messages that a MIDI controller can produce can be mapped into almost any GarageBand controls, such as the transport controls, track volumes, balance, selection, mute, solo et c. (I have done this myself for the M-Audio Oxygen 49 MkIV.) Let me know if this is something you want to try and I can likely get you started with something that mostly should work.
 

macstatic

macrumors 68020
Original poster
Oct 21, 2005
2,010
163
Norway
Yes, there are at least two ways, depending on which versions of GarageBand you are able to run on your Macs.

For older versions, up to at least GarageBand 10.4.3 (on Intel processors), you can download a "Control Surface Plug-in for Logic and GarageBand" from Roland. It seems you'll find it here. You could try that first.

Yes, this is what I've had installed all along.
But apparently it doesn't do what it's supposed to or the documentation from Roland is completely off (there's a PDF that comes with the A-Pro Garageband/Logic plugin download which explains what each knob, fader or button on the keyboard does within Logic or Garageband).

According to the docs I should be able to use the transport controls, select tracks, move the playhead position and more, but the only response I can get is changing the current track's volume and pan position, and some instrument functions (like the B3 organ's drawbar positions).
The documentation says nothing about which of the many preset control maps inside the keyboard I should be using, but common sense tells me to use the one named "15 Garageband".
I've also tried other control maps and with the "ACT" button on and off, but it still won't work as the docs tell me.

I did notice that the manual says "Copyright (c) 2010 Roland Corporation", so could it be that it once did work as intended, but only with the Garageband/MacOS version at the time? This would be kind of strange though, because Roland's A-800 Pro download page has different driver versions available (up to Ventura 13.x), but there's only one Logic/Garageband plugin. It would be interesting to install MacOS 10.5 Leopard along with Garageband for that OS and see how it all behaves, but I'm not sure if my mid-2010 Mac Pro will allow me to go further back than MacOS 10.6 Snow Leopard, and besides I'd have to swap my old graphic card back in, so it'll be a hassle and still won't solve my problem as my everyday OS now is 10.14 Mojave.


What's the Garageband/Logic plugin for the Roland A-Pro supposed to do anyway? And why is there a Garageband control map in the keyboard itself which can be selected (likewise, there are multiple control maps for Logic as well as Cubase, Sonar and others). Does the plugin bypass whatever the control map is configured to, or do they somehow reply on each other?

Understand that the A-Pro editor software allows me to edit those control maps, I've experimented by creating new configurations which I can store on my Mac as backup as well as can transmit over to the keyboard for my own user-defined control maps.
So in order to try and understand some more I also did the opposite (receive the "15 Garageband" factory preset control map from the keyboard over to the A-Pro editor) just to investigate how it was set up.
Surprisingly only a few of the controls were defined as you can see here (all the pink labels shows them as undefined:
Screenshot 2024-01-12 at 09.30.01.png


Yesterday (along with my first posting here) I played around with a copy of the Garageband control map, assigning new CC values to each of the controls, going through all of the 127 available ones, then transmitting my changes over to the keyboard, which I posted my finding for in that previous posting.
Regardless, I'm not getting to control Garageband as the manual says (transport controls, selecting tracks etc). What a puzzle!



In newer versions of GarageBand, starting with 10.4.4, for both Intel and Apple Silicon, the use of compiled "MIDI Device Plug-ins" has been replaced with scripts in the Lua language. (On Intel, there may be versions where both plug-ins and scripts work.)

Ah! That sounds promising! But which MacOS version does Garageband 10.4.4 come with?
Because of still using some older software and MacOS 10.14 Mojave being the final OS being able to run on my mid-2010 Mac Pro I'm sort of stuck at 10.14 (yes, I know 10.15 and higher can be installed using different hacks, but that would cause other issues for me including losing older unsupported software I still rely on).


Unfortunately, at a quick glance I couldn't find any obvious such "MIDI Device Scripts" from Roland. It is possible to create such a script yourself, but it is somewhat involved as the format is undocumented. However, a lot could likely be pieced together from the A-500Pro Lua script already hidden deep in your GarageBand app and existing "Control Surface Scripts" from Korg or Native Instruments.

That would be cool, but probably not doable with my OS.
But provided that my Garageband version (10.3.5) has the ability to have its transport controls, selecting tracks, recording/mute/solo modes etc. from an external hardware controller, then surely it's just a matter of taking notes of those sysex values or whatever, then (using the A-Pro editor) create a new control map with the appropriate Roland A-800 Pro buttons/knobs/faders/pads assigned to those values?
I suppose using something like the Snoize MIDI monitor app could aid in reading the MIDI sysex code sent from a controller that already works properly with Garageband.


I won't go into detail on how this works right now, but basically any MIDI messages that a MIDI controller can produce can be mapped into almost any GarageBand controls, such as the transport controls, track volumes, balance, selection, mute, solo et c. (I have done this myself for the M-Audio Oxygen 49 MkIV.) Let me know if this is something you want to try and I can likely get you started with something that mostly should work.

Are you referring to any Garageband version, or just from 10.4.4 and onwards?
Would my version 10.3.5 be "hard-coded" for just a few functions allowing to be externally controlled, or does just about every function have a specific CC and/or Sysex value assigned to it, so it's just a matter of knowing which value should be assigned to a given USB controller?
(while with Garageband 10.4.4 and onwards you can effectively forget about what Apple has pre-defined and define your own from scratch?).
 

mteep

macrumors newbie
Aug 8, 2016
6
3
Yes, this is what I've had installed all along.
Oh, I didn't realize this. But I too noticed that the Roland plug-in was quite old. It is possible that it no longer works on newer macOS/GarageBand versions for some reason.

Ah! That sounds promising! But which MacOS version does Garageband 10.4.4 come with?
Because of still using some older software and MacOS 10.14 Mojave being the final OS being able to run on my mid-2010 Mac Pro I'm sort of stuck at 10.14 (yes, I know 10.15 and higher can be installed using different hacks, but that would cause other issues for me including losing older unsupported software I still rely on).
Not sure which macOS version is required for GarageBand 10.4.4, but 10.4.6 needs Big Sur, which the MBP you also seem to have can run quite well using OCLP. (I do just that.) Officially, that MBP supports Catalina (10.15), which might suffice.

What's the Garageband/Logic plugin for the Roland A-Pro supposed to do anyway? And why is there a Garageband control map in the keyboard itself which can be selected (likewise, there are multiple control maps for Logic as well as Cubase, Sonar and others). Does the plugin bypass whatever the control map is configured to, or do they somehow reply on each other?

To fully explain this requires a bit of background (mostly an educated guess) ...

GarageBand and Logic are built on more or less the same foundation. Logic exposes much more configuration to the user, but underneath the UI, they work practically the same. Thus, in order to understand how a MIDI controller can control GarageBand, it might help to study how this can be configured in Logic. There is extensive user documentation for Logic available online. (I have only glanced through some of it.)

There is likely no fixed mapping from MIDI messages to anything in Logic/GB. (Possibly not even notes.) It is all configurable in an internal model with at least two levels. (Reasons include flexibility, historical lack of standardization, limited bandwidth of original MIDI, and more.)

To explain the internal model I will use two concepts called control and assignment. That might not be the best names, but there are reasons I use them that hopefully will be apparent. I'll use examples from a Roland A-Pro(?) in Lua table syntax.

A control is a representation of something you can touch, like a knob on a MIDI controller, as far as Logic/GB can tell. A control seem to at least need to have a name, and often also an integer ”controlID”. It also has some sort of type, like ”Knob”. Finally it needs some way for Logic/GB to know that it has been modified, typically a MIDI message, possibly with a variable portion.

Code:
items = {
    -- The default midiType is 'Absolute', it only has to be defined, if it is different
    {name='Knob 1', label='R1', objectType='Knob', midi={0xB0,0x4A,MIDI_LSB}, inport='A-PRO 1'},
    {name='Play', label='L6', objectType='Button', midiType='Momentary', midi={0xB0,0x1A,MIDI_LSB}, inport='A-PRO 1'},
    {name='Record', label='L8', objectType='Button', midiType='Momentary', midi={0xB0,0x1C,MIDI_LSB}, inport='A-PRO 1'},
}

(Controls can also be activated by other means than MIDI. Logic/GB supports the OSC standard for networked control surfaces, like Apple’s own Logic Remote app for iPad/iPhone.)

An assignment is a connection between a control and some functionality in Logic/GB. There is a lot I don’t know about these, but it seems not all assignments are active at the same time. Rather, many seem to be grouped into ”zones”, which I guess roughly corresponds to areas of the user interface. There are many ways to specify the functionality. In some cases it isn't even necessary as there is some sort of fuzzy default based on the control name.

Code:
assignments = {
    {zone='Transport'},
    {control='Play', keyCmd=535},
    {control='Record', keyCmd=7},

    {zone='Knob'},
    {control='Knob 1', faderBankTrack=0, trackParam=AUPAN, paramName='@tp'},
}

I don’t yet know if there need to be a strict one-to-one mapping between functionalities and controls.

Now, what the old plug-ins and the newer scripts do is quite simple. They can add controls, and assignments. Some also configure the MIDI controller, typically using SysEx messages. Others include a message that you should select a particular preset on your controller.

A funny thing is that even your GarageBand version (10.3.5) includes MIDI Device Scripts for many MIDI controllers. They are part of the MACore framework which Logic also uses. It's just that they only define controls, not any assignments, and thus aren't useful as-is in GarageBand. In Logic they presumably make the user assignments easier by providing control characteristics. (I assume the user essentially can create new controls in Logic too, from any MIDI message.)

But provided that my Garageband version (10.3.5) has the ability to have its transport controls, selecting tracks, recording/mute/solo modes etc. from an external hardware controller, then surely it's just a matter of taking notes of those sysex values or whatever, then (using the A-Pro editor) create a new control map with the appropriate Roland A-800 Pro buttons/knobs/faders/pads assigned to those values?
I suppose using something like the Snoize MIDI monitor app could aid in reading the MIDI sysex code sent from a controller that already works properly with Garageband.
No, a particular plug-in or script is only fully activated if the accompanying controller is connected. This can be verified in a couple of different ways, that differs between plug-ins and scripts, and may differ slightly across Logic/GB versions. Ways include MIDI Manufacturer/Device names, MIDI Identity Reply, USB VID/PID.

So, your in order for your idea to emulate another MIDI controller to work you would have to emulate the characteristics the plug-in uses to verify the type of controller. I don’t think that’s feasible in most cases.
 

macstatic

macrumors 68020
Original poster
Oct 21, 2005
2,010
163
Norway
Oh, I didn't realize this. But I too noticed that the Roland plug-in was quite old. It is possible that it no longer works on newer macOS/GarageBand versions for some reason.

Thanks for taking the time to explain all this. Apparently it's not as simple as I first thought (anything involving computers usually isn't ;) ).

For the record, I also have Logic Pro X (10.5.1).
I like both (Logic for its extensive features and Garageband for its ease of use/more uncluttered user-interface and quicker startup time). Garageband is also nice due to the fact that I still consider myself a (slightly more advanced now) newbie to the world of DAWs (coming from a more traditional 80's/90s MIDI hardware setup), so it helps me adapt to using software instruments and effects.
Honestly, I do find both Logic and garageband frustrating to use because of all the mouse pointing/clicking and menu-diving. I miss the good old days with physical knobs and buttons on synths, samplers, mixers and effects, so this is the main reason I need to get the control surface thing going -so I can get physical controls for the most often used tasks.
But I digress....

Here's the thing: with Logic I know that I can resolve the issue because it has a "learn" function for re-assigning control surface controls, but this also further confuses the issue because I don't quite understand the relationship between the control surface plugin and the A-Pro keyboard's own "control maps". I firgured that if I can better understand how Garageband handles this I would at least understand which A-Pro control map I should be using (and possibly reconfigure using the A-Pro Editor app.

As for the Roland control surface plugin: I'm now trying things without it, and sending CC messages from the keyboard to Garageband still works, and as far as I can tell (I'm about halfway testing all the CC numbers without the Roland control surface plugin for Garageband/Logic) I get the same response both with or without the plugin. In other words: the control surface plugin appears to do nothing, while the different CC values do something as posted earlier.
PS: I did come across a few additional CC values that did something, which I hadn't caught last time: I really should test them all with a fader or knob (as opposed to a button or pad) because some of them don't reveal that they do something with just the on/off action that a button does.



Not sure which macOS version is required for GarageBand 10.4.4, but 10.4.6 needs Big Sur, which the MBP you also seem to have can run quite well using OCLP. (I do just that.) Officially, that MBP supports Catalina (10.15), which might suffice.

Yes, that would probably work. I prefer keeping the same OS for both Macs (so as not to cause any possible file-incompatibility issues between different versions of apps, but perhaps I can create a temporary external test drive setup for this).


There is likely no fixed mapping from MIDI messages to anything in Logic/GB. (Possibly not even notes.) It is all configurable in an internal model with at least two levels. (Reasons include flexibility, historical lack of standardization, limited bandwidth of original MIDI, and more.)

So the limitations I experienced when testing all the 127 CC values don't necessarily mean that's the end of it!?

To explain the internal model I will use two concepts called control and assignment. That might not be the best names, but there are reasons I use them that hopefully will be apparent. I'll use examples from a Roland A-Pro(?) in Lua table syntax.

I'm not sure if I fully understood that, but would it be correct to say that whatever the USB controller sends to the Mac (and in turn Garageband or Logic), be it MIDI sysex, CC or some other type of signal; it isn't received directly into the DAW but translated into some other internal language/format which those DAWs use?
And the reason just a little portion of the CC parameters I've tried works is because there hasn't been written a "receiving end" in Garageband for those signals or parameters. In other words: regardless of what is sent from the A-Pro keyboard, Garageband doesn't have any provision for understanding it.

Maybe I'm way off in my understanding, but I do have a question to summarize it all up:
apart from assigning the different MIDI CC parameters to the faders, knobs etc. that did something in Garageband (the list I made in my previous post), what else can I try to send from the A-Pro keyboard in order to control other things in Garageband (such as the transport controls)?
...... or.. is there really not much more I can do from "my end" (configuring the A-Pro keyboard to send specific signals/messages from each knob or fader) as most of this relies on what Apple has already done in Garageband and/or what Roland has already done in their control surface plugin?



Now, what the old plug-ins and the newer scripts do is quite simple. They can add controls, and assignments. Some also configure the MIDI controller, typically using SysEx messages. Others include a message that you should select a particular preset on your controller.

Basically add more functionality to understanding the A-Pro keyboard than what Garageband can already do by default? Recognize special functions of the keyboard and "translate" these into whatever those functions are supposed to do into a "language" that Garageband understands?

So, provided my previous question above (is there anything more I can assign on the keyboard itself to make all this work?) is irrelevant, I suppose the solution must lie at Garageband's end, meaning someone has to write a new, working Roland A-Pro control surface plugin (which isn't very likely from what I understand after having read other online posts -that Roland isn't bothered actively supporting this keyboard any more, even though it's still available for purchase), or in the case of Garageband 10.4.4 or later, write a new script (provided you have the knowledge) for Garageband and this keyboard?


No, a particular plug-in or script is only fully activated if the accompanying controller is connected. This can be verified in a couple of different ways, that differs between plug-ins and scripts, and may differ slightly across Logic/GB versions. Ways include MIDI Manufacturer/Device names, MIDI Identity Reply, USB VID/PID.

So, your in order for your idea to emulate another MIDI controller to work you would have to emulate the characteristics the plug-in uses to verify the type of controller. I don’t think that’s feasible in most cases.

So in conclusion I understand that not much can be done to get the transport controls etc. of my A-Pro keyboard to work with Garageband (at least not my earlier-than-10.4.4. version), but with Logic it's a completely different story as I can use the user-configurable control surface assignment feature, right?
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.