MIDI DESIGNER
The only MIDI controller for iPad, iPhone, and Mac


Talk to other MIDI Designer users about MIDI Designer, iOS MIDI and related topics. Or share layouts, pages, and ideas.

Check out our Facebook Group.

Of course, if you want to send us an email, feel free.

Open problem reports

Summary of user requests
Problem Layout: Ghost Note Swirls - MIDI Designer Q&A
0 votes
in Advanced by the-elf (1.4k points)
Comment removed

2 Answers

0 votes
Maybe overthinking this one.  How is it different from a keyboard with 512 presets?  They all respond to the same Ccs, just gotta keep track of which one you are editing.  Looks like Cc 16 is the change preset control.

You could make a preset for groups.  I presume you are using SB to pull the SysEx message apart for the controls.  You could have a layout button that determines which preset you are currently viewing, sets a SB global variable, so the load knows which of the two value sets to send to layout controls, and ignores the other value set.

A more complicated way - possible since you have only two presets and a limited set of controls:

- build the set of controls for one preset.  Add a button selected on all the controls as midi enable.

- duplicate the page

- group the two midi enable / disable buttons with a master preset select button, with a unique MIDI assignment

- your SB decode can now toggle the active preset to store the settings

- now move the two presets onto panels, and use the master preset button to control with is shown.

Just a few thoughts to try.
by jkhiser (22.5k points)
Thank you. I like the idea of a value I can pass into SB. I added a hidden button to the 'B' preset selection button, but I don't know of any way to have that button pass something to my SB code?

I'm afraid I don't understand your other 'more complicated' suggestion at all. Sorry!
0 votes

re: I don't know of any way to have that button pass something to my SB code?

The G array is common to both input and output modules.  In the output module, capture the button value and store in a G memory location, such as G00.  Say value 0 = preset A, value 7F = preset B.  In input module, use the G00 value to determine which preset is currently displayed, send those values to the layout, discard the others.

re: don't understand other suggestions.

Lets look at the duplicate set of controls version in more detail

in relationships / other, we have ability to turn on/off MIDI receive and transmit for a control, using another control.  In this case, we want a set of controls to only RECEIVE or TRANSMIT when the specific preset is selected.

Make a Preset A button, toggle, no midi receive (going to control it with a supercontrol, and don't want it getting out of sync with its supercontrol)

Build your set of controls for Cc 1-13. 

In each of these controls, under relationships tab, for both MIDI Enable and MIDI Receive Enable, select the preset A button.  (This completely disables the control unless the preset button A is active.)

Duplicate the page

On the duplicate page, change the Preset A label to Preset B.  Check that all controls now have the Preset B button selected for MIDI Enable / MIDI Transmit Enable.

In another convenient location, add a Preset Selector Button A/B, make supercontrol, make the Preset A & Preset B buttons above subcontrols.

We need a unique MIDI message to allow SB to select between the presets on receive.  Lets use F0 58 58 00 xx F7, a synthetic SysEx message, where 00 = Preset A, 7F = Preset B.  We could use a Cc, but you never know when a Cc will be used by another device somewhere in your rig.  58 58 is a header that no other known device should use, 00 is our first unique message, xx is the MIDI value we are switching on 00 = A, 7F = B.

So in the Preset A/B button, assign MIDI value SysEx, 58 58 00 V, MIDI off 0, MIDI on 127

So now in your inbound SB code

- before sending the Preset A values, SND F0 58 58 00 00 F7

- before sending the Preset B values, SND F0 58 58 00 7F F7

Test work to this point.  Hopefully:

- the SB code properly populates the preset settings to the correct control

- operating the current preset A/B controls should send MIDI to the device, the unselected set of controls should do nothing.

Once this is working, we can go to the next step of moving the controls into panels, using show / hide to only show the active preset, etc.

by jkhiser (22.5k points)
Thank you for your patience. I've gone with the global value option. I can now switch between presets and I have a Subcontrol of one of the A/B buttons that sends out a dump request. Now I can receive the dump and choose the offsets in the dump based on the global value. Now the screen controls follow the chosen preset.

I have a few more things to figure out now, including how to issue the INIT Sys-Ex (which turns on the pedal's MIDI output) and initial preset dump.

But I'm on track. Always grateful for your kind and patient assistance.
Here's the SB code I ended up with. I'm still a novice with this, but it works...

# Ghost Note Swirls 20251124 - Convert bulk dump

# START OF SUB-ROUTINES
IF LOAD
  
  SUBROUTINE CALC-VALUE BYTE1 BYTE2 NEW-VALUE
    
    MAT J1 = BYTE1 * $16
    MAT J2 = J1 + BYTE2
    MAT J3 = J2 * $127
    MAT J4 = J3 + $127
    MAT NEW-VALUE = J4 / $255
    
  END
  
END
# END OF SUB-ROUTINES

IF M00 == F0
  IF M01 == 7E 67 68
    IF M04 == 6F 73 74
      IF M0E == 04
        MAT L0 = B0 + M18 # MIDI Channel

        IF G0 == 00 # PRESET RED (A)

          #  STEREO cc13
          CALC-VALUE M37 M38 L1
          SND L0 0D L1

          #  PRESET cc14
          CALC-VALUE M39 M3A L1
          SND L0 0E L1

          #  MANUAL cc15
          CALC-VALUE M3B M3C L1
          SND L0 0F L1

          #  RATE cc01
          CALC-VALUE M1F M20 L1
          SND L0 01 L1
        
          #  INPUT GAIN cc02
          CALC-VALUE M21 M22 L1
          SND L0 02 L1
        
          #  CHORUS MIX cc03
          CALC-VALUE M23 M24 L1
          SND L0 03 L1
        
          #  VOICES cc04
          CALC-VALUE M25 M26 L1
          SND L0 04 L1
        
          #  DETUNE cc05
          CALC-VALUE M27 M28 L1
          SND L0 05 L1
        
          #  DETUNE MIX GAIN cc06
          CALC-VALUE M29 M2A L1
          SND L0 06 L1

          #  L INTENSITY cc07
          CALC-VALUE M2B M2C L1
          SND L0 07 L1
        
          #  C INTENSITY cc08
          CALC-VALUE M2D M2E L1
          SND L0 08 L1
        
          #  R INTENSITY cc09
          CALC-VALUE M2F M30 L1
          SND L0 09 L1
        
          #  COMP RATIO cc10
          CALC-VALUE M31 M32 L1
          SND L0 0A L1

          #  COMP THRESHOLD cc11
          CALC-VALUE M33 M34 L1
          SND L0 0B L1

          #  COMP ATTACK cc12
          CALC-VALUE M35 M36 L1
          SND L0 0C L1

        END

        IF G0 == 7F # PRESET BLUE (B)

          #  STEREO cc13
          CALC-VALUE M59 M5A L1
          SND L0 0D L1

          #  PRESET cc14
          CALC-VALUE M5B M5C L1
          SND L0 0E L1

          #  MANUAL cc15
          CALC-VALUE M5D M5E L1
          SND L0 0F L1

          #  RATE cc01
          CALC-VALUE M41 M42 L1
          SND L0 01 L1
        
          #  INPUT GAIN cc02
          CALC-VALUE M43 M44 L1
          SND L0 02 L1
        
          #  CHORUS MIX cc03
          CALC-VALUE M45 M46 L1
          SND L0 03 L1
        
          #  VOICES cc04
          CALC-VALUE M47 M48 L1
          SND L0 04 L1
        
          #  DETUNE cc05
          CALC-VALUE M49 M4A L1
          SND L0 05 L1
        
          #  DETUNE MIX GAIN cc06
          CALC-VALUE M4B M4C L1
          SND L0 06 L1

          #  L INTENSITY cc07
          CALC-VALUE M4D M4E L1
          SND L0 07 L1
        
          #  C INTENSITY cc08
          CALC-VALUE M4F M50 L1
          SND L0 08 L1
        
          #  R INTENSITY cc09
          CALC-VALUE M51 M52 L1
          SND L0 09 L1
        
          #  COMP RATIO cc10
          CALC-VALUE M53 M54 L1
          SND L0 0A L1

          #  COMP THRESHOLD cc11
          CALC-VALUE M55 M56 L1
          SND L0 0B L1

          #  COMP ATTACK cc12
          CALC-VALUE M57 M58 L1
          SND L0 0C L1

        END
      END
    END
  END
END
...