TEST_F (ElektronDataBothFixture, ElektronDataBoth8Bit) { uint8_t data[1024]; encoder.init(DATA_ENCODER_INIT(data, countof(data))); for (uint16_t i = 0; i < 512; i++) { CHECK_DATA_ENCODE(encoder.pack8(i & 0xFF)); } uint16_t len = encoder.finish(); decoder.init(DATA_ENCODER_INIT(data, len)); for (uint16_t i = 0; i < 512; i++) { uint8_t tmp; CHECK_DATA_ENCODE(decoder.get8(&tmp)); CHECK_EQUAL(i & 0xFF, (int)tmp); } }
void MNMDataToSysexEncoder::init(DATA_ENCODER_INIT(uint8_t *_sysex, uint16_t _sysexLen), MidiUartParent *_uart) { ElektronDataToSysexEncoder::init(DATA_ENCODER_INIT(_sysex, _sysexLen), _uart); lastByte = 0; lastCnt = 0; isFirstByte = true; }
bool MDSong::fromSysex(uint8_t *data, uint16_t len) { if (len < 0x1a - 7) return false; if (!ElektronHelper::checkSysexChecksum(data, len)) { return false; } numRows = (len - (0x1A - 7)) / 12; origPosition = data[3]; ElektronSysexDecoder decoder(DATA_ENCODER_INIT(data + 4, len - 4)); decoder.stop7Bit(); decoder.get((uint8_t *)name, 16); name[16] = '\0'; for (int i = 0; i < numRows; i++) { decoder.start7Bit(); decoder.get((uint8_t *)&rows[i], 4); decoder.get16(&rows[i].mutes); decoder.get16(&rows[i].tempo); decoder.get(&rows[i].startPosition, 2); decoder.stop7Bit(); } return true; }
uint16_t MDSong::toSysex(uint8_t *data, uint16_t len) { ElektronDataToSysexEncoder encoder(DATA_ENCODER_INIT(data, len)); if (len < (uint16_t)(0x1F + numRows * 12 )) return 0; return toSysex(encoder); }
bool compareMonoSysex(uint8_t *buf, uint8_t *buf2) { uint8_t buftmp[8192]; uint8_t buftmp2[8192]; uint16_t len = 0x1978; MNMSysexDecoder decoder(DATA_ENCODER_INIT(buf + 10, len - 10)); decoder.get(buftmp + 1, len - 10); MNMSysexDecoder decoder2(DATA_ENCODER_INIT(buf2 + 10, - 10)); decoder2.get(buftmp2 + 1, len - 10); for (uint16_t i = 1; i < len - 10; i++) { if (buftmp[i] != buftmp2[i]) { printf("mono sysex different at 0x%x, %x != %x\n", i, buftmp[i], buftmp2[i]); return false; } } return true; }
TEST_F (ElektronDataBothFixture, ElektronDataBoth16Bit) { uint8_t data[8192]; encoder.init(DATA_ENCODER_INIT(data, countof(data))); uint16_t cnt = 1024; uint16_t start = 0; for (uint16_t i = start; i < start + cnt; i++) { CHECK_DATA_ENCODE(encoder.pack16(i)); } uint16_t len = encoder.finish(); decoder.init(DATA_ENCODER_INIT(data, len)); for (uint16_t i = start; i < start + cnt; i++) { uint16_t tmp; CHECK_DATA_ENCODE(decoder.get16(&tmp)); CHECK_EQUAL(i, (uint16_t)tmp); } }
void MNMSysexDecoder::init(DATA_ENCODER_INIT(uint8_t *_data, uint16_t _maxLen)) { DataDecoder::init(DATA_ENCODER_INIT(_data, _maxLen)); cnt7 = 0; cnt = 0; repeatCount = 0; repeatByte = 0; totalCnt = 0; }
TEST_F (ElektronDataToSysexFixture, ElektronDataToSysexByteHigh) { uint8_t data[16]; encoder.init(DATA_ENCODER_INIT(data, countof(data))); CHECK_DATA_ENCODE(encoder.pack8(128)); uint16_t len = encoder.finish(); CHECK_EQUAL(2, len); CHECK_EQUAL((1 << 6), (int)data[0]); CHECK_EQUAL(0, (int)data[1]); }
TEST_F (ElektronDataBothFixture, ElektronDataBoth8BitMore) { uint8_t data[65000]; encoder.init(DATA_ENCODER_INIT(data, countof(data))); for (uint16_t i = 0; i < 55000; i++) { CHECK_DATA_ENCODE(encoder.pack8(i & 0xFF)); } uint16_t len = encoder.finish(); decoder.init(DATA_ENCODER_INIT(data, len)); for (uint16_t i = 0; i < 55000; i++) { uint8_t tmp; CHECK_DATA_ENCODE(decoder.get8(&tmp)); if (tmp != (i & 0xFF)) { printf("error at %d\n", i); // printf("%p, %p: %d\n", encoder.data + encoder.maxLen - 8, encoder.ptr, // encoder.data + encoder.maxLen - 8 - encoder.ptr); } CHECK_EQUAL(i & 0xFF, (int)tmp); } }
TEST_F (ElektronDataToSysexFixture, ElektronDataTestOverflow2) { uint8_t data[8]; encoder.init(DATA_ENCODER_INIT(data, countof(data))); CHECK_DATA_ENCODE(encoder.pack8(0)); CHECK_DATA_ENCODE(encoder.pack8(1)); CHECK_DATA_ENCODE(encoder.pack8(2)); CHECK_DATA_ENCODE(encoder.pack8(3)); CHECK_DATA_ENCODE(encoder.pack8(4)); CHECK_DATA_ENCODE(encoder.pack8(5)); CHECK_DATA_ENCODE(encoder.pack8(6)); CHECK_DATA_ENCODE_NOT(encoder.pack8(0)); }
void ElektronDataToSysexEncoder::init(DATA_ENCODER_INIT(uint8_t *_sysex, uint16_t _sysexLen), MidiUartParent *_uart) { DataEncoder::init(DATA_ENCODER_INIT(_sysex, _sysexLen)); uart = _uart; if (uart != NULL) { data = ptr = buf; } inChecksum = false; checksum = 0; retLen = 0; start7Bit(); }
TEST_F (ElektronDataToSysexFixture, ElektronDataToSysexBytes) { uint8_t data[16]; encoder.init(DATA_ENCODER_INIT(data, countof(data))); for (uint8_t i = 0; i < 7; i++) { CHECK_DATA_ENCODE(encoder.pack8(128)); } uint16_t len = encoder.finish(); CHECK_EQUAL(8, len); CHECK_EQUAL(0x7F, (int)data[0]); for (uint8_t i = 0; i < 7; i++) { CHECK_EQUAL(0, (int)data[1 + i]); } }
TEST_F (ElektronDataToSysexFixture, ElektronDataToSysex32Bit2) { uint8_t data[16]; encoder.init(DATA_ENCODER_INIT(data, countof(data))); uint32_t tmp = 0x01; encoder.pack32(tmp); uint16_t len = encoder.finish(); CHECK_EQUAL(5, len); CHECK_EQUAL(0, (int)data[0]); CHECK_EQUAL(0, (int)data[1]); CHECK_EQUAL(0, (int)data[2]); CHECK_EQUAL(0, (int)data[3]); CHECK_EQUAL(1, (int)data[4]); }
bool MDKit::fromSysex(uint8_t *data, uint16_t len) { if (len != (0x4d1 - 7)) { GUI.flash_strings_fill("WRONG LEN", ""); GUI.setLine(GUI.LINE2); GUI.flash_put_value16(0, len); return false; } if (!ElektronHelper::checkSysexChecksum(data, len)) { GUI.flash_strings_fill("WRONG CKSUM", ""); return false; } origPosition = data[3]; ElektronSysexDecoder decoder(DATA_ENCODER_INIT(data + 4, len - 4)); GUI.setLine(GUI.LINE2); decoder.stop7Bit(); decoder.get((uint8_t *)name, 16); name[16] = '\0'; decoder.get((uint8_t *)params, 16 * 24); decoder.get(levels, 16); decoder.start7Bit(); decoder.get32(models, 16); decoder.stop7Bit(); // reset 7 bit decoder.start7Bit(); for (uint8_t i = 0; i < 16; i++) { decoder.get((uint8_t *)&lfos[i], 36); } decoder.stop7Bit(); decoder.get(reverb, 8); decoder.get(delay, 8); decoder.get(eq, 8); decoder.get(dynamics, 8); decoder.start7Bit(); decoder.get(trigGroups, 16); decoder.get(muteGroups, 16); return true; }
bool MDGlobal::fromSysex(uint8_t *data, uint16_t len) { if (len != 0xC4 - 6) { // printf("wrong length\n"); // wrong length return false; } if (!ElektronHelper::checkSysexChecksum(data, len)) { // printf("wrong checksum\n"); return false; } origPosition = data[3]; ElektronSysexDecoder decoder(DATA_ENCODER_INIT(data + 4, len - 4)); decoder.stop7Bit(); decoder.get(drumRouting, 16); decoder.start7Bit(); decoder.get(keyMap, 128); decoder.stop7Bit(); decoder.get8(&baseChannel); decoder.get8(&unused); decoder.get16(&tempo); decoder.getb(&extendedMode); uint8_t byte = 0; decoder.get8(&byte); clockIn = IS_BIT_SET(byte, 0); transportIn = IS_BIT_SET(byte, 4); clockOut = IS_BIT_SET(byte, 5); transportOut = IS_BIT_SET(byte, 6); decoder.getb(&localOn); decoder.get(&drumLeft, 12); for (int i = 0; i < 128; i++) { if (keyMap[i] < 16) { drumMapping[keyMap[i]] = i; } } return true; }
bool MDKitShort::fromSysex(uint8_t *data, uint16_t len) { if (len != (0x4d1 - 7)) { // GUI.flash_strings_fill("WRONG LEN", ""); // GUI.setLine(GUI.LINE2); // GUI.flash_put_value16(0, len); return false; } if (!ElektronHelper::checkSysexChecksum(data, len)) { return false; } origPosition = data[3]; ElektronSysexDecoder decoder(DATA_ENCODER_INIT(data + 4, len - 4)); decoder.stop7Bit(); decoder.get((uint8_t *)name, 16); name[16] = '\0'; decoder.skip(24 * 16 + 16); decoder.start7Bit(); decoder.get32(models, 16); return true; }
uint16_t MDGlobal::toSysex(uint8_t *data, uint16_t len) { ElektronDataToSysexEncoder encoder(DATA_ENCODER_INIT(data, len)); return toSysex(encoder); if (len < 0xC5) return 0; }
void MNMSysexToDataEncoder::init(DATA_ENCODER_INIT(uint8_t *_data, uint16_t _maxLen)) { ElektronSysexToDataEncoder::init(DATA_ENCODER_INIT(_data, _maxLen)); repeat = 0; totalCnt = 0; }
void dumpMonoSysex(uint8_t *buf, uint16_t len) { uint8_t buftmp[8192]; MNMSysexDecoder decoder(DATA_ENCODER_INIT(buf + 10, len - 10)); decoder.get(buftmp + 1, len - 10); hexdump(buftmp, len - 9); }