Przeglądaj źródła

USB MIDI pitch bend uses signed integers (matching Arduino MIDI lib)

main
PaulStoffregen 6 lat temu
rodzic
commit
afe894aee8
4 zmienionych plików z 24 dodań i 10 usunięć
  1. +5
    -3
      teensy3/usb_midi.c
  2. +7
    -3
      teensy3/usb_midi.h
  3. +5
    -2
      usb_midi/usb_api.cpp
  4. +7
    -2
      usb_midi/usb_api.h

+ 5
- 3
teensy3/usb_midi.c Wyświetl plik

} else } else
if (type1 == 0x0E && type2 == 0x0E) { if (type1 == 0x0E && type2 == 0x0E) {
usb_midi_msg_type = 0xE0; // 0xE0 = usbMIDI.PitchBend usb_midi_msg_type = 0xE0; // 0xE0 = usbMIDI.PitchBend
if (usb_midi_handlePitchChange)
(*usb_midi_handlePitchChange)(ch,
((n >> 16) & 0x7F) | ((n >> 17) & 0x3F80));
if (usb_midi_handlePitchChange) {
int value = ((n >> 16) & 0x7F) | ((n >> 17) & 0x3F80);
value -= 8192; // 0 to 16383 --> -8192 to +8191
(*usb_midi_handlePitchChange)(ch, value);
}
} else { } else {
return 0; return 0;
} }

+ 7
- 3
teensy3/usb_midi.h Wyświetl plik

void sendAfterTouch(uint8_t pressure, uint8_t channel, uint8_t cable=0) __attribute__((always_inline)) { void sendAfterTouch(uint8_t pressure, uint8_t channel, uint8_t cable=0) __attribute__((always_inline)) {
send(0xD0, pressure, 0, channel, cable); send(0xD0, pressure, 0, channel, cable);
} }
void sendPitchBend(uint16_t value, uint8_t channel, uint8_t cable=0) __attribute__((always_inline)) {
// MIDI 4.3 takes -8192 to +8191. We take 0 to 16383
// MIDI 4.3 also has version that takes float -1.0 to +1.0
void sendPitchBend(int value, uint8_t channel, uint8_t cable=0) __attribute__((always_inline)) {
if (value < -8192) {
value = -8192;
} else if (value > 8191) {
value = 8191;
}
value += 8192;
send(0xE0, value, value >> 7, channel, cable); send(0xE0, value, value >> 7, channel, cable);
} }
void sendSysEx(uint32_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0) __attribute__((always_inline)) { void sendSysEx(uint32_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0) __attribute__((always_inline)) {

+ 5
- 2
usb_midi/usb_api.cpp Wyświetl plik

} else } else
if (type1 == 0x0E && type2 == 0xE0) { if (type1 == 0x0E && type2 == 0xE0) {
msg_type = 0xE0; // 0xE0 = usbMIDI.PitchBend msg_type = 0xE0; // 0xE0 = usbMIDI.PitchBend
if (handlePitchChange) (*handlePitchChange)(c,
(b2 & 0x7F) | ((b3 & 0x7F) << 7));
if (handlePitchChange) {
int value = (b2 & 0x7F) | ((int)(b3 & 0x7F) << 7);
value -= 8192; // 0 to 16383 --> -8192 to +8191
(*handlePitchChange)(c, value);
}
} else { } else {
return false; return false;
} }

+ 7
- 2
usb_midi/usb_api.h Wyświetl plik

void sendAfterTouch(uint8_t pressure, uint8_t channel, uint8_t cable=0) { void sendAfterTouch(uint8_t pressure, uint8_t channel, uint8_t cable=0) {
send(0xD0, pressure, 0, channel, cable); send(0xD0, pressure, 0, channel, cable);
} }
void sendPitchBend(uint16_t value, uint8_t channel, uint8_t cable=0) {
// MIDI 4.3 takes -8192 to +8191. We take 0 to 16383
void sendPitchBend(int value, uint8_t channel, uint8_t cable=0) {
if (value < -8192) {
value = -8192;
} else if (value > 8191) {
value = 8191;
}
value += 8192;
send(0xE0, value, value >> 7, channel, cable); send(0xE0, value, value >> 7, channel, cable);
} }
void sendSysEx(uint16_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0) { void sendSysEx(uint16_t length, const uint8_t *data, bool hasTerm=false, uint8_t cable=0) {

Ładowanie…
Anuluj
Zapisz