[PD-cvs] externals/frankenstein rhythms_memory.c, NONE, 1.1 rhythms_memory.sln, NONE, 1.1 rhythms_memory.vcproj, NONE, 1.1 test-rhythms_memory.pd, NONE, 1.1 Makefile, 1.6, 1.7 common.c, 1.11, 1.12

dmorelli morellid at users.sourceforge.net
Wed Dec 7 01:20:06 CET 2005


Update of /cvsroot/pure-data/externals/frankenstein
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14706

Modified Files:
	Makefile common.c 
Added Files:
	rhythms_memory.c rhythms_memory.sln rhythms_memory.vcproj 
	test-rhythms_memory.pd 
Log Message:
first version of rhythms_memory

--- NEW FILE: rhythms_memory.sln ---
Microsoft Visual Studio Solution File, Format Version 7.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rhythms_memory", "rhythms_memory.vcproj", "{DBC75D2A-816A-4C0A-8FE7-2016518D2D19}"
EndProject
Global
	GlobalSection(SolutionConfiguration) = preSolution
		ConfigName.0 = Debug
		ConfigName.1 = Release
	EndGlobalSection
	GlobalSection(ProjectDependencies) = postSolution
	EndGlobalSection
	GlobalSection(ProjectConfiguration) = postSolution
		{DBC75D2A-816A-4C0A-8FE7-2016518D2D19}.Debug.ActiveCfg = Debug|Win32
		{DBC75D2A-816A-4C0A-8FE7-2016518D2D19}.Debug.Build.0 = Debug|Win32
		{DBC75D2A-816A-4C0A-8FE7-2016518D2D19}.Release.ActiveCfg = Release|Win32
		{DBC75D2A-816A-4C0A-8FE7-2016518D2D19}.Release.Build.0 = Release|Win32
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
	EndGlobalSection
	GlobalSection(ExtensibilityAddIns) = postSolution
	EndGlobalSection
EndGlobal

--- NEW FILE: test-rhythms_memory.pd ---
#N canvas 0 0 641 458 12;
#X obj 134 262 rhythms_memory;
#X msg 126 212 measure;
#X msg 317 224 0;
#X obj 168 69 metro 500;
#X obj 130 107 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X obj 168 46 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
;
#X obj 169 92 int 0;
#X obj 220 93 + 1;
#X obj 169 115 % 4;
#X floatatom 196 152 5 0 0 0 - - -;
#X obj 127 155 sel 0;
#X obj 125 185 bang;
#X obj 317 189 bng 30 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
-1;
#X obj 133 285 unpack f f f f f;
#X floatatom 131 312 5 0 0 1 is_this_a_new_rhythm - -;
#X floatatom 160 330 5 0 0 1 id - -;
#X floatatom 193 348 5 0 0 1 subid - -;
#X floatatom 225 368 5 0 0 1 root_closeness - -;
#X floatatom 257 391 5 0 0 1 sub_closeness - -;
#X connect 0 0 13 0;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
#X connect 3 0 4 0;
#X connect 3 0 6 0;
#X connect 5 0 3 0;
#X connect 6 0 7 0;
#X connect 6 0 8 0;
#X connect 7 0 6 1;
#X connect 8 0 9 0;
#X connect 8 0 10 0;
#X connect 10 0 11 0;
#X connect 11 0 1 0;
#X connect 12 0 2 0;
#X connect 13 0 14 0;
#X connect 13 1 15 0;
#X connect 13 2 16 0;
#X connect 13 3 17 0;
#X connect 13 4 18 0;

Index: Makefile
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/Makefile,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** Makefile	6 Dec 2005 12:08:28 -0000	1.6
--- Makefile	7 Dec 2005 00:20:01 -0000	1.7
***************
*** 2,12 ****
  #VC="C:\Programmi\Microsoft Visual Studio .NET\Vc7"
  VC="C:\Programmi\Microsoft Visual Studio .NET\Vc7"
! #PDPATH="H:\PureData\pd-0.38-3.msw\pd"
! PDPATH="C:\Documents and Settings\Davide\Documenti\personali\pd-0.38-3.msw\pd"
  
  
  current: pd_nt distclean
  
! pd_nt: chord_melo.dll chords_memory.dll harmonizer.dll GArhythm.dll ritmo1.dll test.dll
  
  .SUFFIXES: .dll
--- 2,12 ----
  #VC="C:\Programmi\Microsoft Visual Studio .NET\Vc7"
  VC="C:\Programmi\Microsoft Visual Studio .NET\Vc7"
! PDPATH="H:\PureData\pd-0.38-3.msw\pd"
! #PDPATH="C:\Documents and Settings\Davide\Documenti\personali\pd-0.38-3.msw\pd"
  
  
  current: pd_nt distclean
  
! pd_nt: chord_melo.dll chords_memory.dll harmonizer.dll GArhythm.dll ritmo1.dll rhythms_memory.dll
  
  .SUFFIXES: .dll

--- NEW FILE: rhythms_memory.vcproj ---
<?xml version="1.0" encoding = "Windows-1252"?>
<VisualStudioProject
	ProjectType="Visual C++"
	Version="7.00"
	Name="rhythms_memory"
	ProjectGUID="{DBC75D2A-816A-4C0A-8FE7-2016518D2D19}"
	Keyword="Win32Proj">
	<Platforms>
		<Platform
			Name="Win32"/>
	</Platforms>
	<Configurations>
		<Configuration
			Name="Debug|Win32"
			OutputDirectory="Debug"
			IntermediateDirectory="Debug"
			ConfigurationType="1"
			CharacterSet="2">
			<Tool
				Name="VCCLCompilerTool"
				Optimization="0"
				AdditionalIncludeDirectories="&quot;H:\PureData\pd-0.38-3.msw\pd\src&quot;"
				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
				MinimalRebuild="TRUE"
				BasicRuntimeChecks="3"
				RuntimeLibrary="5"
				UsePrecompiledHeader="0"
				WarningLevel="3"
				Detect64BitPortabilityProblems="TRUE"
				DebugInformationFormat="4"/>
			<Tool
				Name="VCCustomBuildTool"/>
			<Tool
				Name="VCLinkerTool"
				AdditionalOptions="/export:rhythms_memory_setup /dll"
				AdditionalDependencies="pd.lib"
				OutputFile="$(OutDir)/rhythms_memory.dll"
				LinkIncremental="2"
				AdditionalLibraryDirectories="&quot;H:\PureData\pd-0.38-3.msw\pd\bin&quot;"
				GenerateDebugInformation="TRUE"
				ProgramDatabaseFile="$(OutDir)/frankenstein.pdb"
				SubSystem="0"
				TargetMachine="1"/>
			<Tool
				Name="VCMIDLTool"/>
			<Tool
				Name="VCPostBuildEventTool"/>
			<Tool
				Name="VCPreBuildEventTool"/>
			<Tool
				Name="VCPreLinkEventTool"/>
			<Tool
				Name="VCResourceCompilerTool"/>
			<Tool
				Name="VCWebServiceProxyGeneratorTool"/>
			<Tool
				Name="VCWebDeploymentTool"/>
		</Configuration>
		<Configuration
			Name="Release|Win32"
			OutputDirectory="Release"
			IntermediateDirectory="Release"
			ConfigurationType="1"
			CharacterSet="2">
			<Tool
				Name="VCCLCompilerTool"
				Optimization="2"
				InlineFunctionExpansion="1"
				OmitFramePointers="TRUE"
				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
				StringPooling="TRUE"
				RuntimeLibrary="4"
				EnableFunctionLevelLinking="TRUE"
				UsePrecompiledHeader="3"
				WarningLevel="3"
				Detect64BitPortabilityProblems="TRUE"
				DebugInformationFormat="3"/>
			<Tool
				Name="VCCustomBuildTool"/>
			<Tool
				Name="VCLinkerTool"
				OutputFile="$(OutDir)/frankenstein.exe"
				LinkIncremental="1"
				GenerateDebugInformation="TRUE"
				SubSystem="2"
				OptimizeReferences="2"
				EnableCOMDATFolding="2"
				TargetMachine="1"/>
			<Tool
				Name="VCMIDLTool"/>
			<Tool
				Name="VCPostBuildEventTool"/>
			<Tool
				Name="VCPreBuildEventTool"/>
			<Tool
				Name="VCPreLinkEventTool"/>
			<Tool
				Name="VCResourceCompilerTool"/>
			<Tool
				Name="VCWebServiceProxyGeneratorTool"/>
			<Tool
				Name="VCWebDeploymentTool"/>
		</Configuration>
	</Configurations>
	<Files>
		<Filter
			Name="Source Files"
			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
			<File
				RelativePath="common.c">
			</File>
			<File
				RelativePath="rhythms_memory.c">
			</File>
		</Filter>
		<Filter
			Name="Header Files"
			Filter="h;hpp;hxx;hm;inl;inc">
			<File
				RelativePath="common.h">
			</File>
		</Filter>
		<Filter
			Name="Resource Files"
			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
		</Filter>
	</Files>
	<Globals>
	</Globals>
</VisualStudioProject>

Index: common.c
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/common.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** common.c	6 Dec 2005 12:08:28 -0000	1.11
--- common.c	7 Dec 2005 00:20:01 -0000	1.12
***************
*** 207,210 ****
--- 207,212 ----
  	(*this_rep)->id = id; // the main id
  	(*this_rep)->last_sub_id = 0; // the sub id
+ 	(*this_rep)->next = 0;
+ 	(*this_rep)->max_weight = 0;
  }
  
***************
*** 289,292 ****
--- 291,295 ----
  			// a new champion!
  			this_rep->max_weight = this_rep->transitions[i].weight;
+ 			post("DEBUG: max_weight=%i", this_rep->max_weight);
  		}
  		last = i;
***************
*** 378,381 ****
--- 381,385 ----
  	float best_closeness, curr_closeness;
  	int sub_ok, sub_no;
+ 	int count_strong;
  	t_rhythm_memory_element *possible_rhythms;
  
***************
*** 411,431 ****
  	// look all the representation's rhythm 
  	// looking for strong beats corrispondance
  	for (i=0; i<max_i; i++)
  	{
- 		if (this_weight_float > min_to_be_main_rhythm_beat)
- 		{
  			this_weight_int = this_rep->transitions[i].weight;
  			this_weight_float = (float) (((float) this_weight_int) / ((float) this_rep->max_weight));
! 			// this is a main rhythm beat
! 			if (src_rhythm_array[i]>0)
! 			{
! 				// both playing
! 				strong_ok++;
! 			} else
  			{
! 				// strong beat miss
! 				strong_no++;
! 			}
! 		}
  	}
  
--- 415,440 ----
  	// look all the representation's rhythm 
  	// looking for strong beats corrispondance
+ 	count_strong = 0;
  	for (i=0; i<max_i; i++)
  	{
  			this_weight_int = this_rep->transitions[i].weight;
  			this_weight_float = (float) (((float) this_weight_int) / ((float) this_rep->max_weight));
! 			post("DEBUG: transition %i this_weight_float=%f", i, this_weight_float);
! 			if (this_weight_float > min_to_be_main_rhythm_beat)
  			{
! 				// this is a main rhythm beat
! 				if (src_rhythm_array[i]>0)
! 				{
! 					// both playing
! 					strong_ok++;
! 					post("DEBUG: beat %i, both playing", i);
! 				} else
! 				{
! 					// strong beat miss
! 					strong_no++;
! 					post("DEBUG: beat %i, src not playing", i);
! 				}
! 				count_strong++;
! 			}	
  	}
  
***************
*** 441,450 ****
  	// close to 0 = no corrispondance
  	// close to 1 = corrispondance
! 	if (strong_no==0)
  	{
! 		strong_ratio = 1;
  	} else
  	{
! 		strong_ratio = (float) ( ((float) strong_ok) / ((float)strong_no) );
  	}
  	// for each rhythm in the list
--- 450,461 ----
  	// close to 0 = no corrispondance
  	// close to 1 = corrispondance
! 	if (count_strong==0)
  	{
! 		strong_ratio = 0;
  	} else
  	{
! 		strong_ratio = (float) ( ( ((float) strong_ok) / ((float)count_strong) ) -
! 			( ((float) strong_no) / ((float)count_strong) )) ;
! 		post("DEBUG: strong_ratio=%f", strong_ratio);
  	}
  	// for each rhythm in the list
***************
*** 528,531 ****
--- 539,543 ----
  			best_subid = curr_subid;
  		}
+ 		this_rep = this_rep->next;
  	}
  
***************
*** 548,559 ****
  void rhythm_memory_free(t_rhythm_memory_representation *rep_list)
  {
! 	t_rhythm_memory_representation *curr, *next;
! 	next = rep_list;
! 	while (next)
  	{
! 		curr = next;
! 		next = curr->next;
  		free_memory_representations(curr);
  	}
  }
  // evaluate this rhythm and add it to the memory if is new
--- 560,572 ----
  void rhythm_memory_free(t_rhythm_memory_representation *rep_list)
  {
! 	t_rhythm_memory_representation *curr, *nextRep;
! 	nextRep = rep_list;
! 	while (nextRep)
  	{
! 		curr = nextRep;
! 		nextRep = curr->next;
  		free_memory_representations(curr);
  	}
+ 
  }
  // evaluate this rhythm and add it to the memory if is new
***************
*** 590,594 ****
  	if (root_closeness_found>=min_to_be_same_rhythm)
  	{
! 		// is close enough to be considered a subrhythm
  		*new_rhythm = 0;
  		*id = id_found;
--- 603,608 ----
  	if (root_closeness_found>=min_to_be_same_rhythm)
  	{
! 		// is close enough to be considered a rhythm
! 		post("DEBUG: rhythm found");
  		*new_rhythm = 0;
  		*id = id_found;
***************
*** 597,600 ****
--- 611,615 ----
  		{
  			// this is a known subrhythm
+ 			post("DEBUG: sub-rhythm found");
  			*sub_id = sub_id_found;
  			*sub_closeness = sub_closeness_found;

--- NEW FILE: rhythms_memory.c ---
/* 
just a dummy rhythms_memory patch

*/

#include "m_pd.h"

#include "common.h"
#include <time.h>
#include <math.h>
#include <stdlib.h>

static t_class *rhythms_memory_class;

typedef struct event event;
typedef struct event
{
	unsigned short int voice;
	double when;
	event *next;
};

typedef struct _rhythms_memory
{
    t_object x_obj; // myself
	t_outlet *l_out;
	t_rhythm_event *curr_seq;
	int seq_initialized;
	t_rhythm_memory_representation *rhythms_memory;
	double measure_start_time;
	double measure_length;
	event *events;
	
} t_rhythms_memory;

void rhythms_memory_free(t_rhythms_memory *x)
{
	if (x->curr_seq)
		freeBeats(x->curr_seq);	
	if (x->rhythms_memory)
		rhythm_memory_free(x->rhythms_memory);
}

void start_measure(t_rhythms_memory *x)
{
	// I call the pd functions to get a representation
	// of this very moment
	x->measure_start_time = clock_getlogicaltime();
}

void add_event(t_rhythms_memory *x, unsigned short int voice)
{
	event *newEvent, *currEvent, *lastEvent;
	double when;
	when = clock_gettimesince(x->measure_start_time);
	newEvent = (event *) malloc(sizeof(event));
	newEvent->when = when;
	newEvent->voice = voice;
	newEvent->next = 0;
	currEvent = x->events;
	if (currEvent)
	{
		// this is not the first event
		while(currEvent)
		{
			lastEvent = currEvent;
			currEvent = currEvent->next;
		}
		lastEvent->next = newEvent;
	} else
	{
		// this is the first event
		x->events = newEvent;
	}
	post("event added");
}

void end_measure(t_rhythms_memory *x)
{
	float fduration;
	event *currEvent, *lastEvent;
	unsigned short int is_it_a_new_rhythm;
	unsigned short int id, subid;
	float root_closeness, sub_closeness;
	int counter;
	t_atom *lista;
	// I call the pd functions to get a representation
	// of this very moment
	x->measure_length = clock_gettimesince(x->measure_start_time);
	// now that i know the exact length of the current measure
	// i can process the rhythm in the current measure
	// and evaluate it
	currEvent = x->events;
	// this is not the first event
	// now I translate events in rhythm
	counter = 0;
	while(currEvent)
	{
		fduration = currEvent->when / x->measure_length;
		if (x->seq_initialized)
		{
			concatenateBeat(x->curr_seq, currEvent->voice, fduration, 1);
		} else
		{
			setFirstBeat(&(x->curr_seq), currEvent->voice, fduration, 1);
			x->seq_initialized = 1;
		}
		currEvent = currEvent->next;
		counter++;
	}
	
	// delete events after having evaluated them
	currEvent = x->events;
	// this is not the first event
	while(currEvent)
	{
		lastEvent = currEvent;
		currEvent = currEvent->next;
		free(lastEvent);
	}
	x->events = 0;
	x->seq_initialized = 0;

	// now I evaluate this rhythm with the memory
	rhythm_memory_evaluate(x->rhythms_memory, x->curr_seq, &is_it_a_new_rhythm,
							&id, &subid, &root_closeness, &sub_closeness);
	// tell out the answer
	// allocate space for the list
	lista = (t_atom *) malloc(sizeof(t_atom) * 5);
	SETFLOAT(lista, (float) is_it_a_new_rhythm);
	SETFLOAT(lista+1, (float) id);
	SETFLOAT(lista+2, (float) subid);
	SETFLOAT(lista+3, (float) root_closeness);
	SETFLOAT(lista+4, (float) sub_closeness);
	outlet_anything(x->l_out,
                     gensym("list") ,
					 5, 
					 lista);
	free(lista);
	freeBeats(x->curr_seq);
	x->seq_initialized = 0;
	x->curr_seq = 0;

	// also start the new measure!
	start_measure(x);

	
}

static void rhythms_memory_bang(t_rhythms_memory *x) {

	// generate a random value
	float rnd;
	t_rhythm_event *events;
	t_duration dur;

	rnd = rand()/((double)RAND_MAX + 1);
	dur = float2duration(rnd);

	post("random value=%f duration.numerator=%i duration.denominator=%i", rnd, dur.numerator, dur.denominator);

	if (x->seq_initialized)
	{
		concatenateBeat(x->curr_seq, 0, rnd, 1);
	} else
	{
		setFirstBeat(&(x->curr_seq), 0, rnd, 1);
		x->seq_initialized = 1;
	}

	// print the sequence
	events = x->curr_seq;
	while(events)
	{
		post("event: numerator=%i, denominator=%i", events->duration.numerator, events->duration.denominator);
		events=events->next;
	}
	
}

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->seq_initialized = 0;

	rhythm_memory_create(&(x->rhythms_memory));
	start_measure(x);

    return (x);
}

void rhythms_memory_setup(void)
{
    rhythms_memory_class = class_new(gensym("rhythms_memory"), (t_newmethod)rhythms_memory_new,
        (t_method)rhythms_memory_free, sizeof(t_rhythms_memory), CLASS_DEFAULT, A_GIMME, 0);
    class_addbang(rhythms_memory_class, (t_method)rhythms_memory_bang);
	class_addmethod(rhythms_memory_class, (t_method)end_measure, gensym("measure"), 0);
	class_doaddfloat(rhythms_memory_class, (t_method)add_event);

}





More information about the Pd-cvs mailing list