make midimap obey channels
[galan.git] / plugins / libevtsettings.c
blob3ffdbc9dad93ddfb2a2d8e1caa7ea2ff7ec13653
1 /* gAlan - Graphical Audio Language
2 * Copyright (C) 1999 Tony Garnock-Jones
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include <stdlib.h>
20 #include <string.h>
21 #include <stdio.h>
22 #include <stddef.h>
24 #include <gdk/gdk.h>
25 #include <gtk/gtk.h>
27 #include "global.h"
28 #include "generator.h"
29 #include "comp.h"
30 #include "control.h"
31 #include "gencomp.h"
32 #include "msgbox.h"
35 #define NUM_MEMLINES 16
37 #define GENERATOR_CLASS_NAME "evtsettings"
38 #define GENERATOR_CLASS_PATH "Misc/Settings"
40 #define EVT_INPUT0 0
41 #define EVT_INPUT1 1
42 #define EVT_INPUT2 2
43 #define EVT_INPUT3 3
44 #define EVT_INPUT4 4
45 #define EVT_INPUT5 5
46 #define EVT_INPUT6 6
47 #define EVT_INPUT7 7
48 #define EVT_MEM 8
49 #define NUM_INPUT_EVENTS 9
51 #define EVT_OUTPUT0 0
52 #define EVT_OUTPUT1 1
53 #define EVT_OUTPUT2 2
54 #define EVT_OUTPUT3 3
55 #define EVT_OUTPUT4 4
56 #define EVT_OUTPUT5 5
57 #define EVT_OUTPUT6 6
58 #define EVT_OUTPUT7 7
59 #define NUM_OUTPUT_EVENTS 8
61 typedef struct Data {
62 gint activeline;
63 gdouble mem[NUM_MEMLINES][NUM_OUTPUT_EVENTS];
64 } Data;
66 PRIVATE int init_instance(Generator *g) {
68 int i,j;
69 Data *data = safe_malloc( sizeof( Data ) );
71 data->activeline = 0;
73 for( i=0; i<NUM_MEMLINES; i++ )
74 for( j=0; j<NUM_OUTPUT_EVENTS; j++ )
75 data->mem[i][j] = 0.0;
78 g->data = data;
80 return 1;
83 PRIVATE void destroy_instance(Generator *g) {
85 free( g->data );
88 PRIVATE void unpickle_instance(Generator *g, ObjectStoreItem *item, ObjectStore *db) {
90 int i,j;
91 ObjectStoreDatum *array;
92 Data *data = safe_malloc(sizeof(Data));
94 data->activeline = objectstore_item_get_integer(item, "activeline", 0);
95 array = objectstore_item_get(item, "mem");
97 for (i = 0; i < NUM_MEMLINES; i++)
98 for (j = 0; j < NUM_OUTPUT_EVENTS; j++)
99 data->mem[i][j] =
100 objectstore_datum_double_value(
101 objectstore_datum_array_get(array, i * NUM_OUTPUT_EVENTS + j)
104 g->data = data;
107 PRIVATE void pickle_instance(Generator *g, ObjectStoreItem *item, ObjectStore *db) {
109 Data *data = g->data;
110 ObjectStoreDatum *array = objectstore_datum_new_array(NUM_MEMLINES * NUM_OUTPUT_EVENTS);
111 int i, j;
113 objectstore_item_set_integer(item, "activeline", data->activeline);
114 objectstore_item_set(item, "mem", array);
116 for (i = 0; i < NUM_MEMLINES; i++)
117 for (j = 0; j < NUM_OUTPUT_EVENTS; j++)
118 objectstore_datum_array_set(array, i * NUM_OUTPUT_EVENTS + j,
119 objectstore_datum_new_double(data->mem[i][j]));
122 PRIVATE void evt_input_handler(Generator *g, AEvent *event) {
124 Data *data = g->data;
126 data->mem[data->activeline][event->dst_q] = event->d.number;
129 gen_send_events(g, event->dst_q, -1, event);
133 PRIVATE void evt_mem_handler(Generator *g, AEvent *event) {
135 int i;
136 Data *data = g->data;
138 if( (event->d.number >=0) && (event->d.number < NUM_MEMLINES) ) {
140 data->activeline = event->d.number;
141 for( i=0; i<NUM_OUTPUT_EVENTS; i++ ) {
142 event->d.number = data->mem[data->activeline][i];
143 gen_send_events( g, i, -1, event );
148 PRIVATE ControlDescriptor controls[] = {
149 { CONTROL_KIND_NONE, }
154 PRIVATE void setup_class(void) {
155 GeneratorClass *k = gen_new_generatorclass(GENERATOR_CLASS_NAME, FALSE, NUM_INPUT_EVENTS, NUM_OUTPUT_EVENTS,
156 NULL, NULL, controls,
157 init_instance, destroy_instance,
158 unpickle_instance, pickle_instance);
160 gen_configure_event_input(k, EVT_INPUT0, "Input0", evt_input_handler);
161 gen_configure_event_input(k, EVT_INPUT1, "Input1", evt_input_handler);
162 gen_configure_event_input(k, EVT_INPUT2, "Input2", evt_input_handler);
163 gen_configure_event_input(k, EVT_INPUT3, "Input3", evt_input_handler);
164 gen_configure_event_input(k, EVT_INPUT4, "Input4", evt_input_handler);
165 gen_configure_event_input(k, EVT_INPUT5, "Input5", evt_input_handler);
166 gen_configure_event_input(k, EVT_INPUT6, "Input6", evt_input_handler);
167 gen_configure_event_input(k, EVT_INPUT7, "Input7", evt_input_handler);
168 gen_configure_event_input(k, EVT_MEM, "MemLine", evt_mem_handler);
170 gen_configure_event_output(k, EVT_OUTPUT0, "Output0");
171 gen_configure_event_output(k, EVT_OUTPUT1, "Output1");
172 gen_configure_event_output(k, EVT_OUTPUT2, "Output2");
173 gen_configure_event_output(k, EVT_OUTPUT3, "Output3");
174 gen_configure_event_output(k, EVT_OUTPUT4, "Output4");
175 gen_configure_event_output(k, EVT_OUTPUT5, "Output5");
176 gen_configure_event_output(k, EVT_OUTPUT6, "Output6");
177 gen_configure_event_output(k, EVT_OUTPUT7, "Output7");
179 gencomp_register_generatorclass(k, FALSE, GENERATOR_CLASS_PATH, NULL, NULL);
182 PUBLIC void init_plugin(void) {
183 setup_class();