Skip to content

USB-device-midi is missing helper function to send SysEx #1066

@mungewell

Description

@mungewell

I was using USB-device-midi to send MTC to the host, which is essentially SysEx. But was slowed by the missing helper function to send the packet of SysEx. Anyhow, I wrote one...

Full example script here:
https://github.com/orgs/micropython/discussions/18450#discussioncomment-15043069

Happy to share with the project

    def send_sysex(self, p):
        # start of SysEx packet
        if len(p) > 3:
            w = self._tx.pend_write()
            if len(w) < 4:
                return False  # TX buffer is full. TODO: block here?

            w[0] = 0x4  # _CIN_SYSEX_START
            w[1] = p[0]
            w[2] = p[1]
            w[3] = p[2]
            self._tx.finish_write(4)
            self._tx_xfer()

            p = p[3:]

        # play out til end
        while p:
            if len(p) > 2:
                w = self._tx.pend_write()
                if len(w) < 4:
                    return False  # TX buffer is full. TODO: block here?

                w[0] = 0x7  # _CIN_SYSEX_END_3BYTE
                w[1] = p[0]
                w[2] = p[1]
                w[3] = p[2]
                self._tx.finish_write(4)
                self._tx_xfer()

                p = p[3:]
            elif len(p) > 1:
                w = self._tx.pend_write()
                if len(w) < 4:
                    return False  # TX buffer is full. TODO: block here?

                w[0] = 0x6  # _CIN_SYSEX_END_2BYTE
                w[1] = p[0]
                w[2] = p[1]
                w[3] = 0
                self._tx.finish_write(4)
                self._tx_xfer()

                p = p[2:]
            else:
                w = self._tx.pend_write()
                if len(w) < 4:
                    return False  # TX buffer is full. TODO: block here?

                w[0] = 0x5  # _CIN_SYSEX_END_1BYTE
                w[1] = p[0]
                w[2] = 0
                w[3] = 0
                self._tx.finish_write(4)
                self._tx_xfer()

                p = p[1:]

        return True

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions