Update of /cvsroot/pure-data/externals/frankenstein In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19423
Modified Files: Makefile common.c common.h Log Message: changed from durations to start style
Index: Makefile =================================================================== RCS file: /cvsroot/pure-data/externals/frankenstein/Makefile,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Makefile 3 Dec 2005 01:49:01 -0000 1.3 --- Makefile 4 Dec 2005 02:03:40 -0000 1.4 *************** *** 2,7 **** #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"
--- 2,7 ---- #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"
Index: common.h =================================================================== RCS file: /cvsroot/pure-data/externals/frankenstein/common.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** common.h 3 Dec 2005 01:49:01 -0000 1.6 --- common.h 4 Dec 2005 02:03:40 -0000 1.7 *************** *** 13,17 **** typedef struct t_note { - unsigned short int played; // 0 if is a rest, 1 if played unsigned short int chord; // 0 if is not a chord (strong) note, 1 if it is unsigned short int diatonic; // 0 if is a note not belonging to this tonality --- 13,16 ---- *************** *** 27,31 **** 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 --- 26,31 ---- unsigned short int voice; t_note note; ! t_duration start; // moment of the noteon event ! t_duration duration; // duration of this event 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 *************** *** 42,47 **** { 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 t_rhythm_event *next; // this is a list, link to the next element --- 42,47 ---- { unsigned short int voice; ! t_duration start; // moment of the noteon event ! t_duration duration; // duration of this event t_rhythm_event *previous; // this is a list, link to the previous element t_rhythm_event *next; // this is a list, link to the next element *************** *** 61,65 **** struct t_rhythm_memory_node { ! t_duration duration; t_rhythm_memory_arc *arcs; // the list of arcs to other nodes } ; --- 61,70 ---- struct t_rhythm_memory_node { ! // start is implicit: ! // this is in an array ! // use int2duration and duration2int ! // against the index in the array to get its value ! unsigned short int first; // how many times this has been the first event ! unsigned short int weight; // how many times this has been an event t_rhythm_memory_arc *arcs; // the list of arcs to other nodes } ; *************** *** 67,72 **** struct t_rhythm_memory_arc { ! unsigned short int weight; ! t_rhythm_memory_node *to_node; // the target of this link (arc) t_rhythm_memory_arc *next_arc; // next link in the list } ; --- 72,76 ---- struct t_rhythm_memory_arc { ! unsigned short int to_node_index; // the target of this link (arc) t_rhythm_memory_arc *next_arc; // next link in the list } ; *************** *** 79,82 **** --- 83,87 ---- typedef struct t_rhythm_memory_representation t_rhythm_memory_representation; typedef struct t_rhythm_memory_element t_rhythm_memory_element; + typedef struct t_rhythm_memory_first_node t_rhythm_memory_first_node; // element of a list of rhythms struct t_rhythm_memory_element *************** *** 93,96 **** --- 98,102 ---- t_rhythm_memory_element *main_rhythm; t_rhythm_memory_node *transitions; + unsigned short int max_weight; t_rhythm_memory_element *similar_rhythms; } ; *************** *** 100,107 **** // ----------- 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 // what corresponds in terms of duration --- 106,109 ---- *************** *** 122,150 ****
// 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 --- 124,144 ----
// set the first beat of a sequence ! // this also creates a new rhythm ! void setFirstBeat(t_rhythm_event **firstEvent, unsigned short int voice, float fstart, float fduration);
//adds a beat at the end of this list ! void concatenateBeat(t_rhythm_event *currentEvent, unsigned short int voice, float fstart, float fduration);
// used to free the memory allocated by this list void freeBeats(t_rhythm_event *currentEvent);
// --- memory representation of rhythms
// add an arc to this node ! void add_t_rhythm_memory_arc(t_rhythm_memory_node *srcNode, unsigned short int dstNode);
! // create and initialize this representation, allocate memory for the pointers ! void create_rhythm_memory_representation(t_rhythm_memory_representation **this_rep);
// add a new rhythm in the list of similar rhythms related to one main rhythm *************** *** 154,159 **** void free_memory_representation(t_rhythm_memory_representation *this_rep);
! // functions needed to fill and use the memory table !
--- 148,154 ---- void free_memory_representation(t_rhythm_memory_representation *this_rep);
! // compares this rhythm to this representation ! // and tells you how close it is to it ! // TODO !!!!!!!!!!!!!!!!!!
*************** *** 161,168 ****
// set the first beat of a sequence ! void setFirstNote(t_note_event **firstEvent, unsigned short int voice, float fduration, t_note note);
//adds a beat at the end of this list ! void concatenateNote(t_note_event *currentEvent, unsigned short int voice, float fduration, t_note note);
// used to free the memory allocated by this list --- 156,163 ----
// set the first beat of a sequence ! void setFirstNote(t_note_event **firstEvent, unsigned short int voice, float fstart, float fduration, t_note note);
//adds a beat at the end of this list ! void concatenateNote(t_note_event *currentEvent, unsigned short int voice, float fstart, float fduration, t_note note);
// used to free the memory allocated by this list
Index: common.c =================================================================== RCS file: /cvsroot/pure-data/externals/frankenstein/common.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** common.c 3 Dec 2005 01:49:01 -0000 1.6 --- common.c 4 Dec 2005 02:03:40 -0000 1.7 *************** *** 101,105 **** }
! void setFirstBeat(t_rhythm_event **firstEvent, unsigned short int voice, float fduration, unsigned short int played) { t_duration res; --- 101,105 ---- }
! void setFirstBeat(t_rhythm_event **firstEvent, unsigned short int voice, float fstart, float fduration) { t_duration res; *************** *** 113,123 **** newElement->next = 0; newElement->voice=voice; - newElement->played=played; newElement->duration.numerator = res.numerator; newElement->duration.denominator = res.denominator; *firstEvent = newElement; }
! void concatenateBeat(t_rhythm_event *currentEvent, unsigned short int voice, float fduration, unsigned short int played) { t_duration res; --- 113,125 ---- newElement->next = 0; newElement->voice=voice; newElement->duration.numerator = res.numerator; newElement->duration.denominator = res.denominator; + res = float2duration(fstart); + newElement->start.numerator = res.numerator; + newElement->start.denominator = res.denominator; *firstEvent = newElement; }
! void concatenateBeat(t_rhythm_event *currentEvent, unsigned short int voice, float fstart, float fduration) { t_duration res; *************** *** 135,142 **** lastElement->next = newElement; newElement->voice=voice; - newElement->played=played; newElement->duration.numerator = res.numerator; newElement->duration.denominator = res.denominator; ! }
--- 137,145 ---- lastElement->next = newElement; newElement->voice=voice; newElement->duration.numerator = res.numerator; newElement->duration.denominator = res.denominator; ! res = float2duration(fstart); ! newElement->start.numerator = res.numerator; ! newElement->start.denominator = res.denominator; }
*************** *** 161,165 **** }
! void add_t_rhythm_memory_arc(t_rhythm_memory_node *srcNode, t_rhythm_memory_node *dstNode) { t_rhythm_memory_arc *newArc; --- 164,168 ---- }
! void add_t_rhythm_memory_arc(t_rhythm_memory_node *srcNode, unsigned short int dstNode) { t_rhythm_memory_arc *newArc; *************** *** 168,173 **** // 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 // and add this arc as the last --- 171,175 ---- // create a new arc newArc = (t_rhythm_memory_arc *) malloc(sizeof(t_rhythm_memory_arc)); ! newArc->to_node_index = dstNode; // go to the last arc in the list // and add this arc as the last *************** *** 187,195 ****
// 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; }
--- 189,208 ----
// initialize this representation, allocates memory for the pointers ! void create_rhythm_memory_representation(t_rhythm_memory_representation **this_rep) { ! int i; ! // allocate space for the data structure ! *this_rep = (t_rhythm_memory_representation *)malloc(sizeof(t_rhythm_memory_representation)); ! // space for transitions ! (*this_rep)->transitions = (t_rhythm_memory_node *) malloc(sizeof(t_rhythm_memory_node) * possible_durations()); ! // initialize transitions ! for (i=0; i<possible_durations(); i++) ! { ! (*this_rep)->transitions[i].first=0; ! (*this_rep)->transitions[i].weight=0; ! (*this_rep)->transitions[i].arcs=0; ! } ! (*this_rep)->main_rhythm = 0; ! (*this_rep)->similar_rhythms = 0; }
*************** *** 199,202 **** --- 212,219 ---- t_rhythm_memory_element *curr; t_rhythm_memory_element *newElement; + t_rhythm_event *currEvent; + t_rhythm_memory_arc *currArc, *newArc, *prevArc; + unsigned short int last; + int i, arcFound; // creates a new element of the list of similar rhythms newElement = (t_rhythm_memory_element *) malloc(sizeof(t_rhythm_memory_element)); *************** *** 216,288 **** } // now update the transition table.. ! } ! ! // from (duration) to (start) style ! void swap_rhythm_to_start(t_rhythm_event *oldStyle, t_rhythm_event **newStyle) ! { ! t_rhythm_event *oldCurr, *newElement, *oldPrev, *newPrev; ! float diff, currMoment; ! t_duration dur_tmp; ! ! // allocate the first event ! oldCurr = oldStyle; ! oldPrev = 0; ! currMoment = 0; ! newPrev = 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 = newPrev; ! newPrev = 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 = newPrev; ! if (newPrev) ! newPrev->next = newElement; ! newPrev = 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) - { - - } - void free_memory_representation(t_rhythm_memory_representation *this_rep) { --- 233,293 ---- } // now update the transition table.. ! currEvent = new_rhythm; ! // set the first event.. ! i = duration2int(new_rhythm->start); ! this_rep->transitions[i].first++; ! last = 0; ! while (currEvent) { ! // get the duration and translate into an int ! i = duration2int(currEvent->start); ! if (last) // NB if last==0 then last is not set { ! // add an arc between last and i ! currArc = this_rep->transitions[last].arcs; ! arcFound=0; ! // is this arc rpesent? ! // also i need to get to the last element of the lsit ! while (currArc) ! { ! // for each arc in the list ! if (currArc->to_node_index == i) ! { ! // this arc is already present ! arcFound=1; ! } ! prevArc = currArc; // last valid arc ! currArc = currArc->next_arc; ! } ! if (!arcFound) ! { ! // this arc was not present, add it! ! newArc = (t_rhythm_memory_arc *) malloc(sizeof(t_rhythm_memory_arc)); ! newArc->next_arc = 0; ! newArc->to_node_index = i; // set my destination ! if (this_rep->transitions[last].arcs) ! { ! // this is not the first arc ! // then prevArc is set and valid ! prevArc->next_arc = newArc; ! } else ! { ! // this is the first arc ! this_rep->transitions[last].arcs = newArc; ! } ! } } ! // increment the weight ! this_rep->transitions[i].weight++; ! if (this_rep->transitions[i].weight > this_rep->max_weight) ! { ! // a new champion! ! this_rep->max_weight = this_rep->transitions[i].weight; ! } ! last = i; ! currEvent = currEvent->next; } }
void free_memory_representation(t_rhythm_memory_representation *this_rep) { *************** *** 327,331 ****
// set the first note of a sequence ! void setFirstNote(t_note_event **firstEvent, unsigned short int voice, float fduration, t_note note) { t_duration res; --- 332,336 ----
// set the first note of a sequence ! void setFirstNote(t_note_event **firstEvent, unsigned short int voice, float fstart, float fduration, t_note note) { t_duration res; *************** *** 339,343 **** newElement->next = 0; newElement->voice=voice; - newElement->note.played = note.played; newElement->note.chord = note.chord; newElement->note.diatonic = note.diatonic; --- 344,347 ---- *************** *** 345,353 **** newElement->duration.numerator = res.numerator; newElement->duration.denominator = res.denominator; *firstEvent = newElement; }
//adds a note at the end of this list ! void concatenateNote(t_note_event *currentEvent, unsigned short int voice, float fduration, t_note note) { t_duration res; --- 349,360 ---- newElement->duration.numerator = res.numerator; newElement->duration.denominator = res.denominator; + res = float2duration(fstart); + newElement->start.numerator = res.numerator; + newElement->start.denominator = res.denominator; *firstEvent = newElement; }
//adds a note at the end of this list ! void concatenateNote(t_note_event *currentEvent, unsigned short int voice, float fstart, float fduration, t_note note) { t_duration res; *************** *** 365,369 **** lastElement->next = newElement; newElement->voice=voice; - newElement->note.played = note.played; newElement->note.chord = note.chord; newElement->note.diatonic = note.diatonic; --- 372,375 ---- *************** *** 371,375 **** newElement->duration.numerator = res.numerator; newElement->duration.denominator = res.denominator; ! }
--- 377,383 ---- newElement->duration.numerator = res.numerator; newElement->duration.denominator = res.denominator; ! res = float2duration(fstart); ! newElement->start.numerator = res.numerator; ! newElement->start.denominator = res.denominator; }