Last active
January 9, 2022 03:30
-
-
Save AliceLR/f74052999dde1db3a7dcda86c324b138 to your computer and use it in GitHub Desktop.
Digital Symphony module generator :)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#if 0 | |
g++ -O3 -Wall -Wextra dsymgen.cpp -odsymgen | |
exit | |
#endif | |
#include <assert.h> | |
#include <stdint.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include <fcntl.h> | |
#include <vector> | |
#define ERROR(...) do{ fprintf(stderr, __VA_ARGS__); fflush(stderr); exit(-1); }while(0) | |
#if 1 | |
#define DEBUG(...) do{ fprintf(stderr, __VA_ARGS__); fflush(stderr); }while(0) | |
#else | |
#define DEBUG(...) | |
#endif | |
static constexpr int NUM_SAMPLES = 63; | |
static constexpr int MAX_ORDERS = 4096; | |
static constexpr int MAX_PATTERNS = 4096; | |
struct sample | |
{ | |
bool present; | |
uint8_t type; | |
unsigned length; | |
unsigned loop_start; | |
unsigned loop_length; | |
unsigned volume; | |
int finetune; | |
char name[32]; | |
char filename[256]; | |
bool input_is_16bit; | |
}; | |
struct pattern | |
{ | |
uint32_t events[64]; | |
static uint32_t pack(unsigned note, unsigned sample, unsigned effect, unsigned param) | |
{ | |
if(note >= 37) | |
ERROR("invalid note %u\n", note); | |
if(sample >= 64) | |
ERROR("invalid sample %u\n", sample); | |
if(effect >= 64) | |
ERROR("invalid effect %u\n", effect); | |
if(param >= 4096) | |
ERROR("invalid param %u\n", param); | |
return note | (sample << 6) | (effect << 14) | (param << 20); | |
} | |
}; | |
struct dsym | |
{ | |
char name[256]; | |
unsigned version; | |
unsigned num_channels; | |
unsigned num_orders; | |
unsigned num_patterns; | |
unsigned orders[4096][8]; | |
pattern patterns[MAX_PATTERNS]; | |
sample samples[NUM_SAMPLES]; | |
// Loader state. | |
int current_pattern; | |
int pos_in_pattern; | |
}; | |
static void fput16(int value, FILE *fp) | |
{ | |
fputc(value & 0xff, fp); | |
fputc(value >> 8, fp); | |
} | |
static void fput24(int value, FILE *fp) | |
{ | |
fputc(value & 0xff, fp); | |
fputc((value & 0x00ff00) >> 8, fp); | |
fputc((value & 0xff0000) >> 16, fp); | |
} | |
static void fput32(uint32_t value, FILE *fp) | |
{ | |
fputc(value & 0xff, fp); | |
fputc((value & 0x0000ff00UL) >> 8, fp); | |
fputc((value & 0x00ff0000UL) >> 16, fp); | |
fputc((value & 0xff000000UL) >> 24, fp); | |
} | |
/* Sigma-delta 8-bit sample compression. */ | |
struct bitstream | |
{ | |
std::vector<uint8_t> &out; | |
uint64_t buf = 0; | |
unsigned pos = 0; | |
bitstream(std::vector<uint8_t> &o): out(o) {} | |
void flush() | |
{ | |
out.push_back((buf & 0x000000ffUL) >> 0); | |
out.push_back((buf & 0x0000ff00UL) >> 8); | |
out.push_back((buf & 0x00ff0000UL) >> 16); | |
out.push_back((buf & 0xff000000UL) >> 24); | |
buf >>= 32; | |
pos -= 32; | |
} | |
void write(uint64_t value, unsigned width) | |
{ | |
buf |= value << pos; | |
pos += width; | |
if(pos >= 32) | |
flush(); | |
} | |
}; | |
static void sigma_delta_compress(std::vector<uint8_t> &out, | |
const std::vector<uint8_t> &in) | |
{ | |
if(in.size() < 1) | |
return; | |
bitstream stream(out); | |
unsigned width = 8; | |
int8_t delta_min = -127; | |
int8_t delta_max = 127; | |
unsigned runlength = 0; | |
uint8_t prev = in[0]; | |
/* TODO: lower values seem to be better sometimes but not by much. */ | |
static constexpr unsigned max_runlength = 8; | |
out.push_back(max_runlength); | |
stream.write(in[0], 8); | |
for(size_t i = 1; i < in.size(); i++) | |
{ | |
int8_t delta = static_cast<int8_t>(in[i] - prev); | |
prev = in[i]; | |
if(delta == -128) | |
{ | |
/* Pretend this edge case didn't happen... */ | |
prev++; | |
delta = -127; | |
} | |
while(delta < delta_min || delta > delta_max) | |
{ | |
/* Expand width. */ | |
assert(width < 8); | |
stream.write(0, width); | |
width++; | |
delta_max = (1 << (width - 1)) - 1; | |
delta_min = -delta_max; | |
runlength = 0; | |
//DEBUG("%u: expand width to %d\n", i, width); | |
} | |
/* Output delta. */ | |
uint8_t code; | |
if(delta <= 0) | |
{ | |
code = 0x01 | (static_cast<uint8_t>(-delta) << 1); | |
stream.write(code, width); | |
} | |
else | |
{ | |
code = static_cast<uint8_t>(delta) << 1; | |
stream.write(code, width); | |
} | |
//DEBUG("%u: write %02x\n", i, code); | |
/* Reset the run length for large values. */ | |
if(code >> (width - 1)) | |
{ | |
runlength = 0; | |
continue; | |
} | |
/* Otherwise, increment the run length. */ | |
if(++runlength >= max_runlength) | |
{ | |
runlength = 0; | |
/* Shrink width. */ | |
if(width > 1) | |
{ | |
width--; | |
delta_max = (1 << (width - 1)) - 1; | |
delta_min = -delta_max; | |
//DEBUG("%u: shrink width to %d\n", i, width); | |
} | |
} | |
} | |
/* Output any remaining bytes + padding. */ | |
stream.flush(); | |
} | |
/* Template parsing. */ | |
static void read_events(dsym &m, pattern &p, const char *pos) | |
{ | |
size_t i; | |
for(i = m.pos_in_pattern; i < 64; i++) | |
{ | |
unsigned note = 0; | |
unsigned sample = 0; | |
unsigned effect = 0; | |
unsigned param = 0; | |
if(sscanf(pos, " %i %i %i %i |", ¬e, &sample, &effect, ¶m) > 0) | |
p.events[i] = pattern::pack(note, sample, effect, param); | |
pos = strchr(pos, '|'); | |
if(!pos) | |
{ | |
i++; | |
break; | |
} | |
pos++; | |
} | |
m.pos_in_pattern = i; | |
} | |
static bool read_line(dsym &m, FILE *in) | |
{ | |
char linebuf[2048]; | |
char str[256]; | |
char *pos; | |
unsigned num; | |
if(!fgets(linebuf, sizeof(linebuf), in)) | |
return false; | |
if(linebuf[0] == '#') | |
return true; | |
size_t len = strlen(linebuf); | |
while(len && (linebuf[len - 1] == '\n' || linebuf[len - 1] == '\r')) | |
linebuf[--len] = '\0'; | |
if(sscanf(linebuf, "%255s %i :: ", str, &num) == 2 && strcmp(str, "::")) | |
{ | |
m.current_pattern = -1; | |
pos = strstr(linebuf, "::"); | |
if(!pos) | |
ERROR("error parsing line\n"); | |
pos += 2; | |
if(!strcasecmp(str, "ORDER")) | |
{ | |
if(num >= MAX_ORDERS) | |
ERROR("invalid order %u\n", num); | |
if(m.num_channels == 0) | |
ERROR("ORDER must follow VOICES\n"); | |
if(m.num_orders < num + 1) | |
m.num_orders = num + 1; | |
unsigned order = num; | |
int num_read = sscanf(pos, " %i %i %i %i %i %i %i %i", | |
m.orders[order], m.orders[order] + 1, m.orders[order] + 2, m.orders[order] + 3, | |
m.orders[order] + 4, m.orders[order] + 5, m.orders[order] + 6, m.orders[order] + 7); | |
if(num_read < 0 || (unsigned)num_read < m.num_channels) | |
ERROR("error reading order %u: %d\n", order, num_read); | |
for(size_t i = 0; i < m.num_channels; i++) | |
{ | |
if(m.orders[order][i] > MAX_PATTERNS) // Allow =MAX_PATTERNS for blank. | |
ERROR("voice %zu in order %u is invalid pattern %u\n", i + 1, order, num); | |
} | |
} | |
else | |
if(!strcasecmp(str, "PATTERN")) | |
{ | |
if(num >= MAX_PATTERNS) | |
ERROR("invalid pattern %d\n", num); | |
if(m.num_patterns < num + 1) | |
m.num_patterns = num + 1; | |
m.current_pattern = num; | |
m.pos_in_pattern = 0; | |
pattern &p = m.patterns[num]; | |
read_events(m, p, pos); | |
} | |
else | |
if(!strcasecmp(str, "SAMPLE") || !strcasecmp(str, "SAMP16") || | |
!strcasecmp(str, "SIGMA8") || !strcasecmp(str, "SIGM16")) | |
{ | |
if(num < 1 || num > 63) | |
ERROR("invalid sample %d\n", num); | |
sample &s = m.samples[num - 1]; | |
s.type = 2; | |
if(!strcasecmp(str, "SAMP16")) s.type = 3, s.input_is_16bit = true; | |
if(!strcasecmp(str, "SIGMA8")) s.type = 4; | |
if(!strcasecmp(str, "SIGM16")) s.type = 4, s.input_is_16bit = true; | |
s.present = true; | |
if(sscanf(pos, " %i %i %i %i %d %255s %31s", | |
&s.length, &s.loop_start, &s.loop_length, &s.volume, &s.finetune, s.filename, s.name) < 6) | |
ERROR("error reading sample %u\n", num); | |
if(s.volume > 64) | |
ERROR("invalid volume for sample %u: %u\n", num, s.volume); | |
if(s.finetune < -8 || s.finetune > 7) | |
ERROR("invalid finetune for sample %u: %d\n", num, s.finetune); | |
/* | |
if(strlen(s.name) > 63) | |
ERROR("name for sample %u exceeds 63 bytes\n", num); | |
*/ | |
} | |
else | |
ERROR("unknown field '%s'\n", str); | |
} | |
else | |
if(sscanf(linebuf, "%255s :: ", str) == 1 && strcmp(str, "::")) | |
{ | |
m.current_pattern = -1; | |
pos = strstr(linebuf, "::"); | |
if(!pos) | |
ERROR("error parsing line\n"); | |
pos += 2; | |
if(!strcasecmp(str, "NAME")) | |
{ | |
if(sscanf(pos, " %255[^\n]s", m.name) < 1) | |
ERROR("error reading module name\n"); | |
} | |
else | |
if(!strcasecmp(str, "VOICES")) | |
{ | |
if(sscanf(pos, " %d", &num) < 1) | |
ERROR("malformed VOICES line\n"); | |
if(num < 1 || num > 8) | |
ERROR("invalid VOICES %d\n", num); | |
if(m.num_channels != 0) | |
ERROR("duplicate VOICES\n"); | |
m.num_channels = num; | |
} | |
} | |
else | |
if(m.current_pattern >= 0 && sscanf(linebuf, " %255s ", str) == 1 && !strcmp(str, "::")) | |
{ | |
// Continue previous pattern. | |
pos = strstr(linebuf, "::"); | |
if(!pos) | |
ERROR("error parsing line\n"); | |
pos += 2; | |
pattern &p = m.patterns[m.current_pattern]; | |
read_events(m, p, pos); | |
} | |
return true; | |
} | |
int main() | |
{ | |
static dsym m{}; | |
unsigned i; | |
#ifdef _WIN32 | |
_setmode(_fileno(stdout), _O_BINARY); | |
#endif | |
/* Header */ | |
if(fscanf(stdin, "BASSTRAK v%u\n", &m.version) < 1) | |
ERROR("not a Digital Symphony template.\n"); | |
if(m.version > 1) | |
ERROR("invalid Digital Symphony version (valid values are 0 and 1)\n"); | |
while(read_line(m, stdin)); | |
fclose(stdin); | |
/* Write */ | |
fputs("\x02\x01\x13\x13\x14\x12\x01\x0b", stdout); | |
fputc(m.version, stdout); | |
fputc(m.num_channels, stdout); | |
fput16(m.num_orders, stdout); | |
fput16(m.num_patterns, stdout); | |
fput24(0, stdout); /* Information text length. */ | |
for(i = 0; i < NUM_SAMPLES; i++) | |
{ | |
sample &s = m.samples[i]; | |
int flags = s.present ? 0 : 0x80; | |
int len = strlen(s.name); | |
fputc(flags | len, stdout); | |
if(s.present) | |
fput24(s.length >> 1, stdout); | |
} | |
fputc(strlen(m.name), stdout); | |
fputs(m.name, stdout); | |
fputs("\xff\xff\xff\xff\xff\xff\xff\xff", stdout); /* Effects allowed table. */ | |
if(m.num_orders > 0) | |
{ | |
fputc(0, stdout); // Packing method. | |
for(i = 0; i < m.num_orders; i++) | |
for(size_t j = 0; j < m.num_channels; j++) | |
fput16(m.orders[i][j], stdout); | |
} | |
if(m.num_patterns > 0) | |
{ | |
for(i = 0; i < m.num_patterns;) | |
{ | |
fputc(0, stdout); // Packing method. | |
for(size_t j = 0; i < m.num_patterns && j < 2000; i++, j++) | |
{ | |
pattern &p = m.patterns[i]; | |
for(size_t r = 0; r < 64; r++) | |
fput32(p.events[r], stdout); | |
} | |
} | |
} | |
for(i = 0; i < NUM_SAMPLES; i++) | |
{ | |
sample &s = m.samples[i]; | |
fputs(s.name, stdout); | |
if(!s.present) | |
continue; | |
fput24(s.loop_start >> 1, stdout); | |
fput24(s.loop_length >> 1, stdout); | |
fputc(s.volume, stdout); | |
fputc((signed char)s.finetune, stdout); | |
if(!s.length) | |
continue; | |
fputc(s.type, stdout); // Sample packing type. | |
size_t buf_size = s.length; | |
if(s.input_is_16bit) | |
buf_size *= 2; | |
std::vector<uint8_t> buf(buf_size); | |
FILE *fp = fopen(s.filename, "rb"); | |
if(fp) | |
{ | |
fread(buf.data(), buf_size, 1, fp); | |
fclose(fp); | |
} | |
else | |
ERROR("failed to open sample file '%s'\n", s.filename); | |
switch(s.type) | |
{ | |
case 0: // signed uncompressed 8-bit log | |
case 2: // signed uncompressed 8-bit | |
case 3: // signed uncompressed 16-bit | |
fwrite(buf.data(), buf_size, 1, stdout); | |
break; | |
case 4: // unsigned sigma-delta 8-bit | |
case 5: // unsigned sigma-delta 8-bit log | |
{ | |
if(s.input_is_16bit) | |
{ | |
for(size_t j = 0; j < s.length; j++) | |
buf[j] = buf[j * 2 + 1]; | |
buf.resize(s.length); | |
} | |
/* Convert signed to unsigned. */ | |
for(size_t j = 0; j < s.length; j++) | |
buf[j] += 128; | |
std::vector<uint8_t> compressed; | |
compressed.reserve(s.length); | |
sigma_delta_compress(compressed, buf); | |
fwrite(compressed.data(), compressed.size(), 1, stdout); | |
break; | |
} | |
case 1: // signed LZW 8-bit | |
default: | |
ERROR("unsupported sample type %u!", s.type); | |
} | |
} | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
BASSTRAK v1 | |
NAME :: Plastic Meme | |
VOICES :: 4 | |
SIGM16 1 :: 86896 65536 12800 40 0 piano_musescore.sam piano_musescore.sam | |
#SAMP16 1 :: 86896 65536 12800 40 0 piano_musescore.sam piano_musescore.sam | |
# 80424 1400 | |
ORDER 0 :: 0 1 2 3 | |
PATTERN 0 :: 0 0 0x30 0x5 | | | | 22 1 0x9 0x201 | | | | |
:: 18 1 0x9 0x201 | | | | 15 1 0x9 0x201 | | | | |
:: 22 1 0x9 0x201 | |
:: | | | | 20 1 0x9 0x201 | | | | |
:: 17 1 0x9 0x201 | | | | 13 1 0x9 0x201 | | | | |
:: 20 1 0x9 0x201 | |
:: | | | | 19 1 0x9 0x201 | 0 0 0x32 0 | |
PATTERN 1 :: 0 0 0xf 0x4 | 0 0 0x30 0x4 | | 18 1 0x9 0x201 | 0 0 0xa 0x01 | 0 0 0xa 0x01 | 0 0 0xa 0x01 | 0 0 0xa 1 | |
:: 0 0 0x32 0 | | | | | | | | | |
:: 0 0 0xf 0x6 | 0 0 0xf 0x2 | 0 0 0xf 0x4 | 17 1 0x9 0x201 | 0 0 0xa 1 | 0 0 0xa 1 | 0 0 0xa 1 | 0 0 0xa 1 | |
:: 0 0 0x32 0 | | | | | | | | | |
:: | | | 15 1 0x9 0x201 | 0 0 0x32 0 | |
PATTERN 2 :: 0 0 0x2f 0x398 | 0 0 0x30 0x4 | 15 1 0x9 0x201 | 0 0 0xa 0x01 | 0 0 0xa 0x01 | 0 0 0xa 0x01 | 0 0 0xa 0x01 | | |
:: | | | | 0 0 0x32 0 | | | | | |
:: | | 13 1 0x9 0x201 | 0 0 0xa 1 | 0 0 0xa 1 | 0 0 0xa 1 | 0 0 0xa 1 | | |
:: | | | | 0 0 0x32 0 | |
PATTERN 3 :: 0 0 0x30 0x3 | 11 1 0x9 0x201 | | | | | | | |
:: | | | | | | | | | |
:: | 10 1 0x9 0x201 | | | | | | | |
:: | | | | | | | | | |
:: | | 10 1 0x9 0x201 | 0 0 0x32 0 | | | | | |
:: | | | | 0 0 0x2f 0xA0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
BASSTRAK v1 | |
NAME :: test.module | |
VOICES :: 4 | |
ORDER 0 :: 0x0000 0x0001 0x0002 0x1000 | |
PATTERN 0 :: 18 1 || 18 1 0x1c 3 | 18 1 0x1c 3 | 18 1 | 0 0 0x1c 3 | 15 1 | 0 0 0x1c 3 | 15 1 | 0 0 0x1c 3 | 15 1 | 0 0 0x1c 3 | 17 1 |||||||| 0 0 0x1c 0 | |
PATTERN 1 :: 8 2 || | | | 0 0 0x1c 3 | 6 2 | 0 0 0x1c 3 | 6 2 | 0 0 0x1c 3 | 6 2 | 0 0 0x1c 3 | 8 2 |||||||| 0 0 0x1c 0 | |
PATTERN 2 :: 6 3 || | | | 0 0 0x1c 3 | 8 3 | 0 0 0x1c 3 | 8 3 | 0 0 0x1c 3 | 8 3 | 0 0 0x1c 3 | 1 3 |||||||| 0 0 0x1c 0 | |
SAMPLE 1 :: 16 0 16 64 0 saw.sam saw.sam | |
SAMP16 2 :: 16 0 16 64 0 log16.sam log16.sam | |
SAMPLE 3 :: 32 0 32 32 0 sq.sam sq.sam |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
BASSTRAK v1 | |
NAME :: symphony.effects | |
VOICES :: 4 | |
SAMPLE 1 :: 16 0 16 64 0 saw.sam saw.sam | |
SAMP16 2 :: 16 0 16 64 0 log16.sam log16.sam | |
SAMPLE 3 :: 32 0 32 64 0 sawsq.sam sawsq.sam | |
SAMPLE 4 :: 768 0 1 64 0 snare.sam snare.sam | |
ORDER 0 :: 0 1 2 3 | |
ORDER 1 :: 4 5 6 7 | |
ORDER 2 :: 8 9 10 7 | |
ORDER 3 :: 4 5 6 7 | |
ORDER 4 :: 11 12 10 7 | |
ORDER 5 :: 13 14 15 16 | |
# TESTING: | |
# TODO: 07 tremolo | |
# TODO: 19 retrigger | |
# TODO: 2b line jump | |
# TODO: 09 set sample offset | |
# TODO: 0B Position Jump | |
# TODO: 11 12 1A 1B fine slide + fine vslide | |
# TODO: 15 finetune | |
# TODO: 16 loop | |
# TODO: 1d note delay | |
# TODO: 1e pattern delay | |
# TODO: 1f invert loop?? | |
# TODO: 30 stereo | |
# TODO: 32 unset sample repeat | |
# TODO: speed over 32. | |
# TODO: tempo under S3M 32 (above S3M 20, the minimum XMP allows). | |
# | |
# Order 0 : 00, 01, 0C, 0D, 0F, 13, 14, 17, 20, 2f | |
# | |
PATTERN 0 :: 0 0 0x14 1 | 0 0 0x17 2 | 0 0 0x13 1 | |
:: 13 01 0xc 16 | 0 0 0x20 0x17e | 0 0 0x20 0x17e | 0 0 0x20 0x17e | |
:: 0 0 0x0 0x17e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | |
:: 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | |
PATTERN 1 :: 0 0 0x14 2 | 0 0 0x17 2 | |
PATTERN 2 :: 0 0 0x2f 0x3c0 | 0 0 0x2f 0 |||||| | |
:: 12 03 0xc 0 | 0 0 0x1 0x403 | 0 0 0x1 0x401 | 0 0 0x1 0x401 | |
:: 0 0 0x1 0x401 | 0 0 0x1 0x401 | 0 0 0x1 0x401 | 0 0 0x1 0x401 | |
PATTERN 3 :: 0 0 0xf 3 | 0 0 0xf 0 |||||||||||||| 0 0 0xd 0 | |
# | |
# Order 1: 02, 03, 04, 05, 06, 0A, 1C, 21, 22, 2A | |
# | |
PATTERN 4 :: 13 2 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
:: 16 2 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
PATTERN 5 :: 9 1 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
:: 8 1 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
PATTERN 6 :: 6 3 0x3 0x20 | 0 0 0x3 0 | 0 0 0x5 0x04 | 0 0 0x5 0x04 | 0 0 0x5 0x04 | 0 0 0x5 0x04 | 6 3 | 0 0 0x22 0x404 | 0 0 0x22 0x404 | 0 0 0x22 0x404 | 6 3 0xc 0x8 | 0 0 0x2 0x808 | 6 3 || 0 0 0xa 0x06 | 0 0 0xa 0x06 | 9 3 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x101 | 0 0 0xa 0x201 | 9 3 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 9 3 | 0 0 0x21 0x804 | 0 0 0x21 0x804 | 0 0 0x21 0x804 | 11 3 0x3 0x20 | 0 0 0x3 0 | 0 0 0x5 0x04 | 0 0 0x5 0x04 | 0 0 0x5 0x04 | 0 0 0x5 0x04 | 11 3 | 0 0 0x22 0x404 | 0 0 0x22 0x404 | 0 0 0x22 0x404 | 11 3 0xc 0x8 | 0 0 0x2 0x808 | 11 3 || 0 0 0xa 0x06 | 0 0 0xa 0x06 | 13 3 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0x2a 0x804 | 0 0 0x2a 0x804 | 11 3 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 9 3 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | |
PATTERN 7 :: 2 3 0x1c 1 ||||||| | |
:: 2 3 0x1c 1 ||||||| | |
:: 2 3 0x1c 1 ||||||| | |
:: 2 3 0x1c 1 ||||||| | |
:: 2 3 0x1c 1 ||||||| | |
:: 2 3 0x1c 1 ||||||| | |
:: 2 3 0x1c 1 ||||||| | |
:: 2 3 0x1c 1 || 2 3 0x1c 1 |||| 2 3 0x1c 1 | | |
# | |
# Order 2 | |
# | |
PATTERN 8 :: 13 2 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
:: 14 2 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
PATTERN 9 :: 4 1 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
:: 6 1 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
PATTERN 10 :: 1 3 || 0 0 0xa 0x4 | 0 0 0xa 0x4 | 0 0 0xa 0x4 | 0 0 0xa 0x4 | 1 3 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 8 3 0xc 0x10 | 0 0 0xa 0x80 | 1 3 || 0 0 0xa 0x6 | 0 0 0xa 0x6 | 1 3 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 4 3 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 1 3 | 0 0 0xa 0x8 | 0 0 0xa 0x8 | 0 0 0xa 0x8 | 2 3 0x3 0x20 | 0 0 0x3 0 | 0 0 0x5 0x4 | 0 0 0x5 0x4 | 0 0 0x5 0x4 | 0 0 0x5 0x4 | 2 3 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 6 3 0xc 0x8 | 0 0 0xa 0x80 | 2 3 || 0 0 0xa 0x06 | 0 0 0xa 0x06 | 4 3 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 0 0 0xa 0x1 | 4 3 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 4 3 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | 0 0 0xa 0x6 | |
# | |
# Order 4 | |
# | |
PATTERN 11 :: 18 2 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
PATTERN 12 :: 8 1 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | |
:: 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
:: 6 2 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
:: 8 2 0x4 0x42 | 0 0 0x4 0x64 | 0 0 0x4 0xa5 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | 0 0 0x6 0x01 | |
:: 0 0 0x6 0x01 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0 | 0 0 0x4 0x64 | 0 0 0x4 0x42 | |
# | |
# Order 5: 07, 19, 1b, 2b | |
# | |
PATTERN 13 :: 0 0 0xa 0x04 | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | |
:: 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | |
:: 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | |
:: 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | |
:: 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | |
:: 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | |
:: 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | |
:: 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | 0 0 0x7 0xff | |
PATTERN 14 :: 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | |
:: 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | |
:: 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | |
:: 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | |
:: 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | |
:: 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | 0 0 0xa 0x02 | |
:: 1 2 0xc 0 | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | |
:: 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | 0 0 0x0 0x27e | |
PATTERN 15 :: 2 3 | | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | |
:: 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | |
:: 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | |
:: 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | |
:: 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | |
:: 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | |
:: 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | |
:: 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | 0 0 0x1b 0x301 | |
PATTERN 16 :: 2 3 0x1c 1 ||||||| | |
:: ||||||| 19 4 0x2b 0x30 | |
:: ||||||| | |
:: ||||||| | |
:: ||||||| | |
:: ||||||| | |
:: 19 4 ||||||| | |
:: 2 3 0x1c 1 |||| 19 4 0x19 2 | 0 0 0x19 1 | 19 4 0x19 2 | 0 0 0x19 1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment