Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 49e37f8

Browse files
author
Andrew Mee
committed
Move to Circular buffer on M1/M2 conversions - speeds up code
Fixed bug in byte stream to UMP Added initial test file
1 parent 878ea3a commit 49e37f8

File tree

7 files changed

+383
-189
lines changed

7 files changed

+383
-189
lines changed

include/bytestreamToUMP.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#ifndef BSUMP_H
2222
#define BSUMP_H
2323

24+
#define BSTOUMP_BUFFER 4
25+
2426

2527
#include <cstdint>
2628

@@ -34,8 +36,7 @@ class bytestreamToUMP{
3436
uint8_t sysex7Pos = 0;
3537

3638
uint8_t sysex[6] = {0,0,0,0,0,0};
37-
uint8_t messPos=0;
38-
uint32_t umpMess[4] = {0,0,0,0};
39+
uint32_t umpMess[BSTOUMP_BUFFER] = {0,0,0,0};
3940

4041
//Channel Based Data
4142
uint8_t bankMSB[16];
@@ -46,6 +47,11 @@ class bytestreamToUMP{
4647
uint8_t rpnLsb[16];
4748

4849
void bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2);
50+
void increaseWrite();
51+
52+
int readIndex = 0;
53+
int writeIndex = 0;
54+
int bufferLength = 0;
4955

5056

5157
public:

include/umpToBytestream.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,22 @@
2424

2525
#include <cstdint>
2626

27+
#define UMPTOBS_BUFFER 12
28+
2729
class umpToBytestream{
2830

2931
private:
3032
uint8_t mType;
3133
uint32_t ump64word1;
3234

3335
uint8_t UMPPos=0;
34-
uint8_t bsOutLength=0;
35-
uint8_t bsOut[12];
36+
uint8_t bsOut[UMPTOBS_BUFFER];
37+
38+
void increaseWrite();
39+
40+
int readIndex = 0;
41+
int writeIndex = 0;
42+
int bufferLength = 0;
3643

3744
public:
3845
uint8_t group;

include/umpToMIDI1Protocol.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,21 @@
2424

2525
#include <cstdint>
2626

27+
#define UMPTOPROTO1_BUFFER 4
28+
2729
class umpToMIDI1Protocol{
2830

2931
private:
3032
uint8_t mType;
3133
uint32_t ump64word1;
3234
uint8_t UMPPos=0;
33-
uint8_t messPos=0;
34-
uint32_t umpMess[4] = {0,0,0,0};
35+
uint32_t umpMess[UMPTOPROTO1_BUFFER] = {0,0,0,0};
36+
37+
void increaseWrite();
38+
39+
int readIndex = 0;
40+
int writeIndex = 0;
41+
int bufferLength = 0;
3542

3643
public:
3744
uint8_t group;

src/bytestreamToUMP.cpp

Lines changed: 95 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,25 @@ bytestreamToUMP::bytestreamToUMP(){
3333
clear(rpnMsb, 255, sizeof(rpnMsb));
3434
clear(rpnLsb, 255, sizeof(rpnLsb));
3535
}
36+
37+
void bytestreamToUMP::increaseWrite()
38+
{
39+
bufferLength++;
40+
writeIndex++;
41+
if (writeIndex == BSTOUMP_BUFFER) {
42+
writeIndex = 0;
43+
}
44+
}
3645

3746
void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
3847
uint8_t status = b0 & 0xF0;
3948

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();
4655
}else if(status>=NOTE_OFF && status<=PITCH_BEND){
4756
if(outputMIDI2){
4857
uint8_t channel = b0 & 0xF;
@@ -52,25 +61,35 @@ void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
5261
b2 = 0x40;
5362
}
5463

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;
5766

5867
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();
6172
} 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();
6477
} 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();
6681
} else if (status == PROGRAM_CHANGE){
6782
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 ];
7086
}
71-
umpMess[messPos+1] += (b1 + 0L) << 24;
87+
umpMess[writeIndex] += (b1 + 0L) << 24;
88+
increaseWrite();
7289
} 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();
7493
} else if (status == CC){
7594
switch(b1){
7695
case 0:
@@ -88,10 +107,12 @@ void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
88107
if(rpnMode[channel] && rpnMsb[channel] == 0 && (rpnLsb[channel] == 0 || rpnLsb[channel] == 6)){
89108
status = rpnMode[channel]? RPN: NRPN;
90109

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();
95116

96117
}else{
97118
rpnMsbValue[channel] = b2;
@@ -104,10 +125,12 @@ void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
104125
}
105126
status = rpnMode[channel]? RPN: NRPN;
106127

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();
111134
break;
112135
case 99:
113136
rpnMode[channel] = false;
@@ -128,42 +151,47 @@ void bytestreamToUMP::bsToUMP(uint8_t b0, uint8_t b1, uint8_t b2){
128151
return;
129152

130153
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();
133158
break;
134159
}
135160
}
136-
messPos+=2;
161+
137162

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();
144170
}
145171
}
146172
}
147173

148174

149175
bool bytestreamToUMP::availableUMP(){
150-
return messPos;
176+
return bufferLength;
151177
}
152178

153179
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;
157185
}
158-
messPos--;
159186

160187
return mess;
161188
}
162189

163190

164191
void bytestreamToUMP::bytestreamParse(uint8_t midi1Byte){
165192

166-
if (midi1Byte == TUNEREQUEST || midi1Byte >= TIMINGCLOCK) {
193+
if (midi1Byte == TUNEREQUEST || midi1Byte >= TIMINGCLOCK) {
194+
d0 = midi1Byte;
167195
bsToUMP(midi1Byte,0,0);
168196
return;
169197
}
@@ -178,35 +206,37 @@ void bytestreamToUMP::bytestreamParse(uint8_t midi1Byte){
178206
}else
179207
if (midi1Byte == SYSEX_STOP){
180208

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();
186216

187217
sysex7State = 0;
188218
clear(sysex, 0, sizeof(sysex));
189219
}
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;
210240
} else if (d0){ // status byte set
211241
if (
212242
(d0 & 0xF0) == PROGRAM_CHANGE

0 commit comments

Comments
 (0)