ALSA fixes, MIDI fixes and some new features, misc fixes and a
[terminatorX.git] / src / tX_midiin.h
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 2002 Arthur Peters
4         
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9  
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  
19     File: tX_midiin.h
20  
21     Description: Header to tX_midiin.cc
22         
23         Changes (Alexander K├Ânig <alex@lisas.de>:
24         - Default Constructor for tX_midievents
25         - new handlers for destroy and remove binding events
26 */    
27
28 #ifndef _tx_midiin_h
29 #define _tx_midiin_h 1
30
31 #include <stdio.h>
32 #include <libxml/xmlmemory.h>
33 #include <libxml/parser.h>
34 #include <libxml/encoding.h>
35
36 class vtt_class;
37 class tX_seqpar;
38
39 class tX_midievent
40 {
41   public:
42         int channel;
43         enum
44         {
45                 NONE=0,
46                 CC=1,
47                 NOTE,
48                 PITCHBEND,
49                 CC14,
50                 RPN,
51                 NRPN
52         } type;
53         int number; // note # or controller #
54         
55         float value; // controller value or note velocity
56         bool is_noteon; // note on or off?
57
58         bool type_matches( const tX_midievent& other ) const
59         {
60                 return channel == other.channel && type == other.type && number == other.number;
61         }
62
63         void clear_non_type()
64         {
65                 value = 0;
66                 is_noteon = false;
67         }
68         
69         tX_midievent() : channel(0), type(NONE), number(0), value(0.0), is_noteon(false) {}
70 };
71
72 #include <config.h>
73 #ifdef USE_ALSA_MIDI_IN
74
75 #include <alsa/asoundlib.h>
76 #include <gtk/gtk.h>
77
78 class tX_midiin
79 {
80         snd_seq_t *ALSASeqHandle;
81         tX_midievent last_event;
82         bool is_open;
83         tX_seqpar *sp_to_learn;
84         GtkWidget *learn_dialog;
85         int portid;
86         
87   public:
88         tX_midiin();
89         ~tX_midiin();
90
91         bool get_is_open() {
92                 return is_open;
93         }
94         
95         int check_event();
96
97         void configure_bindings( vtt_class* );
98
99         const tX_midievent& get_last_event()
100         {
101                 return last_event;
102         }
103
104         void set_midi_learn_sp(tX_seqpar *);
105         void cancel_midi_learn();
106         void store_connections(FILE *rc, char *indent);
107         void restore_connections(xmlNodePtr node);
108         
109         static gboolean midi_learn_cancel(GtkWidget *, tX_midiin *);
110         static gboolean midi_learn_destroy(GtkWidget *, tX_midiin *);   
111         
112   private:
113
114         class midi_binding_gui
115         {
116           public:
117                 midi_binding_gui( GtkTreeModel* _model, tX_midiin* _midi );
118                 ~midi_binding_gui();
119
120                 GtkWidget *window;
121                 
122                 GtkWidget *parameter_treeview;
123                 GtkWidget *midi_event_info;
124                 GtkWidget *bind_button;
125
126                 GtkTreeModel* model;
127
128                 tX_midiin* midi;
129
130                 tX_midievent last_event;
131
132                 static void window_closed( GtkWidget *widget, gpointer _this );
133                 static void unbind_clicked( GtkButton *button, gpointer _this );          
134                 static void bind_clicked( GtkButton *button, gpointer _this );
135                 static void close_clicked( GtkButton *button, gpointer _this );
136                 static gint timer( gpointer _this );
137
138           private:
139                 char tempstr[128];
140
141                 gint timer_tag;
142         };
143 };
144
145 #endif // USE_ALSA_MIDI_IN
146
147 #endif // ndef _tx_midiin_h