1 /* hexter DSSI software synthesizer GUI
2 *
3 * Copyright (C) 2004, 2009, 2012 Sean Bolton and others.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of
8 * the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be
11 * useful, but WITHOUT ANY WARRANTY; without even the implied
12 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13 * PURPOSE. See the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public
16 * License along with this program; if not, write to the Free
17 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301 USA.
19 */
20
21 #ifdef HAVE_CONFIG_H
22 # include <config.h>
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <gtk/gtk.h>
30
31 #include "hexter.h"
32 #include "gui_callbacks.h"
33 #include "gui_interface.h"
34 #include "gui_images.h"
35 #include "gui_patch_edit.h"
36
37 GtkWidget *main_window;
38 GtkObject *test_note_key_adj;
39 GtkObject *test_note_velocity_adj;
40 GtkObject *tuning_adj;
41 GtkObject *volume_adj;
42 GtkObject *polyphony_instance_adj;
43 GtkObject *polyphony_global_adj;
44 GtkWidget *monophonic_option_menu;
45 GtkWidget *compat059_button;
46 #ifdef HEXTER_DEBUG_CONTROL
47 GtkObject *test_adj;
48 #endif
49 GtkWidget *sysex_channel_label;
50 GtkWidget *sysex_channel_spin;
51 GtkWidget *sysex_status_label;
52 GtkWidget *performance_frame;
53 GtkObject *performance_spin_adjustments[6];
54 GtkWidget *performance_assign_widgets[4][3];
55
56 GtkWidget *about_window;
57 GtkWidget *about_label;
58
59 GtkWidget *import_file_selection;
60 GtkWidget *import_file_position_window;
61 GtkObject *import_file_position_spin_adj;
62 GtkWidget *import_file_position_name_label;
63
64 GtkWidget *notice_window;
65 GtkWidget *notice_label_1;
66 GtkWidget *notice_label_2;
67
68 GtkWidget *export_file_type_window;
69 GtkWidget *export_file_type_sysex;
70 GtkObject *export_file_start_spin_adj;
71 GtkWidget *export_file_start_name;
72 GtkWidget *export_file_end_label;
73 GtkWidget *export_file_end_spin;
74 GtkObject *export_file_end_spin_adj;
75 GtkWidget *export_file_end_name;
76 GtkWidget *export_file_selection;
77
78 GtkWidget *edit_save_position_window;
79 GtkObject *edit_save_position_spin_adj;
80 GtkWidget *edit_save_position_name_label;
81
82 GtkWidget *patches_clist;
83
84 const char *performance_spin_names[6] = {
85 "pitch_bend_range",
86 "portamento_time",
87 "mod_wheel_sensitivity",
88 "foot_sensitivity",
89 "pressure_sensitivity",
90 "breath_sensitivity",
91 };
92
93 const char *performance_assign_names[4] = {
94 "mod_wheel_assign",
95 "foot_assign",
96 "pressure_assign",
97 "breath_assign"
98 };
99
100 void
set_window_title(GtkWidget * window,const char * tag,const char * text)101 set_window_title(GtkWidget *window, const char *tag, const char *text)
102 {
103 char *title = (char *)malloc(strlen(tag) + strlen(text) + 2);
104 sprintf(title, "%s %s", tag, text);
105 gtk_window_set_title (GTK_WINDOW (window), title);
106 free(title);
107 }
108
109 void
create_performance_spin(GtkWidget * window,const char * text,GtkWidget * table,int row,int parameter,int max,int init)110 create_performance_spin(GtkWidget *window, const char *text, GtkWidget *table,
111 int row, int parameter, int max, int init)
112 {
113 GtkWidget *label;
114 GtkObject *spin_button_adj;
115 GtkWidget *spin_button;
116
117 label = gtk_label_new (text);
118 gtk_widget_ref (label);
119 gtk_object_set_data_full (GTK_OBJECT (window), "performance label", label,
120 (GtkDestroyNotify) gtk_widget_unref);
121 gtk_widget_show (label);
122 gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row + 1,
123 (GtkAttachOptions) (GTK_FILL),
124 (GtkAttachOptions) (0), 0, 0);
125 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
126 gtk_misc_set_padding (GTK_MISC (label), 2, 0);
127
128 spin_button_adj = gtk_adjustment_new (init, 0, max, 1, 10, 0);
129 performance_spin_adjustments[parameter] = spin_button_adj;
130 spin_button = gtk_spin_button_new (GTK_ADJUSTMENT (spin_button_adj), 1, 0);
131 gtk_widget_ref (spin_button);
132 gtk_object_set_data_full (GTK_OBJECT (main_window), "performance spin", spin_button,
133 (GtkDestroyNotify) gtk_widget_unref);
134 gtk_widget_show (spin_button);
135 gtk_table_attach (GTK_TABLE (table), spin_button, 1, 2, row, row + 1,
136 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
137 (GtkAttachOptions) (GTK_FILL), 0, 0);
138 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON (spin_button), GTK_UPDATE_IF_VALID);
139 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin_button), TRUE);
140
141 gtk_signal_connect (GTK_OBJECT (spin_button_adj), "value_changed",
142 GTK_SIGNAL_FUNC(on_performance_spin_change),
143 (gpointer)parameter);
144 }
145
146 void
create_performance_assign(GtkWidget * window,const char * text,GtkWidget * table,int row,int parameter,int initbits)147 create_performance_assign(GtkWidget *window, const char *text,
148 GtkWidget *table, int row, int parameter, int initbits)
149 {
150 GtkWidget *label;
151 GtkWidget *hbox;
152 GtkWidget *button;
153
154 label = gtk_label_new (text);
155 gtk_widget_ref (label);
156 gtk_object_set_data_full (GTK_OBJECT (window), "performance label", label,
157 (GtkDestroyNotify) gtk_widget_unref);
158 gtk_widget_show (label);
159 gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row + 1,
160 (GtkAttachOptions) (GTK_FILL),
161 (GtkAttachOptions) (0), 0, 0);
162 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
163 gtk_misc_set_padding (GTK_MISC (label), 2, 0);
164
165 hbox = gtk_hbox_new (FALSE, 0);
166 gtk_widget_ref (hbox);
167 gtk_object_set_data_full (GTK_OBJECT (window), "assign hbox",
168 hbox, (GtkDestroyNotify) gtk_widget_unref);
169 gtk_widget_show (hbox);
170 gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, row, row + 1,
171 (GtkAttachOptions) (GTK_FILL),
172 (GtkAttachOptions) (0), 0, 0);
173 gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
174
175 label = gtk_label_new ("P");
176 gtk_widget_ref (label);
177 gtk_object_set_data_full (GTK_OBJECT (window), "assign P label", label,
178 (GtkDestroyNotify) gtk_widget_unref);
179 gtk_widget_show (label);
180 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 1);
181
182 button = gtk_check_button_new();
183 performance_assign_widgets[parameter][0] = button;
184 gtk_widget_ref (button);
185 gtk_object_set_data_full (GTK_OBJECT (window), "assign P button", button,
186 (GtkDestroyNotify) gtk_widget_unref);
187 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), initbits & 1 ? 1 : 0);
188 gtk_widget_show (button);
189 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 1);
190 gtk_signal_connect (GTK_OBJECT (button), "toggled",
191 GTK_SIGNAL_FUNC (on_performance_assign_toggled),
192 (gpointer)parameter);
193
194 label = gtk_label_new ("A");
195 gtk_widget_ref (label);
196 gtk_object_set_data_full (GTK_OBJECT (window), "assign A label", label,
197 (GtkDestroyNotify) gtk_widget_unref);
198 gtk_widget_show (label);
199 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 1);
200
201 button = gtk_check_button_new();
202 performance_assign_widgets[parameter][1] = button;
203 gtk_widget_ref (button);
204 gtk_object_set_data_full (GTK_OBJECT (window), "assign A button", button,
205 (GtkDestroyNotify) gtk_widget_unref);
206 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), initbits & 2 ? 1 : 0);
207 gtk_widget_show (button);
208 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 1);
209 gtk_signal_connect (GTK_OBJECT (button), "toggled",
210 GTK_SIGNAL_FUNC (on_performance_assign_toggled),
211 (gpointer)parameter);
212
213 label = gtk_label_new ("E");
214 gtk_widget_ref (label);
215 gtk_object_set_data_full (GTK_OBJECT (window), "assign E label", label,
216 (GtkDestroyNotify) gtk_widget_unref);
217 gtk_widget_show (label);
218 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 1);
219
220 button = gtk_check_button_new();
221 performance_assign_widgets[parameter][2] = button;
222 gtk_widget_ref (button);
223 gtk_object_set_data_full (GTK_OBJECT (window), "assign E button", button,
224 (GtkDestroyNotify) gtk_widget_unref);
225 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), initbits & 4 ? 1 : 0);
226 gtk_widget_show (button);
227 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 1);
228 gtk_signal_connect (GTK_OBJECT (button), "toggled",
229 GTK_SIGNAL_FUNC (on_performance_assign_toggled),
230 (gpointer)parameter);
231 }
232
233 void
create_main_window(const char * tag)234 create_main_window (const char *tag)
235 {
236 GtkWidget *vbox1;
237 GtkWidget *menubar1;
238 GtkWidget *file1;
239 GtkWidget *file1_menu;
240 GtkWidget *menu_import;
241 GtkWidget *menu_export;
242 GtkWidget *separator1;
243 GtkWidget *menu_quit;
244 GtkWidget *edit1;
245 GtkWidget *edit1_menu;
246 GtkWidget *menu_edit;
247 GtkWidget *help1;
248 GtkWidget *help1_menu;
249 GtkWidget *menu_about;
250 GtkWidget *notebook1;
251 GtkWidget *scrolledwindow1;
252 GtkWidget *label45;
253 GtkWidget *label46;
254 GtkWidget *patches_tab_label;
255 GtkWidget *vbox2;
256 GtkWidget *frame12;
257 GtkWidget *table15;
258 GtkWidget *label10;
259 GtkWidget *label10a;
260 GtkWidget *test_note_button;
261 GtkWidget *test_note_key;
262 GtkWidget *test_note_velocity;
263 GtkWidget *frame14;
264 GtkWidget *table16;
265 GtkWidget *tuning;
266 GtkWidget *volume;
267 GtkWidget *mono_mode_off;
268 GtkWidget *mono_mode_on;
269 GtkWidget *mono_mode_once;
270 GtkWidget *mono_mode_both;
271 GtkWidget *optionmenu5_menu;
272 GtkWidget *polyphony_instance;
273 GtkWidget *polyphony_global;
274 GtkWidget *label42;
275 GtkWidget *label43;
276 GtkWidget *label43a;
277 GtkWidget *volume_label;
278 GtkWidget *label44;
279 #ifdef MIDI_ALSA
280 GtkWidget *sysex_enable_button;
281 GtkObject *sysex_channel_spin_adj;
282 GtkWidget *frame15;
283 GtkWidget *frame4;
284 GtkWidget *table3;
285 GtkWidget *label11;
286 #endif /* MIDI_ALSA */
287 GtkWidget *configuration_tab_label;
288 GtkWidget *performance_table;
289 GtkWidget *performance_tab_label;
290 GtkAccelGroup *accel_group;
291
292 accel_group = gtk_accel_group_new ();
293
294 main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
295 gtk_object_set_data (GTK_OBJECT (main_window), "main_window", main_window);
296 gtk_window_set_title (GTK_WINDOW (main_window), tag);
297
298 vbox1 = gtk_vbox_new (FALSE, 0);
299 gtk_widget_ref (vbox1);
300 gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox1", vbox1,
301 (GtkDestroyNotify) gtk_widget_unref);
302 gtk_widget_show (vbox1);
303 gtk_container_add (GTK_CONTAINER (main_window), vbox1);
304
305 menubar1 = gtk_menu_bar_new ();
306 gtk_widget_ref (menubar1);
307 gtk_object_set_data_full (GTK_OBJECT (main_window), "menubar1", menubar1,
308 (GtkDestroyNotify) gtk_widget_unref);
309 gtk_widget_show (menubar1);
310 gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0);
311
312 file1 = gtk_menu_item_new_with_label ("File");
313 gtk_widget_ref (file1);
314 gtk_object_set_data_full (GTK_OBJECT (main_window), "file1", file1,
315 (GtkDestroyNotify) gtk_widget_unref);
316 gtk_widget_show (file1);
317 gtk_container_add (GTK_CONTAINER (menubar1), file1);
318
319 file1_menu = gtk_menu_new ();
320 gtk_widget_ref (file1_menu);
321 gtk_object_set_data_full (GTK_OBJECT (main_window), "file1_menu", file1_menu,
322 (GtkDestroyNotify) gtk_widget_unref);
323 gtk_menu_item_set_submenu (GTK_MENU_ITEM (file1), file1_menu);
324
325 menu_import = gtk_menu_item_new_with_label ("Import Patch Bank...");
326 gtk_widget_ref (menu_import);
327 gtk_object_set_data_full (GTK_OBJECT (main_window), "menu_import", menu_import,
328 (GtkDestroyNotify) gtk_widget_unref);
329 gtk_widget_show (menu_import);
330 gtk_container_add (GTK_CONTAINER (file1_menu), menu_import);
331 gtk_widget_add_accelerator (menu_import, "activate", accel_group,
332 GDK_O, GDK_CONTROL_MASK,
333 GTK_ACCEL_VISIBLE);
334
335 menu_export = gtk_menu_item_new_with_label ("Export Patch Bank...");
336 gtk_widget_ref (menu_export);
337 gtk_object_set_data_full (GTK_OBJECT (main_window), "menu_export", menu_export,
338 (GtkDestroyNotify) gtk_widget_unref);
339 gtk_widget_show (menu_export);
340 gtk_container_add (GTK_CONTAINER (file1_menu), menu_export);
341 gtk_widget_add_accelerator (menu_export, "activate", accel_group,
342 GDK_S, GDK_CONTROL_MASK,
343 GTK_ACCEL_VISIBLE);
344
345 separator1 = gtk_menu_item_new ();
346 gtk_widget_ref (separator1);
347 gtk_object_set_data_full (GTK_OBJECT (main_window), "separator1", separator1,
348 (GtkDestroyNotify) gtk_widget_unref);
349 gtk_widget_show (separator1);
350 gtk_container_add (GTK_CONTAINER (file1_menu), separator1);
351 gtk_widget_set_sensitive (separator1, FALSE);
352
353 menu_quit = gtk_menu_item_new_with_label ("Quit");
354 gtk_widget_ref (menu_quit);
355 gtk_object_set_data_full (GTK_OBJECT (main_window), "menu_quit", menu_quit,
356 (GtkDestroyNotify) gtk_widget_unref);
357 gtk_widget_show (menu_quit);
358 gtk_container_add (GTK_CONTAINER (file1_menu), menu_quit);
359 gtk_widget_add_accelerator (menu_quit, "activate", accel_group,
360 GDK_Q, GDK_CONTROL_MASK,
361 GTK_ACCEL_VISIBLE);
362
363 edit1 = gtk_menu_item_new_with_label ("Edit");
364 gtk_widget_show (edit1);
365 gtk_container_add (GTK_CONTAINER (menubar1), edit1);
366 gtk_menu_item_right_justify (GTK_MENU_ITEM (edit1));
367
368 edit1_menu = gtk_menu_new ();
369 gtk_menu_item_set_submenu (GTK_MENU_ITEM (edit1), edit1_menu);
370
371 menu_edit = gtk_menu_item_new_with_label ("Edit Patch...");
372 gtk_widget_show (menu_edit);
373 gtk_container_add (GTK_CONTAINER (edit1_menu), menu_edit);
374 gtk_widget_add_accelerator (menu_edit, "activate", accel_group,
375 GDK_E, GDK_CONTROL_MASK,
376 GTK_ACCEL_VISIBLE);
377
378 help1 = gtk_menu_item_new_with_label ("About");
379 gtk_widget_ref (help1);
380 gtk_object_set_data_full (GTK_OBJECT (main_window), "help1", help1,
381 (GtkDestroyNotify) gtk_widget_unref);
382 gtk_widget_show (help1);
383 gtk_container_add (GTK_CONTAINER (menubar1), help1);
384 gtk_menu_item_right_justify (GTK_MENU_ITEM (help1));
385
386 help1_menu = gtk_menu_new ();
387 gtk_widget_ref (help1_menu);
388 gtk_object_set_data_full (GTK_OBJECT (main_window), "help1_menu", help1_menu,
389 (GtkDestroyNotify) gtk_widget_unref);
390 gtk_menu_item_set_submenu (GTK_MENU_ITEM (help1), help1_menu);
391
392 menu_about = gtk_menu_item_new_with_label ("About hexter");
393 gtk_widget_ref (menu_about);
394 gtk_object_set_data_full (GTK_OBJECT (main_window), "menu_about", menu_about,
395 (GtkDestroyNotify) gtk_widget_unref);
396 gtk_widget_show (menu_about);
397 gtk_container_add (GTK_CONTAINER (help1_menu), menu_about);
398
399 notebook1 = gtk_notebook_new ();
400 gtk_widget_ref (notebook1);
401 gtk_object_set_data_full (GTK_OBJECT (main_window), "notebook1", notebook1,
402 (GtkDestroyNotify) gtk_widget_unref);
403 gtk_widget_show (notebook1);
404 gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0);
405
406 scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
407 gtk_widget_ref (scrolledwindow1);
408 gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow1", scrolledwindow1,
409 (GtkDestroyNotify) gtk_widget_unref);
410 gtk_widget_show (scrolledwindow1);
411 gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1);
412 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
413
414 patches_clist = gtk_clist_new (2);
415 gtk_widget_ref (patches_clist);
416 gtk_object_set_data_full (GTK_OBJECT (main_window), "patches_clist", patches_clist,
417 (GtkDestroyNotify) gtk_widget_unref);
418 gtk_widget_show (patches_clist);
419 gtk_container_add (GTK_CONTAINER (scrolledwindow1), patches_clist);
420 gtk_clist_set_column_width (GTK_CLIST (patches_clist), 0, 50);
421 gtk_clist_set_column_width (GTK_CLIST (patches_clist), 1, 80);
422 gtk_clist_column_titles_show (GTK_CLIST (patches_clist));
423
424 label45 = gtk_label_new ("Prog No");
425 gtk_widget_ref (label45);
426 gtk_object_set_data_full (GTK_OBJECT (main_window), "label45", label45,
427 (GtkDestroyNotify) gtk_widget_unref);
428 gtk_widget_show (label45);
429 gtk_clist_set_column_widget (GTK_CLIST (patches_clist), 0, label45);
430
431 label46 = gtk_label_new ("Name");
432 gtk_widget_ref (label46);
433 gtk_object_set_data_full (GTK_OBJECT (main_window), "label46", label46,
434 (GtkDestroyNotify) gtk_widget_unref);
435 gtk_widget_show (label46);
436 gtk_clist_set_column_widget (GTK_CLIST (patches_clist), 1, label46);
437
438 patches_tab_label = gtk_label_new ("Patches");
439 gtk_widget_ref (patches_tab_label);
440 gtk_object_set_data_full (GTK_OBJECT (main_window), "patches_tab_label", patches_tab_label,
441 (GtkDestroyNotify) gtk_widget_unref);
442 gtk_widget_show (patches_tab_label);
443 gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), patches_tab_label);
444
445 /* Configuration tab */
446 vbox2 = gtk_vbox_new (FALSE, 5);
447 gtk_widget_ref (vbox2);
448 gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox2", vbox2,
449 (GtkDestroyNotify) gtk_widget_unref);
450 gtk_widget_show (vbox2);
451 gtk_container_add (GTK_CONTAINER (notebook1), vbox2);
452 gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
453
454 frame14 = gtk_frame_new ("Synthesizer");
455 gtk_widget_ref (frame14);
456 gtk_object_set_data_full (GTK_OBJECT (main_window), "frame14", frame14,
457 (GtkDestroyNotify) gtk_widget_unref);
458 gtk_widget_show (frame14);
459 gtk_box_pack_start (GTK_BOX (vbox2), frame14, TRUE, TRUE, 0);
460
461 table16 = gtk_table_new (2, 6, FALSE);
462 gtk_widget_ref (table16);
463 gtk_object_set_data_full (GTK_OBJECT (main_window), "table16", table16,
464 (GtkDestroyNotify) gtk_widget_unref);
465 gtk_widget_show (table16);
466 gtk_container_add (GTK_CONTAINER (frame14), table16);
467 gtk_container_set_border_width (GTK_CONTAINER (table16), 2);
468 gtk_table_set_row_spacings (GTK_TABLE (table16), 5);
469 gtk_table_set_col_spacings (GTK_TABLE (table16), 5);
470
471 label43a = gtk_label_new ("tuning");
472 gtk_widget_ref (label43a);
473 gtk_object_set_data_full (GTK_OBJECT (main_window), "label43a", label43a,
474 (GtkDestroyNotify) gtk_widget_unref);
475 gtk_widget_show (label43a);
476 gtk_table_attach (GTK_TABLE (table16), label43a, 0, 1, 0, 1,
477 (GtkAttachOptions) (GTK_FILL),
478 (GtkAttachOptions) (0), 0, 0);
479 gtk_misc_set_alignment (GTK_MISC (label43a), 0, 0.5);
480 gtk_misc_set_padding (GTK_MISC (label43a), 2, 0);
481
482 tuning_adj = gtk_adjustment_new (440.0, 415.3, 466.2, 0.1, 1, 0);
483 tuning = gtk_spin_button_new (GTK_ADJUSTMENT (tuning_adj), 1, 1);
484 gtk_widget_ref (tuning);
485 gtk_object_set_data_full (GTK_OBJECT (main_window), "tuning", tuning,
486 (GtkDestroyNotify) gtk_widget_unref);
487 gtk_widget_show (tuning);
488 gtk_table_attach (GTK_TABLE (table16), tuning, 1, 2, 0, 1,
489 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
490 (GtkAttachOptions) (GTK_FILL), 0, 0);
491 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON (tuning), GTK_UPDATE_IF_VALID);
492 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (tuning), TRUE);
493
494 volume_label = gtk_label_new ("volume (dB)");
495 gtk_widget_ref (volume_label);
496 gtk_object_set_data_full (GTK_OBJECT (main_window), "volume_label", volume_label,
497 (GtkDestroyNotify) gtk_widget_unref);
498 gtk_widget_show (volume_label);
499 gtk_table_attach (GTK_TABLE (table16), volume_label, 0, 1, 1, 2,
500 (GtkAttachOptions) (GTK_FILL),
501 (GtkAttachOptions) (0), 0, 0);
502 gtk_misc_set_alignment (GTK_MISC (volume_label), 0, 0.5);
503 gtk_misc_set_padding (GTK_MISC (volume_label), 2, 0);
504
505 volume_adj = gtk_adjustment_new (0.0, -70.0, 20.0, 0.1, 1, 0);
506 volume = gtk_spin_button_new (GTK_ADJUSTMENT (volume_adj), 1, 1);
507 gtk_widget_ref (volume);
508 gtk_object_set_data_full (GTK_OBJECT (main_window), "volume", volume,
509 (GtkDestroyNotify) gtk_widget_unref);
510 gtk_widget_show (volume);
511 gtk_table_attach (GTK_TABLE (table16), volume, 1, 2, 1, 2,
512 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
513 (GtkAttachOptions) (GTK_FILL), 0, 0);
514 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON (volume), GTK_UPDATE_IF_VALID);
515 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (volume), TRUE);
516
517 monophonic_option_menu = gtk_option_menu_new ();
518 gtk_widget_ref (monophonic_option_menu);
519 gtk_object_set_data_full (GTK_OBJECT (main_window), "monophonic_option_menu", monophonic_option_menu,
520 (GtkDestroyNotify) gtk_widget_unref);
521 gtk_widget_show (monophonic_option_menu);
522 gtk_table_attach (GTK_TABLE (table16), monophonic_option_menu, 1, 2, 4, 5,
523 (GtkAttachOptions) (GTK_FILL),
524 (GtkAttachOptions) (0), 0, 0);
525 optionmenu5_menu = gtk_menu_new ();
526 mono_mode_off = gtk_menu_item_new_with_label ("Off");
527 gtk_widget_show (mono_mode_off);
528 gtk_menu_append (GTK_MENU (optionmenu5_menu), mono_mode_off);
529 mono_mode_on = gtk_menu_item_new_with_label ("On");
530 gtk_widget_show (mono_mode_on);
531 gtk_menu_append (GTK_MENU (optionmenu5_menu), mono_mode_on);
532 mono_mode_once = gtk_menu_item_new_with_label ("Once");
533 gtk_widget_show (mono_mode_once);
534 gtk_menu_append (GTK_MENU (optionmenu5_menu), mono_mode_once);
535 mono_mode_both = gtk_menu_item_new_with_label ("Both");
536 gtk_widget_show (mono_mode_both);
537 gtk_menu_append (GTK_MENU (optionmenu5_menu), mono_mode_both);
538 gtk_option_menu_set_menu (GTK_OPTION_MENU (monophonic_option_menu), optionmenu5_menu);
539
540 polyphony_instance_adj = gtk_adjustment_new (HEXTER_DEFAULT_POLYPHONY, 1, HEXTER_MAX_POLYPHONY, 1, 10, 0);
541 polyphony_instance = gtk_spin_button_new (GTK_ADJUSTMENT (polyphony_instance_adj), 1, 0);
542 gtk_widget_ref (polyphony_instance);
543 gtk_object_set_data_full (GTK_OBJECT (main_window), "polyphony_instance", polyphony_instance,
544 (GtkDestroyNotify) gtk_widget_unref);
545 gtk_widget_show (polyphony_instance);
546 gtk_table_attach (GTK_TABLE (table16), polyphony_instance, 1, 2, 2, 3,
547 (GtkAttachOptions) (GTK_FILL),
548 (GtkAttachOptions) (0), 0, 0);
549
550 label43 = gtk_label_new ("polyphony (instance)");
551 gtk_widget_ref (label43);
552 gtk_object_set_data_full (GTK_OBJECT (main_window), "label43", label43,
553 (GtkDestroyNotify) gtk_widget_unref);
554 gtk_widget_show (label43);
555 gtk_table_attach (GTK_TABLE (table16), label43, 0, 1, 2, 3,
556 (GtkAttachOptions) (GTK_FILL),
557 (GtkAttachOptions) (0), 0, 0);
558 gtk_misc_set_alignment (GTK_MISC (label43), 0, 0.5);
559 gtk_misc_set_padding (GTK_MISC (label43), 2, 0);
560
561 polyphony_global_adj = gtk_adjustment_new (HEXTER_DEFAULT_POLYPHONY, 1, HEXTER_MAX_POLYPHONY, 1, 10, 0);
562 polyphony_global = gtk_spin_button_new (GTK_ADJUSTMENT (polyphony_global_adj), 1, 0);
563 gtk_widget_ref (polyphony_global);
564 gtk_object_set_data_full (GTK_OBJECT (main_window), "polyphony_global", polyphony_global,
565 (GtkDestroyNotify) gtk_widget_unref);
566 gtk_widget_show (polyphony_global);
567 gtk_table_attach (GTK_TABLE (table16), polyphony_global, 1, 2, 3, 4,
568 (GtkAttachOptions) (GTK_FILL),
569 (GtkAttachOptions) (0), 0, 0);
570
571 label42 = gtk_label_new ("polyphony (global)");
572 gtk_widget_ref (label42);
573 gtk_object_set_data_full (GTK_OBJECT (main_window), "label42", label42,
574 (GtkDestroyNotify) gtk_widget_unref);
575 gtk_widget_show (label42);
576 gtk_table_attach (GTK_TABLE (table16), label42, 0, 1, 3, 4,
577 (GtkAttachOptions) (GTK_FILL),
578 (GtkAttachOptions) (0), 0, 0);
579 gtk_misc_set_alignment (GTK_MISC (label42), 0, 0.5);
580 gtk_misc_set_padding (GTK_MISC (label42), 2, 0);
581
582 label44 = gtk_label_new ("monophonic mode");
583 gtk_widget_ref (label44);
584 gtk_object_set_data_full (GTK_OBJECT (main_window), "label44", label44,
585 (GtkDestroyNotify) gtk_widget_unref);
586 gtk_widget_show (label44);
587 gtk_table_attach (GTK_TABLE (table16), label44, 0, 1, 4, 5,
588 (GtkAttachOptions) (GTK_FILL),
589 (GtkAttachOptions) (0), 0, 0);
590 gtk_misc_set_alignment (GTK_MISC (label44), 0, 0.5);
591 gtk_misc_set_padding (GTK_MISC (label44), 2, 0);
592
593 label44 = gtk_label_new ("disable LFO/Mod/Perf\n"
594 "(0.5.x compatibility)");
595 gtk_widget_show (label44);
596 gtk_table_attach (GTK_TABLE (table16), label44, 0, 1, 5, 6,
597 (GtkAttachOptions) (GTK_FILL),
598 (GtkAttachOptions) (0), 0, 0);
599 gtk_misc_set_alignment (GTK_MISC (label44), 0, 0.5);
600 gtk_misc_set_padding (GTK_MISC (label44), 2, 0);
601
602 compat059_button = gtk_check_button_new();
603 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compat059_button), 0);
604 gtk_widget_show (compat059_button);
605 gtk_table_attach (GTK_TABLE (table16), compat059_button, 1, 2, 5, 6,
606 (GtkAttachOptions) (GTK_FILL),
607 (GtkAttachOptions) (0), 0, 0);
608
609 #ifdef HEXTER_DEBUG_CONTROL
610 { GtkWidget *w;
611 test_adj = gtk_adjustment_new(0, 0, 16383, 1, 10, 0);
612 w = gtk_hscale_new(GTK_ADJUSTMENT(test_adj));
613 gtk_scale_set_value_pos (GTK_SCALE (w), GTK_POS_RIGHT);
614 gtk_scale_set_digits (GTK_SCALE (w), 0);
615 gtk_range_set_update_policy (GTK_RANGE (w), GTK_UPDATE_DELAYED);
616 gtk_widget_show(w);
617 gtk_table_attach (GTK_TABLE(table16), w, 0, 2, 6, 7,
618 (GtkAttachOptions) (GTK_FILL),
619 (GtkAttachOptions) (0), 0, 0);
620 g_signal_connect(G_OBJECT(test_adj), "value-changed", G_CALLBACK(on_test_changed), NULL);
621 }
622 #endif /* HEXTER_DEBUG_CONTROL */
623
624 #ifdef MIDI_ALSA
625 frame15 = gtk_frame_new ("Sys-Ex Patch Editing");
626 gtk_widget_ref (frame15);
627 gtk_object_set_data_full (GTK_OBJECT (main_window), "frame15", frame15,
628 (GtkDestroyNotify) gtk_widget_unref);
629 gtk_widget_show (frame15);
630 gtk_box_pack_start (GTK_BOX (vbox2), frame15, TRUE, TRUE, 0);
631
632 table3 = gtk_table_new (3, 2, FALSE);
633 gtk_widget_ref (table3);
634 gtk_object_set_data_full (GTK_OBJECT (main_window), "table3", table3,
635 (GtkDestroyNotify) gtk_widget_unref);
636 gtk_widget_show (table3);
637 gtk_container_add (GTK_CONTAINER (frame15), table3);
638 gtk_container_set_border_width (GTK_CONTAINER (table3), 2);
639 gtk_table_set_row_spacings (GTK_TABLE (table3), 5);
640 gtk_table_set_col_spacings (GTK_TABLE (table3), 5);
641
642 label11 = gtk_label_new ("Enable Sys-Ex Editing");
643 gtk_widget_ref (label11);
644 gtk_object_set_data_full (GTK_OBJECT (main_window), "label11", label11,
645 (GtkDestroyNotify) gtk_widget_unref);
646 gtk_widget_show (label11);
647 gtk_table_attach (GTK_TABLE (table3), label11, 0, 1, 0, 1,
648 (GtkAttachOptions) (GTK_FILL),
649 (GtkAttachOptions) (0), 0, 0);
650 gtk_misc_set_alignment (GTK_MISC (label11), 0, 0.5);
651
652 sysex_enable_button = gtk_check_button_new_with_label ("");
653 gtk_widget_ref (sysex_enable_button);
654 gtk_object_set_data_full (GTK_OBJECT (main_window), "sysex_enable_button", sysex_enable_button,
655 (GtkDestroyNotify) gtk_widget_unref);
656 gtk_widget_show (sysex_enable_button);
657 gtk_table_attach (GTK_TABLE (table3), sysex_enable_button, 1, 2, 0, 1,
658 (GtkAttachOptions) (GTK_FILL),
659 (GtkAttachOptions) (0), 0, 0);
660
661 sysex_channel_label = gtk_label_new ("Sys-Ex Receive Channel");
662 gtk_widget_ref (sysex_channel_label);
663 gtk_object_set_data_full (GTK_OBJECT (main_window), "sysex_channel_label", sysex_channel_label,
664 (GtkDestroyNotify) gtk_widget_unref);
665 gtk_widget_show (sysex_channel_label);
666 gtk_table_attach (GTK_TABLE (table3), sysex_channel_label, 0, 1, 1, 2,
667 (GtkAttachOptions) (GTK_FILL),
668 (GtkAttachOptions) (0), 0, 0);
669 gtk_misc_set_alignment (GTK_MISC (sysex_channel_label), 0, 0.5);
670 gtk_widget_set_sensitive (sysex_channel_label, FALSE);
671
672 sysex_channel_spin_adj = gtk_adjustment_new (1, 1, 16, 1, 10, 0);
673 sysex_channel_spin = gtk_spin_button_new (GTK_ADJUSTMENT (sysex_channel_spin_adj), 1, 0);
674 gtk_widget_ref (sysex_channel_spin);
675 gtk_object_set_data_full (GTK_OBJECT (main_window), "sysex_channel_spin", sysex_channel_spin,
676 (GtkDestroyNotify) gtk_widget_unref);
677 gtk_widget_show (sysex_channel_spin);
678 gtk_table_attach (GTK_TABLE (table3), sysex_channel_spin, 1, 2, 1, 2,
679 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
680 (GtkAttachOptions) (0), 0, 0);
681 gtk_widget_set_sensitive (sysex_channel_spin, FALSE);
682
683 frame4 = gtk_frame_new (NULL);
684 gtk_widget_ref (frame4);
685 gtk_object_set_data_full (GTK_OBJECT (main_window), "frame4", frame4,
686 (GtkDestroyNotify) gtk_widget_unref);
687 gtk_widget_show (frame4);
688 gtk_table_attach (GTK_TABLE (table3), frame4, 0, 2, 2, 3,
689 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
690 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
691 gtk_frame_set_shadow_type (GTK_FRAME (frame4), GTK_SHADOW_IN);
692
693 sysex_status_label = gtk_label_new (" ");
694 gtk_widget_ref (sysex_status_label);
695 gtk_object_set_data_full (GTK_OBJECT (main_window), "sysex_status_label", sysex_status_label,
696 (GtkDestroyNotify) gtk_widget_unref);
697 gtk_widget_show (sysex_status_label);
698 gtk_container_add (GTK_CONTAINER (frame4), sysex_status_label);
699 gtk_label_set_line_wrap (GTK_LABEL (sysex_status_label), TRUE);
700 gtk_misc_set_alignment (GTK_MISC (sysex_status_label), 0, 0.5);
701 #endif /* MIDI_ALSA */
702
703 configuration_tab_label = gtk_label_new ("Configuration");
704 gtk_widget_ref (configuration_tab_label);
705 gtk_object_set_data_full (GTK_OBJECT (main_window), "configuration_tab_label", configuration_tab_label,
706 (GtkDestroyNotify) gtk_widget_unref);
707 gtk_widget_show (configuration_tab_label);
708 gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), configuration_tab_label);
709
710 /* Performance tab */
711 performance_frame = gtk_frame_new ("Global Performance Parameters");
712 gtk_widget_ref (performance_frame);
713 gtk_object_set_data_full (GTK_OBJECT (main_window), "performance_frame", performance_frame,
714 (GtkDestroyNotify) gtk_widget_unref);
715 gtk_widget_show (performance_frame);
716 gtk_container_add (GTK_CONTAINER (notebook1), performance_frame);
717 gtk_container_set_border_width (GTK_CONTAINER (performance_frame), 5);
718
719 performance_table = gtk_table_new (2, 10, FALSE);
720 gtk_widget_ref (performance_table);
721 gtk_object_set_data_full (GTK_OBJECT (main_window), "performance_table", performance_table,
722 (GtkDestroyNotify) gtk_widget_unref);
723 gtk_widget_show (performance_table);
724 gtk_container_add (GTK_CONTAINER (performance_frame), performance_table);
725 gtk_container_set_border_width (GTK_CONTAINER (performance_table), 2);
726 gtk_table_set_row_spacings (GTK_TABLE (performance_table), 5);
727 gtk_table_set_col_spacings (GTK_TABLE (performance_table), 5);
728
729 create_performance_spin (main_window, "pitch bend range", performance_table, 0, PP_PITCH_BEND_RANGE, 12, 2);
730 create_performance_spin (main_window, "portamento time", performance_table, 1, PP_PORTAMENTO_TIME, 99, 0);
731 create_performance_spin (main_window, "mod wheel sens.", performance_table, 2, PP_MOD_WHEEL_SENSITIVITY, 15, 15);
732 create_performance_assign(main_window, "mod wheel assign", performance_table, 3, PP_MOD_WHEEL_ASSIGN, 0x01);
733 create_performance_spin (main_window, "foot sensitivity", performance_table, 4, PP_FOOT_SENSITIVITY, 15, 0);
734 create_performance_assign(main_window, "foot assign", performance_table, 5, PP_FOOT_ASSIGN, 0x04);
735 create_performance_spin (main_window, "pressure sens.", performance_table, 6, PP_PRESSURE_SENSITIVITY, 15, 15);
736 create_performance_assign(main_window, "pressure assign", performance_table, 7, PP_PRESSURE_ASSIGN, 0x02);
737 create_performance_spin (main_window, "breath sens.", performance_table, 8, PP_BREATH_SENSITIVITY, 15, 15);
738 create_performance_assign(main_window, "breath assign", performance_table, 9, PP_BREATH_ASSIGN, 0x02);
739
740 performance_tab_label = gtk_label_new ("Performance");
741 gtk_widget_ref (performance_tab_label);
742 gtk_object_set_data_full (GTK_OBJECT (main_window), "performance_tab_label", performance_tab_label,
743 (GtkDestroyNotify) gtk_widget_unref);
744 gtk_widget_show (performance_tab_label);
745 gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), performance_tab_label);
746
747 /* Test note widgets */
748 frame12 = gtk_frame_new ("Test Note");
749 gtk_widget_ref (frame12);
750 gtk_object_set_data_full (GTK_OBJECT (main_window), "frame12", frame12,
751 (GtkDestroyNotify) gtk_widget_unref);
752 gtk_widget_show (frame12);
753 gtk_container_set_border_width (GTK_CONTAINER (frame12), 7);
754 gtk_box_pack_start (GTK_BOX (vbox1), frame12, TRUE, TRUE, 0);
755
756 table15 = gtk_table_new (2, 3, FALSE);
757 gtk_widget_ref (table15);
758 gtk_object_set_data_full (GTK_OBJECT (main_window), "table15", table15,
759 (GtkDestroyNotify) gtk_widget_unref);
760 gtk_widget_show (table15);
761 gtk_container_add (GTK_CONTAINER (frame12), table15);
762 gtk_container_set_border_width (GTK_CONTAINER (table15), 4);
763 gtk_table_set_row_spacings (GTK_TABLE (table15), 5);
764 gtk_table_set_col_spacings (GTK_TABLE (table15), 5);
765
766 label10 = gtk_label_new ("key");
767 gtk_widget_ref (label10);
768 gtk_object_set_data_full (GTK_OBJECT (main_window), "label10", label10,
769 (GtkDestroyNotify) gtk_widget_unref);
770 gtk_widget_show (label10);
771 gtk_table_attach (GTK_TABLE (table15), label10, 0, 1, 0, 1,
772 (GtkAttachOptions) (GTK_FILL),
773 (GtkAttachOptions) (0), 0, 0);
774 gtk_misc_set_alignment (GTK_MISC (label10), 0, 0.5);
775 gtk_misc_set_padding (GTK_MISC (label10), 2, 0);
776
777 label10a = gtk_label_new ("velocity");
778 gtk_widget_ref (label10a);
779 gtk_object_set_data_full (GTK_OBJECT (main_window), "label10a", label10a,
780 (GtkDestroyNotify) gtk_widget_unref);
781 gtk_widget_show (label10a);
782 gtk_table_attach (GTK_TABLE (table15), label10a, 0, 1, 1, 2,
783 (GtkAttachOptions) (GTK_FILL),
784 (GtkAttachOptions) (0), 0, 0);
785 gtk_misc_set_alignment (GTK_MISC (label10a), 0, 0.5);
786 gtk_misc_set_padding (GTK_MISC (label10a), 2, 0);
787
788 test_note_button = gtk_button_new_with_label ("Send Test Note");
789 gtk_widget_ref (test_note_button);
790 gtk_object_set_data_full (GTK_OBJECT (main_window), "test_note_button", test_note_button,
791 (GtkDestroyNotify) gtk_widget_unref);
792 gtk_widget_show (test_note_button);
793 gtk_table_attach (GTK_TABLE (table15), test_note_button, 0, 2, 2, 3,
794 (GtkAttachOptions) (0),
795 (GtkAttachOptions) (0), 4, 0);
796 gtk_container_set_border_width (GTK_CONTAINER (test_note_button), 2);
797
798 test_note_key_adj = gtk_adjustment_new (60, 12, 132, 1, 12, 12);
799 test_note_key = gtk_hscale_new (GTK_ADJUSTMENT (test_note_key_adj));
800 gtk_widget_ref (test_note_key);
801 gtk_object_set_data_full (GTK_OBJECT (main_window), "test_note_key", test_note_key,
802 (GtkDestroyNotify) gtk_widget_unref);
803 gtk_widget_show (test_note_key);
804 gtk_table_attach (GTK_TABLE (table15), test_note_key, 1, 2, 0, 1,
805 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
806 (GtkAttachOptions) (GTK_FILL), 0, 0);
807 gtk_scale_set_value_pos (GTK_SCALE (test_note_key), GTK_POS_RIGHT);
808 gtk_scale_set_digits (GTK_SCALE (test_note_key), 0);
809 gtk_range_set_update_policy (GTK_RANGE (test_note_key), GTK_UPDATE_DELAYED);
810
811 test_note_velocity_adj = gtk_adjustment_new (84, 1, 137, 1, 10, 10);
812 test_note_velocity = gtk_hscale_new (GTK_ADJUSTMENT (test_note_velocity_adj));
813 gtk_widget_ref (test_note_velocity);
814 gtk_object_set_data_full (GTK_OBJECT (main_window), "test_note_velocity", test_note_velocity,
815 (GtkDestroyNotify) gtk_widget_unref);
816 gtk_widget_show (test_note_velocity);
817 gtk_table_attach (GTK_TABLE (table15), test_note_velocity, 1, 2, 1, 2,
818 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
819 (GtkAttachOptions) (GTK_FILL), 0, 0);
820 gtk_scale_set_value_pos (GTK_SCALE (test_note_velocity), GTK_POS_RIGHT);
821 gtk_scale_set_digits (GTK_SCALE (test_note_velocity), 0);
822 gtk_range_set_update_policy (GTK_RANGE (test_note_velocity), GTK_UPDATE_DELAYED);
823
824 /* connect main window */
825 gtk_signal_connect(GTK_OBJECT(main_window), "destroy",
826 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
827 gtk_signal_connect (GTK_OBJECT (main_window), "delete_event",
828 (GtkSignalFunc)on_delete_event_wrapper,
829 (gpointer)on_menu_quit_activate);
830
831 /* connect menu items */
832 gtk_signal_connect (GTK_OBJECT (menu_import), "activate",
833 GTK_SIGNAL_FUNC (on_menu_import_activate),
834 NULL);
835 gtk_signal_connect (GTK_OBJECT (menu_export), "activate",
836 GTK_SIGNAL_FUNC (on_menu_export_activate),
837 NULL);
838 gtk_signal_connect (GTK_OBJECT (menu_quit), "activate",
839 GTK_SIGNAL_FUNC (on_menu_quit_activate),
840 NULL);
841 gtk_signal_connect (GTK_OBJECT (menu_edit), "activate",
842 GTK_SIGNAL_FUNC (on_menu_edit_activate),
843 NULL);
844 gtk_signal_connect (GTK_OBJECT (menu_about), "activate",
845 GTK_SIGNAL_FUNC (on_menu_about_activate),
846 NULL);
847
848 /* connect patch list */
849 gtk_signal_connect(GTK_OBJECT(patches_clist), "select_row",
850 GTK_SIGNAL_FUNC(on_patches_selection),
851 NULL);
852
853 /* connect synth configuration widgets */
854 gtk_signal_connect (GTK_OBJECT (tuning_adj), "value_changed",
855 GTK_SIGNAL_FUNC(on_tuning_change),
856 NULL);
857 gtk_signal_connect (GTK_OBJECT (volume_adj), "value_changed",
858 GTK_SIGNAL_FUNC(on_volume_change),
859 NULL);
860 gtk_signal_connect (GTK_OBJECT (polyphony_instance_adj), "value_changed",
861 GTK_SIGNAL_FUNC(on_polyphony_change),
862 (gpointer)0);
863 gtk_signal_connect (GTK_OBJECT (polyphony_global_adj), "value_changed",
864 GTK_SIGNAL_FUNC(on_polyphony_change),
865 (gpointer)1);
866 gtk_signal_connect (GTK_OBJECT (mono_mode_off), "activate",
867 GTK_SIGNAL_FUNC (on_mono_mode_activate),
868 (gpointer)"off");
869 gtk_signal_connect (GTK_OBJECT (mono_mode_on), "activate",
870 GTK_SIGNAL_FUNC (on_mono_mode_activate),
871 (gpointer)"on");
872 gtk_signal_connect (GTK_OBJECT (mono_mode_once), "activate",
873 GTK_SIGNAL_FUNC (on_mono_mode_activate),
874 (gpointer)"once");
875 gtk_signal_connect (GTK_OBJECT (mono_mode_both), "activate",
876 GTK_SIGNAL_FUNC (on_mono_mode_activate),
877 (gpointer)"both");
878 gtk_signal_connect (GTK_OBJECT (compat059_button), "toggled",
879 GTK_SIGNAL_FUNC (on_compat059_toggled),
880 NULL);
881 #ifdef MIDI_ALSA
882 /* connect sys-ex widgets */
883 gtk_signal_connect (GTK_OBJECT (sysex_enable_button), "toggled",
884 GTK_SIGNAL_FUNC (on_sysex_enable_toggled),
885 NULL);
886 gtk_signal_connect (GTK_OBJECT (sysex_channel_spin_adj), "value_changed",
887 GTK_SIGNAL_FUNC (on_sysex_channel_change),
888 NULL);
889 #endif /* MIDI_ALSA */
890
891 /* connect test note widgets */
892 gtk_signal_connect (GTK_OBJECT (test_note_key_adj),
893 "value_changed", GTK_SIGNAL_FUNC(on_test_note_slider_change),
894 (gpointer)0);
895 gtk_signal_connect (GTK_OBJECT (test_note_velocity_adj),
896 "value_changed", GTK_SIGNAL_FUNC(on_test_note_slider_change),
897 (gpointer)1);
898 gtk_signal_connect (GTK_OBJECT (test_note_button), "pressed",
899 GTK_SIGNAL_FUNC (on_test_note_button_press),
900 (gpointer)1);
901 gtk_signal_connect (GTK_OBJECT (test_note_button), "released",
902 GTK_SIGNAL_FUNC (on_test_note_button_press),
903 (gpointer)0);
904
905 gtk_window_add_accel_group (GTK_WINDOW (main_window), accel_group);
906 }
907
908 void
create_about_window(const char * tag)909 create_about_window (const char *tag)
910 {
911 GtkWidget *vbox2;
912 GtkWidget *frame1;
913 GtkWidget *about_pixmap;
914 GtkWidget *closeabout;
915
916 about_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
917 gtk_object_set_data (GTK_OBJECT (about_window), "about_window", about_window);
918 gtk_window_set_title (GTK_WINDOW (about_window), "About hexter");
919 gtk_widget_realize(about_window); /* window must be realized for create_about_pixmap() */
920
921 vbox2 = gtk_vbox_new (FALSE, 0);
922 gtk_widget_ref (vbox2);
923 gtk_object_set_data_full (GTK_OBJECT (about_window), "vbox2", vbox2,
924 (GtkDestroyNotify) gtk_widget_unref);
925 gtk_widget_show (vbox2);
926 gtk_container_add (GTK_CONTAINER (about_window), vbox2);
927
928 frame1 = gtk_frame_new (NULL);
929 gtk_widget_ref (frame1);
930 gtk_object_set_data_full (GTK_OBJECT (main_window), "frame1", frame1,
931 (GtkDestroyNotify) gtk_widget_unref);
932 gtk_widget_show (frame1);
933 gtk_box_pack_start (GTK_BOX (vbox2), frame1, FALSE, FALSE, 0);
934
935 about_pixmap = (GtkWidget *)create_about_pixmap (about_window);
936 gtk_widget_ref (about_pixmap);
937 gtk_object_set_data_full (GTK_OBJECT (about_window), "about_pixmap", about_pixmap,
938 (GtkDestroyNotify) gtk_widget_unref);
939 gtk_widget_show (about_pixmap);
940 gtk_container_add (GTK_CONTAINER (frame1), about_pixmap);
941 gtk_misc_set_padding (GTK_MISC (about_pixmap), 5, 5);
942
943 about_label = gtk_label_new ("Some message\ngoes here");
944 gtk_widget_ref (about_label);
945 gtk_object_set_data_full (GTK_OBJECT (about_window), "about_label", about_label,
946 (GtkDestroyNotify) gtk_widget_unref);
947 gtk_widget_show (about_label);
948 gtk_box_pack_start (GTK_BOX (vbox2), about_label, FALSE, FALSE, 0);
949 // gtk_label_set_line_wrap (GTK_LABEL (about_label), TRUE);
950 gtk_label_set_justify (GTK_LABEL (about_label), GTK_JUSTIFY_CENTER);
951 gtk_misc_set_padding (GTK_MISC (about_label), 5, 5);
952
953 closeabout = gtk_button_new_with_label ("Dismiss");
954 gtk_widget_ref (closeabout);
955 gtk_object_set_data_full (GTK_OBJECT (about_window), "closeabout", closeabout,
956 (GtkDestroyNotify) gtk_widget_unref);
957 gtk_widget_show (closeabout);
958 gtk_box_pack_start (GTK_BOX (vbox2), closeabout, FALSE, FALSE, 0);
959
960 gtk_signal_connect (GTK_OBJECT (about_window), "destroy",
961 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
962 gtk_signal_connect (GTK_OBJECT (about_window), "delete_event",
963 GTK_SIGNAL_FUNC (on_delete_event_wrapper),
964 (gpointer)on_about_dismiss);
965 gtk_signal_connect (GTK_OBJECT (closeabout), "clicked",
966 GTK_SIGNAL_FUNC (on_about_dismiss),
967 NULL);
968 }
969
970 void
create_import_file_selection(const char * tag)971 create_import_file_selection (const char *tag)
972 {
973 char *title;
974 GtkWidget *ok_button;
975 GtkWidget *cancel_button;
976
977 title = (char *)malloc(strlen(tag) + 21);
978 sprintf(title, "%s - Import Patch Bank", tag);
979 import_file_selection = gtk_file_selection_new (title);
980 free(title);
981 gtk_object_set_data (GTK_OBJECT (import_file_selection), "import_file_selection", import_file_selection);
982 gtk_container_set_border_width (GTK_CONTAINER (import_file_selection), 10);
983
984 ok_button = GTK_FILE_SELECTION (import_file_selection)->ok_button;
985 gtk_object_set_data (GTK_OBJECT (import_file_selection), "ok_button", ok_button);
986 gtk_widget_show (ok_button);
987 GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
988
989 cancel_button = GTK_FILE_SELECTION (import_file_selection)->cancel_button;
990 gtk_object_set_data (GTK_OBJECT (import_file_selection), "cancel_button", cancel_button);
991 gtk_widget_show (cancel_button);
992 GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
993
994 gtk_signal_connect (GTK_OBJECT (import_file_selection), "destroy",
995 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
996 gtk_signal_connect (GTK_OBJECT (import_file_selection), "delete_event",
997 (GtkSignalFunc)on_delete_event_wrapper,
998 (gpointer)on_import_file_cancel);
999 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (import_file_selection)->ok_button),
1000 "clicked", (GtkSignalFunc)on_import_file_ok,
1001 NULL);
1002 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (import_file_selection)->cancel_button),
1003 "clicked", (GtkSignalFunc)on_import_file_cancel,
1004 NULL);
1005 }
1006
1007 void
create_import_file_position_window(const char * tag)1008 create_import_file_position_window (const char *tag)
1009 {
1010 GtkWidget *vbox4;
1011 GtkWidget *position_text_label;
1012 GtkWidget *hbox2;
1013 GtkWidget *label50;
1014 GtkWidget *position_spin;
1015 GtkWidget *hbox3;
1016 GtkWidget *position_cancel;
1017 GtkWidget *position_ok;
1018
1019 import_file_position_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1020 gtk_object_set_data (GTK_OBJECT (import_file_position_window),
1021 "import_file_position_window", import_file_position_window);
1022 set_window_title(import_file_position_window, tag, "Import Position");
1023
1024 vbox4 = gtk_vbox_new (FALSE, 0);
1025 gtk_widget_ref (vbox4);
1026 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window), "vbox4",
1027 vbox4, (GtkDestroyNotify) gtk_widget_unref);
1028 gtk_widget_show (vbox4);
1029 gtk_container_add (GTK_CONTAINER (import_file_position_window), vbox4);
1030 gtk_container_set_border_width (GTK_CONTAINER (vbox4), 6);
1031
1032 position_text_label = gtk_label_new ("Select the Program Number at which you "
1033 "wish to begin importing patches (existing "
1034 "patches will be overwritten)");
1035 gtk_widget_ref (position_text_label);
1036 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1037 "position_text_label", position_text_label,
1038 (GtkDestroyNotify) gtk_widget_unref);
1039 gtk_widget_show (position_text_label);
1040 gtk_box_pack_start (GTK_BOX (vbox4), position_text_label, TRUE, TRUE, 0);
1041 gtk_label_set_justify (GTK_LABEL (position_text_label), GTK_JUSTIFY_FILL);
1042 gtk_label_set_line_wrap (GTK_LABEL (position_text_label), TRUE);
1043 gtk_misc_set_padding (GTK_MISC (position_text_label), 0, 6);
1044
1045 hbox2 = gtk_hbox_new (FALSE, 0);
1046 gtk_widget_ref (hbox2);
1047 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window), "hbox2",
1048 hbox2, (GtkDestroyNotify) gtk_widget_unref);
1049 gtk_widget_show (hbox2);
1050 gtk_box_pack_start (GTK_BOX (vbox4), hbox2, TRUE, TRUE, 0);
1051 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 6);
1052
1053 label50 = gtk_label_new ("Program Number");
1054 gtk_widget_ref (label50);
1055 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window), "label50",
1056 label50, (GtkDestroyNotify) gtk_widget_unref);
1057 gtk_widget_show (label50);
1058 gtk_box_pack_start (GTK_BOX (hbox2), label50, FALSE, TRUE, 2);
1059
1060 import_file_position_spin_adj = gtk_adjustment_new (0, 0, 127, 1, 10, 0);
1061 position_spin = gtk_spin_button_new (GTK_ADJUSTMENT (import_file_position_spin_adj), 1, 0);
1062 gtk_widget_ref (position_spin);
1063 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1064 "position_spin", position_spin,
1065 (GtkDestroyNotify) gtk_widget_unref);
1066 gtk_widget_show (position_spin);
1067 gtk_box_pack_start (GTK_BOX (hbox2), position_spin, FALSE, FALSE, 2);
1068 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (position_spin), TRUE);
1069
1070 import_file_position_name_label = gtk_label_new ("default voice");
1071 gtk_widget_ref (import_file_position_name_label);
1072 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1073 "import_file_position_name_label",
1074 import_file_position_name_label,
1075 (GtkDestroyNotify) gtk_widget_unref);
1076 gtk_widget_show (import_file_position_name_label);
1077 gtk_box_pack_start (GTK_BOX (hbox2), import_file_position_name_label, FALSE, FALSE, 2);
1078 gtk_label_set_justify (GTK_LABEL (import_file_position_name_label), GTK_JUSTIFY_LEFT);
1079
1080 hbox3 = gtk_hbox_new (FALSE, 0);
1081 gtk_widget_ref (hbox3);
1082 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window), "hbox3", hbox3,
1083 (GtkDestroyNotify) gtk_widget_unref);
1084 gtk_widget_show (hbox3);
1085 gtk_box_pack_start (GTK_BOX (vbox4), hbox3, TRUE, TRUE, 0);
1086 gtk_container_set_border_width (GTK_CONTAINER (hbox3), 6);
1087
1088 position_cancel = gtk_button_new_with_label ("Cancel");
1089 gtk_widget_ref (position_cancel);
1090 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1091 "position_cancel", position_cancel,
1092 (GtkDestroyNotify) gtk_widget_unref);
1093 gtk_widget_show (position_cancel);
1094 gtk_box_pack_start (GTK_BOX (hbox3), position_cancel, TRUE, FALSE, 12);
1095
1096 position_ok = gtk_button_new_with_label ("Import");
1097 gtk_widget_ref (position_ok);
1098 gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1099 "position_ok", position_ok,
1100 (GtkDestroyNotify) gtk_widget_unref);
1101 gtk_widget_show (position_ok);
1102 gtk_box_pack_end (GTK_BOX (hbox3), position_ok, TRUE, FALSE, 12);
1103
1104 gtk_signal_connect (GTK_OBJECT (import_file_position_window), "destroy",
1105 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1106 gtk_signal_connect (GTK_OBJECT (import_file_position_window), "delete_event",
1107 (GtkSignalFunc)on_delete_event_wrapper,
1108 (gpointer)on_import_file_position_cancel);
1109 gtk_signal_connect (GTK_OBJECT (import_file_position_spin_adj),
1110 "value_changed", GTK_SIGNAL_FUNC(on_position_change),
1111 (gpointer)import_file_position_name_label);
1112 gtk_signal_connect (GTK_OBJECT (position_ok), "clicked",
1113 (GtkSignalFunc)on_import_file_position_ok,
1114 NULL);
1115 gtk_signal_connect (GTK_OBJECT (position_cancel), "clicked",
1116 (GtkSignalFunc)on_import_file_position_cancel,
1117 NULL);
1118 }
1119
1120 void
create_notice_window(const char * tag)1121 create_notice_window (const char *tag)
1122 {
1123 GtkWidget *vbox3;
1124 GtkWidget *hbox1;
1125 GtkWidget *notice_dismiss;
1126
1127 notice_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1128 gtk_object_set_data (GTK_OBJECT (notice_window), "notice_window", notice_window);
1129 set_window_title(notice_window, tag, "Notice");
1130 gtk_window_set_position (GTK_WINDOW (notice_window), GTK_WIN_POS_MOUSE);
1131 gtk_window_set_modal (GTK_WINDOW (notice_window), TRUE);
1132
1133 vbox3 = gtk_vbox_new (FALSE, 0);
1134 gtk_widget_ref (vbox3);
1135 gtk_object_set_data_full (GTK_OBJECT (notice_window), "vbox3", vbox3,
1136 (GtkDestroyNotify) gtk_widget_unref);
1137 gtk_widget_show (vbox3);
1138 gtk_container_add (GTK_CONTAINER (notice_window), vbox3);
1139
1140 notice_label_1 = gtk_label_new ("Some message\ngoes here");
1141 gtk_widget_ref (notice_label_1);
1142 gtk_object_set_data_full (GTK_OBJECT (notice_window), "notice_label_1", notice_label_1,
1143 (GtkDestroyNotify) gtk_widget_unref);
1144 gtk_widget_show (notice_label_1);
1145 gtk_box_pack_start (GTK_BOX (vbox3), notice_label_1, TRUE, TRUE, 0);
1146 gtk_label_set_line_wrap (GTK_LABEL (notice_label_1), TRUE);
1147 gtk_misc_set_padding (GTK_MISC (notice_label_1), 10, 5);
1148
1149 notice_label_2 = gtk_label_new ("more text\ngoes here");
1150 gtk_widget_ref (notice_label_2);
1151 gtk_object_set_data_full (GTK_OBJECT (notice_window), "notice_label_2", notice_label_2,
1152 (GtkDestroyNotify) gtk_widget_unref);
1153 gtk_widget_show (notice_label_2);
1154 gtk_box_pack_start (GTK_BOX (vbox3), notice_label_2, FALSE, FALSE, 0);
1155 gtk_label_set_line_wrap (GTK_LABEL (notice_label_2), TRUE);
1156 gtk_misc_set_padding (GTK_MISC (notice_label_2), 10, 5);
1157
1158 hbox1 = gtk_hbox_new (FALSE, 0);
1159 gtk_widget_ref (hbox1);
1160 gtk_object_set_data_full (GTK_OBJECT (notice_window), "hbox1", hbox1,
1161 (GtkDestroyNotify) gtk_widget_unref);
1162 gtk_widget_show (hbox1);
1163 gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1164
1165 notice_dismiss = gtk_button_new_with_label ("Dismiss");
1166 gtk_widget_ref (notice_dismiss);
1167 gtk_object_set_data_full (GTK_OBJECT (notice_window), "notice_dismiss", notice_dismiss,
1168 (GtkDestroyNotify) gtk_widget_unref);
1169 gtk_widget_show (notice_dismiss);
1170 gtk_box_pack_start (GTK_BOX (hbox1), notice_dismiss, TRUE, FALSE, 0);
1171 gtk_container_set_border_width (GTK_CONTAINER (notice_dismiss), 7);
1172
1173 gtk_signal_connect (GTK_OBJECT (notice_window), "destroy",
1174 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1175 gtk_signal_connect (GTK_OBJECT (notice_window), "delete_event",
1176 GTK_SIGNAL_FUNC (on_delete_event_wrapper),
1177 (gpointer)on_notice_dismiss);
1178 gtk_signal_connect (GTK_OBJECT (notice_dismiss), "clicked",
1179 GTK_SIGNAL_FUNC (on_notice_dismiss),
1180 NULL);
1181 }
1182
1183 void
create_export_file_type_window(const char * tag)1184 create_export_file_type_window (const char *tag)
1185 {
1186 GtkWidget *vbox1;
1187 GtkWidget *label1;
1188 GtkWidget *table1;
1189 GtkWidget *label2;
1190 GtkWidget *label3;
1191 GSList *save_type_group = NULL;
1192 GtkWidget *save_type_raw;
1193 GtkWidget *hseparator1;
1194 GtkWidget *label4;
1195 GtkWidget *table2;
1196 GtkWidget *label5;
1197 GtkWidget *export_file_start_spin;
1198 GtkWidget *hseparator2;
1199 GtkWidget *hbox3;
1200 GtkWidget *sft_position_cancel;
1201 GtkWidget *sft_position_ok;
1202
1203 export_file_type_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1204 gtk_object_set_data (GTK_OBJECT (export_file_type_window), "export_file_type_window",
1205 export_file_type_window);
1206 set_window_title(export_file_type_window, tag, "Export File Type");
1207
1208 vbox1 = gtk_vbox_new (FALSE, 0);
1209 gtk_widget_ref (vbox1);
1210 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "vbox1", vbox1,
1211 (GtkDestroyNotify) gtk_widget_unref);
1212 gtk_widget_show (vbox1);
1213 gtk_container_add (GTK_CONTAINER (export_file_type_window), vbox1);
1214 gtk_container_set_border_width (GTK_CONTAINER (vbox1), 6);
1215
1216 label1 = gtk_label_new ("Select the patch file format you wish to use for this export:");
1217 gtk_widget_ref (label1);
1218 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label1", label1,
1219 (GtkDestroyNotify) gtk_widget_unref);
1220 gtk_widget_show (label1);
1221 gtk_box_pack_start (GTK_BOX (vbox1), label1, TRUE, TRUE, 0);
1222 gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_FILL);
1223 gtk_label_set_line_wrap (GTK_LABEL (label1), TRUE);
1224 gtk_misc_set_padding (GTK_MISC (label1), 0, 6);
1225
1226 table1 = gtk_table_new (2, 2, FALSE);
1227 gtk_widget_ref (table1);
1228 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "table1", table1,
1229 (GtkDestroyNotify) gtk_widget_unref);
1230 gtk_widget_show (table1);
1231 gtk_box_pack_start (GTK_BOX (vbox1), table1, FALSE, FALSE, 0);
1232
1233 label2 = gtk_label_new ("(32 patches, 4104 bytes, any suffix)");
1234 gtk_widget_ref (label2);
1235 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label2", label2,
1236 (GtkDestroyNotify) gtk_widget_unref);
1237 gtk_widget_show (label2);
1238 gtk_table_attach (GTK_TABLE (table1), label2, 1, 2, 0, 1,
1239 (GtkAttachOptions) (GTK_FILL),
1240 (GtkAttachOptions) (0), 0, 0);
1241 gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
1242 gtk_misc_set_padding (GTK_MISC (label2), 5, 0);
1243
1244 label3 = gtk_label_new ("(any number of patches, 128 bytes per patch, hexter expects\".dx7\" suffix)");
1245 gtk_widget_ref (label3);
1246 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label3", label3,
1247 (GtkDestroyNotify) gtk_widget_unref);
1248 gtk_widget_show (label3);
1249 gtk_table_attach (GTK_TABLE (table1), label3, 1, 2, 1, 2,
1250 (GtkAttachOptions) (GTK_FILL),
1251 (GtkAttachOptions) (0), 0, 0);
1252 gtk_label_set_line_wrap (GTK_LABEL (label3), TRUE);
1253 gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
1254 gtk_misc_set_padding (GTK_MISC (label3), 5, 0);
1255
1256 export_file_type_sysex = gtk_radio_button_new_with_label (save_type_group, "DX7 sys-ex file");
1257 save_type_group = gtk_radio_button_group (GTK_RADIO_BUTTON (export_file_type_sysex));
1258 gtk_widget_ref (export_file_type_sysex);
1259 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_type_sysex", export_file_type_sysex,
1260 (GtkDestroyNotify) gtk_widget_unref);
1261 gtk_widget_show (export_file_type_sysex);
1262 gtk_table_attach (GTK_TABLE (table1), export_file_type_sysex, 0, 1, 0, 1,
1263 (GtkAttachOptions) (GTK_FILL),
1264 (GtkAttachOptions) (0), 4, 4);
1265 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (export_file_type_sysex), TRUE);
1266
1267 save_type_raw = gtk_radio_button_new_with_label (save_type_group, "raw DX7 patch file");
1268 save_type_group = gtk_radio_button_group (GTK_RADIO_BUTTON (save_type_raw));
1269 gtk_widget_ref (save_type_raw);
1270 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "save_type_raw", save_type_raw,
1271 (GtkDestroyNotify) gtk_widget_unref);
1272 gtk_widget_show (save_type_raw);
1273 gtk_table_attach (GTK_TABLE (table1), save_type_raw, 0, 1, 1, 2,
1274 (GtkAttachOptions) (GTK_FILL),
1275 (GtkAttachOptions) (0), 4, 4);
1276
1277 hseparator1 = gtk_hseparator_new ();
1278 gtk_widget_ref (hseparator1);
1279 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "hseparator1", hseparator1,
1280 (GtkDestroyNotify) gtk_widget_unref);
1281 gtk_widget_show (hseparator1);
1282 gtk_box_pack_start (GTK_BOX (vbox1), hseparator1, FALSE, FALSE, 2);
1283
1284 label4 = gtk_label_new ("Select the program numbers for the range of patches you wish to export:");
1285 gtk_widget_ref (label4);
1286 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label4", label4,
1287 (GtkDestroyNotify) gtk_widget_unref);
1288 gtk_widget_show (label4);
1289 gtk_box_pack_start (GTK_BOX (vbox1), label4, TRUE, TRUE, 0);
1290 gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_FILL);
1291 gtk_label_set_line_wrap (GTK_LABEL (label4), TRUE);
1292 gtk_misc_set_padding (GTK_MISC (label4), 0, 6);
1293
1294 table2 = gtk_table_new (2, 3, FALSE);
1295 gtk_widget_ref (table2);
1296 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "table2", table2,
1297 (GtkDestroyNotify) gtk_widget_unref);
1298 gtk_widget_show (table2);
1299 gtk_box_pack_start (GTK_BOX (vbox1), table2, TRUE, TRUE, 0);
1300 gtk_container_set_border_width (GTK_CONTAINER (table2), 4);
1301 gtk_table_set_col_spacings (GTK_TABLE (table2), 2);
1302
1303 label5 = gtk_label_new ("Start Program Number");
1304 gtk_widget_ref (label5);
1305 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label5", label5,
1306 (GtkDestroyNotify) gtk_widget_unref);
1307 gtk_widget_show (label5);
1308 gtk_table_attach (GTK_TABLE (table2), label5, 0, 1, 0, 1,
1309 (GtkAttachOptions) (GTK_FILL),
1310 (GtkAttachOptions) (0), 0, 0);
1311 gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
1312
1313 export_file_end_label = gtk_label_new ("End Program (inclusive)");
1314 gtk_widget_ref (export_file_end_label);
1315 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_end_label", export_file_end_label,
1316 (GtkDestroyNotify) gtk_widget_unref);
1317 gtk_widget_show (export_file_end_label);
1318 gtk_table_attach (GTK_TABLE (table2), export_file_end_label, 0, 1, 1, 2,
1319 (GtkAttachOptions) (GTK_FILL),
1320 (GtkAttachOptions) (0), 0, 0);
1321 gtk_misc_set_alignment (GTK_MISC (export_file_end_label), 0, 0.5);
1322 gtk_widget_set_sensitive (export_file_end_label, FALSE);
1323
1324 export_file_start_spin_adj = gtk_adjustment_new (0, 0, 96, 1, 10, 0);
1325 export_file_start_spin = gtk_spin_button_new (GTK_ADJUSTMENT (export_file_start_spin_adj), 1, 0);
1326 gtk_widget_ref (export_file_start_spin);
1327 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_start_spin", export_file_start_spin,
1328 (GtkDestroyNotify) gtk_widget_unref);
1329 gtk_widget_show (export_file_start_spin);
1330 gtk_table_attach (GTK_TABLE (table2), export_file_start_spin, 1, 2, 0, 1,
1331 (GtkAttachOptions) (0),
1332 (GtkAttachOptions) (0), 0, 0);
1333 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (export_file_start_spin), TRUE);
1334
1335 export_file_end_spin_adj = gtk_adjustment_new (31, 0, 127, 1, 10, 0);
1336 export_file_end_spin = gtk_spin_button_new (GTK_ADJUSTMENT (export_file_end_spin_adj), 1, 0);
1337 gtk_widget_ref (export_file_end_spin);
1338 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_end_spin", export_file_end_spin,
1339 (GtkDestroyNotify) gtk_widget_unref);
1340 gtk_widget_show (export_file_end_spin);
1341 gtk_table_attach (GTK_TABLE (table2), export_file_end_spin, 1, 2, 1, 2,
1342 (GtkAttachOptions) (0),
1343 (GtkAttachOptions) (0), 0, 0);
1344 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (export_file_end_spin), TRUE);
1345 gtk_widget_set_sensitive (export_file_end_spin, FALSE);
1346
1347 export_file_start_name = gtk_label_new ("(unset)");
1348 gtk_widget_ref (export_file_start_name);
1349 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_start_name", export_file_start_name,
1350 (GtkDestroyNotify) gtk_widget_unref);
1351 gtk_widget_show (export_file_start_name);
1352 gtk_table_attach (GTK_TABLE (table2), export_file_start_name, 2, 3, 0, 1,
1353 (GtkAttachOptions) (GTK_FILL),
1354 (GtkAttachOptions) (0), 0, 0);
1355 gtk_label_set_justify (GTK_LABEL (export_file_start_name), GTK_JUSTIFY_LEFT);
1356 gtk_misc_set_alignment (GTK_MISC (export_file_start_name), 0, 0.5);
1357
1358 export_file_end_name = gtk_label_new ("(unset)");
1359 gtk_widget_ref (export_file_end_name);
1360 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_end_name", export_file_end_name,
1361 (GtkDestroyNotify) gtk_widget_unref);
1362 gtk_widget_show (export_file_end_name);
1363 gtk_table_attach (GTK_TABLE (table2), export_file_end_name, 2, 3, 1, 2,
1364 (GtkAttachOptions) (GTK_FILL),
1365 (GtkAttachOptions) (0), 0, 0);
1366 gtk_misc_set_alignment (GTK_MISC (export_file_end_name), 0, 0.5);
1367
1368 hseparator2 = gtk_hseparator_new ();
1369 gtk_widget_ref (hseparator2);
1370 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "hseparator2", hseparator2,
1371 (GtkDestroyNotify) gtk_widget_unref);
1372 gtk_widget_show (hseparator2);
1373 gtk_box_pack_start (GTK_BOX (vbox1), hseparator2, FALSE, FALSE, 2);
1374
1375 hbox3 = gtk_hbox_new (FALSE, 0);
1376 gtk_widget_ref (hbox3);
1377 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "hbox3", hbox3,
1378 (GtkDestroyNotify) gtk_widget_unref);
1379 gtk_widget_show (hbox3);
1380 gtk_box_pack_start (GTK_BOX (vbox1), hbox3, TRUE, TRUE, 0);
1381 gtk_container_set_border_width (GTK_CONTAINER (hbox3), 6);
1382
1383 sft_position_cancel = gtk_button_new_with_label ("Cancel");
1384 gtk_widget_ref (sft_position_cancel);
1385 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window),
1386 "sft_position_cancel", sft_position_cancel,
1387 (GtkDestroyNotify) gtk_widget_unref);
1388 gtk_widget_show (sft_position_cancel);
1389 gtk_box_pack_start (GTK_BOX (hbox3), sft_position_cancel, TRUE, FALSE, 12);
1390
1391 sft_position_ok = gtk_button_new_with_label ("Export");
1392 gtk_widget_ref (sft_position_ok);
1393 gtk_object_set_data_full (GTK_OBJECT (export_file_type_window),
1394 "sft_position_ok", sft_position_ok,
1395 (GtkDestroyNotify) gtk_widget_unref);
1396 gtk_widget_show (sft_position_ok);
1397 gtk_box_pack_end (GTK_BOX (hbox3), sft_position_ok, TRUE, FALSE, 12);
1398
1399 gtk_signal_connect (GTK_OBJECT (export_file_type_window), "destroy",
1400 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1401 gtk_signal_connect (GTK_OBJECT (export_file_type_window), "delete_event",
1402 GTK_SIGNAL_FUNC (on_delete_event_wrapper),
1403 (gpointer)on_export_file_type_cancel);
1404 gtk_signal_connect (GTK_OBJECT (export_file_type_sysex), "pressed",
1405 GTK_SIGNAL_FUNC (on_export_file_type_press),
1406 (gpointer)0);
1407 gtk_signal_connect (GTK_OBJECT (save_type_raw), "pressed",
1408 GTK_SIGNAL_FUNC (on_export_file_type_press),
1409 (gpointer)1);
1410 gtk_signal_connect (GTK_OBJECT (export_file_start_spin_adj),
1411 "value_changed", GTK_SIGNAL_FUNC(on_export_file_position_change),
1412 (gpointer)0);
1413 gtk_signal_connect (GTK_OBJECT (export_file_end_spin_adj),
1414 "value_changed", GTK_SIGNAL_FUNC(on_export_file_position_change),
1415 (gpointer)1);
1416 gtk_signal_connect (GTK_OBJECT (sft_position_ok), "clicked",
1417 (GtkSignalFunc)on_export_file_type_ok,
1418 NULL);
1419 gtk_signal_connect (GTK_OBJECT (sft_position_cancel), "clicked",
1420 (GtkSignalFunc)on_export_file_type_cancel,
1421 NULL);
1422 }
1423
1424 void
create_export_file_selection(const char * tag)1425 create_export_file_selection (const char *tag)
1426 {
1427 char *title;
1428 GtkWidget *ok_button;
1429 GtkWidget *cancel_button;
1430
1431 title = (char *)malloc(strlen(tag) + 21);
1432 sprintf(title, "%s - Export Patch Bank", tag);
1433 export_file_selection = gtk_file_selection_new (title);
1434 free(title);
1435 gtk_object_set_data (GTK_OBJECT (export_file_selection), "export_file_selection", export_file_selection);
1436 gtk_container_set_border_width (GTK_CONTAINER (export_file_selection), 10);
1437
1438 ok_button = GTK_FILE_SELECTION (export_file_selection)->ok_button;
1439 gtk_object_set_data (GTK_OBJECT (export_file_selection), "ok_button", ok_button);
1440 gtk_widget_show (ok_button);
1441 GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
1442
1443 cancel_button = GTK_FILE_SELECTION (export_file_selection)->cancel_button;
1444 gtk_object_set_data (GTK_OBJECT (export_file_selection), "cancel_button", cancel_button);
1445 gtk_widget_show (cancel_button);
1446 GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
1447
1448 gtk_signal_connect (GTK_OBJECT (export_file_selection), "destroy",
1449 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1450 gtk_signal_connect (GTK_OBJECT (export_file_selection), "delete_event",
1451 (GtkSignalFunc)on_delete_event_wrapper,
1452 (gpointer)on_export_file_cancel);
1453 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (export_file_selection)->ok_button),
1454 "clicked", (GtkSignalFunc)on_export_file_ok,
1455 NULL);
1456 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (export_file_selection)->cancel_button),
1457 "clicked", (GtkSignalFunc)on_export_file_cancel,
1458 NULL);
1459 }
1460
1461 void
create_edit_save_position_window(const char * tag)1462 create_edit_save_position_window (const char *tag)
1463 {
1464 GtkWidget *vbox4;
1465 GtkWidget *hbox2;
1466 GtkWidget *edit_save_position_text_label;
1467 GtkWidget *label50;
1468 GtkWidget *position_spin;
1469 GtkWidget *hbox3;
1470 GtkWidget *position_cancel;
1471 GtkWidget *position_ok;
1472
1473 edit_save_position_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1474 gtk_object_set_data (GTK_OBJECT (edit_save_position_window),
1475 "edit_save_position_window", edit_save_position_window);
1476 set_window_title(edit_save_position_window, tag, "Edit Save Position");
1477
1478 vbox4 = gtk_vbox_new (FALSE, 0);
1479 gtk_widget_ref (vbox4);
1480 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window), "vbox4",
1481 vbox4, (GtkDestroyNotify) gtk_widget_unref);
1482 gtk_widget_show (vbox4);
1483 gtk_container_add (GTK_CONTAINER (edit_save_position_window), vbox4);
1484 gtk_container_set_border_width (GTK_CONTAINER (vbox4), 6);
1485
1486 edit_save_position_text_label = gtk_label_new ("Select the Program Number into which you "
1487 "wish to save the edited patch "
1488 "(the existing patch will be overwritten):");
1489 gtk_widget_ref (edit_save_position_text_label);
1490 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1491 "edit_save_position_text_label", edit_save_position_text_label,
1492 (GtkDestroyNotify) gtk_widget_unref);
1493 gtk_widget_show (edit_save_position_text_label);
1494 gtk_box_pack_start (GTK_BOX (vbox4), edit_save_position_text_label, TRUE, TRUE, 0);
1495 gtk_label_set_justify (GTK_LABEL (edit_save_position_text_label), GTK_JUSTIFY_FILL);
1496 gtk_label_set_line_wrap (GTK_LABEL (edit_save_position_text_label), TRUE);
1497 gtk_misc_set_padding (GTK_MISC (edit_save_position_text_label), 0, 6);
1498
1499 hbox2 = gtk_hbox_new (FALSE, 0);
1500 gtk_widget_ref (hbox2);
1501 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window), "hbox2",
1502 hbox2, (GtkDestroyNotify) gtk_widget_unref);
1503 gtk_widget_show (hbox2);
1504 gtk_box_pack_start (GTK_BOX (vbox4), hbox2, TRUE, TRUE, 0);
1505 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 6);
1506
1507 label50 = gtk_label_new ("Program Number");
1508 gtk_widget_ref (label50);
1509 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window), "label50",
1510 label50, (GtkDestroyNotify) gtk_widget_unref);
1511 gtk_widget_show (label50);
1512 gtk_box_pack_start (GTK_BOX (hbox2), label50, FALSE, TRUE, 2);
1513
1514 edit_save_position_spin_adj = gtk_adjustment_new (0, 0, 127, 1, 10, 0);
1515 position_spin = gtk_spin_button_new (GTK_ADJUSTMENT (edit_save_position_spin_adj), 1, 0);
1516 gtk_widget_ref (position_spin);
1517 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1518 "position_spin", position_spin,
1519 (GtkDestroyNotify) gtk_widget_unref);
1520 gtk_widget_show (position_spin);
1521 gtk_box_pack_start (GTK_BOX (hbox2), position_spin, FALSE, FALSE, 2);
1522 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (position_spin), TRUE);
1523
1524 edit_save_position_name_label = gtk_label_new ("default voice");
1525 gtk_widget_ref (edit_save_position_name_label);
1526 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1527 "edit_save_position_name_label",
1528 edit_save_position_name_label,
1529 (GtkDestroyNotify) gtk_widget_unref);
1530 gtk_widget_show (edit_save_position_name_label);
1531 gtk_box_pack_start (GTK_BOX (hbox2), edit_save_position_name_label, FALSE, FALSE, 2);
1532 gtk_label_set_justify (GTK_LABEL (edit_save_position_name_label), GTK_JUSTIFY_LEFT);
1533
1534 hbox3 = gtk_hbox_new (FALSE, 0);
1535 gtk_widget_ref (hbox3);
1536 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window), "hbox3", hbox3,
1537 (GtkDestroyNotify) gtk_widget_unref);
1538 gtk_widget_show (hbox3);
1539 gtk_box_pack_start (GTK_BOX (vbox4), hbox3, TRUE, TRUE, 0);
1540 gtk_container_set_border_width (GTK_CONTAINER (hbox3), 6);
1541
1542 position_cancel = gtk_button_new_with_label ("Cancel");
1543 gtk_widget_ref (position_cancel);
1544 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1545 "position_cancel", position_cancel,
1546 (GtkDestroyNotify) gtk_widget_unref);
1547 gtk_widget_show (position_cancel);
1548 gtk_box_pack_start (GTK_BOX (hbox3), position_cancel, TRUE, FALSE, 12);
1549
1550 position_ok = gtk_button_new_with_label ("Save");
1551 gtk_widget_ref (position_ok);
1552 gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1553 "position_ok", position_ok,
1554 (GtkDestroyNotify) gtk_widget_unref);
1555 gtk_widget_show (position_ok);
1556 gtk_box_pack_end (GTK_BOX (hbox3), position_ok, TRUE, FALSE, 12);
1557
1558 gtk_signal_connect (GTK_OBJECT (edit_save_position_window), "destroy",
1559 GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1560 gtk_signal_connect (GTK_OBJECT (edit_save_position_window), "delete_event",
1561 (GtkSignalFunc)on_delete_event_wrapper,
1562 (gpointer)on_edit_save_position_cancel);
1563 gtk_signal_connect (GTK_OBJECT (edit_save_position_spin_adj),
1564 "value_changed", GTK_SIGNAL_FUNC(on_position_change),
1565 (gpointer)edit_save_position_name_label);
1566 gtk_signal_connect (GTK_OBJECT (position_ok), "clicked",
1567 (GtkSignalFunc)on_edit_save_position_ok,
1568 NULL);
1569 gtk_signal_connect (GTK_OBJECT (position_cancel), "clicked",
1570 (GtkSignalFunc)on_edit_save_position_cancel,
1571 NULL);
1572 }
1573
1574 void
create_windows(const char * instance_tag)1575 create_windows(const char *instance_tag)
1576 {
1577 char tag[50];
1578
1579 /* build a nice identifier string for the window titles */
1580 if (strlen(instance_tag) == 0) {
1581 strcpy(tag, "hexter v" VERSION);
1582 } else if (strstr(instance_tag, "hexter")) {
1583 if (strlen(instance_tag) > 49) {
1584 snprintf(tag, 50, "...%s", instance_tag + strlen(instance_tag) - 46); /* hope the unique info is at the end */
1585 } else {
1586 strcpy(tag, instance_tag);
1587 }
1588 } else {
1589 if (strlen(instance_tag) > 42) {
1590 snprintf(tag, 50, "hexter ...%s", instance_tag + strlen(instance_tag) - 39);
1591 } else {
1592 snprintf(tag, 50, "hexter %s", instance_tag);
1593 }
1594 }
1595
1596 create_main_window(tag);
1597 create_editor_window(tag);
1598 create_about_window(tag);
1599 create_import_file_selection(tag);
1600 create_import_file_position_window(tag);
1601 create_export_file_type_window(tag);
1602 create_export_file_selection(tag);
1603 create_edit_save_position_window(tag);
1604 create_notice_window(tag);
1605 }
1606
1607