2023-10-14 11:10:37 +00:00
/*
* ESFMu : emulator for the ESS " ESFM " enhanced OPL3 clone
* Copyright ( C ) 2023 Kagamiin ~
*
* This file includes code and data from the Nuked OPL3 project , copyright ( C )
* 2013 - 2023 Nuke . YKT . Its usage , modification and redistribution is allowed
* under the terms of the GNU Lesser General Public License version 2.1 or
* later .
*
* ESFMu is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation , either version 2.1
* of the License , or ( at your option ) any later version .
*
* ESFMu is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public License
* along with ESFMu . If not , see < https : //www.gnu.org/licenses/>.
*/
/*
* ESFMu wouldn ' t have been possible without the hard work and dedication of
* the retro computer hardware research and preservation community .
*
* I ' d like to thank :
* - Nuke . YKT
* Developer of Nuked OPL3 , which was the basis for ESFMu ' s code and
* also a great learning resource on Yamaha FM synthesis for myself .
* Nuke . YKT also gives shoutouts on behalf of Nuked OPL3 to :
* - MAME Development Team ( Jarek Burczynski , Tatsuyuki Satoh ) :
* Feedback and Rhythm part calculation information .
* - forums . submarine . org . uk ( carbon14 , opl3 ) :
* Tremolo and phase generator calculation information .
* - OPLx decapsulated ( Matthew Gambrell , Olli Niemitalo ) :
* OPL2 ROMs .
* - siliconpr0n . org ( John McMaster , digshadow ) :
* YMF262 and VRC VII decaps and die shots .
* - rainwarrior
* For performing the initial research on ESFM drivers and documenting
* ESS ' s patent on native mode operator organization .
* - jwt27
* For kickstarting the ESFM research project and compiling rainwarrior ' s
* findings and more in an accessible document ( " ESFM Demystified " ) .
* - pachuco / CatButts
* For documenting ESS ' s patent on ESFM ' s feedback implementation , which
* was vital in getting ESFMu ' s sound output to be accurate .
* - And everybody who helped out with real hardware testing
*/
# include "esfm.h"
# include <stdint.h>
# include <stdlib.h>
# include <stddef.h>
# include <string.h>
# include <stdbool.h>
/*
* Log - scale quarter sine table extracted from OPL3 ROM ; taken straight from
* Nuked OPL3 source code .
* TODO : Extract sine table from ESFM die scans . . . does ESFM even use a sine
* table ? Patent documents give a hint to a possible method of generating sine
* waves using some sort of boolean logic wizardry ( lol )
2024-02-01 08:30:11 +00:00
* Optimization : All 8 waveforms are calculated and unfolded from the actual
* data in OPL3 ' s ROM . Negative entries are marked by 0x8000 .
2023-10-14 11:10:37 +00:00
*/
2024-02-01 08:30:11 +00:00
static const uint16_t logsinrom [ 1024 * 8 ] = {
// wave 0
0x0859 , 0x06c3 , 0x0607 , 0x058b , 0x052e , 0x04e4 , 0x04a6 , 0x0471 ,
0x0443 , 0x041a , 0x03f5 , 0x03d3 , 0x03b5 , 0x0398 , 0x037e , 0x0365 ,
0x034e , 0x0339 , 0x0324 , 0x0311 , 0x02ff , 0x02ed , 0x02dc , 0x02cd ,
0x02bd , 0x02af , 0x02a0 , 0x0293 , 0x0286 , 0x0279 , 0x026d , 0x0261 ,
0x0256 , 0x024b , 0x0240 , 0x0236 , 0x022c , 0x0222 , 0x0218 , 0x020f ,
0x0206 , 0x01fd , 0x01f5 , 0x01ec , 0x01e4 , 0x01dc , 0x01d4 , 0x01cd ,
0x01c5 , 0x01be , 0x01b7 , 0x01b0 , 0x01a9 , 0x01a2 , 0x019b , 0x0195 ,
0x018f , 0x0188 , 0x0182 , 0x017c , 0x0177 , 0x0171 , 0x016b , 0x0166 ,
0x0160 , 0x015b , 0x0155 , 0x0150 , 0x014b , 0x0146 , 0x0141 , 0x013c ,
0x0137 , 0x0133 , 0x012e , 0x0129 , 0x0125 , 0x0121 , 0x011c , 0x0118 ,
0x0114 , 0x010f , 0x010b , 0x0107 , 0x0103 , 0x00ff , 0x00fb , 0x00f8 ,
0x00f4 , 0x00f0 , 0x00ec , 0x00e9 , 0x00e5 , 0x00e2 , 0x00de , 0x00db ,
0x00d7 , 0x00d4 , 0x00d1 , 0x00cd , 0x00ca , 0x00c7 , 0x00c4 , 0x00c1 ,
0x00be , 0x00bb , 0x00b8 , 0x00b5 , 0x00b2 , 0x00af , 0x00ac , 0x00a9 ,
0x00a7 , 0x00a4 , 0x00a1 , 0x009f , 0x009c , 0x0099 , 0x0097 , 0x0094 ,
0x0092 , 0x008f , 0x008d , 0x008a , 0x0088 , 0x0086 , 0x0083 , 0x0081 ,
0x007f , 0x007d , 0x007a , 0x0078 , 0x0076 , 0x0074 , 0x0072 , 0x0070 ,
0x006e , 0x006c , 0x006a , 0x0068 , 0x0066 , 0x0064 , 0x0062 , 0x0060 ,
0x005e , 0x005c , 0x005b , 0x0059 , 0x0057 , 0x0055 , 0x0053 , 0x0052 ,
0x0050 , 0x004e , 0x004d , 0x004b , 0x004a , 0x0048 , 0x0046 , 0x0045 ,
0x0043 , 0x0042 , 0x0040 , 0x003f , 0x003e , 0x003c , 0x003b , 0x0039 ,
0x0038 , 0x0037 , 0x0035 , 0x0034 , 0x0033 , 0x0031 , 0x0030 , 0x002f ,
0x002e , 0x002d , 0x002b , 0x002a , 0x0029 , 0x0028 , 0x0027 , 0x0026 ,
0x0025 , 0x0024 , 0x0023 , 0x0022 , 0x0021 , 0x0020 , 0x001f , 0x001e ,
0x001d , 0x001c , 0x001b , 0x001a , 0x0019 , 0x0018 , 0x0017 , 0x0017 ,
0x0016 , 0x0015 , 0x0014 , 0x0014 , 0x0013 , 0x0012 , 0x0011 , 0x0011 ,
0x0010 , 0x000f , 0x000f , 0x000e , 0x000d , 0x000d , 0x000c , 0x000c ,
0x000b , 0x000a , 0x000a , 0x0009 , 0x0009 , 0x0008 , 0x0008 , 0x0007 ,
0x0007 , 0x0007 , 0x0006 , 0x0006 , 0x0005 , 0x0005 , 0x0005 , 0x0004 ,
0x0004 , 0x0004 , 0x0003 , 0x0003 , 0x0003 , 0x0002 , 0x0002 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0002 ,
0x0002 , 0x0002 , 0x0002 , 0x0003 , 0x0003 , 0x0003 , 0x0004 , 0x0004 ,
0x0004 , 0x0005 , 0x0005 , 0x0005 , 0x0006 , 0x0006 , 0x0007 , 0x0007 ,
0x0007 , 0x0008 , 0x0008 , 0x0009 , 0x0009 , 0x000a , 0x000a , 0x000b ,
0x000c , 0x000c , 0x000d , 0x000d , 0x000e , 0x000f , 0x000f , 0x0010 ,
0x0011 , 0x0011 , 0x0012 , 0x0013 , 0x0014 , 0x0014 , 0x0015 , 0x0016 ,
0x0017 , 0x0017 , 0x0018 , 0x0019 , 0x001a , 0x001b , 0x001c , 0x001d ,
0x001e , 0x001f , 0x0020 , 0x0021 , 0x0022 , 0x0023 , 0x0024 , 0x0025 ,
0x0026 , 0x0027 , 0x0028 , 0x0029 , 0x002a , 0x002b , 0x002d , 0x002e ,
0x002f , 0x0030 , 0x0031 , 0x0033 , 0x0034 , 0x0035 , 0x0037 , 0x0038 ,
0x0039 , 0x003b , 0x003c , 0x003e , 0x003f , 0x0040 , 0x0042 , 0x0043 ,
0x0045 , 0x0046 , 0x0048 , 0x004a , 0x004b , 0x004d , 0x004e , 0x0050 ,
0x0052 , 0x0053 , 0x0055 , 0x0057 , 0x0059 , 0x005b , 0x005c , 0x005e ,
0x0060 , 0x0062 , 0x0064 , 0x0066 , 0x0068 , 0x006a , 0x006c , 0x006e ,
0x0070 , 0x0072 , 0x0074 , 0x0076 , 0x0078 , 0x007a , 0x007d , 0x007f ,
0x0081 , 0x0083 , 0x0086 , 0x0088 , 0x008a , 0x008d , 0x008f , 0x0092 ,
0x0094 , 0x0097 , 0x0099 , 0x009c , 0x009f , 0x00a1 , 0x00a4 , 0x00a7 ,
0x00a9 , 0x00ac , 0x00af , 0x00b2 , 0x00b5 , 0x00b8 , 0x00bb , 0x00be ,
0x00c1 , 0x00c4 , 0x00c7 , 0x00ca , 0x00cd , 0x00d1 , 0x00d4 , 0x00d7 ,
0x00db , 0x00de , 0x00e2 , 0x00e5 , 0x00e9 , 0x00ec , 0x00f0 , 0x00f4 ,
0x00f8 , 0x00fb , 0x00ff , 0x0103 , 0x0107 , 0x010b , 0x010f , 0x0114 ,
0x0118 , 0x011c , 0x0121 , 0x0125 , 0x0129 , 0x012e , 0x0133 , 0x0137 ,
0x013c , 0x0141 , 0x0146 , 0x014b , 0x0150 , 0x0155 , 0x015b , 0x0160 ,
0x0166 , 0x016b , 0x0171 , 0x0177 , 0x017c , 0x0182 , 0x0188 , 0x018f ,
0x0195 , 0x019b , 0x01a2 , 0x01a9 , 0x01b0 , 0x01b7 , 0x01be , 0x01c5 ,
0x01cd , 0x01d4 , 0x01dc , 0x01e4 , 0x01ec , 0x01f5 , 0x01fd , 0x0206 ,
0x020f , 0x0218 , 0x0222 , 0x022c , 0x0236 , 0x0240 , 0x024b , 0x0256 ,
0x0261 , 0x026d , 0x0279 , 0x0286 , 0x0293 , 0x02a0 , 0x02af , 0x02bd ,
0x02cd , 0x02dc , 0x02ed , 0x02ff , 0x0311 , 0x0324 , 0x0339 , 0x034e ,
0x0365 , 0x037e , 0x0398 , 0x03b5 , 0x03d3 , 0x03f5 , 0x041a , 0x0443 ,
0x0471 , 0x04a6 , 0x04e4 , 0x052e , 0x058b , 0x0607 , 0x06c3 , 0x0859 ,
0x8859 , 0x86c3 , 0x8607 , 0x858b , 0x852e , 0x84e4 , 0x84a6 , 0x8471 ,
0x8443 , 0x841a , 0x83f5 , 0x83d3 , 0x83b5 , 0x8398 , 0x837e , 0x8365 ,
0x834e , 0x8339 , 0x8324 , 0x8311 , 0x82ff , 0x82ed , 0x82dc , 0x82cd ,
0x82bd , 0x82af , 0x82a0 , 0x8293 , 0x8286 , 0x8279 , 0x826d , 0x8261 ,
0x8256 , 0x824b , 0x8240 , 0x8236 , 0x822c , 0x8222 , 0x8218 , 0x820f ,
0x8206 , 0x81fd , 0x81f5 , 0x81ec , 0x81e4 , 0x81dc , 0x81d4 , 0x81cd ,
0x81c5 , 0x81be , 0x81b7 , 0x81b0 , 0x81a9 , 0x81a2 , 0x819b , 0x8195 ,
0x818f , 0x8188 , 0x8182 , 0x817c , 0x8177 , 0x8171 , 0x816b , 0x8166 ,
0x8160 , 0x815b , 0x8155 , 0x8150 , 0x814b , 0x8146 , 0x8141 , 0x813c ,
0x8137 , 0x8133 , 0x812e , 0x8129 , 0x8125 , 0x8121 , 0x811c , 0x8118 ,
0x8114 , 0x810f , 0x810b , 0x8107 , 0x8103 , 0x80ff , 0x80fb , 0x80f8 ,
0x80f4 , 0x80f0 , 0x80ec , 0x80e9 , 0x80e5 , 0x80e2 , 0x80de , 0x80db ,
0x80d7 , 0x80d4 , 0x80d1 , 0x80cd , 0x80ca , 0x80c7 , 0x80c4 , 0x80c1 ,
0x80be , 0x80bb , 0x80b8 , 0x80b5 , 0x80b2 , 0x80af , 0x80ac , 0x80a9 ,
0x80a7 , 0x80a4 , 0x80a1 , 0x809f , 0x809c , 0x8099 , 0x8097 , 0x8094 ,
0x8092 , 0x808f , 0x808d , 0x808a , 0x8088 , 0x8086 , 0x8083 , 0x8081 ,
0x807f , 0x807d , 0x807a , 0x8078 , 0x8076 , 0x8074 , 0x8072 , 0x8070 ,
0x806e , 0x806c , 0x806a , 0x8068 , 0x8066 , 0x8064 , 0x8062 , 0x8060 ,
0x805e , 0x805c , 0x805b , 0x8059 , 0x8057 , 0x8055 , 0x8053 , 0x8052 ,
0x8050 , 0x804e , 0x804d , 0x804b , 0x804a , 0x8048 , 0x8046 , 0x8045 ,
0x8043 , 0x8042 , 0x8040 , 0x803f , 0x803e , 0x803c , 0x803b , 0x8039 ,
0x8038 , 0x8037 , 0x8035 , 0x8034 , 0x8033 , 0x8031 , 0x8030 , 0x802f ,
0x802e , 0x802d , 0x802b , 0x802a , 0x8029 , 0x8028 , 0x8027 , 0x8026 ,
0x8025 , 0x8024 , 0x8023 , 0x8022 , 0x8021 , 0x8020 , 0x801f , 0x801e ,
0x801d , 0x801c , 0x801b , 0x801a , 0x8019 , 0x8018 , 0x8017 , 0x8017 ,
0x8016 , 0x8015 , 0x8014 , 0x8014 , 0x8013 , 0x8012 , 0x8011 , 0x8011 ,
0x8010 , 0x800f , 0x800f , 0x800e , 0x800d , 0x800d , 0x800c , 0x800c ,
0x800b , 0x800a , 0x800a , 0x8009 , 0x8009 , 0x8008 , 0x8008 , 0x8007 ,
0x8007 , 0x8007 , 0x8006 , 0x8006 , 0x8005 , 0x8005 , 0x8005 , 0x8004 ,
0x8004 , 0x8004 , 0x8003 , 0x8003 , 0x8003 , 0x8002 , 0x8002 , 0x8002 ,
0x8002 , 0x8001 , 0x8001 , 0x8001 , 0x8001 , 0x8001 , 0x8001 , 0x8001 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8001 , 0x8001 , 0x8001 , 0x8001 , 0x8001 , 0x8001 , 0x8001 , 0x8002 ,
0x8002 , 0x8002 , 0x8002 , 0x8003 , 0x8003 , 0x8003 , 0x8004 , 0x8004 ,
0x8004 , 0x8005 , 0x8005 , 0x8005 , 0x8006 , 0x8006 , 0x8007 , 0x8007 ,
0x8007 , 0x8008 , 0x8008 , 0x8009 , 0x8009 , 0x800a , 0x800a , 0x800b ,
0x800c , 0x800c , 0x800d , 0x800d , 0x800e , 0x800f , 0x800f , 0x8010 ,
0x8011 , 0x8011 , 0x8012 , 0x8013 , 0x8014 , 0x8014 , 0x8015 , 0x8016 ,
0x8017 , 0x8017 , 0x8018 , 0x8019 , 0x801a , 0x801b , 0x801c , 0x801d ,
0x801e , 0x801f , 0x8020 , 0x8021 , 0x8022 , 0x8023 , 0x8024 , 0x8025 ,
0x8026 , 0x8027 , 0x8028 , 0x8029 , 0x802a , 0x802b , 0x802d , 0x802e ,
0x802f , 0x8030 , 0x8031 , 0x8033 , 0x8034 , 0x8035 , 0x8037 , 0x8038 ,
0x8039 , 0x803b , 0x803c , 0x803e , 0x803f , 0x8040 , 0x8042 , 0x8043 ,
0x8045 , 0x8046 , 0x8048 , 0x804a , 0x804b , 0x804d , 0x804e , 0x8050 ,
0x8052 , 0x8053 , 0x8055 , 0x8057 , 0x8059 , 0x805b , 0x805c , 0x805e ,
0x8060 , 0x8062 , 0x8064 , 0x8066 , 0x8068 , 0x806a , 0x806c , 0x806e ,
0x8070 , 0x8072 , 0x8074 , 0x8076 , 0x8078 , 0x807a , 0x807d , 0x807f ,
0x8081 , 0x8083 , 0x8086 , 0x8088 , 0x808a , 0x808d , 0x808f , 0x8092 ,
0x8094 , 0x8097 , 0x8099 , 0x809c , 0x809f , 0x80a1 , 0x80a4 , 0x80a7 ,
0x80a9 , 0x80ac , 0x80af , 0x80b2 , 0x80b5 , 0x80b8 , 0x80bb , 0x80be ,
0x80c1 , 0x80c4 , 0x80c7 , 0x80ca , 0x80cd , 0x80d1 , 0x80d4 , 0x80d7 ,
0x80db , 0x80de , 0x80e2 , 0x80e5 , 0x80e9 , 0x80ec , 0x80f0 , 0x80f4 ,
0x80f8 , 0x80fb , 0x80ff , 0x8103 , 0x8107 , 0x810b , 0x810f , 0x8114 ,
0x8118 , 0x811c , 0x8121 , 0x8125 , 0x8129 , 0x812e , 0x8133 , 0x8137 ,
0x813c , 0x8141 , 0x8146 , 0x814b , 0x8150 , 0x8155 , 0x815b , 0x8160 ,
0x8166 , 0x816b , 0x8171 , 0x8177 , 0x817c , 0x8182 , 0x8188 , 0x818f ,
0x8195 , 0x819b , 0x81a2 , 0x81a9 , 0x81b0 , 0x81b7 , 0x81be , 0x81c5 ,
0x81cd , 0x81d4 , 0x81dc , 0x81e4 , 0x81ec , 0x81f5 , 0x81fd , 0x8206 ,
0x820f , 0x8218 , 0x8222 , 0x822c , 0x8236 , 0x8240 , 0x824b , 0x8256 ,
0x8261 , 0x826d , 0x8279 , 0x8286 , 0x8293 , 0x82a0 , 0x82af , 0x82bd ,
0x82cd , 0x82dc , 0x82ed , 0x82ff , 0x8311 , 0x8324 , 0x8339 , 0x834e ,
0x8365 , 0x837e , 0x8398 , 0x83b5 , 0x83d3 , 0x83f5 , 0x841a , 0x8443 ,
0x8471 , 0x84a6 , 0x84e4 , 0x852e , 0x858b , 0x8607 , 0x86c3 , 0x8859 ,
// wave 1
0x0859 , 0x06c3 , 0x0607 , 0x058b , 0x052e , 0x04e4 , 0x04a6 , 0x0471 ,
0x0443 , 0x041a , 0x03f5 , 0x03d3 , 0x03b5 , 0x0398 , 0x037e , 0x0365 ,
0x034e , 0x0339 , 0x0324 , 0x0311 , 0x02ff , 0x02ed , 0x02dc , 0x02cd ,
0x02bd , 0x02af , 0x02a0 , 0x0293 , 0x0286 , 0x0279 , 0x026d , 0x0261 ,
0x0256 , 0x024b , 0x0240 , 0x0236 , 0x022c , 0x0222 , 0x0218 , 0x020f ,
0x0206 , 0x01fd , 0x01f5 , 0x01ec , 0x01e4 , 0x01dc , 0x01d4 , 0x01cd ,
0x01c5 , 0x01be , 0x01b7 , 0x01b0 , 0x01a9 , 0x01a2 , 0x019b , 0x0195 ,
0x018f , 0x0188 , 0x0182 , 0x017c , 0x0177 , 0x0171 , 0x016b , 0x0166 ,
0x0160 , 0x015b , 0x0155 , 0x0150 , 0x014b , 0x0146 , 0x0141 , 0x013c ,
0x0137 , 0x0133 , 0x012e , 0x0129 , 0x0125 , 0x0121 , 0x011c , 0x0118 ,
0x0114 , 0x010f , 0x010b , 0x0107 , 0x0103 , 0x00ff , 0x00fb , 0x00f8 ,
0x00f4 , 0x00f0 , 0x00ec , 0x00e9 , 0x00e5 , 0x00e2 , 0x00de , 0x00db ,
0x00d7 , 0x00d4 , 0x00d1 , 0x00cd , 0x00ca , 0x00c7 , 0x00c4 , 0x00c1 ,
0x00be , 0x00bb , 0x00b8 , 0x00b5 , 0x00b2 , 0x00af , 0x00ac , 0x00a9 ,
0x00a7 , 0x00a4 , 0x00a1 , 0x009f , 0x009c , 0x0099 , 0x0097 , 0x0094 ,
0x0092 , 0x008f , 0x008d , 0x008a , 0x0088 , 0x0086 , 0x0083 , 0x0081 ,
0x007f , 0x007d , 0x007a , 0x0078 , 0x0076 , 0x0074 , 0x0072 , 0x0070 ,
0x006e , 0x006c , 0x006a , 0x0068 , 0x0066 , 0x0064 , 0x0062 , 0x0060 ,
0x005e , 0x005c , 0x005b , 0x0059 , 0x0057 , 0x0055 , 0x0053 , 0x0052 ,
0x0050 , 0x004e , 0x004d , 0x004b , 0x004a , 0x0048 , 0x0046 , 0x0045 ,
0x0043 , 0x0042 , 0x0040 , 0x003f , 0x003e , 0x003c , 0x003b , 0x0039 ,
0x0038 , 0x0037 , 0x0035 , 0x0034 , 0x0033 , 0x0031 , 0x0030 , 0x002f ,
0x002e , 0x002d , 0x002b , 0x002a , 0x0029 , 0x0028 , 0x0027 , 0x0026 ,
0x0025 , 0x0024 , 0x0023 , 0x0022 , 0x0021 , 0x0020 , 0x001f , 0x001e ,
0x001d , 0x001c , 0x001b , 0x001a , 0x0019 , 0x0018 , 0x0017 , 0x0017 ,
0x0016 , 0x0015 , 0x0014 , 0x0014 , 0x0013 , 0x0012 , 0x0011 , 0x0011 ,
0x0010 , 0x000f , 0x000f , 0x000e , 0x000d , 0x000d , 0x000c , 0x000c ,
0x000b , 0x000a , 0x000a , 0x0009 , 0x0009 , 0x0008 , 0x0008 , 0x0007 ,
0x0007 , 0x0007 , 0x0006 , 0x0006 , 0x0005 , 0x0005 , 0x0005 , 0x0004 ,
0x0004 , 0x0004 , 0x0003 , 0x0003 , 0x0003 , 0x0002 , 0x0002 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0002 ,
0x0002 , 0x0002 , 0x0002 , 0x0003 , 0x0003 , 0x0003 , 0x0004 , 0x0004 ,
0x0004 , 0x0005 , 0x0005 , 0x0005 , 0x0006 , 0x0006 , 0x0007 , 0x0007 ,
0x0007 , 0x0008 , 0x0008 , 0x0009 , 0x0009 , 0x000a , 0x000a , 0x000b ,
0x000c , 0x000c , 0x000d , 0x000d , 0x000e , 0x000f , 0x000f , 0x0010 ,
0x0011 , 0x0011 , 0x0012 , 0x0013 , 0x0014 , 0x0014 , 0x0015 , 0x0016 ,
0x0017 , 0x0017 , 0x0018 , 0x0019 , 0x001a , 0x001b , 0x001c , 0x001d ,
0x001e , 0x001f , 0x0020 , 0x0021 , 0x0022 , 0x0023 , 0x0024 , 0x0025 ,
0x0026 , 0x0027 , 0x0028 , 0x0029 , 0x002a , 0x002b , 0x002d , 0x002e ,
0x002f , 0x0030 , 0x0031 , 0x0033 , 0x0034 , 0x0035 , 0x0037 , 0x0038 ,
0x0039 , 0x003b , 0x003c , 0x003e , 0x003f , 0x0040 , 0x0042 , 0x0043 ,
0x0045 , 0x0046 , 0x0048 , 0x004a , 0x004b , 0x004d , 0x004e , 0x0050 ,
0x0052 , 0x0053 , 0x0055 , 0x0057 , 0x0059 , 0x005b , 0x005c , 0x005e ,
0x0060 , 0x0062 , 0x0064 , 0x0066 , 0x0068 , 0x006a , 0x006c , 0x006e ,
0x0070 , 0x0072 , 0x0074 , 0x0076 , 0x0078 , 0x007a , 0x007d , 0x007f ,
0x0081 , 0x0083 , 0x0086 , 0x0088 , 0x008a , 0x008d , 0x008f , 0x0092 ,
0x0094 , 0x0097 , 0x0099 , 0x009c , 0x009f , 0x00a1 , 0x00a4 , 0x00a7 ,
0x00a9 , 0x00ac , 0x00af , 0x00b2 , 0x00b5 , 0x00b8 , 0x00bb , 0x00be ,
0x00c1 , 0x00c4 , 0x00c7 , 0x00ca , 0x00cd , 0x00d1 , 0x00d4 , 0x00d7 ,
0x00db , 0x00de , 0x00e2 , 0x00e5 , 0x00e9 , 0x00ec , 0x00f0 , 0x00f4 ,
0x00f8 , 0x00fb , 0x00ff , 0x0103 , 0x0107 , 0x010b , 0x010f , 0x0114 ,
0x0118 , 0x011c , 0x0121 , 0x0125 , 0x0129 , 0x012e , 0x0133 , 0x0137 ,
0x013c , 0x0141 , 0x0146 , 0x014b , 0x0150 , 0x0155 , 0x015b , 0x0160 ,
0x0166 , 0x016b , 0x0171 , 0x0177 , 0x017c , 0x0182 , 0x0188 , 0x018f ,
0x0195 , 0x019b , 0x01a2 , 0x01a9 , 0x01b0 , 0x01b7 , 0x01be , 0x01c5 ,
0x01cd , 0x01d4 , 0x01dc , 0x01e4 , 0x01ec , 0x01f5 , 0x01fd , 0x0206 ,
0x020f , 0x0218 , 0x0222 , 0x022c , 0x0236 , 0x0240 , 0x024b , 0x0256 ,
0x0261 , 0x026d , 0x0279 , 0x0286 , 0x0293 , 0x02a0 , 0x02af , 0x02bd ,
0x02cd , 0x02dc , 0x02ed , 0x02ff , 0x0311 , 0x0324 , 0x0339 , 0x034e ,
0x0365 , 0x037e , 0x0398 , 0x03b5 , 0x03d3 , 0x03f5 , 0x041a , 0x0443 ,
0x0471 , 0x04a6 , 0x04e4 , 0x052e , 0x058b , 0x0607 , 0x06c3 , 0x0859 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
// wave 2
0x0859 , 0x06c3 , 0x0607 , 0x058b , 0x052e , 0x04e4 , 0x04a6 , 0x0471 ,
0x0443 , 0x041a , 0x03f5 , 0x03d3 , 0x03b5 , 0x0398 , 0x037e , 0x0365 ,
0x034e , 0x0339 , 0x0324 , 0x0311 , 0x02ff , 0x02ed , 0x02dc , 0x02cd ,
0x02bd , 0x02af , 0x02a0 , 0x0293 , 0x0286 , 0x0279 , 0x026d , 0x0261 ,
0x0256 , 0x024b , 0x0240 , 0x0236 , 0x022c , 0x0222 , 0x0218 , 0x020f ,
0x0206 , 0x01fd , 0x01f5 , 0x01ec , 0x01e4 , 0x01dc , 0x01d4 , 0x01cd ,
0x01c5 , 0x01be , 0x01b7 , 0x01b0 , 0x01a9 , 0x01a2 , 0x019b , 0x0195 ,
0x018f , 0x0188 , 0x0182 , 0x017c , 0x0177 , 0x0171 , 0x016b , 0x0166 ,
0x0160 , 0x015b , 0x0155 , 0x0150 , 0x014b , 0x0146 , 0x0141 , 0x013c ,
0x0137 , 0x0133 , 0x012e , 0x0129 , 0x0125 , 0x0121 , 0x011c , 0x0118 ,
0x0114 , 0x010f , 0x010b , 0x0107 , 0x0103 , 0x00ff , 0x00fb , 0x00f8 ,
0x00f4 , 0x00f0 , 0x00ec , 0x00e9 , 0x00e5 , 0x00e2 , 0x00de , 0x00db ,
0x00d7 , 0x00d4 , 0x00d1 , 0x00cd , 0x00ca , 0x00c7 , 0x00c4 , 0x00c1 ,
0x00be , 0x00bb , 0x00b8 , 0x00b5 , 0x00b2 , 0x00af , 0x00ac , 0x00a9 ,
0x00a7 , 0x00a4 , 0x00a1 , 0x009f , 0x009c , 0x0099 , 0x0097 , 0x0094 ,
0x0092 , 0x008f , 0x008d , 0x008a , 0x0088 , 0x0086 , 0x0083 , 0x0081 ,
0x007f , 0x007d , 0x007a , 0x0078 , 0x0076 , 0x0074 , 0x0072 , 0x0070 ,
0x006e , 0x006c , 0x006a , 0x0068 , 0x0066 , 0x0064 , 0x0062 , 0x0060 ,
0x005e , 0x005c , 0x005b , 0x0059 , 0x0057 , 0x0055 , 0x0053 , 0x0052 ,
0x0050 , 0x004e , 0x004d , 0x004b , 0x004a , 0x0048 , 0x0046 , 0x0045 ,
0x0043 , 0x0042 , 0x0040 , 0x003f , 0x003e , 0x003c , 0x003b , 0x0039 ,
0x0038 , 0x0037 , 0x0035 , 0x0034 , 0x0033 , 0x0031 , 0x0030 , 0x002f ,
0x002e , 0x002d , 0x002b , 0x002a , 0x0029 , 0x0028 , 0x0027 , 0x0026 ,
0x0025 , 0x0024 , 0x0023 , 0x0022 , 0x0021 , 0x0020 , 0x001f , 0x001e ,
0x001d , 0x001c , 0x001b , 0x001a , 0x0019 , 0x0018 , 0x0017 , 0x0017 ,
0x0016 , 0x0015 , 0x0014 , 0x0014 , 0x0013 , 0x0012 , 0x0011 , 0x0011 ,
0x0010 , 0x000f , 0x000f , 0x000e , 0x000d , 0x000d , 0x000c , 0x000c ,
0x000b , 0x000a , 0x000a , 0x0009 , 0x0009 , 0x0008 , 0x0008 , 0x0007 ,
0x0007 , 0x0007 , 0x0006 , 0x0006 , 0x0005 , 0x0005 , 0x0005 , 0x0004 ,
0x0004 , 0x0004 , 0x0003 , 0x0003 , 0x0003 , 0x0002 , 0x0002 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0002 ,
0x0002 , 0x0002 , 0x0002 , 0x0003 , 0x0003 , 0x0003 , 0x0004 , 0x0004 ,
0x0004 , 0x0005 , 0x0005 , 0x0005 , 0x0006 , 0x0006 , 0x0007 , 0x0007 ,
0x0007 , 0x0008 , 0x0008 , 0x0009 , 0x0009 , 0x000a , 0x000a , 0x000b ,
0x000c , 0x000c , 0x000d , 0x000d , 0x000e , 0x000f , 0x000f , 0x0010 ,
0x0011 , 0x0011 , 0x0012 , 0x0013 , 0x0014 , 0x0014 , 0x0015 , 0x0016 ,
0x0017 , 0x0017 , 0x0018 , 0x0019 , 0x001a , 0x001b , 0x001c , 0x001d ,
0x001e , 0x001f , 0x0020 , 0x0021 , 0x0022 , 0x0023 , 0x0024 , 0x0025 ,
0x0026 , 0x0027 , 0x0028 , 0x0029 , 0x002a , 0x002b , 0x002d , 0x002e ,
0x002f , 0x0030 , 0x0031 , 0x0033 , 0x0034 , 0x0035 , 0x0037 , 0x0038 ,
0x0039 , 0x003b , 0x003c , 0x003e , 0x003f , 0x0040 , 0x0042 , 0x0043 ,
0x0045 , 0x0046 , 0x0048 , 0x004a , 0x004b , 0x004d , 0x004e , 0x0050 ,
0x0052 , 0x0053 , 0x0055 , 0x0057 , 0x0059 , 0x005b , 0x005c , 0x005e ,
0x0060 , 0x0062 , 0x0064 , 0x0066 , 0x0068 , 0x006a , 0x006c , 0x006e ,
0x0070 , 0x0072 , 0x0074 , 0x0076 , 0x0078 , 0x007a , 0x007d , 0x007f ,
0x0081 , 0x0083 , 0x0086 , 0x0088 , 0x008a , 0x008d , 0x008f , 0x0092 ,
0x0094 , 0x0097 , 0x0099 , 0x009c , 0x009f , 0x00a1 , 0x00a4 , 0x00a7 ,
0x00a9 , 0x00ac , 0x00af , 0x00b2 , 0x00b5 , 0x00b8 , 0x00bb , 0x00be ,
0x00c1 , 0x00c4 , 0x00c7 , 0x00ca , 0x00cd , 0x00d1 , 0x00d4 , 0x00d7 ,
0x00db , 0x00de , 0x00e2 , 0x00e5 , 0x00e9 , 0x00ec , 0x00f0 , 0x00f4 ,
0x00f8 , 0x00fb , 0x00ff , 0x0103 , 0x0107 , 0x010b , 0x010f , 0x0114 ,
0x0118 , 0x011c , 0x0121 , 0x0125 , 0x0129 , 0x012e , 0x0133 , 0x0137 ,
0x013c , 0x0141 , 0x0146 , 0x014b , 0x0150 , 0x0155 , 0x015b , 0x0160 ,
0x0166 , 0x016b , 0x0171 , 0x0177 , 0x017c , 0x0182 , 0x0188 , 0x018f ,
0x0195 , 0x019b , 0x01a2 , 0x01a9 , 0x01b0 , 0x01b7 , 0x01be , 0x01c5 ,
0x01cd , 0x01d4 , 0x01dc , 0x01e4 , 0x01ec , 0x01f5 , 0x01fd , 0x0206 ,
0x020f , 0x0218 , 0x0222 , 0x022c , 0x0236 , 0x0240 , 0x024b , 0x0256 ,
0x0261 , 0x026d , 0x0279 , 0x0286 , 0x0293 , 0x02a0 , 0x02af , 0x02bd ,
0x02cd , 0x02dc , 0x02ed , 0x02ff , 0x0311 , 0x0324 , 0x0339 , 0x034e ,
0x0365 , 0x037e , 0x0398 , 0x03b5 , 0x03d3 , 0x03f5 , 0x041a , 0x0443 ,
0x0471 , 0x04a6 , 0x04e4 , 0x052e , 0x058b , 0x0607 , 0x06c3 , 0x0859 ,
0x0859 , 0x06c3 , 0x0607 , 0x058b , 0x052e , 0x04e4 , 0x04a6 , 0x0471 ,
0x0443 , 0x041a , 0x03f5 , 0x03d3 , 0x03b5 , 0x0398 , 0x037e , 0x0365 ,
0x034e , 0x0339 , 0x0324 , 0x0311 , 0x02ff , 0x02ed , 0x02dc , 0x02cd ,
0x02bd , 0x02af , 0x02a0 , 0x0293 , 0x0286 , 0x0279 , 0x026d , 0x0261 ,
0x0256 , 0x024b , 0x0240 , 0x0236 , 0x022c , 0x0222 , 0x0218 , 0x020f ,
0x0206 , 0x01fd , 0x01f5 , 0x01ec , 0x01e4 , 0x01dc , 0x01d4 , 0x01cd ,
0x01c5 , 0x01be , 0x01b7 , 0x01b0 , 0x01a9 , 0x01a2 , 0x019b , 0x0195 ,
0x018f , 0x0188 , 0x0182 , 0x017c , 0x0177 , 0x0171 , 0x016b , 0x0166 ,
0x0160 , 0x015b , 0x0155 , 0x0150 , 0x014b , 0x0146 , 0x0141 , 0x013c ,
0x0137 , 0x0133 , 0x012e , 0x0129 , 0x0125 , 0x0121 , 0x011c , 0x0118 ,
0x0114 , 0x010f , 0x010b , 0x0107 , 0x0103 , 0x00ff , 0x00fb , 0x00f8 ,
0x00f4 , 0x00f0 , 0x00ec , 0x00e9 , 0x00e5 , 0x00e2 , 0x00de , 0x00db ,
0x00d7 , 0x00d4 , 0x00d1 , 0x00cd , 0x00ca , 0x00c7 , 0x00c4 , 0x00c1 ,
0x00be , 0x00bb , 0x00b8 , 0x00b5 , 0x00b2 , 0x00af , 0x00ac , 0x00a9 ,
0x00a7 , 0x00a4 , 0x00a1 , 0x009f , 0x009c , 0x0099 , 0x0097 , 0x0094 ,
0x0092 , 0x008f , 0x008d , 0x008a , 0x0088 , 0x0086 , 0x0083 , 0x0081 ,
0x007f , 0x007d , 0x007a , 0x0078 , 0x0076 , 0x0074 , 0x0072 , 0x0070 ,
0x006e , 0x006c , 0x006a , 0x0068 , 0x0066 , 0x0064 , 0x0062 , 0x0060 ,
0x005e , 0x005c , 0x005b , 0x0059 , 0x0057 , 0x0055 , 0x0053 , 0x0052 ,
0x0050 , 0x004e , 0x004d , 0x004b , 0x004a , 0x0048 , 0x0046 , 0x0045 ,
0x0043 , 0x0042 , 0x0040 , 0x003f , 0x003e , 0x003c , 0x003b , 0x0039 ,
0x0038 , 0x0037 , 0x0035 , 0x0034 , 0x0033 , 0x0031 , 0x0030 , 0x002f ,
0x002e , 0x002d , 0x002b , 0x002a , 0x0029 , 0x0028 , 0x0027 , 0x0026 ,
0x0025 , 0x0024 , 0x0023 , 0x0022 , 0x0021 , 0x0020 , 0x001f , 0x001e ,
0x001d , 0x001c , 0x001b , 0x001a , 0x0019 , 0x0018 , 0x0017 , 0x0017 ,
0x0016 , 0x0015 , 0x0014 , 0x0014 , 0x0013 , 0x0012 , 0x0011 , 0x0011 ,
0x0010 , 0x000f , 0x000f , 0x000e , 0x000d , 0x000d , 0x000c , 0x000c ,
0x000b , 0x000a , 0x000a , 0x0009 , 0x0009 , 0x0008 , 0x0008 , 0x0007 ,
0x0007 , 0x0007 , 0x0006 , 0x0006 , 0x0005 , 0x0005 , 0x0005 , 0x0004 ,
0x0004 , 0x0004 , 0x0003 , 0x0003 , 0x0003 , 0x0002 , 0x0002 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0002 ,
0x0002 , 0x0002 , 0x0002 , 0x0003 , 0x0003 , 0x0003 , 0x0004 , 0x0004 ,
0x0004 , 0x0005 , 0x0005 , 0x0005 , 0x0006 , 0x0006 , 0x0007 , 0x0007 ,
0x0007 , 0x0008 , 0x0008 , 0x0009 , 0x0009 , 0x000a , 0x000a , 0x000b ,
0x000c , 0x000c , 0x000d , 0x000d , 0x000e , 0x000f , 0x000f , 0x0010 ,
0x0011 , 0x0011 , 0x0012 , 0x0013 , 0x0014 , 0x0014 , 0x0015 , 0x0016 ,
0x0017 , 0x0017 , 0x0018 , 0x0019 , 0x001a , 0x001b , 0x001c , 0x001d ,
0x001e , 0x001f , 0x0020 , 0x0021 , 0x0022 , 0x0023 , 0x0024 , 0x0025 ,
0x0026 , 0x0027 , 0x0028 , 0x0029 , 0x002a , 0x002b , 0x002d , 0x002e ,
0x002f , 0x0030 , 0x0031 , 0x0033 , 0x0034 , 0x0035 , 0x0037 , 0x0038 ,
0x0039 , 0x003b , 0x003c , 0x003e , 0x003f , 0x0040 , 0x0042 , 0x0043 ,
0x0045 , 0x0046 , 0x0048 , 0x004a , 0x004b , 0x004d , 0x004e , 0x0050 ,
0x0052 , 0x0053 , 0x0055 , 0x0057 , 0x0059 , 0x005b , 0x005c , 0x005e ,
0x0060 , 0x0062 , 0x0064 , 0x0066 , 0x0068 , 0x006a , 0x006c , 0x006e ,
0x0070 , 0x0072 , 0x0074 , 0x0076 , 0x0078 , 0x007a , 0x007d , 0x007f ,
0x0081 , 0x0083 , 0x0086 , 0x0088 , 0x008a , 0x008d , 0x008f , 0x0092 ,
0x0094 , 0x0097 , 0x0099 , 0x009c , 0x009f , 0x00a1 , 0x00a4 , 0x00a7 ,
0x00a9 , 0x00ac , 0x00af , 0x00b2 , 0x00b5 , 0x00b8 , 0x00bb , 0x00be ,
0x00c1 , 0x00c4 , 0x00c7 , 0x00ca , 0x00cd , 0x00d1 , 0x00d4 , 0x00d7 ,
0x00db , 0x00de , 0x00e2 , 0x00e5 , 0x00e9 , 0x00ec , 0x00f0 , 0x00f4 ,
0x00f8 , 0x00fb , 0x00ff , 0x0103 , 0x0107 , 0x010b , 0x010f , 0x0114 ,
0x0118 , 0x011c , 0x0121 , 0x0125 , 0x0129 , 0x012e , 0x0133 , 0x0137 ,
0x013c , 0x0141 , 0x0146 , 0x014b , 0x0150 , 0x0155 , 0x015b , 0x0160 ,
0x0166 , 0x016b , 0x0171 , 0x0177 , 0x017c , 0x0182 , 0x0188 , 0x018f ,
0x0195 , 0x019b , 0x01a2 , 0x01a9 , 0x01b0 , 0x01b7 , 0x01be , 0x01c5 ,
0x01cd , 0x01d4 , 0x01dc , 0x01e4 , 0x01ec , 0x01f5 , 0x01fd , 0x0206 ,
0x020f , 0x0218 , 0x0222 , 0x022c , 0x0236 , 0x0240 , 0x024b , 0x0256 ,
0x0261 , 0x026d , 0x0279 , 0x0286 , 0x0293 , 0x02a0 , 0x02af , 0x02bd ,
0x02cd , 0x02dc , 0x02ed , 0x02ff , 0x0311 , 0x0324 , 0x0339 , 0x034e ,
0x0365 , 0x037e , 0x0398 , 0x03b5 , 0x03d3 , 0x03f5 , 0x041a , 0x0443 ,
0x0471 , 0x04a6 , 0x04e4 , 0x052e , 0x058b , 0x0607 , 0x06c3 , 0x0859 ,
// wave 3
0x0859 , 0x06c3 , 0x0607 , 0x058b , 0x052e , 0x04e4 , 0x04a6 , 0x0471 ,
0x0443 , 0x041a , 0x03f5 , 0x03d3 , 0x03b5 , 0x0398 , 0x037e , 0x0365 ,
0x034e , 0x0339 , 0x0324 , 0x0311 , 0x02ff , 0x02ed , 0x02dc , 0x02cd ,
0x02bd , 0x02af , 0x02a0 , 0x0293 , 0x0286 , 0x0279 , 0x026d , 0x0261 ,
0x0256 , 0x024b , 0x0240 , 0x0236 , 0x022c , 0x0222 , 0x0218 , 0x020f ,
0x0206 , 0x01fd , 0x01f5 , 0x01ec , 0x01e4 , 0x01dc , 0x01d4 , 0x01cd ,
0x01c5 , 0x01be , 0x01b7 , 0x01b0 , 0x01a9 , 0x01a2 , 0x019b , 0x0195 ,
0x018f , 0x0188 , 0x0182 , 0x017c , 0x0177 , 0x0171 , 0x016b , 0x0166 ,
0x0160 , 0x015b , 0x0155 , 0x0150 , 0x014b , 0x0146 , 0x0141 , 0x013c ,
0x0137 , 0x0133 , 0x012e , 0x0129 , 0x0125 , 0x0121 , 0x011c , 0x0118 ,
0x0114 , 0x010f , 0x010b , 0x0107 , 0x0103 , 0x00ff , 0x00fb , 0x00f8 ,
0x00f4 , 0x00f0 , 0x00ec , 0x00e9 , 0x00e5 , 0x00e2 , 0x00de , 0x00db ,
0x00d7 , 0x00d4 , 0x00d1 , 0x00cd , 0x00ca , 0x00c7 , 0x00c4 , 0x00c1 ,
0x00be , 0x00bb , 0x00b8 , 0x00b5 , 0x00b2 , 0x00af , 0x00ac , 0x00a9 ,
0x00a7 , 0x00a4 , 0x00a1 , 0x009f , 0x009c , 0x0099 , 0x0097 , 0x0094 ,
0x0092 , 0x008f , 0x008d , 0x008a , 0x0088 , 0x0086 , 0x0083 , 0x0081 ,
0x007f , 0x007d , 0x007a , 0x0078 , 0x0076 , 0x0074 , 0x0072 , 0x0070 ,
0x006e , 0x006c , 0x006a , 0x0068 , 0x0066 , 0x0064 , 0x0062 , 0x0060 ,
0x005e , 0x005c , 0x005b , 0x0059 , 0x0057 , 0x0055 , 0x0053 , 0x0052 ,
0x0050 , 0x004e , 0x004d , 0x004b , 0x004a , 0x0048 , 0x0046 , 0x0045 ,
0x0043 , 0x0042 , 0x0040 , 0x003f , 0x003e , 0x003c , 0x003b , 0x0039 ,
0x0038 , 0x0037 , 0x0035 , 0x0034 , 0x0033 , 0x0031 , 0x0030 , 0x002f ,
0x002e , 0x002d , 0x002b , 0x002a , 0x0029 , 0x0028 , 0x0027 , 0x0026 ,
0x0025 , 0x0024 , 0x0023 , 0x0022 , 0x0021 , 0x0020 , 0x001f , 0x001e ,
0x001d , 0x001c , 0x001b , 0x001a , 0x0019 , 0x0018 , 0x0017 , 0x0017 ,
0x0016 , 0x0015 , 0x0014 , 0x0014 , 0x0013 , 0x0012 , 0x0011 , 0x0011 ,
0x0010 , 0x000f , 0x000f , 0x000e , 0x000d , 0x000d , 0x000c , 0x000c ,
0x000b , 0x000a , 0x000a , 0x0009 , 0x0009 , 0x0008 , 0x0008 , 0x0007 ,
0x0007 , 0x0007 , 0x0006 , 0x0006 , 0x0005 , 0x0005 , 0x0005 , 0x0004 ,
0x0004 , 0x0004 , 0x0003 , 0x0003 , 0x0003 , 0x0002 , 0x0002 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x0859 , 0x06c3 , 0x0607 , 0x058b , 0x052e , 0x04e4 , 0x04a6 , 0x0471 ,
0x0443 , 0x041a , 0x03f5 , 0x03d3 , 0x03b5 , 0x0398 , 0x037e , 0x0365 ,
0x034e , 0x0339 , 0x0324 , 0x0311 , 0x02ff , 0x02ed , 0x02dc , 0x02cd ,
0x02bd , 0x02af , 0x02a0 , 0x0293 , 0x0286 , 0x0279 , 0x026d , 0x0261 ,
0x0256 , 0x024b , 0x0240 , 0x0236 , 0x022c , 0x0222 , 0x0218 , 0x020f ,
0x0206 , 0x01fd , 0x01f5 , 0x01ec , 0x01e4 , 0x01dc , 0x01d4 , 0x01cd ,
0x01c5 , 0x01be , 0x01b7 , 0x01b0 , 0x01a9 , 0x01a2 , 0x019b , 0x0195 ,
0x018f , 0x0188 , 0x0182 , 0x017c , 0x0177 , 0x0171 , 0x016b , 0x0166 ,
0x0160 , 0x015b , 0x0155 , 0x0150 , 0x014b , 0x0146 , 0x0141 , 0x013c ,
0x0137 , 0x0133 , 0x012e , 0x0129 , 0x0125 , 0x0121 , 0x011c , 0x0118 ,
0x0114 , 0x010f , 0x010b , 0x0107 , 0x0103 , 0x00ff , 0x00fb , 0x00f8 ,
0x00f4 , 0x00f0 , 0x00ec , 0x00e9 , 0x00e5 , 0x00e2 , 0x00de , 0x00db ,
0x00d7 , 0x00d4 , 0x00d1 , 0x00cd , 0x00ca , 0x00c7 , 0x00c4 , 0x00c1 ,
0x00be , 0x00bb , 0x00b8 , 0x00b5 , 0x00b2 , 0x00af , 0x00ac , 0x00a9 ,
0x00a7 , 0x00a4 , 0x00a1 , 0x009f , 0x009c , 0x0099 , 0x0097 , 0x0094 ,
0x0092 , 0x008f , 0x008d , 0x008a , 0x0088 , 0x0086 , 0x0083 , 0x0081 ,
0x007f , 0x007d , 0x007a , 0x0078 , 0x0076 , 0x0074 , 0x0072 , 0x0070 ,
0x006e , 0x006c , 0x006a , 0x0068 , 0x0066 , 0x0064 , 0x0062 , 0x0060 ,
0x005e , 0x005c , 0x005b , 0x0059 , 0x0057 , 0x0055 , 0x0053 , 0x0052 ,
0x0050 , 0x004e , 0x004d , 0x004b , 0x004a , 0x0048 , 0x0046 , 0x0045 ,
0x0043 , 0x0042 , 0x0040 , 0x003f , 0x003e , 0x003c , 0x003b , 0x0039 ,
0x0038 , 0x0037 , 0x0035 , 0x0034 , 0x0033 , 0x0031 , 0x0030 , 0x002f ,
0x002e , 0x002d , 0x002b , 0x002a , 0x0029 , 0x0028 , 0x0027 , 0x0026 ,
0x0025 , 0x0024 , 0x0023 , 0x0022 , 0x0021 , 0x0020 , 0x001f , 0x001e ,
0x001d , 0x001c , 0x001b , 0x001a , 0x0019 , 0x0018 , 0x0017 , 0x0017 ,
0x0016 , 0x0015 , 0x0014 , 0x0014 , 0x0013 , 0x0012 , 0x0011 , 0x0011 ,
0x0010 , 0x000f , 0x000f , 0x000e , 0x000d , 0x000d , 0x000c , 0x000c ,
0x000b , 0x000a , 0x000a , 0x0009 , 0x0009 , 0x0008 , 0x0008 , 0x0007 ,
0x0007 , 0x0007 , 0x0006 , 0x0006 , 0x0005 , 0x0005 , 0x0005 , 0x0004 ,
0x0004 , 0x0004 , 0x0003 , 0x0003 , 0x0003 , 0x0002 , 0x0002 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 , 0x0001 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
// wave 4
0x0859 , 0x0607 , 0x052e , 0x04a6 , 0x0443 , 0x03f5 , 0x03b5 , 0x037e ,
0x034e , 0x0324 , 0x02ff , 0x02dc , 0x02bd , 0x02a0 , 0x0286 , 0x026d ,
0x0256 , 0x0240 , 0x022c , 0x0218 , 0x0206 , 0x01f5 , 0x01e4 , 0x01d4 ,
0x01c5 , 0x01b7 , 0x01a9 , 0x019b , 0x018f , 0x0182 , 0x0177 , 0x016b ,
0x0160 , 0x0155 , 0x014b , 0x0141 , 0x0137 , 0x012e , 0x0125 , 0x011c ,
0x0114 , 0x010b , 0x0103 , 0x00fb , 0x00f4 , 0x00ec , 0x00e5 , 0x00de ,
0x00d7 , 0x00d1 , 0x00ca , 0x00c4 , 0x00be , 0x00b8 , 0x00b2 , 0x00ac ,
0x00a7 , 0x00a1 , 0x009c , 0x0097 , 0x0092 , 0x008d , 0x0088 , 0x0083 ,
0x007f , 0x007a , 0x0076 , 0x0072 , 0x006e , 0x006a , 0x0066 , 0x0062 ,
0x005e , 0x005b , 0x0057 , 0x0053 , 0x0050 , 0x004d , 0x004a , 0x0046 ,
0x0043 , 0x0040 , 0x003e , 0x003b , 0x0038 , 0x0035 , 0x0033 , 0x0030 ,
0x002e , 0x002b , 0x0029 , 0x0027 , 0x0025 , 0x0023 , 0x0021 , 0x001f ,
0x001d , 0x001b , 0x0019 , 0x0017 , 0x0016 , 0x0014 , 0x0013 , 0x0011 ,
0x0010 , 0x000f , 0x000d , 0x000c , 0x000b , 0x000a , 0x0009 , 0x0008 ,
0x0007 , 0x0006 , 0x0005 , 0x0005 , 0x0004 , 0x0003 , 0x0003 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0001 , 0x0001 , 0x0001 , 0x0002 ,
0x0002 , 0x0003 , 0x0003 , 0x0004 , 0x0005 , 0x0005 , 0x0006 , 0x0007 ,
0x0008 , 0x0009 , 0x000a , 0x000b , 0x000c , 0x000d , 0x000f , 0x0010 ,
0x0011 , 0x0013 , 0x0014 , 0x0016 , 0x0017 , 0x0019 , 0x001b , 0x001d ,
0x001f , 0x0021 , 0x0023 , 0x0025 , 0x0027 , 0x0029 , 0x002b , 0x002e ,
0x0030 , 0x0033 , 0x0035 , 0x0038 , 0x003b , 0x003e , 0x0040 , 0x0043 ,
0x0046 , 0x004a , 0x004d , 0x0050 , 0x0053 , 0x0057 , 0x005b , 0x005e ,
0x0062 , 0x0066 , 0x006a , 0x006e , 0x0072 , 0x0076 , 0x007a , 0x007f ,
0x0083 , 0x0088 , 0x008d , 0x0092 , 0x0097 , 0x009c , 0x00a1 , 0x00a7 ,
0x00ac , 0x00b2 , 0x00b8 , 0x00be , 0x00c4 , 0x00ca , 0x00d1 , 0x00d7 ,
0x00de , 0x00e5 , 0x00ec , 0x00f4 , 0x00fb , 0x0103 , 0x010b , 0x0114 ,
0x011c , 0x0125 , 0x012e , 0x0137 , 0x0141 , 0x014b , 0x0155 , 0x0160 ,
0x016b , 0x0177 , 0x0182 , 0x018f , 0x019b , 0x01a9 , 0x01b7 , 0x01c5 ,
0x01d4 , 0x01e4 , 0x01f5 , 0x0206 , 0x0218 , 0x022c , 0x0240 , 0x0256 ,
0x026d , 0x0286 , 0x02a0 , 0x02bd , 0x02dc , 0x02ff , 0x0324 , 0x034e ,
0x037e , 0x03b5 , 0x03f5 , 0x0443 , 0x04a6 , 0x052e , 0x0607 , 0x0859 ,
0x8859 , 0x8607 , 0x852e , 0x84a6 , 0x8443 , 0x83f5 , 0x83b5 , 0x837e ,
0x834e , 0x8324 , 0x82ff , 0x82dc , 0x82bd , 0x82a0 , 0x8286 , 0x826d ,
0x8256 , 0x8240 , 0x822c , 0x8218 , 0x8206 , 0x81f5 , 0x81e4 , 0x81d4 ,
0x81c5 , 0x81b7 , 0x81a9 , 0x819b , 0x818f , 0x8182 , 0x8177 , 0x816b ,
0x8160 , 0x8155 , 0x814b , 0x8141 , 0x8137 , 0x812e , 0x8125 , 0x811c ,
0x8114 , 0x810b , 0x8103 , 0x80fb , 0x80f4 , 0x80ec , 0x80e5 , 0x80de ,
0x80d7 , 0x80d1 , 0x80ca , 0x80c4 , 0x80be , 0x80b8 , 0x80b2 , 0x80ac ,
0x80a7 , 0x80a1 , 0x809c , 0x8097 , 0x8092 , 0x808d , 0x8088 , 0x8083 ,
0x807f , 0x807a , 0x8076 , 0x8072 , 0x806e , 0x806a , 0x8066 , 0x8062 ,
0x805e , 0x805b , 0x8057 , 0x8053 , 0x8050 , 0x804d , 0x804a , 0x8046 ,
0x8043 , 0x8040 , 0x803e , 0x803b , 0x8038 , 0x8035 , 0x8033 , 0x8030 ,
0x802e , 0x802b , 0x8029 , 0x8027 , 0x8025 , 0x8023 , 0x8021 , 0x801f ,
0x801d , 0x801b , 0x8019 , 0x8017 , 0x8016 , 0x8014 , 0x8013 , 0x8011 ,
0x8010 , 0x800f , 0x800d , 0x800c , 0x800b , 0x800a , 0x8009 , 0x8008 ,
0x8007 , 0x8006 , 0x8005 , 0x8005 , 0x8004 , 0x8003 , 0x8003 , 0x8002 ,
0x8002 , 0x8001 , 0x8001 , 0x8001 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8001 , 0x8001 , 0x8001 , 0x8002 ,
0x8002 , 0x8003 , 0x8003 , 0x8004 , 0x8005 , 0x8005 , 0x8006 , 0x8007 ,
0x8008 , 0x8009 , 0x800a , 0x800b , 0x800c , 0x800d , 0x800f , 0x8010 ,
0x8011 , 0x8013 , 0x8014 , 0x8016 , 0x8017 , 0x8019 , 0x801b , 0x801d ,
0x801f , 0x8021 , 0x8023 , 0x8025 , 0x8027 , 0x8029 , 0x802b , 0x802e ,
0x8030 , 0x8033 , 0x8035 , 0x8038 , 0x803b , 0x803e , 0x8040 , 0x8043 ,
0x8046 , 0x804a , 0x804d , 0x8050 , 0x8053 , 0x8057 , 0x805b , 0x805e ,
0x8062 , 0x8066 , 0x806a , 0x806e , 0x8072 , 0x8076 , 0x807a , 0x807f ,
0x8083 , 0x8088 , 0x808d , 0x8092 , 0x8097 , 0x809c , 0x80a1 , 0x80a7 ,
0x80ac , 0x80b2 , 0x80b8 , 0x80be , 0x80c4 , 0x80ca , 0x80d1 , 0x80d7 ,
0x80de , 0x80e5 , 0x80ec , 0x80f4 , 0x80fb , 0x8103 , 0x810b , 0x8114 ,
0x811c , 0x8125 , 0x812e , 0x8137 , 0x8141 , 0x814b , 0x8155 , 0x8160 ,
0x816b , 0x8177 , 0x8182 , 0x818f , 0x819b , 0x81a9 , 0x81b7 , 0x81c5 ,
0x81d4 , 0x81e4 , 0x81f5 , 0x8206 , 0x8218 , 0x822c , 0x8240 , 0x8256 ,
0x826d , 0x8286 , 0x82a0 , 0x82bd , 0x82dc , 0x82ff , 0x8324 , 0x834e ,
0x837e , 0x83b5 , 0x83f5 , 0x8443 , 0x84a6 , 0x852e , 0x8607 , 0x8859 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
// wave 5
0x0859 , 0x0607 , 0x052e , 0x04a6 , 0x0443 , 0x03f5 , 0x03b5 , 0x037e ,
0x034e , 0x0324 , 0x02ff , 0x02dc , 0x02bd , 0x02a0 , 0x0286 , 0x026d ,
0x0256 , 0x0240 , 0x022c , 0x0218 , 0x0206 , 0x01f5 , 0x01e4 , 0x01d4 ,
0x01c5 , 0x01b7 , 0x01a9 , 0x019b , 0x018f , 0x0182 , 0x0177 , 0x016b ,
0x0160 , 0x0155 , 0x014b , 0x0141 , 0x0137 , 0x012e , 0x0125 , 0x011c ,
0x0114 , 0x010b , 0x0103 , 0x00fb , 0x00f4 , 0x00ec , 0x00e5 , 0x00de ,
0x00d7 , 0x00d1 , 0x00ca , 0x00c4 , 0x00be , 0x00b8 , 0x00b2 , 0x00ac ,
0x00a7 , 0x00a1 , 0x009c , 0x0097 , 0x0092 , 0x008d , 0x0088 , 0x0083 ,
0x007f , 0x007a , 0x0076 , 0x0072 , 0x006e , 0x006a , 0x0066 , 0x0062 ,
0x005e , 0x005b , 0x0057 , 0x0053 , 0x0050 , 0x004d , 0x004a , 0x0046 ,
0x0043 , 0x0040 , 0x003e , 0x003b , 0x0038 , 0x0035 , 0x0033 , 0x0030 ,
0x002e , 0x002b , 0x0029 , 0x0027 , 0x0025 , 0x0023 , 0x0021 , 0x001f ,
0x001d , 0x001b , 0x0019 , 0x0017 , 0x0016 , 0x0014 , 0x0013 , 0x0011 ,
0x0010 , 0x000f , 0x000d , 0x000c , 0x000b , 0x000a , 0x0009 , 0x0008 ,
0x0007 , 0x0006 , 0x0005 , 0x0005 , 0x0004 , 0x0003 , 0x0003 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0001 , 0x0001 , 0x0001 , 0x0002 ,
0x0002 , 0x0003 , 0x0003 , 0x0004 , 0x0005 , 0x0005 , 0x0006 , 0x0007 ,
0x0008 , 0x0009 , 0x000a , 0x000b , 0x000c , 0x000d , 0x000f , 0x0010 ,
0x0011 , 0x0013 , 0x0014 , 0x0016 , 0x0017 , 0x0019 , 0x001b , 0x001d ,
0x001f , 0x0021 , 0x0023 , 0x0025 , 0x0027 , 0x0029 , 0x002b , 0x002e ,
0x0030 , 0x0033 , 0x0035 , 0x0038 , 0x003b , 0x003e , 0x0040 , 0x0043 ,
0x0046 , 0x004a , 0x004d , 0x0050 , 0x0053 , 0x0057 , 0x005b , 0x005e ,
0x0062 , 0x0066 , 0x006a , 0x006e , 0x0072 , 0x0076 , 0x007a , 0x007f ,
0x0083 , 0x0088 , 0x008d , 0x0092 , 0x0097 , 0x009c , 0x00a1 , 0x00a7 ,
0x00ac , 0x00b2 , 0x00b8 , 0x00be , 0x00c4 , 0x00ca , 0x00d1 , 0x00d7 ,
0x00de , 0x00e5 , 0x00ec , 0x00f4 , 0x00fb , 0x0103 , 0x010b , 0x0114 ,
0x011c , 0x0125 , 0x012e , 0x0137 , 0x0141 , 0x014b , 0x0155 , 0x0160 ,
0x016b , 0x0177 , 0x0182 , 0x018f , 0x019b , 0x01a9 , 0x01b7 , 0x01c5 ,
0x01d4 , 0x01e4 , 0x01f5 , 0x0206 , 0x0218 , 0x022c , 0x0240 , 0x0256 ,
0x026d , 0x0286 , 0x02a0 , 0x02bd , 0x02dc , 0x02ff , 0x0324 , 0x034e ,
0x037e , 0x03b5 , 0x03f5 , 0x0443 , 0x04a6 , 0x052e , 0x0607 , 0x0859 ,
0x0859 , 0x0607 , 0x052e , 0x04a6 , 0x0443 , 0x03f5 , 0x03b5 , 0x037e ,
0x034e , 0x0324 , 0x02ff , 0x02dc , 0x02bd , 0x02a0 , 0x0286 , 0x026d ,
0x0256 , 0x0240 , 0x022c , 0x0218 , 0x0206 , 0x01f5 , 0x01e4 , 0x01d4 ,
0x01c5 , 0x01b7 , 0x01a9 , 0x019b , 0x018f , 0x0182 , 0x0177 , 0x016b ,
0x0160 , 0x0155 , 0x014b , 0x0141 , 0x0137 , 0x012e , 0x0125 , 0x011c ,
0x0114 , 0x010b , 0x0103 , 0x00fb , 0x00f4 , 0x00ec , 0x00e5 , 0x00de ,
0x00d7 , 0x00d1 , 0x00ca , 0x00c4 , 0x00be , 0x00b8 , 0x00b2 , 0x00ac ,
0x00a7 , 0x00a1 , 0x009c , 0x0097 , 0x0092 , 0x008d , 0x0088 , 0x0083 ,
0x007f , 0x007a , 0x0076 , 0x0072 , 0x006e , 0x006a , 0x0066 , 0x0062 ,
0x005e , 0x005b , 0x0057 , 0x0053 , 0x0050 , 0x004d , 0x004a , 0x0046 ,
0x0043 , 0x0040 , 0x003e , 0x003b , 0x0038 , 0x0035 , 0x0033 , 0x0030 ,
0x002e , 0x002b , 0x0029 , 0x0027 , 0x0025 , 0x0023 , 0x0021 , 0x001f ,
0x001d , 0x001b , 0x0019 , 0x0017 , 0x0016 , 0x0014 , 0x0013 , 0x0011 ,
0x0010 , 0x000f , 0x000d , 0x000c , 0x000b , 0x000a , 0x0009 , 0x0008 ,
0x0007 , 0x0006 , 0x0005 , 0x0005 , 0x0004 , 0x0003 , 0x0003 , 0x0002 ,
0x0002 , 0x0001 , 0x0001 , 0x0001 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0001 , 0x0001 , 0x0001 , 0x0002 ,
0x0002 , 0x0003 , 0x0003 , 0x0004 , 0x0005 , 0x0005 , 0x0006 , 0x0007 ,
0x0008 , 0x0009 , 0x000a , 0x000b , 0x000c , 0x000d , 0x000f , 0x0010 ,
0x0011 , 0x0013 , 0x0014 , 0x0016 , 0x0017 , 0x0019 , 0x001b , 0x001d ,
0x001f , 0x0021 , 0x0023 , 0x0025 , 0x0027 , 0x0029 , 0x002b , 0x002e ,
0x0030 , 0x0033 , 0x0035 , 0x0038 , 0x003b , 0x003e , 0x0040 , 0x0043 ,
0x0046 , 0x004a , 0x004d , 0x0050 , 0x0053 , 0x0057 , 0x005b , 0x005e ,
0x0062 , 0x0066 , 0x006a , 0x006e , 0x0072 , 0x0076 , 0x007a , 0x007f ,
0x0083 , 0x0088 , 0x008d , 0x0092 , 0x0097 , 0x009c , 0x00a1 , 0x00a7 ,
0x00ac , 0x00b2 , 0x00b8 , 0x00be , 0x00c4 , 0x00ca , 0x00d1 , 0x00d7 ,
0x00de , 0x00e5 , 0x00ec , 0x00f4 , 0x00fb , 0x0103 , 0x010b , 0x0114 ,
0x011c , 0x0125 , 0x012e , 0x0137 , 0x0141 , 0x014b , 0x0155 , 0x0160 ,
0x016b , 0x0177 , 0x0182 , 0x018f , 0x019b , 0x01a9 , 0x01b7 , 0x01c5 ,
0x01d4 , 0x01e4 , 0x01f5 , 0x0206 , 0x0218 , 0x022c , 0x0240 , 0x0256 ,
0x026d , 0x0286 , 0x02a0 , 0x02bd , 0x02dc , 0x02ff , 0x0324 , 0x034e ,
0x037e , 0x03b5 , 0x03f5 , 0x0443 , 0x04a6 , 0x052e , 0x0607 , 0x0859 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 , 0x1000 ,
// wave 6
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 , 0x0000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 , 0x8000 ,
// wave 7
0x0000 , 0x0008 , 0x0010 , 0x0018 , 0x0020 , 0x0028 , 0x0030 , 0x0038 ,
0x0040 , 0x0048 , 0x0050 , 0x0058 , 0x0060 , 0x0068 , 0x0070 , 0x0078 ,
0x0080 , 0x0088 , 0x0090 , 0x0098 , 0x00a0 , 0x00a8 , 0x00b0 , 0x00b8 ,
0x00c0 , 0x00c8 , 0x00d0 , 0x00d8 , 0x00e0 , 0x00e8 , 0x00f0 , 0x00f8 ,
0x0100 , 0x0108 , 0x0110 , 0x0118 , 0x0120 , 0x0128 , 0x0130 , 0x0138 ,
0x0140 , 0x0148 , 0x0150 , 0x0158 , 0x0160 , 0x0168 , 0x0170 , 0x0178 ,
0x0180 , 0x0188 , 0x0190 , 0x0198 , 0x01a0 , 0x01a8 , 0x01b0 , 0x01b8 ,
0x01c0 , 0x01c8 , 0x01d0 , 0x01d8 , 0x01e0 , 0x01e8 , 0x01f0 , 0x01f8 ,
0x0200 , 0x0208 , 0x0210 , 0x0218 , 0x0220 , 0x0228 , 0x0230 , 0x0238 ,
0x0240 , 0x0248 , 0x0250 , 0x0258 , 0x0260 , 0x0268 , 0x0270 , 0x0278 ,
0x0280 , 0x0288 , 0x0290 , 0x0298 , 0x02a0 , 0x02a8 , 0x02b0 , 0x02b8 ,
0x02c0 , 0x02c8 , 0x02d0 , 0x02d8 , 0x02e0 , 0x02e8 , 0x02f0 , 0x02f8 ,
0x0300 , 0x0308 , 0x0310 , 0x0318 , 0x0320 , 0x0328 , 0x0330 , 0x0338 ,
0x0340 , 0x0348 , 0x0350 , 0x0358 , 0x0360 , 0x0368 , 0x0370 , 0x0378 ,
0x0380 , 0x0388 , 0x0390 , 0x0398 , 0x03a0 , 0x03a8 , 0x03b0 , 0x03b8 ,
0x03c0 , 0x03c8 , 0x03d0 , 0x03d8 , 0x03e0 , 0x03e8 , 0x03f0 , 0x03f8 ,
0x0400 , 0x0408 , 0x0410 , 0x0418 , 0x0420 , 0x0428 , 0x0430 , 0x0438 ,
0x0440 , 0x0448 , 0x0450 , 0x0458 , 0x0460 , 0x0468 , 0x0470 , 0x0478 ,
0x0480 , 0x0488 , 0x0490 , 0x0498 , 0x04a0 , 0x04a8 , 0x04b0 , 0x04b8 ,
0x04c0 , 0x04c8 , 0x04d0 , 0x04d8 , 0x04e0 , 0x04e8 , 0x04f0 , 0x04f8 ,
0x0500 , 0x0508 , 0x0510 , 0x0518 , 0x0520 , 0x0528 , 0x0530 , 0x0538 ,
0x0540 , 0x0548 , 0x0550 , 0x0558 , 0x0560 , 0x0568 , 0x0570 , 0x0578 ,
0x0580 , 0x0588 , 0x0590 , 0x0598 , 0x05a0 , 0x05a8 , 0x05b0 , 0x05b8 ,
0x05c0 , 0x05c8 , 0x05d0 , 0x05d8 , 0x05e0 , 0x05e8 , 0x05f0 , 0x05f8 ,
0x0600 , 0x0608 , 0x0610 , 0x0618 , 0x0620 , 0x0628 , 0x0630 , 0x0638 ,
0x0640 , 0x0648 , 0x0650 , 0x0658 , 0x0660 , 0x0668 , 0x0670 , 0x0678 ,
0x0680 , 0x0688 , 0x0690 , 0x0698 , 0x06a0 , 0x06a8 , 0x06b0 , 0x06b8 ,
0x06c0 , 0x06c8 , 0x06d0 , 0x06d8 , 0x06e0 , 0x06e8 , 0x06f0 , 0x06f8 ,
0x0700 , 0x0708 , 0x0710 , 0x0718 , 0x0720 , 0x0728 , 0x0730 , 0x0738 ,
0x0740 , 0x0748 , 0x0750 , 0x0758 , 0x0760 , 0x0768 , 0x0770 , 0x0778 ,
0x0780 , 0x0788 , 0x0790 , 0x0798 , 0x07a0 , 0x07a8 , 0x07b0 , 0x07b8 ,
0x07c0 , 0x07c8 , 0x07d0 , 0x07d8 , 0x07e0 , 0x07e8 , 0x07f0 , 0x07f8 ,
0x0800 , 0x0808 , 0x0810 , 0x0818 , 0x0820 , 0x0828 , 0x0830 , 0x0838 ,
0x0840 , 0x0848 , 0x0850 , 0x0858 , 0x0860 , 0x0868 , 0x0870 , 0x0878 ,
0x0880 , 0x0888 , 0x0890 , 0x0898 , 0x08a0 , 0x08a8 , 0x08b0 , 0x08b8 ,
0x08c0 , 0x08c8 , 0x08d0 , 0x08d8 , 0x08e0 , 0x08e8 , 0x08f0 , 0x08f8 ,
0x0900 , 0x0908 , 0x0910 , 0x0918 , 0x0920 , 0x0928 , 0x0930 , 0x0938 ,
0x0940 , 0x0948 , 0x0950 , 0x0958 , 0x0960 , 0x0968 , 0x0970 , 0x0978 ,
0x0980 , 0x0988 , 0x0990 , 0x0998 , 0x09a0 , 0x09a8 , 0x09b0 , 0x09b8 ,
0x09c0 , 0x09c8 , 0x09d0 , 0x09d8 , 0x09e0 , 0x09e8 , 0x09f0 , 0x09f8 ,
0x0a00 , 0x0a08 , 0x0a10 , 0x0a18 , 0x0a20 , 0x0a28 , 0x0a30 , 0x0a38 ,
0x0a40 , 0x0a48 , 0x0a50 , 0x0a58 , 0x0a60 , 0x0a68 , 0x0a70 , 0x0a78 ,
0x0a80 , 0x0a88 , 0x0a90 , 0x0a98 , 0x0aa0 , 0x0aa8 , 0x0ab0 , 0x0ab8 ,
0x0ac0 , 0x0ac8 , 0x0ad0 , 0x0ad8 , 0x0ae0 , 0x0ae8 , 0x0af0 , 0x0af8 ,
0x0b00 , 0x0b08 , 0x0b10 , 0x0b18 , 0x0b20 , 0x0b28 , 0x0b30 , 0x0b38 ,
0x0b40 , 0x0b48 , 0x0b50 , 0x0b58 , 0x0b60 , 0x0b68 , 0x0b70 , 0x0b78 ,
0x0b80 , 0x0b88 , 0x0b90 , 0x0b98 , 0x0ba0 , 0x0ba8 , 0x0bb0 , 0x0bb8 ,
0x0bc0 , 0x0bc8 , 0x0bd0 , 0x0bd8 , 0x0be0 , 0x0be8 , 0x0bf0 , 0x0bf8 ,
0x0c00 , 0x0c08 , 0x0c10 , 0x0c18 , 0x0c20 , 0x0c28 , 0x0c30 , 0x0c38 ,
0x0c40 , 0x0c48 , 0x0c50 , 0x0c58 , 0x0c60 , 0x0c68 , 0x0c70 , 0x0c78 ,
0x0c80 , 0x0c88 , 0x0c90 , 0x0c98 , 0x0ca0 , 0x0ca8 , 0x0cb0 , 0x0cb8 ,
0x0cc0 , 0x0cc8 , 0x0cd0 , 0x0cd8 , 0x0ce0 , 0x0ce8 , 0x0cf0 , 0x0cf8 ,
0x0d00 , 0x0d08 , 0x0d10 , 0x0d18 , 0x0d20 , 0x0d28 , 0x0d30 , 0x0d38 ,
0x0d40 , 0x0d48 , 0x0d50 , 0x0d58 , 0x0d60 , 0x0d68 , 0x0d70 , 0x0d78 ,
0x0d80 , 0x0d88 , 0x0d90 , 0x0d98 , 0x0da0 , 0x0da8 , 0x0db0 , 0x0db8 ,
0x0dc0 , 0x0dc8 , 0x0dd0 , 0x0dd8 , 0x0de0 , 0x0de8 , 0x0df0 , 0x0df8 ,
0x0e00 , 0x0e08 , 0x0e10 , 0x0e18 , 0x0e20 , 0x0e28 , 0x0e30 , 0x0e38 ,
0x0e40 , 0x0e48 , 0x0e50 , 0x0e58 , 0x0e60 , 0x0e68 , 0x0e70 , 0x0e78 ,
0x0e80 , 0x0e88 , 0x0e90 , 0x0e98 , 0x0ea0 , 0x0ea8 , 0x0eb0 , 0x0eb8 ,
0x0ec0 , 0x0ec8 , 0x0ed0 , 0x0ed8 , 0x0ee0 , 0x0ee8 , 0x0ef0 , 0x0ef8 ,
0x0f00 , 0x0f08 , 0x0f10 , 0x0f18 , 0x0f20 , 0x0f28 , 0x0f30 , 0x0f38 ,
0x0f40 , 0x0f48 , 0x0f50 , 0x0f58 , 0x0f60 , 0x0f68 , 0x0f70 , 0x0f78 ,
0x0f80 , 0x0f88 , 0x0f90 , 0x0f98 , 0x0fa0 , 0x0fa8 , 0x0fb0 , 0x0fb8 ,
0x0fc0 , 0x0fc8 , 0x0fd0 , 0x0fd8 , 0x0fe0 , 0x0fe8 , 0x0ff0 , 0x0ff8 ,
0x8ff8 , 0x8ff0 , 0x8fe8 , 0x8fe0 , 0x8fd8 , 0x8fd0 , 0x8fc8 , 0x8fc0 ,
0x8fb8 , 0x8fb0 , 0x8fa8 , 0x8fa0 , 0x8f98 , 0x8f90 , 0x8f88 , 0x8f80 ,
0x8f78 , 0x8f70 , 0x8f68 , 0x8f60 , 0x8f58 , 0x8f50 , 0x8f48 , 0x8f40 ,
0x8f38 , 0x8f30 , 0x8f28 , 0x8f20 , 0x8f18 , 0x8f10 , 0x8f08 , 0x8f00 ,
0x8ef8 , 0x8ef0 , 0x8ee8 , 0x8ee0 , 0x8ed8 , 0x8ed0 , 0x8ec8 , 0x8ec0 ,
0x8eb8 , 0x8eb0 , 0x8ea8 , 0x8ea0 , 0x8e98 , 0x8e90 , 0x8e88 , 0x8e80 ,
0x8e78 , 0x8e70 , 0x8e68 , 0x8e60 , 0x8e58 , 0x8e50 , 0x8e48 , 0x8e40 ,
0x8e38 , 0x8e30 , 0x8e28 , 0x8e20 , 0x8e18 , 0x8e10 , 0x8e08 , 0x8e00 ,
0x8df8 , 0x8df0 , 0x8de8 , 0x8de0 , 0x8dd8 , 0x8dd0 , 0x8dc8 , 0x8dc0 ,
0x8db8 , 0x8db0 , 0x8da8 , 0x8da0 , 0x8d98 , 0x8d90 , 0x8d88 , 0x8d80 ,
0x8d78 , 0x8d70 , 0x8d68 , 0x8d60 , 0x8d58 , 0x8d50 , 0x8d48 , 0x8d40 ,
0x8d38 , 0x8d30 , 0x8d28 , 0x8d20 , 0x8d18 , 0x8d10 , 0x8d08 , 0x8d00 ,
0x8cf8 , 0x8cf0 , 0x8ce8 , 0x8ce0 , 0x8cd8 , 0x8cd0 , 0x8cc8 , 0x8cc0 ,
0x8cb8 , 0x8cb0 , 0x8ca8 , 0x8ca0 , 0x8c98 , 0x8c90 , 0x8c88 , 0x8c80 ,
0x8c78 , 0x8c70 , 0x8c68 , 0x8c60 , 0x8c58 , 0x8c50 , 0x8c48 , 0x8c40 ,
0x8c38 , 0x8c30 , 0x8c28 , 0x8c20 , 0x8c18 , 0x8c10 , 0x8c08 , 0x8c00 ,
0x8bf8 , 0x8bf0 , 0x8be8 , 0x8be0 , 0x8bd8 , 0x8bd0 , 0x8bc8 , 0x8bc0 ,
0x8bb8 , 0x8bb0 , 0x8ba8 , 0x8ba0 , 0x8b98 , 0x8b90 , 0x8b88 , 0x8b80 ,
0x8b78 , 0x8b70 , 0x8b68 , 0x8b60 , 0x8b58 , 0x8b50 , 0x8b48 , 0x8b40 ,
0x8b38 , 0x8b30 , 0x8b28 , 0x8b20 , 0x8b18 , 0x8b10 , 0x8b08 , 0x8b00 ,
0x8af8 , 0x8af0 , 0x8ae8 , 0x8ae0 , 0x8ad8 , 0x8ad0 , 0x8ac8 , 0x8ac0 ,
0x8ab8 , 0x8ab0 , 0x8aa8 , 0x8aa0 , 0x8a98 , 0x8a90 , 0x8a88 , 0x8a80 ,
0x8a78 , 0x8a70 , 0x8a68 , 0x8a60 , 0x8a58 , 0x8a50 , 0x8a48 , 0x8a40 ,
0x8a38 , 0x8a30 , 0x8a28 , 0x8a20 , 0x8a18 , 0x8a10 , 0x8a08 , 0x8a00 ,
0x89f8 , 0x89f0 , 0x89e8 , 0x89e0 , 0x89d8 , 0x89d0 , 0x89c8 , 0x89c0 ,
0x89b8 , 0x89b0 , 0x89a8 , 0x89a0 , 0x8998 , 0x8990 , 0x8988 , 0x8980 ,
0x8978 , 0x8970 , 0x8968 , 0x8960 , 0x8958 , 0x8950 , 0x8948 , 0x8940 ,
0x8938 , 0x8930 , 0x8928 , 0x8920 , 0x8918 , 0x8910 , 0x8908 , 0x8900 ,
0x88f8 , 0x88f0 , 0x88e8 , 0x88e0 , 0x88d8 , 0x88d0 , 0x88c8 , 0x88c0 ,
0x88b8 , 0x88b0 , 0x88a8 , 0x88a0 , 0x8898 , 0x8890 , 0x8888 , 0x8880 ,
0x8878 , 0x8870 , 0x8868 , 0x8860 , 0x8858 , 0x8850 , 0x8848 , 0x8840 ,
0x8838 , 0x8830 , 0x8828 , 0x8820 , 0x8818 , 0x8810 , 0x8808 , 0x8800 ,
0x87f8 , 0x87f0 , 0x87e8 , 0x87e0 , 0x87d8 , 0x87d0 , 0x87c8 , 0x87c0 ,
0x87b8 , 0x87b0 , 0x87a8 , 0x87a0 , 0x8798 , 0x8790 , 0x8788 , 0x8780 ,
0x8778 , 0x8770 , 0x8768 , 0x8760 , 0x8758 , 0x8750 , 0x8748 , 0x8740 ,
0x8738 , 0x8730 , 0x8728 , 0x8720 , 0x8718 , 0x8710 , 0x8708 , 0x8700 ,
0x86f8 , 0x86f0 , 0x86e8 , 0x86e0 , 0x86d8 , 0x86d0 , 0x86c8 , 0x86c0 ,
0x86b8 , 0x86b0 , 0x86a8 , 0x86a0 , 0x8698 , 0x8690 , 0x8688 , 0x8680 ,
0x8678 , 0x8670 , 0x8668 , 0x8660 , 0x8658 , 0x8650 , 0x8648 , 0x8640 ,
0x8638 , 0x8630 , 0x8628 , 0x8620 , 0x8618 , 0x8610 , 0x8608 , 0x8600 ,
0x85f8 , 0x85f0 , 0x85e8 , 0x85e0 , 0x85d8 , 0x85d0 , 0x85c8 , 0x85c0 ,
0x85b8 , 0x85b0 , 0x85a8 , 0x85a0 , 0x8598 , 0x8590 , 0x8588 , 0x8580 ,
0x8578 , 0x8570 , 0x8568 , 0x8560 , 0x8558 , 0x8550 , 0x8548 , 0x8540 ,
0x8538 , 0x8530 , 0x8528 , 0x8520 , 0x8518 , 0x8510 , 0x8508 , 0x8500 ,
0x84f8 , 0x84f0 , 0x84e8 , 0x84e0 , 0x84d8 , 0x84d0 , 0x84c8 , 0x84c0 ,
0x84b8 , 0x84b0 , 0x84a8 , 0x84a0 , 0x8498 , 0x8490 , 0x8488 , 0x8480 ,
0x8478 , 0x8470 , 0x8468 , 0x8460 , 0x8458 , 0x8450 , 0x8448 , 0x8440 ,
0x8438 , 0x8430 , 0x8428 , 0x8420 , 0x8418 , 0x8410 , 0x8408 , 0x8400 ,
0x83f8 , 0x83f0 , 0x83e8 , 0x83e0 , 0x83d8 , 0x83d0 , 0x83c8 , 0x83c0 ,
0x83b8 , 0x83b0 , 0x83a8 , 0x83a0 , 0x8398 , 0x8390 , 0x8388 , 0x8380 ,
0x8378 , 0x8370 , 0x8368 , 0x8360 , 0x8358 , 0x8350 , 0x8348 , 0x8340 ,
0x8338 , 0x8330 , 0x8328 , 0x8320 , 0x8318 , 0x8310 , 0x8308 , 0x8300 ,
0x82f8 , 0x82f0 , 0x82e8 , 0x82e0 , 0x82d8 , 0x82d0 , 0x82c8 , 0x82c0 ,
0x82b8 , 0x82b0 , 0x82a8 , 0x82a0 , 0x8298 , 0x8290 , 0x8288 , 0x8280 ,
0x8278 , 0x8270 , 0x8268 , 0x8260 , 0x8258 , 0x8250 , 0x8248 , 0x8240 ,
0x8238 , 0x8230 , 0x8228 , 0x8220 , 0x8218 , 0x8210 , 0x8208 , 0x8200 ,
0x81f8 , 0x81f0 , 0x81e8 , 0x81e0 , 0x81d8 , 0x81d0 , 0x81c8 , 0x81c0 ,
0x81b8 , 0x81b0 , 0x81a8 , 0x81a0 , 0x8198 , 0x8190 , 0x8188 , 0x8180 ,
0x8178 , 0x8170 , 0x8168 , 0x8160 , 0x8158 , 0x8150 , 0x8148 , 0x8140 ,
0x8138 , 0x8130 , 0x8128 , 0x8120 , 0x8118 , 0x8110 , 0x8108 , 0x8100 ,
0x80f8 , 0x80f0 , 0x80e8 , 0x80e0 , 0x80d8 , 0x80d0 , 0x80c8 , 0x80c0 ,
0x80b8 , 0x80b0 , 0x80a8 , 0x80a0 , 0x8098 , 0x8090 , 0x8088 , 0x8080 ,
0x8078 , 0x8070 , 0x8068 , 0x8060 , 0x8058 , 0x8050 , 0x8048 , 0x8040 ,
0x8038 , 0x8030 , 0x8028 , 0x8020 , 0x8018 , 0x8010 , 0x8008 , 0x8000 ,
2023-10-14 11:10:37 +00:00
} ;
/*
* Inverse exponent table extracted from OPL3 ROM ; taken straight from
* Nuked OPL3 source code .
* TODO : Verify if ESFM uses an exponent table or if it possibly uses another
* method to skirt around Yamaha ' s patents ?
2024-02-01 08:30:11 +00:00
* Optimization : All entries are shifted left by one from the actual data in
* OPL3 ' s ROM .
2023-10-14 11:10:37 +00:00
*/
static const uint16_t exprom [ 256 ] = {
2024-02-01 08:30:11 +00:00
0xff4 , 0xfea , 0xfde , 0xfd4 , 0xfc8 , 0xfbe , 0xfb4 , 0xfa8 ,
0xf9e , 0xf92 , 0xf88 , 0xf7e , 0xf72 , 0xf68 , 0xf5c , 0xf52 ,
0xf48 , 0xf3e , 0xf32 , 0xf28 , 0xf1e , 0xf14 , 0xf08 , 0xefe ,
0xef4 , 0xeea , 0xee0 , 0xed4 , 0xeca , 0xec0 , 0xeb6 , 0xeac ,
0xea2 , 0xe98 , 0xe8e , 0xe84 , 0xe7a , 0xe70 , 0xe66 , 0xe5c ,
0xe52 , 0xe48 , 0xe3e , 0xe34 , 0xe2a , 0xe20 , 0xe16 , 0xe0c ,
0xe04 , 0xdfa , 0xdf0 , 0xde6 , 0xddc , 0xdd2 , 0xdca , 0xdc0 ,
0xdb6 , 0xdac , 0xda4 , 0xd9a , 0xd90 , 0xd88 , 0xd7e , 0xd74 ,
0xd6a , 0xd62 , 0xd58 , 0xd50 , 0xd46 , 0xd3c , 0xd34 , 0xd2a ,
0xd22 , 0xd18 , 0xd10 , 0xd06 , 0xcfe , 0xcf4 , 0xcec , 0xce2 ,
0xcda , 0xcd0 , 0xcc8 , 0xcbe , 0xcb6 , 0xcae , 0xca4 , 0xc9c ,
0xc92 , 0xc8a , 0xc82 , 0xc78 , 0xc70 , 0xc68 , 0xc60 , 0xc56 ,
0xc4e , 0xc46 , 0xc3c , 0xc34 , 0xc2c , 0xc24 , 0xc1c , 0xc12 ,
0xc0a , 0xc02 , 0xbfa , 0xbf2 , 0xbea , 0xbe0 , 0xbd8 , 0xbd0 ,
0xbc8 , 0xbc0 , 0xbb8 , 0xbb0 , 0xba8 , 0xba0 , 0xb98 , 0xb90 ,
0xb88 , 0xb80 , 0xb78 , 0xb70 , 0xb68 , 0xb60 , 0xb58 , 0xb50 ,
0xb48 , 0xb40 , 0xb38 , 0xb32 , 0xb2a , 0xb22 , 0xb1a , 0xb12 ,
0xb0a , 0xb02 , 0xafc , 0xaf4 , 0xaec , 0xae4 , 0xade , 0xad6 ,
0xace , 0xac6 , 0xac0 , 0xab8 , 0xab0 , 0xaa8 , 0xaa2 , 0xa9a ,
0xa92 , 0xa8c , 0xa84 , 0xa7c , 0xa76 , 0xa6e , 0xa68 , 0xa60 ,
0xa58 , 0xa52 , 0xa4a , 0xa44 , 0xa3c , 0xa36 , 0xa2e , 0xa28 ,
0xa20 , 0xa18 , 0xa12 , 0xa0c , 0xa04 , 0x9fe , 0x9f6 , 0x9f0 ,
0x9e8 , 0x9e2 , 0x9da , 0x9d4 , 0x9ce , 0x9c6 , 0x9c0 , 0x9b8 ,
0x9b2 , 0x9ac , 0x9a4 , 0x99e , 0x998 , 0x990 , 0x98a , 0x984 ,
0x97c , 0x976 , 0x970 , 0x96a , 0x962 , 0x95c , 0x956 , 0x950 ,
0x948 , 0x942 , 0x93c , 0x936 , 0x930 , 0x928 , 0x922 , 0x91c ,
0x916 , 0x910 , 0x90a , 0x904 , 0x8fc , 0x8f6 , 0x8f0 , 0x8ea ,
0x8e4 , 0x8de , 0x8d8 , 0x8d2 , 0x8cc , 0x8c6 , 0x8c0 , 0x8ba ,
0x8b4 , 0x8ae , 0x8a8 , 0x8a2 , 0x89c , 0x896 , 0x890 , 0x88a ,
0x884 , 0x87e , 0x878 , 0x872 , 0x86c , 0x866 , 0x860 , 0x85a ,
0x854 , 0x850 , 0x84a , 0x844 , 0x83e , 0x838 , 0x832 , 0x82c ,
0x828 , 0x822 , 0x81c , 0x816 , 0x810 , 0x80c , 0x806 , 0x800
2023-10-14 11:10:37 +00:00
} ;
/*
* Frequency multiplier table multiplied by 2 ; taken straight from Nuked OPL3
* source code .
*/
static const uint8_t mt [ 16 ] = {
1 , 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 , 20 , 24 , 24 , 30 , 30
} ;
/*
* This is used during the envelope generation to apply KSL to the envelope by
* determining how much to shift right the keyscale attenuation value before
* adding it to the envelope level .
*/
static const uint8_t kslshift [ 4 ] = {
8 , 1 , 2 , 0
} ;
/*
* This encodes which emulation mode channels are the secondary channel in a
* 4 - op channel pair ( where the entry is non - negative ) , and which is the
* corresponding primary channel for that secondary channel .
*/
static const int emu_4op_secondary_to_primary [ 18 ] =
{
- 1 , - 1 , - 1 , 0 , 1 , 2 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , 9 , 10 , 11 , - 1 , - 1 , - 1
} ;
/*
* Envelope generator dither table , taken straight from Nuked OPL3 source code .
*/
static const uint8_t eg_incstep [ 4 ] [ 4 ] = {
{ 0 , 0 , 0 , 0 } ,
{ 1 , 0 , 0 , 0 } ,
{ 1 , 0 , 1 , 0 } ,
{ 1 , 1 , 1 , 0 }
} ;
/* ------------------------------------------------------------------------- */
2024-02-01 08:30:11 +00:00
static inline int13
ESFM_envelope_wavegen ( uint3 waveform , int16 phase , uint10 envelope )
2023-10-14 11:10:37 +00:00
{
2024-02-01 08:30:11 +00:00
int13 out ;
uint16 lookup = logsinrom [ ( ( uint16 ) waveform < < 10 ) | ( phase & 0x3ff ) ] ;
uint16 level = ( lookup & 0x1fff ) + ( envelope < < 3 ) ;
2023-10-14 11:10:37 +00:00
if ( level > 0x1fff )
{
level = 0x1fff ;
}
2024-02-01 08:30:11 +00:00
out = exprom [ level & 0xff ] > > ( level > > 8 ) ;
if ( lookup & 0x8000 )
2023-10-14 11:10:37 +00:00
{
2024-02-01 08:30:11 +00:00
out = - out ;
2023-10-14 11:10:37 +00:00
}
2024-02-01 08:30:11 +00:00
return out ;
2023-10-14 11:10:37 +00:00
}
/* ------------------------------------------------------------------------- */
static void
ESFM_envelope_calc ( esfm_slot * slot )
{
uint8 nonzero ;
uint8 rate ;
uint5 rate_hi ;
uint2 rate_lo ;
uint4 reg_rate = 0 ;
uint4 ks ;
uint8 eg_shift , shift ;
bool eg_off ;
uint9 eg_rout ;
int16 eg_inc ;
bool reset = 0 ;
bool key_on ;
2023-10-18 20:01:46 +00:00
bool key_on_signal ;
2023-10-14 11:10:37 +00:00
key_on = * slot - > in . key_on ;
if ( ! slot - > chip - > native_mode )
{
int pair_primary_idx = emu_4op_secondary_to_primary [ slot - > channel - > channel_idx ] ;
if ( pair_primary_idx > = 0 )
{
esfm_channel * pair_primary = & slot - > channel - > chip - > channels [ pair_primary_idx ] ;
if ( pair_primary - > emu_mode_4op_enable )
{
key_on = * pair_primary - > slots [ 0 ] . in . key_on ;
}
}
else if ( ( slot - > channel - > channel_idx = = 7 | | slot - > channel - > channel_idx = = 8 )
& & slot - > slot_idx = = 1 )
{
key_on = slot - > channel - > key_on_2 ;
}
}
slot - > in . eg_output = slot - > in . eg_position + ( slot - > t_level < < 2 )
+ ( slot - > in . eg_ksl_offset > > kslshift [ slot - > ksl ] ) ;
if ( slot - > tremolo_en )
{
uint8 tremolo ;
if ( slot - > chip - > native_mode )
{
tremolo = slot - > channel - > chip - > tremolo > > ( ( ! slot - > tremolo_deep < < 1 ) + 2 ) ;
}
else
{
tremolo = slot - > channel - > chip - > tremolo > > ( ( ! slot - > chip - > emu_tremolo_deep < < 1 ) + 2 ) ;
}
slot - > in . eg_output + = tremolo ;
}
2023-10-18 20:01:46 +00:00
if ( slot - > in . eg_delay_run & & slot - > in . eg_delay_counter < 32768 )
{
slot - > in . eg_delay_counter + + ;
}
// triggers on key-on edge
if ( key_on & & ! slot - > in . key_on_gate )
{
slot - > in . eg_delay_run = 1 ;
slot - > in . eg_delay_counter = 0 ;
2024-01-17 13:33:02 +00:00
slot - > in . eg_delay_transitioned_01 = 0 ;
slot - > in . eg_delay_transitioned_01_gate = 0 ;
slot - > in . eg_delay_transitioned_10 = 0 ;
slot - > in . eg_delay_transitioned_10_gate = 0 ;
slot - > in . eg_delay_counter_compare = 0 ;
if ( slot - > env_delay > 0 )
{
slot - > in . eg_delay_counter_compare = 256 < < slot - > env_delay ;
}
2023-10-18 20:01:46 +00:00
}
else if ( ! key_on )
{
slot - > in . eg_delay_run = 0 ;
}
2024-01-17 13:33:02 +00:00
// TODO: is this really how the chip behaves? Can it only transition the envelope delay once? Am I implementing this in a sane way? I feel like this is a roundabout hack.
if ( ( slot - > in . eg_delay_transitioned_10 & & ! slot - > in . eg_delay_transitioned_10_gate ) | |
( slot - > in . eg_delay_transitioned_01 & & ! slot - > in . eg_delay_transitioned_01_gate )
)
2023-10-18 20:01:46 +00:00
{
2024-01-17 13:33:02 +00:00
slot - > in . eg_delay_counter_compare = 0 ;
if ( slot - > env_delay > 0 )
{
slot - > in . eg_delay_counter_compare = 256 < < slot - > env_delay ;
}
if ( slot - > in . eg_delay_transitioned_10 )
{
slot - > in . eg_delay_transitioned_10_gate = 1 ;
}
if ( slot - > in . eg_delay_transitioned_01 )
{
slot - > in . eg_delay_transitioned_01_gate = 1 ;
}
2023-10-18 20:01:46 +00:00
}
2024-01-17 13:33:02 +00:00
if ( key_on & & ( ( slot - > in . eg_delay_counter > = slot - > in . eg_delay_counter_compare ) | | ! slot - > chip - > native_mode ) )
2023-10-18 20:01:46 +00:00
{
key_on_signal = 1 ;
} else {
key_on_signal = 0 ;
}
2023-10-14 11:10:37 +00:00
if ( key_on & & slot - > in . eg_state = = EG_RELEASE )
{
2024-01-17 13:33:02 +00:00
if ( ( slot - > in . eg_delay_counter > = slot - > in . eg_delay_counter_compare ) | | ! slot - > chip - > native_mode )
2023-10-14 11:10:37 +00:00
{
reset = 1 ;
reg_rate = slot - > attack_rate ;
}
else
{
reg_rate = slot - > release_rate ;
}
}
else
{
switch ( slot - > in . eg_state )
{
case EG_ATTACK :
reg_rate = slot - > attack_rate ;
break ;
case EG_DECAY :
reg_rate = slot - > decay_rate ;
break ;
case EG_SUSTAIN :
if ( ! slot - > env_sustaining )
{
reg_rate = slot - > release_rate ;
}
break ;
case EG_RELEASE :
reg_rate = slot - > release_rate ;
break ;
}
}
2023-10-18 20:01:46 +00:00
slot - > in . key_on_gate = key_on ;
2023-10-14 11:10:37 +00:00
slot - > in . phase_reset = reset ;
ks = slot - > in . keyscale > > ( ( ! slot - > ksr ) < < 1 ) ;
nonzero = ( reg_rate ! = 0 ) ;
rate = ks + ( reg_rate < < 2 ) ;
rate_hi = rate > > 2 ;
rate_lo = rate & 0x03 ;
if ( rate_hi & 0x10 )
{
rate_hi = 0x0f ;
}
eg_shift = rate_hi + slot - > chip - > eg_clocks ;
shift = 0 ;
if ( nonzero )
{
if ( rate_hi < 12 )
{
if ( slot - > chip - > eg_tick )
{
switch ( eg_shift )
{
case 12 :
shift = 1 ;
break ;
case 13 :
shift = ( rate_lo > > 1 ) & 0x01 ;
break ;
case 14 :
shift = rate_lo & 0x01 ;
break ;
default :
break ;
}
}
}
else
{
shift = ( rate_hi & 0x03 )
+ eg_incstep [ rate_lo ] [ slot - > chip - > global_timer & 0x03 ] ;
if ( shift & 0x04 )
{
shift = 0x03 ;
}
if ( ! shift )
{
shift = slot - > chip - > eg_tick ;
}
}
}
eg_rout = slot - > in . eg_position ;
eg_inc = 0 ;
eg_off = 0 ;
/* Instant attack */
if ( reset & & rate_hi = = 0x0f )
{
eg_rout = 0x00 ;
}
/* Envelope off */
if ( ( slot - > in . eg_position & 0x1f8 ) = = 0x1f8 )
{
eg_off = 1 ;
}
if ( slot - > in . eg_state ! = EG_ATTACK & & ! reset & & eg_off )
{
eg_rout = 0x1ff ;
}
switch ( slot - > in . eg_state )
{
case EG_ATTACK :
if ( slot - > in . eg_position = = 0 )
{
slot - > in . eg_state = EG_DECAY ;
}
2023-10-18 20:01:46 +00:00
else if ( key_on_signal & & shift > 0 & & rate_hi ! = 0x0f )
2023-10-14 11:10:37 +00:00
{
eg_inc = ~ slot - > in . eg_position > > ( 4 - shift ) ;
}
break ;
case EG_DECAY :
if ( ( slot - > in . eg_position > > 4 ) = = slot - > sustain_lvl )
{
slot - > in . eg_state = EG_SUSTAIN ;
}
else if ( ! eg_off & & ! reset & & shift > 0 )
{
eg_inc = 1 < < ( shift - 1 ) ;
}
break ;
case EG_SUSTAIN :
case EG_RELEASE :
if ( ! eg_off & & ! reset & & shift > 0 )
{
eg_inc = 1 < < ( shift - 1 ) ;
}
break ;
}
slot - > in . eg_position = ( eg_rout + eg_inc ) & 0x1ff ;
/* Key off */
if ( reset )
{
slot - > in . eg_state = EG_ATTACK ;
}
2023-10-18 20:01:46 +00:00
if ( ! key_on_signal )
2023-10-14 11:10:37 +00:00
{
slot - > in . eg_state = EG_RELEASE ;
}
}
/* ------------------------------------------------------------------------- */
static void
ESFM_phase_generate ( esfm_slot * slot )
{
esfm_chip * chip ;
uint10 f_num ;
uint32 basefreq ;
bool rm_xor , n_bit ;
uint23 noise ;
uint10 phase ;
chip = slot - > chip ;
f_num = slot - > f_num ;
if ( slot - > vibrato_en )
{
int8_t range ;
uint8_t vibpos ;
range = ( f_num > > 7 ) & 7 ;
vibpos = chip - > vibrato_pos ;
if ( ! ( vibpos & 3 ) )
{
range = 0 ;
}
else if ( vibpos & 1 )
{
range > > = 1 ;
}
range > > = ! slot - > vibrato_deep ;
if ( vibpos & 4 )
{
range = - range ;
}
f_num + = range ;
}
basefreq = ( f_num < < slot - > block ) > > 1 ;
phase = ( uint10 ) ( slot - > in . phase_acc > > 9 ) ;
if ( slot - > in . phase_reset )
{
slot - > in . phase_acc = 0 ;
}
slot - > in . phase_acc + = ( basefreq * mt [ slot - > mult ] ) > > 1 ;
slot - > in . phase_acc & = ( 1 < < 19 ) - 1 ;
slot - > in . phase_out = phase ;
/* Noise mode (rhythm) sounds */
noise = chip - > lfsr ;
if ( slot - > slot_idx = = 3 & & slot - > rhy_noise )
{
esfm_slot * prev_slot = & slot - > channel - > slots [ 2 ] ;
chip - > rm_hh_bit2 = ( phase > > 2 ) & 1 ;
chip - > rm_hh_bit3 = ( phase > > 3 ) & 1 ;
chip - > rm_hh_bit7 = ( phase > > 7 ) & 1 ;
chip - > rm_hh_bit8 = ( phase > > 8 ) & 1 ;
chip - > rm_tc_bit3 = ( prev_slot - > in . phase_out > > 3 ) & 1 ;
chip - > rm_tc_bit5 = ( prev_slot - > in . phase_out > > 5 ) & 1 ;
rm_xor = ( chip - > rm_hh_bit2 ^ chip - > rm_hh_bit7 )
2024-02-01 08:30:11 +00:00
| ( chip - > rm_hh_bit3 ^ chip - > rm_tc_bit5 )
| ( chip - > rm_tc_bit3 ^ chip - > rm_tc_bit5 ) ;
2023-10-14 11:10:37 +00:00
switch ( slot - > rhy_noise )
{
case 1 :
// SD
slot - > in . phase_out = ( chip - > rm_hh_bit8 < < 9 )
| ( ( chip - > rm_hh_bit8 ^ ( noise & 1 ) ) < < 8 ) ;
break ;
case 2 :
// HH
slot - > in . phase_out = rm_xor < < 9 ;
if ( rm_xor ^ ( noise & 1 ) )
{
slot - > in . phase_out | = 0xd0 ;
}
else
{
slot - > in . phase_out | = 0x34 ;
}
break ;
case 3 :
// TC
slot - > in . phase_out = ( rm_xor < < 9 ) | 0x80 ;
break ;
}
}
n_bit = ( ( noise > > 14 ) ^ noise ) & 0x01 ;
chip - > lfsr = ( noise > > 1 ) | ( n_bit < < 22 ) ;
}
/* ------------------------------------------------------------------------- */
static void
ESFM_phase_generate_emu ( esfm_slot * slot )
{
esfm_chip * chip ;
uint3 block ;
uint10 f_num ;
uint32 basefreq ;
bool rm_xor , n_bit ;
uint23 noise ;
uint10 phase ;
int pair_primary_idx ;
chip = slot - > chip ;
block = slot - > channel - > slots [ 0 ] . block ;
f_num = slot - > channel - > slots [ 0 ] . f_num ;
pair_primary_idx = emu_4op_secondary_to_primary [ slot - > channel - > channel_idx ] ;
if ( pair_primary_idx > = 0 )
{
esfm_channel * pair_primary = & slot - > channel - > chip - > channels [ pair_primary_idx ] ;
if ( pair_primary - > emu_mode_4op_enable )
{
block = pair_primary - > slots [ 0 ] . block ;
f_num = pair_primary - > slots [ 0 ] . f_num ;
}
}
if ( slot - > vibrato_en )
{
int8_t range ;
uint8_t vibpos ;
range = ( f_num > > 7 ) & 7 ;
vibpos = chip - > vibrato_pos ;
if ( ! ( vibpos & 3 ) )
{
range = 0 ;
}
else if ( vibpos & 1 )
{
range > > = 1 ;
}
range > > = ! chip - > emu_vibrato_deep ;
if ( vibpos & 4 )
{
range = - range ;
}
f_num + = range ;
}
basefreq = ( f_num < < block ) > > 1 ;
phase = ( uint10 ) ( slot - > in . phase_acc > > 9 ) ;
if ( slot - > in . phase_reset )
{
slot - > in . phase_acc = 0 ;
}
slot - > in . phase_acc + = ( basefreq * mt [ slot - > mult ] ) > > 1 ;
slot - > in . phase_acc & = ( 1 < < 19 ) - 1 ;
slot - > in . phase_out = phase ;
/* Noise mode (rhythm) sounds */
noise = chip - > lfsr ;
// HH
if ( slot - > channel - > channel_idx = = 7 & & slot - > slot_idx = = 0 )
{
chip - > rm_hh_bit2 = ( phase > > 2 ) & 1 ;
chip - > rm_hh_bit3 = ( phase > > 3 ) & 1 ;
chip - > rm_hh_bit7 = ( phase > > 7 ) & 1 ;
chip - > rm_hh_bit8 = ( phase > > 8 ) & 1 ;
}
// TC
if ( slot - > channel - > channel_idx = = 8 & & slot - > slot_idx = = 1 )
{
chip - > rm_tc_bit3 = ( phase > > 3 ) & 1 ;
chip - > rm_tc_bit5 = ( phase > > 5 ) & 1 ;
}
if ( chip - > emu_rhy_mode_flags & 0x20 )
{
rm_xor = ( chip - > rm_hh_bit2 ^ chip - > rm_hh_bit7 )
2024-02-01 08:30:11 +00:00
| ( chip - > rm_hh_bit3 ^ chip - > rm_tc_bit5 )
| ( chip - > rm_tc_bit3 ^ chip - > rm_tc_bit5 ) ;
2023-10-14 11:10:37 +00:00
if ( slot - > channel - > channel_idx = = 7 )
{
if ( slot - > slot_idx = = 0 ) {
// HH
slot - > in . phase_out = rm_xor < < 9 ;
if ( rm_xor ^ ( noise & 1 ) )
{
slot - > in . phase_out | = 0xd0 ;
}
else
{
slot - > in . phase_out | = 0x34 ;
}
}
else if ( slot - > slot_idx = = 1 )
{
// SD
slot - > in . phase_out = ( chip - > rm_hh_bit8 < < 9 )
| ( ( chip - > rm_hh_bit8 ^ ( noise & 1 ) ) < < 8 ) ;
}
}
else if ( slot - > channel - > channel_idx = = 8 & & slot - > slot_idx = = 1 )
{
// TC
slot - > in . phase_out = ( rm_xor < < 9 ) | 0x80 ;
}
}
n_bit = ( ( noise > > 14 ) ^ noise ) & 0x01 ;
chip - > lfsr = ( noise > > 1 ) | ( n_bit < < 22 ) ;
}
2023-10-22 19:49:23 +00:00
/**
* TODO : Figure out what ' s ACTUALLY going on inside the real chip !
* This is not accurate at all , but it ' s the closest I was able to get with
* empirical testing ( and it ' s closer than nothing ) .
*/
/* ------------------------------------------------------------------------- */
static int16
ESFM_slot3_noise3_mod_input_calc ( esfm_slot * slot )
{
esfm_channel * channel = slot - > channel ;
int16 phase ;
int13 output_buf = * channel - > slots [ 1 ] . in . mod_input ;
int i ;
// Go through previous slots' partial results and recalculate outputs
// (we skip slot 0 because its calculation happens at the end, not at the beginning)
for ( i = 1 ; i < 3 ; i + + )
{
// double the pitch
phase = channel - > slots [ i ] . in . phase_acc > > 8 ;
if ( channel - > slots [ i ] . mod_in_level )
{
phase + = output_buf > > ( 7 - channel - > slots [ i ] . mod_in_level ) ;
}
2024-02-01 08:30:11 +00:00
output_buf = ESFM_envelope_wavegen ( channel - > slots [ 2 ] . waveform , phase , channel - > slots [ i ] . in . eg_output ) ;
2023-10-22 19:49:23 +00:00
}
return output_buf > > ( 8 - slot - > mod_in_level ) ;
}
2023-10-14 11:10:37 +00:00
/* ------------------------------------------------------------------------- */
static void
ESFM_slot_generate ( esfm_slot * slot )
{
int16 phase = slot - > in . phase_out ;
if ( slot - > mod_in_level )
{
2023-10-22 19:49:23 +00:00
if ( slot - > slot_idx = = 3 & & slot - > rhy_noise = = 3 )
{
phase + = ESFM_slot3_noise3_mod_input_calc ( slot ) ;
}
else
{
phase + = * slot - > in . mod_input > > ( 7 - slot - > mod_in_level ) ;
}
2023-10-14 11:10:37 +00:00
}
2024-02-01 08:30:11 +00:00
slot - > in . output = ESFM_envelope_wavegen ( slot - > waveform , phase , slot - > in . eg_output ) ;
2023-10-14 11:10:37 +00:00
if ( slot - > output_level )
{
int13 output_value = slot - > in . output > > ( 7 - slot - > output_level ) ;
slot - > channel - > output [ 0 ] + = output_value & slot - > out_enable [ 0 ] ;
slot - > channel - > output [ 1 ] + = output_value & slot - > out_enable [ 1 ] ;
}
}
/* ------------------------------------------------------------------------- */
static void
ESFM_slot_generate_emu ( esfm_slot * slot )
{
2024-02-01 08:30:11 +00:00
const esfm_chip * chip = slot - > chip ;
uint3 waveform = slot - > waveform & ( chip - > emu_newmode ! = 0 ? 0x07 : 0x03 ) ;
2023-10-14 11:10:37 +00:00
bool rhythm_slot_double_volume = ( slot - > chip - > emu_rhy_mode_flags & 0x20 ) ! = 0
& & slot - > channel - > channel_idx > = 6 & & slot - > channel - > channel_idx < 9 ;
int16 phase = slot - > in . phase_out ;
int14 output_value ;
phase + = * slot - > in . mod_input & slot - > in . emu_mod_enable ;
2024-02-01 08:30:11 +00:00
slot - > in . output = ESFM_envelope_wavegen ( waveform , phase , slot - > in . eg_output ) ;
2023-10-14 11:10:37 +00:00
output_value = ( slot - > in . output & slot - > in . emu_output_enable ) < < rhythm_slot_double_volume ;
if ( chip - > emu_newmode )
{
slot - > channel - > output [ 0 ] + = output_value & slot - > channel - > slots [ 0 ] . out_enable [ 0 ] ;
slot - > channel - > output [ 1 ] + = output_value & slot - > channel - > slots [ 0 ] . out_enable [ 1 ] ;
}
else
{
slot - > channel - > output [ 0 ] + = output_value ;
slot - > channel - > output [ 1 ] + = output_value ;
}
}
/* ------------------------------------------------------------------------- */
static void
2024-02-01 08:30:11 +00:00
ESFM_process_feedback ( esfm_chip * chip )
2023-10-14 11:10:37 +00:00
{
2024-02-01 08:30:11 +00:00
int channel_idx ;
2023-10-14 11:10:37 +00:00
2024-02-01 08:30:11 +00:00
for ( channel_idx = 0 ; channel_idx < 18 ; channel_idx + + )
2023-10-14 11:10:37 +00:00
{
2024-02-01 08:30:11 +00:00
esfm_slot * slot = & chip - > channels [ channel_idx ] . slots [ 0 ] ;
uint32 basefreq , phase_offset ;
uint3 block ;
uint10 f_num ;
2024-02-01 15:16:04 +00:00
int32_t wave_out , wave_last ;
2024-02-01 08:30:11 +00:00
int32_t phase_feedback ;
2024-02-01 21:33:20 +00:00
uint32_t iter_counter ;
2024-02-01 08:30:11 +00:00
uint3 waveform ;
uint3 mod_in_shift ;
uint32_t phase , phase_acc ;
uint10 eg_output ;
if ( slot - > mod_in_level & & ( chip - > native_mode | | ( slot - > in . mod_input = = & slot - > in . feedback_buf ) ) )
2023-10-14 11:10:37 +00:00
{
2024-02-01 08:30:11 +00:00
if ( chip - > native_mode )
{
waveform = slot - > waveform ;
}
else
{
waveform = slot - > waveform & ( 0x03 | ( 0x02 < < ( chip - > emu_newmode ! = 0 ) ) ) ;
}
f_num = slot - > f_num ;
block = slot - > block ;
basefreq = ( f_num < < block ) > > 1 ;
phase_offset = ( basefreq * mt [ slot - > mult ] ) > > 1 ;
mod_in_shift = 7 - slot - > mod_in_level ;
phase_acc = ( uint32_t ) ( slot - > in . phase_acc - phase_offset * 28 ) ;
eg_output = slot - > in . eg_output ;
2024-03-11 18:21:50 +00:00
if ( chip - > fast_mode ) {
phase_feedback = ( slot - > in . fb_out0 + slot - > in . fb_out1 ) > > 2 ;
slot - > in . fb_out1 = slot - > in . fb_out0 ;
phase = phase_feedback > > mod_in_shift ;
phase + = phase_acc > > 9 ;
wave_out = slot - > in . fb_out0 = ESFM_envelope_wavegen ( waveform , phase , eg_output ) ;
phase_acc + = phase_offset ;
} else {
2024-02-01 08:30:11 +00:00
// ASM optimizaions!
# if defined(__GNUC__) && defined(__x86_64__)
asm (
2024-02-02 19:29:51 +00:00
" movzbq %[wave], %%r8 \n \t "
" shll $11, %%r8d \n \t "
" leaq %[sinrom], %%rax \n \t "
" addq %%rax, %%r8 \n \t "
" leaq %[exprom], %%r9 \n \t "
" movzwl %[eg_out], %%r10d \n \t "
" shll $3, %%r10d \n \t "
" xorl %%r11d, %%r11d \n \t "
" movl %%r11d, %[out] \n \t "
" movl $29, %%edx \n "
" 1: \n \t "
2024-02-01 15:16:04 +00:00
// phase_feedback = (wave_out + wave_last) >> 2;
2024-02-02 19:29:51 +00:00
" movl %[out], %[p_fb] \n \t "
" addl %%r11d, %[p_fb] \n \t "
" sarl $2, %[p_fb] \n \t "
2024-02-01 15:16:04 +00:00
// wave_last = wave_out
2024-02-02 19:29:51 +00:00
" movl %[out], %%r11d \n \t "
2024-02-01 15:16:04 +00:00
// phase = phase_feedback >> mod_in_shift;
2024-02-02 19:29:51 +00:00
" movl %[p_fb], %%eax \n \t "
" movb %[mod_in], %%cl \n \t "
" sarl %%cl, %%eax \n \t "
2024-02-01 15:16:04 +00:00
// phase += phase_acc >> 9;
2024-02-02 19:29:51 +00:00
" movl %[p_acc], %%ebx \n \t "
" sarl $9, %%ebx \n \t "
" addl %%ebx, %%eax \n \t "
2024-02-01 15:16:04 +00:00
// lookup = logsinrom[(waveform << 10) | (phase & 0x3ff)];
2024-02-02 19:29:51 +00:00
" andq $0x3ff, %%rax \n \t "
" movzwl (%%r8, %%rax, 2), %%ebx \n \t "
" movl %%ebx, %%eax \n \t "
2024-02-01 15:16:04 +00:00
// level = (lookup & 0x1fff) + (envelope << 3);
2024-02-02 19:29:51 +00:00
" movl $0x1fff, %%ecx \n \t "
" andl %%ecx, %%eax \n \t "
" addl %%r10d, %%eax \n \t "
2024-02-01 15:16:04 +00:00
// if (level > 0x1fff) level = 0x1fff;
2024-02-02 19:29:51 +00:00
" cmpl %%ecx, %%eax \n \t "
" cmoval %%ecx, %%eax \n \t "
2024-02-01 15:16:04 +00:00
// wave_out = exprom[level & 0xff] >> (level >> 8);
2024-02-02 19:29:51 +00:00
" movb %%ah, %%cl \n \t "
" movzbl %%al, %%eax \n \t "
" movzwl (%%r9, %%rax, 2), %[out] \n \t "
" shrl %%cl, %[out] \n \t "
2024-02-01 15:16:04 +00:00
// if (lookup & 0x8000) wave_out = -wave_out;
// in other words, lookup is negative
2024-02-02 19:29:51 +00:00
" movl %[out], %%ecx \n \t "
" negl %%ecx \n \t "
" testw %%bx, %%bx \n \t "
" cmovsl %%ecx, %[out] \n \t "
2024-02-01 15:16:04 +00:00
// phase_acc += phase_offset
2024-02-02 19:29:51 +00:00
" addl %[p_off], %[p_acc] \n \t "
2024-02-01 15:16:04 +00:00
// loop
2024-02-02 19:29:51 +00:00
" decl %%edx \n \t "
" jne 1b \n \t "
2024-02-01 15:16:04 +00:00
: [ p_fb ] " =&r " ( phase_feedback ) ,
[ p_acc ] " +r " ( phase_acc ) ,
2024-02-01 21:33:20 +00:00
[ out ] " =&r " ( wave_out )
: [ p_off ] " r " ( phase_offset ) ,
[ mod_in ] " r " ( mod_in_shift ) ,
2024-02-02 09:43:45 +00:00
[ wave ] " g " ( waveform ) ,
[ eg_out ] " g " ( eg_output ) ,
2024-02-01 15:16:04 +00:00
[ sinrom ] " m " ( logsinrom ) ,
[ exprom ] " m " ( exprom )
2024-02-01 08:30:11 +00:00
: " cc " , " ax " , " bx " , " cx " , " dx " , " r8 " , " r9 " , " r10 " , " r11 "
) ;
2024-02-02 09:31:42 +00:00
# elif defined(__GNUC__) && defined(__i386__)
asm (
2024-02-02 19:29:51 +00:00
" movzbl %b[wave], %%eax \n \t "
" shll $11, %%eax \n \t "
" leal %[sinrom], %%edi \n \t "
" addl %%eax, %%edi \n \t "
" shlw $3, %[eg_out] \n \t "
" xorl %[out], %[out] \n \t "
" movl %[out], %[last] \n \t "
" movl $29, %[i] \n "
" 1: \n \t "
2024-02-02 09:31:42 +00:00
// phase_feedback = (wave_out + wave_last) >> 2;
2024-02-02 19:29:51 +00:00
" movl %[out], %%eax \n \t "
" addl %[last], %%eax \n \t "
" sarl $2, %%eax \n \t "
" movl %%eax, %[p_fb] \n \t "
2024-02-02 09:31:42 +00:00
// wave_last = wave_out
2024-02-02 19:29:51 +00:00
" movl %[out], %[last] \n \t "
2024-02-02 09:31:42 +00:00
// phase = phase_feedback >> mod_in_shift;
2024-02-02 19:29:51 +00:00
" movb %[mod_in], %%cl \n \t "
" sarl %%cl, %%eax \n \t "
2024-02-02 09:31:42 +00:00
// phase += phase_acc >> 9;
2024-02-02 19:29:51 +00:00
" movl %[p_acc], %%ebx \n \t "
" shrl $9, %%ebx \n \t "
" addl %%ebx, %%eax \n \t "
2024-02-02 09:31:42 +00:00
// lookup = logsinrom[(waveform << 10) | (phase & 0x3ff)];
2024-02-02 19:29:51 +00:00
" andl $0x3ff, %%eax \n \t "
" movzwl (%%edi, %%eax, 2), %%ebx \n \t "
" movl %%ebx, %%eax \n \t "
2024-02-02 09:31:42 +00:00
// level = (lookup & 0x1fff) + (envelope << 3);
2024-02-02 19:29:51 +00:00
" movl $0x1fff, %%ecx \n \t "
" andl %%ecx, %%eax \n \t "
" addw %[eg_out], %%ax \n \t "
2024-02-02 09:31:42 +00:00
// if (level > 0x1fff) level = 0x1fff;
2024-02-02 19:29:51 +00:00
" cmpl %%ecx, %%eax \n \t "
" cmoval %%ecx, %%eax \n \t "
2024-02-02 09:31:42 +00:00
// wave_out = exprom[level & 0xff] >> (level >> 8);
2024-02-02 19:29:51 +00:00
" movb %%ah, %%cl \n \t "
" movzbl %%al, %%eax \n \t "
" leal %[exprom], %[out] \n \t "
" movzwl (%[out], %%eax, 2), %[out] \n \t "
" shrl %%cl, %[out] \n \t "
2024-02-02 09:31:42 +00:00
// if (lookup & 0x8000) wave_out = -wave_out;
// in other words, lookup is negative
2024-02-02 19:29:51 +00:00
" movl %[out], %%ecx \n \t "
" negl %%ecx \n \t "
" testw %%bx, %%bx \n \t "
" cmovsl %%ecx, %[out] \n \t "
2024-02-02 09:31:42 +00:00
// phase_acc += phase_offset
2024-02-02 19:29:51 +00:00
" addl %[p_off], %[p_acc] \n \t "
2024-02-02 09:31:42 +00:00
// loop
2024-02-02 19:29:51 +00:00
" decl %[i] \n \t "
" jne 1b \n \t "
2024-02-02 09:31:42 +00:00
: [ p_fb ] " =&m " ( phase_feedback ) ,
[ p_acc ] " +r " ( phase_acc ) ,
[ out ] " =&r " ( wave_out ) ,
[ last ] " =&m " ( wave_last ) ,
[ eg_out ] " +m " ( eg_output )
: [ p_off ] " m " ( phase_offset ) ,
[ mod_in ] " m " ( mod_in_shift ) ,
[ wave ] " m " ( waveform ) ,
[ sinrom ] " m " ( logsinrom ) ,
[ exprom ] " m " ( exprom ) ,
[ i ] " m " ( iter_counter )
: " cc " , " ax " , " bx " , " cx " , " di "
) ;
2024-02-02 21:18:42 +00:00
# elif defined(__GNUC__) && defined(__arm__)
asm (
2024-02-06 10:30:10 +00:00
" movs r3, #0 \n \t "
" movs %[out], #0 \n \t "
" ldr r8, =0x1fff \n \t "
2024-02-03 09:15:12 +00:00
" movs r2, #29 \n "
2024-02-02 21:18:42 +00:00
" 1: \n \t "
// phase_feedback = (wave_out + wave_last) >> 2;
2024-02-06 10:30:10 +00:00
" adds %[p_fb], %[out], r3 \n \t "
" asrs %[p_fb], %[p_fb], #2 \n \t "
2024-02-02 21:18:42 +00:00
// wave_last = wave_out
2024-02-06 10:30:10 +00:00
" mov r3, %[out] \n \t "
2024-02-02 21:18:42 +00:00
// phase = phase_feedback >> mod_in_shift;
2024-02-06 10:30:10 +00:00
" asr r0, %[p_fb], %[mod_in] \n \t "
2024-02-02 21:18:42 +00:00
// phase += phase_acc >> 9;
2024-02-06 10:30:10 +00:00
" add r0, r0, %[p_acc], asr #9 \n \t "
2024-02-02 21:18:42 +00:00
// lookup = logsinrom[(waveform << 10) | (phase & 0x3ff)];
2024-02-03 09:15:12 +00:00
" lsls r0, r0, #22 \n \t "
2024-02-03 09:19:26 +00:00
" lsrs r0, r0, #21 \n \t "
2024-02-06 10:30:10 +00:00
" ldrsh r1, [%[sinrom], r0] \n \t "
2024-02-02 21:18:42 +00:00
// level = (lookup & 0x1fff) + (envelope << 3);
2024-02-06 10:30:10 +00:00
" and r0, r8, r1 \n \t "
" add r0, r0, %[eg_out], lsl #3 \n \t "
2024-02-02 21:18:42 +00:00
// if (level > 0x1fff) level = 0x1fff;
2024-02-06 10:30:10 +00:00
" cmp r0, r8 \n \t "
2024-02-03 09:19:26 +00:00
" it hi \n \t "
2024-02-06 10:30:10 +00:00
" movhi r0, r8 \n \t "
2024-02-02 21:18:42 +00:00
// wave_out = exprom[level & 0xff] >> (level >> 8);
2024-02-06 10:30:10 +00:00
" lsrs %[out], r0, #8 \n \t "
" ands r0, r0, #255 \n \t "
" lsls r0, r0, #1 \n \t "
" ldrh r0, [%[exprom], r0] \n \t "
" lsr %[out], r0, %[out] \n \t "
2024-02-02 21:18:42 +00:00
// if (lookup & 0x8000) wave_out = -wave_out;
// in other words, lookup is negative
" tst r1, r1 \n \t "
2024-02-03 09:19:26 +00:00
" it mi \n \t "
2024-02-06 10:30:10 +00:00
" negmi %[out], %[out] \n \t "
2024-02-02 21:18:42 +00:00
// phase_acc += phase_offset
2024-02-06 10:30:10 +00:00
" adds %[p_acc], %[p_acc], %[p_off] \n \t "
2024-02-02 21:18:42 +00:00
// loop
" subs r2, r2, #1 \n \t "
" bne 1b \n \t "
2024-02-06 10:30:10 +00:00
: [ p_fb ] " =&r " ( phase_feedback ) ,
[ p_acc ] " +r " ( phase_acc ) ,
[ out ] " =&r " ( wave_out )
: [ p_off ] " r " ( phase_offset ) ,
[ mod_in ] " r " ( mod_in_shift ) ,
[ eg_out ] " r " ( eg_output ) ,
[ sinrom ] " r " ( logsinrom + waveform * 1024 ) ,
[ exprom ] " r " ( exprom )
: " cc " , " r0 " , " r1 " , " r2 " , " r3 " , " r8 "
2024-02-02 21:18:42 +00:00
) ;
2024-02-01 08:30:11 +00:00
# else
2024-02-01 15:16:04 +00:00
wave_out = 0 ;
wave_last = 0 ;
2024-02-01 21:33:20 +00:00
for ( iter_counter = 0 ; iter_counter < 29 ; iter_counter + + )
2024-02-01 08:30:11 +00:00
{
2024-02-01 15:16:04 +00:00
phase_feedback = ( wave_out + wave_last ) > > 2 ;
wave_last = wave_out ;
phase = phase_feedback > > mod_in_shift ;
phase + = phase_acc > > 9 ;
2024-02-01 08:30:11 +00:00
wave_out = ESFM_envelope_wavegen ( waveform , phase , eg_output ) ;
phase_acc + = phase_offset ;
}
# endif
2024-03-11 18:21:50 +00:00
}
2023-10-14 11:10:37 +00:00
2024-02-01 08:30:11 +00:00
// TODO: Figure out - is this how the ESFM chip does it, like the
// patent literally says? (it's really hacky...)
// slot->in.output = wave_out;
2023-10-14 11:10:37 +00:00
2024-02-01 08:30:11 +00:00
// This would be the more canonical way to do it, reusing the rest of
// the synthesis pipeline to finish the calculation:
if ( chip - > native_mode )
{
slot - > in . feedback_buf = phase_feedback ;
}
else
{
slot - > in . feedback_buf = phase_feedback > > ( 7 - slot - > mod_in_level ) ;
}
2023-10-14 11:10:37 +00:00
}
}
}
/* ------------------------------------------------------------------------- */
static void
ESFM_process_channel ( esfm_channel * channel )
{
int slot_idx ;
channel - > output [ 0 ] = channel - > output [ 1 ] = 0 ;
for ( slot_idx = 0 ; slot_idx < 4 ; slot_idx + + )
{
esfm_slot * slot = & channel - > slots [ slot_idx ] ;
ESFM_envelope_calc ( slot ) ;
ESFM_phase_generate ( slot ) ;
if ( slot_idx > 0 )
{
ESFM_slot_generate ( slot ) ;
}
}
// ESFM feedback calculation takes a large number of clock cycles, so
// defer slot 0 generation to the end
// TODO: verify this behavior on real hardware
}
/* ------------------------------------------------------------------------- */
static void
ESFM_process_channel_emu ( esfm_channel * channel )
{
int slot_idx ;
channel - > output [ 0 ] = channel - > output [ 1 ] = 0 ;
for ( slot_idx = 0 ; slot_idx < 2 ; slot_idx + + )
{
esfm_slot * slot = & channel - > slots [ slot_idx ] ;
ESFM_envelope_calc ( slot ) ;
ESFM_phase_generate_emu ( slot ) ;
if ( slot_idx > 0 )
{
ESFM_slot_generate_emu ( slot ) ;
}
}
// ESFM feedback calculation takes a large number of clock cycles, so
// defer slot 0 generation to the end
// TODO: verify this behavior on real hardware
}
/* ------------------------------------------------------------------------- */
static int16_t
ESFM_clip_sample ( int32 sample )
{
// TODO: Supposedly, the real ESFM chip actually overflows rather than
// clipping. Verify that.
if ( sample > 32767 )
{
sample = 32767 ;
}
else if ( sample < - 32768 )
{
sample = - 32768 ;
}
return ( int16_t ) sample ;
}
/* ------------------------------------------------------------------------- */
static void
ESFM_update_timers ( esfm_chip * chip )
{
// Tremolo
if ( ( chip - > global_timer & 0x3f ) = = 0x3f )
{
chip - > tremolo_pos = ( chip - > tremolo_pos + 1 ) % 210 ;
if ( chip - > tremolo_pos < 105 )
{
chip - > tremolo = chip - > tremolo_pos ;
}
else
{
chip - > tremolo = ( 210 - chip - > tremolo_pos ) ;
}
}
// Vibrato
if ( ( chip - > global_timer & 0x3ff ) = = 0x3ff )
{
chip - > vibrato_pos = ( chip - > vibrato_pos + 1 ) & 0x07 ;
}
chip - > global_timer = ( chip - > global_timer + 1 ) & 0x3ff ;
// Envelope generator dither clocks
chip - > eg_clocks = 0 ;
if ( chip - > eg_timer )
{
uint8 shift = 0 ;
while ( shift < 36 & & ( ( chip - > eg_timer > > shift ) & 1 ) = = 0 )
{
shift + + ;
}
if ( shift < = 12 )
{
chip - > eg_clocks = shift + 1 ;
}
}
if ( chip - > eg_tick | | chip - > eg_timer_overflow )
{
if ( chip - > eg_timer = = ( 1llu < < 36 ) - 1 )
{
chip - > eg_timer = 0 ;
chip - > eg_timer_overflow = 1 ;
}
else
{
chip - > eg_timer + + ;
chip - > eg_timer_overflow = 0 ;
}
}
chip - > eg_tick ^ = 1 ;
}
# define KEY_ON_REGS_START (18 * 4 * 8)
/* ------------------------------------------------------------------------- */
int
ESFM_reg_write_chan_idx ( esfm_chip * chip , uint16_t reg )
{
int which_reg = - 1 ;
if ( chip - > native_mode )
{
bool is_key_on_reg = reg > = KEY_ON_REGS_START & & reg < ( KEY_ON_REGS_START + 20 ) ;
if ( is_key_on_reg )
{
which_reg = reg - KEY_ON_REGS_START ;
}
}
else
{
uint8_t reg_low = reg & 0xff ;
bool high = reg & 0x100 ;
bool is_key_on_reg = reg_low > = 0xb0 & & reg_low < 0xb9 ;
if ( is_key_on_reg )
{
which_reg = ( reg_low & 0x0f ) + high * 9 ;
}
}
return which_reg ;
}
/* ------------------------------------------------------------------------- */
void
ESFM_update_write_buffer ( esfm_chip * chip )
{
esfm_write_buf * write_buf ;
bool note_off_written [ 20 ] ;
bool bassdrum_written = false ;
int i ;
for ( i = 0 ; i < 20 ; i + + )
{
note_off_written [ i ] = false ;
}
while ( ( write_buf = & chip - > write_buf [ chip - > write_buf_start ] ) ,
write_buf - > valid & & write_buf - > timestamp < = chip - > write_buf_timestamp )
{
int is_which_note_on_reg =
ESFM_reg_write_chan_idx ( chip , write_buf - > address ) ;
if ( is_which_note_on_reg > = 0 )
{
if ( ( chip - > native_mode & & ( write_buf - > data & 0x01 ) = = 0 )
| | ( ! chip - > native_mode & & ( write_buf - > data & 0x20 ) = = 0 )
)
{
// this is a note off command; note down that we got note off for this channel
note_off_written [ is_which_note_on_reg ] = true ;
}
else
{
// this is a note on command; have we gotten a note off for this channel in this cycle?
if ( note_off_written [ is_which_note_on_reg ] )
{
// we have a conflict; let the note off be processed first and defer the
// rest of the buffer to the next cycle
break ;
}
}
}
if ( ( chip - > native_mode & & write_buf - > address = = 0x4bd )
| | ( ! chip - > native_mode & & ( write_buf - > address & 0xff ) = = 0xbd )
)
{
// bassdrum register write (rhythm mode note-on/off control)
// have we already written to the bassdrum register in this cycle
if ( bassdrum_written ) {
// we have a conflict
break ;
}
bassdrum_written = true ;
}
write_buf - > valid = 0 ;
ESFM_write_reg ( chip , write_buf - > address , write_buf - > data ) ;
chip - > write_buf_start = ( chip - > write_buf_start + 1 ) % ESFM_WRITEBUF_SIZE ;
}
chip - > write_buf_timestamp + + ;
}
/* ------------------------------------------------------------------------- */
void
ESFM_generate ( esfm_chip * chip , int16_t * buf )
{
int channel_idx ;
chip - > output_accm [ 0 ] = chip - > output_accm [ 1 ] = 0 ;
for ( channel_idx = 0 ; channel_idx < 18 ; channel_idx + + )
{
esfm_channel * channel = & chip - > channels [ channel_idx ] ;
if ( chip - > native_mode )
{
ESFM_process_channel ( channel ) ;
}
else
{
ESFM_process_channel_emu ( channel ) ;
}
2024-02-01 08:30:11 +00:00
}
ESFM_process_feedback ( chip ) ;
for ( channel_idx = 0 ; channel_idx < 18 ; channel_idx + + )
{
esfm_channel * channel = & chip - > channels [ channel_idx ] ;
if ( chip - > native_mode )
{
ESFM_slot_generate ( & channel - > slots [ 0 ] ) ;
}
else
{
ESFM_slot_generate_emu ( & channel - > slots [ 0 ] ) ;
}
2023-10-14 11:10:37 +00:00
chip - > output_accm [ 0 ] + = channel - > output [ 0 ] ;
chip - > output_accm [ 1 ] + = channel - > output [ 1 ] ;
}
buf [ 0 ] = ESFM_clip_sample ( chip - > output_accm [ 0 ] ) ;
buf [ 1 ] = ESFM_clip_sample ( chip - > output_accm [ 1 ] ) ;
ESFM_update_timers ( chip ) ;
ESFM_update_write_buffer ( chip ) ;
}
/* ------------------------------------------------------------------------- */
int16_t
ESFM_get_channel_output_native ( esfm_chip * chip , int channel_idx )
{
int16_t result ;
int32_t temp_mix = 0 ;
int i ;
if ( channel_idx < 0 | | channel_idx > = 18 )
{
return 0 ;
}
for ( i = 0 ; i < 4 ; i + + )
{
esfm_slot * slot = & chip - > channels [ channel_idx ] . slots [ i ] ;
if ( slot - > output_level )
{
int13 output_value = slot - > in . output > > ( 7 - slot - > output_level ) ;
temp_mix + = output_value & slot - > out_enable [ 0 ] ;
temp_mix + = output_value & slot - > out_enable [ 1 ] ;
}
}
if ( temp_mix > 32767 )
{
temp_mix = 32767 ;
}
else if ( temp_mix < - 32768 )
{
temp_mix = - 32768 ;
}
result = temp_mix ;
return result ;
}
/* ------------------------------------------------------------------------- */
void
ESFM_generate_stream ( esfm_chip * chip , int16_t * sndptr , uint32_t num_samples )
{
uint32_t i ;
for ( i = 0 ; i < num_samples ; i + + )
{
ESFM_generate ( chip , sndptr ) ;
sndptr + = 2 ;
}
}