From 10a3fd828512907e52f3eabdd7c69b3eaa98757f Mon Sep 17 00:00:00 2001 From: Davide Morelli Date: Mon, 16 Jan 2006 00:56:01 +0000 Subject: fixed bugs in evaluating indices svn path=/trunk/externals/frankenstein/; revision=4410 --- harmonizer.c | 18 +++++++++++++----- test-harmonizer.pd | 55 +++++++++++++++++++++++++++++++++++++++--------------- voicing_analyzer.c | 13 +++++++------ 3 files changed, 60 insertions(+), 26 deletions(-) diff --git a/harmonizer.c b/harmonizer.c index 9a99559..fc588f7 100755 --- a/harmonizer.c +++ b/harmonizer.c @@ -192,7 +192,7 @@ void harmonizer_init_pop(t_harmonizer *x) { // i go up rnd = rand()/((double)RAND_MAX + 1); - steps = rnd * 5; // how many steps (good notes) will I ignore? + steps = rnd * 10; // how many steps (good notes) will I ignore? note = insertpoint + steps; if (note >= POSSIBLE_NOTES) note = POSSIBLE_NOTES-1; @@ -201,7 +201,7 @@ void harmonizer_init_pop(t_harmonizer *x) { // i go down rnd = rand()/((double)RAND_MAX + 1); - steps = rnd * 5; // how many steps (good notes) will I ignore? + steps = rnd * 10; // how many steps (good notes) will I ignore? note = insertpoint - steps; if (note < 0) note = 0; @@ -223,7 +223,8 @@ void harmonizer_free(t_harmonizer *x) // here i evaluate this voicing int fitness(t_harmonizer *x, int *candidate) { - int i, j, tmp, res, last, avgHI, avgLOW; + int i, j, tmp, res, last, avgHI, avgLOW, min, max, distance; + float wideness, ftmp; short int chord_notes[4]; short int chord_notes_ok[4]; short int transitions[VOICES]; @@ -337,7 +338,7 @@ int fitness(t_harmonizer *x, int *candidate) { if (DEBUG_VERBOSE) post("transitions[%i] = %i",i, transitions[i]); - res-=abs(transitions[i]); + res-=abs(transitions[i]) * x->small_intervals; // give an incentive for semitones etc.. if (transitions[i]==0) res += 5; @@ -417,7 +418,14 @@ int fitness(t_harmonizer *x, int *candidate) case 4: res -= 30; break; } - + // now wideness + min = notes[0]; + max = notes[VOICES-1]; + distance = max - min; + wideness = (float) (((float)distance) / ((float)12)); + ftmp = fabs(wideness - x->wideness); + res -= ftmp * 5; + if (DEBUG_VERBOSE) post("fitness is %i", res); diff --git a/test-harmonizer.pd b/test-harmonizer.pd index f8e4ebd..1818262 100755 --- a/test-harmonizer.pd +++ b/test-harmonizer.pd @@ -1,4 +1,4 @@ -#N canvas 328 37 702 643 12; +#N canvas 328 37 714 655 12; #X symbolatom 179 191 20 0 0 0 - - -; #N canvas 39 349 531 328 readme 0; #X text 59 31 howto populate the graph: play the chord \, when the @@ -95,14 +95,29 @@ max novelty \, 1= min novelty; #X obj 99 585 dac~; #X obj 99 558 *~ 0.2; #X obj 109 418 print; -#X obj 83 169 chords_graph test.graph; #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; +-1 0 1; #X floatatom 32 112 5 0 0 0 - - -; +#X obj 83 169 chords_memory test.graph; +#X obj 471 355 voicing_analyzer; +#X floatatom 470 390 5 0 0 0 - - -; +#X floatatom 506 411 5 0 0 0 - - -; +#X floatatom 539 393 5 0 0 0 - - -; +#X floatatom 587 412 5 0 0 0 - - -; +#X msg 461 152 i_like_parallelism \$1; +#X obj 463 132 hsl 128 15 -1 1 0 0 empty empty empty -2 -6 0 8 -262144 +-1 -1 6500 1; +#X obj 436 85 hsl 128 15 0 8 0 0 empty empty empty -2 -6 0 8 -262144 +-1 -1 11700 1; +#X msg 434 106 wideness \$1; +#X obj 270 76 hsl 128 15 -1 1 0 0 empty empty empty -2 -6 0 8 -262144 +-1 -1 0 1; +#X msg 268 96 small_intervals \$1; #X connect 2 0 15 0; #X connect 2 0 49 0; +#X connect 2 0 55 0; #X connect 3 0 2 0; #X connect 4 0 2 0; #X connect 5 0 3 0; @@ -132,10 +147,10 @@ max novelty \, 1= min novelty; #X connect 15 4 38 0; #X connect 16 0 18 0; #X connect 17 0 21 0; -#X connect 18 0 50 0; -#X connect 19 0 50 0; -#X connect 20 0 50 0; -#X connect 21 0 51 0; +#X connect 18 0 54 0; +#X connect 19 0 54 0; +#X connect 20 0 54 0; +#X connect 21 0 50 0; #X connect 21 1 16 0; #X connect 22 0 14 0; #X connect 22 1 7 0; @@ -162,11 +177,21 @@ max novelty \, 1= min novelty; #X connect 46 0 48 0; #X connect 48 0 47 0; #X connect 48 0 47 1; -#X connect 50 0 0 0; -#X connect 50 0 5 1; -#X connect 50 0 16 1; -#X connect 50 0 22 0; -#X connect 51 0 52 0; -#X connect 52 0 50 0; -#X connect 53 0 51 1; -#X connect 53 0 54 0; +#X connect 50 0 51 0; +#X connect 51 0 54 0; +#X connect 52 0 50 1; +#X connect 52 0 53 0; +#X connect 54 0 0 0; +#X connect 54 0 5 1; +#X connect 54 0 16 1; +#X connect 54 0 22 0; +#X connect 55 0 56 0; +#X connect 55 1 57 0; +#X connect 55 2 58 0; +#X connect 55 3 59 0; +#X connect 60 0 2 0; +#X connect 61 0 60 0; +#X connect 62 0 63 0; +#X connect 63 0 2 0; +#X connect 64 0 65 0; +#X connect 65 0 2 0; diff --git a/voicing_analyzer.c b/voicing_analyzer.c index c1ab8e3..703b74f 100755 --- a/voicing_analyzer.c +++ b/voicing_analyzer.c @@ -127,7 +127,9 @@ void analyze_it(t_voicing_analyzer *x, float *wideness, float *i_like_parallelis // now i can compute parallelism *i_like_parallelism = (float) -1; *i_like_parallelism += sameDirection; - *i_like_parallelism += (float) ( ((float)(VOICES*(VOICES-1))) / ((float)parallel8_5) ); + if (parallel8_5) + *i_like_parallelism += (float) ( ((float)parallel8_5) / ((float)(VOICES*(VOICES-1))) ); + // is voice spacing uniform ?(except for the bass) // TODO: use notes[] @@ -145,9 +147,9 @@ void analyze_it(t_voicing_analyzer *x, float *wideness, float *i_like_parallelis tmp=0; for (i=0; ii_like_parallelism_out, i_like_parallelism); - outlet_float(x->small_intervals_out, small_intervals); outlet_float(x->wideness_out, wideness); + outlet_float(x->small_intervals_out, small_intervals); outlet_float(x->center_note_out, center_note); } -- cgit v1.2.1