[PD-cvs] externals/frankenstein common.c, 1.4, 1.5 common.h, 1.4, 1.5 test.c, 1.1, 1.2

dmorelli morellid at users.sourceforge.net
Fri Dec 2 19:56:09 CET 2005


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

Modified Files:
	common.c common.h test.c 
Log Message:
added switching style functions

Index: test.c
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/test.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** test.c	30 Nov 2005 17:32:47 -0000	1.1
--- test.c	2 Dec 2005 18:56:07 -0000	1.2
***************
*** 43,50 ****
  	if (x->seq_initialized)
  	{
! 		concatenateBeat(x->seq, 0, rnd);
  	} else
  	{
! 		setFirstBeat(&(x->seq), 0, rnd);
  		x->seq_initialized = 1;
  	}
--- 43,50 ----
  	if (x->seq_initialized)
  	{
! 		concatenateBeat(x->seq, 0, rnd, 1);
  	} else
  	{
! 		setFirstBeat(&(x->seq), 0, rnd, 1);
  		x->seq_initialized = 1;
  	}

Index: common.h
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/common.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** common.h	2 Dec 2005 12:18:12 -0000	1.4
--- common.h	2 Dec 2005 18:56:07 -0000	1.5
***************
*** 1,9 ****
  // here i put common data structures and functions
  
  // --------- theme notation
  
- // data structures
  
! typedef struct _note
  {
  	unsigned short int played; // 0 if is a rest, 1 if played
--- 1,15 ----
  // here i put common data structures and functions
  
+ // ------------------------------------------------ data structures
+ 
+ 
  // --------- theme notation
  
  
! typedef struct t_note t_note;
! typedef struct t_duration t_duration;
! typedef struct t_note_event t_note_event;
! 
! typedef struct t_note
  {
  	unsigned short int played; // 0 if is a rest, 1 if played
***************
*** 11,30 ****
  	unsigned short int diatonic; // 0 if is a note not belonging to this tonality
  	int interval; // semitones from prefious note
! } t_note;
! 
! typedef struct _duration
  {
  	int numerator; // like in music notation: in a 1/4 note the numerator is 1
  	int denominator; // like in music notation: in a 1/4 note the denominator is 4
! } t_duration;
! 
! typedef struct _note_event
  {
  	unsigned short int voice;
  	t_note note;
  	t_duration duration;
! 	struct t_note_event *previous; // this is a list, link to the previous element
! 	struct t_note_event *next;  // this is a list, link to the next element
! } t_note_event;
  
  
--- 17,34 ----
  	unsigned short int diatonic; // 0 if is a note not belonging to this tonality
  	int interval; // semitones from prefious note
! };
! typedef struct t_duration
  {
  	int numerator; // like in music notation: in a 1/4 note the numerator is 1
  	int denominator; // like in music notation: in a 1/4 note the denominator is 4
! };
! struct t_note_event
  {
  	unsigned short int voice;
  	t_note note;
  	t_duration duration;
! 	t_note_event *previous; // this is a list, link to the previous element
! 	t_note_event *next;  // this is a list, link to the next element
! };
  
  
***************
*** 33,40 ****
--- 37,46 ----
  // data structures
  
+ // this describes a rhythm
  typedef struct t_rhythm_event t_rhythm_event;
  struct t_rhythm_event
  {
  	unsigned short int voice;
+ 	unsigned short int played; // 0 if is a rest, 1 if played
  	t_duration duration;
  	t_rhythm_event *previous; // this is a list, link to the previous element
***************
*** 44,61 ****
  // rhythms memory graph
  
- 
  // list implementation
  // this implements a graph that stores the memory of the current rhythm sub-elements
  // list of links
  // the actual implementation will be an array of nodes, each node 
  typedef struct t_rhythm_memory_arc t_rhythm_memory_arc;
  typedef struct t_rhythm_memory_node t_rhythm_memory_node;
  // graph node
! typedef struct t_rhythm_memory_node
  {
  	t_duration duration;
  	t_rhythm_memory_arc *arcs; // the list of arcs to other nodes
  } ;
! // graph arc
  struct t_rhythm_memory_arc
  {
--- 50,68 ----
  // rhythms memory graph
  
  // list implementation
  // this implements a graph that stores the memory of the current rhythm sub-elements
  // list of links
  // the actual implementation will be an array of nodes, each node 
+ 
+ // this describes a probability transition table
  typedef struct t_rhythm_memory_arc t_rhythm_memory_arc;
  typedef struct t_rhythm_memory_node t_rhythm_memory_node;
  // graph node
! struct t_rhythm_memory_node
  {
  	t_duration duration;
  	t_rhythm_memory_arc *arcs; // the list of arcs to other nodes
  } ;
! // graph arc: related to t_rhythm_memory_node
  struct t_rhythm_memory_arc
  {
***************
*** 64,76 ****
  	t_rhythm_memory_arc *next_arc; // next link in the list
  } ;
! // it will be arranged in a heap list?
! 
! // add an arc to this node
! void add_t_rhythm_memory_arc(t_rhythm_memory_node *srcNode, t_rhythm_memory_node *dstNode);
  
  #define num_possible_denominators 11
  static unsigned short int possible_denominators[] = {1,2,3,4,6,8,12,16,18,24,32};
  
! // functions needed to fill and use the memory table
  
  // converts from integer to duration: used to know this table index
--- 71,106 ----
  	t_rhythm_memory_arc *next_arc; // next link in the list
  } ;
! // it will be arranged in a heap list.. ?
  
  #define num_possible_denominators 11
  static unsigned short int possible_denominators[] = {1,2,3,4,6,8,12,16,18,24,32};
  
! // this defines a space for rhythms, variations, transitions and representations
! typedef struct t_rhythm_memory_representation t_rhythm_memory_representation;
! typedef struct t_rhythm_memory_element t_rhythm_memory_element;
! // element of a list of rhythms
! struct t_rhythm_memory_element
! {
! 	t_rhythm_event *rhythm; // this rhythm
! 	t_rhythm_memory_element *next; // next element of the list
! } ;
! // a rhythm in memory, each rhythm is :
! // - a main rhythm
! // - its probability transition table
! // - similar rhythms played
! struct t_rhythm_memory_representation
! {
! 	t_rhythm_memory_element *main_rhythm;
! 	t_rhythm_memory_node *transitions;
! 	t_rhythm_memory_element *similar_rhythms;
! } ;
! 
! // ------------------------------------------------ functions
! 
! // ----------- rhythm manipolation functions
! 
! // TODO: 
! // - from data structures to lists of numbers and vice versa
! // - from a (voice, duration) representation to (voice, start, duration) and viceversa
  
  // converts from integer to duration: used to know this table index
***************
*** 83,92 ****
  int possible_durations();
  
- // ----------- rhythm manipolation functions
- 
- // TODO: 
- // - from data structures to lists of numbers and vice versa
- // - from a (voice, duration) representation to (voice, start, duration) and viceversa
- 
  // converts from float (0-1) to duration. it performs quantization
  t_duration float2duration(float fduration);
--- 113,116 ----
***************
*** 95,107 ****
  float duration2float(t_duration duration);
  
  // set the first beat of a sequence
! void setFirstBeat(t_rhythm_event **firstEvent, unsigned short int voice, float fduration);
  
  //adds a beat at the end of this list
! void concatenateBeat(t_rhythm_event *currentEvent, unsigned short int voice, float fduration);
  
  // used to free the memory allocated by this list
  void freeBeats(t_rhythm_event *currentEvent);
  
  // -------- notes manipulation functions
  
--- 119,158 ----
  float duration2float(t_duration duration);
  
+ // --- rhythms creation and manupulation functions
+ 
  // set the first beat of a sequence
! void setFirstBeat(t_rhythm_event **firstEvent, unsigned short int voice, float fduration, unsigned short int played);
  
  //adds a beat at the end of this list
! void concatenateBeat(t_rhythm_event *currentEvent, unsigned short int voice, float fduration, unsigned short int played);
  
  // used to free the memory allocated by this list
  void freeBeats(t_rhythm_event *currentEvent);
  
+ // change rhythm description protocol
+ 
+ // from (duration) to (start) style
+ // the (start) style is a list of noteon events, the order is not important
+ void swap_rhythm_to_start(t_rhythm_event *oldStyle, t_rhythm_event **newStyle);
+ 
+ // from (start) to (duration)
+ // the (duration) style is a linked list of duration of both notes or rests, the order is important
+ void swap_rhythm_to_duration(t_rhythm_event *oldStyle, t_rhythm_event **newStyle);
+ 
+ // --- memory representation of rhythms
+ 
+ // add an arc to this node
+ void add_t_rhythm_memory_arc(t_rhythm_memory_node *srcNode, t_rhythm_memory_node *dstNode);
+ 
+ // initialize this representation, allocates memory for the pointers
+ void init_rhythm_memory_representation(t_rhythm_memory_representation *this_rep);
+ 
+ // add a new rhythm in the list of similar rhythms related to one main rhythm
+ void add_similar_rhythm(t_rhythm_memory_representation *this_rep, t_rhythm_event *new_rhythm);
+ 
+ // functions needed to fill and use the memory table
+ 
+ 
+ 
  // -------- notes manipulation functions
  

Index: common.c
===================================================================
RCS file: /cvsroot/pure-data/externals/frankenstein/common.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** common.c	2 Dec 2005 12:18:12 -0000	1.4
--- common.c	2 Dec 2005 18:56:07 -0000	1.5
***************
*** 101,105 ****
  }
  
! void setFirstBeat(t_rhythm_event **firstEvent, unsigned short int voice, float fduration)
  {
  	t_duration res;
--- 101,105 ----
  }
  
! void setFirstBeat(t_rhythm_event **firstEvent, unsigned short int voice, float fduration, unsigned short int played)
  {
  	t_duration res;
***************
*** 113,116 ****
--- 113,117 ----
  	newElement->next = 0;
  	newElement->voice=voice;
+ 	newElement->played=played;
  	newElement->duration.numerator = res.numerator;
  	newElement->duration.denominator = res.denominator;
***************
*** 118,122 ****
  }
  
! void concatenateBeat(t_rhythm_event *currentEvent, unsigned short int voice, float fduration)
  {
  	t_duration res;
--- 119,123 ----
  }
  
! void concatenateBeat(t_rhythm_event *currentEvent, unsigned short int voice, float fduration, unsigned short int played)
  {
  	t_duration res;
***************
*** 134,137 ****
--- 135,139 ----
  	lastElement->next = newElement;
  	newElement->voice=voice;
+ 	newElement->played=played;
  	newElement->duration.numerator = res.numerator;
  	newElement->duration.denominator = res.denominator;
***************
*** 166,170 ****
  	// create a new arc
  	newArc = (t_rhythm_memory_arc *) malloc(sizeof(t_rhythm_memory_arc));
! 	newArc->to_note = dstNode;
  	newArc->weight = 1;
  	// go to the last arc in the list
--- 168,172 ----
  	// create a new arc
  	newArc = (t_rhythm_memory_arc *) malloc(sizeof(t_rhythm_memory_arc));
! 	newArc->to_node = dstNode;
  	newArc->weight = 1;
  	// go to the last arc in the list
***************
*** 184,187 ****
--- 186,291 ----
  }
  
+ // initialize this representation, allocates memory for the pointers
+ void init_rhythm_memory_representation(t_rhythm_memory_representation *this_rep)
+ {
+ 	this_rep->transitions = (t_rhythm_memory_node *) malloc(sizeof(t_rhythm_memory_node) * possible_durations());
+ 	this_rep->main_rhythm = 0;
+ 	this_rep->similar_rhythms = 0;
+ }
+ 
+ // add a new rhythm in the list of similar thythms related to one main rhythm
+ void add_t_rhythm_memory_element(t_rhythm_memory_representation *this_rep, t_rhythm_event *new_rhythm)
+ {
+ 	t_rhythm_memory_element *curr;
+ 	t_rhythm_memory_element *newElement;
+ 	// creates a new element of the list of similar rhythms
+ 	newElement = (t_rhythm_memory_element *) malloc(sizeof(t_rhythm_memory_element));
+ 	newElement->rhythm = new_rhythm;
+ 	newElement->next = 0;
+ 	// finds the last element and adds itself
+ 	curr = this_rep->similar_rhythms;
+ 	if (curr)
+ 	{
+ 		while (curr->next)
+ 			curr=curr->next;
+ 		curr->next = newElement;
+ 
+ 	} else
+ 	{
+ 		this_rep->similar_rhythms = newElement;
+ 	}
+ 
+ 
+ }
+ 
+ // from (duration) to (start) style
+ void swap_rhythm_to_start(t_rhythm_event *oldStyle, t_rhythm_event **newStyle)
+ {
+ 	t_rhythm_event *oldCurr, *newElement, *oldPrev;
+ 	float diff, currMoment;
+ 	t_duration dur_tmp;
+ 
+ 	// allocate the first event
+ 	oldCurr = oldStyle;
+ 	oldPrev = 0;
+ 	currMoment = 0;
+ 	
+ 	// look for the first beat played in old rhythm
+ 	while (oldCurr && (! (oldCurr->played)))
+ 	{
+ 		// prepare for the next event
+ 		dur_tmp.numerator = oldCurr->duration.numerator;
+ 		dur_tmp.denominator = oldCurr->duration.denominator;
+ 		currMoment = duration2float(dur_tmp);
+ 		oldPrev = oldCurr;
+ 		oldCurr = oldCurr->next;
+ 	}
+ 
+ 	if (currMoment == 0)
+ 		return; // empty rhythm?!?
+ 
+ 	// now in currMoment there is the moment of the first played beat
+ 	// i can set the first one and initialize the new style
+ 	newElement = (t_rhythm_event *) malloc(sizeof(t_rhythm_event));
+ 	*newStyle = newElement;
+ 	dur_tmp = float2duration(currMoment);
+ 	newElement->duration.numerator = dur_tmp.numerator;
+ 	newElement->duration.denominator = dur_tmp.denominator;
+ 	newElement->previous = oldPrev;
+ 	if (oldPrev)
+ 		oldPrev->next = newElement;
+ 
+ 	while (oldCurr)
+ 	{
+ 		if (oldCurr->played)
+ 		{
+ 			// allocate a new element
+ 			newElement = (t_rhythm_event *) malloc(sizeof(t_rhythm_event));
+ 			// set its value
+ 			dur_tmp = float2duration(currMoment);
+ 			newElement->duration.numerator = dur_tmp.numerator;
+ 			newElement->duration.denominator = dur_tmp.denominator;
+ 			newElement->previous = oldPrev;
+ 			if (oldPrev)
+ 				oldPrev->next = newElement;
+ 		}
+ 		// prepare for the next event
+ 		dur_tmp.numerator = oldCurr->duration.numerator;
+ 		dur_tmp.denominator = oldCurr->duration.denominator;
+ 		currMoment = duration2float(dur_tmp);
+ 		oldPrev = oldCurr;
+ 		oldCurr = oldCurr->next;
+ 	}
+ 
+ 
+ }
+ 
+ // from (start) to (duration) style
+ void swap_rhythm_to_duration(t_rhythm_event *oldStyle, t_rhythm_event **newStyle)
+ {
+ 
+ }
+ 
+ 
  // ------------------- themes manipulation functions
  
***************
*** 219,223 ****
  	res = float2duration(fduration);
  	// allocate a new element of the list
! 	newElement = (t_rhythm_event *) malloc(sizeof(t_note_event));
  	// set the pointers
  	newElement->previous = lastElement;
--- 323,327 ----
  	res = float2duration(fduration);
  	// allocate a new element of the list
! 	newElement = (t_note_event *) malloc(sizeof(t_note_event));
  	// set the pointers
  	newElement->previous = lastElement;





More information about the Pd-cvs mailing list