1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
#include "common.h"
#include <math.h>
#include <stdlib.h>
#include "m_pd.h" // to post errors and debug messages
t_duration int2duration(int n)
{
t_duration dur;
int curr, i, j, ok, currden;
curr=0;
ok=0;
for (i=0; i<num_possible_denominators; i++)
{
currden = possible_denominators[i];
for (j=0; j<currden; j++)
{
if (curr==n)
{
dur.numerator=j;
dur.denominator=currden;
j=currden;
i=num_possible_denominators;
ok=1;
} else
curr++;
}
}
if (ok)
return dur;
else
{
dur.numerator=1;
dur.denominator=1;
return dur;
}
}
unsigned short int duration2int(t_duration dur)
{
unsigned short int curr, i, j;
curr=0;
for (i=0; i<num_possible_denominators; i++)
{
for (j=0; j<i; j++)
{
if ((dur.numerator==j) && (dur.denominator==i))
{
return curr;
} else
curr++;
}
}
return curr+1;
}
int possible_durations()
{
int ris, i;
ris = 0;
for (i=0; i<num_possible_denominators; i++)
{
ris += possible_denominators[i]-1;
}
ris += 1;
return ris;
}
t_duration float2duration(float fduration)
{
float minDiff, currfduration, currDiff;
int i, maxi;
t_duration currDur, bestDur;
bestDur.numerator=1;
bestDur.denominator=1;
minDiff = 1;
maxi = possible_durations();
for (i=0; i<maxi; i++)
{
// post("i=%i", i);
currDur = int2duration(i);
// post("currDur=%i/%i", currDur.numerator, currDur.denominator);
currfduration = duration2float(currDur);
// post("currfduration=%f", currfduration);
currDiff = (float) fabs(fduration - currfduration);
if (currDiff<=minDiff)
{
minDiff = currDiff;
bestDur = currDur;
}
}
return bestDur;
}
float duration2float(t_duration duration)
{
return (float) (((float)duration.numerator) / ((float)duration.denominator));
}
void setFirstBeat(t_rhythm_event **firstEvent, unsigned short int voice, float fduration)
{
t_duration res;
t_rhythm_event *newElement;
// convert from float to duration
res = float2duration(fduration);
// allocate a new element of the list
newElement = malloc(sizeof(t_rhythm_event));
// set the pointers
newElement->previous = 0;
newElement->next = 0;
newElement->voice=voice;
newElement->duration.numerator = res.numerator;
newElement->duration.denominator = res.denominator;
*firstEvent = newElement;
}
void concatenateBeat(t_rhythm_event *currentEvent, unsigned short int voice, float fduration)
{
t_duration res;
t_rhythm_event *newElement, *lastElement;
lastElement = currentEvent;
while(lastElement->next)
lastElement = lastElement->next;
// convert from float to duration
res = float2duration(fduration);
// allocate a new element of the list
newElement = (t_rhythm_event *) malloc(sizeof(t_rhythm_event));
// set the pointers
newElement->previous = lastElement;
newElement->next = 0;
lastElement->next = newElement;
newElement->voice=voice;
newElement->duration.numerator = res.numerator;
newElement->duration.denominator = res.denominator;
}
void freeBeats(t_rhythm_event *currentEvent)
{
t_rhythm_event *prev;
t_rhythm_event *next;
// go to the first element of the list
while(currentEvent->previous)
currentEvent = currentEvent->previous;
// now free each element
next=currentEvent->next;
do
{
prev = currentEvent;
next = currentEvent->next;
free(currentEvent);
} while(next);
}
|