LMMS
Loading...
Searching...
No Matches
miditable.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012 Mark McCurry
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24#ifndef RTOSC_MIDITABLE_H
25#define RTOSC_MIDITABLE_H
26
27#include <rtosc/ports.h>
28#include <string.h>
29#include <algorithm>
30#include <map>
31#include <sstream>
32#include <deque>
33#include <utility>
34#include <cassert>
35
36namespace rtosc {
47
49{
50 public:
51 //Almost immutable short vector class
52 template<class T>
53 class TinyVector {
54 int n;
55 T *t;
56 public:
57 TinyVector(void):n(0),t(0){}
58 TinyVector(int i):n(i),t(new T[i]){}
59 T&operator[](int i) {assert(i>=0 && i<n);return t[i];}
60 T operator[](int i) const {assert(i>=0 && i<n);return t[i];}
61
62 TinyVector insert(const T &t_)
63 {TinyVector next(n+1); for(int i=0;i<n; ++i) next.t[i]=t[i]; next.t[n] = t_;return std::move(next);}
65 {TinyVector next(n+1); for(int i=0;i<n + 1; ++i) next.t[i]=0; return std::move(next);}
67 {TinyVector next(n); for(int i=0;i<n; ++i) next.t[i]=0; return std::move(next);}
69 {TinyVector next(n); for(int i=0;i<n; ++i) next.t[i]=t[i]; return std::move(next);}
70 int size(void) const{return n;}
71 };
72
73 typedef std::function<void(const char*)> write_cb;
74 typedef std::function<void(int16_t,write_cb)> callback_t;
75 //RT Read Only
76 TinyVector<std::tuple<int, bool, int>> mapping;//CC->{coarse, val-cb offset}
78 //RT RW
80
81 bool handleCC(int ID, int val, write_cb write);
82
83 //TODO try to change O(n^2) algorithm to O(n)
84 void cloneValues(const MidiMapperStorage &storage);
85
87};
88
90{
91 int mode;//0:linear,1:log
92 float min;
93 float max;
94 int operator()(float x) const;
95 float operator()(int x) const;
96};
97
98#include <cassert>
100{
101 public:
102 MidiMappernRT(void);
103 void map(const char *addr, bool coarse = true);
104
105 MidiMapperStorage *generateNewBijection(const Port &port, std::string);
106
107 void addNewMapper(int ID, const Port &port, std::string addr);
108
109 void addFineMapper(int ID, const Port &port, std::string addr);
110
111 void useFreeID(int ID);
112
113 void unMap(const char *addr, bool coarse);
114
115 void delMapping(int ID, bool coarse, const char *addr);
116 void replaceMapping(int, bool, const char *);
117
118 void clear(void);
119
120 std::map<std::string, std::string> getMidiMappingStrings(void);
121
122 //unclear if this should be be here as a helper or not
123 std::string getMappedString(std::string addr);
124
125 MidiBijection getBijection(std::string s);
126
127 void snoop(const char *msg);
128
129 void apply_high(int v, int ID);
130 void apply_low(int v, int ID);
131 void apply_midi(int val, int ID);
132
133 void setBounds(const char *str, float low, float high);
134
135 std::tuple<float,float,float,float> getBounds(const char *str);
136
137 bool has(std::string addr);
138 bool hasPending(std::string addr);
139 bool hasCoarse(std::string addr);
140 bool hasFine(std::string addr);
141 bool hasCoarsePending(std::string addr);
142 bool hasFinePending(std::string addr);
143 int getCoarse(std::string addr);
144 int getFine(std::string addr);
145
146 //(Location, Coarse, Fine, Bijection)
147 std::map<std::string, std::tuple<int, int, int, MidiBijection>> inv_map;
148 std::deque<std::pair<std::string,bool>> learnQueue;
149 std::function<void(const char *)> rt_cb;
152};
153
155{
156 public:
157 MidiMapperRT(void);
158 void setBackendCb(std::function<void(const char*)> cb);
159 void setFrontendCb(std::function<void(const char*)> cb);
160 void handleCC(int ID, int val);
161 void addWatch(void);
162 void remWatch(void);
163
164 //Depricated
165 Port addWatchPort(void);
166 Port removeWatchPort(void);
167 Port bindPort(void);
168
169 static const Ports ports;
170
171 //Fixed upper bounded size set of integer IDs
173 {
174 public:
176 :pos_r(0), pos_w(0), size(0)
177 {
178 for(int i=0; i<32; ++i)
179 vals[i] = -1;
180 }
181 void insert(int x)
182 {
183 if(has(x) || size > 31)
184 return;
185 vals[pos_w] = x;
186 size++;
187 pos_w = (pos_w+1)%32;
188 }
189 void pop(void)
190 {
191 if(size == 0)
192 return;
193 size--;
194 vals[pos_r] = -1;
195 pos_r = (1+pos_r)%32;
196 }
197 bool has(int x)
198 {
199 for(int i=0; i<32; ++i)
200 if(vals[i] == x)
201 return true;
202 return false;
203 }
204 int vals[32];
205 int pos_r;
206 int pos_w;
207 int size;
208
209 };
210
211
212 /***************
213 * Member Data *
214 ***************/
217 unsigned watchSize;
218 std::function<void(const char*)> backend;
219 std::function<void(const char*)> frontend;
220};
221
223{
224 //The midi values that map to the specified action
226
227 //The type of the event 'f', 'i', 'T', 'c'
228 char type;
229 //The path of the event
230 char *path;
231 //The conversion function for 'f' types
232 const char *conversion;
233};
234
235
241{
242 public:
243
248
249 void (*error_cb)(const char *, const char *);
250 void (*event_cb)(const char *);
251 void (*modify_cb)(const char *, const char *, const char *, int, int);
252
253 MidiTable(const Ports &_dispatch_root);
254 ~MidiTable();
255
256 bool has(uint8_t ch, uint8_t ctl) const;
257
258 MidiAddr *get(uint8_t ch, uint8_t ctl);
259
260 const MidiAddr *get(uint8_t ch, uint8_t ctl) const;
261
262 bool mash_port(MidiAddr &e, const Port &port);
263
264 void addElm(uint8_t ch, uint8_t ctl, const char *path);
265
266 void check_learn(void);
267
268 void learn(const char *s);
269
270 void clear_entry(const char *s);
271
272 void process(uint8_t ch, uint8_t ctl, uint8_t val);
273
274 Port learnPort(void);
275 Port unlearnPort(void);
276 Port registerPort(void);
277
278 //TODO generalize to an addScalingFunction() system
279 static float translate(uint8_t val, const char *meta);
280
281 private:
283};
284
285};
286#endif
assert(0)
Definition miditable.h:173
void pop(void)
Definition miditable.h:189
int vals[32]
Definition miditable.h:204
int pos_r
Definition miditable.h:205
PendingQueue()
Definition miditable.h:175
bool has(int x)
Definition miditable.h:197
void insert(int x)
Definition miditable.h:181
int pos_w
Definition miditable.h:206
int size
Definition miditable.h:207
void setBackendCb(std::function< void(const char *)> cb)
Definition midimapper.cpp:549
MidiMapperRT(void)
Definition midimapper.cpp:546
static const Ports ports
Definition miditable.h:169
void setFrontendCb(std::function< void(const char *)> cb)
Definition midimapper.cpp:550
void addWatch(void)
Definition midimapper.cpp:561
void remWatch(void)
Definition midimapper.cpp:562
std::function< void(const char *)> frontend
Definition miditable.h:219
Port bindPort(void)
Definition midimapper.cpp:597
PendingQueue pending
Definition miditable.h:215
Port removeWatchPort(void)
Definition midimapper.cpp:592
void handleCC(int ID, int val)
Definition midimapper.cpp:551
MidiMapperStorage * storage
Definition miditable.h:216
Port addWatchPort(void)
Definition midimapper.cpp:587
std::function< void(const char *)> backend
Definition miditable.h:218
unsigned watchSize
Definition miditable.h:217
Definition miditable.h:53
TinyVector(int i)
Definition miditable.h:58
T * t
Definition miditable.h:55
int n
Definition miditable.h:54
T operator[](int i) const
Definition miditable.h:60
TinyVector sized_clone(void)
Definition miditable.h:66
TinyVector(void)
Definition miditable.h:57
TinyVector one_larger(void)
Definition miditable.h:64
TinyVector insert(const T &t_)
Definition miditable.h:62
int size(void) const
Definition miditable.h:70
TinyVector clone(void)
Definition miditable.h:68
T & operator[](int i)
Definition miditable.h:59
Definition miditable.h:49
TinyVector< int > values
Definition miditable.h:79
std::function< void(int16_t, write_cb)> callback_t
Definition miditable.h:74
MidiMapperStorage * clone(void)
Definition midimapper.cpp:102
TinyVector< callback_t > callbacks
Definition miditable.h:77
std::function< void(const char *)> write_cb
Definition miditable.h:73
bool handleCC(int ID, int val, write_cb write)
Definition midimapper.cpp:50
TinyVector< std::tuple< int, bool, int > > mapping
Definition miditable.h:76
void cloneValues(const MidiMapperStorage &storage)
Definition midimapper.cpp:70
int getCoarse(std::string addr)
Definition midimapper.cpp:526
void apply_low(int v, int ID)
Definition midimapper.cpp:436
void addNewMapper(int ID, const Port &port, std::string addr)
Definition midimapper.cpp:196
std::map< std::string, std::tuple< int, int, int, MidiBijection > > inv_map
Definition miditable.h:147
bool hasFinePending(std::string addr)
Definition midimapper.cpp:518
bool has(std::string addr)
Definition midimapper.cpp:481
bool hasFine(std::string addr)
Definition midimapper.cpp:502
const Ports * base_ports
Definition miditable.h:151
MidiMappernRT(void)
Definition midimapper.cpp:129
std::function< void(const char *)> rt_cb
Definition miditable.h:149
MidiBijection getBijection(std::string s)
Definition midimapper.cpp:399
void delMapping(int ID, bool coarse, const char *addr)
Definition midimapper.cpp:344
MidiMapperStorage * storage
Definition miditable.h:150
MidiMapperStorage * generateNewBijection(const Port &port, std::string)
Definition midimapper.cpp:146
void map(const char *addr, bool coarse=true)
Definition midimapper.cpp:133
void useFreeID(int ID)
Definition midimapper.cpp:266
void snoop(const char *msg)
Definition midimapper.cpp:404
bool hasPending(std::string addr)
Definition midimapper.cpp:486
void setBounds(const char *str, float low, float high)
Definition midimapper.cpp:444
std::map< std::string, std::string > getMidiMappingStrings(void)
Definition midimapper.cpp:363
int getFine(std::string addr)
Definition midimapper.cpp:534
void replaceMapping(int, bool, const char *)
Definition midimapper.cpp:349
std::deque< std::pair< std::string, bool > > learnQueue
Definition miditable.h:148
void apply_high(int v, int ID)
Definition midimapper.cpp:435
void addFineMapper(int ID, const Port &port, std::string addr)
Definition midimapper.cpp:237
std::tuple< float, float, float, float > getBounds(const char *str)
Definition midimapper.cpp:468
void unMap(const char *addr, bool coarse)
Definition midimapper.cpp:306
std::string getMappedString(std::string addr)
Definition midimapper.cpp:380
bool hasCoarsePending(std::string addr)
Definition midimapper.cpp:510
void clear(void)
Definition midimapper.cpp:351
void apply_midi(int val, int ID)
Definition midimapper.cpp:437
bool hasCoarse(std::string addr)
Definition midimapper.cpp:494
Definition miditable.cpp:9
void process(uint8_t ch, uint8_t ctl, uint8_t val)
Definition miditable.cpp:183
short unhandled_ch
Definition miditable.h:245
void clear_entry(const char *s)
Definition miditable.cpp:170
void(* error_cb)(const char *, const char *)
Definition miditable.h:249
void addElm(uint8_t ch, uint8_t ctl, const char *path)
Definition miditable.cpp:113
class MidiTable_Impl * impl
Definition miditable.h:282
void learn(const char *s)
Definition miditable.cpp:158
static float translate(uint8_t val, const char *meta)
Definition miditable.cpp:241
void(* event_cb)(const char *)
Definition miditable.h:250
Port learnPort(void)
Definition miditable.cpp:216
bool has(uint8_t ch, uint8_t ctl) const
Definition miditable.cpp:67
short unhandled_ctl
Definition miditable.h:246
void(* modify_cb)(const char *, const char *, const char *, int, int)
Definition miditable.h:251
char * unhandled_path
Definition miditable.h:247
MidiTable(const Ports &_dispatch_root)
Definition miditable.cpp:52
~MidiTable()
Definition miditable.cpp:61
void check_learn(void)
Definition miditable.cpp:149
MidiAddr * get(uint8_t ch, uint8_t ctl)
Definition miditable.cpp:76
Port registerPort(void)
Definition miditable.cpp:232
bool mash_port(MidiAddr &e, const Port &port)
Definition miditable.cpp:92
const Ports & dispatch_root
Definition miditable.h:244
Port unlearnPort(void)
Definition miditable.cpp:224
* e
Definition inflate.c:1404
unsigned v[N_MAX]
Definition inflate.c:1584
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
int val
Definition jpeglib.h:956
short int16_t
Definition mid.cpp:96
unsigned char uint8_t
Definition mid.cpp:98
const char * msg
Definition missing_descriptor.c:20
Definition globals.h:37
Definition miditable.h:223
char type
Definition miditable.h:228
uint8_t ch
Definition miditable.h:225
const char * conversion
Definition miditable.h:232
char * path
Definition miditable.h:230
uint8_t ctl
Definition miditable.h:225
Definition miditable.h:90
float max
Definition miditable.h:93
int mode
Definition miditable.h:91
int operator()(float x) const
Definition midimapper.cpp:111
float min
Definition miditable.h:92
Definition ports.h:99
Definition ports.h:161
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396