blob: b113d6dbca6caf1ca4fa6a02b83d70fe8fce3493 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
//
// Globals.
//
static int step_counter = 0;
int trig_selection_loc = 0;
int param_selection_loc = 0;
int channel_selection_loc = 0;
int pattern_selection_loc = 0;
int right_col_selection_loc = 0;
int play_status = 0;
int current_pattern = 0;
int next_pattern = 0;
int current_bank = 0;
u32 last_trig_loc = 0;
u32 last_channel_loc = 0;
u32 last_pattern_loc = 0;
u32 last_right_col_loc = 0;
u32 last_step_counter = 0;
bool clear_screen = true;
//
// Color indexes.
//
#define COL_BG 0
#define COL_FG 1
#define COL_ACC_0 2
#define COL_ACC_1 3
#define COL_ACC_2 4
#define COL_OFF 5
#define CHAN_W 19
#define CHAN_H 8
#define CHAN_START_X 30
#define CHAN_START_Y 95
#define CHAN_OFFSET_Y 15
#define TRIG_W 15
#define TRIG_H 22
#define TRIG_START_X 59
#define TRIG_START_Y 95
#define TRIG_OFFSET_X (TRIG_W + 3)
#define TRIG_OFFSET_Y (TRIG_H + 8)
#define PIANO_W 170
#define PIANO_H 20
#define PIANO_START_X 30
#define PIANO_START_Y 69
#define PIANO_NOTE_W 2
#define PARAMS_W 170
#define PARAMS_H 64
#define PARAMS_START_X 30
#define PARAMS_START_Y 4
#define R_SIDEBAR_X ((TRIG_START_X) + (TRIG_OFFSET_X) * 8 + 4)
#define L_SIDEBAR_X ((CHAN_START_X) - 26)
#define PAT_START_X (L_SIDEBAR_X + 4)
#define PAT_START_Y 18
#define PAT_W 14
#define PAT_H 10
#define PAT_OFFSET_Y 17
#define R_COL_W 24
#define BPM_START_X (R_SIDEBAR_X)
#define BPM_START_Y (TRIG_START_Y + TRIG_H + 8)
#define BPM_H 22
#define SETTINGS_START_X (R_SIDEBAR_X)
#define SETTINGS_START_Y (TRIG_START_Y - 7)
#define PLAY_START_X (R_SIDEBAR_X)
#define PLAY_START_Y (TRIG_START_Y + 12)
#define STOP_START_X (R_SIDEBAR_X + 14)
#define STOP_START_Y (TRIG_START_Y + 12)
#define PLAY_STOP_W (10)
#define PLAY_STOP_H (10)
#define BANK_START_X (R_SIDEBAR_X + 5)
#define BANK_START_Y (PAT_START_Y)
#define SEQ_N_CHANNELS 4
enum RIGHT_COL_LOC {
R_COL_BPM = 0,
R_COL_PLAY = 1,
R_COL_STOP = 2,
R_COL_SETTINGS = 3,
R_COL_BANK_D = 4,
R_COL_BANK_C = 5,
R_COL_BANK_B = 6,
R_COL_BANK_A = 7,
};
// Input handling works using a FSM. The input handler is switched to whichever
// function controls each section. For example, channel selection or trigger
// selection.
typedef void (*InputHandler)(void);
InputHandler input_handler;
void handle_trigger_selection(void);
void handle_channel_selection(void);
void handle_pattern_selection(void);
void handle_param_selection_sq1(void);
void handle_param_selection_sq2(void);
void handle_param_selection_wave(void);
void handle_param_selection_noise(void);
void handle_right_col_selection(void);
void handle_param_selection_ch1(void);
void handle_param_selection_ch2(void);
void handle_param_selection_ch3(void);
void handle_param_selection_ch4(void);
typedef enum Scene {
SCENE_SEQUENCER = 0,
SCENE_SETTINGS,
} Scene;
static Scene scene = SCENE_SEQUENCER;
static Scene next_scene = SCENE_SEQUENCER;
|