#ifndef _Effects_h
#define _Effects_h

// Global controllers
#define ctrls_glb_pos       0x0
#define ctrls_glb_tempo     0x1
#define ctrls_glb_frames    0x2
#define ctrls_glb_volume    0x3
#define ctrls_glb_last      0x3

// Channel controllers
#define ctrls_ch_instrument 0x0
#define ctrls_ch_pitch      0x1
#define ctrls_ch_ivolume    0x2
#define ctrls_ch_gvolume    0x3
#define ctrls_ch_gpanning   0x4
#define ctrls_ch_pitch2     0x5
#define ctrls_ch_ivolume2   0x6
#define ctrls_ch_last       0x6

// Generic Commands
#define cmd_set                     0x00
#define cmd_setfinal                0x10
#define cmd_up                      0x20
#define cmd_down                    0x30
#define cmd_upmem1                  0x40
#define cmd_downmem1                0x50
#define cmd_upmem2                  0x60
#define cmd_downmem2                0x70
#define cmd_portamento              0x80
#define cmd_vibrato_speed           0x90
#define cmd_vibrato_depth           0xA0
#define flag_cmd_slide_frame0       0x08
#define flag_cmd_slide_frameN0      0x04
#define flag_cmd_slide_frame0N0     0x0C // 0 + N0
#define flag_cmd_vibrato_frame0     0x08
#define flag_cmd_vibrato_frameN0    0x04
#define flag_cmd_vibrato_frame0N0   0x0C // 0 + N0

#define cmd_vibrato_type            0xE0
#define cmd_last_slide              0xE1
#define cmd_vibrato_strength        0xE2
#define cmd_specific                0xF0

// vibrato values
#define vibrato_type_sin        0x00 // [0..255..0..-255..0[
#define vibrato_type_square     0x01 // [255,-255]
#define vibrato_type_ramp       0x02 // [0..255,-255..0[
#define vibrato_type_rampdown   0x03 // [255..0..-255[
#define vibrato_type_random     0x04
#define vibrato_type_saw        0x05 // [0..255..0..-255..0[
#define vibrato_type_halfsquare 0x06 // [255,0]
#define vibrato_type_noretrig   0x08
#define vibrato_type_inverted   0x10
#define vibrato_type_sweep      0x20 // For XM autovibrato

// Global commands

// Position commands
#define gcmd_pos_loop           0x00
#define gcmd_pos_jump           0x10
#define gcmd_pos_break          0x20
#define gcmd_pos_linejump       0x30

// Tempo commands
#define gcmd_tempo_BPM          0xA0
#define gcmd_tempo_TPB          0xB0
#define gcmd_tempo_setlarge     0xC0
#define gcmd_tempo_setfinall    0xD0

// Frames commands
#define gcmd_frames_set         0x00
#define gcmd_frames_up          0x10
#define gcmd_frames_down        0x20
#define gcmd_frames_repeat      0xE0
#define gcmd_frames_delay       0xF0


// Channel commands

// Arpeggio type
#define cmd_arpeggio_type_NHL   0x0
#define cmd_arpeggio_type_mLNH  0x1
#define cmd_arpeggio_type_NHNmL 0x2
#define cmd_arpeggio_type_LLN   0x3

// Pitch extra commands
#define cmd_pitch_setoffset                 0x10 // cmd_setfinal not used
#define cmd_pitch_arpeggio                  0xD0
#define cmd_pitch_upmem3                    0xF0
#define cmd_pitch_downmem4                  0xF1
#define cmd_pitch_upmem5                    0xF2
#define cmd_pitch_downmem6                  0xF3
#define cmd_pitch_semitoneup                0xF4
#define cmd_pitch_semitonedown              0xF5
#define cmd_pitch_semitoneset               0xF6
// Pitch extra commands, mode independant
#define cmd_pitch_auto_up                   0x100
#define cmd_pitch_auto_down                 0x110
#define cmd_pitch_auto_portamento           0x120
#define cmd_pitch_auto_vibrato              0x130
#define cmd_pitch_memslide                  0x180
#define cmd_pitch_memportamento             0x190
#define cmd_pitch_envelope                  0x1F0
#define cmd_pitch_envelope_pos              0x1F1
#define cmd_pitch_glissando                 0x1F2
#define cmd_filter_setresonance             0x1F3
#define cmd_filter_setcutoff                0x1F4
#define cmd_filter_envelope                 0x1F5
#define cmd_filter_envelope_pos             0x1F6

// (I/G)Volume extra commands
#define cmd_volume_upmem1_exp               0xB0
#define cmd_volume_downmem1_exp             0xC0
#define cmd_volume_tremor_IT                0xD0
#define cmd_volume_tremor_ITOld             0xD1
#define cmd_volume_tremor_XM                0xD2
#define cmd_volume_tremor_S3M               0xD3
#define cmd_volume_tremor_MDL               0xD4
#define cmd_volume_envelope                 0xF0
#define cmd_volume_envelope_pos             0xF1
#define cmd_volume_cut                      0xF2
#define cmd_volume_auto_up                  0x100
#define cmd_volume_auto_down                0x110
#define cmd_volume_auto_portamento          0x120
#define cmd_volume_auto_vibrato             0x130
#define cmd_volume_memslide                 0x140

// Panning extra commands
#define cmd_panning_envelope                0xF0
#define cmd_panning_envelope_pos            0xF1

// Sample commands
#define cmd_retrig_count_type_MOD   0x0
#define cmd_retrig_count_type_IT    0x1
#define cmd_retrig_count_type_XM    0x2
#define cmd_retrig_count_type_XMOld 0x3
#define cmd_retrig_count_type_S3M   0x4
#define cmd_retrig_count_type_PTM   0x5

#define cmd_retrig_volume_memory    0x0
#define cmd_retrig_volume_minus4    0x1
#define cmd_retrig_volume_minus8    0x2
#define cmd_retrig_volume_minus16   0x3
#define cmd_retrig_volume_minus32   0x4
#define cmd_retrig_volume_minus64   0x5
#define cmd_retrig_volume_mul2_div3 0x6
#define cmd_retrig_volume_div2      0x7
#define cmd_retrig_volume_equal     0x8
#define cmd_retrig_volume_plus4     0x9
#define cmd_retrig_volume_plus8     0xA
#define cmd_retrig_volume_plus16    0xB
#define cmd_retrig_volume_plus32    0xC
#define cmd_retrig_volume_plus64    0xD
#define cmd_retrig_volume_mul3_div2 0xE
#define cmd_retrig_volume_mul2      0xF
#define cmd_retrig_volume_skip_frame0 0x10 // to be combined with previous

#define cmd_sample_set_offset               0x00
#define cmd_sample_set_finetune             0x10
#define cmd_sample_note_retrig              0x20
#define cmd_sample_note_action_cut          0x30
#define cmd_sample_note_action_off          0x31
#define cmd_sample_note_action_offXM        0x32
#define cmd_sample_note_action_fade         0x33
#define cmd_sample_note_action_sustainoff   0x34
#define cmd_sample_note_delay               0x40
#define cmd_sample_past_note_action_cut     0x50
#define cmd_sample_past_note_action_off     0x51
#define cmd_sample_past_note_action_offXM   0x52
#define cmd_sample_past_note_action_fade    0x53
#define cmd_sample_new_note_action_cut      0x60
#define cmd_sample_new_note_action_off      0x61
#define cmd_sample_new_note_action_offXM    0x62
#define cmd_sample_new_note_action_fade     0x63
#define cmd_sample_new_note_action_continue 0x65
#define cmd_sample_reverse_play             0x70
#define cmd_sample_loop_off                 0x71
#define cmd_sample_loop_normal              0x72
#define cmd_sample_loop_bidi                0x73
#define cmd_sample_note_retrig_counter      0x80
#define cmd_sample_gapper                   0x90
#define cmd_upcall                          0xA0
#define cmd_sample_hold                     0xB0

#endif
