jdxi_editor.midi.message.roland =============================== .. py:module:: jdxi_editor.midi.message.roland .. autoapi-nested-parse:: roland_sysex.py =============== This module provides a class for constructing and parsing Roland System Exclusive (SysEx) messages. The `RolandSysEx` class allows for easy creation of messages to be sent to Roland devices, as well as the ability to parse incoming SysEx messages. Usage Example: ```python from roland_sysex import RolandSysEx # Creating a SysEx message message = RolandSysEx(command=0x12, area=0x01, section=0x02, group=0x03, param=0x04, value=0x05) message_bytes = message.to_bytes() print("Generated SysEx Message (bytes):", message_bytes) # Parsing a SysEx message from bytes received_bytes = b'ðA÷' # Example received SysEx message parsed_message = RolandSysEx.from_bytes(received_bytes) print("Parsed Command:", parsed_message.command) print("Parsed Address:", parsed_message.address) print("Parsed Value:", parsed_message.value) Classes ------- .. autoapisummary:: jdxi_editor.midi.message.roland.RolandSysExMessage jdxi_editor.midi.message.roland.RolandSysEx jdxi_editor.midi.message.roland.JDXiSysEx jdxi_editor.midi.message.roland.ParameterMessage jdxi_editor.midi.message.roland.SystemMessage jdxi_editor.midi.message.roland.ProgramMessage jdxi_editor.midi.message.roland.Effect1Message jdxi_editor.midi.message.roland.Effect2Message jdxi_editor.midi.message.roland.DelayMessage jdxi_editor.midi.message.roland.ReverbMessage jdxi_editor.midi.message.roland.PartMessage jdxi_editor.midi.message.roland.ZoneMessage jdxi_editor.midi.message.roland.ControllerMessage jdxi_editor.midi.message.roland.DigitalToneCommonMessage jdxi_editor.midi.message.roland.DigitalToneModifyMessage jdxi_editor.midi.message.roland.DigitalTonePartialMessage jdxi_editor.midi.message.roland.AnalogToneMessage jdxi_editor.midi.message.roland.DrumKitCommonMessage jdxi_editor.midi.message.roland.DrumKitPartialMessage Functions --------- .. autoapisummary:: jdxi_editor.midi.message.roland.create_sysex_message jdxi_editor.midi.message.roland.create_patch_load_message jdxi_editor.midi.message.roland.create_patch_request_message Module Contents --------------- .. py:class:: RolandSysExMessage Bases: :py:obj:`jdxi_editor.midi.message.sysex.SysExMessage` Specialized class for Roland JD-Xi SysEx messages. .. py:attribute:: manufacturer_id :type: int .. py:attribute:: device_id :type: int .. py:attribute:: model_id :type: list[int] .. py:attribute:: command :type: int .. py:attribute:: sysex_address :type: jdxi_editor.midi.data.address.address.RolandSysExAddress .. py:attribute:: value :type: Union[int, List[int]] .. py:attribute:: size :type: int :value: 1 .. py:attribute:: synth_type :type: int :value: None .. py:attribute:: part :type: int :value: None .. py:attribute:: dt1_command :type: int .. py:attribute:: rq1_command :type: int .. py:method:: __post_init__() Initialize data and resolve address bytes. .. py:method:: to_message_list() -> List[int] Convert the SysEx message to a list of integers. :return: list .. py:class:: RolandSysEx Bases: :py:obj:`jdxi_editor.midi.message.sysex.SysExMessage` Specialized class for Roland JD-Xi SysEx messages. .. py:attribute:: manufacturer_id :type: int .. py:attribute:: device_id :type: int .. py:attribute:: model_id :type: List[int] .. py:attribute:: command :type: int .. py:attribute:: sysex_address :type: Optional[jdxi_editor.midi.data.address.address.RolandSysExAddress] :value: None .. py:attribute:: msb :type: int .. py:attribute:: umb :type: int .. py:attribute:: lmb :type: int .. py:attribute:: lsb :type: int .. py:attribute:: value :type: Union[int, List[int]] .. py:attribute:: size :type: int :value: 1 .. py:attribute:: synth_type :type: Optional[int] :value: None .. py:attribute:: part :type: Optional[int] :value: None .. py:attribute:: dt1_command :type: int .. py:attribute:: rq1_command :type: int .. py:method:: __post_init__() -> None Ensure proper initialization of address, model_id, and data fields. .. py:method:: from_sysex_address(sysex_address: jdxi_editor.midi.data.address.address.RolandSysExAddress) -> None from_sysex_address :param sysex_address: RolandSysExAddress :return: None .. py:method:: to_message_list() -> List[int] to_message_list :return: List[int] .. py:method:: construct_sysex(address: jdxi_editor.midi.data.address.address.RolandSysExAddress, *data_bytes: Union[List[int], int], request: bool = False) -> List[int] Construct a SysEx message based on the provided address and data bytes. :param address: RolandSysExAddress :param data_bytes: list of data bytes :param request: bool is this a request? :return: None .. py:class:: JDXiSysEx Bases: :py:obj:`RolandSysEx` JD-Xi specific SysEx message .. py:attribute:: model_id :type: List[int] .. py:attribute:: device_id :type: int :value: 16 .. py:attribute:: command :type: int .. py:attribute:: address :type: List[int] :value: [0, 0, 0, 0] .. py:attribute:: data :type: List[int] :value: [] .. py:method:: __post_init__() Validate message components .. py:method:: to_bytes() -> bytes Convert message to bytes for sending .. py:method:: calculate_checksum() -> int Calculate Roland checksum for the message .. py:method:: from_bytes(data: bytes) :classmethod: Create message from received bytes .. py:class:: ParameterMessage Bases: :py:obj:`JDXiSysEx` Base class for parameter messages .. py:attribute:: command :type: int .. py:method:: __post_init__() Handle parameter value conversion .. py:method:: convert_value(value: int) -> list[int] Convert parameter value to data bytes :param value: int :return: list[int] .. py:method:: from_bytes(data: bytes) -> JDXiSysEx :classmethod: Create message from received bytes .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value .. py:class:: SystemMessage Bases: :py:obj:`ParameterMessage` System parameter message .. py:attribute:: msb :type: int :value: 2 .. py:class:: ProgramMessage Bases: :py:obj:`ParameterMessage` Program parameter message .. py:attribute:: msb :type: int :value: 24 .. py:class:: Effect1Message Bases: :py:obj:`ParameterMessage` Effect 1 parameter message .. py:attribute:: msb :type: int :value: 24 .. py:attribute:: umb :type: int :value: 2 .. py:class:: Effect2Message Bases: :py:obj:`ParameterMessage` Effect 2 parameter message .. py:attribute:: msb :type: int :value: 24 .. py:attribute:: umb :type: int :value: 4 .. py:class:: DelayMessage Bases: :py:obj:`ParameterMessage` Delay parameter message .. py:attribute:: msb :type: int :value: 24 .. py:attribute:: umb :type: int :value: 6 .. py:class:: ReverbMessage Bases: :py:obj:`ParameterMessage` Reverb parameter message .. py:attribute:: msb :type: int :value: 24 .. py:attribute:: umb :type: int :value: 8 .. py:class:: PartMessage Bases: :py:obj:`ParameterMessage` Program Part parameter message .. py:attribute:: msb :type: int :value: 24 .. py:attribute:: umb :type: int :value: 0 .. py:method:: convert_value(value: int) -> List[int] Convert parameter value based on parameter preset_type .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value .. py:class:: ZoneMessage Bases: :py:obj:`ParameterMessage` Program Zone parameter message .. py:attribute:: msb :type: int :value: 24 .. py:attribute:: umb :type: int :value: 1 .. py:method:: convert_value(value: int) -> List[int] Convert parameter value based on parameter preset_type .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value .. py:class:: ControllerMessage Bases: :py:obj:`ParameterMessage` Program Controller parameter message .. py:attribute:: msb :type: int .. py:attribute:: umb :type: int :value: 64 .. py:method:: convert_value(value: int) -> List[int] Convert parameter value based on parameter preset_type :param value: :return: List[int] .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value :param data: List :return: int .. py:class:: DigitalToneCommonMessage Bases: :py:obj:`ParameterMessage` SuperNATURAL Synth Tone Common parameter message .. py:attribute:: msb :type: int .. py:attribute:: umb :type: int :value: 0 .. py:method:: convert_value(value: int) -> List[int] Convert parameter value based on parameter preset_type :param value: :return: List[int] .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value :param data: List :return: int .. py:class:: DigitalToneModifyMessage Bases: :py:obj:`ParameterMessage` SuperNATURAL Synth Tone Modify parameter message .. py:attribute:: msb :type: int .. py:attribute:: umb :type: int :value: 80 .. py:method:: convert_value(value: int) -> List[int] Convert parameter value based on parameter preset_type :param value: :return: List[int] .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value :param data: List :return: int .. py:class:: DigitalTonePartialMessage Bases: :py:obj:`ParameterMessage` SuperNATURAL Synth Tone Partial parameter message .. py:attribute:: msb :type: int .. py:attribute:: umb :type: int :value: 32 .. py:method:: convert_value(value: int) -> List[int] Convert parameter value based on parameter preset_type :param value: :return: List[int] .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value :param data: List :return: int .. py:class:: AnalogToneMessage Bases: :py:obj:`ParameterMessage` Message for analog tone parameters .. py:attribute:: msb :type: int :value: 0 .. py:attribute:: umb :type: int :value: 0 .. py:attribute:: lmb :type: int :value: 0 .. py:attribute:: lsb :type: int :value: 0 .. py:attribute:: value :type: int :value: 0 .. py:method:: to_message_list() -> List[int] Convert to SysEx message bytes .. py:class:: DrumKitCommonMessage Bases: :py:obj:`ParameterMessage` Drum Kit Common parameter message .. py:attribute:: msb :type: int .. py:attribute:: umb :type: int :value: 16 .. py:attribute:: lmb :type: int :value: 0 .. py:method:: convert_value(value: int) -> List[int] Convert parameter value based on parameter preset_type :param value: :return: List[int] .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value :param data: List :return: int .. py:class:: DrumKitPartialMessage Bases: :py:obj:`ParameterMessage` Drum Kit Partial parameter message .. py:attribute:: msb :type: int .. py:attribute:: umb :type: int :value: 16 .. py:attribute:: lmb :type: int :value: 1 .. py:method:: convert_value(value: int) -> List[int] Convert parameter value based on parameter preset_type :param value: :return: List[int] .. py:method:: convert_data(data: List[int]) -> int :classmethod: Convert data bytes back to parameter value :param data: List :return: int .. py:function:: create_sysex_message(msb: int, umb: int, lmb: int, lsb: int, value: int) -> JDXiSysEx Create address JD-Xi SysEx message with the given parameters .. py:function:: create_patch_load_message(bank_msb: int, bank_lsb: int, program: int) -> List[JDXiSysEx] Create messages to load address patch (bank select + program change) .. py:function:: create_patch_request_message(msb: int, umb: int = 0, size: int = 0) -> JDXiSysEx Create address message to request patch data