Fixing a memory corruption - and changing the way tX_midiin works. Not
[terminatorX.git] / terminatorX / 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
24 #ifndef _tx_midiin_h
25 #define _tx_midiin_h 1
26
27 class vtt_class;
28
29 class tX_midievent
30 {
31   public:
32         int channel;
33         enum
34         {
35                 NONE=0,
36                 CC=1,
37                 NOTE,
38                 PITCHBEND,
39         } type;
40         int number; // note # or controller #
41         
42         float value; // controller value or note velocity
43         bool is_noteon; // note on or off?
44
45         bool type_matches( const tX_midievent& other ) const
46         {
47                 return channel == other.channel && type == other.type && number == other.number;
48         }
49
50         void clear_non_type()
51         {
52                 value = 0;
53                 is_noteon = false;
54         }
55         
56         tX_midievent() : channel(0), type(NONE), value(0.0), is_noteon(false) {}
57         
58         /* not being used anyway */
59         // void print( const char* prefix ) const;
60 };
61
62 #include <config.h>
63 #ifdef USE_ALSA_MIDI_IN
64
65 #include <alsa/asoundlib.h>
66 #include <gtk/gtk.h>
67
68 class tX_midiin
69 {
70         snd_seq_t *ALSASeqHandle;
71         tX_midievent last_event;
72         bool is_open;
73         
74   public:
75         tX_midiin();
76         ~tX_midiin();
77
78         bool get_is_open() {
79                 return is_open;
80         }
81         
82         int check_event();
83
84         void configure_bindings( vtt_class* );
85
86         const tX_midievent& get_last_event()
87         {
88                 return last_event;
89         }
90
91   private:
92
93         class midi_binding_gui
94         {
95           public:
96                 midi_binding_gui( GtkTreeModel* _model, tX_midiin* _midi );
97                 ~midi_binding_gui();
98
99                 GtkWidget *window;
100                 
101                 GtkWidget *parameter_treeview;
102                 GtkWidget *midi_event_info;
103                 GtkWidget *bind_button;
104
105                 GtkTreeModel* model;
106
107                 tX_midiin* midi;
108
109                 tX_midievent last_event;
110
111                 static void bind_clicked( GtkButton *button, gpointer _this );
112                 static void close_clicked( GtkButton *button, gpointer _this );
113                 static gint timer( gpointer _this );
114
115           private:
116                 char tempstr[128];
117
118                 gint timer_tag;
119         };
120 };
121
122 #endif // USE_ALSA_MIDI_IN
123
124 #endif // ndef _tx_midiin_h