missing commit in generator.h
[galan.git] / plugins / libmidievt_noteoff.c
blob6f486fe12226f18fbfd9aa6916cf38e5757085ab
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>
26 #include <gmodule.h>
28 #include "global.h"
29 #include "generator.h"
30 #include "comp.h"
31 #include "control.h"
32 #include "gencomp.h"
34 #define GENERATOR_CLASS_NAME "midievt_noteoff"
35 #define GENERATOR_CLASS_PATH "MIDI Events/NoteOff"
37 #define EVT_NOTE 0
38 #define EVT_CHANNEL 1
39 #define EVT_VELOCITY 2
40 #define NUM_EVENT_INPUTS 3
42 #define EVT_OUTPUT 0
43 #define NUM_EVENT_OUTPUTS 1
45 typedef struct Data {
46 char channel;
47 char vel;
48 } Data;
50 PRIVATE int init_instance(Generator *g) {
51 Data *data = safe_malloc(sizeof(Data));
52 g->data = data;
54 data->channel = 0;
55 data->vel = 64;
57 return 1;
60 PRIVATE void destroy_instance(Generator *g) {
61 free(g->data);
64 PRIVATE void unpickle_instance(Generator *g, ObjectStoreItem *item, ObjectStore *db) {
65 Data *data = safe_malloc(sizeof(Data));
66 g->data = data;
68 data->channel = objectstore_item_get_double(item, "channel", 0);
69 data->vel = objectstore_item_get_double(item, "velocity", 64);
72 PRIVATE void pickle_instance(Generator *g, ObjectStoreItem *item, ObjectStore *db) {
73 Data *data = g->data;
74 objectstore_item_set_double(item, "channel", data->channel);
75 objectstore_item_set_double(item, "velocity", data->vel);
78 PRIVATE void evt_note_handler(Generator *g, AEvent *event) {
79 char note;
80 Data *data = g->data;
82 switch( event->kind ) {
83 case AE_NUMBER:
84 note = ((char) event->d.number) & 0x7f;
85 event->kind = AE_MIDIEVENT;
86 event->d.midiev.len = 3;
87 event->d.midiev.midistring[0] = 0x80 | (data->channel & 0x0f);
88 event->d.midiev.midistring[1] = note;
89 event->d.midiev.midistring[2] = data->vel;
90 gen_send_events(g, EVT_OUTPUT, -1, event);
91 break;
92 default:
93 g_warning( "midi_note does not know this eventkind\n" );
94 break;
98 PRIVATE void evt_channel_handler(Generator *g, AEvent *event) {
99 ((Data *) g->data)->channel = (char) event->d.number & 0x0f;
102 PRIVATE void evt_vel_handler(Generator *g, AEvent *event) {
103 ((Data *) g->data)->vel = (char) event->d.number & 0x7f;
106 PRIVATE ControlDescriptor controls[] = {
107 /* { kind, name, min,max,step,page, size,editable, is_dst,queue_number,
108 init,destroy,refresh,refresh_data }, */
109 // { CONTROL_KIND_KNOB, "velocity", -1,1,0.1,0.01, 0,TRUE, TRUE, EVT_ADDEND,
110 // NULL,NULL, control_double_updater, (gpointer) offsetof(Data, addend) },
111 { CONTROL_KIND_NONE, }
114 PRIVATE void setup_class(void) {
115 GeneratorClass *k = gen_new_generatorclass(GENERATOR_CLASS_NAME, FALSE,
116 NUM_EVENT_INPUTS, NUM_EVENT_OUTPUTS,
117 NULL, NULL, controls,
118 init_instance, destroy_instance,
119 unpickle_instance, pickle_instance);
121 gen_configure_event_input(k, EVT_NOTE, "Note", evt_note_handler);
122 gen_configure_event_input(k, EVT_CHANNEL, "Channel", evt_channel_handler);
123 gen_configure_event_input(k, EVT_VELOCITY, "Velocity", evt_vel_handler);
124 gen_configure_event_output(k, EVT_OUTPUT, "Output");
126 gencomp_register_generatorclass(k, FALSE, GENERATOR_CLASS_PATH,
127 NULL,
128 NULL);
131 PUBLIC void init_plugin(void) {
132 setup_class();