aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cyclone/Makefile.objects2
-rw-r--r--cyclone/build_counter2
-rw-r--r--cyclone/hammer/coll.c4
-rw-r--r--cyclone/hammer/funbuff.c2
-rw-r--r--cyclone/hammer/hammer.c19
-rw-r--r--cyclone/hammer/mtr.c6
-rw-r--r--cyclone/hammer/seq.c4
-rw-r--r--cyclone/hammer/zl.c60
-rw-r--r--cyclone/shadow/cyclone.c20
-rw-r--r--cyclone/sickle/peek.c8
-rw-r--r--cyclone/sickle/poke.c4
-rw-r--r--cyclone/sickle/record.c68
-rw-r--r--cyclone/sickle/sickle.c19
-rw-r--r--shared/common/loud.c13
-rw-r--r--shared/common/loud.h1
-rw-r--r--shared/common/port.c172
-rw-r--r--shared/hammer/file.c27
-rw-r--r--shared/hammer/file.h2
-rw-r--r--test/cyclone/buffir-test.pd66
-rw-r--r--test/cyclone/cyclone-test.pd55
20 files changed, 351 insertions, 203 deletions
diff --git a/cyclone/Makefile.objects b/cyclone/Makefile.objects
index 87d7ae4..4bd1695 100644
--- a/cyclone/Makefile.objects
+++ b/cyclone/Makefile.objects
@@ -21,5 +21,5 @@ SVEFL_OBJECTS = common/vefl.o sickle/sic.o common/loud.o unstable/fragile.o
SARSIC_OBJECTS = sickle/sic.o sickle/arsic.o common/vefl.o \
common/loud.o unstable/fragile.o
SFILE_OBJECTS = hammer/file.o sickle/sic.o common/loud.o unstable/forky.o
-RELEASE_LIBS = cyclone hammer sickle
+RELEASE_LIBS = cyclone hammer sickle dummies
RELEASE_APPS = cyclist
diff --git a/cyclone/build_counter b/cyclone/build_counter
index 0414f92..3381c8b 100644
--- a/cyclone/build_counter
+++ b/cyclone/build_counter
@@ -1,3 +1,3 @@
#define CYCLONE_VERSION "0.1"
#define CYCLONE_RELEASE "alpha"
-#define CYCLONE_BUILD 45
+#define CYCLONE_BUILD 46
diff --git a/cyclone/hammer/coll.c b/cyclone/hammer/coll.c
index c4a3388..3d9aa68 100644
--- a/cyclone/hammer/coll.c
+++ b/cyclone/hammer/coll.c
@@ -1373,7 +1373,7 @@ static void coll_read(t_coll *x, t_symbol *s)
if (s && s != &s_)
collcommon_doread(cc, s, x->x_canvas);
else
- hammerpanel_open(cc->c_filehandle);
+ hammerpanel_open(cc->c_filehandle, 0);
}
static void coll_write(t_coll *x, t_symbol *s)
@@ -1391,7 +1391,7 @@ static void coll_readagain(t_coll *x)
if (cc->c_filename)
collcommon_doread(cc, 0, 0);
else
- hammerpanel_open(cc->c_filehandle);
+ hammerpanel_open(cc->c_filehandle, 0);
}
static void coll_writeagain(t_coll *x)
diff --git a/cyclone/hammer/funbuff.c b/cyclone/hammer/funbuff.c
index 8d9d698..5791b1e 100644
--- a/cyclone/hammer/funbuff.c
+++ b/cyclone/hammer/funbuff.c
@@ -260,7 +260,7 @@ static void funbuff_read(t_funbuff *x, t_symbol *s)
if (s && s != &s_)
funbuff_doread(x, s);
else
- hammerpanel_open(x->x_filehandle);
+ hammerpanel_open(x->x_filehandle, 0);
}
/* CHECKED symbol arg not allowed --
diff --git a/cyclone/hammer/hammer.c b/cyclone/hammer/hammer.c
index a4d7efe..3c4f3c2 100644
--- a/cyclone/hammer/hammer.c
+++ b/cyclone/hammer/hammer.c
@@ -27,21 +27,24 @@ static void hammer_readhook(t_pd *z, t_symbol *fn, int ac, t_atom *av)
import_max(fn->s_name, "");
}
-static void hammer_import(t_hammer *x, t_symbol *fn, t_symbol *dir)
+static void hammer_doimport(t_hammer *x, t_symbol *fn, t_symbol *dir)
{
+ if (!dir || dir == &s_) dir = x->x_dir;
if (fn && fn != &s_)
- {
- if (!dir || dir == &s_) dir = x->x_dir;
import_max(fn->s_name, (dir && dir != &s_) ? dir->s_name : "");
- }
else
- hammerpanel_open(x->x_filehandle);
+ hammerpanel_open(x->x_filehandle, dir);
}
static void hammer_click(t_hammer *x, t_floatarg xpos, t_floatarg ypos,
- t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
+ t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
+{
+ hammer_doimport(x, 0, 0);
+}
+
+static void hammer_import(t_hammer *x, t_symbol *fn)
{
- hammer_import(x, 0, 0);
+ hammer_doimport(x, fn, 0);
}
static void hammer_bang(t_hammer *x)
@@ -82,7 +85,7 @@ void hammer_setup(void)
sizeof(t_hammer), 0, A_DEFSYM, 0);
class_addbang(hammer_class, hammer_bang);
class_addmethod(hammer_class, (t_method)hammer_import,
- gensym("import"), A_DEFSYM, A_DEFSYM, 0);
+ gensym("import"), A_DEFSYM, 0);
class_addmethod(hammer_class, (t_method)hammer_click,
gensym("click"),
A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
diff --git a/cyclone/hammer/mtr.c b/cyclone/hammer/mtr.c
index edc5e20..ecc80d3 100644
--- a/cyclone/hammer/mtr.c
+++ b/cyclone/hammer/mtr.c
@@ -321,7 +321,7 @@ static void mtrack_read(t_mtrack *tp, t_symbol *s)
if (s && s != &s_)
mtr_doread(tp->tr_owner, tp, s);
else /* CHECKED no default */
- hammerpanel_open(tp->tr_filehandle);
+ hammerpanel_open(tp->tr_filehandle, 0);
}
static void mtrack_write(t_mtrack *tp, t_symbol *s)
@@ -553,7 +553,7 @@ static void mtr_doread(t_mtr *x, t_mtrack *target, t_symbol *fname)
{
/* CHECKED no complaint, open dialog not presented... */
/* LATER rethink */
- hammerpanel_open(target ? target->tr_filehandle : x->x_filehandle);
+ hammerpanel_open(target ? target->tr_filehandle : x->x_filehandle, 0);
}
}
@@ -672,7 +672,7 @@ static void mtr_read(t_mtr *x, t_symbol *s)
if (s && s != &s_)
mtr_doread(x, 0, s);
else /* CHECKED no default */
- hammerpanel_open(x->x_filehandle);
+ hammerpanel_open(x->x_filehandle, 0);
}
static void mtr_write(t_mtr *x, t_symbol *s)
diff --git a/cyclone/hammer/seq.c b/cyclone/hammer/seq.c
index 5997d31..011c97d 100644
--- a/cyclone/hammer/seq.c
+++ b/cyclone/hammer/seq.c
@@ -782,7 +782,7 @@ static void seq_textread(t_seq *x, char *path)
if (binbuf_read(bb, path, "", 0))
{
/* CHECKED no complaint, open dialog presented */
- hammerpanel_open(x->x_filehandle); /* LATER rethink */
+ hammerpanel_open(x->x_filehandle, 0); /* LATER rethink */
}
else
{
@@ -872,7 +872,7 @@ static void seq_read(t_seq *x, t_symbol *s)
if (s && s != &s_)
seq_doread(x, s, 0);
else /* CHECKED no default */
- hammerpanel_open(x->x_filehandle);
+ hammerpanel_open(x->x_filehandle, 0);
}
static void seq_write(t_seq *x, t_symbol *s)
diff --git a/cyclone/hammer/zl.c b/cyclone/hammer/zl.c
index 566c18e..59e8f84 100644
--- a/cyclone/hammer/zl.c
+++ b/cyclone/hammer/zl.c
@@ -7,6 +7,7 @@
#include "common/loud.h"
#include "common/grow.h"
+/* CHECKME bang behaviour (every mode) */
/* LATER test reentrancy, tune speedwise */
#define ZL_DEBUG
@@ -20,7 +21,7 @@ struct _zl;
typedef int (*t_zlintargfn)(struct _zl *, int);
typedef void (*t_zlanyargfn)(struct _zl *, t_symbol *, int, t_atom *);
typedef int (*t_zlnatomsfn)(struct _zl *);
-typedef void (*t_zldoitfn)(struct _zl *, int, t_atom *);
+typedef void (*t_zldoitfn)(struct _zl *, int, t_atom *, int);
static int zl_nmodes = 0;
static t_symbol *zl_modesym[ZL_MAXMODES];
@@ -255,7 +256,7 @@ static int zl_nop_count(t_zl *x)
return (0);
}
-static void zl_nop(t_zl *x, int natoms, t_atom *buf)
+static void zl_nop(t_zl *x, int natoms, t_atom *buf, int banged)
{
loud_warning((t_pd *)x, "unknown mode");
}
@@ -270,7 +271,7 @@ static int zl_ecils_count(t_zl *x)
return (x->x_entered ? -1 : 0);
}
-static void zl_ecils(t_zl *x, int natoms, t_atom *buf)
+static void zl_ecils(t_zl *x, int natoms, t_atom *buf, int banged)
{
int cnt1, cnt2 = x->x_modearg;
natoms = x->x_inbuf1.d_natoms;
@@ -296,7 +297,7 @@ static int zl_group_count(t_zl *x)
return (x->x_entered ? -1 : 0);
}
-static void zl_group(t_zl *x, int natoms, t_atom *buf)
+static void zl_group(t_zl *x, int natoms, t_atom *buf, int banged)
{
int cnt = x->x_modearg;
if (cnt > 0)
@@ -312,6 +313,11 @@ static void zl_group(t_zl *x, int natoms, t_atom *buf)
x->x_inbuf1.d_natoms = natoms;
while (natoms--) *buf++ = *from++;
}
+ if (banged && x->x_inbuf1.d_natoms)
+ {
+ zl_output(x, x->x_inbuf1.d_natoms, buf);
+ x->x_inbuf1.d_natoms = 0;
+ }
}
else x->x_inbuf1.d_natoms = 0; /* CHECKED */
}
@@ -329,7 +335,7 @@ static int zl_iter_count(t_zl *x)
: 0);
}
-static void zl_iter(t_zl *x, int natoms, t_atom *buf)
+static void zl_iter(t_zl *x, int natoms, t_atom *buf, int banged)
{
int nremaining = x->x_inbuf1.d_natoms;
t_atom *ptr = x->x_inbuf1.d_buf;
@@ -361,7 +367,7 @@ static int zl_join_count(t_zl *x)
return (x->x_inbuf1.d_natoms + x->x_inbuf2.d_natoms);
}
-static void zl_join(t_zl *x, int natoms, t_atom *buf)
+static void zl_join(t_zl *x, int natoms, t_atom *buf, int banged)
{
if (buf)
{
@@ -379,9 +385,11 @@ static int zl_len_count(t_zl *x)
return (0);
}
-static void zl_len(t_zl *x, int natoms, t_atom *buf)
+static void zl_len(t_zl *x, int natoms, t_atom *buf, int banged)
{
- outlet_float(((t_object *)x)->ob_outlet, x->x_inbuf1.d_natoms);
+/* CHECKED 'mode len, bang'->[zl]->[print] crashes max 4.0.7... */
+ if (!banged) /* CHECKED bang is a nop in len mode */
+ outlet_float(((t_object *)x)->ob_outlet, x->x_inbuf1.d_natoms);
}
static int zl_nth_intarg(t_zl *x, int i)
@@ -408,7 +416,7 @@ static int zl_nth_count(t_zl *x)
else return (-1);
}
-static void zl_nth(t_zl *x, int natoms, t_atom *buf)
+static void zl_nth(t_zl *x, int natoms, t_atom *buf, int banged)
{
int ac1 = x->x_inbuf1.d_natoms,
ndx = x->x_modearg - 1; /* CHECKED one-based */
@@ -462,7 +470,7 @@ static int zl_reg_count(t_zl *x)
return (x->x_entered ? x->x_inbuf1.d_natoms : 0);
}
-static void zl_reg(t_zl *x, int natoms, t_atom *buf)
+static void zl_reg(t_zl *x, int natoms, t_atom *buf, int banged)
{
if (buf) memcpy(buf, x->x_inbuf1.d_buf, natoms * sizeof(*buf));
else
@@ -480,7 +488,7 @@ static int zl_rev_count(t_zl *x)
return (x->x_inbuf1.d_natoms);
}
-static void zl_rev(t_zl *x, int natoms, t_atom *buf)
+static void zl_rev(t_zl *x, int natoms, t_atom *buf, int banged)
{
if (buf)
{
@@ -501,7 +509,7 @@ static int zl_rot_count(t_zl *x)
return (x->x_inbuf1.d_natoms);
}
-static void zl_rot(t_zl *x, int natoms, t_atom *buf)
+static void zl_rot(t_zl *x, int natoms, t_atom *buf, int banged)
{
if (buf)
{
@@ -554,7 +562,7 @@ static int zl_sect_count(t_zl *x)
}
/* CHECKED in-buffer duplicates are skipped */
-static void zl_sect(t_zl *x, int natoms, t_atom *buf)
+static void zl_sect(t_zl *x, int natoms, t_atom *buf, int banged)
{
if (buf)
{
@@ -591,7 +599,7 @@ static int zl_slice_count(t_zl *x)
return (x->x_entered ? -1 : 0);
}
-static void zl_slice(t_zl *x, int natoms, t_atom *buf)
+static void zl_slice(t_zl *x, int natoms, t_atom *buf, int banged)
{
int cnt1 = x->x_modearg, cnt2;
natoms = x->x_inbuf1.d_natoms;
@@ -612,7 +620,7 @@ static int zl_sub_count(t_zl *x)
return (0);
}
-static void zl_sub(t_zl *x, int natoms, t_atom *buf)
+static void zl_sub(t_zl *x, int natoms, t_atom *buf, int banged)
{
int natoms2 = x->x_inbuf2.d_natoms;
if (natoms2)
@@ -656,7 +664,7 @@ static int zl_union_count(t_zl *x)
}
/* CHECKED in-buffer duplicates not skipped */
-static void zl_union(t_zl *x, int natoms, t_atom *buf)
+static void zl_union(t_zl *x, int natoms, t_atom *buf, int banged)
{
if (buf)
{
@@ -682,7 +690,7 @@ static void zl_union(t_zl *x, int natoms, t_atom *buf)
}
}
-static void zl_doit(t_zl *x)
+static void zl_doit(t_zl *x, int banged)
{
int reentered = x->x_entered;
int prealloc = !reentered;
@@ -711,21 +719,19 @@ static void zl_doit(t_zl *x)
/* LATER consider using the stack if !prealloc && natoms <= MAXSTACK */
if (buf = (prealloc ? d->d_buf : getbytes(natoms * sizeof(*buf))))
{
- (*zl_doitfn[x->x_mode])(x, natoms, buf);
+ (*zl_doitfn[x->x_mode])(x, natoms, buf, banged);
if (buf != d->d_buf)
freebytes(buf, natoms * sizeof(*buf));
}
}
- else (*zl_doitfn[x->x_mode])(x, 0, 0);
+ else (*zl_doitfn[x->x_mode])(x, 0, 0, banged);
if (!reentered)
x->x_entered = x->x_locked = 0;
}
static void zl_bang(t_zl *x)
{
- /* CHECKED bang is a nop in len mode, LATER consider emulating this */
- /* CHECKED 'mode len, bang'->[zl]->[print] crashes max 4.0.7... */
- zl_doit(x);
+ zl_doit(x, 1);
}
static void zl_float(t_zl *x, t_float f)
@@ -737,7 +743,7 @@ static void zl_float(t_zl *x, t_float f)
else
zldata_setfloat(&x->x_inbuf1, f);
}
- zl_doit(x);
+ zl_doit(x, 0);
}
static void zl_symbol(t_zl *x, t_symbol *s)
@@ -749,7 +755,7 @@ static void zl_symbol(t_zl *x, t_symbol *s)
else
zldata_setsymbol(&x->x_inbuf1, s);
}
- zl_doit(x);
+ zl_doit(x, 0);
}
/* LATER gpointer */
@@ -763,7 +769,7 @@ static void zl_list(t_zl *x, t_symbol *s, int ac, t_atom *av)
else
zldata_setlist(&x->x_inbuf1, ac, av);
}
- zl_doit(x);
+ zl_doit(x, 0);
}
static void zl_anything(t_zl *x, t_symbol *s, int ac, t_atom *av)
@@ -775,7 +781,7 @@ static void zl_anything(t_zl *x, t_symbol *s, int ac, t_atom *av)
else
zldata_set(&x->x_inbuf1, s, ac, av);
}
- zl_doit(x);
+ zl_doit(x, 0);
}
static int zl_modeargfn(t_zl *x)
@@ -944,7 +950,7 @@ static void zl_setupallmodes(void)
zl_setupmode("nth", 0, zl_nth_intarg, zl_nth_anyarg, zl_nth_count, zl_nth);
zl_setupmode("reg", 0, 0, zl_reg_anyarg, zl_reg_count, zl_reg);
zl_setupmode("rev", 0, 0, 0, zl_rev_count, zl_rev);
- zl_setupmode("rot", /* CHECKED (refman error) */
+ zl_setupmode("rot", /* CHECKED (refman's error) */
0, zl_rot_intarg, 0, zl_rot_count, zl_rot);
zl_setupmode("sect", 0, 0, 0, zl_sect_count, zl_sect);
zl_setupmode("slice", 0, zl_slice_intarg, 0, zl_slice_count, zl_slice);
diff --git a/cyclone/shadow/cyclone.c b/cyclone/shadow/cyclone.c
index 10ae142..f6c5e8c 100644
--- a/cyclone/shadow/cyclone.c
+++ b/cyclone/shadow/cyclone.c
@@ -4,6 +4,9 @@
/* Never use forked calls in shadow code... */
+/* LATER support multi-atom dir (creation args), and fn ('import' message)
+ (same in hammer and sickle) */
+
#include <stdio.h>
#include "m_pd.h"
#include "common/loud.h"
@@ -35,21 +38,24 @@ static void cyclone_readhook(t_pd *z, t_symbol *fn, int ac, t_atom *av)
import_max(fn->s_name, "");
}
-static void cyclone_import(t_cyclone *x, t_symbol *fn, t_symbol *dir)
+static void cyclone_doimport(t_cyclone *x, t_symbol *fn, t_symbol *dir)
{
+ if (!dir || dir == &s_) dir = x->x_dir;
if (fn && fn != &s_)
- {
- if (!dir || dir == &s_) dir = x->x_dir;
import_max(fn->s_name, (dir && dir != &s_) ? dir->s_name : "");
- }
else
- hammerpanel_open(x->x_filehandle);
+ hammerpanel_open(x->x_filehandle, dir);
}
static void cyclone_click(t_cyclone *x, t_floatarg xpos, t_floatarg ypos,
t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
{
- cyclone_import(x, 0, 0);
+ cyclone_doimport(x, 0, 0);
+}
+
+static void cyclone_import(t_cyclone *x, t_symbol *fn)
+{
+ cyclone_doimport(x, fn, 0);
}
static void cyclone_bang(t_cyclone *x)
@@ -127,7 +133,7 @@ void cyclone_setup(void)
class_addmethod(cyclone_class, (t_method)cyclone_dummies,
gensym("dummies"), 0);
class_addmethod(cyclone_class, (t_method)cyclone_import,
- gensym("import"), A_DEFSYM, A_DEFSYM, 0);
+ gensym("import"), A_DEFSYM, 0);
class_addmethod(cyclone_class, (t_method)cyclone_click,
gensym("click"),
A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
diff --git a/cyclone/sickle/peek.c b/cyclone/sickle/peek.c
index 534cc49..333f427 100644
--- a/cyclone/sickle/peek.c
+++ b/cyclone/sickle/peek.c
@@ -31,7 +31,7 @@ static void peek_tick(t_peek *x)
{
arsic_redraw((t_arsic *)x); /* LATER redraw only dirty channel(s!) */
x->x_clockset = 0;
- x->x_clocklasttick = clock_getsystime();
+ x->x_clocklasttick = clock_getlogicaltime();
}
static void peek_set(t_peek *x, t_symbol *s)
@@ -41,7 +41,7 @@ static void peek_set(t_peek *x, t_symbol *s)
#define peek_doclip(f) (f < -1. ? -1. : (f > 1. ? 1. : f))
-/* CHECKED refman error: ``if the number received in the left inlet
+/* CHECKED refman's error: ``if the number received in the left inlet
specifies a sample index that does not exist in the buffer~ object's
currently allocated memory, nothing happens.'' This is plainly wrong,
at least for max/msp 4.0.7 bundle: the index is clipped (just like
@@ -115,14 +115,14 @@ static void *peek_new(t_symbol *s, t_floatarg f1, t_floatarg f2)
ch = PEEK_MAXCHANNELS;
x->x_maxchannels = (ch ? PEEK_MAXCHANNELS : 1);
x->x_effchannel = x->x_reqchannel = (ch ? ch - 1 : 0);
- /* CHECKED (refman error) clipping is disabled by default */
+ /* CHECKED (refman's error) clipping is disabled by default */
x->x_clipmode = ((int)f2 != 0);
x->x_pokemode = 0;
inlet_new((t_object *)x, (t_pd *)x, &s_float, gensym("ft1"));
inlet_new((t_object *)x, (t_pd *)x, &s_float, gensym("ft2"));
outlet_new((t_object *)x, &s_float);
x->x_clock = clock_new(x, (t_method)peek_tick);
- x->x_clocklasttick = clock_getsystime();
+ x->x_clocklasttick = clock_getlogicaltime();
x->x_clockset = 0;
}
return (x);
diff --git a/cyclone/sickle/poke.c b/cyclone/sickle/poke.c
index d0fb22a..7e45558 100644
--- a/cyclone/sickle/poke.c
+++ b/cyclone/sickle/poke.c
@@ -29,7 +29,7 @@ static void poke_tick(t_poke *x)
{
arsic_redraw((t_arsic *)x); /* LATER redraw only dirty channel(s!) */
x->x_clockset = 0;
- x->x_clocklasttick = clock_getsystime();
+ x->x_clocklasttick = clock_getlogicaltime();
}
static void poke_set(t_poke *x, t_symbol *s)
@@ -132,7 +132,7 @@ static void *poke_new(t_symbol *s, t_floatarg f)
x->x_indexptr = fragile_inlet_signalscalar(in2);
inlet_new((t_object *)x, (t_pd *)x, &s_float, gensym("ft2"));
x->x_clock = clock_new(x, (t_method)poke_tick);
- x->x_clocklasttick = clock_getsystime();
+ x->x_clocklasttick = clock_getlogicaltime();
x->x_clockset = 0;
}
return (x);
diff --git a/cyclone/sickle/record.c b/cyclone/sickle/record.c
index ba2e3b5..f03e784 100644
--- a/cyclone/sickle/record.c
+++ b/cyclone/sickle/record.c
@@ -8,6 +8,8 @@
#include "sickle/sic.h"
#include "sickle/arsic.h"
+#define RECORD_REDRAWPAUSE 1000. /* refractory period */
+
typedef struct _record
{
t_arsic x_arsic;
@@ -23,13 +25,20 @@ typedef struct _record
float x_syncincr;
int x_isrunning; /* to know if sync should be 0.0 or 1.0 */
t_clock *x_clock;
+ double x_clocklasttick;
} t_record;
static t_class *record_class;
static void record_tick(t_record *x)
{
- arsic_redraw((t_arsic *)x);
+ double timesince = clock_gettimesince(x->x_clocklasttick);
+ if (timesince >= RECORD_REDRAWPAUSE)
+ {
+ arsic_redraw((t_arsic *)x);
+ x->x_clocklasttick = clock_getlogicaltime();
+ }
+ else clock_delay(x->x_clock, RECORD_REDRAWPAUSE - timesince);
}
static void record_setsync(t_record *x)
@@ -37,15 +46,15 @@ static void record_setsync(t_record *x)
/* CHECKED: clipped to array size -- using indices, not points */
float range = (float)(x->x_endindex - x->x_startindex);
int phase = x->x_phase;
- if (phase == SHARED_INT_MAX || range < 1.0)
+ if (phase == SHARED_INT_MAX || range < 1.)
{
- x->x_sync = (x->x_isrunning ? 1.0 : 0); /* CHECKED */
- x->x_syncincr = 0;
+ x->x_sync = (x->x_isrunning ? 1. : 0.); /* CHECKED */
+ x->x_syncincr = 0.;
}
else
{
x->x_sync = (float)(phase - x->x_startindex) / range;
- x->x_syncincr = 1.0 / range;
+ x->x_syncincr = 1. / range;
}
}
@@ -68,6 +77,15 @@ static void record_set(t_record *x, t_symbol *s)
record_mstoindex(x);
}
+static void record_reset(t_record *x)
+{
+ x->x_startpoint = x->x_endpoint = 0.;
+ x->x_pauseindex = SHARED_INT_MAX;
+ x->x_phase = SHARED_INT_MAX;
+ x->x_isrunning = 0;
+ record_mstoindex(x);
+}
+
static void record_startpoint(t_record *x, t_floatarg f)
{
x->x_startpoint = f;
@@ -91,7 +109,7 @@ static void record_float(t_record *x, t_float f)
}
else if (x->x_phase != SHARED_INT_MAX) /* CHECKED: no rewind */
{
- record_tick(x);
+ clock_delay(x->x_clock, 10.);
x->x_pauseindex = x->x_phase;
x->x_phase = SHARED_INT_MAX;
}
@@ -126,7 +144,7 @@ static t_int *record_perform(t_int *w)
{
int vecsize = sic->s_vecsize;
float syncincr = x->x_syncincr;
- int ch, over, i, nxfer;
+ int ch, over, i, nxfer, ndone = 0;
loopover:
if ((nxfer = endphase - phase) > nblock)
{
@@ -140,7 +158,7 @@ loopover:
t_float *vp = sic->s_vectors[ch];
if (vp)
{
- t_float *ip = (t_float *)(w[3 + ch]);
+ t_float *ip = (t_float *)(w[3 + ch]) + ndone;
vp += phase;
i = nxfer;
/* LATER consider handling under and overflows */
@@ -148,6 +166,10 @@ loopover:
}
}
i = nxfer;
+
+ sync = phase;
+ syncincr = 1.;
+
while (i--)
{
*out++ = sync;
@@ -155,31 +177,35 @@ loopover:
}
if (over)
{
+ clock_delay(x->x_clock, 0);
nblock -= nxfer;
if (x->x_loopmode
&& (phase = x->x_startindex) < endphase)
{
x->x_phase = phase;
x->x_sync = sync = 0;
- if (nblock > 0) goto loopover;
- goto done;
+ if (nblock > 0)
+ {
+ ndone += nxfer;
+ goto loopover;
+ }
+ goto alldone;
}
- clock_delay(x->x_clock, 0);
/* CHECKED: no restart in append mode */
x->x_pauseindex = SHARED_INT_MAX;
x->x_phase = SHARED_INT_MAX;
- x->x_sync = 1.0;
- x->x_syncincr = 0;
+ x->x_sync = 1.;
+ x->x_syncincr = 0.;
}
else
{
x->x_phase += nxfer;
x->x_sync = sync;
- goto done;
+ goto alldone;
}
}
- while (nblock--) *out++ = sync;
-done:
+ while (nblock--) *out++ = -1; //sync;
+alldone:
return (w + sic->s_nperfargs + 1);
}
@@ -203,15 +229,11 @@ static void *record_new(t_symbol *s, t_floatarg f)
{
int nch = arsic_getnchannels((t_arsic *)x);
arsic_setminsize((t_arsic *)x, 2);
- x->x_startpoint = 0;
- x->x_endpoint = 0;
x->x_appendmode = 0;
x->x_loopmode = 0;
- x->x_pauseindex = SHARED_INT_MAX;
- x->x_phase = SHARED_INT_MAX;
- x->x_isrunning = 0;
- record_mstoindex(x);
+ record_reset(x);
x->x_clock = clock_new(x, (t_method)record_tick);
+ x->x_clocklasttick = clock_getlogicaltime();
while (--nch)
inlet_new((t_object *)x, (t_pd *)x, &s_signal, &s_signal);
inlet_new((t_object *)x, (t_pd *)x, &s_float, gensym("ft-2"));
@@ -239,4 +261,6 @@ void record_tilde_setup(void)
gensym("loop"), A_FLOAT, 0);
class_addmethod(record_class, (t_method)record_set,
gensym("set"), A_SYMBOL, 0);
+ class_addmethod(record_class, (t_method)record_reset,
+ gensym("reset"), 0);
}
diff --git a/cyclone/sickle/sickle.c b/cyclone/sickle/sickle.c
index 765209a..8df7974 100644
--- a/cyclone/sickle/sickle.c
+++ b/cyclone/sickle/sickle.c
@@ -27,21 +27,24 @@ static void sickle_readhook(t_pd *z, t_symbol *fn, int ac, t_atom *av)
import_max(fn->s_name, "");
}
-static void sickle_import(t_sickle *x, t_symbol *fn, t_symbol *dir)
+static void sickle_doimport(t_sickle *x, t_symbol *fn, t_symbol *dir)
{
+ if (!dir || dir == &s_) dir = x->x_dir;
if (fn && fn != &s_)
- {
- if (!dir || dir == &s_) dir = x->x_dir;
import_max(fn->s_name, (dir && dir != &s_) ? dir->s_name : "");
- }
else
- hammerpanel_open(x->x_filehandle);
+ hammerpanel_open(x->x_filehandle, dir);
}
static void sickle_click(t_sickle *x, t_floatarg xpos, t_floatarg ypos,
- t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
+ t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
+{
+ sickle_doimport(x, 0, 0);
+}
+
+static void sickle_import(t_sickle *x, t_symbol *fn)
{
- sickle_import(x, 0, 0);
+ sickle_doimport(x, fn, 0);
}
static void sickle_bang(t_sickle *x)
@@ -82,7 +85,7 @@ void sickle_setup(void)
sizeof(t_sickle), 0, A_DEFSYM, 0);
class_addbang(sickle_class, sickle_bang);
class_addmethod(sickle_class, (t_method)sickle_import,
- gensym("import"), A_DEFSYM, A_DEFSYM, 0);
+ gensym("import"), A_DEFSYM, 0);
class_addmethod(sickle_class, (t_method)sickle_click,
gensym("click"),
A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
diff --git a/shared/common/loud.c b/shared/common/loud.c
index 638f431..d5afada 100644
--- a/shared/common/loud.c
+++ b/shared/common/loud.c
@@ -25,6 +25,19 @@ char *loud_symbolname(t_symbol *s, char *nullname)
}
/* LATER move it somewhere else */
+int loud_matchignorecase(char *test, char *pattern)
+{
+ char ct, cp;
+ for (ct = *test, cp = *pattern; ct && cp; ct = *++test, cp = *++pattern)
+ if (ct != cp
+ && ((ct < 'A' || ct > 'z')
+ || ((ct > 'Z' || ct + 32 != cp)
+ && (ct < 'a' || ct - 32 != cp))))
+ return (0);
+ return (ct == cp);
+}
+
+/* LATER move it somewhere else */
char *loud_ordinal(int n)
{
static char buf[16]; /* assuming 10-digit INT_MAX */
diff --git a/shared/common/loud.h b/shared/common/loud.h
index 17c02bf..eebb2c0 100644
--- a/shared/common/loud.h
+++ b/shared/common/loud.h
@@ -12,6 +12,7 @@ enum { LOUD_ARGOK, LOUD_ARGUNDER, LOUD_ARGOVER, LOUD_ARGTYPE, LOUD_ARGMISSING };
t_symbol *loud_floatsym(void);
char *loud_symbolname(t_symbol *s, char *nullname);
+int loud_matchignorecase(char *test, char *pattern);
char *loud_ordinal(int n);
void loud_error(t_pd *x, char *fmt, ...);
void loud_errand(t_pd *x, char *fmt, ...);
diff --git a/shared/common/port.c b/shared/common/port.c
index fb22163..c737ab8 100644
--- a/shared/common/port.c
+++ b/shared/common/port.c
@@ -113,14 +113,26 @@ static void port_setxy(t_port *x, int ndx, t_atom *ap)
SETFLOAT(ap, f);
}
+/* LATER bash inatom to lowercase (CHECKME first) */
+static void import_addclassname(t_binbuf *bb, char *outname, t_atom *inatom)
+{
+ t_atom at;
+ if (outname)
+ {
+ inatom = &at;
+ SETSYMBOL(inatom, gensym(outname));
+ }
+ binbuf_add(bb, 1, inatom);
+}
+
static int import_obj(t_port *x, char *name)
{
int ndx = (x->x_inmess[1].a_w.w_symbol == gensym("user") ? 3 : 2);
- binbuf_addv(x->x_newbb, "ssffs;",
+ binbuf_addv(x->x_newbb, "ssff",
gensym("#X"), gensym("obj"),
- port_xarg(x, ndx), port_yarg(x, ndx + 1),
- (name ? gensym(name) :
- x->x_inmess[ndx == 2 ? 6 : 2].a_w.w_symbol));
+ port_xarg(x, ndx), port_yarg(x, ndx + 1));
+ import_addclassname(x->x_newbb, name, &x->x_inmess[ndx == 2 ? 6 : 2]);
+ binbuf_addsemi(x->x_newbb);
x->x_nobj++;
return (PORT_NEXT);
}
@@ -130,21 +142,18 @@ static int import_objarg(t_port *x, char *name)
int ndx = (x->x_inmess[1].a_w.w_symbol == gensym("user") ? 3 : 2);
if (x->x_inatoms > 6)
{
- t_atom *in = x->x_inmess + ndx + 4;
+ t_atom *in = x->x_inmess + 7;
t_atom *out = x->x_outmess;
SETSYMBOL(out, gensym("#X")); out++;
SETSYMBOL(out, gensym("obj")); out++;
- port_setxy(x, ndx, out); out++; out++;
- if (name)
- {
- SETSYMBOL(out, gensym(name)); out++;
- if (ndx == 2) in++;
- }
- else *out++ = (ndx == 2 ? *in++ : x->x_inmess[2]);
+ port_setxy(x, ndx, out);
+ binbuf_add(x->x_newbb, 4, x->x_outmess);
+ import_addclassname(x->x_newbb, name, &x->x_inmess[ndx == 2 ? 6 : 2]);
+ out = x->x_outmess;
for (ndx = 7; ndx < x->x_inatoms; ndx++)
*out++ = *in++;
SETSEMI(out);
- binbuf_add(x->x_newbb, x->x_inatoms - 1, x->x_outmess);
+ binbuf_add(x->x_newbb, x->x_inatoms - 6, x->x_outmess);
x->x_nobj++;
return (PORT_NEXT);
}
@@ -212,19 +221,17 @@ static int imaction_scope(t_port *x, char *name)
SETSYMBOL(out, gensym("obj")); out++;
port_setxy(x, 3, out);
xpix = (int)out++->a_w.w_float;
- ypix = (int)out++->a_w.w_float;
- if (name)
- {
- SETSYMBOL(out, gensym(name)); out++;
- }
- else *out++ = x->x_inmess[2];
+ ypix = (int)out->a_w.w_float;
+ binbuf_add(x->x_newbb, 4, x->x_outmess);
+ import_addclassname(x->x_newbb, name, &x->x_inmess[2]);
+ out = x->x_outmess;
port_setxy(x, 5, out);
out++->a_w.w_float -= xpix;
out++->a_w.w_float -= ypix;
for (i = 7; i < x->x_inatoms; i++)
*out++ = *in++;
SETSEMI(out);
- binbuf_add(x->x_newbb, x->x_inatoms + 1, x->x_outmess);
+ binbuf_add(x->x_newbb, x->x_inatoms - 4, x->x_outmess);
x->x_nobj++;
return (PORT_NEXT);
}
@@ -320,7 +327,6 @@ typedef int (*t_portaction)(t_port *, char *arg);
typedef struct _portslot
{
char *s_name;
- int s_index;
t_portaction s_action;
char *s_actionarg;
struct _portnode *s_subtree;
@@ -331,90 +337,102 @@ typedef struct _portnode /* a parser's symbol definition, sort of... */
{
t_portslot *n_table;
int n_nslots;
+ int n_index;
} t_portnode;
#define PORT_NSLOTS(slots) (sizeof(slots)/sizeof(*(slots)))
static t_portslot imslots__N[] =
{
- { "vpatcher", 1, imaction_vpatcher, 0, 0, 0 }
+ { "vpatcher", imaction_vpatcher, 0, 0, 0 }
};
-static t_portnode imnode__N = { imslots__N, PORT_NSLOTS(imslots__N) };
+static t_portnode imnode__N = { imslots__N, PORT_NSLOTS(imslots__N), 1 };
static t_portslot imslots_newobj[] =
{
- { "patcher", 6, imaction_patcher, 0, 0, 0 },
- { "p", 6, imaction_patcher, 0, 0, 0 },
+ { "patcher", imaction_patcher, 0, 0, 0 },
+ { "p", imaction_patcher, 0, 0, 0 },
/* state is embedded in #N vtable...; #T set...; */
- { "table", 6, import_obj, "Table", 0, 0 }
+ { "table", import_obj, "Table", 0, 0 }
};
static t_portnode imnode_newobj = { imslots_newobj,
- PORT_NSLOTS(imslots_newobj) };
+ PORT_NSLOTS(imslots_newobj), 6 };
/* LATER consider merging newobj and newex */
static t_portslot imslots_newex[] =
{
- { "append", 6, import_objarg, "Append", 0, 0 },
- { "biquad~", 6, import_objarg, "Biquad~", 0, 0 },
- { "change", 6, import_objarg, "Change", 0, 0 },
- { "clip", 6, import_objarg, "Clip", 0, 0 },
- { "clip~", 6, import_objarg, "Clip~", 0, 0 },
- { "key", 6, import_obj, "Key", 0, 0 },
- { "keyup", 6, import_obj, "Keyup", 0, 0 },
- { "line", 6, import_objarg, "Line", 0, 0 },
- { "line~", 6, import_objarg, "Line~", 0, 0 },
- { "poly", 6, import_objarg, "Poly", 0, 0 },
- { "snapshot~", 6, import_objarg, "Snapshot~", 0, 0 },
- { "trigger", 6, imaction_trigger, 0, 0, 0 },
- { "t", 6, imaction_trigger, 0, 0, 0 }
+ { "append", import_objarg, "Append", 0, 0 },
+ { "biquad~", import_objarg, "Biquad~", 0, 0 },
+ { "change", import_objarg, "Change", 0, 0 },
+ { "clip", import_objarg, "Clip", 0, 0 },
+ { "clip~", import_objarg, "Clip~", 0, 0 },
+ { "key", import_obj, "Key", 0, 0 },
+ { "keyup", import_obj, "Keyup", 0, 0 },
+ { "line", import_objarg, "Line", 0, 0 },
+ { "line~", import_objarg, "Line~", 0, 0 },
+ { "poly", import_objarg, "Poly", 0, 0 },
+ { "snapshot~", import_objarg, "Snapshot~", 0, 0 },
+ { "trigger", imaction_trigger, 0, 0, 0 },
+ { "t", imaction_trigger, 0, 0, 0 },
+
+ /* LATER rethink */
+ { "Borax", import_objarg, "Borax", 0, 0 },
+ { "Bucket", import_objarg, "Bucket", 0, 0 },
+ { "Decode", import_objarg, "Decode", 0, 0 },
+ { "Histo", import_objarg, "Histo", 0, 0 },
+ { "MouseState", import_objarg, "MouseState", 0, 0 },
+ { "Peak", import_objarg, "Peak", 0, 0 },
+ { "TogEdge", import_objarg, "TogEdge", 0, 0 },
+ { "Trough", import_objarg, "Trough", 0, 0 },
+ { "Uzi", import_objarg, "Uzi", 0, 0 }
};
static t_portnode imnode_newex = { imslots_newex,
- PORT_NSLOTS(imslots_newex) };
+ PORT_NSLOTS(imslots_newex), 6 };
static t_portslot imslots_user[] =
{
- { "GSwitch", 2, import_objarg, "Gswitch", 0, 0 },
- { "GSwitch2", 2, import_objarg, "Ggate", 0, 0 },
- { "number~", 2, import_obj, 0, 0, 0 },
- { "scope~", 2, imaction_scope, "Scope~", 0, 0 },
- { "uslider", 2, import_obj, "vsl", 0, 0 } /* LATER range and offset */
+ { "GSwitch", import_objarg, "Gswitch", 0, 0 },
+ { "GSwitch2", import_objarg, "Ggate", 0, 0 },
+ { "number~", import_obj, 0, 0, 0 },
+ { "scope~", imaction_scope, "Scope~", 0, 0 },
+ { "uslider", import_obj, "vsl", 0, 0 } /* LATER range and offset */
};
static t_portnode imnode_user = { imslots_user,
- PORT_NSLOTS(imslots_user) };
+ PORT_NSLOTS(imslots_user), 2 };
static t_portslot imslots__P[] =
{
- { "comment", 1, imaction_comment, 0, 0, 0 },
- { "message", 1, imaction_message, 0, 0, 0 },
- { "newobj", 1, import_objarg, 0, &imnode_newobj, 0 },
- { "newex", 1, import_objarg, 0, &imnode_newex, 0 },
- { "inlet", 1, imaction_inlet, 0, 0, 0 },
- { "inlet~", 1, imaction_inlet, 0, 0, 0 },
- { "outlet", 1, imaction_outlet, 0, 0, 0 },
- { "outlet~", 1, imaction_outlet, 0, 0, 0 },
- { "number", 1, imaction_number, 0, 0, 0 },
- { "flonum", 1, imaction_number, 0, 0, 0 },
- { "button", 1, import_obj, "bng", 0, 0 },
- { "slider" , 1, import_obj, "vsl", 0, 0 }, /* LATER range and offset */
- { "hslider", 1, import_obj, "hsl", 0, 0 }, /* LATER range and offset */
- { "toggle", 1, import_obj, "tgl", 0, 0 },
- { "user", 1, import_objarg, 0, &imnode_user, 0 },
+ { "comment", imaction_comment, 0, 0, 0 },
+ { "message", imaction_message, 0, 0, 0 },
+ { "newobj", import_objarg, 0, &imnode_newobj, 0 },
+ { "newex", import_objarg, 0, &imnode_newex, 0 },
+ { "inlet", imaction_inlet, 0, 0, 0 },
+ { "inlet~", imaction_inlet, 0, 0, 0 },
+ { "outlet", imaction_outlet, 0, 0, 0 },
+ { "outlet~", imaction_outlet, 0, 0, 0 },
+ { "number", imaction_number, 0, 0, 0 },
+ { "flonum", imaction_number, 0, 0, 0 },
+ { "button", import_obj, "bng", 0, 0 },
+ { "slider" , import_obj, "vsl", 0, 0 }, /* LATER range and offset */
+ { "hslider", import_obj, "hsl", 0, 0 }, /* LATER range and offset */
+ { "toggle", import_obj, "tgl", 0, 0 },
+ { "user", import_objarg, 0, &imnode_user, 0 },
/* state is embedded in #N vpreset <nslots>; #X append... */
- { "preset", 1, import_obj, "preset", 0, 0 },
+ { "preset", import_obj, "preset", 0, 0 },
/* an object created from the "Paste Picture" menu,
state is embedded in #N picture; #K...; */
- { "vpicture", 1, import_obj, "vpicture", 0, 0 },
- { "connect", 1, imaction_connect, 0, 0, 0 },
- { "fasten", 1, imaction_connect, 0, 0, 0 }
+ { "vpicture", import_obj, "vpicture", 0, 0 },
+ { "connect", imaction_connect, 0, 0, 0 },
+ { "fasten", imaction_connect, 0, 0, 0 }
};
-static t_portnode imnode__P = { imslots__P, PORT_NSLOTS(imslots__P) };
+static t_portnode imnode__P = { imslots__P, PORT_NSLOTS(imslots__P), 1 };
static t_portslot imslots_[] =
{
- { "#N", 0, 0, 0, &imnode__N, 0 },
- { "#P", 0, 0, 0, &imnode__P, 0 }
+ { "#N", 0, 0, &imnode__N, 0 },
+ { "#P", 0, 0, &imnode__P, 0 }
};
-static t_portnode imnode_ = { imslots_, PORT_NSLOTS(imslots_) };
+static t_portnode imnode_ = { imslots_, PORT_NSLOTS(imslots_), 0 };
static int port_doit(t_port *x, t_portnode *node)
{
@@ -422,10 +440,13 @@ static int port_doit(t_port *x, t_portnode *node)
if (nslots > 0)
{
t_portslot *slot = node->n_table;
- t_symbol *s = port_symbolarg(x, slot->s_index);
+ t_symbol *insym = port_symbolarg(x, node->n_index);
+ char *inname = 0;
+secondpass:
while (nslots--)
{
- if (slot->s_symbol == s)
+ if (slot->s_symbol == insym
+ || (inname && loud_matchignorecase(inname, slot->s_name)))
{
if (slot->s_subtree)
{
@@ -442,6 +463,13 @@ static int port_doit(t_port *x, t_portnode *node)
}
slot++;
}
+ if (!inname)
+ {
+ inname = insym->s_name;
+ nslots = node->n_nslots;
+ slot = node->n_table;
+ goto secondpass;
+ }
}
else bug("port_doit");
return (PORT_UNKNOWN);
diff --git a/shared/hammer/file.c b/shared/hammer/file.c
index 635c9bc..1cd6bfc 100644
--- a/shared/hammer/file.c
+++ b/shared/hammer/file.c
@@ -14,7 +14,9 @@
access to the panels (like collcommon), then it passes nonzero readfn
and/or writefn callback pointers to the constructor. A master which has
an associated text editor, AND wants to update object's state after
- edits, passes a nonzero updatefn callback in a call to the constructor. */
+ edits, passes a nonzero updatefn callback in a call to the constructor.
+
+ LATER extract the embedding stuff. */
#include <stdio.h>
#include <string.h>
@@ -173,6 +175,23 @@ static void hammereditor_end(t_hammerfile *f)
static void hammerpanel_guidefs(void)
{
+ sys_gui("proc hammerpanel_open {target inidir} {\n");
+ sys_gui(" global pd_opendir\n");
+ sys_gui(" if {$inidir == \"\"} {\n");
+ sys_gui(" set $inidir $pd_opendir\n");
+ sys_gui(" }\n");
+ sys_gui(" set filename [tk_getOpenFile \\\n");
+ sys_gui(" -initialdir $inidir]\n");
+ sys_gui(" if {$filename != \"\"} {\n");
+#if 0
+ sys_gui(" set directory [string range $filename 0 \\\n");
+ sys_gui(" [expr [string last / $filename ] - 1]]\n");
+ sys_gui(" set pd_opendir $directory\n");
+#endif
+ sys_gui(" pd [concat $target symbol [pdtk_enquote $filename] \\;]\n");
+ sys_gui(" }\n");
+ sys_gui("}\n");
+
sys_gui("proc hammerpanel_save {target inidir inifile} {\n");
sys_gui(" if {$inifile != \"\"} {\n");
sys_gui(" set filename [tk_getSaveFile \\\n");
@@ -195,7 +214,8 @@ static void hammerpanel_symbol(t_hammerfile *f, t_symbol *s)
static void hammerpanel_tick(t_hammerfile *f)
{
if (f->f_savepanel)
- sys_vgui("pdtk_openpanel %s\n", f->f_bindname->s_name);
+ sys_vgui("hammerpanel_open %s {%s}\n", f->f_bindname->s_name,
+ f->f_inidir->s_name);
else
sys_vgui("hammerpanel_save %s {%s} {%s}\n", f->f_bindname->s_name,
f->f_inidir->s_name, f->f_inifile->s_name);
@@ -203,8 +223,9 @@ static void hammerpanel_tick(t_hammerfile *f)
/* these are hacks: deferring modal dialog creation in order to allow for
a message box redraw to happen -- LATER investigate */
-void hammerpanel_open(t_hammerfile *f)
+void hammerpanel_open(t_hammerfile *f, t_symbol *inidir)
{
+ f->f_inidir = (inidir ? inidir : &s_);
clock_delay(f->f_panelclock, 0);
}
diff --git a/shared/hammer/file.h b/shared/hammer/file.h
index d0f6526..fb87ed1 100644
--- a/shared/hammer/file.h
+++ b/shared/hammer/file.h
@@ -29,7 +29,7 @@ typedef struct _hammerfile
void hammereditor_open(t_hammerfile *f, char *title);
void hammereditor_close(t_hammerfile *f, int ask);
void hammereditor_append(t_hammerfile *f, char *contents);
-void hammerpanel_open(t_hammerfile *f);
+void hammerpanel_open(t_hammerfile *f, t_symbol *inidir);
void hammerpanel_save(t_hammerfile *f, t_symbol *inidir, t_symbol *inifile);
int hammerfile_ismapped(t_hammerfile *f);
int hammerfile_isloading(t_hammerfile *f);
diff --git a/test/cyclone/buffir-test.pd b/test/cyclone/buffir-test.pd
new file mode 100644
index 0000000..7fd65e1
--- /dev/null
+++ b/test/cyclone/buffir-test.pd
@@ -0,0 +1,66 @@
+#N canvas 163 60 571 448 12;
+#N canvas 0 0 450 300 graph1 0;
+#X array t 1027 float 0;
+#X coords 0 1 1026 -1 200 140 1;
+#X restore 351 15 graph;
+#X obj 24 47 click~;
+#X obj 118 170 record~ tout;
+#N canvas 0 0 450 300 graph1 0;
+#X array tout 1024 float 0;
+#X coords 0 1 1023 -1 200 140 1;
+#X restore 351 166 graph;
+#X msg 118 15 bang;
+#X msg 118 136 1;
+#X obj 23 107 buffir~ t 0 128;
+#X msg 153 47 set t 0 256;
+#X msg 153 77 set t 0 1024;
+#X obj 376 362 loadbang;
+#X obj 116 407 record~ tout;
+#X msg 116 216 bang;
+#X msg 116 373 1;
+#X obj 21 339 buffir~ t 0 128;
+#X msg 191 248 set t 0 256;
+#X msg 177 281 set t 0 1024;
+#X msg 177 216 bang;
+#X obj 21 297 *~ 0.05;
+#X msg 30 248 0.05;
+#X msg 275 327 \; t const 0;
+#X msg 199 310 bang;
+#X floatatom 267 107 5 0 0 0 - - -;
+#X floatatom 267 170 5 0 0 0 - - -;
+#X msg 376 392 \; t sinesum 1024 0.4;
+#X obj 267 134 peek~ t;
+#X obj 199 340 t b b;
+#X obj 257 407 peek~ t;
+#X msg 125 248 0;
+#X msg 79 248 1;
+#X obj 21 216 osc~ 44;
+#X msg 199 370 127 1;
+#X connect 1 0 6 0;
+#X connect 4 0 1 0;
+#X connect 4 0 5 0;
+#X connect 5 0 2 0;
+#X connect 6 0 2 0;
+#X connect 7 0 6 0;
+#X connect 8 0 6 0;
+#X connect 9 0 23 0;
+#X connect 11 0 12 0;
+#X connect 12 0 10 0;
+#X connect 13 0 10 0;
+#X connect 14 0 13 0;
+#X connect 15 0 13 0;
+#X connect 16 0 15 0;
+#X connect 16 0 12 0;
+#X connect 16 0 27 0;
+#X connect 17 0 13 0;
+#X connect 18 0 17 1;
+#X connect 20 0 25 0;
+#X connect 20 0 28 0;
+#X connect 21 0 24 0;
+#X connect 24 0 22 0;
+#X connect 25 0 30 0;
+#X connect 25 1 19 0;
+#X connect 27 0 17 1;
+#X connect 28 0 17 1;
+#X connect 29 0 17 0;
+#X connect 30 0 26 0;
diff --git a/test/cyclone/cyclone-test.pd b/test/cyclone/cyclone-test.pd
index d2919c0..c563718 100644
--- a/test/cyclone/cyclone-test.pd
+++ b/test/cyclone/cyclone-test.pd
@@ -1,54 +1,31 @@
-#N canvas 430 63 531 442 12;
+#N canvas 150 47 531 442 12;
#X obj 39 399 cyclone;
#X msg 39 19 bang;
#X msg 244 19 import;
-#X obj 42 212 forward texthelp;
+#X obj 42 210 forward texthelp;
#X obj 63 278 r texthelp;
#X msg 56 245 send binhelp;
#X msg 182 245 send texthelp;
#X obj 90 309 r binhelp;
-#X msg 148 112 pv;
-#X msg 64 112 coll;
-#X msg 207 83 triangle~;
-#X msg 148 83 comb~;
-#X msg 64 83 allpass~;
-#X msg 207 112 message;
-#X msg 207 141 line~;
#X obj 90 338 sprintf import ../../../ref/c74help/bin/%s.help;
#X obj 63 369 sprintf import ../../../ref/c74help/text/%s.help;
#X msg 92 19 dummies;
-#X obj 39 48 cyclone;
-#X msg 274 141 groove~;
-#X msg 207 170 scope~;
-#X msg 306 83 trapezoid~;
-#X msg 306 112 kink~;
-#X msg 290 170 rate~;
-#X msg 360 170 pong~;
-#X msg 360 141 vectral~;
#X msg 170 19 reps;
-#X msg 378 112 bitand~;
-#X connect 1 0 18 0;
-#X connect 2 0 18 0;
-#X connect 4 0 16 0;
+#X msg 125 181 buffir~;
+#X obj 244 56 cyclone;
+#X msg 42 181 record~;
+#X obj 39 94 cyclone ../../../ref;
+#X msg 211 181 fffb~;
+#X connect 1 0 15 0;
+#X connect 2 0 13 0;
+#X connect 4 0 9 0;
#X connect 5 0 3 0;
#X connect 6 0 3 0;
-#X connect 7 0 15 0;
-#X connect 8 0 3 0;
-#X connect 9 0 3 0;
-#X connect 10 0 3 0;
-#X connect 11 0 3 0;
+#X connect 7 0 8 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 15 0;
+#X connect 11 0 15 0;
#X connect 12 0 3 0;
-#X connect 13 0 3 0;
#X connect 14 0 3 0;
-#X connect 15 0 0 0;
-#X connect 16 0 0 0;
-#X connect 17 0 18 0;
-#X connect 19 0 3 0;
-#X connect 20 0 3 0;
-#X connect 21 0 3 0;
-#X connect 22 0 3 0;
-#X connect 23 0 3 0;
-#X connect 24 0 3 0;
-#X connect 25 0 3 0;
-#X connect 26 0 18 0;
-#X connect 27 0 3 0;
+#X connect 16 0 3 0;