I’m the author of the max object and rytm-rs.
These are the objects you can send separately through the sysex api:
- Pattern
- Kit
- Sound
- Settings
- Global
- Song
It is possible to save kits and send them back to AR.
Actually I was planning to include that functionality for rytm-rs but this was a project I was building when I was switching between jobs, unfortunately I couldn’t develop it further due to not having time, although I’ll complete it sometime. At least I’ll try 
In theory you can redirect the output of [sysexin] from max to a file, fetch the kit you want and then read that file to [sysexout] to another rytm device or the same one.
After you’re done with the transfer you can save your project in rytm and you’re good.
I hope it helps.
But since a Kit
also has reference to Sound
s you might not need to have the same Sound
s in the other machine I suppose kit should also transfer them in the package so you have the identical Kit
there. (assumption)
This is how a kit looks like in rust code (you don’t need to understand the code but you can at least read the names of the fields as much as we reverse engineered it)
/// Represents a kit in the analog rytm.
///
/// It does not map identically to the structure in the firmware.
#[derive(Derivative, Clone, Serialize, Deserialize)]
#[derivative(Debug)]
pub struct Kit {
#[derivative(Debug = "ignore")]
sysex_meta: SysexMeta,
/// Version of the kit structure.
version: u32,
pub(crate) index: usize,
/// Name of the kit.
name: ObjectName,
// 13th is the fx track.
#[derivative(Debug = "ignore")]
track_levels: [u8; 13],
#[derivative(Debug = "ignore")]
track_retrig_settings: [retrig::TrackRetrigMenu; 13],
#[derivative(Debug = "ignore")]
sounds: [Sound; 12],
fx_delay: FxDelay,
fx_distortion: FxDistortion,
fx_reverb: FxReverb,
fx_compressor: FxCompressor,
fx_lfo: FxLfo,
control_in_1_mod_target_1: ControlInModTarget,
control_in_1_mod_target_2: ControlInModTarget,
control_in_1_mod_target_3: ControlInModTarget,
control_in_1_mod_target_4: ControlInModTarget,
control_in_2_mod_target_1: ControlInModTarget,
control_in_2_mod_target_2: ControlInModTarget,
control_in_2_mod_target_3: ControlInModTarget,
control_in_2_mod_target_4: ControlInModTarget,
control_in_1_mod_amt_1: i8,
control_in_1_mod_amt_2: i8,
control_in_1_mod_amt_3: i8,
control_in_1_mod_amt_4: i8,
control_in_2_mod_amt_1: i8,
control_in_2_mod_amt_2: i8,
control_in_2_mod_amt_3: i8,
control_in_2_mod_amt_4: i8,
// Currently these are out of my interest.
// Maybe in the feature we can add support for these.
//
// ---- TODO: ----
#[derivative(Debug = "ignore")]
#[serde(with = "BigArray")]
pub(crate) perf_ctl: [u8; 48 * 4], /* @0x0842..0x0901 */
#[derivative(Debug = "ignore")]
#[serde(with = "BigArray")]
pub(crate) scene_ctl: [u8; 48 * 4], /* @0x0917..0x09D6 */
// 0..=11 device 0..=11
#[derivative(Debug = "ignore")]
pub(crate) current_scene_id: u8, /* @0x09D8 (0..11) */
// ----------------
//
#[derivative(Debug = "ignore")]
pub(crate) __unknown: KitUnknown,
}
See this part:
sounds: [Sound; 12],