1 // omc-learn.h
2 // LiVES (lives-exe)
3 // (c) G. Finch 2003 - 2018
4 // Released under the GPL 3 or later
5 // see file ../COPYING for licensing details
6 
7 #ifndef HAS_LIVES_OMC_LEARN_H
8 #define HAS_LIVES_OMC_LEARN_H
9 
10 #define OMC_DEV_MIDI 		(1 << 0)
11 #define OMC_DEV_JS		(1 << 1)
12 #define OMC_DEV_FORCE_RAW_MIDI	(1 << 2)
13 #define OMC_DEV_MIDI_DUMMY	(1 << 3)
14 
15 /** max number of macros */
16 #define N_OMC_MACROS 64
17 
18 /** floating point precision */
19 #define OMC_FP_FIX 4
20 
21 // OMC device interfaces
22 #if HAVE_LINUX_JOYSTICK_H
23 #define OMC_JS_IMPL
24 #endif
25 
26 #define OMC_MIDI_IMPL
27 
28 #define MIDI_OMNI -1
29 
30 #ifdef OMC_JS_IMPL
31 char *js_mangle(void);
32 boolean js_open(void);
33 void js_close(void);
34 const char *get_js_filename(void);
35 #endif
36 
37 #ifdef OMC_MIDI_IMPL
38 char *midi_mangle(void);
39 const char *get_midi_filename(void);
40 boolean midi_open(void);
41 void midi_close(void);
42 #endif
43 
44 /* parameter types */
45 #define OMC_PARAM_INT 1
46 #define OMC_PARAM_DOUBLE 2
47 #define OMC_PARAM_SPECIAL 128 ///< can be int or double, depending on effect type
48 
49 typedef struct {
50   char *msg;   ///< OSC message
51   char *macro_text;  ///< macro text
52   char *info_text;  ///< descriptive text
53   char *stype_tags;   ///< setter type tags
54 
55   int nparams;
56 
57   char **pname;
58 
59   int *ptypes;
60   int *mini, *maxi, *vali;
61 
62   double *mind, *maxd, *vald;
63 } lives_omc_macro_t;
64 
65 typedef struct {
66   char *srch; ///< string to match
67   int macro; ///< action number this is linked to (or -1) (see mainwindow.h)
68 
69   int nvars; ///< number of input params
70   int *offs0; ///< offs to add to params before scale (pre-bias)
71   double *scale; ///< scale for params (unbiased scale)
72   int *offs1; ///< offs to add to params after scale (post bias)
73 
74   int *min; ///< min values of input params
75   int *max; ///< max values of input params
76 
77   boolean *matchp; ///< do we additionally need to match this param val in the input ?
78   int *matchi; ///< match value
79 
80   // enumerated by number of params in target macro
81   int *map; ///< mapping macro parameters to variables in the input (whether we use a default or a variable)
82   // (reverse ordered, starting from the last macro parameter)
83   int *fvali; ///< defaults, mapping to fixed ints
84   double *fvald; ///< defaults, mapping to fixed doubles
85 
86   ///////////////////////// following this is not saved/loaded
87 
88   LiVESWidget *treev1;
89   LiVESWidget *treev2;
90 
91   LiVESTreeStore *gtkstore;
92   LiVESTreeStore *gtkstore2;
93 
94   int *tmpvals;
95 } lives_omc_match_node_t;
96 
97 typedef struct {
98   LiVESWidget *dialog;
99   LiVESWidget *clear_button;
100   LiVESWidget *del_all_button;
101 
102   int tbl_rows;
103   int tbl_currow;
104   LiVESWidget *table;
105   LiVESWidget *top_vbox;
106 } omclearn_w;
107 
108 enum {
109   TITLE_COLUMN,
110   VALUE_COLUMN,
111   FILTER_COLUMN,
112   RANGE_COLUMN,
113   OFFS1_COLUMN,
114   SCALE_COLUMN,
115   OFFS2_COLUMN,
116   OMC_NUM_COLUMNS
117 };
118 
119 enum {
120   TITLE2_COLUMN,
121   VALUE2_COLUMN,
122   ADJUSTMENT,
123   OMC_NUM2_COLUMNS
124 };
125 
126 #define OMC_INTERNAL	0
127 
128 #define OMC_JS 		1
129 #define OMC_JS_AXIS	2
130 #define OMC_JS_BUTTON	3
131 
132 #define OMC_MIDI		128
133 #define OMC_MIDI_NOTE		129
134 #define OMC_MIDI_NOTE_OFF	130
135 #define OMC_MIDI_CONTROLLER	131
136 #define OMC_MIDI_PITCH_BEND	132
137 #define OMC_MIDI_PGM_CHANGE	133
138 
139 // get a macro
140 const lives_omc_macro_t *get_omc_macro(int idx);
141 
142 /// start learning MIDI inputs
143 void on_midi_learn_activate(LiVESMenuItem *, livespointer);
144 
145 /// process a string (i.e. convert to an OSC message and pass to OSC subsys)
146 /// only need to set omclw if learn is TRUE
147 boolean omc_process_string(int supertype, const char *string, boolean learn, omclearn_w *omclw);
148 
149 #define OMC_FILE_VSTRING "LiVES OMC map version 1.1"
150 #define OMC_FILE_VSTRING_1_0 "LiVES OMC map version 1.0"
151 
152 boolean has_devicemap(int has_this_macro);
153 void create_devicemap_directory(void);
154 void on_devicemap_save_activate(LiVESMenuItem *, livespointer);
155 void on_devicemap_load_activate(LiVESMenuItem *, livespointer);
156 
157 #include "osc.h"
158 
159 #define OSC_BUF_SIZE 1024
160 #define OSC_MAX_TYPETAGS 64
161 
162 /// decode learnt behaviours
163 OSCbuf *omc_learner_decode(int type, int index, const char *string);
164 
165 #endif // HAS_LIVES_OMC_LEARN_H
166