[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