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;