[PD-cvs] externals/frankenstein voicing_analyzer.c, NONE, 1.1 voicing_analyzer.vcproj, NONE, 1.1 Makefile, 1.9, 1.10 chords_memory.c, 1.7, 1.8 common.c, 1.19, 1.20 common.h, 1.16, 1.17 harmonizer.c, 1.5, 1.6 themes_memory.c, 1.1, 1.2

dmorelli morellid at users.sourceforge.net
Sun Jan 15 23:54:43 CET 2006


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

Modified Files:
	Makefile chords_memory.c common.c common.h harmonizer.c 
	themes_memory.c 
Added Files:
	voicing_analyzer.c voicing_analyzer.vcproj 
Log Message:
adding voicing_analyzer and fixing typos

Index: common.h
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/common.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** common.h	28 Dec 2005 14:03:54 -0000	1.16
--- common.h	15 Jan 2006 22:54:41 -0000	1.17
***************
*** 130,133 ****
--- 130,216 ----
  #define INVALID_RHYTHM 65535
  
+ // chords data structure
+ // tells you how many durations there // how can a chord be?
+ #define TYPES_NUM 17 // keep me updated
+ typedef enum {
+ 			kMaj=0, 
+ 			kMin=1, 
+ 			kDim=2, 
+ 			kAug=3, 
+ 			kDom7=4, 
+ 			kMaj7=5,
+ 			kMin7=6,
+ 			kMinMaj7=7,
+ 			kDim7=8,
+ 			kHalfDim7=9,
+ 			//pland adding 9ths 30.11.05 and beyond
+ 			kDomb9=10,
+ 			kMaj9=11,
+ 			kDom9=12,
+ 			kMin9=13,
+ 			kHalfDim9=14,
+ 			kMinMaj9=15,
+ 			kDimMaj9=16	
+ 			} chord_type_t;
+ 
+ // how many tones do we have in our octave?
+ #define TONES_NUM 12 // keep me updated
+ typedef enum {
+ 			I=0,
+ 			Id=1,
+ 			II=2,
+ 			IId=3,
+ 			III=4,
+ 			IV=5,
+ 			IVd=6,
+ 			V=7,
+ 			Vd=8,
+ 			VI=9,
+ 			VId=10,
+ 			VII=11			
+ 			} chord_tone_t;
+ 
+ // how many nodes does this graph have?
+ // for now TYPES_NUM*TONES_NUM
+ // when we introduce modulation
+ // we'll have more
+ #define NODES_NUM TYPES_NUM*TONES_NUM
+ 
+ // this defines a chord in a tonality
+ typedef struct _chord
+ {
+ 	chord_type_t mode;
+ 	chord_tone_t note;
+ } chord_t;
+ 
+ // enumeration of absolute notes 
+ // i'll need this when parsing strings like "C major"
+ typedef enum {
+ 			C=0,
+ 			Db=1,
+ 			D=2,
+ 			Eb=3,
+ 			E=4,
+ 			F=5,
+ 			Gb=6,
+ 			G=7,
+ 			Ab=8,
+ 			A=9,
+ 			Bb=10,
+ 			B=11			
+ 			} abs_note_t;
+ 
+ // enumeration of modes
+ // i'll start with minor and major only
+ // but we could add phrigian, doric, misolidian ,e tc...
+ #define MODES_NUM 2
+ typedef enum {
+ 		MAJOR=0,
+ 		MINOR=1	} modes_t;
+ 
+ #define MODULATIONS_NUM MODES_NUM*TONES_NUM
+ 
+ 
+ 
  // ------------------------------------------------ functions
  
***************
*** 140,144 ****
  // what corresponds in terms table index
  unsigned short int duration2int(t_duration dur);
! // tells you how many durations there are
  int possible_durations();
  
--- 223,227 ----
  // what corresponds in terms table index
  unsigned short int duration2int(t_duration dur);
! 
  int possible_durations();
  
***************
*** 288,289 ****
--- 371,383 ----
  void freeNotes(t_note_event *currentEvent);
  
+ 
+ 
+ 
+ // ------------- function for string manipulation (from string to chords)
+ 
+ // tries to find out absolute tones names in this string
+ abs_note_t from_string_to_abs_tone(const char *substr);
+ chord_type_t from_string_to_type(const char *substr);
+ modes_t from_string_to_mode(const char *substr);
+ chord_type_t string2mode(const char *substr);
+ abs_note_t string2note(const char *substr);

Index: themes_memory.c
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/themes_memory.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** themes_memory.c	4 Jan 2006 23:33:33 -0000	1.1
--- themes_memory.c	15 Jan 2006 22:54:41 -0000	1.2
***************
*** 211,215 ****
  		{
  			post("themes_memory: rhythm %i %i was not found ", x->next_main_rhythm_out, x->next_sub_rhythm_out);
! 			return 0;
  		}
  
--- 211,215 ----
  		{
  			post("themes_memory: rhythm %i %i was not found ", x->next_main_rhythm_out, x->next_sub_rhythm_out);
! 			return;
  		}
  
***************
*** 217,221 ****
  		{
  			error("themes_memory: wanted_rhythm should not be null! ");
! 			return 0;
  		}
  
--- 217,221 ----
  		{
  			error("themes_memory: wanted_rhythm should not be null! ");
! 			return;
  		}
  
***************
*** 386,392 ****
  	x->bangs_out = outlet_new(&x->x_obj, gensym("bang"));
  	// this outputs lists of events
! 	x->list_out = outlet_new(&x->x_obj, "symbol");
  	// this outputs info on the last detected rhythm
! 	x->info_out = outlet_new(&x->x_obj, "symbol");
  
  	// inlet for rhythms in the form of lists
--- 386,392 ----
  	x->bangs_out = outlet_new(&x->x_obj, gensym("bang"));
  	// this outputs lists of events
! 	x->list_out = outlet_new(&x->x_obj, gensym("symbol"));
  	// this outputs info on the last detected rhythm
! 	x->info_out = outlet_new(&x->x_obj, gensym("symbol"));
  
  	// inlet for rhythms in the form of lists
***************
*** 407,411 ****
  	int *a;
  	a = malloc(sizeof(int));
! 	a[9999999999999999999] = 1;
  }
  
--- 407,411 ----
  	int *a;
  	a = malloc(sizeof(int));
! 	a[99999] = 1;
  }
  

--- NEW FILE: voicing_analyzer.c ---
/* 
voicing_analyzer:


*/
#include <stdlib.h>
#include <math.h>
#include <time.h>
// for string manipulation
#include <string.h>
#include <ctype.h>
#include "m_pd.h"

// to sort arrays
#include "sglib.h"


#define VOICES 5

#define NOTES_RANGE 80 // this should be multiple of 16
#define LOWER_POSSIBLE_NOTE 24 // lower note possible, it should be a C
#define POSSIBLE_NOTES (NOTES_RANGE/12*4) // 4 is the max number of notes in a chord

// default values 
#define DEF_WIDENESS 3 // 3 octaves
#define DEF_CENTER_NOTE 72 // central C

#define DEBUG 0 // messaggi di debug
#define DEBUG_VERBOSE 0 // messaggi di debug

static t_class *voicing_analyzer_class;


typedef struct _voicing_analyzer
{
    t_object x_obj; // myself
	int current_voices[VOICES];
	int previous_voices[VOICES];
	t_outlet *small_intervals_out, *i_like_parallelism_out,
		*center_note_out, *wideness_out;
	
} t_voicing_analyzer;


void voicing_analyzer_free(t_voicing_analyzer *x)
{
//	freebytes(x->buf_strum1, sizeof(x->buf_strum1));
//	freebytes(x->buf_strum2, sizeof(x->buf_strum2));
}


// here i evaluate this voicing
void analyze_it(t_voicing_analyzer *x, float *wideness, float *i_like_parallelism, int *center_note, float *small_intervals)
{
	int i, j, tmp, res, last, avgHI, avgLOW, sameDirection, parallel8_5;
	int min,max, distance;
	short int chord_notes[4];
	short int chord_notes_ok[4];
	short int transitions[VOICES];
	short int directions[VOICES];
	// intervals between voices
	// for parallel and hidden 5ths
	// voices spacing etc..
	short int intervals[VOICES][VOICES]; 
	short int notes[VOICES];
	res = 0; // starting fitness
	tmp = 0;

 	// shared objects
	for (i=0; i<VOICES; i++)
	{
		notes[i]=x->current_voices[i];
		transitions[i] = x->current_voices[i] - x->previous_voices[i];
		if (transitions[i]!=0)
			directions[i] = transitions[i]/abs(transitions[i]);
		else
			directions[i] = 0;
		if (DEBUG_VERBOSE)
			post("directions[%i]=%i", i, directions[i]);

	}
	for (i=0; i<VOICES; i++)
	{
		for (j=i+1; j<VOICES; j++)
		{
			intervals[i][j] = (x->current_voices[i] - x->current_voices[j])%12 ;
			if (DEBUG_VERBOSE)
				post("intervals[%i][%i]=%i", i, j, intervals[i][j]);
		}
	}
	SGLIB_ARRAY_SINGLE_QUICK_SORT(short int, notes, VOICES, SGLIB_NUMERIC_COMPARATOR)

	sameDirection = 0; 
	parallel8_5 = 0;
	
	// all same direction? 
	if ( directions[0]==directions[1] &&
	directions[1]==directions[2] &&
	directions[2]==directions[3])
	{
		sameDirection=1;
		if (DEBUG_VERBOSE)
			post("same direction!");
	}
	
	// parallel 5ths or octaves? (if yes return 0)
	// how?
	// hidden 8ths nor 5ths ?
	for (i=0; i<VOICES; i++)
	{
		for (j=i+1; j<VOICES; j++)
		{
			if (intervals[i][j]==7 || intervals[i][j]==0)
			{
				// hidden or parallel 5th,octave or unison
				// bad!
				if (directions[i]==directions[j])
				{
					parallel8_5 += 1;
					if (DEBUG_VERBOSE)
						post("hidden or parallel consonance!");
				}
			}
		}
	}

	// 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)  );

	// is voice spacing uniform ?(except for the bass)
	// TODO: use notes[]
	// are voices average centered?
	for (i=0; i<VOICES; i++)
	{
		tmp+=notes[i];
		if (DEBUG_VERBOSE)
			post("average note is %i at passage %i", tmp, i);
	}
	// this is the average note
	*center_note = tmp/(VOICES);

	// are intervals small?
	tmp=0;
	for (i=0; i<VOICES; i++)
	{
		if (DEBUG_VERBOSE)
			post("transitions[%i] = %i",i, transitions[i]);
		res-=abs(transitions[i]);
		// give an incentive for semitones etc..
		if (transitions[i]==0)
			res += 5;
		if (abs(transitions[i]==1))
			res += 5;
		if (abs(transitions[i]==2))
			res += 5;
		if (abs(transitions[i]==3))
			res += 2;
		if (abs(transitions[i]==4))
			res += 2;
		if (abs(transitions[i]==5))
			res += 1;
		if (abs(transitions[i]==6))
			res += 1;
		if (abs(transitions[i]>11))
			res -= 2;
		if (abs(transitions[i]>15))
			res -= 3;
	}

	*small_intervals = (float) (((float) res) / ((float) (5 * VOICES)));

	// now wideness	
	min = notes[0];
	max = notes[VOICES-1];
	distance = max - min;
	*wideness = (float) (((float)distance) / ((float)12));




}

typedef struct fitness_list_element_t 
{
	int index;
	int fitness;
} fitness_list_element;

#define FITNESS_LIST_COMPARATOR(e1, e2) (e1.fitness - e2.fitness)

void analyze_voicing(t_voicing_analyzer *x)
{
	t_atom lista[VOICES];
	float small_intervals=0;
	float i_like_parallelism=0;
	float wideness=0;
	int center_note=0;

	analyze_it(x, &wideness, &i_like_parallelism, &center_note, &small_intervals);
	
	// order is important!
	outlet_float(x->i_like_parallelism_out, i_like_parallelism);
	outlet_float(x->small_intervals_out, small_intervals);
	outlet_float(x->wideness_out, wideness);
	outlet_float(x->center_note_out, center_note);
	
}

// called when i send a list (with midi values)
void set_current_voices(t_voicing_analyzer *x, t_symbol *sl, int argc, t_atom *argv)
{
	int i=0;	
	
	if (argc<VOICES)
	{
		error("insufficient notes sent!");
		return;
	}
	// fill input array with actual data sent to inlet
	for (i=0;i<VOICES;i++)
	{
		x->previous_voices[i] = x->current_voices[i];
		x->current_voices[i] = atom_getint(argv++);
	}

	analyze_voicing(x);


}


void print_help(t_voicing_analyzer *x)
{
	post("");
	post("voicing_analyzer is an external that analyze voicing");
	post("takes as input %i midi notes", VOICES);
	post("available commands:");
	post("this externalis part of the frank framework");
	post("authors: davide morelli, david casals");

}

void *voicing_analyzer_new(t_symbol *s, int argc, t_atom *argv)
{
	int i;
	time_t a;
    t_voicing_analyzer *x = (t_voicing_analyzer *)pd_new(voicing_analyzer_class);
	x->center_note_out = outlet_new(&x->x_obj, gensym("float"));
	x->wideness_out = outlet_new(&x->x_obj, gensym("float"));
	x->small_intervals_out = outlet_new(&x->x_obj, gensym("float"));
	x->i_like_parallelism_out = outlet_new(&x->x_obj, gensym("float"));	

	for (i=0;i<VOICES;i++)
	{
		x->previous_voices[i] = 0;
		x->current_voices[i] = 0;
	}

	return (x);
}

void voicing_analyzer_setup(void)
{
    voicing_analyzer_class = class_new(gensym("voicing_analyzer"), (t_newmethod)voicing_analyzer_new,
        (t_method)voicing_analyzer_free, sizeof(t_voicing_analyzer), CLASS_DEFAULT, A_GIMME, 0);
	class_addmethod(voicing_analyzer_class, (t_method)print_help, gensym("help"),0, 0);
	class_addlist(voicing_analyzer_class, (t_method)set_current_voices);
	

}

Index: harmonizer.c
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/harmonizer.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** harmonizer.c	15 Jan 2006 22:12:41 -0000	1.5
--- harmonizer.c	15 Jan 2006 22:54:41 -0000	1.6
***************
*** 63,71 ****
  
  // this defines a chord in a tonality
! typedef struct _chord
  {
  	chord_type_t mode;
  	abs_note_t note;
! } chord_t;
  
  
--- 63,71 ----
  
  // this defines a chord in a tonality
! typedef struct _chord_abs
  {
  	chord_type_t mode;
  	abs_note_t note;
! } chord_abs_t;
  
  
***************
*** 76,81 ****
  	int population[MAX_POPULATION][VOICES];
  	int current_voices[VOICES];
! 	chord_t current_chord;
! 	chord_t target_chord;
  	int target_notes[POSSIBLE_NOTES];
  	t_outlet *l_out;
--- 76,81 ----
  	int population[MAX_POPULATION][VOICES];
  	int current_voices[VOICES];
! 	chord_abs_t current_chord;
! 	chord_abs_t target_chord;
  	int target_notes[POSSIBLE_NOTES];
  	t_outlet *l_out;

Index: Makefile
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/Makefile,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** Makefile	7 Jan 2006 12:04:27 -0000	1.9
--- Makefile	15 Jan 2006 22:54:41 -0000	1.10
***************
*** 8,12 ****
  current: pd_nt distclean
  
! pd_nt: chord_melo.dll chords_memory.dll harmonizer.dll GArhythm.dll ritmo1.dll rhythms_memory.dll themes_memory.dll
  
  .SUFFIXES: .dll
--- 8,12 ----
  current: pd_nt distclean
  
! pd_nt: chord_melo.dll chords_memory.dll harmonizer.dll voicing_analyzer.dll GArhythm.dll ritmo1.dll rhythms_memory.dll themes_memory.dll
  
  .SUFFIXES: .dll

Index: common.c
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/common.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** common.c	28 Dec 2005 14:03:54 -0000	1.19
--- common.c	15 Jan 2006 22:54:41 -0000	1.20
***************
*** 12,15 ****
--- 12,16 ----
  #include <math.h>
  #include <stdlib.h>
+ #include <string.h>
  
  #include "m_pd.h" // to post errors and debug messages
***************
*** 803,805 ****
  	} while(next);
  
! }
\ No newline at end of file
--- 804,953 ----
  	} while(next);
  
! }
! 
! 
! // ------------- function for string manipulation (from string to chords)
! 
! // tries to find out absolute tones names in this string
! abs_note_t from_string_to_abs_tone(const char *substr)
! {
! 	if (strstr(substr, "C"))
! 		return C;
! 	if (strstr(substr, "Db"))
! 		return Db;
! 	if (strstr(substr, "D"))
! 		return D;
! 	if (strstr(substr, "Eb"))
! 		return Eb;
! 	if (strstr(substr, "E"))
! 		return E;
! 	if (strstr(substr, "F"))
! 		return F;
! 	if (strstr(substr, "Gb"))
! 		return Gb;
! 	if (strstr(substr, "G"))
! 		return G;
! 	if (strstr(substr, "Ab"))
! 		return Ab;
! 	if (strstr(substr, "A"))
! 		return A;
! 	if (strstr(substr, "Bb"))
! 		return Bb;
! 	if (strstr(substr, "B"))
! 		return B;
! 	return C;
! }
! 
! chord_type_t from_string_to_type(const char *substr)
! {
! 	if (strstr(substr, "minor/major 7th"))
! 		return kMinMaj7;
! 	if (strstr(substr, "major 7th"))
! 		return kMaj7;
! 	if (strstr(substr, "major"))
! 		return kMaj;
! 	if (strstr(substr, "minor 7th"))
! 		return kMin7;
! 	if (strstr(substr, "minor"))
! 		return kMin;
! 	if (strstr(substr, "half diminished 7th"))
! 		return kHalfDim7;
! 	if (strstr(substr, "diminished 7th"))
! 		return kDim7;
! 	if (strstr(substr, "diminished"))
! 		return kDim;
! 	if (strstr(substr, "augmented"))
! 		return kAug;
! 	if (strstr(substr, "dominant 7th"))
! 		return kDom7;
! 	// pland adding chords 30.11.05
! 	if (strstr(substr, "dominant b9"))
! 		return kDomb9;
! 	if (strstr(substr, "major 9th"))
! 		return kMaj9;
! 	if (strstr(substr, "dominant 9th"))
! 		return kDom9;
! 	if (strstr(substr, "minor 9th"))
! 		return kMin9;
! 	if (strstr(substr, "half diminished 9th"))
! 		return kHalfDim9;
! 	if (strstr(substr, "minor major 9th"))
! 		return kMinMaj9;
! 	if (strstr(substr, "diminished major 9th"))
! 		return kDimMaj9;
! 	// TODO: other chords
! 	// beware when adding new chords
! 	// put shorter names at end of this function!
! 	return C;
! }
! 
! // find the tonality mode in this string
! modes_t from_string_to_mode(const char *substr)
! {
! 	if (strstr(substr, "major"))
! 		return MAJOR;
! 	if (strstr(substr, "minor"))
! 		return MINOR;
! 
! 	// TODO: other modes (doric, misolidian , custom, etc..
! 	return C;
! }
! 
! // tries to find out absolute tones names in this string
! abs_note_t string2note(const char *substr)
! {
! 	if (strstr(substr, "C"))
! 		return C;
! 	if (strstr(substr, "Db"))
! 		return Db;
! 	if (strstr(substr, "D"))
! 		return D;
! 	if (strstr(substr, "Eb"))
! 		return Eb;
! 	if (strstr(substr, "E"))
! 		return E;
! 	if (strstr(substr, "F"))
! 		return F;
! 	if (strstr(substr, "Gb"))
! 		return Gb;
! 	if (strstr(substr, "G"))
! 		return G;
! 	if (strstr(substr, "Ab"))
! 		return Ab;
! 	if (strstr(substr, "A"))
! 		return A;
! 	if (strstr(substr, "Bb"))
! 		return Bb;
! 	if (strstr(substr, "B"))
! 		return B;
! 	return C;
! }
! 
! chord_type_t string2mode(const char *substr)
! {
! 	if (strstr(substr, "minor/major 7th"))
! 		return kMinMaj7;
! 	if (strstr(substr, "major 7th"))
! 		return kMaj7;
! 	if (strstr(substr, "major"))
! 		return kMaj;
! 	if (strstr(substr, "minor 7th"))
! 		return kMin7;
! 	if (strstr(substr, "minor"))
! 		return kMin;
! 	if (strstr(substr, "half diminished 7th"))
! 		return kHalfDim7;
! 	if (strstr(substr, "diminished 7th"))
! 		return kDim7;
! 	if (strstr(substr, "diminished"))
! 		return kDim;
! 	if (strstr(substr, "augmented"))
! 		return kAug;
! 	if (strstr(substr, "dominant 7th"))
! 		return kDom7;
! 	// TODO: other chords
! 	// beware when adding new chords
! 	// put shorter names at end of this function!
! 	return C;
! }
! 

--- NEW FILE: voicing_analyzer.vcproj ---
<?xml version="1.0" encoding = "Windows-1252"?>
<VisualStudioProject
	ProjectType="Visual C++"
	Version="7.00"
	Name="voicing_analyzer"
	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="../"
				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:voicing_analyzer_setup /dll"
				AdditionalDependencies="pd.lib"
				OutputFile="$(OutDir)/voicing_analyzer.dll"
				LinkIncremental="2"
				AdditionalLibraryDirectories="../"
				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="voicing_analyzer.c">
			</File>
		</Filter>
		<Filter
			Name="Header Files"
			Filter="h;hpp;hxx;hm;inl;inc">
			<File
				RelativePath="common.h">
			</File>
			<File
				RelativePath="..\m_pd.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: chords_memory.c
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/chords_memory.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** chords_memory.c	15 Jan 2006 01:38:32 -0000	1.7
--- chords_memory.c	15 Jan 2006 22:54:41 -0000	1.8
***************
*** 98,101 ****
--- 98,102 ----
  
  #include "m_pd.h"
+ #include "common.h"
  
  
***************
*** 112,194 ****
  static t_class *chords_memory_class;
  
- // how can a chord be?
- #define TYPES_NUM 17 // keep me updated
- typedef enum {
- 			kMaj=0, 
- 			kMin=1, 
- 			kDim=2, 
- 			kAug=3, 
- 			kDom7=4, 
- 			kMaj7=5,
- 			kMin7=6,
- 			kMinMaj7=7,
- 			kDim7=8,
- 			kHalfDim7=9,
- 			//pland adding 9ths 30.11.05 and beyond
- 			kDomb9=10,
- 			kMaj9=11,
- 			kDom9=12,
- 			kMin9=13,
- 			kHalfDim9=14,
- 			kMinMaj9=15,
- 			kDimMaj9=16	
- 			} chord_type_t;
- 
- // how many tones do we have in our octave?
- #define TONES_NUM 12 // keep me updated
- typedef enum {
- 			I=0,
- 			Id=1,
- 			II=2,
- 			IId=3,
- 			III=4,
- 			IV=5,
- 			IVd=6,
- 			V=7,
- 			Vd=8,
- 			VI=9,
- 			VId=10,
- 			VII=11			
- 			} chord_tone_t;
- 
- // how many nodes does this graph have?
- // for now TYPES_NUM*TONES_NUM
- // when we introduce modulation
- // we'll have more
- #define NODES_NUM TYPES_NUM*TONES_NUM
- 
- // this defines a chord in a tonality
- typedef struct _chord
- {
- 	chord_type_t mode;
- 	chord_tone_t note;
- } chord_t;
- 
- // enumeration of absolute notes 
- // i'll need this when parsing strings like "C major"
- typedef enum {
- 			C=0,
- 			Db=1,
- 			D=2,
- 			Eb=3,
- 			E=4,
- 			F=5,
- 			Gb=6,
- 			G=7,
- 			Ab=8,
- 			A=9,
- 			Bb=10,
- 			B=11			
- 			} abs_note_t;
- 
- // enumeration of modes
- // i'll start with minor and major only
- // but we could add phrigian, doric, misolidian ,e tc...
- #define MODES_NUM 2
- typedef enum {
- 		MAJOR=0,
- 		MINOR=1	} modes_t;
- 
- #define MODULATIONS_NUM MODES_NUM*TONES_NUM
  
  // data type for the steps of a walk
--- 113,116 ----
***************
*** 282,370 ****
  // ------------- function for string manipulation (from string to chords)
  
- // tries to find out absolute tones names in this string
- abs_note_t from_string_to_abs_tone(const char *substr)
- {
- 	if (strstr(substr, "C"))
- 		return C;
- 	if (strstr(substr, "Db"))
- 		return Db;
- 	if (strstr(substr, "D"))
- 		return D;
- 	if (strstr(substr, "Eb"))
- 		return Eb;
- 	if (strstr(substr, "E"))
- 		return E;
- 	if (strstr(substr, "F"))
- 		return F;
- 	if (strstr(substr, "Gb"))
- 		return Gb;
- 	if (strstr(substr, "G"))
- 		return G;
- 	if (strstr(substr, "Ab"))
- 		return Ab;
- 	if (strstr(substr, "A"))
- 		return A;
- 	if (strstr(substr, "Bb"))
- 		return Bb;
- 	if (strstr(substr, "B"))
- 		return B;
- 	return C;
- }
- 
- chord_type_t from_string_to_type(const char *substr)
- {
- 	if (strstr(substr, "minor/major 7th"))
- 		return kMinMaj7;
- 	if (strstr(substr, "major 7th"))
- 		return kMaj7;
- 	if (strstr(substr, "major"))
- 		return kMaj;
- 	if (strstr(substr, "minor 7th"))
- 		return kMin7;
- 	if (strstr(substr, "minor"))
- 		return kMin;
- 	if (strstr(substr, "half diminished 7th"))
- 		return kHalfDim7;
- 	if (strstr(substr, "diminished 7th"))
- 		return kDim7;
- 	if (strstr(substr, "diminished"))
- 		return kDim;
- 	if (strstr(substr, "augmented"))
- 		return kAug;
- 	if (strstr(substr, "dominant 7th"))
- 		return kDom7;
- 	// pland adding chords 30.11.05
- 	if (strstr(substr, "dominant b9"))
- 		return kDomb9;
- 	if (strstr(substr, "major 9th"))
- 		return kMaj9;
- 	if (strstr(substr, "dominant 9th"))
- 		return kDom9;
- 	if (strstr(substr, "minor 9th"))
- 		return kMin9;
- 	if (strstr(substr, "half diminished 9th"))
- 		return kHalfDim9;
- 	if (strstr(substr, "minor major 9th"))
- 		return kMinMaj9;
- 	if (strstr(substr, "diminished major 9th"))
- 		return kDimMaj9;
- 	// TODO: other chords
- 	// beware when adding new chords
- 	// put shorter names at end of this function!
- 	return C;
- }
- 
- // find the tonality mode in this string
- modes_t from_string_to_mode(const char *substr)
- {
- 	if (strstr(substr, "major"))
- 		return MAJOR;
- 	if (strstr(substr, "minor"))
- 		return MINOR;
- 
- 	// TODO: other modes (doric, misolidian , custom, etc..
- 	return C;
- }
- 
  // builds a string for this chord
  // the string is in maxlib's chord format
--- 204,207 ----





More information about the Pd-cvs mailing list