aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavide Morelli <morellid@users.sourceforge.net>2005-12-08 16:31:11 +0000
committerDavide Morelli <morellid@users.sourceforge.net>2005-12-08 16:31:11 +0000
commitac33aae33bcd8e334755dfa6a725ffbb51a84931 (patch)
treee98f57ef0c71970871c6335bfddf34048d8315f4
parentfe91359682b9d76eb3c2a4bb8fb7b4d2f00bfcb9 (diff)
fixing things
svn path=/trunk/externals/frankenstein/; revision=4171
-rwxr-xr-xGArhythm.c133
-rwxr-xr-xchords_memory.c2
-rwxr-xr-xharmonizer.c42
-rwxr-xr-xpatches/test-harmonizer2.pd274
-rwxr-xr-xrhythms_memory.c2
5 files changed, 373 insertions, 80 deletions
diff --git a/GArhythm.c b/GArhythm.c
index a41b311..b000ed5 100755
--- a/GArhythm.c
+++ b/GArhythm.c
@@ -41,7 +41,8 @@ typedef struct _GArhythm
float prob_crossover;
float prob_mutation;
char last[BUFFER_LENGHT];
-
+ int reinsert_src;
+ int reinsert_last;
} t_GArhythm;
void GArhythm_init_pop(t_GArhythm *x)
@@ -72,6 +73,73 @@ void GArhythm_init_pop(t_GArhythm *x)
x->population[i][3]
);
}
+
+}
+
+void GArhythm_reinit_pop(t_GArhythm *x)
+{
+ int i, j, vecsize, ntot, tmp, me;
+ float prob, variatore;
+ t_garray *arysrc_strum1;
+ t_garray *arysrc_strum2;
+ t_garray *arysrc_strum3;
+ t_garray *arysrc_strum4;
+ t_float *vecsrc_strum1;
+ t_float *vecsrc_strum2;
+ t_float *vecsrc_strum3;
+ t_float *vecsrc_strum4;
+
+ // load tables
+
+ if (!(arysrc_strum1 = (t_garray *)pd_findbyclass(x->x_arrayname_src_strum1, garray_class)))
+ {
+ pd_error(x, "%s: no such array", x->x_arrayname_src_strum1->s_name);
+ }
+ else if (!garray_getfloatarray(arysrc_strum1, &vecsize, &vecsrc_strum1))
+ {
+ pd_error(x, "%s: bad template for tabwrite", x->x_arrayname_src_strum1->s_name);
+ }
+ else if (!(arysrc_strum2 = (t_garray *)pd_findbyclass(x->x_arrayname_src_strum2, garray_class)))
+ {
+ pd_error(x, "%s: no such array", x->x_arrayname_src_strum2->s_name);
+ }
+ else if (!garray_getfloatarray(arysrc_strum2, &vecsize, &vecsrc_strum2))
+ {
+ pd_error(x, "%s: bad template for tabwrite", x->x_arrayname_src_strum2->s_name);
+ }
+ else if (!(arysrc_strum3 = (t_garray *)pd_findbyclass(x->x_arrayname_src_strum3, garray_class)))
+ {
+ pd_error(x, "%s: no such array", x->x_arrayname_src_strum3->s_name);
+ }
+ else if (!garray_getfloatarray(arysrc_strum3, &vecsize, &vecsrc_strum3))
+ {
+ pd_error(x, "%s: bad template for tabwrite", x->x_arrayname_src_strum3->s_name);
+ }
+ else if (!(arysrc_strum4 = (t_garray *)pd_findbyclass(x->x_arrayname_src_strum4, garray_class)))
+ {
+ pd_error(x, "%s: no such array", x->x_arrayname_src_strum4->s_name);
+ }
+ else if (!garray_getfloatarray(arysrc_strum4, &vecsize, &vecsrc_strum4))
+ {
+ pd_error(x, "%s: bad template for tabwrite", x->x_arrayname_src_strum4->s_name);
+ }
+
+ for (i=0; i<MAX_POPULATION; i++)
+ {
+ for (j=0; j<BUFFER_LENGHT; j++)
+ {
+ char c = 0x00;
+ if (vecsrc_strum1[j])
+ c = c | 0x01;
+ if (vecsrc_strum2[j])
+ c = c | (0x01 << 1);
+ if (vecsrc_strum3[j])
+ c = c | (0x01 << 2);
+ if (vecsrc_strum4[j])
+ c = c | (0x01 << 3);
+ x->population[i][j]=c;
+ }
+ }
}
void GArhythm_init_buf(t_float *buf)
@@ -316,7 +384,7 @@ static void GArhythm_bang(t_GArhythm *x) {
post("--------- starting process");
// uccido a caso REINSERT_SRC elementi e inserisco il ritmo src al loro posto
- for (i=0; i<REINSERT_SRC; i++)
+ for (i=0; i<x->reinsert_src; i++)
{
rnd = rand()/((double)RAND_MAX + 1);
me = (int) (rnd * MAX_POPULATION);
@@ -335,7 +403,7 @@ static void GArhythm_bang(t_GArhythm *x) {
}
}
// uccido a caso REINSERT_LAST elementi e inserisco il last al loro posto
- for (i=0; i<REINSERT_LAST; i++)
+ for (i=0; i<x->reinsert_last; i++)
{
rnd = rand()/((double)RAND_MAX + 1);
me = (int) (rnd * MAX_POPULATION);
@@ -478,6 +546,57 @@ static void GArhythm_mutation_set(t_GArhythm *x, t_floatarg f)
x->prob_mutation = f;
}
+static void GArhythm_reinsert_src_set(t_GArhythm *x, t_floatarg f)
+{
+ if (f>=0)
+ x->reinsert_src = (int) f;
+}
+
+static void GArhythm_reinsert_last_set(t_GArhythm *x, t_floatarg f)
+{
+ if (f>=0)
+ x->reinsert_last = (int) f;
+}
+
+static void GArhythm_prob_crossover_set(t_GArhythm *x, t_floatarg f)
+{
+ if (f<=1 && f>=0)
+ x->prob_crossover = f;
+}
+
+static void GArhythm_prob_mutation_set(t_GArhythm *x, t_floatarg f)
+{
+ if (f<=1 && f>=0)
+ x->prob_mutation = f;
+}
+
+static void GArhythm_help(t_GArhythm *x)
+{
+ post("");
+ post("");
+ post("GArhythm");
+ post("");
+ post("a rhythm generator/variatior that uses co-evolving Genetic Algorithms");
+ post("at the moment it only works with 16 step measure, 1 measure rhythms, it needs 4 arrays as input rhythms and outputs its rhythms on 4 arrays");
+ post("");
+
+ post("global usage hints");
+ post("you must provide 8 arguments: the first 4 are the names of arrays with src rhythms, the second 4 are names of arrays where GArhythm will put its output");
+ post("send a bang each time you want a new population (and a new rhythm) to be evaluated");
+ post("");
+ post("available commands");
+ post("reinit: initialize the population with the content of the src arrays");
+ post("variazione float: sets the index of wanted variation between the last proposed rhythm and the next one (from 0 to 1)");
+ post("aderenza float: sets the index of wanted closeness between the current src rhythm and proposed one (from 0 to 1)");
+ post("riempimento float: set 0 if you want sparse rhythms, 1 if you want a rhythm full of events");
+ post("reinsert_src int: how many times the src rhythms will be randomly copied in the population before breeding");
+ post("reinsert_last int: how many times the last rhythms will be randomly copied in the population before breeding");
+ post("prob_crossover float: sets the crossover probability. default is %f", DEF_PROB_CROSSOVER);
+ post("prob_mutation float: sets the mutation probability, default is %f", DEF_PROB_MUTATION);
+
+}
+
+
static void *GArhythm_new(t_symbol *s, int argc, t_atom *argv)
{
t_GArhythm *x = (t_GArhythm *)pd_new(GArhythm_class);
@@ -489,6 +608,8 @@ static void *GArhythm_new(t_symbol *s, int argc, t_atom *argv)
x->indice_aderenza=0;
x->prob_crossover = DEF_PROB_CROSSOVER;
x->prob_mutation = DEF_PROB_MUTATION;
+ x->reinsert_src=REINSERT_SRC;
+ x->reinsert_last=REINSERT_LAST;
if (argc>0)
@@ -536,4 +657,10 @@ void GArhythm_setup(void)
class_addmethod(GArhythm_class, (t_method)GArhythm_variazione_set, gensym("variazione"), A_DEFFLOAT, 0);
class_addmethod(GArhythm_class, (t_method)GArhythm_riempimento_set, gensym("riempimento"), A_DEFFLOAT, 0);
class_addmethod(GArhythm_class, (t_method)GArhythm_aderenza_set, gensym("aderenza"), A_DEFFLOAT, 0);
+ class_addmethod(GArhythm_class, (t_method)GArhythm_reinit_pop, gensym("reinit"), 0, 0);
+ class_addmethod(GArhythm_class, (t_method)GArhythm_reinsert_src_set, gensym("reinsert_src"), A_DEFFLOAT, 0);
+ class_addmethod(GArhythm_class, (t_method)GArhythm_reinsert_last_set, gensym("reinsert_last"), A_DEFFLOAT, 0);
+ class_addmethod(GArhythm_class, (t_method)GArhythm_prob_crossover_set, gensym("prob_crossover"), A_DEFFLOAT, 0);
+ class_addmethod(GArhythm_class, (t_method)GArhythm_prob_mutation_set, gensym("prob_mutation"), A_DEFFLOAT, 0);
+ class_addmethod(GArhythm_class, (t_method)GArhythm_help, gensym("help"), 0, 0);
}
diff --git a/chords_memory.c b/chords_memory.c
index 2f7db17..866142e 100755
--- a/chords_memory.c
+++ b/chords_memory.c
@@ -99,7 +99,7 @@ there are plenty of such algos, we must just copy them down.
#include "m_pd.h"
-#define DEBUG 1 // messaggi di debug
+#define DEBUG 0 // messaggi di debug
#define DEBUG_VERBOSE 0 // messaggi di debug
// is this system Little Endian? (thanks to Mathieu Bouchard)
diff --git a/harmonizer.c b/harmonizer.c
index 7277723..a270df9 100755
--- a/harmonizer.c
+++ b/harmonizer.c
@@ -263,7 +263,7 @@ void harmonizer_init_pop(t_harmonizer *x)
{
// i go up
rnd = rand()/((double)RAND_MAX + 1);
- steps = rnd * 5; // how many step (good notes) will I ignore?
+ steps = rnd * 5; // how many steps (good notes) will I ignore?
note = insertpoint + steps;
if (note >= POSSIBLE_NOTES)
note = POSSIBLE_NOTES-1;
@@ -272,7 +272,7 @@ void harmonizer_init_pop(t_harmonizer *x)
{
// i go down
rnd = rand()/((double)RAND_MAX + 1);
- steps = rnd * 5; // how many step (good notes) will I ignore?
+ steps = rnd * 5; // how many steps (good notes) will I ignore?
note = insertpoint - steps;
if (note < 0)
note = 0;
@@ -295,6 +295,8 @@ void harmonizer_free(t_harmonizer *x)
int fitness(t_harmonizer *x, int *candidate)
{
int i, j, tmp, res, last, avgHI, avgLOW;
+ short int chord_notes[4];
+ short int chord_notes_ok[4];
short int transitions[VOICES];
short int directions[VOICES];
// intervals between voices
@@ -434,6 +436,41 @@ int fitness(t_harmonizer *x, int *candidate)
// TODO: too many near limits?
// TODO: is a complete chord?
+ // does this voicing have all 5 notes?
+ // first build a table for comparision
+ for (i=0; i<4; i++)
+ {
+ chord_notes[i] = (x->target_notes[i]) % 12;
+ chord_notes_ok[i] = 0;
+ }
+ for (i=0; i<VOICES; i++)
+ {
+ tmp = notes[i] % 12;
+ for (j=0; j<4; j++)
+ {
+ if (chord_notes[j] == tmp)
+ chord_notes_ok[j]++;
+ }
+ }
+ // now in chord_notes_ok i have the number of times each note is present
+ if (chord_notes_ok[0] == 0)
+ {
+ // no fundamental! this is bad!!
+ res -= 5;
+ }
+ if ((chord_notes_ok[0] != 0) &&
+ (chord_notes_ok[2] != 0) &&
+ (chord_notes_ok[3] != 0) &&
+ (chord_notes_ok[4] != 0))
+ {
+ // complete chord! this is good
+ res += 5;
+ }
+ for (j=0; j<4; j++)
+ {
+ res -= 2^chord_notes_ok[j];
+ }
+ res += 2*VOICES;
// penalize too many basses
tmp = 0;
@@ -451,6 +488,7 @@ int fitness(t_harmonizer *x, int *candidate)
case 4: res -= 30; break;
}
+
if (DEBUG_VERBOSE)
post("fitness is %i", res);
diff --git a/patches/test-harmonizer2.pd b/patches/test-harmonizer2.pd
index ed41e1e..ced7281 100755
--- a/patches/test-harmonizer2.pd
+++ b/patches/test-harmonizer2.pd
@@ -1,5 +1,5 @@
-#N canvas 74 28 903 675 12;
-#X symbolatom 157 205 18 0 0 2 next_chord - -;
+#N canvas 14 34 915 687 12;
+#X symbolatom 731 341 18 0 0 2 next_chord - -;
#N canvas 39 349 531 328 readme 0;
#X text 59 31 howto populate the graph: play the chord \, when the
output of [chord] is ok bang the "add" message. bang it each time you
@@ -13,10 +13,10 @@ max novelty \, 1= min novelty;
#X text 56 259 you can save graph state sending the write message;
#X restore 607 47 pd readme;
#X obj 121 329 harmonizer;
-#X msg 52 286 current \$1;
+#X msg 44 298 current \$1;
#X msg 158 283 target \$1;
-#X obj 52 262 symbol;
-#X obj 52 242 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+#X obj 44 274 symbol;
+#X obj 44 254 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X obj 157 261 symbol;
#X obj 289 261 int 36;
@@ -26,12 +26,12 @@ max novelty \, 1= min novelty;
#X obj 566 262 int 84;
#X obj 335 289 pack f f f f f;
#X obj 358 233 t b b b b b;
-#X obj 246 369 unpack f f f f f;
+#X obj 245 347 unpack f f f f f;
#X obj 153 97 symbol;
#X obj 98 43 bng 15 250 50 0 empty empty change_chord 0 -6 0 8 -262144
-1 -1;
#X msg 153 121 set \$1;
-#N canvas 0 0 706 416 midi 0;
+#N canvas 0 0 718 428 midi 0;
#X obj 141 253 outlet;
#X obj 271 31 notein;
#X obj 271 66 chord 59;
@@ -56,36 +56,30 @@ max novelty \, 1= min novelty;
#X connect 7 0 6 0;
#X connect 8 0 0 0;
#X restore 423 135 pd midi;
-#N canvas 0 0 454 304 fileIO 0;
+#N canvas 0 0 466 316 fileIO 0;
#X obj 143 225 outlet;
-#X msg 115 77 write test.graph;
-#X msg 145 105 read test.graph;
#X msg 175 135 init 1;
+#X msg 115 77 write strani;
+#X msg 145 105 read strani;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
#X connect 3 0 0 0;
#X restore 340 134 pd fileIO;
#X obj 100 73 t b b;
#X obj 157 228 t b a;
-#X obj 28 404 bang;
-#X obj 203 420 mtof;
-#X obj 252 419 mtof;
-#X obj 337 423 mtof;
-#X obj 180 601 dac~;
-#X obj 109 431 print;
+#X obj 49 348 bang;
+#X obj 190 607 dac~;
#X obj 74 111 f 1;
#X msg 59 135 next \$1;
#X obj 63 70 vsl 15 30 0 1 0 0 empty empty empty 0 -8 0 8 -262144 -1
-1 2900 1;
#X floatatom 32 112 5 0 0 0 - - -;
#X obj 178 571 csoundapi~ bay.orc;
-#X msg 488 520 event i 10 0 17000 10 30;
-#X msg 488 543 event i 30 0 17000 2 30;
-#X msg 489 496 event i 25 0 17000 0.98 0.8 20000;
-#X obj 482 458 loadbang;
-#X msg 196 492 event i 9 0 10 \$1 80 0.5;
-#X obj 295 422 mtof;
-#X obj 381 424 mtof;
+#X msg 463 545 event i 10 0 17000 10 30;
+#X msg 463 568 event i 30 0 17000 2 30;
+#X msg 464 521 event i 25 0 17000 0.98 0.8 20000;
+#X obj 466 497 loadbang;
+#X msg 171 522 event i 9 0 10 \$1 80 0.5;
#X obj 462 22 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
;
#X obj 462 41 metro 7000;
@@ -97,7 +91,7 @@ max novelty \, 1= min novelty;
#X obj 685 119 table tab-novelty;
#X obj 600 147 % 10;
#X obj 462 63 t b b;
-#X msg 467 377 \; tab-novelty 0 1 1 0.8 0.7 0.3 0.5 0.9 0.1 0 0.2;
+#X msg 463 457 \; tab-novelty 0 1 1 0.8 0.7 0.3 0.5 0.9 0.1 0 0.2;
#X obj 220 96 symbol;
#X msg 220 124 tonality \$1;
#X obj 220 72 bng 15 250 50 0 empty empty change 0 -6 0 8 -262144 -1
@@ -105,9 +99,128 @@ max novelty \, 1= min novelty;
#X obj 19 160 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X symbolatom 305 204 15 0 0 2 tonality - -;
-#X obj 83 169 chords_memory test.graph;
+#X text 529 392 this transposes of a + minor 3rd;
+#X obj 458 348 loadbang;
+#X msg 457 395 3;
+#X symbolatom 575 339 18 0 0 2 curr_chord - -;
+#X obj 42 218 symbol;
+#X obj 42 194 t s b;
+#X obj 64 604 outlet~;
+#X obj 124 605 outlet~;
+#X obj 578 358 outlet;
+#X obj 733 360 outlet;
+#N canvas 0 0 812 538 prepare_voice 0;
+#X obj 48 57 inlet;
+#X obj 392 55 inlet;
+#X obj 46 422 outlet;
+#X obj 52 95 + 0;
+#X obj 49 184 mtof;
+#X obj 52 129 t f b;
+#X obj 50 154 int 60;
+#X text 399 138 this adds a 1 chord delay;
+#X obj 115 55 inlet;
+#X obj 113 420 outlet;
+#X obj 119 93 + 0;
+#X obj 116 179 mtof;
+#X obj 119 127 t f b;
+#X obj 117 152 int 60;
+#X obj 176 52 inlet;
+#X obj 174 417 outlet;
+#X obj 180 90 + 0;
+#X obj 177 179 mtof;
+#X obj 180 124 t f b;
+#X obj 178 149 int 60;
+#X obj 242 54 inlet;
+#X obj 240 419 outlet;
+#X obj 246 92 + 0;
+#X obj 243 181 mtof;
+#X obj 246 126 t f b;
+#X obj 244 151 int 60;
+#X obj 307 54 inlet;
+#X obj 305 419 outlet;
+#X obj 311 92 + 0;
+#X obj 308 181 mtof;
+#X obj 311 126 t f b;
+#X obj 309 151 int 60;
+#X text 383 38 semitones;
+#X obj 47 313 spigot;
+#X obj 505 268 loadbang;
+#X msg 506 291 1;
+#X obj 63 290 r v1;
+#X obj 119 313 spigot;
+#X obj 180 314 spigot;
+#X obj 247 313 spigot;
+#X obj 312 313 spigot;
+#X obj 135 290 r v2;
+#X obj 196 291 r v3;
+#X obj 263 291 r v4;
+#X obj 328 290 r v5;
+#X connect 0 0 3 0;
+#X connect 1 0 3 1;
+#X connect 1 0 28 1;
+#X connect 1 0 22 1;
+#X connect 1 0 10 1;
+#X connect 1 0 16 1;
+#X connect 3 0 5 0;
+#X connect 4 0 33 0;
+#X connect 5 0 6 1;
+#X connect 5 1 6 0;
+#X connect 6 0 4 0;
+#X connect 8 0 10 0;
+#X connect 10 0 12 0;
+#X connect 11 0 37 0;
+#X connect 12 0 13 1;
+#X connect 12 1 13 0;
+#X connect 13 0 11 0;
+#X connect 14 0 16 0;
+#X connect 16 0 18 0;
+#X connect 17 0 38 0;
+#X connect 18 0 19 1;
+#X connect 18 1 19 0;
+#X connect 19 0 17 0;
+#X connect 20 0 22 0;
+#X connect 22 0 24 0;
+#X connect 23 0 39 0;
+#X connect 24 0 25 1;
+#X connect 24 1 25 0;
+#X connect 25 0 23 0;
+#X connect 26 0 28 0;
+#X connect 28 0 30 0;
+#X connect 29 0 40 0;
+#X connect 30 0 31 1;
+#X connect 30 1 31 0;
+#X connect 31 0 29 0;
+#X connect 33 0 2 0;
+#X connect 34 0 35 0;
+#X connect 35 0 33 1;
+#X connect 35 0 37 1;
+#X connect 35 0 38 1;
+#X connect 35 0 39 1;
+#X connect 35 0 40 1;
+#X connect 36 0 33 1;
+#X connect 37 0 9 0;
+#X connect 38 0 15 0;
+#X connect 39 0 21 0;
+#X connect 40 0 27 0;
+#X connect 41 0 37 1;
+#X connect 42 0 38 1;
+#X connect 43 0 39 1;
+#X connect 44 0 40 1;
+#X restore 237 387 pd prepare_voice;
+#X obj 45 415 tgl 20 0 v1 empty toggle_v1 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 44 446 tgl 20 0 v2 empty toggle_v2 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 43 476 tgl 20 0 v3 empty toggle_v3 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 43 507 tgl 20 0 v4 empty toggle_v4 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 40 537 tgl 20 0 v5 empty toggle_v5 0 -6 0 8 -262144 -1 -1 1
+1;
+#X obj 7 376 loadbang;
+#X msg 8 399 1;
+#X obj 83 169 chords_memory strani;
#X connect 2 0 15 0;
-#X connect 2 0 28 0;
#X connect 3 0 2 0;
#X connect 4 0 2 0;
#X connect 5 0 3 0;
@@ -126,60 +239,75 @@ max novelty \, 1= min novelty;
#X connect 14 4 12 0;
#X connect 15 0 8 1;
#X connect 15 0 23 0;
-#X connect 15 0 24 0;
+#X connect 15 0 61 0;
#X connect 15 1 9 1;
-#X connect 15 1 25 0;
+#X connect 15 1 61 1;
#X connect 15 2 10 1;
-#X connect 15 2 39 0;
+#X connect 15 2 61 2;
#X connect 15 3 11 1;
-#X connect 15 3 26 0;
+#X connect 15 3 61 3;
#X connect 15 4 12 1;
-#X connect 15 4 40 0;
+#X connect 15 4 61 4;
#X connect 16 0 18 0;
#X connect 17 0 21 0;
-#X connect 18 0 57 0;
-#X connect 19 0 57 0;
-#X connect 20 0 57 0;
-#X connect 21 0 29 0;
+#X connect 18 0 69 0;
+#X connect 19 0 69 0;
+#X connect 20 0 69 0;
+#X connect 21 0 25 0;
#X connect 22 0 14 0;
#X connect 22 1 7 0;
#X connect 23 0 5 0;
-#X connect 24 0 38 0;
-#X connect 25 0 38 0;
-#X connect 26 0 38 0;
-#X connect 29 0 30 0;
-#X connect 30 0 57 0;
-#X connect 31 0 29 1;
-#X connect 31 0 32 0;
-#X connect 33 0 27 0;
-#X connect 33 1 27 1;
-#X connect 34 0 33 0;
-#X connect 35 0 33 0;
-#X connect 36 0 33 0;
-#X connect 37 0 36 0;
-#X connect 37 0 34 0;
-#X connect 37 0 35 0;
-#X connect 37 0 51 0;
-#X connect 38 0 33 0;
-#X connect 39 0 38 0;
-#X connect 40 0 38 0;
-#X connect 41 0 42 0;
-#X connect 42 0 50 0;
-#X connect 43 0 31 0;
-#X connect 44 0 45 0;
-#X connect 44 0 49 0;
-#X connect 45 0 44 1;
+#X connect 25 0 26 0;
+#X connect 26 0 69 0;
+#X connect 27 0 25 1;
+#X connect 27 0 28 0;
+#X connect 29 0 24 0;
+#X connect 29 0 57 0;
+#X connect 29 1 24 1;
+#X connect 29 1 58 0;
+#X connect 30 0 29 0;
+#X connect 31 0 29 0;
+#X connect 32 0 29 0;
+#X connect 33 0 32 0;
+#X connect 33 0 30 0;
+#X connect 33 0 31 0;
+#X connect 33 0 45 0;
+#X connect 34 0 29 0;
+#X connect 35 0 36 0;
+#X connect 36 0 44 0;
+#X connect 37 0 27 0;
+#X connect 38 0 39 0;
+#X connect 38 0 43 0;
+#X connect 39 0 38 1;
+#X connect 40 0 41 0;
+#X connect 43 0 40 0;
+#X connect 44 0 21 0;
+#X connect 44 1 38 0;
#X connect 46 0 47 0;
-#X connect 49 0 46 0;
-#X connect 50 0 21 0;
-#X connect 50 1 44 0;
-#X connect 52 0 53 0;
-#X connect 53 0 57 0;
-#X connect 54 0 52 0;
-#X connect 55 0 57 0;
-#X connect 57 0 0 0;
-#X connect 57 0 5 1;
-#X connect 57 0 22 0;
-#X connect 57 0 52 1;
-#X connect 57 0 16 0;
-#X connect 57 1 56 0;
+#X connect 47 0 69 0;
+#X connect 48 0 46 0;
+#X connect 49 0 69 0;
+#X connect 53 0 61 5;
+#X connect 55 0 54 0;
+#X connect 55 0 59 0;
+#X connect 56 0 55 1;
+#X connect 56 1 55 0;
+#X connect 61 0 34 0;
+#X connect 61 1 34 0;
+#X connect 61 2 34 0;
+#X connect 61 3 34 0;
+#X connect 61 4 34 0;
+#X connect 67 0 68 0;
+#X connect 68 0 62 0;
+#X connect 68 0 63 0;
+#X connect 68 0 64 0;
+#X connect 68 0 65 0;
+#X connect 68 0 66 0;
+#X connect 69 0 0 0;
+#X connect 69 0 5 1;
+#X connect 69 0 22 0;
+#X connect 69 0 46 1;
+#X connect 69 0 16 0;
+#X connect 69 0 56 0;
+#X connect 69 0 60 0;
+#X connect 69 1 50 0;
diff --git a/rhythms_memory.c b/rhythms_memory.c
index a7d7ce6..12d9c5c 100755
--- a/rhythms_memory.c
+++ b/rhythms_memory.c
@@ -182,7 +182,7 @@ void *rhythms_memory_new(t_symbol *s, int argc, t_atom *argv)
int i;
time_t a;
t_rhythms_memory *x = (t_rhythms_memory *)pd_new(rhythms_memory_class);
- x->l_out = outlet_new(&x->x_obj, "list");
+ x->l_out = outlet_new(&x->x_obj, &s_list);
x->seq_initialized = 0;