Skip to main content

rekordcrate/
setting.rs

1// Copyright (c) 2026 Jan Holthuis <jan.holthuis@rub.de>
2//
3// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy
4// of the MPL was not distributed with this file, You can obtain one at
5// http://mozilla.org/MPL/2.0/.
6//
7// SPDX-License-Identifier: MPL-2.0
8
9//! Parser for Rekordbox `*SETTING.DAT` files.
10//!
11//! These files either in the `PIONEER` directory of a USB drive (device exports), but are also
12//! present for on local installations of Rekordbox 6 in `%APPDATA%\Pioneer\rekordbox6`.
13//!
14//! The settings files store the settings found on the "DJ System" > "My Settings" page of the
15//! Rekordbox preferences. These includes language, LCD brightness, tempo fader range, crossfader
16//! curve, etc.
17//!
18//! The exact format still has to be reverse-engineered.
19//!
20//! # Defaults
21//!
22//! The `SettingData` structs implement the `Default` trait and allows you to create objects that
23//! use the same default values as found in Rekordbox 6.6.1.
24
25use binrw::{binrw, io::Cursor, BinWrite, Endian, NullString};
26use parse_display::Display;
27
28#[binrw]
29#[derive(Debug, PartialEq, Eq, Clone)]
30#[brw(little)]
31#[br(import(setting_type: SettingType))]
32#[bw(import(no_checksum: bool))]
33/// Represents a setting file.
34pub struct Setting {
35    /// Size of the string data field (should be always 96).
36    #[br(temp, assert(len_stringdata == 0x60))]
37    #[bw(calc = 0x60)]
38    len_stringdata: u32,
39    /// Name of the brand.
40    ///
41    /// The value seems to depend on the kind of file:
42    ///
43    /// | File               | Value        |
44    /// | ------------------ | ------------ |
45    /// | `DEVSETTING.DAT`   | `PIONEER DJ` |
46    /// | `DJMMYSETTING.DAT` | `PioneerDJ`  |
47    /// | `MYSETTING.DAT`    | `PIONEER`    |
48    /// | `MYSETTING2.DAT`   | `PIONEER`    |
49    #[brw(pad_size_to = 0x20, assert(brand.len() <= (0x20 - 1)))]
50    pub brand: NullString,
51    /// Name of the software ("rekordbox").
52    #[brw(pad_size_to = 0x20, assert(software.len() <= (0x20 - 1)))]
53    pub software: NullString,
54    /// Some kind of version number.
55    #[brw(pad_size_to = 0x20, assert(version.len() <= (0x20 - 1)))]
56    pub version: NullString,
57    /// Size of the `data` data in bytes.
58    #[br(temp)]
59    #[bw(calc = data.size())]
60    #[br(assert(len_data == setting_type.expected_data_size()))]
61    len_data: u32,
62    /// The actual settings data.
63    #[br(args(setting_type))]
64    pub data: SettingData,
65    /// CRC16 XMODEM checksum. The checksum is calculated over the contents of the `data`
66    /// field, except for `DJMSETTING.DAT` files where the checksum is calculated over all
67    /// preceding bytes including the length fields.
68    ///
69    /// See <https://reveng.sourceforge.io/crc-catalogue/all.htm#crc.cat.crc-16-xmodem> for
70    /// details.
71    #[br(temp)]
72    #[bw(calc = if no_checksum { 0 } else { self.calculate_checksum() })]
73    _checksum: u16,
74    /// Unknown field (apparently always `0000`).
75    #[br(temp)]
76    #[br(assert(unknown == 0))]
77    #[bw(calc = 0u16)]
78    unknown: u16,
79}
80
81impl Setting {
82    /// Create a new object containing with the given brand string and data.
83    #[must_use]
84    fn default_with_brand_and_data(brand: NullString, data: SettingData) -> Self {
85        Self {
86            brand,
87            software: "rekordbox".into(),
88            version: "6.6.1".into(),
89            data,
90        }
91    }
92
93    /// Create a new object containing the default values of a `DEVSETTING.DAT` file.
94    #[must_use]
95    pub fn default_devsetting() -> Self {
96        Self::default_with_brand_and_data(
97            "PIONEER DJ".into(),
98            SettingData::DevSetting(DevSetting::default()),
99        )
100    }
101
102    /// Create a new object containing the default values of a `DJMMYSETTING.DAT` file.
103    #[must_use]
104    pub fn default_djmmysetting() -> Self {
105        Self::default_with_brand_and_data(
106            "PioneerDJ".into(),
107            SettingData::DJMMySetting(DJMMySetting::default()),
108        )
109    }
110
111    /// Create a new object containing the default values of a `MYSETTING.DAT` file.
112    #[must_use]
113    pub fn default_mysetting() -> Self {
114        Self::default_with_brand_and_data(
115            "PIONEER".into(),
116            SettingData::MySetting(MySetting::default()),
117        )
118    }
119
120    /// Create a new object containing the default values of a `MYSETTING2.DAT` file.
121    #[must_use]
122    pub fn default_mysetting2() -> Self {
123        Self::default_with_brand_and_data(
124            "PIONEER".into(),
125            SettingData::MySetting2(MySetting2::default()),
126        )
127    }
128}
129
130impl Setting
131where
132    Setting: BinWrite,
133{
134    /// Calculate the CRC16 checksum.
135    ///
136    /// This is horribly inefficient and basically serializes the whole data structure twice, but
137    /// there seems to be no other way to achieve this.
138    ///
139    /// Upstream issue: https://github.com/jam1garner/binrw/issues/102
140    fn calculate_checksum(&self) -> u16 {
141        let mut data = Vec::<u8>::with_capacity(156);
142        let mut writer = Cursor::new(&mut data);
143        self.write_options(&mut writer, Endian::Little, (true,))
144            .unwrap();
145        let start = match self.data {
146            // In `DJMMYSETTING.DAT`, the checksum is calculated over all previous bytes, including
147            // the section lengths and string data.
148            SettingData::DJMMySetting(_) => 0,
149            // In all other files`, the checksum is calculated just over the data section which
150            // starts at offset 104,
151            _ => 104,
152        };
153
154        let end = data.len() - 4;
155        crc16::State::<crc16::XMODEM>::calculate(&data[start..end])
156    }
157}
158
159/// Type of a `*SETTING.DAT` file.
160#[derive(Debug, PartialEq, Eq, Clone, Copy)]
161pub enum SettingType {
162    /// `DEVSETTING.DAT` file.
163    DevSetting,
164    /// `DJMMYSETTING.DAT` file.
165    DJMMySetting,
166    /// `MYSETTING.DAT` file.
167    MySetting,
168    /// `MYSETTING2.DAT` file.
169    MySetting2,
170}
171
172impl SettingType {
173    /// Get the expected setting type for a device export filename.
174    pub fn from_filename(path: impl AsRef<std::path::Path>) -> Option<Self> {
175        match path.as_ref().file_name()?.to_str()? {
176            "DEVSETTING.DAT" => Some(Self::DevSetting),
177            "DJMMYSETTING.DAT" => Some(Self::DJMMySetting),
178            "MYSETTING.DAT" => Some(Self::MySetting),
179            "MYSETTING2.DAT" => Some(Self::MySetting2),
180            _ => None,
181        }
182    }
183
184    /// Get the expected size of the data section for this setting type.
185    #[must_use]
186    pub fn expected_data_size(&self) -> u32 {
187        match &self {
188            Self::DevSetting => 32,
189            Self::DJMMySetting => 52,
190            Self::MySetting => 40,
191            Self::MySetting2 => 40,
192        }
193    }
194}
195
196/// Data section of a `*SETTING.DAT` file.
197#[binrw]
198#[derive(Debug, PartialEq, Eq, Clone)]
199#[brw(little)]
200#[br(import(setting_type: SettingType))]
201pub enum SettingData {
202    /// Payload of a `DEVSETTING.DAT` file (32 bytes).
203    #[br(pre_assert(setting_type == SettingType::DevSetting))]
204    DevSetting(DevSetting),
205    /// Payload of a `DJMMYSETTING.DAT` file (52 bytes).
206    #[br(pre_assert(setting_type == SettingType::DJMMySetting))]
207    DJMMySetting(DJMMySetting),
208    /// Payload of a `MYSETTING.DAT` file (40 bytes).
209    #[br(pre_assert(setting_type == SettingType::MySetting))]
210    MySetting(MySetting),
211    /// Payload of a `MYSETTING2.DAT` file (40 bytes).
212    #[br(pre_assert(setting_type == SettingType::MySetting2))]
213    MySetting2(MySetting2),
214}
215
216impl SettingData {
217    fn size(&self) -> u32 {
218        match &self {
219            Self::DevSetting(_) => 32,
220            Self::DJMMySetting(_) => 52,
221            Self::MySetting(_) => 40,
222            Self::MySetting2(_) => 40,
223        }
224    }
225
226    /// If this is a `DevSetting`, return a reference to it.
227    #[must_use]
228    pub fn as_dev_setting(&self) -> Option<&DevSetting> {
229        match &self {
230            Self::DevSetting(ds) => Some(ds),
231            _ => None,
232        }
233    }
234
235    /// If this is a `DJMMySetting`, return a reference to it.
236    #[must_use]
237    pub fn as_djm_my_setting(&self) -> Option<&DJMMySetting> {
238        match &self {
239            Self::DJMMySetting(ds) => Some(ds),
240            _ => None,
241        }
242    }
243
244    /// If this is a `MySetting`, return a reference to it.
245    #[must_use]
246    pub fn as_my_setting(&self) -> Option<&MySetting> {
247        match &self {
248            Self::MySetting(ds) => Some(ds),
249            _ => None,
250        }
251    }
252
253    /// If this is a `MySetting2`, return a reference to it.
254    #[must_use]
255    pub fn as_my_setting2(&self) -> Option<&MySetting2> {
256        match &self {
257            Self::MySetting2(ds) => Some(ds),
258            _ => None,
259        }
260    }
261}
262
263/// Payload of a `DEVSETTING.DAT` file (32 bytes).
264#[binrw]
265#[derive(Debug, PartialEq, Eq, Clone)]
266#[brw(little)]
267pub struct DevSetting {
268    /// Unknown field.
269    #[br(assert(unknown1 == [0x78, 0x56, 0x34, 0x12, 0x01, 0x00, 0x00, 0x00, 0x01]))]
270    unknown1: [u8; 9],
271    /// "Type of the overview Waveform" setting.
272    pub overview_waveform_type: OverviewWaveformType,
273    /// "Waveform color" setting.
274    pub waveform_color: WaveformColor,
275    /// Unknown field.
276    #[br(assert(unknown2 == 0x01))]
277    unknown2: u8,
278    /// "Key display format" setting.
279    pub key_display_format: KeyDisplayFormat,
280    /// "Waveform Current Position" setting.
281    pub waveform_current_position: WaveformCurrentPosition,
282    /// Unknown field.
283    #[br(assert(unknown3 == [0x00; 18]))]
284    unknown3: [u8; 18],
285}
286
287impl Default for DevSetting {
288    fn default() -> Self {
289        Self {
290            unknown1: [0x78, 0x56, 0x34, 0x12, 0x01, 0x00, 0x00, 0x00, 0x01],
291            overview_waveform_type: OverviewWaveformType::default(),
292            waveform_color: WaveformColor::default(),
293            key_display_format: KeyDisplayFormat::default(),
294            unknown2: 0x01,
295            waveform_current_position: WaveformCurrentPosition::default(),
296            unknown3: [0x00; 18],
297        }
298    }
299}
300
301/// Payload of a `DJMMYSETTING.DAT` file (52 bytes).
302#[binrw]
303#[derive(Debug, PartialEq, Eq, Clone)]
304#[brw(little)]
305pub struct DJMMySetting {
306    /// Unknown field.
307    unknown1: [u8; 12],
308    /// "CH FADER CURVE" setting.
309    pub channel_fader_curve: ChannelFaderCurve,
310    /// "CROSSFADER CURVE" setting.
311    pub crossfader_curve: CrossfaderCurve,
312    /// "HEADPHONES PRE EQ" setting.
313    pub headphones_pre_eq: HeadphonesPreEQ,
314    /// "HEADPHONES MONO SPLIT" setting.
315    pub headphones_mono_split: HeadphonesMonoSplit,
316    /// "BEAT FX QUANTIZE" setting.
317    pub beat_fx_quantize: BeatFXQuantize,
318    /// "MIC LOW CUT" setting.
319    pub mic_low_cut: MicLowCut,
320    /// "TALK OVER MODE" setting.
321    pub talk_over_mode: TalkOverMode,
322    /// "TALK OVER LEVEL" setting.
323    pub talk_over_level: TalkOverLevel,
324    /// "MIDI CH" setting.
325    pub midi_channel: MidiChannel,
326    /// "MIDI BUTTON TYPE" setting.
327    pub midi_button_type: MidiButtonType,
328    /// "BRIGHTNESS > DISPLAY" setting.
329    pub display_brightness: MixerDisplayBrightness,
330    /// "BRIGHTNESS > INDICATOR" setting.
331    pub indicator_brightness: MixerIndicatorBrightness,
332    /// "CH FADER CURVE (LONG FADER)" setting.
333    pub channel_fader_curve_long_fader: ChannelFaderCurveLongFader,
334    /// Unknown field (apparently always 0).
335    #[br(assert(unknown2 == [0; 27]))]
336    unknown2: [u8; 27],
337}
338
339impl Default for DJMMySetting {
340    fn default() -> Self {
341        Self {
342            unknown1: [
343                0x78, 0x56, 0x34, 0x12, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
344            ],
345            channel_fader_curve: ChannelFaderCurve::default(),
346            crossfader_curve: CrossfaderCurve::default(),
347            headphones_pre_eq: HeadphonesPreEQ::default(),
348            headphones_mono_split: HeadphonesMonoSplit::default(),
349            beat_fx_quantize: BeatFXQuantize::default(),
350            mic_low_cut: MicLowCut::default(),
351            talk_over_mode: TalkOverMode::default(),
352            talk_over_level: TalkOverLevel::default(),
353            midi_channel: MidiChannel::default(),
354            midi_button_type: MidiButtonType::default(),
355            display_brightness: MixerDisplayBrightness::default(),
356            indicator_brightness: MixerIndicatorBrightness::default(),
357            channel_fader_curve_long_fader: ChannelFaderCurveLongFader::default(),
358            unknown2: [0; 27],
359        }
360    }
361}
362
363/// Payload of a `MYSETTING.DAT` file (40 bytes).
364#[binrw]
365#[derive(Debug, PartialEq, Eq, Clone)]
366#[brw(little)]
367pub struct MySetting {
368    /// Unknown field.
369    unknown1: [u8; 8],
370    /// "ON AIR DISPLAY" setting.
371    pub on_air_display: OnAirDisplay,
372    /// "LCD BRIGHTNESS" setting.
373    pub lcd_brightness: LCDBrightness,
374    /// "QUANTIZE" setting.
375    pub quantize: Quantize,
376    /// "AUTO CUE LEVEL" setting.
377    pub auto_cue_level: AutoCueLevel,
378    /// "LANGUAGE" setting.
379    pub language: Language,
380    /// Unknown field.
381    unknown2: u8,
382    /// "JOG RING BRIGHTNESS" setting.
383    pub jog_ring_brightness: JogRingBrightness,
384    /// "JOG RING INDICATOR" setting.
385    pub jog_ring_indicator: JogRingIndicator,
386    /// "SLIP FLASHING" setting.
387    pub slip_flashing: SlipFlashing,
388    /// Unknown field.
389    unknown3: [u8; 3],
390    /// "DISC SLOT ILLUMINATION" setting.
391    pub disc_slot_illumination: DiscSlotIllumination,
392    /// "EJECT/LOAD LOCK" setting.
393    pub eject_lock: EjectLock,
394    /// "SYNC" setting.
395    pub sync: Sync,
396    /// "PLAY MODE / AUTO PLAY MODE" setting.
397    pub play_mode: PlayMode,
398    /// Quantize Beat Value setting.
399    pub quantize_beat_value: QuantizeBeatValue,
400    /// "HOT CUE AUTO LOAD" setting.
401    pub hotcue_autoload: HotCueAutoLoad,
402    /// "HOT CUE COLOR" setting.
403    pub hotcue_color: HotCueColor,
404    /// Unknown field (apparently always 0).
405    #[br(assert(unknown4 == 0))]
406    unknown4: u16,
407    /// "NEEDLE LOCK" setting.
408    pub needle_lock: NeedleLock,
409    /// Unknown field (apparently always 0).
410    #[br(assert(unknown5 == 0))]
411    unknown5: u16,
412    /// "TIME MODE" setting.
413    pub time_mode: TimeMode,
414    /// "TIME MODE" setting.
415    pub jog_mode: JogMode,
416    /// "AUTO CUE" setting.
417    pub auto_cue: AutoCue,
418    /// "MASTER TEMPO" setting.
419    pub master_tempo: MasterTempo,
420    /// "TEMPO RANGE" setting.
421    pub tempo_range: TempoRange,
422    /// "PHASE METER" setting.
423    pub phase_meter: PhaseMeter,
424    /// Unknown field (apparently always 0).
425    #[br(assert(unknown6 == 0))]
426    unknown6: u16,
427}
428
429impl Default for MySetting {
430    fn default() -> Self {
431        Self {
432            unknown1: [0x78, 0x56, 0x34, 0x12, 0x02, 0x00, 0x00, 0x00],
433            on_air_display: OnAirDisplay::default(),
434            lcd_brightness: LCDBrightness::default(),
435            quantize: Quantize::default(),
436            auto_cue_level: AutoCueLevel::default(),
437            language: Language::default(),
438            unknown2: 0x01,
439            jog_ring_brightness: JogRingBrightness::default(),
440            jog_ring_indicator: JogRingIndicator::default(),
441            slip_flashing: SlipFlashing::default(),
442            unknown3: [0x01, 0x01, 0x01],
443            disc_slot_illumination: DiscSlotIllumination::default(),
444            eject_lock: EjectLock::default(),
445            sync: Sync::default(),
446            play_mode: PlayMode::default(),
447            quantize_beat_value: QuantizeBeatValue::default(),
448            hotcue_autoload: HotCueAutoLoad::default(),
449            hotcue_color: HotCueColor::default(),
450            unknown4: 0x0000,
451            needle_lock: NeedleLock::default(),
452            unknown5: 0x0000,
453            time_mode: TimeMode::default(),
454            jog_mode: JogMode::default(),
455            auto_cue: AutoCue::default(),
456            master_tempo: MasterTempo::default(),
457            tempo_range: TempoRange::default(),
458            phase_meter: PhaseMeter::default(),
459            unknown6: 0x0000,
460        }
461    }
462}
463
464/// Payload of a `MYSETTING2.DAT` file (40 bytes).
465#[binrw]
466#[derive(Debug, PartialEq, Eq, Clone)]
467#[brw(little)]
468pub struct MySetting2 {
469    /// "VINYL SPEED ADJUST" setting.
470    pub vinyl_speed_adjust: VinylSpeedAdjust,
471    /// "JOG DISPLAY MODE" setting.
472    pub jog_display_mode: JogDisplayMode,
473    /// "PAD/BUTTON BRIGHTNESS" setting.
474    pub pad_button_brightness: PadButtonBrightness,
475    /// "JOG LCD BRIGHTNESS" setting.
476    pub jog_lcd_brightness: JogLCDBrightness,
477    /// "WAVEFORM DIVISIONS" setting.
478    pub waveform_divisions: WaveformDivisions,
479    /// Unknown field (apparently always 0).
480    #[br(assert(unknown1 == [0; 5]))]
481    unknown1: [u8; 5],
482    /// "WAVEFORM / PHASE METER" setting.
483    pub waveform: Waveform,
484    /// Unknown field.
485    unknown2: u8,
486    /// "BEAT JUMP BEAT VALUE" setting.
487    pub beat_jump_beat_value: BeatJumpBeatValue,
488    /// Unknown field (apparently always 0).
489    #[br(assert(unknown3 == [0; 27]))]
490    unknown3: [u8; 27],
491}
492
493impl Default for MySetting2 {
494    fn default() -> Self {
495        Self {
496            vinyl_speed_adjust: VinylSpeedAdjust::default(),
497            jog_display_mode: JogDisplayMode::default(),
498            pad_button_brightness: PadButtonBrightness::default(),
499            jog_lcd_brightness: JogLCDBrightness::default(),
500            waveform_divisions: WaveformDivisions::default(),
501            unknown1: [0; 5],
502            waveform: Waveform::default(),
503            unknown2: 0x81,
504            beat_jump_beat_value: BeatJumpBeatValue::default(),
505            unknown3: [0; 27],
506        }
507    }
508}
509
510/// Found at "PLAYER > DJ SETTING > PLAY MODE / AUTO PLAY MODE" of the "My Settings" page in the
511/// Rekordbox preferences.
512#[binrw]
513#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
514#[brw(repr = u8)]
515pub enum PlayMode {
516    /// Named "CONTINUE / ON" in the Rekordbox preferences.
517    #[display("Continue / On")]
518    Continue = 0x80,
519    /// Named "SINGLE / OFF" in the Rekordbox preferences.
520    #[display("Single / Off")]
521    #[default]
522    Single,
523}
524
525/// Found at "PLAYER > DJ SETTING > EJECT/LOAD LOCK" of the "My Settings" page in the Rekordbox
526/// preferences.
527#[binrw]
528#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
529#[brw(repr = u8)]
530pub enum EjectLock {
531    /// Named "UNLOCK" in the Rekordbox preferences.
532    #[default]
533    Unlock = 0x80,
534    /// Named "LOCK" in the Rekordbox preferences.
535    Lock,
536}
537
538/// Found at "PLAYER > DJ SETTING > NEEDLE LOCK" of the "My Settings" page in the Rekordbox
539/// preferences.
540#[binrw]
541#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
542#[brw(repr = u8)]
543pub enum NeedleLock {
544    /// Named "UNLOCK" in the Rekordbox preferences.
545    Unlock = 0x80,
546    /// Named "LOCK" in the Rekordbox preferences.
547    #[default]
548    Lock,
549}
550
551/// Found at "PLAYER > DJ SETTING > QUANTIZE BEAT VALUE" of the "My Settings" page in the Rekordbox
552/// preferences.
553#[binrw]
554#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
555#[brw(repr = u8)]
556pub enum QuantizeBeatValue {
557    /// Named "1/8 Beat" in the Rekordbox preferences.
558    #[display("1/8 Beat")]
559    EighthBeat = 0x83,
560    /// Named "1/4 Beat" in the Rekordbox preferences.
561    #[display("1/4 Beat")]
562    QuarterBeat = 0x82,
563    /// Named "1/2 Beat" in the Rekordbox preferences.
564    #[display("1/2 Beat")]
565    HalfBeat = 0x81,
566    /// Named "1 Beat" in the Rekordbox preferences.
567    #[default]
568    #[display("1 Beat")]
569    FullBeat = 0x80,
570}
571
572/// Found at "PLAYER > DJ SETTING > HOT CUE AUTO LOAD" of the "My Settings" page in the Rekordbox
573/// preferences.
574#[binrw]
575#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
576#[brw(repr = u8)]
577pub enum HotCueAutoLoad {
578    /// Named "OFF" in the Rekordbox preferences.
579    Off = 0x80,
580    /// Named "rekordbox SETTING" in the Rekordbox preferences.
581    #[display("rekordbox SETTING")]
582    RekordboxSetting = 0x82,
583    /// Named "On" in the Rekordbox preferences.
584    #[default]
585    On = 0x81,
586}
587
588/// Found at "PLAYER > DJ SETTING > HOT CUE COLOR" of the "My Settings" page in the Rekordbox
589/// preferences.
590#[binrw]
591#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
592#[brw(repr = u8)]
593pub enum HotCueColor {
594    /// Named "OFF" in the Rekordbox preferences.
595    #[default]
596    Off = 0x80,
597    /// Named "On" in the Rekordbox preferences.
598    On,
599}
600
601/// Found at "PLAYER > DJ SETTING > AUTO CUE LEVEL" of the "My Settings" page in the Rekordbox
602/// preferences.
603#[binrw]
604#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
605#[brw(repr = u8)]
606pub enum AutoCueLevel {
607    /// Named "-78dB" in the Rekordbox preferences.
608    #[display("-78dB")]
609    Minus78dB = 0x87,
610    /// Named "-72dB" in the Rekordbox preferences.
611    #[display("-72dB")]
612    Minus72dB = 0x86,
613    /// Named "-66dB" in the Rekordbox preferences.
614    #[display("-66dB")]
615    Minus66dB = 0x85,
616    /// Named "-60dB" in the Rekordbox preferences.
617    #[display("-60dB")]
618    Minus60dB = 0x84,
619    /// Named "-54dB" in the Rekordbox preferences.
620    #[display("-54dB")]
621    Minus54dB = 0x83,
622    /// Named "-48dB" in the Rekordbox preferences.
623    #[display("-48dB")]
624    Minus48dB = 0x82,
625    /// Named "-42dB" in the Rekordbox preferences.
626    #[display("-42dB")]
627    Minus42dB = 0x81,
628    /// Named "-36dB" in the Rekordbox preferences.
629    #[display("-36dB")]
630    Minus36dB = 0x80,
631    /// Named "MEMORY" in the Rekordbox preferences.
632    #[default]
633    Memory = 0x88,
634}
635
636/// Found at "PLAYER > DJ SETTING > TIME MODE" of the "My Settings" page in the Rekordbox
637/// preferences.
638#[binrw]
639#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
640#[brw(repr = u8)]
641pub enum TimeMode {
642    /// Named "Elapsed" in the Rekordbox preferences.
643    Elapsed = 0x80,
644    /// Named "REMAIN" in the Rekordbox preferences.
645    #[default]
646    Remain,
647}
648
649/// Found at "PLAYER > DJ SETTING > AUTO CUE" of the "My Settings" page in the Rekordbox
650/// preferences.
651#[binrw]
652#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
653#[brw(repr = u8)]
654pub enum AutoCue {
655    /// Named "OFF" in the Rekordbox preferences.
656    Off = 0x80,
657    /// Named "ON" in the Rekordbox preferences.
658    #[default]
659    On,
660}
661
662/// Found at "PLAYER > DJ SETTING > JOG MODE" of the "My Settings" page in the Rekordbox
663/// preferences.
664#[binrw]
665#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
666#[brw(repr = u8)]
667pub enum JogMode {
668    /// Named "VINYL" in the Rekordbox preferences.
669    #[default]
670    Vinyl = 0x81,
671    /// Named "CDJ" in the Rekordbox preferences.
672    CDJ = 0x80,
673}
674
675/// Found at "PLAYER > DJ SETTING > TEMPO RANGE" of the "My Settings" page in the Rekordbox
676/// preferences.
677#[binrw]
678#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
679#[brw(repr = u8)]
680pub enum TempoRange {
681    /// Named "±6" in the Rekordbox preferences.
682    #[display("±6%")]
683    SixPercent = 0x80,
684    /// Named "±10" in the Rekordbox preferences.
685    #[display("±10%")]
686    #[default]
687    TenPercent,
688    /// Named "±16" in the Rekordbox preferences.
689    #[display("±16%")]
690    SixteenPercent,
691    /// Named "WIDE" in the Rekordbox preferences.
692    Wide,
693}
694
695/// Found at "PLAYER > DJ SETTING > MASTER TEMPO" of the "My Settings" page in the Rekordbox
696/// preferences.
697#[binrw]
698#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
699#[brw(repr = u8)]
700pub enum MasterTempo {
701    /// Named "OFF" in the Rekordbox preferences.
702    #[default]
703    Off = 0x80,
704    /// Named "ON" in the Rekordbox preferences.
705    On,
706}
707
708/// Found at "PLAYER > DJ SETTING > QUANTIZE" of the "My Settings" page in the Rekordbox
709/// preferences.
710#[binrw]
711#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
712#[brw(repr = u8)]
713pub enum Quantize {
714    /// Named "OFF" in the Rekordbox preferences.
715    Off = 0x80,
716    /// Named "ON" in the Rekordbox preferences.
717    #[default]
718    On,
719}
720
721/// Found at "PLAYER > DJ SETTING > SYNC" of the "My Settings" page in the Rekordbox
722/// preferences.
723#[binrw]
724#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
725#[brw(repr = u8)]
726pub enum Sync {
727    /// Named "OFF" in the Rekordbox preferences.
728    #[default]
729    Off = 0x80,
730    /// Named "ON" in the Rekordbox preferences.
731    On,
732}
733
734/// Found at "PLAYER > DJ SETTING > PHASE METER" of the "My Settings" page in the Rekordbox
735/// preferences.
736#[binrw]
737#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
738#[brw(repr = u8)]
739pub enum PhaseMeter {
740    /// Named "TYPE 1" in the Rekordbox preferences.
741    #[default]
742    #[display("Type 1")]
743    Type1 = 0x80,
744    /// Named "TYPE 2" in the Rekordbox preferences.
745    #[display("Type 2")]
746    Type2,
747}
748
749/// Found at "PLAYER > DJ SETTING > WAVEFORM / PHASE METER" of the "My Settings" page in the Rekordbox
750/// preferences.
751#[binrw]
752#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
753#[brw(repr = u8)]
754pub enum Waveform {
755    /// Named "WAVEFORM" in the Rekordbox preferences.
756    #[default]
757    Waveform = 0x80,
758    /// Named "PHASE METER" in the Rekordbox preferences.
759    #[display("Phase Meter")]
760    PhaseMeter,
761}
762
763/// Found at "PLAYER > DJ SETTING > WAVEFORM DIVISIONS" of the "My Settings" page in the Rekordbox
764/// preferences.
765#[binrw]
766#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
767#[brw(repr = u8)]
768pub enum WaveformDivisions {
769    /// Named "TIME SCALE" in the Rekordbox preferences.
770    #[display("Time Scale")]
771    TimeScale = 0x80,
772    /// Named "PHRASE" in the Rekordbox preferences.
773    #[default]
774    Phrase,
775}
776
777/// Found at "PLAYER > DJ SETTING > VINYL SPEED ADJUST" of the "My Settings" page in the Rekordbox
778/// preferences.
779#[binrw]
780#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
781#[brw(repr = u8)]
782pub enum VinylSpeedAdjust {
783    /// Named "TOUCH & RELEASE" in the Rekordbox preferences.
784    #[display("Touch & Release")]
785    TouchRelease = 0x80,
786    /// Named "TOUCH" in the Rekordbox preferences.
787    #[default]
788    Touch,
789    /// Named "RELEASE" in the Rekordbox preferences.
790    Release,
791}
792
793/// Found at "PLAYER > DJ SETTING > BEAT JUMP BEAT VALUE" of the "My Settings" page in the Rekordbox
794/// preferences.
795#[binrw]
796#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
797#[brw(repr = u8)]
798pub enum BeatJumpBeatValue {
799    /// Named "1/2 BEAT" in the Rekordbox preferences.
800    #[display("1/2 Beat")]
801    HalfBeat = 0x80,
802    /// Named "1 BEAT" in the Rekordbox preferences.
803    #[display("1 Beat")]
804    OneBeat,
805    /// Named "2 BEAT" in the Rekordbox preferences.
806    #[display("2 Beat")]
807    TwoBeat,
808    /// Named "4 BEAT" in the Rekordbox preferences.
809    #[display("4 Beat")]
810    FourBeat,
811    /// Named "8 BEAT" in the Rekordbox preferences.
812    #[display("8 Beat")]
813    EightBeat,
814    /// Named "16 BEAT" in the Rekordbox preferences.
815    #[display("16 Beat")]
816    #[default]
817    SixteenBeat,
818    /// Named "32 BEAT" in the Rekordbox preferences.
819    #[display("32 Beat")]
820    ThirtytwoBeat,
821    /// Named "64 BEAT" in the Rekordbox preferences.
822    #[display("64 Beat")]
823    SixtyfourBeat,
824}
825
826/// Found at "PLAYER > DISPLAY(LCD) > LANGUAGE" of the "My Settings" page in the Rekordbox
827/// preferences.
828#[binrw]
829#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
830#[brw(repr = u8)]
831pub enum Language {
832    /// Named "English" in the Rekordbox preferences.
833    #[default]
834    English = 0x81,
835    /// Named "Français" in the Rekordbox preferences.
836    #[display("Français")]
837    French,
838    /// Named "Deutsch" in the Rekordbox preferences.
839    #[display("Deutsch")]
840    German,
841    /// Named "Italiano" in the Rekordbox preferences.
842    #[display("Italiano")]
843    Italian,
844    /// Named "Nederlands" in the Rekordbox preferences.
845    #[display("Nederlands")]
846    Dutch,
847    /// Named "Español" in the Rekordbox preferences.
848    #[display("Español")]
849    Spanish,
850    /// Named "Русский" in the Rekordbox preferences.
851    #[display("Русский")]
852    Russian,
853    /// Named "한국어" in the Rekordbox preferences.
854    #[display("한국어")]
855    Korean,
856    /// Named "简体中文" in the Rekordbox preferences.
857    ChineseSimplified,
858    #[display("简体中文")]
859    /// Named "繁體中文" in the Rekordbox preferences.
860    #[display("繁體中文")]
861    ChineseTraditional,
862    /// Named "日本語" in the Rekordbox preferences.
863    #[display("日本語")]
864    Japanese,
865    /// Named "Português" in the Rekordbox preferences.
866    #[display("Português")]
867    Portuguese,
868    /// Named "Svenska" in the Rekordbox preferences.
869    #[display("Svenska")]
870    Swedish,
871    /// Named "Čeština" in the Rekordbox preferences.
872    #[display("Čeština")]
873    Czech,
874    /// Named "Magyar" in the Rekordbox preferences.
875    #[display("Magyar")]
876    Hungarian,
877    /// Named "Dansk" in the Rekordbox preferences.
878    #[display("Dansk")]
879    Danish,
880    /// Named "Ελληνικά" in the Rekordbox preferences.
881    #[display("Ελληνικά")]
882    Greek,
883    /// Named "Türkçe" in the Rekordbox preferences.
884    #[display("Türkçe")]
885    Turkish,
886}
887
888/// Found at "PLAYER > DISPLAY(LCD) > LCD BRIGHTNESS" of the "My Settings" page in the Rekordbox
889/// preferences.
890#[binrw]
891#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
892#[brw(repr = u8)]
893pub enum LCDBrightness {
894    /// Named "1" in the Rekordbox preferences.
895    #[display("1")]
896    One = 0x81,
897    /// Named "2" in the Rekordbox preferences.
898    #[display("2")]
899    Two,
900    /// Named "3" in the Rekordbox preferences.
901    #[display("3")]
902    #[default]
903    Three,
904    /// Named "4" in the Rekordbox preferences.
905    #[display("4")]
906    Four,
907    /// Named "5" in the Rekordbox preferences.
908    #[display("5")]
909    Five,
910}
911
912/// Found at "PLAYER > DISPLAY(LCD) > JOG LCD BRIGHTNESS" of the "My Settings" page in the Rekordbox
913/// preferences.
914#[binrw]
915#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
916#[brw(repr = u8)]
917pub enum JogLCDBrightness {
918    /// Named "1" in the Rekordbox preferences.
919    #[display("1")]
920    One = 0x81,
921    /// Named "2" in the Rekordbox preferences.
922    #[display("2")]
923    Two,
924    /// Named "3" in the Rekordbox preferences.
925    #[display("3")]
926    #[default]
927    Three,
928    /// Named "4" in the Rekordbox preferences.
929    #[display("4")]
930    Four,
931    /// Named "5" in the Rekordbox preferences.
932    #[display("5")]
933    Five,
934}
935
936/// Found at "PLAYER > DISPLAY(LCD) > JOG DISPLAY MODE" of the "My Settings" page in the Rekordbox
937/// preferences.
938#[binrw]
939#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
940#[brw(repr = u8)]
941pub enum JogDisplayMode {
942    /// Named "AUTO" in the Rekordbox preferences.
943    #[default]
944    Auto = 0x80,
945    /// Named "INFO" in the Rekordbox preferences.
946    Info,
947    /// Named "SIMPLE" in the Rekordbox preferences.
948    Simple,
949    /// Named "ARTWORK" in the Rekordbox preferences.
950    Artwork,
951}
952
953/// Found at "PLAYER > DISPLAY(INDICATOR) > SLIP FLASHING" of the "My Settings" page in the Rekordbox
954/// preferences.
955#[binrw]
956#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
957#[brw(repr = u8)]
958pub enum SlipFlashing {
959    /// Named "OFF" in the Rekordbox preferences.
960    Off = 0x80,
961    /// Named "ON" in the Rekordbox preferences.
962    #[default]
963    On,
964}
965
966/// Found at "PLAYER > DISPLAY(INDICATOR) > ON AIR DISPLAY" of the "My Settings" page in the Rekordbox
967/// preferences.
968#[binrw]
969#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
970#[brw(repr = u8)]
971pub enum OnAirDisplay {
972    /// Named "OFF" in the Rekordbox preferences.
973    Off = 0x80,
974    /// Named "ON" in the Rekordbox preferences.
975    #[default]
976    On,
977}
978
979/// Found at "PLAYER > DISPLAY(INDICATOR) > JOG RING BRIGHTNESS" of the "My Settings" page in the Rekordbox
980/// preferences.
981#[binrw]
982#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
983#[brw(repr = u8)]
984pub enum JogRingBrightness {
985    /// Named "OFF" in the Rekordbox preferences.
986    Off = 0x80,
987    /// Named "1 (Dark)" in the Rekordbox preferences.
988    #[display("1 (Dark)")]
989    Dark,
990    /// Named "2 (Bright)" in the Rekordbox preferences.
991    #[display("2 (Bright)")]
992    #[default]
993    Bright,
994}
995
996/// Found at "PLAYER > DISPLAY(INDICATOR) > JOG RING INDICATOR" of the "My Settings" page in the Rekordbox
997/// preferences.
998#[binrw]
999#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1000#[brw(repr = u8)]
1001pub enum JogRingIndicator {
1002    /// Named "OFF" in the Rekordbox preferences.
1003    Off = 0x80,
1004    /// Named "ON" in the Rekordbox preferences.
1005    #[default]
1006    On,
1007}
1008
1009/// Found at "PLAYER > DISPLAY(INDICATOR) > DISC SLOT ILLUMINATION" of the "My Settings" page in the Rekordbox
1010/// preferences.
1011#[binrw]
1012#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1013#[brw(repr = u8)]
1014pub enum DiscSlotIllumination {
1015    /// Named "OFF" in the Rekordbox preferences.
1016    Off = 0x80,
1017    /// Named "1 (Dark)" in the Rekordbox preferences.
1018    #[display("1 (Dark)")]
1019    Dark,
1020    /// Named "2 (Bright)" in the Rekordbox preferences.
1021    #[display("2 (Bright)")]
1022    #[default]
1023    Bright,
1024}
1025
1026/// Found at "PLAYER > DISPLAY(INDICATOR) > PAD/BUTTON BRIGHTNESS" of the "My Settings" page in the Rekordbox
1027/// preferences.
1028#[binrw]
1029#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1030#[brw(repr = u8)]
1031pub enum PadButtonBrightness {
1032    /// Named "1" in the Rekordbox preferences.
1033    #[display("1")]
1034    One = 0x81,
1035    /// Named "2" in the Rekordbox preferences.
1036    #[display("2")]
1037    Two,
1038    /// Named "3" in the Rekordbox preferences.
1039    #[display("3")]
1040    #[default]
1041    Three,
1042    /// Named "4" in the Rekordbox preferences.
1043    #[display("4")]
1044    Four,
1045}
1046
1047/// Found at "MIXER > DJ SETTING > CH FADER CURVE" of the "My Settings" page in the Rekordbox
1048/// preferences.
1049#[binrw]
1050#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1051#[brw(repr = u8)]
1052pub enum ChannelFaderCurve {
1053    /// Steep volume raise when the fader is moved near the top.
1054    #[display("Steep Top")]
1055    SteepTop = 0x80,
1056    /// Linear volume raise when the fader is moved.
1057    #[display("Linear")]
1058    #[default]
1059    Linear,
1060    /// Steep volume raise when the fader is moved near the bottom.
1061    #[display("Steep Bottom")]
1062    SteepBottom,
1063}
1064
1065/// Found at "MIXER > DJ SETTING > CROSSFADER CURVE" of the "My Settings" page in the Rekordbox
1066/// preferences.
1067#[binrw]
1068#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1069#[brw(repr = u8)]
1070pub enum CrossfaderCurve {
1071    /// Logarithmic volume raise of the other channel near the edges of the fader.
1072    #[display("Constant Power")]
1073    ConstantPower = 0x80,
1074    /// Steep linear volume raise of the other channel near the edges of the fader, no volume
1075    /// change in the center.
1076    #[display("Slow Cut")]
1077    SlowCut,
1078    /// Steep linear volume raise of the other channel near the edges of the fader, no volume
1079    /// change in the center.
1080    #[display("Fast Cut")]
1081    #[default]
1082    FastCut,
1083}
1084
1085/// Found at "MIXER > DJ SETTING > CH FADER CURVE (LONG FADER)" of the "My Settings" page in the
1086/// Rekordbox preferences.
1087#[binrw]
1088#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1089#[brw(repr = u8)]
1090pub enum ChannelFaderCurveLongFader {
1091    /// Very steep volume raise when the fader is moved the near the top (e.g. y = x⁵).
1092    #[default]
1093    Exponential = 0x80,
1094    /// Steep volume raise when the fader is moved the near the top (e.g. y = x²).
1095    Smooth,
1096    /// Linear volume raise when the fader is moved (e.g. y = k * x).
1097    Linear,
1098}
1099
1100/// Found at "MIXER > DJ SETTING > HEADPHONES PRE EQ" of the "My Settings" page in the
1101/// Rekordbox preferences.
1102#[binrw]
1103#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1104#[brw(repr = u8)]
1105pub enum HeadphonesPreEQ {
1106    /// Named "POST EQ" in the Rekordbox preferences.
1107    #[default]
1108    #[display("Post EQ")]
1109    PostEQ = 0x80,
1110    /// Named "PRE EQ" in the Rekordbox preferences.
1111    #[display("Pre EQ")]
1112    PreEQ,
1113}
1114
1115/// Found at "MIXER > DJ SETTING > HEADPHONES MONO SPLIT" of the "My Settings" page in the
1116/// Rekordbox preferences.
1117#[binrw]
1118#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1119#[brw(repr = u8)]
1120pub enum HeadphonesMonoSplit {
1121    /// Named "MONO SPLIT" in the Rekordbox preferences.
1122    #[display("Mono Split")]
1123    MonoSplit = 0x81,
1124    /// Named "STEREO" in the Rekordbox preferences.
1125    #[default]
1126    Stereo = 0x80,
1127}
1128
1129/// Found at "MIXER > DJ SETTING > BEAT FX QUANTIZE" of the "My Settings" page in the
1130/// Rekordbox preferences.
1131#[binrw]
1132#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1133#[brw(repr = u8)]
1134pub enum BeatFXQuantize {
1135    /// Named "OFF" in the Rekordbox preferences.
1136    Off = 0x80,
1137    /// Named "ON" in the Rekordbox preferences.
1138    #[default]
1139    On,
1140}
1141
1142/// Found at "MIXER > DJ SETTING > MIC LOW CUT" of the "My Settings" page in the
1143/// Rekordbox preferences.
1144#[binrw]
1145#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1146#[brw(repr = u8)]
1147pub enum MicLowCut {
1148    /// Named "OFF" in the Rekordbox preferences.
1149    Off = 0x80,
1150    /// Named "ON(for MC)" in the Rekordbox preferences.
1151    #[default]
1152    On,
1153}
1154
1155/// Found at "MIXER > DJ SETTING > TALK OVER MODE" of the "My Settings" page in the Rekordbox
1156/// preferences.
1157#[binrw]
1158#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1159#[brw(repr = u8)]
1160pub enum TalkOverMode {
1161    /// Named "ADVANCED" in the Rekordbox preferences.
1162    #[default]
1163    Advanced = 0x80,
1164    /// Named "NORMAL" in the Rekordbox preferences.
1165    Normal,
1166}
1167
1168/// Found at "MIXER > DJ SETTING > TALK OVER LEVEL" of the "My Settings" page in the Rekordbox
1169/// preferences.
1170#[binrw]
1171#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1172#[brw(repr = u8)]
1173pub enum TalkOverLevel {
1174    /// Named "-24dB" in the Rekordbox preferences.
1175    #[display("-24dB")]
1176    Minus24dB = 0x80,
1177    /// Named "-18dB" in the Rekordbox preferences.
1178    #[default]
1179    #[display("-18dB")]
1180    Minus18dB,
1181    /// Named "-12dB" in the Rekordbox preferences.
1182    #[display("-12dB")]
1183    Minus12dB,
1184    /// Named "-6dB" in the Rekordbox preferences.
1185    #[display("-6dB")]
1186    Minus6dB,
1187}
1188
1189/// Found at "MIXER > DJ SETTING > MIDI CH" of the "My Settings" page in the Rekordbox
1190/// preferences.
1191#[binrw]
1192#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1193#[brw(repr = u8)]
1194pub enum MidiChannel {
1195    /// Named "1" in the Rekordbox preferences.
1196    #[default]
1197    #[display("1")]
1198    One = 0x80,
1199    /// Named "2" in the Rekordbox preferences.
1200    #[display("2")]
1201    Two,
1202    /// Named "3" in the Rekordbox preferences.
1203    #[display("3")]
1204    Three,
1205    /// Named "4" in the Rekordbox preferences.
1206    #[display("4")]
1207    Four,
1208    /// Named "5" in the Rekordbox preferences.
1209    #[display("5")]
1210    Five,
1211    /// Named "6" in the Rekordbox preferences.
1212    #[display("6")]
1213    Six,
1214    /// Named "7" in the Rekordbox preferences.
1215    #[display("7")]
1216    Seven,
1217    /// Named "8" in the Rekordbox preferences.
1218    #[display("8")]
1219    Eight,
1220    /// Named "9" in the Rekordbox preferences.
1221    #[display("9")]
1222    Nine,
1223    /// Named "10" in the Rekordbox preferences.
1224    #[display("10")]
1225    Ten,
1226    /// Named "11" in the Rekordbox preferences.
1227    #[display("11")]
1228    Eleven,
1229    /// Named "12" in the Rekordbox preferences.
1230    #[display("12")]
1231    Twelve,
1232    /// Named "13" in the Rekordbox preferences.
1233    #[display("13")]
1234    Thirteen,
1235    /// Named "14" in the Rekordbox preferences.
1236    #[display("14")]
1237    Fourteen,
1238    /// Named "15" in the Rekordbox preferences.
1239    #[display("15")]
1240    Fifteen,
1241    /// Named "16" in the Rekordbox preferences.
1242    #[display("16")]
1243    Sixteen,
1244}
1245
1246/// Found at "MIXER > DJ SETTING > MIDI BUTTON TYPE" of the "My Settings" page in the Rekordbox
1247/// preferences.
1248#[binrw]
1249#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1250#[brw(repr = u8)]
1251pub enum MidiButtonType {
1252    #[default]
1253    /// Named "TOGGLE" in the Rekordbox preferences.
1254    Toggle = 0x80,
1255    /// Named "TRIGGER" in the Rekordbox preferences.
1256    Trigger,
1257}
1258
1259/// Found at "MIXER > BRIGHTNESS > DISPLAY" of the "My Settings" page in the Rekordbox
1260/// preferences.
1261#[binrw]
1262#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1263#[brw(repr = u8)]
1264pub enum MixerDisplayBrightness {
1265    /// Named "WHITE" in the Rekordbox preferences.
1266    White = 0x80,
1267    /// Named "1" in the Rekordbox preferences.
1268    #[display("1")]
1269    One,
1270    /// Named "2" in the Rekordbox preferences.
1271    #[display("2")]
1272    Two,
1273    /// Named "3" in the Rekordbox preferences.
1274    #[display("3")]
1275    Three,
1276    /// Named "4" in the Rekordbox preferences.
1277    #[display("4")]
1278    Four,
1279    /// Named "5" in the Rekordbox preferences.
1280    #[default]
1281    #[display("5")]
1282    Five,
1283}
1284
1285/// Found at "MIXER > BRIGHTNESS > INDICATOR" of the "My Settings" page in the Rekordbox
1286/// preferences.
1287#[binrw]
1288#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1289#[brw(repr = u8)]
1290pub enum MixerIndicatorBrightness {
1291    /// Named "1" in the Rekordbox preferences.
1292    #[display("1")]
1293    One = 0x80,
1294    /// Named "2" in the Rekordbox preferences.
1295    #[display("2")]
1296    Two,
1297    /// Named "3" in the Rekordbox preferences.
1298    #[display("3")]
1299    #[default]
1300    Three,
1301}
1302
1303/// Waveform color displayed on the CDJ.
1304///
1305/// Found on the "General" page in the Rekordbox preferences.
1306#[binrw]
1307#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1308#[brw(repr = u8)]
1309pub enum WaveformColor {
1310    /// Named "BLUE" in the Rekordbox preferences.
1311    #[default]
1312    Blue = 0x01,
1313    /// Named "RGB" in the Rekordbox preferences.
1314    #[display("RGB")]
1315    Rgb = 0x03,
1316    /// Named "3Band" in the Rekordbox preferences.
1317    #[display("3Band")]
1318    TriBand = 0x04,
1319}
1320
1321/// Waveform Current Position displayed on the CDJ.
1322///
1323/// Found on the "General" page in the Rekordbox preferences.
1324#[binrw]
1325#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1326#[brw(repr = u8)]
1327pub enum WaveformCurrentPosition {
1328    /// Named "LEFT" in the Rekordbox preferences.
1329    Left = 0x02,
1330    /// Named "CENTER" in the Rekordbox preferences.
1331    #[default]
1332    Center = 0x01,
1333}
1334
1335/// Type of the Overview Waveform displayed on the CDJ.
1336///
1337/// Found on the "General" page in the Rekordbox preferences.
1338#[binrw]
1339#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1340#[brw(repr = u8)]
1341pub enum OverviewWaveformType {
1342    /// Named "Half Waveform" in the Rekordbox preferences.
1343    #[default]
1344    #[display("Half Waveform")]
1345    HalfWaveform = 0x01,
1346    /// Named "Full Waveform" in the Rekordbox preferences.
1347    #[display("Full Waveform")]
1348    FullWaveform,
1349}
1350
1351/// The key display format displayed on the CDJ.
1352///
1353/// Found on the "General" page in the Rekordbox preferences.
1354#[binrw]
1355#[derive(Display, Debug, PartialEq, Eq, Default, Clone, Copy)]
1356#[brw(repr = u8)]
1357pub enum KeyDisplayFormat {
1358    /// Named "Classic" in the Rekordbox preferences.
1359    #[default]
1360    Classic = 0x01,
1361    /// Named "Alphanumeric" in the Rekordbox preferences.
1362    Alphanumeric,
1363}