rekordcrate/
setting.rs

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