1 #include "Controller.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <math.h>
5 
6 pthread_mutex_t mutex;
7 int Pexitprogram;
8 
Controller()9 Controller::Controller() {
10     //init
11     for(int i = 0; i < 6; ++i) {
12         pars[i].mode      = 1;
13         pars[i].val1      = 0;
14         pars[i].val2      = 127;
15         pars[i].nrpn.cpar = 8;
16         pars[i].nrpn.fpar = 0;
17         pars[i].nrpn.cval = 0;
18     }
19     pars[0].ctl.par = 71;
20     pars[1].ctl.par = 74;
21     pars[2].ctl.par = 10;
22     pars[3].ctl.par = 11;
23     pars[4].ctl.par = 1;
24     pars[5].ctl.par = 75;
25 
26     //ALSA init
27     snd_seq_open(&midi_out, "default", SND_SEQ_OPEN_OUTPUT, 0);
28 
29     char portname[50]; sprintf(portname, "Controller");
30     int  alsaport = snd_seq_create_simple_port(
31         midi_out,
32         portname,
33         SND_SEQ_PORT_CAP_READ
34         | SND_SEQ_PORT_CAP_SUBS_READ,
35         SND_SEQ_PORT_TYPE_SYNTH);
36 }
37 
~Controller()38 Controller::~Controller() {
39     snd_seq_close(midi_out);
40 }
41 
sendcontroller(int par,unsigned char val)42 void Controller::sendcontroller(int par, unsigned char val) {
43     snd_seq_event_t midievent;
44     snd_seq_ev_clear(&midievent);
45 
46     snd_seq_ev_set_controller(&midievent, Pchout, par, val);
47 
48     snd_seq_ev_set_subs(&midievent);
49     snd_seq_ev_set_direct(&midievent);
50     snd_seq_event_output_direct(midi_out, &midievent);
51 
52 //    fprintf(stderr,"Controller: %d %d\n",par,val);
53 }
54 
sendnrpn(int npar,unsigned char val)55 void Controller::sendnrpn(int npar, unsigned char val) {
56 //    fprintf(stderr,"NRPN: %d %d %d %d\n",pars[npar].nrpn.cpar,pars[npar].nrpn.fpar,pars[npar].nrpn.cval,val);
57 
58     sendcontroller(0x63, pars[npar].nrpn.cpar);
59     sendcontroller(0x62, pars[npar].nrpn.fpar);
60     sendcontroller(0x06, pars[npar].nrpn.cval);
61     sendcontroller(0x26, val);
62 //    fprintf(stderr,"------------\n\n");
63 }
64 
send(int npar,float xval)65 void Controller::send(int npar, float xval) {
66     if(pars[npar].mode == 0)
67         return;
68     int val;
69     if(pars[npar].val1 <= pars[npar].val2)
70         val =
71             (int) (xval
72                    * (pars[npar].val2 - pars[npar].val1
73                       + 1.0) * 0.9999 + pars[npar].val1);
74     else
75         val =
76             (int) (xval
77                    * (pars[npar].val2 - pars[npar].val1
78                       - 1.0) * 0.9999 + pars[npar].val1 + 1.0);
79     switch(pars[npar].mode) {
80         case 1: sendcontroller(pars[npar].ctl.par, val); break;
81         //case 2:break;
82         case 3: sendnrpn(npar, val); break;
83     }
84 }
85