Sort Hardware Ports by Alphanumerical Order

If you have many ports and want to sort ports position in alphanumerical order to make things clearer, for example:

MIDI 5, MIDI 1, MIDI 3, MIDI 4, MIDI 2 to
MIDI 1, MIDI 2, MIDI 3, MIDI 4, MIDI 5

you can change MODEPS sourcecode like this:

In /usr/lib/python3/dist-packages/modtools/utils.py replace the get_jack_hardware_ports def with:

def get_jack_hardware_ports(isAudio, isOutput):
    port_data = charPtrPtrToStringList(utils.get_jack_hardware_ports(isAudio, isOutput))
    sorted = {}
    sorting = []
    ports = []
    for port_id in port_data:
      port_alias = get_jack_port_alias(port_id)
      sorted[port_alias] = port_id
      sorting.append(port_alias)
    sorting.sort()
    for port_alias in sorting:
      ports.append(sorted[port_alias])
    return ports

In /usr/share/mod/html/js/pedalboard.js replace the positionHardwarePorts function with:

    // Position the hardware ports as to be evenly distributed vertically in pedalboard.
    // Output ports are positioned at left and input ports at right.
    positionHardwarePorts: function () {
        var self = $(this);

        var height = self.height() - self.data('bottomMargin');

        var adjust = function (elements, css) {
            var top = height / (elements.length + 1);
            var i, el;
            elements.sort(function(e1, e2) {
                var e1_audio = e1.hasClass('mod-audio-output') || e1.hasClass('mod-audio-input');
                var e2_audio = e2.hasClass('mod-audio-output') || e2.hasClass('mod-audio-input');
                var e1_midi  = e1.hasClass('mod-midi-output')  || e1.hasClass('mod-midi-input');
                var e2_midi  = e2.hasClass('mod-midi-output')  || e2.hasClass('mod-midi-input');
                var e1_cv    = e1.hasClass('mod-cv-output')    || e1.hasClass('mod-cv-input');
                var e2_cv    = e2.hasClass('mod-cv-output')    || e2.hasClass('mod-cv-input');
                // FIXME - there's got to be a better way..
                if ((e1_audio && e2_audio) || (e1_midi && e2_midi) || (e1_cv && e2_cv)) {
                    return (parseInt(e1.attr('mod-port-index')) > parseInt(e2.attr('mod-port-index'))) ? 1 : -1;
                } else if (e1_cv || e2_cv) {
                    return e1_cv ? 1 : -1;
                } else {
                    return e1_midi ? 1 : -1;
                }
            });
            
            let sorted = {};
            let sorting = [];
            for (let i = 0; i < elements.length; i++) {
              let el = elements[i];
              let type = (el.hasClass('mod-audio-output') || el.hasClass('mod-audio-input')) ? 0 : ((el.hasClass('mod-midi-output') || el.hasClass('mod-midi-input')) ? 1 : 2);
              let name = type + "_" + el[0].title;
              sorted[name] = i;
              sorting.push(name);
            }
            sorting = sorting.sort();
            let y = 0;
            for (let index in sorting) {
              let i = sorted[sorting[index]];
              let el = elements[i];
              el.css($.extend(css, {
                top: top * (parseInt(index) + 1) - el.height() / 2
              }));
              y++;
            }
        };
        
        adjust(self.data('hwInputs'), {
            right: 0
        });
        adjust(self.data('hwOutputs'), {
            left: 0
        });

        // Redraw all cables that connect to or from hardware ports
        //self.data('connectionManager').iterateInstance(':system:', function (jack) {
        self.data('connectionManager').iterate(function (jack) {
            self.pedalboard('drawJack', jack);
        });
    },
1 Like