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

"""
ReverbMessage
=============

    Examples
    --------
# Set reverb level
>>> msg = ReverbMessage(param=Reverb.LEVEL.STATUS, value=100)  # Level 100

# Set reverb parameter 1 to +5000
>>> msg = ReverbMessage(
>>>     param=Reverb.get_param_offset(1), value=5000  # Will be converted to 37768
>>> )

"""

from dataclasses import dataclass

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


@dataclass
[docs] class ReverbMessage(RolandSysEx): """Program Reverb parameter message"""
[docs] command: int = CommandID.DT1
[docs] msb: int = AddressStartMSB.TEMPORARY_PROGRAM # 0x18: Program area
[docs] umb: int = AddressOffsetSystemLMB.COMMON # 0x00: Common section
[docs] lmb: int = AddressOffsetProgramLMB.EFFECT_1 # Effect 1 = 0x02
[docs] lsb: int = AddressParameterEffect.REVERB_LEVEL # Parameter number 0x03
[docs] value: int = 0x00 # Parameter value
[docs] def __post_init__(self): super().__post_init__() # Set address and data from RolandSysEx # Handle 4-byte parameters if not isinstance(self.value, int): raise TypeError("ReverbMessage.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]