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
28 #include "generator.h"
35 #define GENERATOR_CLASS_NAME "arrwindow"
36 #define GENERATOR_CLASS_PATH "Array/Window"
42 #define NUM_EVENT_INPUTS 1
45 #define NUM_EVENT_OUTPUTS 1
52 PRIVATE
int init_instance(Generator
*g
) {
53 Data
*data
= safe_malloc(sizeof(Data
));
61 PRIVATE
void destroy_instance(Generator
*g
) {
71 PRIVATE
void unpickle_instance(Generator
*g
, ObjectStoreItem
*item
, ObjectStore
*db
) {
72 Data
*data
= safe_malloc(sizeof(Data
));
80 PRIVATE
void pickle_instance(Generator
*g
, ObjectStoreItem
*item
, ObjectStore
*db
) {
81 //Data *data = g->data;
84 PRIVATE
void evt_input_handler(Generator
*g
, AEvent
*event
) {
90 RETURN_UNLESS( event
->kind
== AE_NUMARRAY
);
91 //RETURN_UNLESS( (event->d.array.len & 1) == 0 );
93 if( event
->d
.array
.len
!= data
->lastN
) {
95 data
->lastN
= event
->d
.array
.len
;
100 data
->window
= safe_malloc( sizeof( SAMPLE
) * data
->lastN
);
101 for( i
=0; i
<data
->lastN
; i
++ )
102 data
->window
[i
] = 0.5 * ( 1 - cos(2*M_PI
*i
/(data
->lastN
-1)));
105 in
= event
->d
.array
.numbers
;
106 // TODO: make this alloca...
107 out
= safe_malloc( sizeof( SAMPLE
) * data
->lastN
);
109 for( i
=0; i
<data
->lastN
; i
++ )
110 out
[i
] = data
->window
[i
] * in
[i
];
113 gen_init_aevent(&send_ev
, AE_NUMARRAY
, NULL
, 0, NULL
, 0, event
->time
);
115 send_ev
.d
.array
.len
= data
->lastN
;
116 send_ev
.d
.array
.numbers
= out
;
119 gen_send_events(g
, EVT_OUTPUT
, -1, &send_ev
);
124 PRIVATE ControlDescriptor controls
[] = {
125 /* { kind, name, min,max,step,page, size,editable, is_dst,queue_number,
126 init,destroy,refresh,refresh_data }, */
127 { CONTROL_KIND_NONE
, },
130 PRIVATE
void setup_class(void) {
131 GeneratorClass
*k
= gen_new_generatorclass(GENERATOR_CLASS_NAME
, FALSE
,
132 NUM_EVENT_INPUTS
, NUM_EVENT_OUTPUTS
,
133 NULL
, NULL
, controls
,
134 init_instance
, destroy_instance
,
135 unpickle_instance
, pickle_instance
);
137 gen_configure_event_input(k
, EVT_INPUT
, "Input", evt_input_handler
);
138 gen_configure_event_output(k
, EVT_OUTPUT
, "Output" );
140 gencomp_register_generatorclass(k
, FALSE
, GENERATOR_CLASS_PATH
, NULL
, NULL
);
143 PUBLIC
void init_plugin(void) {