@@ -286,8 +286,9 @@ class Instrument {
286
286
buttons[n].note = start_note_offset +
287
287
notegen0 * buttons[n].coord0 +
288
288
notegen1 * buttons[n].coord1 ;
289
- buttons[n].midinote_base = (int )(buttons[n].note - start_note_offset + 0.5 ); // careful to keep rounded value above zero
290
- buttons[n].midinote = buttons[n].midinote_base ;
289
+ buttons[n].midinote_base = (int )(notegen0 * buttons[n].coord0 +
290
+ notegen1 * buttons[n].coord1 + 0.5 + 100 ) - 100 ; // careful to keep rounded value above zero
291
+ buttons[n].midinote = buttons[n].midinote_base + (int )(start_note_offset + 0.5 );
291
292
}
292
293
for (n = 0 ; n < MAX_VOICECOUNT; n++) {
293
294
voices[n] = -1 ;
@@ -347,19 +348,16 @@ class Instrument {
347
348
}
348
349
349
350
int change_note_offset (float offset) {
350
- float n = start_note_offset + offset;
351
- if (n >= min_note_offset && n <= max_note_offset) {
352
- start_note_offset = n;
353
- return 0 ;
354
- }
355
- return 1 ;
351
+ return set_note_offset (start_note_offset + offset);
356
352
}
357
353
358
354
int set_note_offset (float offset) {
359
355
if (offset >= min_note_offset && offset <= max_note_offset) {
360
356
start_note_offset = offset;
357
+ update_leds ();
361
358
return 0 ;
362
359
}
360
+ led_rgb3 (255 ,0 ,0 );
363
361
return 1 ;
364
362
}
365
363
@@ -378,8 +376,8 @@ class Instrument {
378
376
buttons[n].note = start_note_offset +
379
377
notegen0 * buttons[n].coord0 +
380
378
notegen1 * buttons[n].coord1 ;
381
- buttons[n].midinote_base = ( int )( buttons[n].note - start_note_offset + 0.5 ); // careful to keep rounded value above zero
382
- buttons[n].midinote = buttons[n].midinote_base ;
379
+ buttons[n].midinote_base = - buttons[n].midinote_base ;
380
+ buttons[n].midinote = buttons[n].midinote_base + ( int )(start_note_offset + 0.5 ) ;
383
381
}
384
382
}
385
383
@@ -655,7 +653,7 @@ class Instrument {
655
653
// Note on detection
656
654
if (buttons[but].state == STATE_OFF) {
657
655
buttons[but].state = STATE_ON;
658
- buttons[but].midinote = buttons[but].midinote_base + start_note_offset;
656
+ buttons[but].midinote = buttons[but].midinote_base + ( int )( start_note_offset + 0.5 ) ;
659
657
buttons[but].start_note_offset = start_note_offset;
660
658
// multiply velo by 2 to cover full midi range on note on
661
659
int velo = 0 + buttons[but].vpres * velo_sensitivity * 128 * 2 ;
@@ -770,7 +768,7 @@ class Instrument {
770
768
// Note on detection
771
769
if (buttons[but].state == STATE_OFF && buttons[but].pres > 0.0 ) {
772
770
// calculate midinote only at note on
773
- buttons[but].midinote = ( int )( buttons[but].midinote_base + start_note_offset + 0.5 );
771
+ buttons[but].midinote = buttons[but].midinote_base + ( int )( start_note_offset + 0.5 );
774
772
buttons[but].start_note_offset = start_note_offset;
775
773
776
774
if (portamento) {
@@ -848,9 +846,17 @@ class Instrument {
848
846
}
849
847
else if (but == transpose_button && transpose_button2) {
850
848
// calculate combined transpose buttons
851
- // TODO: quick and dirty, x/y not calculated
852
849
float temp_pres = buttons[but].pres ; // save pres for note off detection
853
850
851
+ float sw = buttons[but].pres + buttons[transpose_button2].pres ;
852
+ if (sw > 0 .0f ) {
853
+ buttons[but].but_x = (buttons[but].pres * buttons[but].but_x +
854
+ buttons[transpose_button2].pres * buttons[transpose_button2].but_x )
855
+ / sw;
856
+ buttons[but].but_y = (buttons[but].pres * buttons[but].but_y +
857
+ buttons[transpose_button2].pres * buttons[transpose_button2].but_y )
858
+ / sw;
859
+ }
854
860
buttons[but].pres = max (buttons[but].pres , buttons[transpose_button2].pres );
855
861
buttons[but].vpres = buttons[but].vpres + buttons[transpose_button2].vpres ;
856
862
@@ -1143,6 +1149,7 @@ void int2float(int *msg, float *fmsg, int n) {
1143
1149
unsigned int aux_button_map = 0 ;
1144
1150
1145
1151
int synth_message (int size, int * msg) {
1152
+ static float note_offset_old;
1146
1153
float fmsg[7 ];
1147
1154
int src = msg[0 ];
1148
1155
int id = msg[1 ];
@@ -1152,31 +1159,36 @@ int synth_message(int size, int* msg) {
1152
1159
if (src == ID_CONTROL) {
1153
1160
if (id == IDC_ALT) {
1154
1161
dis.set_altmode (msg[0 ]);
1162
+ update_leds ();
1155
1163
}
1156
1164
else if (id == IDC_PORTAMENTO) {
1157
1165
// Portamento button
1158
1166
dis.set_portamento (msg[0 ]);
1167
+ update_leds ();
1159
1168
}
1160
1169
else if (msg[0 ]) {
1161
1170
aux_button_map |= 1 <<id;
1162
- int dif = 12 ;
1163
- if (dis.altmode ) dif = 1 ;
1164
- if (id == IDC_OCT_UP) {
1165
- dis.change_note_offset (dif);
1166
- }
1167
- if (id == IDC_OCT_DOWN) {
1168
- dis.change_note_offset (-dif);
1169
- }
1170
- if (aux_button_map == (1 <<IDC_OCT_UP) | (1 <<IDC_OCT_DOWN)) {
1171
+ if (aux_button_map == ((1 <<IDC_OCT_UP) | (1 <<IDC_OCT_DOWN))) {
1172
+ dis.set_note_offset (note_offset_old);
1171
1173
dis.set_free_transpose_mode (1 );
1174
+ } else {
1175
+ note_offset_old = dis.start_note_offset ;
1176
+ int dif = 12 ;
1177
+ if (dis.altmode ) dif = 1 ;
1178
+ if (id == IDC_OCT_UP) {
1179
+ dis.change_note_offset (dif);
1180
+ }
1181
+ if (id == IDC_OCT_DOWN) {
1182
+ dis.change_note_offset (-dif);
1183
+ }
1172
1184
}
1173
1185
} else {
1174
- aux_button_map &= ! (1 <<id);
1175
- if (aux_button_map != (1 <<IDC_OCT_UP) | (1 <<IDC_OCT_DOWN)) {
1186
+ aux_button_map &= ~ (1 <<id);
1187
+ if (aux_button_map != (( 1 <<IDC_OCT_UP) | (1 <<IDC_OCT_DOWN) )) {
1176
1188
dis.set_free_transpose_mode (0 );
1177
1189
}
1190
+ update_leds ();
1178
1191
}
1179
- update_leds ();
1180
1192
}
1181
1193
else if (src == ID_ACCEL && size == 7 ) {
1182
1194
motion.message (msg);
@@ -1392,7 +1404,7 @@ void update_leds(void) {
1392
1404
}
1393
1405
#endif
1394
1406
1395
- int note_offset = (int )(dis.start_note_offset - 62 + 0 .5f );
1407
+ int note_offset = (int )(dis.start_note_offset + 0 .5f ) - 62 ;
1396
1408
if (note_offset < -12 ) led_updown (0x1100 );
1397
1409
else if (note_offset < 0 ) led_updown (0x0100 );
1398
1410
else if (note_offset > 12 ) led_updown (0x0011 );
0 commit comments