Index: src/sys/dev/audiobell.c =================================================================== RCS file: /cvsroot/src/sys/dev/audiobell.c,v retrieving revision 1.16 diff -u -p -r1.16 audiobell.c --- src/sys/dev/audiobell.c 27 Feb 2017 23:31:00 -0000 1.16 +++ src/sys/dev/audiobell.c 25 May 2017 08:48:20 -0000 @@ -50,63 +50,44 @@ __KERNEL_RCSID(0, "$NetBSD: audiobell.c, #include #include #include +#ifdef HIRES_BELL +#include -/* Convert a %age volume to an amount to add to u-law values */ -/* XXX Probably highly inaccurate -- should be regenerated */ -static const uint8_t volmap[] = { - 0x7f, 0x67, 0x5b, 0x53, 0x49, 0x45, 0x41, 0x3e, 0x3a, 0x38, - 0x36, 0x32, 0x30, 0x2f, 0x2e, 0x2c, 0x2b, 0x2a, 0x28, 0x27, - 0x26, 0x25, 0x23, 0x22, 0x21, 0x1f, 0x1f, 0x1e, 0x1e, 0x1d, - 0x1c, 0x1c, 0x1b, 0x1a, 0x1a, 0x19, 0x18, 0x18, 0x17, 0x17, - 0x16, 0x15, 0x15, 0x14, 0x13, 0x13, 0x12, 0x11, 0x11, 0x10, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, - 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, - 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, - 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, - 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00 -}; +/* 44.1 kHz should reduce hum at higher pitches. */ +#define BELL_SAMPLE_RATE 44100 +#define BELL_SHIFT 3 +#else +#define BELL_SAMPLE_RATE 8000 +#define BELL_SHIFT 8 +#endif +#ifndef HIRES_BELL /* 1/4 cycle sine wave in u-law */ /* XXX Probably highly inaccurate -- should be regenerated */ -static const uint8_t sinewave[] = { - 0xff, 0xd3, 0xc5, 0xbc, 0xb6, 0xb0, 0xad, 0xaa, - 0xa7, 0xa3, 0xa0, 0x9e, 0x9d, 0x9b, 0x9a, 0x98, - 0x97, 0x96, 0x94, 0x93, 0x91, 0x90, 0x8f, 0x8e, - 0x8e, 0x8d, 0x8c, 0x8c, 0x8b, 0x8b, 0x8a, 0x89, - 0x89, 0x88, 0x88, 0x87, 0x87, 0x86, 0x86, 0x85, - 0x85, 0x84, 0x84, 0x84, 0x83, 0x83, 0x83, 0x82, - 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, +static const int16_t sinewave[] = { + 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, + 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, + 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, + 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, + 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, + 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, + 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, + 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, }; - -static inline uint8_t -audiobell_ulawscale(uint8_t val, uint8_t vol) -{ - uint8_t result; - - result = val + vol; - /* Spot underflow and just return silence */ - if ((result ^ val) & 0x80) - return 0x7f; - return result; -} +#endif static inline void -audiobell_expandwave(uint8_t *buf, int volume) +audiobell_expandwave(int16_t *buf, int volume) { u_int i; - int uvol; KASSERT(volume >= 0 && volume <= 100); - uvol = volmap[volume]; - for (i = 0; i < 65; i++) - buf[i] = audiobell_ulawscale(sinewave[i], uvol); - for (i = 65; i < 128; i++) - buf[i] = buf[128 - i]; - for (i = 128; i < 256; i++) - buf[i] = buf[i - 128] ^ 0x80; + for (i = 0; i < __arraycount(sinewave); i++) + buf[i] = (int32_t)sinewave[i] * (int32_t)volume / 100; + for (i = __arraycount(sinewave); i < __arraycount(sinewave) * 2; i++) + buf[i] = buf[__arraycount(sinewave) * 2 - i - 1]; + for (i = __arraycount(sinewave) * 2; i < __arraycount(sinewave) * 4; i++) + buf[i] = -buf[__arraycount(sinewave) * 4 - i - 1]; } /* @@ -114,21 +95,20 @@ audiobell_expandwave(uint8_t *buf, int v * Reference Manual (pp1624--1628). */ static inline int -audiobell_synthesize(uint8_t *buf, u_int pitch, u_int period, u_int volume) +audiobell_synthesize(int16_t *buf, u_int pitch, u_int period, u_int volume, + uint16_t *phase) { - uint8_t *wave; - uint16_t phase; + int16_t *wave; - wave = malloc(256, M_TEMP, M_WAITOK); + wave = malloc(sizeof(sinewave) * 4, M_TEMP, M_WAITOK); if (wave == NULL) return -1; audiobell_expandwave(wave, volume); - pitch = pitch * 65536 / 8000; - period = period * 8; /* 8000 / 1000 */ - phase = 0; + pitch = pitch * 65535 / BELL_SAMPLE_RATE; + period = period * BELL_SAMPLE_RATE / 1000 / 2; for (; period != 0; period--) { - *buf++ = wave[phase >> 8]; - phase += pitch; + *buf++ = wave[*phase >> BELL_SHIFT]; + *phase += pitch; } free(wave, M_TEMP); @@ -138,12 +118,13 @@ audiobell_synthesize(uint8_t *buf, u_int void audiobell(void *v, u_int pitch, u_int period, u_int volume, int poll) { - uint8_t *buf; + int16_t *buf; struct audio_info ai; struct uio auio; struct iovec aiov; struct file *fp; - int size, len, offset; + int size, len; + uint16_t phase; fp = NULL; dev_t audio = AUDIO_DEVICE | device_unit((device_t)v); @@ -160,22 +141,36 @@ audiobell(void *v, u_int pitch, u_int pe return; } + ai.play.sample_rate = BELL_SAMPLE_RATE; + ai.play.precision = 16; + +#if BYTE_ORDER == LITTLE_ENDIAN + ai.play.encoding = AUDIO_ENCODING_SLINEAR_LE; +#else + ai.play.encoding = AUDIO_ENCODING_SLINEAR_BE; +#endif + + if (audiobellioctl(fp, AUDIO_SETINFO, &ai) != 0) { + audiobellclose(fp); + return; + } buf = NULL; - if (ai.blocksize < 8192) - ai.blocksize = 8192; + if (ai.blocksize < BELL_SAMPLE_RATE) + ai.blocksize = BELL_SAMPLE_RATE; - len = period * 8; + len = period * BELL_SAMPLE_RATE / 1000 * 2; size = min(len, ai.blocksize); if (size == 0) goto out; buf = malloc(size, M_TEMP, M_WAITOK); if (buf == NULL) goto out; - - offset = 0; + + phase = 0; while (len > 0) { size = min(len, ai.blocksize); - if (audiobell_synthesize(buf, pitch, size / 8, volume) != 0) + if (audiobell_synthesize(buf, pitch, size * + 1000 / BELL_SAMPLE_RATE, volume, &phase) != 0) goto out; aiov.iov_base = (void *)buf; aiov.iov_len = size; @@ -188,7 +183,6 @@ audiobell(void *v, u_int pitch, u_int pe audiobellwrite(fp, NULL, &auio, NULL, 0); len -= size; - offset += size; } out: if (buf != NULL) free(buf, M_TEMP); --- /dev/null 2017-05-25 18:46:24.000000000 +1000 +++ src/sys/dev/audiobelldata.h 2017-05-25 13:47:36.000000000 +1000 @@ -0,0 +1,285 @@ +/*- + * Copyright (c) 2017 Nathanial Sloss + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* High resolution 1/4 cycle sine wave in 16 bit-slinear */ +static const uint16_t sinewave[] = { + 0x0000, 0x0019, 0x0032, 0x004b, 0x0064, 0x007d, 0x0096, 0x00af, + 0x00c9, 0x00e2, 0x00fb, 0x0114, 0x012d, 0x0146, 0x015f, 0x0178, + 0x0192, 0x01ab, 0x01c4, 0x01dd, 0x01f6, 0x020f, 0x0228, 0x0242, + 0x025b, 0x0274, 0x028d, 0x02a6, 0x02bf, 0x02d8, 0x02f1, 0x030b, + 0x0324, 0x033d, 0x0356, 0x036f, 0x0388, 0x03a1, 0x03ba, 0x03d4, + 0x03ed, 0x0406, 0x041f, 0x0438, 0x0451, 0x046a, 0x0483, 0x049c, + 0x04b6, 0x04cf, 0x04e8, 0x0501, 0x051a, 0x0533, 0x054c, 0x0565, + 0x057f, 0x0598, 0x05b1, 0x05ca, 0x05e3, 0x05fc, 0x0615, 0x062e, + 0x0647, 0x0660, 0x067a, 0x0693, 0x06ac, 0x06c5, 0x06de, 0x06f7, + 0x0710, 0x0729, 0x0742, 0x075b, 0x0775, 0x078e, 0x07a7, 0x07c0, + 0x07d9, 0x07f2, 0x080b, 0x0824, 0x083d, 0x0856, 0x086f, 0x0888, + 0x08a2, 0x08bb, 0x08d4, 0x08ed, 0x0906, 0x091f, 0x0938, 0x0951, + 0x096a, 0x0983, 0x099c, 0x09b5, 0x09ce, 0x09e7, 0x0a00, 0x0a19, + 0x0a33, 0x0a4c, 0x0a65, 0x0a7e, 0x0a97, 0x0ab0, 0x0ac9, 0x0ae2, + 0x0afb, 0x0b14, 0x0b2d, 0x0b46, 0x0b5f, 0x0b78, 0x0b91, 0x0baa, + 0x0bc3, 0x0bdc, 0x0bf5, 0x0c0e, 0x0c27, 0x0c40, 0x0c59, 0x0c72, + 0x0c8b, 0x0ca4, 0x0cbd, 0x0cd6, 0x0cef, 0x0d08, 0x0d21, 0x0d3a, + 0x0d53, 0x0d6c, 0x0d85, 0x0d9e, 0x0db7, 0x0dd0, 0x0de9, 0x0e02, + 0x0e1b, 0x0e34, 0x0e4d, 0x0e66, 0x0e7f, 0x0e98, 0x0eb1, 0x0eca, + 0x0ee3, 0x0efc, 0x0f15, 0x0f2e, 0x0f47, 0x0f60, 0x0f79, 0x0f92, + 0x0fab, 0x0fc4, 0x0fdd, 0x0ff5, 0x100e, 0x1027, 0x1040, 0x1059, + 0x1072, 0x108b, 0x10a4, 0x10bd, 0x10d6, 0x10ef, 0x1108, 0x1121, + 0x1139, 0x1152, 0x116b, 0x1184, 0x119d, 0x11b6, 0x11cf, 0x11e8, + 0x1201, 0x1219, 0x1232, 0x124b, 0x1264, 0x127d, 0x1296, 0x12af, + 0x12c8, 0x12e0, 0x12f9, 0x1312, 0x132b, 0x1344, 0x135d, 0x1376, + 0x138e, 0x13a7, 0x13c0, 0x13d9, 0x13f2, 0x140b, 0x1423, 0x143c, + 0x1455, 0x146e, 0x1487, 0x149f, 0x14b8, 0x14d1, 0x14ea, 0x1503, + 0x151b, 0x1534, 0x154d, 0x1566, 0x157f, 0x1597, 0x15b0, 0x15c9, + 0x15e2, 0x15fa, 0x1613, 0x162c, 0x1645, 0x165d, 0x1676, 0x168f, + 0x16a8, 0x16c0, 0x16d9, 0x16f2, 0x170a, 0x1723, 0x173c, 0x1755, + 0x176d, 0x1786, 0x179f, 0x17b7, 0x17d0, 0x17e9, 0x1802, 0x181a, + 0x1833, 0x184c, 0x1864, 0x187d, 0x1896, 0x18ae, 0x18c7, 0x18e0, + 0x18f8, 0x1911, 0x192a, 0x1942, 0x195b, 0x1973, 0x198c, 0x19a5, + 0x19bd, 0x19d6, 0x19ef, 0x1a07, 0x1a20, 0x1a38, 0x1a51, 0x1a6a, + 0x1a82, 0x1a9b, 0x1ab3, 0x1acc, 0x1ae4, 0x1afd, 0x1b16, 0x1b2e, + 0x1b47, 0x1b5f, 0x1b78, 0x1b90, 0x1ba9, 0x1bc1, 0x1bda, 0x1bf2, + 0x1c0b, 0x1c24, 0x1c3c, 0x1c55, 0x1c6d, 0x1c86, 0x1c9e, 0x1cb7, + 0x1ccf, 0x1ce8, 0x1d00, 0x1d19, 0x1d31, 0x1d49, 0x1d62, 0x1d7a, + 0x1d93, 0x1dab, 0x1dc4, 0x1ddc, 0x1df5, 0x1e0d, 0x1e25, 0x1e3e, + 0x1e56, 0x1e6f, 0x1e87, 0x1ea0, 0x1eb8, 0x1ed0, 0x1ee9, 0x1f01, + 0x1f19, 0x1f32, 0x1f4a, 0x1f63, 0x1f7b, 0x1f93, 0x1fac, 0x1fc4, + 0x1fdc, 0x1ff5, 0x200d, 0x2025, 0x203e, 0x2056, 0x206e, 0x2087, + 0x209f, 0x20b7, 0x20d0, 0x20e8, 0x2100, 0x2118, 0x2131, 0x2149, + 0x2161, 0x2179, 0x2192, 0x21aa, 0x21c2, 0x21da, 0x21f3, 0x220b, + 0x2223, 0x223b, 0x2254, 0x226c, 0x2284, 0x229c, 0x22b4, 0x22cd, + 0x22e5, 0x22fd, 0x2315, 0x232d, 0x2345, 0x235e, 0x2376, 0x238e, + 0x23a6, 0x23be, 0x23d6, 0x23ee, 0x2407, 0x241f, 0x2437, 0x244f, + 0x2467, 0x247f, 0x2497, 0x24af, 0x24c7, 0x24df, 0x24f7, 0x2510, + 0x2528, 0x2540, 0x2558, 0x2570, 0x2588, 0x25a0, 0x25b8, 0x25d0, + 0x25e8, 0x2600, 0x2618, 0x2630, 0x2648, 0x2660, 0x2678, 0x2690, + 0x26a8, 0x26c0, 0x26d8, 0x26f0, 0x2707, 0x271f, 0x2737, 0x274f, + 0x2767, 0x277f, 0x2797, 0x27af, 0x27c7, 0x27df, 0x27f7, 0x280e, + 0x2826, 0x283e, 0x2856, 0x286e, 0x2886, 0x289d, 0x28b5, 0x28cd, + 0x28e5, 0x28fd, 0x2915, 0x292c, 0x2944, 0x295c, 0x2974, 0x298c, + 0x29a3, 0x29bb, 0x29d3, 0x29eb, 0x2a02, 0x2a1a, 0x2a32, 0x2a49, + 0x2a61, 0x2a79, 0x2a91, 0x2aa8, 0x2ac0, 0x2ad8, 0x2aef, 0x2b07, + 0x2b1f, 0x2b36, 0x2b4e, 0x2b66, 0x2b7d, 0x2b95, 0x2bad, 0x2bc4, + 0x2bdc, 0x2bf3, 0x2c0b, 0x2c23, 0x2c3a, 0x2c52, 0x2c69, 0x2c81, + 0x2c99, 0x2cb0, 0x2cc8, 0x2cdf, 0x2cf7, 0x2d0e, 0x2d26, 0x2d3d, + 0x2d55, 0x2d6c, 0x2d84, 0x2d9b, 0x2db3, 0x2dca, 0x2de2, 0x2df9, + 0x2e11, 0x2e28, 0x2e3f, 0x2e57, 0x2e6e, 0x2e86, 0x2e9d, 0x2eb5, + 0x2ecc, 0x2ee3, 0x2efb, 0x2f12, 0x2f29, 0x2f41, 0x2f58, 0x2f70, + 0x2f87, 0x2f9e, 0x2fb6, 0x2fcd, 0x2fe4, 0x2ffb, 0x3013, 0x302a, + 0x3041, 0x3059, 0x3070, 0x3087, 0x309e, 0x30b6, 0x30cd, 0x30e4, + 0x30fb, 0x3113, 0x312a, 0x3141, 0x3158, 0x316f, 0x3186, 0x319e, + 0x31b5, 0x31cc, 0x31e3, 0x31fa, 0x3211, 0x3229, 0x3240, 0x3257, + 0x326e, 0x3285, 0x329c, 0x32b3, 0x32ca, 0x32e1, 0x32f8, 0x330f, + 0x3326, 0x333d, 0x3354, 0x336b, 0x3383, 0x339a, 0x33b1, 0x33c7, + 0x33de, 0x33f5, 0x340c, 0x3423, 0x343a, 0x3451, 0x3468, 0x347f, + 0x3496, 0x34ad, 0x34c4, 0x34db, 0x34f2, 0x3509, 0x351f, 0x3536, + 0x354d, 0x3564, 0x357b, 0x3592, 0x35a8, 0x35bf, 0x35d6, 0x35ed, + 0x3604, 0x361a, 0x3631, 0x3648, 0x365f, 0x3675, 0x368c, 0x36a3, + 0x36ba, 0x36d0, 0x36e7, 0x36fe, 0x3714, 0x372b, 0x3742, 0x3758, + 0x376f, 0x3786, 0x379c, 0x37b3, 0x37ca, 0x37e0, 0x37f7, 0x380e, + 0x3824, 0x383b, 0x3851, 0x3868, 0x387e, 0x3895, 0x38ab, 0x38c2, + 0x38d9, 0x38ef, 0x3906, 0x391c, 0x3933, 0x3949, 0x395f, 0x3976, + 0x398c, 0x39a3, 0x39b9, 0x39d0, 0x39e6, 0x39fd, 0x3a13, 0x3a29, + 0x3a40, 0x3a56, 0x3a6c, 0x3a83, 0x3a99, 0x3aaf, 0x3ac6, 0x3adc, + 0x3af2, 0x3b09, 0x3b1f, 0x3b35, 0x3b4c, 0x3b62, 0x3b78, 0x3b8e, + 0x3ba5, 0x3bbb, 0x3bd1, 0x3be7, 0x3bfe, 0x3c14, 0x3c2a, 0x3c40, + 0x3c56, 0x3c6c, 0x3c83, 0x3c99, 0x3caf, 0x3cc5, 0x3cdb, 0x3cf1, + 0x3d07, 0x3d1d, 0x3d33, 0x3d4a, 0x3d60, 0x3d76, 0x3d8c, 0x3da2, + 0x3db8, 0x3dce, 0x3de4, 0x3dfa, 0x3e10, 0x3e26, 0x3e3c, 0x3e52, + 0x3e68, 0x3e7e, 0x3e93, 0x3ea9, 0x3ebf, 0x3ed5, 0x3eeb, 0x3f01, + 0x3f17, 0x3f2d, 0x3f43, 0x3f58, 0x3f6e, 0x3f84, 0x3f9a, 0x3fb0, + 0x3fc5, 0x3fdb, 0x3ff1, 0x4007, 0x401d, 0x4032, 0x4048, 0x405e, + 0x4073, 0x4089, 0x409f, 0x40b5, 0x40ca, 0x40e0, 0x40f6, 0x410b, + 0x4121, 0x4137, 0x414c, 0x4162, 0x4177, 0x418d, 0x41a3, 0x41b8, + 0x41ce, 0x41e3, 0x41f9, 0x420e, 0x4224, 0x4239, 0x424f, 0x4264, + 0x427a, 0x428f, 0x42a5, 0x42ba, 0x42d0, 0x42e5, 0x42fa, 0x4310, + 0x4325, 0x433b, 0x4350, 0x4365, 0x437b, 0x4390, 0x43a5, 0x43bb, + 0x43d0, 0x43e5, 0x43fb, 0x4410, 0x4425, 0x443b, 0x4450, 0x4465, + 0x447a, 0x4490, 0x44a5, 0x44ba, 0x44cf, 0x44e4, 0x44fa, 0x450f, + 0x4524, 0x4539, 0x454e, 0x4563, 0x4578, 0x458e, 0x45a3, 0x45b8, + 0x45cd, 0x45e2, 0x45f7, 0x460c, 0x4621, 0x4636, 0x464b, 0x4660, + 0x4675, 0x468a, 0x469f, 0x46b4, 0x46c9, 0x46de, 0x46f3, 0x4708, + 0x471c, 0x4731, 0x4746, 0x475b, 0x4770, 0x4785, 0x479a, 0x47ae, + 0x47c3, 0x47d8, 0x47ed, 0x4802, 0x4816, 0x482b, 0x4840, 0x4855, + 0x4869, 0x487e, 0x4893, 0x48a8, 0x48bc, 0x48d1, 0x48e6, 0x48fa, + 0x490f, 0x4924, 0x4938, 0x494d, 0x4961, 0x4976, 0x498b, 0x499f, + 0x49b4, 0x49c8, 0x49dd, 0x49f1, 0x4a06, 0x4a1a, 0x4a2f, 0x4a43, + 0x4a58, 0x4a6c, 0x4a81, 0x4a95, 0x4aa9, 0x4abe, 0x4ad2, 0x4ae7, + 0x4afb, 0x4b0f, 0x4b24, 0x4b38, 0x4b4c, 0x4b61, 0x4b75, 0x4b89, + 0x4b9e, 0x4bb2, 0x4bc6, 0x4bda, 0x4bef, 0x4c03, 0x4c17, 0x4c2b, + 0x4c3f, 0x4c54, 0x4c68, 0x4c7c, 0x4c90, 0x4ca4, 0x4cb8, 0x4ccc, + 0x4ce1, 0x4cf5, 0x4d09, 0x4d1d, 0x4d31, 0x4d45, 0x4d59, 0x4d6d, + 0x4d81, 0x4d95, 0x4da9, 0x4dbd, 0x4dd1, 0x4de5, 0x4df9, 0x4e0d, + 0x4e21, 0x4e34, 0x4e48, 0x4e5c, 0x4e70, 0x4e84, 0x4e98, 0x4eac, + 0x4ebf, 0x4ed3, 0x4ee7, 0x4efb, 0x4f0f, 0x4f22, 0x4f36, 0x4f4a, + 0x4f5e, 0x4f71, 0x4f85, 0x4f99, 0x4fac, 0x4fc0, 0x4fd4, 0x4fe7, + 0x4ffb, 0x500f, 0x5022, 0x5036, 0x5049, 0x505d, 0x5070, 0x5084, + 0x5098, 0x50ab, 0x50bf, 0x50d2, 0x50e6, 0x50f9, 0x510c, 0x5120, + 0x5133, 0x5147, 0x515a, 0x516e, 0x5181, 0x5194, 0x51a8, 0x51bb, + 0x51ce, 0x51e2, 0x51f5, 0x5208, 0x521c, 0x522f, 0x5242, 0x5255, + 0x5269, 0x527c, 0x528f, 0x52a2, 0x52b5, 0x52c9, 0x52dc, 0x52ef, + 0x5302, 0x5315, 0x5328, 0x533b, 0x534e, 0x5362, 0x5375, 0x5388, + 0x539b, 0x53ae, 0x53c1, 0x53d4, 0x53e7, 0x53fa, 0x540d, 0x5420, + 0x5433, 0x5445, 0x5458, 0x546b, 0x547e, 0x5491, 0x54a4, 0x54b7, + 0x54ca, 0x54dc, 0x54ef, 0x5502, 0x5515, 0x5528, 0x553a, 0x554d, + 0x5560, 0x5573, 0x5585, 0x5598, 0x55ab, 0x55bd, 0x55d0, 0x55e3, + 0x55f5, 0x5608, 0x561a, 0x562d, 0x5640, 0x5652, 0x5665, 0x5677, + 0x568a, 0x569c, 0x56af, 0x56c1, 0x56d4, 0x56e6, 0x56f9, 0x570b, + 0x571d, 0x5730, 0x5742, 0x5755, 0x5767, 0x5779, 0x578c, 0x579e, + 0x57b0, 0x57c3, 0x57d5, 0x57e7, 0x57f9, 0x580c, 0x581e, 0x5830, + 0x5842, 0x5855, 0x5867, 0x5879, 0x588b, 0x589d, 0x58af, 0x58c2, + 0x58d4, 0x58e6, 0x58f8, 0x590a, 0x591c, 0x592e, 0x5940, 0x5952, + 0x5964, 0x5976, 0x5988, 0x599a, 0x59ac, 0x59be, 0x59d0, 0x59e2, + 0x59f3, 0x5a05, 0x5a17, 0x5a29, 0x5a3b, 0x5a4d, 0x5a5e, 0x5a70, + 0x5a82, 0x5a94, 0x5aa6, 0x5ab7, 0x5ac9, 0x5adb, 0x5aec, 0x5afe, + 0x5b10, 0x5b21, 0x5b33, 0x5b45, 0x5b56, 0x5b68, 0x5b79, 0x5b8b, + 0x5b9d, 0x5bae, 0x5bc0, 0x5bd1, 0x5be3, 0x5bf4, 0x5c06, 0x5c17, + 0x5c29, 0x5c3a, 0x5c4b, 0x5c5d, 0x5c6e, 0x5c80, 0x5c91, 0x5ca2, + 0x5cb4, 0x5cc5, 0x5cd6, 0x5ce8, 0x5cf9, 0x5d0a, 0x5d1b, 0x5d2d, + 0x5d3e, 0x5d4f, 0x5d60, 0x5d71, 0x5d83, 0x5d94, 0x5da5, 0x5db6, + 0x5dc7, 0x5dd8, 0x5de9, 0x5dfa, 0x5e0b, 0x5e1d, 0x5e2e, 0x5e3f, + 0x5e50, 0x5e61, 0x5e72, 0x5e82, 0x5e93, 0x5ea4, 0x5eb5, 0x5ec6, + 0x5ed7, 0x5ee8, 0x5ef9, 0x5f0a, 0x5f1a, 0x5f2b, 0x5f3c, 0x5f4d, + 0x5f5e, 0x5f6e, 0x5f7f, 0x5f90, 0x5fa1, 0x5fb1, 0x5fc2, 0x5fd3, + 0x5fe3, 0x5ff4, 0x6005, 0x6015, 0x6026, 0x6036, 0x6047, 0x6057, + 0x6068, 0x6078, 0x6089, 0x609a, 0x60aa, 0x60ba, 0x60cb, 0x60db, + 0x60ec, 0x60fc, 0x610d, 0x611d, 0x612d, 0x613e, 0x614e, 0x615e, + 0x616f, 0x617f, 0x618f, 0x619f, 0x61b0, 0x61c0, 0x61d0, 0x61e0, + 0x61f1, 0x6201, 0x6211, 0x6221, 0x6231, 0x6241, 0x6251, 0x6261, + 0x6272, 0x6282, 0x6292, 0x62a2, 0x62b2, 0x62c2, 0x62d2, 0x62e2, + 0x62f2, 0x6301, 0x6311, 0x6321, 0x6331, 0x6341, 0x6351, 0x6361, + 0x6371, 0x6380, 0x6390, 0x63a0, 0x63b0, 0x63c0, 0x63cf, 0x63df, + 0x63ef, 0x63fe, 0x640e, 0x641e, 0x642d, 0x643d, 0x644d, 0x645c, + 0x646c, 0x647b, 0x648b, 0x649b, 0x64aa, 0x64ba, 0x64c9, 0x64d9, + 0x64e8, 0x64f8, 0x6507, 0x6516, 0x6526, 0x6535, 0x6545, 0x6554, + 0x6563, 0x6573, 0x6582, 0x6591, 0x65a1, 0x65b0, 0x65bf, 0x65ce, + 0x65de, 0x65ed, 0x65fc, 0x660b, 0x661a, 0x6629, 0x6639, 0x6648, + 0x6657, 0x6666, 0x6675, 0x6684, 0x6693, 0x66a2, 0x66b1, 0x66c0, + 0x66cf, 0x66de, 0x66ed, 0x66fc, 0x670b, 0x671a, 0x6729, 0x6737, + 0x6746, 0x6755, 0x6764, 0x6773, 0x6782, 0x6790, 0x679f, 0x67ae, + 0x67bd, 0x67cb, 0x67da, 0x67e9, 0x67f7, 0x6806, 0x6815, 0x6823, + 0x6832, 0x6840, 0x684f, 0x685e, 0x686c, 0x687b, 0x6889, 0x6898, + 0x68a6, 0x68b5, 0x68c3, 0x68d2, 0x68e0, 0x68ee, 0x68fd, 0x690b, + 0x6919, 0x6928, 0x6936, 0x6944, 0x6953, 0x6961, 0x696f, 0x697d, + 0x698c, 0x699a, 0x69a8, 0x69b6, 0x69c4, 0x69d3, 0x69e1, 0x69ef, + 0x69fd, 0x6a0b, 0x6a19, 0x6a27, 0x6a35, 0x6a43, 0x6a51, 0x6a5f, + 0x6a6d, 0x6a7b, 0x6a89, 0x6a97, 0x6aa5, 0x6ab3, 0x6ac1, 0x6ace, + 0x6adc, 0x6aea, 0x6af8, 0x6b06, 0x6b14, 0x6b21, 0x6b2f, 0x6b3d, + 0x6b4a, 0x6b58, 0x6b66, 0x6b74, 0x6b81, 0x6b8f, 0x6b9c, 0x6baa, + 0x6bb8, 0x6bc5, 0x6bd3, 0x6be0, 0x6bee, 0x6bfb, 0x6c09, 0x6c16, + 0x6c24, 0x6c31, 0x6c3f, 0x6c4c, 0x6c59, 0x6c67, 0x6c74, 0x6c81, + 0x6c8f, 0x6c9c, 0x6ca9, 0x6cb7, 0x6cc4, 0x6cd1, 0x6cde, 0x6cec, + 0x6cf9, 0x6d06, 0x6d13, 0x6d20, 0x6d2d, 0x6d3a, 0x6d48, 0x6d55, + 0x6d62, 0x6d6f, 0x6d7c, 0x6d89, 0x6d96, 0x6da3, 0x6db0, 0x6dbd, + 0x6dca, 0x6dd7, 0x6de3, 0x6df0, 0x6dfd, 0x6e0a, 0x6e17, 0x6e24, + 0x6e30, 0x6e3d, 0x6e4a, 0x6e57, 0x6e63, 0x6e70, 0x6e7d, 0x6e8a, + 0x6e96, 0x6ea3, 0x6eaf, 0x6ebc, 0x6ec9, 0x6ed5, 0x6ee2, 0x6eee, + 0x6efb, 0x6f07, 0x6f14, 0x6f20, 0x6f2d, 0x6f39, 0x6f46, 0x6f52, + 0x6f5f, 0x6f6b, 0x6f77, 0x6f84, 0x6f90, 0x6f9c, 0x6fa9, 0x6fb5, + 0x6fc1, 0x6fcd, 0x6fda, 0x6fe6, 0x6ff2, 0x6ffe, 0x700a, 0x7016, + 0x7023, 0x702f, 0x703b, 0x7047, 0x7053, 0x705f, 0x706b, 0x7077, + 0x7083, 0x708f, 0x709b, 0x70a7, 0x70b3, 0x70bf, 0x70cb, 0x70d6, + 0x70e2, 0x70ee, 0x70fa, 0x7106, 0x7112, 0x711d, 0x7129, 0x7135, + 0x7141, 0x714c, 0x7158, 0x7164, 0x716f, 0x717b, 0x7187, 0x7192, + 0x719e, 0x71a9, 0x71b5, 0x71c0, 0x71cc, 0x71d7, 0x71e3, 0x71ee, + 0x71fa, 0x7205, 0x7211, 0x721c, 0x7227, 0x7233, 0x723e, 0x7249, + 0x7255, 0x7260, 0x726b, 0x7277, 0x7282, 0x728d, 0x7298, 0x72a3, + 0x72af, 0x72ba, 0x72c5, 0x72d0, 0x72db, 0x72e6, 0x72f1, 0x72fc, + 0x7307, 0x7312, 0x731d, 0x7328, 0x7333, 0x733e, 0x7349, 0x7354, + 0x735f, 0x736a, 0x7375, 0x7380, 0x738a, 0x7395, 0x73a0, 0x73ab, + 0x73b5, 0x73c0, 0x73cb, 0x73d6, 0x73e0, 0x73eb, 0x73f6, 0x7400, + 0x740b, 0x7415, 0x7420, 0x742b, 0x7435, 0x7440, 0x744a, 0x7455, + 0x745f, 0x746a, 0x7474, 0x747e, 0x7489, 0x7493, 0x749e, 0x74a8, + 0x74b2, 0x74bd, 0x74c7, 0x74d1, 0x74db, 0x74e6, 0x74f0, 0x74fa, + 0x7504, 0x750f, 0x7519, 0x7523, 0x752d, 0x7537, 0x7541, 0x754b, + 0x7555, 0x755f, 0x7569, 0x7573, 0x757d, 0x7587, 0x7591, 0x759b, + 0x75a5, 0x75af, 0x75b9, 0x75c3, 0x75cd, 0x75d6, 0x75e0, 0x75ea, + 0x75f4, 0x75fd, 0x7607, 0x7611, 0x761b, 0x7624, 0x762e, 0x7638, + 0x7641, 0x764b, 0x7654, 0x765e, 0x7668, 0x7671, 0x767b, 0x7684, + 0x768e, 0x7697, 0x76a1, 0x76aa, 0x76b3, 0x76bd, 0x76c6, 0x76cf, + 0x76d9, 0x76e2, 0x76eb, 0x76f5, 0x76fe, 0x7707, 0x7710, 0x771a, + 0x7723, 0x772c, 0x7735, 0x773e, 0x7748, 0x7751, 0x775a, 0x7763, + 0x776c, 0x7775, 0x777e, 0x7787, 0x7790, 0x7799, 0x77a2, 0x77ab, + 0x77b4, 0x77bd, 0x77c5, 0x77ce, 0x77d7, 0x77e0, 0x77e9, 0x77f1, + 0x77fa, 0x7803, 0x780c, 0x7814, 0x781d, 0x7826, 0x782e, 0x7837, + 0x7840, 0x7848, 0x7851, 0x7859, 0x7862, 0x786b, 0x7873, 0x787c, + 0x7884, 0x788d, 0x7895, 0x789d, 0x78a6, 0x78ae, 0x78b7, 0x78bf, + 0x78c7, 0x78d0, 0x78d8, 0x78e0, 0x78e8, 0x78f1, 0x78f9, 0x7901, + 0x7909, 0x7911, 0x791a, 0x7922, 0x792a, 0x7932, 0x793a, 0x7942, + 0x794a, 0x7952, 0x795a, 0x7962, 0x796a, 0x7972, 0x797a, 0x7982, + 0x798a, 0x7992, 0x7999, 0x79a1, 0x79a9, 0x79b1, 0x79b9, 0x79c0, + 0x79c8, 0x79d0, 0x79d8, 0x79df, 0x79e7, 0x79ef, 0x79f6, 0x79fe, + 0x7a05, 0x7a0d, 0x7a15, 0x7a1c, 0x7a24, 0x7a2b, 0x7a33, 0x7a3a, + 0x7a42, 0x7a49, 0x7a50, 0x7a58, 0x7a5f, 0x7a67, 0x7a6e, 0x7a75, + 0x7a7d, 0x7a84, 0x7a8b, 0x7a92, 0x7a9a, 0x7aa1, 0x7aa8, 0x7aaf, + 0x7ab6, 0x7abd, 0x7ac5, 0x7acc, 0x7ad3, 0x7ada, 0x7ae1, 0x7ae8, + 0x7aef, 0x7af6, 0x7afd, 0x7b04, 0x7b0b, 0x7b12, 0x7b19, 0x7b1f, + 0x7b26, 0x7b2d, 0x7b34, 0x7b3b, 0x7b42, 0x7b48, 0x7b4f, 0x7b56, + 0x7b5d, 0x7b63, 0x7b6a, 0x7b71, 0x7b77, 0x7b7e, 0x7b84, 0x7b8b, + 0x7b92, 0x7b98, 0x7b9f, 0x7ba5, 0x7bac, 0x7bb2, 0x7bb9, 0x7bbf, + 0x7bc5, 0x7bcc, 0x7bd2, 0x7bd9, 0x7bdf, 0x7be5, 0x7bec, 0x7bf2, + 0x7bf8, 0x7bfe, 0x7c05, 0x7c0b, 0x7c11, 0x7c17, 0x7c1d, 0x7c23, + 0x7c2a, 0x7c30, 0x7c36, 0x7c3c, 0x7c42, 0x7c48, 0x7c4e, 0x7c54, + 0x7c5a, 0x7c60, 0x7c66, 0x7c6c, 0x7c71, 0x7c77, 0x7c7d, 0x7c83, + 0x7c89, 0x7c8f, 0x7c94, 0x7c9a, 0x7ca0, 0x7ca6, 0x7cab, 0x7cb1, + 0x7cb7, 0x7cbc, 0x7cc2, 0x7cc8, 0x7ccd, 0x7cd3, 0x7cd8, 0x7cde, + 0x7ce3, 0x7ce9, 0x7cee, 0x7cf4, 0x7cf9, 0x7cff, 0x7d04, 0x7d09, + 0x7d0f, 0x7d14, 0x7d19, 0x7d1f, 0x7d24, 0x7d29, 0x7d2f, 0x7d34, + 0x7d39, 0x7d3e, 0x7d43, 0x7d49, 0x7d4e, 0x7d53, 0x7d58, 0x7d5d, + 0x7d62, 0x7d67, 0x7d6c, 0x7d71, 0x7d76, 0x7d7b, 0x7d80, 0x7d85, + 0x7d8a, 0x7d8f, 0x7d94, 0x7d99, 0x7d9d, 0x7da2, 0x7da7, 0x7dac, + 0x7db1, 0x7db5, 0x7dba, 0x7dbf, 0x7dc3, 0x7dc8, 0x7dcd, 0x7dd1, + 0x7dd6, 0x7ddb, 0x7ddf, 0x7de4, 0x7de8, 0x7ded, 0x7df1, 0x7df6, + 0x7dfa, 0x7dff, 0x7e03, 0x7e07, 0x7e0c, 0x7e10, 0x7e14, 0x7e19, + 0x7e1d, 0x7e21, 0x7e26, 0x7e2a, 0x7e2e, 0x7e32, 0x7e37, 0x7e3b, + 0x7e3f, 0x7e43, 0x7e47, 0x7e4b, 0x7e4f, 0x7e53, 0x7e57, 0x7e5b, + 0x7e5f, 0x7e63, 0x7e67, 0x7e6b, 0x7e6f, 0x7e73, 0x7e77, 0x7e7b, + 0x7e7f, 0x7e83, 0x7e86, 0x7e8a, 0x7e8e, 0x7e92, 0x7e95, 0x7e99, + 0x7e9d, 0x7ea1, 0x7ea4, 0x7ea8, 0x7eab, 0x7eaf, 0x7eb3, 0x7eb6, + 0x7eba, 0x7ebd, 0x7ec1, 0x7ec4, 0x7ec8, 0x7ecb, 0x7ecf, 0x7ed2, + 0x7ed5, 0x7ed9, 0x7edc, 0x7edf, 0x7ee3, 0x7ee6, 0x7ee9, 0x7eed, + 0x7ef0, 0x7ef3, 0x7ef6, 0x7ef9, 0x7efd, 0x7f00, 0x7f03, 0x7f06, + 0x7f09, 0x7f0c, 0x7f0f, 0x7f12, 0x7f15, 0x7f18, 0x7f1b, 0x7f1e, + 0x7f21, 0x7f24, 0x7f27, 0x7f2a, 0x7f2d, 0x7f2f, 0x7f32, 0x7f35, + 0x7f38, 0x7f3b, 0x7f3d, 0x7f40, 0x7f43, 0x7f45, 0x7f48, 0x7f4b, + 0x7f4d, 0x7f50, 0x7f53, 0x7f55, 0x7f58, 0x7f5a, 0x7f5d, 0x7f5f, + 0x7f62, 0x7f64, 0x7f67, 0x7f69, 0x7f6b, 0x7f6e, 0x7f70, 0x7f73, + 0x7f75, 0x7f77, 0x7f79, 0x7f7c, 0x7f7e, 0x7f80, 0x7f82, 0x7f85, + 0x7f87, 0x7f89, 0x7f8b, 0x7f8d, 0x7f8f, 0x7f91, 0x7f93, 0x7f95, + 0x7f97, 0x7f99, 0x7f9b, 0x7f9d, 0x7f9f, 0x7fa1, 0x7fa3, 0x7fa5, + 0x7fa7, 0x7fa9, 0x7faa, 0x7fac, 0x7fae, 0x7fb0, 0x7fb1, 0x7fb3, + 0x7fb5, 0x7fb7, 0x7fb8, 0x7fba, 0x7fbc, 0x7fbd, 0x7fbf, 0x7fc0, + 0x7fc2, 0x7fc3, 0x7fc5, 0x7fc6, 0x7fc8, 0x7fc9, 0x7fcb, 0x7fcc, + 0x7fce, 0x7fcf, 0x7fd0, 0x7fd2, 0x7fd3, 0x7fd4, 0x7fd6, 0x7fd7, + 0x7fd8, 0x7fd9, 0x7fda, 0x7fdc, 0x7fdd, 0x7fde, 0x7fdf, 0x7fe0, + 0x7fe1, 0x7fe2, 0x7fe3, 0x7fe4, 0x7fe5, 0x7fe6, 0x7fe7, 0x7fe8, + 0x7fe9, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fee, 0x7fef, 0x7fef, + 0x7ff0, 0x7ff1, 0x7ff2, 0x7ff2, 0x7ff3, 0x7ff4, 0x7ff4, 0x7ff5, + 0x7ff6, 0x7ff6, 0x7ff7, 0x7ff7, 0x7ff8, 0x7ff8, 0x7ff9, 0x7ff9, + 0x7ffa, 0x7ffa, 0x7ffb, 0x7ffb, 0x7ffc, 0x7ffc, 0x7ffc, 0x7ffd, + 0x7ffd, 0x7ffd, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7fff, 0x7fff, + 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, +};