Loopy Pro: Create music, your way.

What is Loopy Pro?Loopy Pro is a powerful, flexible, and intuitive live looper, sampler, clip launcher and DAW for iPhone and iPad. At its core, it allows you to record and layer sounds in real-time to create complex musical arrangements. But it doesn’t stop there—Loopy Pro offers advanced tools to customize your workflow, build dynamic performance setups, and create a seamless connection between instruments, effects, and external gear.

Use it for live looping, sequencing, arranging, mixing, and much more. Whether you're a live performer, a producer, or just experimenting with sound, Loopy Pro helps you take control of your creative process.

Download on the App Store

Loopy Pro is your all-in-one musical toolkit. Try it for free today.

Converting CCs to MMC commands with Mozaic?

Hey all,
Have thrown together a @brambos Mozaic script tonight to get my Keylab Essential MK3 controller to play nicely with the the old Roland jv1010 module on my desk (accessing all the patches and performance banks using buttons and relative midi jog wheel on the controller). That's working great, but I have some buttons left to work with.

Would be handy to control the transport on my MPC using the transport controls here, however I'd need to convert some CC buttons into MMC to do that, and I can't find any reference to whether that is possible or how. Can anyone help me with this?

AS an aside for the curious, here's the script I've been working on. It is pretty specific to my routing, instruments and use case:

@init

    FillArray currentProgram, 0, 16
    FillArray ccStates, 0, 128  // Array to keep track of CC states

@end


@OnMidiInput

    // if (MIDIChannel <> (10-1)) and (MIDIByte2 <> 114)
    if (MIDIByte1 < 0xB0) or (MIDIByte1 > 0xBF)
        SendMIDIThru
    endif

@end


@OnMidiCC

    // Update the state of the CCs
    if (MIDIByte2 >= 0) and (MIDIByte2 < 128)
        ccStates[MIDIByte2] = MIDIByte3
    endif

    // Handle CC 114
    if (MIDIByte2 = 114) and (MIDIChannel <> (10-1))
        if (MIDIByte3 = 63)
            currentProgram[MIDIChannel] = currentProgram[MIDIChannel] - 1
        elseif (MIDIByte3 = 62)
            currentProgram[MIDIChannel] = currentProgram[MIDIChannel] - 2
        elseif (MIDIByte3 = 65)
            currentProgram[MIDIChannel] = currentProgram[MIDIChannel] + 1
        elseif (MIDIByte3= 66)
            currentProgram[MIDIChannel] = currentProgram[MIDIChannel] + 2
        endif

        if currentProgram[MIDIChannel] < 0
            currentProgram[MIDIChannel] = 0
        elseif currentProgram[MIDIChannel] > 127
            currentProgram[MIDIChannel] = 127
        endif

        // Send and log bank change messages based on other CCs
        if (ccStates[30] = 127)
            SendMIDIBankSelect MIDIChannel, 84, 0
            Log {CH: }, MIDIChannel+1, {, PROG: }, currentProgram[MIDIChannel]+1, {, BANK MSB: 84, LSB: 0 (session patch 1-128)}
        elseif (ccStates[31] = 127)
            SendMIDIBankSelect MIDIChannel, 84, 1
            Log {CH: }, MIDIChannel+1, {, PROG: }, currentProgram[MIDIChannel]+1, {, BANK MSB: 84, LSB: 1 (session patch 129-255)}
        elseif (ccStates[86] = 127)
            SendMIDIBankSelect MIDIChannel, 84, 2
            Log {CH: }, MIDIChannel+1, {, PROG: }, currentProgram[MIDIChannel]+1, {, BANK MSB: 84, LSB: 2 (orchestral patch 1-128)}
        elseif (ccStates[87] = 127)
            SendMIDIBankSelect MIDIChannel, 84, 3
            Log {CH: }, MIDIChannel+1, {, PROG: }, currentProgram[MIDIChannel]+1, {, BANK MSB: 84, LSB: 3 (orchestral patch 129-256)}
        else
            Log {CH: }, MIDIChannel+1, {, PROG: }, currentProgram[MIDIChannel] +1
        endif

        SendMIDIProgramChange MIDIChannel, currentProgram[MIDIChannel], 10

    else
        if (MIDIByte2 <> 115) and (MIDIChannel <> (10-1)) and (MIDIByte2 <> 30) and (MIDIByte2 <> 31) and (MIDIByte2 <> 86) and (MIDIByte2 <> 115)and (MIDIByte2 <> 87)
            SendMIDIThru
        endif
    endif

    if (MIDIByte2 = 115) and (MIDIChannel = (10-1)) and (MIDIByte3 = 127)
        SendMIDIBankSelect (10-1), 80, 0
        SendMIDIProgramChange (10-1), 0, 10
        Log {CH: 10, PROG: 1, BANK MSB: 80, LSB: 0 (orchestrall performance)}
    endif

@end

Comments

  • @OscarSouth : MMC comnands are sysex messages. Mozaic has a function for sending sysex messages.

    A web search will reveal the format of the MMC sysex messages.

  • edited August 10

    @espiegel123 said:
    @OscarSouth : MMC comnands are sysex messages. Mozaic has a function for sending sysex messages.

    A web search will reveal the format of the MMC sysex messages.

    Thanks for this, I tracked down the messages for the MPC here:
    https://www.mpc-forums.com/viewtopic.php?f=48&t=186979

    And have thrown this together:

        if (MIDIByte2 = 20) and (MIDIChannel = (10-1)) and (MIDIByte3 = 127)
            data = [0x7F, 0x7F, 0x06, 0x01]
            SendSysex data, 4
            Log {MMC STOP}
        endif
    
        if (MIDIByte2 = 21) and (MIDIChannel = (10-1)) and (MIDIByte3 = 127)
            data = [0x7F, 0x7F, 0x06, 0x02]
            SendSysex data, 4
            Log {MMC PLAY}
        endif
    
        if (MIDIByte2 = 22) and (MIDIChannel = (10-1)) and (MIDIByte3 = 127)
            data = [0x7F, 0x7F, 0x06, 0x06]
            SendSysex data, 4
            Log {MMC RECORD}
        endif
    

    This successfully prints the Log messages but I'm not getting any response from the device and not seeing any Sysex messages in any logging (using MIDISpy on iOS after Mozaic).

    Anyone help me out? I think the problem is with my Mozaic code -- the Sysex doesn't appear to be sent. Even if someone can give me some sample Mozaic Sysex code that works, then I should be able to massage it into doing what I need it to do and debug with this specific device.

  • edited July 26

    An an extra thought, I do see the MPC register as MIDI input, but nothing is logged in MIDISpy ( which has a filter for Sysex so I'd assume it'd be shown) or in the MPC MIDI log. IT may be that the message is being sent but not logged, and I'm not getting any control effect from it (the Receive MMC param is checked).

  • edited July 26

    Have confirmed that the data is being sent correctly (wasn't being displayed on iOS midi monitor apps) -- need to get the device to respond to it. I will continue on the MPC message board. Thanks for the Mozaic help to get this far :)

  • edited July 26

    Maybe there is a receive sysex setting in the mpc that you have to enable.
    I think mmc stands for multi media command and it expects a string like "play".

  • edited July 26

    @Alfred said:
    Maybe there is a receive sysex setting in the mpc that you have to enable.
    I think mmc stands for multi media command and it expects a string like "play".

    I got the data from here: https://www.mpc-forums.com/viewtopic.php?t=186979

    That setting is enabled.

    Have started a thread over here: https://www.mpc-forums.com/viewtopic.php?f=48&t=218090

  • Should have looked at that before commenting...
    Succes

  • @OscarSouth look at the Wikipedia or other articles about mmc. The device ID may not be correct. If your device is a different model than the one on site you copied from, your device might have a different device id.

    http://midi.teragonaudio.com/tech/mmc.htm

  • edited July 26

    When reading the linked docs i noticed akai being nonstandard, leave the F0 and F7 out ! But that seems impossible because it is inserted by the sendsysex command in mozaic.

  • @espiegel123 said:
    @OscarSouth look at the Wikipedia or other articles about mmc. The device ID may not be correct. If your device is a different model than the one on site you copied from, your device might have a different device id.

    http://midi.teragonaudio.com/tech/mmc.htm

    Doing some digging. I also have an old MPD with AKAI transport MMC buttons laying around, so I will see if I can extract some data from that.

    @Alfred said:
    When reading the linked docs i noticed akai being nonstandard, leave the F0 and F7 out ! But that seems impossible because it is inserted by the sendsysex command in mozaic.

    Interesting observation -- I'd interpreted that as the (different) piece of hardware that people were working with in that thread also automatically adding those bytes. Worth thinking about -- Thanks.

  • Guess that explains that then :D

  • @Alfred said:
    When reading the linked docs i noticed akai being nonstandard, leave the F0 and F7 out ! But that seems impossible because it is inserted by the sendsysex command in mozaic.

    I am not sure that is what is being said in the conversation. If the people are (as implied) using a send sysex command from a pedal, the wrapping sysex bytes would automatically be sent by the pedal. MIDI generally requires proper header bytes in its messages.

    I could be wrong but I suspect they are leaving out the wrapping bytes for convenience.

  • @OscarSouth said:

    @espiegel123 said:
    @OscarSouth look at the Wikipedia or other articles about mmc. The device ID may not be correct. If your device is a different model than the one on site you copied from, your device might have a different device id.

    http://midi.teragonaudio.com/tech/mmc.htm

    Doing some digging. I also have an old MPD with AKAI transport MMC buttons laying around, so I will see if I can extract some data from that.

    @Alfred said:
    When reading the linked docs i noticed akai being nonstandard, leave the F0 and F7 out ! But that seems impossible because it is inserted by the sendsysex command in mozaic.

    Interesting observation -- I'd interpreted that as the (different) piece of hardware that people were working with in that thread also automatically adding those bytes. Worth thinking about -- Thanks.

    In case it's useful to anyone, here's the MMC data sent by an AKAI MPD32:

  • Quick update for anyone looking for this info in future -- what I was working on in this thread all worked once I downgraded the MPC firmware to 2.13

    Hopefully they fix that bug in the latest release soon :)

Sign In or Register to comment.