Source code for jdxi_editor.midi.message.effects.delay

"""
DelayMessage
============

# Example usage:
# Set delay level
>>> msg = DelayMessage(param=Delay.LEVEL.STATUS, value=100)  # Level 100

# Set reverb send level
>>> msg = DelayMessage(param=Delay.REVERB_SEND.STATUS, value=64)  # Send to reverb

# Set delay parameter 1 to +5000
>>> msg = DelayMessage(
>>>     param=Delay.get_param_offset(1), value=5000  # Will be converted to 37768
>>> )
"""

from dataclasses import dataclass

from jdxi_editor.midi.data.address.address import (
    AddressOffsetProgramLMB,
    AddressStartMSB,
    CommandID,
)
from jdxi_editor.midi.data.address.sysex import ZERO_BYTE
from jdxi_editor.midi.message.roland import RolandSysEx
from jdxi_editor.midi.utils.byte import split_16bit_value_to_nibbles


@dataclass
[docs] class DelayMessage(RolandSysEx): """Program Delay parameter message"""
[docs] command: int = CommandID.DT1
[docs] msb: int = AddressStartMSB.PROGRAM # 0x18: Program area
[docs] umb: int = AddressOffsetProgramLMB.DELAY # 0x06: Delay section
[docs] lmb: int = ZERO_BYTE
[docs] lsb: int = ZERO_BYTE
[docs] value: int = ZERO_BYTE
[docs] def __post_init__(self): super().__post_init__() if not isinstance(self.value, int): raise TypeError("DelayMessage.value must be an integer") if 0x04 <= self.lsb <= 0x60: # Convert signed value to unsigned offset for SysEx offset_value = self.value + 32768 self.data = split_16bit_value_to_nibbles(offset_value) else: self.data = [self.value]