@@ -33,16 +33,25 @@ bytestreamToUMP::bytestreamToUMP(){
33
33
clear (rpnMsb, 255 , sizeof (rpnMsb));
34
34
clear (rpnLsb, 255 , sizeof (rpnLsb));
35
35
}
36
+
37
+ void bytestreamToUMP::increaseWrite ()
38
+ {
39
+ bufferLength++;
40
+ writeIndex++;
41
+ if (writeIndex == BSTOUMP_BUFFER) {
42
+ writeIndex = 0 ;
43
+ }
44
+ }
36
45
37
46
void bytestreamToUMP::bsToUMP (uint8_t b0, uint8_t b1, uint8_t b2){
38
47
uint8_t status = b0 & 0xF0 ;
39
48
40
- if (d0 >= TIMING_CODE){
41
- umpMess[messPos ] = ((UMP_SYSTEM << 4 ) + defaultGroup + 0L ) << 24 ;
42
- umpMess[messPos ] += (b0 + 0L ) << 16 ;
43
- umpMess[messPos ] += b1 << 8 ;
44
- umpMess[messPos ] += b2;
45
- messPos++ ;
49
+ if (b0 >= TIMING_CODE){
50
+ umpMess[writeIndex ] = ((UMP_SYSTEM << 4 ) + defaultGroup + 0L ) << 24 ;
51
+ umpMess[writeIndex ] += (b0 + 0L ) << 16 ;
52
+ umpMess[writeIndex ] += b1 << 8 ;
53
+ umpMess[writeIndex ] += b2;
54
+ increaseWrite () ;
46
55
}else if (status>=NOTE_OFF && status<=PITCH_BEND){
47
56
if (outputMIDI2){
48
57
uint8_t channel = b0 & 0xF ;
@@ -52,25 +61,35 @@ void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
52
61
b2 = 0x40 ;
53
62
}
54
63
55
- umpMess[messPos ] = ((UMP_M2CVM << 4 ) + defaultGroup + 0L ) << 24 ;
56
- umpMess[messPos ] += (status + channel + 0L )<<16 ;
64
+ umpMess[writeIndex ] = ((UMP_M2CVM << 4 ) + defaultGroup + 0L ) << 24 ;
65
+ umpMess[writeIndex ] += (status + channel + 0L )<<16 ;
57
66
58
67
if (status==NOTE_ON || status==NOTE_OFF){
59
- umpMess[messPos] += (b1 + 0L ) <<8 ;
60
- umpMess[messPos+1 ] = (M2Utils::scaleUp (b2,7 ,16 ) << 16 );
68
+ umpMess[writeIndex] += (b1 + 0L ) <<8 ;
69
+ increaseWrite ();
70
+ umpMess[writeIndex] = (M2Utils::scaleUp (b2,7 ,16 ) << 16 );
71
+ increaseWrite ();
61
72
} else if (status == KEY_PRESSURE){
62
- umpMess[messPos] += (b1 + 0L ) <<8 ;
63
- umpMess[messPos+1 ] = M2Utils::scaleUp (b2,7 ,32 );
73
+ umpMess[writeIndex] += (b1 + 0L ) <<8 ;
74
+ increaseWrite ();
75
+ umpMess[writeIndex] = (M2Utils::scaleUp (b2,7 ,16 ) << 16 );
76
+ increaseWrite ();
64
77
} else if (status == PITCH_BEND){
65
- umpMess[messPos+1 ] = M2Utils::scaleUp ((b1<<7 ) + b2,14 ,32 );
78
+ increaseWrite ();
79
+ umpMess[writeIndex] = M2Utils::scaleUp ((b1<<7 ) + b2,14 ,32 );
80
+ increaseWrite ();
66
81
} else if (status == PROGRAM_CHANGE){
67
82
if (bankMSB[channel]!=255 && bankLSB[channel]!=255 ){
68
- umpMess[messPos] += 1 ;
69
- umpMess[messPos+1 ] += (bankMSB[channel] <<8 ) + bankLSB[channel ];
83
+ umpMess[writeIndex] += 1 ;
84
+ increaseWrite ();
85
+ umpMess[writeIndex] += (bankMSB[channel] <<8 ) + bankLSB[channel ];
70
86
}
71
- umpMess[messPos+1 ] += (b1 + 0L ) << 24 ;
87
+ umpMess[writeIndex] += (b1 + 0L ) << 24 ;
88
+ increaseWrite ();
72
89
} else if (status == CHANNEL_PRESSURE){
73
- umpMess[messPos+1 ] = M2Utils::scaleUp (b1,7 ,32 );
90
+ increaseWrite ();
91
+ umpMess[writeIndex] = M2Utils::scaleUp (b1,7 ,32 );
92
+ increaseWrite ();
74
93
} else if (status == CC){
75
94
switch (b1){
76
95
case 0 :
@@ -88,10 +107,12 @@ void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
88
107
if (rpnMode[channel] && rpnMsb[channel] == 0 && (rpnLsb[channel] == 0 || rpnLsb[channel] == 6 )){
89
108
status = rpnMode[channel]? RPN: NRPN;
90
109
91
- umpMess[messPos] = ((UMP_M2CVM << 4 ) + defaultGroup + 0L ) << 24 ;
92
- umpMess[messPos] += (status + channel + 0L )<<16 ;
93
- umpMess[messPos] += ((int )rpnMsb[channel]<<7 ) + rpnLsb[channel] + 0L ;
94
- umpMess[messPos+1 ] = M2Utils::scaleUp (((int )b2<<7 ),14 ,32 );
110
+ umpMess[writeIndex] = ((UMP_M2CVM << 4 ) + defaultGroup + 0L ) << 24 ;
111
+ umpMess[writeIndex] += (status + channel + 0L )<<16 ;
112
+ umpMess[writeIndex] += ((int )rpnMsb[channel]<<7 ) + rpnLsb[channel] + 0L ;
113
+ increaseWrite ();
114
+ umpMess[writeIndex] = M2Utils::scaleUp (((int )b2<<7 ),14 ,32 );
115
+ increaseWrite ();
95
116
96
117
}else {
97
118
rpnMsbValue[channel] = b2;
@@ -104,10 +125,12 @@ void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
104
125
}
105
126
status = rpnMode[channel]? RPN: NRPN;
106
127
107
- umpMess[messPos] = ((UMP_M2CVM << 4 ) + defaultGroup + 0L ) << 24 ;
108
- umpMess[messPos] += (status + channel + 0L )<<16 ;
109
- umpMess[messPos] += ((int )rpnMsb[channel]<<7 ) + rpnLsb[channel] + 0L ;
110
- umpMess[messPos+1 ] = M2Utils::scaleUp (((int )rpnMsbValue[channel]<<7 ) + b2,14 ,32 );
128
+ umpMess[writeIndex] = ((UMP_M2CVM << 4 ) + defaultGroup + 0L ) << 24 ;
129
+ umpMess[writeIndex] += (status + channel + 0L )<<16 ;
130
+ umpMess[writeIndex] += ((int )rpnMsb[channel]<<7 ) + rpnLsb[channel] + 0L ;
131
+ increaseWrite ();
132
+ umpMess[writeIndex] = M2Utils::scaleUp (((int )rpnMsbValue[channel]<<7 ) + b2,14 ,32 );
133
+ increaseWrite ();
111
134
break ;
112
135
case 99 :
113
136
rpnMode[channel] = false ;
@@ -128,42 +151,47 @@ void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
128
151
return ;
129
152
130
153
default :
131
- umpMess[messPos] += (b1 + 0L ) <<8 ;
132
- umpMess[messPos+1 ] = M2Utils::scaleUp (b2,7 ,32 );
154
+ umpMess[writeIndex] += (b1 + 0L ) <<8 ;
155
+ increaseWrite ();
156
+ umpMess[writeIndex] = M2Utils::scaleUp (b2,7 ,32 );
157
+ increaseWrite ();
133
158
break ;
134
159
}
135
160
}
136
- messPos+= 2 ;
161
+
137
162
138
- } else {
139
- umpMess[messPos] = ((UMP_M1CVM << 4 ) + defaultGroup + 0L ) << 24 ;
140
- umpMess[messPos] += (b0 + 0L ) << 16 ;
141
- umpMess[messPos] += b1 << 8 ;
142
- umpMess[messPos] += b2;
143
- messPos++;
163
+ }
164
+ else {
165
+ umpMess[writeIndex] = ((UMP_M1CVM << 4 ) + defaultGroup + 0L ) << 24 ;
166
+ umpMess[writeIndex] += (b0 + 0L ) << 16 ;
167
+ umpMess[writeIndex] += b1 << 8 ;
168
+ umpMess[writeIndex] += b2;
169
+ increaseWrite ();
144
170
}
145
171
}
146
172
}
147
173
148
174
149
175
bool bytestreamToUMP::availableUMP (){
150
- return messPos ;
176
+ return bufferLength ;
151
177
}
152
178
153
179
uint32_t bytestreamToUMP::readUMP (){
154
- uint32_t mess = umpMess[0 ];
155
- for (uint8_t i=0 ;i<messPos;i++){
156
- umpMess[i]=umpMess[i+1 ];
180
+ uint32_t mess = umpMess[readIndex];
181
+ bufferLength--; // Decrease buffer size after reading
182
+ readIndex++;
183
+ if (readIndex == BSTOUMP_BUFFER) {
184
+ readIndex = 0 ;
157
185
}
158
- messPos--;
159
186
160
187
return mess;
161
188
}
162
189
163
190
164
191
void bytestreamToUMP::bytestreamParse (uint8_t midi1Byte){
165
192
166
- if (midi1Byte == TUNEREQUEST || midi1Byte >= TIMINGCLOCK) {
193
+ if (midi1Byte == TUNEREQUEST || midi1Byte >= TIMINGCLOCK) {
194
+ d0 = midi1Byte;
167
195
bsToUMP (midi1Byte,0 ,0 );
168
196
return ;
169
197
}
@@ -178,35 +206,37 @@ void bytestreamToUMP::bytestreamParse(uint8_t midi1Byte){
178
206
}else
179
207
if (midi1Byte == SYSEX_STOP){
180
208
181
- umpMess[messPos] = ((UMP_SYSEX7 << 4 ) + defaultGroup + 0L ) << 24 ;
182
- umpMess[messPos] += ((sysex7State == 1 ?0 :3 ) + 0L ) << 20 ;
183
- umpMess[messPos] += ((sysex7Pos + 0L ) << 16 ) ;
184
- umpMess[messPos++] += (sysex[0 ] << 8 ) + sysex[1 ];
185
- umpMess[messPos++] = ((sysex[2 ] + 0L ) << 24 ) + ((sysex[3 ] + 0L )<< 16 ) + (sysex[4 ] << 8 ) + sysex[5 ];
209
+ umpMess[writeIndex] = ((UMP_SYSEX7 << 4 ) + defaultGroup + 0L ) << 24 ;
210
+ umpMess[writeIndex] += ((sysex7State == 1 ?0 :3 ) + 0L ) << 20 ;
211
+ umpMess[writeIndex] += ((sysex7Pos + 0L ) << 16 ) ;
212
+ umpMess[writeIndex] += (sysex[0 ] << 8 ) + sysex[1 ];
213
+ increaseWrite ();
214
+ umpMess[writeIndex] = ((sysex[2 ] + 0L ) << 24 ) + ((sysex[3 ] + 0L )<< 16 ) + (sysex[4 ] << 8 ) + sysex[5 ];
215
+ increaseWrite ();
186
216
187
217
sysex7State = 0 ;
188
218
clear (sysex, 0 , sizeof (sysex));
189
219
}
190
- } else
191
- if (sysex7State >= 1 ){
192
- // Check IF new UMP Message Type 3
193
- if (sysex7Pos% 6 == 0 && sysex7Pos != 0 ){
194
- umpMess[messPos] = ((UMP_SYSEX7 << 4 ) + defaultGroup + 0L ) << 24 ;
195
- umpMess[messPos ] += (sysex7State + 0L ) << 20 ;
196
- umpMess[messPos ] += 6L << 16 ;
197
- umpMess[messPos++] += (sysex[ 0 ] << 8 ) + sysex[ 1 ] ;
198
- umpMess[messPos++ ] = ((sysex[2 ] + 0L ) << 24 ) + ((sysex[3 ] + 0L )<< 16 ) + (sysex[4 ] << 8 ) + sysex[5 ] + 0L ;
199
- clear (sysex, 0 , sizeof (sysex) );
200
- sysex7State= 2 ;
201
- sysex7Pos= 0 ;
202
- }
203
-
204
- sysex[sysex7Pos] = midi1Byte;
205
- sysex7Pos++ ;
206
- } else
207
- if (d1 != 255 ) { // Second byte
208
- bsToUMP (d0, d1, midi1Byte);
209
- d1 = 255 ;
220
+ } else if (sysex7State >= 1 ){
221
+ // Check IF new UMP Message Type 3
222
+ if (sysex7Pos% 6 == 0 && sysex7Pos != 0 ){
223
+ umpMess[writeIndex] = ((UMP_SYSEX7 << 4 ) + defaultGroup + 0L ) << 24 ;
224
+ umpMess[writeIndex] += (sysex7State + 0L ) << 20 ;
225
+ umpMess[writeIndex ] += 6L << 16 ;
226
+ umpMess[writeIndex ] += (sysex[ 0 ] << 8 ) + sysex[ 1 ] ;
227
+ increaseWrite () ;
228
+ umpMess[writeIndex ] = ((sysex[2 ] + 0L ) << 24 ) + ((sysex[3 ] + 0L )<< 16 ) + (sysex[4 ] << 8 ) + sysex[5 ] + 0L ;
229
+ increaseWrite ( );
230
+ clear (sysex, 0 , sizeof (sysex)) ;
231
+ sysex7State= 2 ;
232
+ sysex7Pos= 0 ;
233
+ }
234
+
235
+ sysex[sysex7Pos] = midi1Byte ;
236
+ sysex7Pos++;
237
+ } else if (d1 != 255 ) { // Second byte
238
+ bsToUMP (d0, d1, midi1Byte);
239
+ d1 = 255 ;
210
240
} else if (d0){ // status byte set
211
241
if (
212
242
(d0 & 0xF0 ) == PROGRAM_CHANGE
0 commit comments