5 * Copyright (C) 2002-2005 Monty
7 * Postfish is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
12 * Postfish is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Postfish; see the file COPYING. If not, write to the
19 * Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <gdk/gdkkeysyms.h>
29 #include "mainpanel.h"
32 #include "reverbpanel.h"
39 } slider_readout_pair
;
42 subpanel_generic
*panel
;
44 slider_readout_pair
*roomsize
;
45 slider_readout_pair
*liveness
;
46 slider_readout_pair
*hfdamp
;
47 slider_readout_pair
*wet
;
48 slider_readout_pair
*width
;
49 slider_readout_pair
*delay
;
53 reverb_panel_state
*master_panel
;
54 reverb_panel_state
**channel_panel
;
56 static void reverbpanel_state_to_config_helper(int bank
,reverb_settings
*s
,int A
){
57 config_set_integer("reverb_active",bank
,A
,0,0,0,s
->active
);
59 config_set_integer("reverb_set",bank
,A
,0,0,3,s
->roomsize
);
60 config_set_integer("reverb_set",bank
,A
,0,0,4,s
->liveness
);
61 config_set_integer("reverb_set",bank
,A
,0,0,5,s
->wet
);
62 config_set_integer("reverb_set",bank
,A
,0,0,6,s
->width
);
63 config_set_integer("reverb_set",bank
,A
,0,0,7,s
->delay
);
64 config_set_integer("reverb_set",bank
,A
,0,0,8,s
->hfdamp
);
67 void reverbpanel_state_to_config(int bank
){
69 reverbpanel_state_to_config_helper(bank
,&reverb_masterset
,0);
70 for(i
=0;i
<input_ch
;i
++)
71 reverbpanel_state_to_config_helper(bank
,reverb_channelset
+i
,i
+1);
74 static void reverbpanel_state_from_config_helper(int bank
,reverb_settings
*s
,
75 reverb_panel_state
*p
,int A
){
77 config_get_sigat("reverb_active",bank
,A
,0,0,0,&s
->active
);
78 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->panel
->subpanel_activebutton
[0]),s
->active
);
81 config_get_sigat("reverb_set",bank
,A
,0,0,3,&s
->roomsize
);
82 multibar_thumb_set(MULTIBAR(p
->roomsize
->s
),s
->roomsize
,0);
84 config_get_sigat("reverb_set",bank
,A
,0,0,4,&s
->liveness
);
85 multibar_thumb_set(MULTIBAR(p
->liveness
->s
),s
->liveness
,0);
87 config_get_sigat("reverb_set",bank
,A
,0,0,5,&s
->wet
);
88 multibar_thumb_set(MULTIBAR(p
->wet
->s
),s
->wet
,0);
90 config_get_sigat("reverb_set",bank
,A
,0,0,6,&s
->width
);
91 multibar_thumb_set(MULTIBAR(p
->width
->s
),s
->width
,0);
93 config_get_sigat("reverb_set",bank
,A
,0,0,7,&s
->delay
);
94 multibar_thumb_set(MULTIBAR(p
->delay
->s
),s
->delay
,0);
96 config_get_sigat("reverb_set",bank
,A
,0,0,8,&s
->hfdamp
);
97 multibar_thumb_set(MULTIBAR(p
->hfdamp
->s
),s
->hfdamp
,0);
101 void reverbpanel_state_from_config(int bank
){
103 reverbpanel_state_from_config_helper(bank
,&reverb_masterset
,master_panel
,0);
104 for(i
=0;i
<input_ch
;i
++)
105 reverbpanel_state_from_config_helper(bank
,reverb_channelset
+i
,channel_panel
[i
],i
+1);
108 static void slider_change(GtkWidget
*w
,gpointer in
){
110 slider_readout_pair
*p
=(slider_readout_pair
*)in
;
111 float val
=multibar_get_value(MULTIBAR(p
->s
),0);
113 sprintf(buffer
,"%5.2f",val
*.01);
114 readout_set(READOUT(p
->r
),buffer
);
119 static void slider_change_dB(GtkWidget
*w
,gpointer in
){
121 slider_readout_pair
*p
=(slider_readout_pair
*)in
;
122 float val
=multibar_get_value(MULTIBAR(p
->s
),0);
124 sprintf(buffer
,"%+4.1f",val
*.1);
125 readout_set(READOUT(p
->r
),buffer
);
130 static reverb_panel_state
*reverbpanel_create_helper (postfish_mainpanel
*mp
,
131 subpanel_generic
*panel
,
132 reverb_settings
*ps
, int stereop
){
134 char *labels
[11]={"","1","2","3","4","5","6","7","8","9","10"};
135 float levels
[11]={0,100,200,300,400,500,600,700,800,900,1000};
137 char *labelsdB
[11]={"","-40","-20","-10","-3","0dB","+3","+10","+20","+40","+80"};
138 float levelsdB
[11]={-800,-400,-200,-100,-30,0,30,100,200,400,800};
140 GtkWidget
*table
=gtk_table_new(7,3,0);
141 slider_readout_pair
*p1
=malloc(sizeof(*p1
));
142 slider_readout_pair
*p2
=malloc(sizeof(*p2
));
143 slider_readout_pair
*p3
=malloc(sizeof(*p3
));
144 slider_readout_pair
*p4
=malloc(sizeof(*p4
));
145 slider_readout_pair
*p5
=malloc(sizeof(*p5
));
146 slider_readout_pair
*p6
=malloc(sizeof(*p6
));
148 GtkWidget
*l1
=gtk_label_new("Room Size ");
149 GtkWidget
*l2
=gtk_label_new("Room Liveness ");
150 GtkWidget
*l3
=gtk_label_new("High Damping ");
151 GtkWidget
*l4
=gtk_label_new("Predelay ");
152 GtkWidget
*l5
=gtk_label_new("Stereo Width ");
153 GtkWidget
*l6
=gtk_label_new("Wet Level ");
155 reverb_panel_state
*p
=calloc(1,sizeof(*p
));
158 gtk_misc_set_alignment(GTK_MISC(l1
),1,.5);
159 gtk_misc_set_alignment(GTK_MISC(l2
),1,.5);
160 gtk_misc_set_alignment(GTK_MISC(l3
),1,.5);
161 gtk_misc_set_alignment(GTK_MISC(l4
),1,.5);
162 gtk_misc_set_alignment(GTK_MISC(l5
),1,.5);
163 gtk_misc_set_alignment(GTK_MISC(l6
),1,.5);
166 p1
->s
=multibar_slider_new(11,labels
,levels
,1);
167 p1
->r
=readout_new(" 10.00 ");
168 p1
->val
=&ps
->roomsize
;
171 p2
->s
=multibar_slider_new(11,labels
,levels
,1);
172 p2
->r
=readout_new(" 10.00 ");
173 p2
->val
=&ps
->liveness
;
176 p3
->s
=multibar_slider_new(11,labels
,levels
,1);
177 p3
->r
=readout_new(" 10.00 ");
181 p4
->s
=multibar_slider_new(11,labels
,levels
,1);
182 p4
->r
=readout_new(" 10.00 ");
186 p5
->s
=multibar_slider_new(11,labels
,levels
,1);
187 p5
->r
=readout_new(" 10.00 ");
191 p6
->s
=multibar_slider_new(11,labelsdB
,levelsdB
,1);
192 p6
->r
=readout_new("+10.0 dB");
196 gtk_table_attach(GTK_TABLE(table
),l1
,0,1,0,1,
197 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
198 gtk_table_attach(GTK_TABLE(table
),p1
->s
,1,2,0,1,
199 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
200 gtk_table_attach(GTK_TABLE(table
),p1
->r
,2,3,0,1,
201 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
203 gtk_table_attach(GTK_TABLE(table
),l2
,0,1,1,2,
204 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
205 gtk_table_attach(GTK_TABLE(table
),p2
->s
,1,2,1,2,
206 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
207 gtk_table_attach(GTK_TABLE(table
),p2
->r
,2,3,1,2,
208 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
210 gtk_table_attach(GTK_TABLE(table
),l3
,0,1,2,3,
211 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
212 gtk_table_attach(GTK_TABLE(table
),p3
->s
,1,2,2,3,
213 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
214 gtk_table_attach(GTK_TABLE(table
),p3
->r
,2,3,2,3,
215 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
217 gtk_table_attach(GTK_TABLE(table
),l4
,0,1,3,4,
218 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
219 gtk_table_attach(GTK_TABLE(table
),p4
->s
,1,2,3,4,
220 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
221 gtk_table_attach(GTK_TABLE(table
),p4
->r
,2,3,3,4,
222 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
225 gtk_table_attach(GTK_TABLE(table
),l5
,0,1,4,5,
226 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
227 gtk_table_attach(GTK_TABLE(table
),p5
->s
,1,2,4,5,
228 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
229 gtk_table_attach(GTK_TABLE(table
),p5
->r
,2,3,4,5,
230 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
233 gtk_table_attach(GTK_TABLE(table
),l6
,0,1,6,7,
234 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
235 gtk_table_attach(GTK_TABLE(table
),p6
->s
,1,2,6,7,
236 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
237 gtk_table_attach(GTK_TABLE(table
),p6
->r
,2,3,6,7,
238 GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
240 gtk_container_add(GTK_CONTAINER(panel
->subpanel_box
),table
);
242 multibar_callback(MULTIBAR(p1
->s
),slider_change
,p1
);
243 multibar_callback(MULTIBAR(p2
->s
),slider_change
,p2
);
244 multibar_callback(MULTIBAR(p3
->s
),slider_change
,p3
);
245 multibar_callback(MULTIBAR(p4
->s
),slider_change
,p4
);
246 multibar_callback(MULTIBAR(p5
->s
),slider_change
,p5
);
247 multibar_callback(MULTIBAR(p6
->s
),slider_change_dB
,p6
);
249 multibar_thumb_set(MULTIBAR(p1
->s
),5000,0);
250 multibar_thumb_set(MULTIBAR(p2
->s
),400,0);
251 multibar_thumb_set(MULTIBAR(p3
->s
),800,0);
252 multibar_thumb_set(MULTIBAR(p4
->s
),0,0);
253 multibar_thumb_set(MULTIBAR(p5
->s
),500,0);
254 multibar_thumb_set(MULTIBAR(p6
->s
),0,0);
256 multibar_thumb_increment(MULTIBAR(p1
->s
),1,10);
257 multibar_thumb_increment(MULTIBAR(p2
->s
),1,10);
258 multibar_thumb_increment(MULTIBAR(p3
->s
),1,10);
259 multibar_thumb_increment(MULTIBAR(p4
->s
),1,10);
260 multibar_thumb_increment(MULTIBAR(p5
->s
),1,10);
261 multibar_thumb_increment(MULTIBAR(p6
->s
),1,10);
263 subpanel_show_all_but_toplevel(panel
);
267 void reverbpanel_create_master(postfish_mainpanel
*mp
,
268 GtkWidget
*windowbutton
,
269 GtkWidget
*activebutton
){
271 char *shortcut
[]={" r "};
272 subpanel_generic
*panel
=subpanel_create(mp
,windowbutton
,&activebutton
,
273 &reverb_masterset
.active
,
274 &reverb_masterset
.visible
,
275 "_Reverb (master)",shortcut
,
277 master_panel
=reverbpanel_create_helper(mp
,panel
,&reverb_masterset
,0);
280 void reverbpanel_create_channel(postfish_mainpanel
*mp
,
281 GtkWidget
**windowbutton
,
282 GtkWidget
**activebutton
){
284 /* a panel for each channel */
285 channel_panel
=calloc(input_ch
,sizeof(*channel_panel
));
287 for(i
=0;i
<input_ch
;i
++){
288 subpanel_generic
*panel
;
291 sprintf(buffer
,"_Reverb (channel %d)",i
+1);
292 panel
=subpanel_create(mp
,windowbutton
[i
],activebutton
+i
,
293 &reverb_channelset
[i
].active
,
294 &reverb_channelset
[i
].visible
,
298 channel_panel
[i
]=reverbpanel_create_helper(mp
,panel
,reverb_channelset
+i
,1);