diff --git a/.appveyor.yml b/.appveyor.yml index 7ca7d58c4ce..9b25ff5e437 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -8,7 +8,11 @@ environment: matrix: - compiler: msvc install: - - vcpkg install --triplet %PLATFORM%-windows --recurse fftw3 libsamplerate libsndfile sdl2 + - cd C:\Tools\vcpkg + - git pull + - .\bootstrap-vcpkg.bat + - cd %APPVEYOR_BUILD_FOLDER% + - vcpkg install --triplet %PLATFORM%-windows --recurse fftw3 libsamplerate libsndfile lilv lv2 sdl2 - nuget install clcache -Version 4.1.0 build_script: - cd %APPVEYOR_BUILD_FOLDER% diff --git a/.gitmodules b/.gitmodules index ebc1502e265..efee7e4cba2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -40,3 +40,12 @@ [submodule "plugins/carlabase/carla"] path = plugins/carlabase/carla url = https://github.com/falktx/carla +[submodule "plugins/sid/resid"] + path = plugins/Sid/resid + url = https://github.com/simonowen/resid +[submodule "src/3rdparty/jack2"] + path = src/3rdparty/jack2 + url = https://github.com/jackaudio/jack2 +[submodule "plugins/LadspaEffect/cmt/cmt"] + path = plugins/LadspaEffect/cmt/cmt + url = https://github.com/lmms/cmt diff --git a/CMakeLists.txt b/CMakeLists.txt index a3c83c1a4b6..84fd91ee46d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,10 @@ IF(COMMAND CMAKE_POLICY) CMAKE_POLICY(SET CMP0057 NEW) ENDIF(COMMAND CMAKE_POLICY) + +# Import of windows.h breaks min()/max() +ADD_DEFINITIONS(-DNOMINMAX) + INCLUDE(PluginList) INCLUDE(CheckSubmodules) INCLUDE(AddFileDependencies) @@ -97,7 +101,6 @@ ENDIF(LMMS_BUILD_APPLE) IF(LMMS_BUILD_WIN32) SET(WANT_ALSA OFF) - SET(WANT_JACK OFF) SET(WANT_PULSEAUDIO OFF) SET(WANT_SNDIO OFF) SET(WANT_SOUNDIO OFF) @@ -105,7 +108,6 @@ IF(LMMS_BUILD_WIN32) SET(BUNDLE_QT_TRANSLATIONS ON) SET(LMMS_HAVE_WINMM TRUE) SET(STATUS_ALSA "") - SET(STATUS_JACK "") SET(STATUS_PULSEAUDIO "") SET(STATUS_SOUNDIO "") SET(STATUS_WINMM "OK") @@ -201,14 +203,19 @@ IF(WANT_LV2) IF(PKG_CONFIG_FOUND) PKG_CHECK_MODULES(LV2 lv2) PKG_CHECK_MODULES(LILV lilv-0) - IF(LV2_FOUND AND LILV_FOUND) - SET(LMMS_HAVE_LV2 TRUE) - SET(STATUS_LV2 "OK") - ELSE() - SET(STATUS_LV2 "not found, install it or set PKG_CONFIG_PATH appropriately") + ENDIF() + IF(NOT LV2_FOUND AND NOT LILV_FOUND) + FIND_PACKAGE(LV2 CONFIG) + FIND_PACKAGE(LILV CONFIG) + IF(LILV_FOUND) + SET(LILV_LIBRARIES "lilv::lilv") ENDIF() + ENDIF() + IF(LV2_FOUND AND LILV_FOUND) + SET(LMMS_HAVE_LV2 TRUE) + SET(STATUS_LV2 "OK") ELSE() - SET(STATUS_LV2 "not found, requires pkg-config") + SET(STATUS_LV2 "not found, install it or set PKG_CONFIG_PATH appropriately") ENDIF() ELSE(WANT_LV2) SET(STATUS_LV2 "not built as requested") @@ -433,23 +440,26 @@ ENDIF(NOT LMMS_HAVE_ALSA) # check for JACK IF(WANT_JACK) - PKG_CHECK_MODULES(JACK jack>=0.77) - IF(JACK_FOUND) - IF(WANT_WEAKJACK) - SET(LMMS_HAVE_WEAKJACK TRUE) - SET(WEAKJACK_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/3rdparty/weakjack/weakjack) - SET(STATUS_JACK "OK (weak linking enabled)") - # use dlsym instead - SET(JACK_LIBRARIES ${CMAKE_DL_LIBS}) - ELSE() + IF(WANT_WEAKJACK) + SET(LMMS_HAVE_WEAKJACK TRUE) + SET(WEAKJACK_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/3rdparty/weakjack/weakjack) + SET(JACK_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/3rdparty/jack2/common) + SET(STATUS_JACK "OK (weak linking enabled)") + # use dlsym instead + SET(JACK_LIBRARIES ${CMAKE_DL_LIBS}) + SET(LMMS_HAVE_JACK TRUE) + SET(JACK_FOUND TRUE) + ELSE() + PKG_CHECK_MODULES(JACK jack>=0.77) + IF(JACK_FOUND) SET(STATUS_JACK "OK") ENDIF() - SET(LMMS_HAVE_JACK TRUE) - ELSE(JACK_FOUND) + ENDIF() + + IF(NOT JACK_FOUND) SET(JACK_INCLUDE_DIRS "") - SET(STATUS_JACK "not found, please install libjack0.100.0-dev (or similar) " - "if you require JACK support") - ENDIF(JACK_FOUND) + SET(STATUS_JACK "not found") + ENDIF() ENDIF(WANT_JACK) # check for FFTW3F-library diff --git a/cmake/apple/CMakeLists.txt b/cmake/apple/CMakeLists.txt index 835d886b9b6..0b66689e75d 100644 --- a/cmake/apple/CMakeLists.txt +++ b/cmake/apple/CMakeLists.txt @@ -9,6 +9,11 @@ SET(MACOSX_BUNDLE_MIMETYPE "application/x-lmms-project") SET(MACOSX_BUNDLE_MIMETYPE_ICON "project.icns") SET(MACOSX_BUNDLE_MIMETYPE_ID "io.lmms") SET(MACOSX_BUNDLE_PROJECT_URL "${PROJECT_URL}") +SET(MACOSX_BUNDLE_DMG_TITLE "${MACOSX_BUNDLE_BUNDLE_NAME} ${MACOSX_BUNDLE_LONG_VERSION_STRING}") + +# FIXME: appdmg won't allow volume names > 27 char +# See also https://github.com/LinusU/node-appdmg/issues/48 +STRING(SUBSTRING "${MACOSX_BUNDLE_DMG_TITLE}" 0 27 MACOSX_BUNDLE_DMG_TITLE) CONFIGURE_FILE("lmms.plist.in" "${CMAKE_BINARY_DIR}/Info.plist") CONFIGURE_FILE("install_apple.sh.in" "${CMAKE_BINARY_DIR}/install_apple.sh" @ONLY) diff --git a/cmake/apple/package_apple.json.in b/cmake/apple/package_apple.json.in index 1d1147cbf21..f6660b345bc 100644 --- a/cmake/apple/package_apple.json.in +++ b/cmake/apple/package_apple.json.in @@ -1,5 +1,5 @@ { - "title": "@MACOSX_BUNDLE_BUNDLE_NAME@ @MACOSX_BUNDLE_LONG_VERSION_STRING@", + "title": "@MACOSX_BUNDLE_DMG_TITLE@", "background": "@CMAKE_SOURCE_DIR@/cmake/apple/dmg_branding.png", "icon-size": 128, "contents": [ diff --git a/cmake/modules/PluginList.cmake b/cmake/modules/PluginList.cmake index a2871bf99ec..ed4ffd2eb10 100644 --- a/cmake/modules/PluginList.cmake +++ b/cmake/modules/PluginList.cmake @@ -56,7 +56,7 @@ SET(LMMS_PLUGIN_LIST ReverbSC sf2_player sfxr - sid + Sid SpectrumAnalyzer stereo_enhancer stereo_matrix diff --git a/data/themes/classic/style.css b/data/themes/classic/style.css index 65b496617f1..5935b7749fc 100644 --- a/data/themes/classic/style.css +++ b/data/themes/classic/style.css @@ -11,6 +11,11 @@ QMdiArea { background-image: url(resources:background_artwork.png); } +Knob { + qproperty-lineInactiveColor: rgb(120, 120, 120); + qproperty-arcInactiveColor: rgba(120, 120, 120, 70); +} + AutomationEditor { background-color: rgb(0, 0, 0); color: #e0e0e0; @@ -34,8 +39,6 @@ QLineEdit { border-radius: 4px; border: 2px inset rgba(91,101,113,128); background: #49515b; - color: #e0e0e0; - selection-background-color: #202020; } @@ -50,6 +53,13 @@ QLineEdit:focus { border: 1px solid rgba(0,0,0, 128); } +/* Set color and selection background color for various inputs. + SpinBoxes are used in QInputDialogs */ + +QTextEdit, QLineEdit:focus, QComboBox:focus, QSpinBox:focus, QDoubleSpinBox:focus { + color: #e0e0e0; + selection-background-color: #202020; +} QToolTip { border-radius: 4px; diff --git a/data/themes/default/style.css b/data/themes/default/style.css index 832da176f28..39d32fcf6cf 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -40,6 +40,11 @@ QMdiArea { background-color: #111314; } +Knob { + qproperty-lineInactiveColor: rgb(120, 120, 120); + qproperty-arcInactiveColor: rgba(120, 120, 120, 70); +} + AutomationEditor { color: #ffffff; background-color: #141616; @@ -61,8 +66,6 @@ QLineEdit { border-radius: 4px; border: 1px; background: #101213; - color: #d1d8e4; - selection-background-color: #17793b; } QLineEdit:read-only { @@ -76,6 +79,13 @@ QLineEdit:focus { border: 1px solid #0bd556; } +/* Set color and selection background color for various inputs. + SpinBoxes are used in QInputDialogs */ + +QTextEdit, QLineEdit:focus, QComboBox:focus, QSpinBox:focus, QDoubleSpinBox:focus { + color: #d1d8e4; + selection-background-color: #17793b; +} QToolTip { border-radius: 4px; diff --git a/include/AudioSoundIo.h b/include/AudioSoundIo.h index 79b586f0645..6a740a02400 100644 --- a/include/AudioSoundIo.h +++ b/include/AudioSoundIo.h @@ -110,6 +110,7 @@ class AudioSoundIo : public AudioDevice fpp_t m_outBufFrameIndex; bool m_stopped; + bool m_outstreamStarted; int m_disconnectErr; void onBackendDisconnect(int err); diff --git a/include/Knob.h b/include/Knob.h index b129bc8d690..3c730e3dd60 100644 --- a/include/Knob.h +++ b/include/Knob.h @@ -26,6 +26,8 @@ #ifndef KNOB_H #define KNOB_H +#include +#include #include #include @@ -41,6 +43,7 @@ enum knobTypes } ; +void convertPixmapToGrayScale(QPixmap &pixMap); class LMMS_EXPORT Knob : public QWidget, public FloatModelView { @@ -58,8 +61,12 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView // Unfortunately, the gradient syntax doesn't create our gradient // correctly so we need to do this: Q_PROPERTY(QColor outerColor READ outerColor WRITE setOuterColor) - Q_PROPERTY(QColor lineColor READ lineColor WRITE setlineColor) - Q_PROPERTY(QColor arcColor READ arcColor WRITE setarcColor) + + Q_PROPERTY(QColor lineActiveColor MEMBER m_lineActiveColor) + Q_PROPERTY(QColor lineInactiveColor MEMBER m_lineInactiveColor) + Q_PROPERTY(QColor arcActiveColor MEMBER m_arcActiveColor) + Q_PROPERTY(QColor arcInactiveColor MEMBER m_arcInactiveColor) + mapPropertyFromModel(bool,isVolumeKnob,setVolumeKnob,m_volumeKnob); mapPropertyFromModel(float,volumeRatio,setVolumeRatio,m_volumeRatio); @@ -74,7 +81,6 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView Knob( knobTypes _knob_num, QWidget * _parent = NULL, const QString & _name = QString() ); Knob( QWidget * _parent = NULL, const QString & _name = QString() ); //!< default ctor Knob( const Knob& other ) = delete; - virtual ~Knob(); // TODO: remove inline void setHintText( const QString & _txt_before, @@ -108,10 +114,6 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView QColor outerColor() const; void setOuterColor( const QColor & c ); - QColor lineColor() const; - void setlineColor( const QColor & c ); - QColor arcColor() const; - void setarcColor( const QColor & c ); QColor textColor() const; void setTextColor( const QColor & c ); @@ -134,6 +136,7 @@ class LMMS_EXPORT Knob : public QWidget, public FloatModelView void mouseDoubleClickEvent( QMouseEvent * _me ) override; void paintEvent( QPaintEvent * _me ) override; void wheelEvent( QWheelEvent * _me ) override; + void changeEvent(QEvent * ev) override; virtual float getValue( const QPoint & _p ); @@ -169,7 +172,7 @@ private slots: QString m_label; - QPixmap * m_knobPixmap; + std::unique_ptr m_knobPixmap; BoolModel m_volumeKnob; FloatModel m_volumeRatio; @@ -187,8 +190,11 @@ private slots: float m_outerRadius; float m_lineWidth; QColor m_outerColor; - QColor m_lineColor; //!< unused yet - QColor m_arcColor; //!< unused yet + + QColor m_lineActiveColor; + QColor m_lineInactiveColor; + QColor m_arcActiveColor; + QColor m_arcInactiveColor; QColor m_textColor; diff --git a/include/Lv2ControlBase.h b/include/Lv2ControlBase.h index d5d83f37800..acfbea25ee4 100644 --- a/include/Lv2ControlBase.h +++ b/include/Lv2ControlBase.h @@ -33,6 +33,7 @@ #include "DataFile.h" #include "LinkedModelGroups.h" +#include "lmms_export.h" #include "Plugin.h" class Lv2Proc; @@ -65,7 +66,7 @@ class PluginIssue; * this class can not override virtuals of Instrument or EffectControls, so it will offer functions that must be called by virtuals in its child class */ -class Lv2ControlBase : public LinkedModelGroups +class LMMS_EXPORT Lv2ControlBase : public LinkedModelGroups { public: static Plugin::PluginTypes check(const LilvPlugin* m_plugin, @@ -87,7 +88,11 @@ class Lv2ControlBase : public LinkedModelGroups //! this is the same pointer as this, but a different type //! @param uri the Lv2 URI telling this class what plugin to construct Lv2ControlBase(class Model *that, const QString& uri); + Lv2ControlBase(const Lv2ControlBase&) = delete; ~Lv2ControlBase() override; + + Lv2ControlBase& operator=(const Lv2ControlBase&) = delete; + //! Must be checked after ctor or reload bool isValid() const { return m_valid; } diff --git a/include/Lv2SubPluginFeatures.h b/include/Lv2SubPluginFeatures.h index 33c29c3ef26..fee3c381216 100644 --- a/include/Lv2SubPluginFeatures.h +++ b/include/Lv2SubPluginFeatures.h @@ -33,9 +33,10 @@ #include +#include "lmms_export.h" #include "Plugin.h" -class Lv2SubPluginFeatures : public Plugin::Descriptor::SubPluginFeatures +class LMMS_EXPORT Lv2SubPluginFeatures : public Plugin::Descriptor::SubPluginFeatures { private: static const LilvPlugin *getPlugin(const Key &k); diff --git a/include/Lv2ViewBase.h b/include/Lv2ViewBase.h index 980e1f7efcf..5ccbbb75be1 100644 --- a/include/Lv2ViewBase.h +++ b/include/Lv2ViewBase.h @@ -34,6 +34,7 @@ #include #include "LinkedModelGroupViews.h" +#include "lmms_export.h" #include "Lv2Basics.h" class Lv2Proc; @@ -54,7 +55,7 @@ class Lv2ViewProc : public LinkedModelGroupView //! Base class for view for one Lv2 plugin -class Lv2ViewBase : public LinkedModelGroupsView +class LMMS_EXPORT Lv2ViewBase : public LinkedModelGroupsView { protected: //! @param pluginWidget A child class which inherits QWidget diff --git a/plugins/LadspaEffect/cmt/CMakeLists.txt b/plugins/LadspaEffect/cmt/CMakeLists.txt index f9fcd89cbb4..7aae5a68324 100644 --- a/plugins/LadspaEffect/cmt/CMakeLists.txt +++ b/plugins/LadspaEffect/cmt/CMakeLists.txt @@ -1,5 +1,5 @@ INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include") -FILE(GLOB_RECURSE SOURCES src/*.cpp) +FILE(GLOB_RECURSE SOURCES cmt/src/*.cpp) LIST(SORT SOURCES) ADD_LIBRARY(cmt MODULE ${SOURCES}) INSTALL(TARGETS cmt LIBRARY DESTINATION "${PLUGIN_DIR}/ladspa") @@ -7,13 +7,13 @@ INSTALL(TARGETS cmt LIBRARY DESTINATION "${PLUGIN_DIR}/ladspa") SET_TARGET_PROPERTIES(cmt PROPERTIES PREFIX "") SET_TARGET_PROPERTIES(cmt PROPERTIES COMPILE_FLAGS "-Wall -O3 -fno-strict-aliasing") -IF(LMMS_BUILD_WIN32) - ADD_CUSTOM_COMMAND(TARGET cmt POST_BUILD COMMAND "${STRIP}" \"$\") -ELSE(LMMS_BUILD_WIN32) +IF(LMMS_BUILD_WIN32 AND NOT CMAKE_BUILD_TYPE MATCHES "Deb") + ADD_CUSTOM_COMMAND(TARGET cmt POST_BUILD COMMAND "${STRIP}" "$") +ELSE() SET_TARGET_PROPERTIES(cmt PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -fPIC") -ENDIF(LMMS_BUILD_WIN32) +ENDIF() IF(NOT LMMS_BUILD_APPLE AND NOT LMMS_BUILD_OPENBSD) SET_TARGET_PROPERTIES(cmt PROPERTIES LINK_FLAGS "${LINK_FLAGS} -shared -Wl,-no-undefined") -ENDIF(NOT LMMS_BUILD_APPLE AND NOT LMMS_BUILD_OPENBSD) +ENDIF() diff --git a/plugins/LadspaEffect/cmt/README b/plugins/LadspaEffect/cmt/README deleted file mode 100644 index 3653569fcbf..00000000000 --- a/plugins/LadspaEffect/cmt/README +++ /dev/null @@ -1,7 +0,0 @@ -Computer Music Toolkit (CMT) ----------------------------- - -This toolkit is a set of musical sound processing and synthesis tools -presented as a LADSPA plugin library. See the doc/ directory for -documentation and installation instructions. See http://www.ladspa.org -for LADSPA information. See http://www.ladspa.org/cmt for CMT updates. diff --git a/plugins/LadspaEffect/cmt/cmt b/plugins/LadspaEffect/cmt/cmt new file mode 160000 index 00000000000..f7c25ed4ef7 --- /dev/null +++ b/plugins/LadspaEffect/cmt/cmt @@ -0,0 +1 @@ +Subproject commit f7c25ed4ef7f4d7efb1bcd4229d25595d4f1ce55 diff --git a/plugins/LadspaEffect/cmt/doc/COPYING b/plugins/LadspaEffect/cmt/doc/COPYING deleted file mode 100644 index eeb586b392a..00000000000 --- a/plugins/LadspaEffect/cmt/doc/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/plugins/LadspaEffect/cmt/doc/adding_plugins.html b/plugins/LadspaEffect/cmt/doc/adding_plugins.html deleted file mode 100644 index 785bdfdea8d..00000000000 --- a/plugins/LadspaEffect/cmt/doc/adding_plugins.html +++ /dev/null @@ -1,54 +0,0 @@ -

Adding Plugins to the CMT Library

- -

The CMT -LADSPA plugin collection is written in C++ and uses a little -additional sophistication to make plugin writing easier. This document -describes how to add a new plugin to the toolkit.

- -

At the moment CMT is not under public version control, so please -send changes to Richard -Furse.

- -

CMT plugins interpret LADSPA_Handle entities as -pointers to objects derived from the CMT_PluginInstance -class. Plugin instance structures are defined by subclassing this, so -writing a descendent of CMT_PluginInstance is the first -thing to do. The CMT library provides its own implementation of -connect_port(), cleanup() and a templated -form of instantiate() (see -CMT_Instantiate<>()). These calls assume that any -instantiation or cleanup mechanisms required will be written in the -constructor or destructor of the class.

- -

When writing a plugin module, an initialisation function should be -included. To ensure this is called, add a call to the -initialise_modules() function in -descriptor.cpp. The module should also be added to the -makefile.

- -

Your initialisation function should construct new -CMT_Desctiptor plugin descriptor structures and pass them -to registerNewPluginDescriptor(). The -CMT_Descriptor is directly descended from -LADSPA_Descriptor but provides constructor, destructor -and addPort() methods.

- -

All plugins need unique IDs. During development, use values between -1 and 1000. When the plugin is ready, please request an ID from ladspa@muse.demon.co.uk. Please -also add a brief description of your module to plugins.html.

- -

In practice, CMT plugin writing is probably best learned by -example. For a simple case, see the mixer.cpp -module. This defines a SimpleMixer class to handle -instance data, a runSimpleMixer() function for use with -it and a mixer_descriptor() function to provide a -description of the plugin to the CMT core. The -mixer_descriptor() function is declared and referenced in -the descriptor.cpp module. Additional information is -available in cmt.h and ladspa.h.

- -

CMT plugins are licenced under GPL -version 2. Please read and understand this license before submitting -plugins to the library.

diff --git a/plugins/LadspaEffect/cmt/doc/bugs.html b/plugins/LadspaEffect/cmt/doc/bugs.html deleted file mode 100644 index e1c89b44801..00000000000 --- a/plugins/LadspaEffect/cmt/doc/bugs.html +++ /dev/null @@ -1,20 +0,0 @@ -

CMT Bugs

- -

Please report bugs to -richard@muse.demon.co.uk.

- -
    - -
  • I'm not sure I've got attack & decay the right way around in the -expander plugins.
  • - -
  • Need to have a look at dynamic.cpp for handling of unusual -arithmetic situation such as isnan(), -isinf() etc.
  • - -
  • Memory management is a little haphazard at present. What happens -when new() fails? The host can use -set_new_handler(), but I suspect this needs further -thought anyway.
  • - -
diff --git a/plugins/LadspaEffect/cmt/doc/changes.html b/plugins/LadspaEffect/cmt/doc/changes.html deleted file mode 100644 index 38bd7071755..00000000000 --- a/plugins/LadspaEffect/cmt/doc/changes.html +++ /dev/null @@ -1,149 +0,0 @@ -

CMT Changes

- -

Version 1.01 - 4 May 2000

-
    - -
  • Initial Release.
  • - -
- -

Version 1.02 - 11 May 2000

-
    - -
  • Use _init() and _fini(). To handle -memory management automatically.
  • - -
  • Change from *_descriptor() approach simpler -initialise_*() approach. Use _init() and -_fini() to handle memory management. Supply -CMT_Descriptor::~CMT_Descriptor().
  • - -
  • Make comments compatible with Doxygen.
  • - -
  • Addition of Ambisonic encoder, decoder, converter and rotation -plugins.
  • - -
  • Addition of Sine Waveshaper and Granular Scatter Processor -plugin.
  • - -
- -

Version 1.03 - 14 May 2000

-
    - -
  • Updated to correspond to http://www.ladspa.org/.
  • - -
- -

Version 1.04 - 18 May 2000

-
    - -
  • Bugfixes: Ambisonic encoder inputs, white noise amplitude/DC, -Ambisonic rotation inplace support, sine oscillator frequency input -inplace support.
  • - -
- -

Version 1.05 - 18 May 2000

-
    - -
  • Bugfix: use explicit pointer type when deleting -ImplementationData in ~CMT_Descriptor.
  • - -
- -

Version 1.06 - 24 Sep 2000

-
    - -
  • Introduction of Identity plugins.
  • - -
- -

Version 1.07 - 30 Sep 2000

-
    - -
  • Use constructor/destructor rather than _fini() and _init(). Use -C++ for linkage.
  • - -
- -

Version 1.08 - 30 Sep 2000

-
    - -
  • Fix to Ambisonic decode equations.
  • - -
- -

Version 1.09 - 4 Nov 2000

-
    - -
  • Addition of a port of Freeverb (version 3) and a collection of -plugins by David Bartold (analogue, canyon_delay, organ, syndrum, -vcf303).
  • - -
- -

Version 1.10 - 17 Feb 2001

-
    - -
  • Small compile fixes to some modules. Apologies to David who sent -me a patch ages ago for the analogue module.
  • - -
- -

Version 1.11 - 8 May 2001

-
    - -
  • Addition of newline character to end of allpass.h.
  • - -
- -

Version 1.12 - 17 Sept 2001

-
    - -
  • Addition of new plugins by David: "Lo Fi" and "Phase Modulated -Voice."
  • - -
- -

Version 1.13 - 7 May 2002

-
    - -
  • Fix to B-Format rotation algorithm.
  • - -
- -

Version 1.14 - 7 Aug 2002

-
    - -
  • Fix to B-Format rotation algorithm.
  • - -
  • Update for LADSPA 1.1 (include default values).
  • - -
- -

Version 1.15 - 19 Dec 2002

-
    - -
  • Addition of a number of utility routines and namespaces by -Nathaniel Virgo.
  • - -
  • Addition of a number of plugins by Nathaniel Virgo.
  • - -
  • Small change to trigger mechanism in syndrum plugin.
  • - -
- -

Version 1.16 - 6 Nov 2007

-
    - -
  • Remove -Werror from compile options in makefile.
  • - -
  • Remove "local" part from install directories.
  • - -
  • Small additional changes to makefile for robustness.
  • - -
  • Replace strdup() with localStrdup() to avoid malloc/new -mismatch.
  • - -
diff --git a/plugins/LadspaEffect/cmt/doc/index.html b/plugins/LadspaEffect/cmt/doc/index.html deleted file mode 100644 index abab9a5a90b..00000000000 --- a/plugins/LadspaEffect/cmt/doc/index.html +++ /dev/null @@ -1,26 +0,0 @@ -

CMT Index

- - - -

Other Links

- - - -

Richard Furse can be emailed as richard@muse.demon.co.uk. - -

- diff --git a/plugins/LadspaEffect/cmt/doc/installation.html b/plugins/LadspaEffect/cmt/doc/installation.html deleted file mode 100644 index e66e29a03d1..00000000000 --- a/plugins/LadspaEffect/cmt/doc/installation.html +++ /dev/null @@ -1,19 +0,0 @@ -

CMT Installation

- -

To build the plugin library, enter the src/ directory -and run make. The makefile expects to find the -ladspa.h header file in your include path or -/usr/local/include/. If you do not have this file it can -be downloaded as part of the LADSPA SDK from -http://www.ladspa.org/download/.

- -

Running make will generate the CMT LADSPA plugin -library (cmt.so) in the plugins/ -directory. This can be moved to an appropriate location depending on -the application you are using. Running make install from -the src/ directory as root will install to -/usr/local/lib/ladspa/ which is on the search path -recommended for hosts looking for plugin libraries. Some applications -may not search this directory automatically.

- diff --git a/plugins/LadspaEffect/cmt/doc/license.html b/plugins/LadspaEffect/cmt/doc/license.html deleted file mode 100644 index a7e00db169d..00000000000 --- a/plugins/LadspaEffect/cmt/doc/license.html +++ /dev/null @@ -1,16 +0,0 @@ -

CMT License

- -

The CMT toolkit is licensed under GPL version -2.

- -

As I understand it (I'm not a lawyer) this means that, once built, -the CMT library may be used with non-GPL'd applications as -long as it is built and loaded using the standard LADSPA -dynamic-linking approach without modification. In my opinion this is a -good thing for the toolkit, if not for the GPL.

- -

The above may not be correct when built against the LGPL version of -the ladpsa.h header file, but it is certainly the way we would like -things to be. See the LADPSA -license for further details.

diff --git a/plugins/LadspaEffect/cmt/doc/overview.html b/plugins/LadspaEffect/cmt/doc/overview.html deleted file mode 100644 index e34b7a9b7b3..00000000000 --- a/plugins/LadspaEffect/cmt/doc/overview.html +++ /dev/null @@ -1,14 +0,0 @@ -

Computer Music Toolkit (CMT) v1.16 Overview

- -

The Computer Music Toolkit (CMT) is a collection of LADSPA plugins for use with software -synthesis and recording packages on Linux. See the license before use.

- -

The CMT was initially designed and developed by Richard W.E. Furse -(who was also the principal designer of the LADSPA standard) and -further plugins have been provided by by Jezar, David Bartold and -Nathaniel Virgo. If you are a programmer or can write documentation -and would like to help out, please feel free to contact Richard.

- diff --git a/plugins/LadspaEffect/cmt/doc/plugins.html b/plugins/LadspaEffect/cmt/doc/plugins.html deleted file mode 100644 index 9eddd04886d..00000000000 --- a/plugins/LadspaEffect/cmt/doc/plugins.html +++ /dev/null @@ -1,477 +0,0 @@ -

CMT Library Plugins

- -

The following plugins are provided in the CMT library:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Plugin IDPlugin LabelDescription
1051lpfLow Pass Filter (One Pole).
1052hpfHigh Pass Filter (One Pole).
1053delay_0.01sEcho Delay Line. The delay time may be varied up to 0.01 -seconds. No feedback is provided.
1054delay_0.1sEcho Delay Line. The delay time may be varied up to 0.1 -seconds. No feedback is provided.
1055delay_1sEcho Delay Line. The delay time may be varied up to 1 -second. No feedback is provided.
1056delay_5sEcho Delay Line. The delay time may be varied up to 5 -seconds. No feedback is provided.
1057delay_60sEcho Delay Line. The delay time may be varied up to 60 -seconds. No feedback is provided.
1058fbdelay_0.01sFeedback Delay Line. The delay time may be varied up to 0.01 -seconds.
1059fbdelay_0.1sFeedback Delay Line. The delay time may be varied up to 0.1 -seconds.
1060fbdelay_1sFeedback Delay Line. The delay time may be varied up to 1 -second.
1061fbdelay_5sFeedback Delay Line. The delay time may be varied up to 5 -seconds.
1062fbdelay_60sFeedback Delay Line. The delay time may be varied up to 60 -seconds.
1063sine_faaaSine Oscillator. Frequency input is audio, Amplitude input is -audio.
1064sine_faacSine Oscillator. Frequency input is audio, Amplitude input is -control.
1065sine_fcaaSine Oscillator. Frequency input is control, Amplitude input is -audio.
1066sine_fcacSine Oscillator. Frequency input is control, Amplitude input is -control.
1067amp_monoAmplifier (Mono).
1068amp_stereoAmplifier (Stereo).
1069noise_source_whiteNoise Source (White).
1070amAmplitude Modulator.
1071mixerMixer (Stereo to Mono).
1072compress_peakSimple Compressor (Peak Envelope Tracking).
1073compress_rmsSimple Compressor (RMS Envelope Tracking).
1074expand_peakSimple Expander (Peak Envelope Tracking).
1075expand_rmsSimple Expander (RMS Envelope Tracking).
1076limit_peakSimple Limiter (Peak Envelope Tracking).
1077limit_rmsSimple Limiter (RMS Envelope Tracking).
1078track_peakEnvelope Tracker (Peak).
1079track_rmsEnvelope Tracker (RMS).
1080track_max_peakEnvelope Tracker (Maximum Peak).
1081track_max_rmsEnvelope Tracker (Maximum RMS).
1082peakPeak Monitor.
1083null_ciNull Plugin (Control Input).
1084null_aiNull Plugin (Audio Input).
1085null_coNull Plugin (Control Output).
1086null_aoNull Plugin (Audio Output).
1087encode_bformatB-Format Encoder. This plugin encodes ambisonic B-Format audio -using the inverse square law but no filtering, reverb or delay.
1088encode_fmhFMH-Format Encoder. This plugin encodes ambisonic FMH-Format audio -using the inverse square law but no filtering, reverb or delay.
1089fmh2bfFMH-Format to B-Format. This plugin simply discards the R, S, T, U -and V channels but is included for clarity.
1090bf2stereoB-Format to Stereo Ambisonic Decoder. This plugin only actually -uses its W and Y input signals and does not use UHJ.
1091bf2quadB-Format to Quad Ambisonic Decoder. This plugin only actually uses -its W, Y and Z input signals.
1092bf2cubeB-Format to Cube Ambisonic Decoder.
1093bf2octFMH-Format to Octagon Ambisonic Decoder. This plugin only actually -uses its W, X, Y, U and V inputs.
1094bf_rotate_zB-Format Rotation (Horizontal). This plugin rotates an B-Format -encoded soundfield around the Z-axis.
1095fmh_rotate_zFMH-Format Rotation (Horizontal). This plugin rotates an -FMH-Format encoded soundfield around the Z-axis.
1096grain_scatterGranular Scattering Processor. This plugin generates an output -audio stream by scattering short `grains' of sound from an input -stream. It is possible to control the length and envelope of these -grains, how far away from their source time grains may be scattered -and the density (grains/sec) of the texture produced.
1097wsshape_sineWave Shaper (Sine-Based).
1098identity_audioIdentity (Audio).
1099identity_controlIdentity (Control).
1123freeverb3Freeverb (Version 3). This reverb unit is a direct port of the -free public domain source code available from Jezar at Dreampoint.
1221analogueAnalogue Synthesizer Voice. Contains two audio oscillators, one LFO, -and three ADSRs. There are five waveforms available for the DCOs: -Sine, Triangle, Square, Sawtooth, and Fullwave rectified sine. The DCOs -may be frequency modulated and/or pulse width modulated by the LFO.
1222organOrgan Voice with Configurable Harmonics. The user may control the -loudness of the harmonics. There are three additional tones that may -be enabled and combined: brass, flute, and reed. Two ADSRs control -the envelope for the upper and lower harmonics.
1223syndrumDrum Synthesizer.
1224vcf303VCF 303. A TB-303 resonant filter clone.
1225canyon_delayCanyon Delay. A deep stereo crossdelay with built-in low pass -filters.
1226phasemodPhase Modulated Synthesizer Voice. Contains six audio oscillators, each -oscillator phase modulates the next. If a modulation coefficient is zero, -then the former oscillator's output is summed with the module's output. -DCO1's phase modulation parameter specifies an offset not a coefficient. -Example modulation parameters {1.0, 0.5, 0.0, 0.5, 0.2, 0.0} for all -six oscillators results in the output function: DCO2 (phase = DCO1 (phase = -1.0) * 0.5) + DCO5 (phase = DCO4 (phase = DCO3 (phase = 0.0) * 0.5) * 0.2) + -DCO6 (phase = 0.0). Each oscillator's output is bounded by -1.0 and 1.0, -or -360o and 360o.
1227lofiLo Fi. Simulates old audio equipment. Adds distortion, -bandwidth limiting, compression, and crackling to audio.
1841pink_interpolated_audioInterpolated pink noise. Pink noise is a kind of random -one-dimensional fractal. This plugin approximates the effect of an -extreme low pass filter on a pink noise signal. It is useful as a -natural-sounding continuously varying control signal with long-term -trends as well as short-term variation. If you use it to control the -pitch of a sine wave it can sound a bit like wind blowing. Notice that -the average value tends to gradually drift over long periods of -time. This is in the nature of pink noise, and so can't be -helped.
1843pink_shSample and hold pink noise. Similar to pink, but with stepped -instead of interpolated output.
1844pink_full_frequencyPink noise simulation with a full frequency range. You can low -pass filter this to get a similar effect to the interpolated pink -noise generator.
1845hard_gateHard noise gate. If the absolute value of the signal falls below -"threshold", it is set to zero. There is no antialiasing.
1846disintegratorAmplifies random half-cycles of it's input by multiplier. Set -multiplier to 0 and vary probability for a weird fade effect, or set -multiplier to -1 and probability to 0.5 to turn pitched sounds into -noise.
1848sledgehammerA Dynamic Sledgehammer, which you can use to bash your signals -into shape. It's basically a very simple and heavy compressor with a -sidechain. Try it with a pad sound as the carrier and a drum loop as -the modulator. Also, you can get some nice "Satan Maximiser"-style -distortion by not connecting the modulator (set it's influence to 0) -and putting the rate up to around 0.1.
1849logisticLogistic Map chaotic stepped control generator. The logistic map -is a classic example from chaos theory. It can be summarised by the -formula
x := r*x*(1-x).
With r<3, x just converges to a -constant value. With r just greater than 3 it oscillates with period -2. at about 3.45 the period doubles again to 4. These period doublings -occur at smaller and smaller increments of r, until at about 3.5699 -there have been an infinite number and the signal never -repeates. Between this value and 4 the system exhibits chaotic -behaviour (although there are regions of periodicity). Papers are -still being published today on the subject of this system's -behaviour. This plugin iterates this map at a given frequency to -produce a stepped signal, which is scaled to lie in the range -(-1,1). When this signal is used as a frequency control it can -sometimes sound quite musical.
- -

"Ambisonics" is a registered trademark of Nimbus Communications -International.

diff --git a/plugins/LadspaEffect/cmt/doc/tasks.html b/plugins/LadspaEffect/cmt/doc/tasks.html deleted file mode 100644 index 72a9ff6d35d..00000000000 --- a/plugins/LadspaEffect/cmt/doc/tasks.html +++ /dev/null @@ -1,36 +0,0 @@ -

CMT Library Task List

- -

Basic Plugins Needed

- -
    - -
  • Noise Gate
  • -
  • Flanger
  • -
  • Phaser
  • -
  • Chorus
  • -
  • Unbounded Delay (echo & feedback)
  • -
  • Distortion
  • -
  • Overdrive
  • -
  • Exciter
  • -
  • Resonant Filter
  • -
  • Graphic EQ
  • -
  • Envelope Generator
  • - -
- -

Other Plugins Planned

- -
    - -
  • Vocoder
  • - -
- -

Other Tasks

- -
    - -
  • Think up a better name than CMT.
  • - -
- diff --git a/plugins/LadspaEffect/cmt/src/am.cpp b/plugins/LadspaEffect/cmt/src/am.cpp deleted file mode 100644 index 2e07ae5538d..00000000000 --- a/plugins/LadspaEffect/cmt/src/am.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* am.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -#define AM_INPUT1 0 -#define AM_INPUT2 1 -#define AM_OUTPUT 2 - -/** This plugin multiplies two signals together to produce a third. */ -class AmplitudeModulator : public CMT_PluginInstance { -public: - - AmplitudeModulator(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(3) { - } - - friend void runAmplitudeModulator(LADSPA_Handle Instance, - unsigned long SAmplitudeModulatorpleCount); - -}; - -/*****************************************************************************/ - -void -runAmplitudeModulator(LADSPA_Handle Instance, - unsigned long SAmplitudeModulatorpleCount) { - - AmplitudeModulator * poAmplitudeModulator = (AmplitudeModulator *)Instance; - - LADSPA_Data * pfInput1 = poAmplitudeModulator->m_ppfPorts[AM_INPUT1]; - LADSPA_Data * pfInput2 = poAmplitudeModulator->m_ppfPorts[AM_INPUT2]; - LADSPA_Data * pfOutput = poAmplitudeModulator->m_ppfPorts[AM_OUTPUT]; - - for (unsigned long lSAmplitudeModulatorpleIndex = 0; - lSAmplitudeModulatorpleIndex < SAmplitudeModulatorpleCount; - lSAmplitudeModulatorpleIndex++) - *(pfOutput++) = *(pfInput1++) * *(pfInput2++); -} - -/*****************************************************************************/ - -void -initialise_am() { - - CMT_Descriptor * psDescriptor = new CMT_Descriptor - (1070, - "am", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Amplitude Modulator", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runAmplitudeModulator, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input 1"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input 2"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/ambisonic.cpp b/plugins/LadspaEffect/cmt/src/ambisonic.cpp deleted file mode 100644 index 60e42809ca1..00000000000 --- a/plugins/LadspaEffect/cmt/src/ambisonic.cpp +++ /dev/null @@ -1,1135 +0,0 @@ -/* ambisonic.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -/* This module provides simple plugins handling B-Format and - FMH-Format audio. Ambisonics is a mathematical technique designed - to capture the sound field around point. See - http://www.muse.demon.co.uk/3daudio.html. "Ambisonics" is a - registered trademark of Nimbus Communications International - although. An exteremly `vanilla' approach is taken to encoding - distance, using inverse square, but no filtering or delay. */ - -/*****************************************************************************/ - -#include -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -#define ENC_INPUT 0 -#define ENC_IN_X 1 -#define ENC_IN_Y 2 -#define ENC_IN_Z 3 -#define ENC_OUT_W 4 -#define ENC_OUT_X 5 -#define ENC_OUT_Y 6 -#define ENC_OUT_Z 7 - -#define ENC_OUT_R 8 -#define ENC_OUT_S 9 -#define ENC_OUT_T 10 -#define ENC_OUT_U 11 -#define ENC_OUT_V 12 - -/*****************************************************************************/ - -/** This plugin encodes a signal to B-Format depending on where it is - located in a virtual space. */ -class BFormatEncoder : public CMT_PluginInstance { -public: - BFormatEncoder(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(8) { - } - friend void runBFormatEncoder(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/** This plugin encodes a signal to FMH-Format depending on where it - is located in a virtual space. */ -class FMHFormatEncoder : public CMT_PluginInstance { -public: - FMHFormatEncoder(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(13) { - } - friend void runFMHFormatEncoder(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -#define F2B_IN_W 0 -#define F2B_IN_X 1 -#define F2B_IN_Y 2 -#define F2B_IN_Z 3 -#define F2B_IN_R 4 -#define F2B_IN_S 5 -#define F2B_IN_T 6 -#define F2B_IN_U 7 -#define F2B_IN_V 8 -#define F2B_OUT_W 9 -#define F2B_OUT_X 10 -#define F2B_OUT_Y 11 -#define F2B_OUT_Z 12 - -/** This plugin coverts FMH-Format to B-Format. This is a trivial - operation that can also be achieved simply by discarding RSTUV - channels. */ -class FMHToB : public CMT_PluginInstance { -public: - FMHToB(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(13) { - } - friend void runFMHToB(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -#define DECST_IN_W 0 -#define DECST_IN_X 1 -#define DECST_IN_Y 2 -#define DECST_IN_Z 3 -#define DECST_OUT_L 4 -#define DECST_OUT_R 5 - -/** This plugin decodes B-Format to produce a stereo speaker feed. */ -class BFormatToStereo : public CMT_PluginInstance { -public: - BFormatToStereo(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(6) { - } - friend void runBFormatToStereo(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -#define DECQ_IN_W 0 -#define DECQ_IN_X 1 -#define DECQ_IN_Y 2 -#define DECQ_IN_Z 3 -#define DECQ_OUT_FL 4 -#define DECQ_OUT_FR 5 -#define DECQ_OUT_BL 6 -#define DECQ_OUT_BR 7 - -/** This plugin decodes B-Format to produce a quad (square) speaker feed. */ -class BFormatToQuad : public CMT_PluginInstance { -public: - BFormatToQuad(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(8) { - } - friend void runBFormatToQuad(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -#define DECC_IN_W 0 -#define DECC_IN_X 1 -#define DECC_IN_Y 2 -#define DECC_IN_Z 3 -#define DECC_OUT_BFL 4 -#define DECC_OUT_BFR 5 -#define DECC_OUT_BBL 6 -#define DECC_OUT_BBR 7 -#define DECC_OUT_TFL 8 -#define DECC_OUT_TFR 9 -#define DECC_OUT_TBL 10 -#define DECC_OUT_TBR 11 - -/** This plugin decodes B-Format to produce a speaker feed for eight - speakers arranged at the corners of a cube. */ -class BFormatToCube : public CMT_PluginInstance { -public: - BFormatToCube(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(12) { - } - friend void runBFormatToCube(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -#define DECO_IN_W 0 -#define DECO_IN_X 1 -#define DECO_IN_Y 2 -#define DECO_IN_Z 3 -#define DECO_IN_R 4 -#define DECO_IN_S 5 -#define DECO_IN_T 6 -#define DECO_IN_U 7 -#define DECO_IN_V 8 -#define DECO_OUT_FFL 9 -#define DECO_OUT_FFR 10 -#define DECO_OUT_FRR 11 -#define DECO_OUT_BRR 12 -#define DECO_OUT_BBR 13 -#define DECO_OUT_BBL 14 -#define DECO_OUT_BLL 15 -#define DECO_OUT_FLL 16 - -/** This plugin decodes FMH-Format to produce a speaker feed for eight - speakers arranged at the corners of an octagon. */ -class FMHFormatToOct : public CMT_PluginInstance { -public: - FMHFormatToOct(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(17) { - } - friend void runFMHFormatToOct(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -#define BFROT_ANGLE 0 -#define BFROT_IN_W 1 -#define BFROT_IN_X 2 -#define BFROT_IN_Y 3 -#define BFROT_IN_Z 4 -#define BFROT_OUT_W 5 -#define BFROT_OUT_X 6 -#define BFROT_OUT_Y 7 -#define BFROT_OUT_Z 8 - -/** This plugin rotates an B-Format soundfield around the Z-axis. */ -class BFormatRotation : public CMT_PluginInstance { -public: - BFormatRotation(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(9) { - } - friend void runBFormatRotation(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -#define FMHROT_ANGLE 0 - -#define FMHROT_IN_W 1 -#define FMHROT_IN_X 2 -#define FMHROT_IN_Y 3 -#define FMHROT_IN_Z 4 -#define FMHROT_IN_R 5 -#define FMHROT_IN_S 6 -#define FMHROT_IN_T 7 -#define FMHROT_IN_U 8 -#define FMHROT_IN_V 9 - -#define FMHROT_OUT_W 10 -#define FMHROT_OUT_X 11 -#define FMHROT_OUT_Y 12 -#define FMHROT_OUT_Z 13 -#define FMHROT_OUT_R 14 -#define FMHROT_OUT_S 15 -#define FMHROT_OUT_T 16 -#define FMHROT_OUT_U 17 -#define FMHROT_OUT_V 18 - -/** This plugin rotates an FMH-Format soundfield around the Z-axis. */ -class FMHFormatRotation : public CMT_PluginInstance { -public: - FMHFormatRotation(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(19) { - } - friend void runFMHFormatRotation(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -void -runBFormatEncoder(LADSPA_Handle Instance, - unsigned long SampleCount) { - - BFormatEncoder * poProcessor = (BFormatEncoder *)Instance; - - LADSPA_Data * pfInput = poProcessor->m_ppfPorts[ENC_INPUT]; - LADSPA_Data * pfOutW = poProcessor->m_ppfPorts[ENC_OUT_W]; - LADSPA_Data * pfOutX = poProcessor->m_ppfPorts[ENC_OUT_X]; - LADSPA_Data * pfOutY = poProcessor->m_ppfPorts[ENC_OUT_Y]; - LADSPA_Data * pfOutZ = poProcessor->m_ppfPorts[ENC_OUT_Z]; - - LADSPA_Data fX = *(poProcessor->m_ppfPorts[ENC_IN_X]); - LADSPA_Data fY = *(poProcessor->m_ppfPorts[ENC_IN_Y]); - LADSPA_Data fZ = *(poProcessor->m_ppfPorts[ENC_IN_Z]); - LADSPA_Data fDistanceSquared = fX * fX + fY * fY + fZ * fZ; - const LADSPA_Data fWScalar = 0.707107; - LADSPA_Data fXScalar, fYScalar, fZScalar; - if (fDistanceSquared > 1e-10) { - LADSPA_Data fOneOverDistanceSquared = 1 / fDistanceSquared; - fXScalar = fX * fOneOverDistanceSquared; - fYScalar = fY * fOneOverDistanceSquared; - fZScalar = fZ * fOneOverDistanceSquared; - } - else { - /* Avoid division by zero issues. */ - fXScalar = fYScalar = fZScalar = 0; - } - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fInput = *(pfInput++); - *(pfOutW++) = fWScalar * fInput; - *(pfOutX++) = fXScalar * fInput; - *(pfOutY++) = fYScalar * fInput; - *(pfOutZ++) = fZScalar * fInput; - } -} - -/*****************************************************************************/ - -void -runFMHFormatEncoder(LADSPA_Handle Instance, - unsigned long SampleCount) { - - FMHFormatEncoder * poProcessor = (FMHFormatEncoder *)Instance; - - LADSPA_Data * pfInput = poProcessor->m_ppfPorts[ENC_INPUT]; - LADSPA_Data * pfOutW = poProcessor->m_ppfPorts[ENC_OUT_W]; - LADSPA_Data * pfOutX = poProcessor->m_ppfPorts[ENC_OUT_X]; - LADSPA_Data * pfOutY = poProcessor->m_ppfPorts[ENC_OUT_Y]; - LADSPA_Data * pfOutZ = poProcessor->m_ppfPorts[ENC_OUT_Z]; - LADSPA_Data * pfOutR = poProcessor->m_ppfPorts[ENC_OUT_R]; - LADSPA_Data * pfOutS = poProcessor->m_ppfPorts[ENC_OUT_S]; - LADSPA_Data * pfOutT = poProcessor->m_ppfPorts[ENC_OUT_T]; - LADSPA_Data * pfOutU = poProcessor->m_ppfPorts[ENC_OUT_U]; - LADSPA_Data * pfOutV = poProcessor->m_ppfPorts[ENC_OUT_V]; - - LADSPA_Data fX = *(poProcessor->m_ppfPorts[ENC_IN_X]); - LADSPA_Data fY = *(poProcessor->m_ppfPorts[ENC_IN_Y]); - LADSPA_Data fZ = *(poProcessor->m_ppfPorts[ENC_IN_Z]); - LADSPA_Data fDistanceSquared = fX * fX + fY * fY + fZ * fZ; - const LADSPA_Data fWScalar = 0.707107; - LADSPA_Data fXScalar, fYScalar, fZScalar; - LADSPA_Data fRScalar, fSScalar, fTScalar; - LADSPA_Data fUScalar, fVScalar; - if (fDistanceSquared > 1e-10) { - LADSPA_Data fOneOverDistanceSquared - = 1 / fDistanceSquared; - LADSPA_Data fOneOverDistanceCubed - = LADSPA_Data(pow(fDistanceSquared, -1.5)); - fXScalar = fX * fOneOverDistanceSquared; - fYScalar = fY * fOneOverDistanceSquared; - fZScalar = fZ * fOneOverDistanceSquared; - fRScalar = ((fZ * fZ) * fOneOverDistanceSquared - 0.5) - * sqrt(fOneOverDistanceSquared); - fSScalar = 2 * (fZ * fX) * fOneOverDistanceCubed; - fTScalar = 2 * (fY * fX) * fOneOverDistanceCubed; - fUScalar = (fX * fX - fY * fY) * fOneOverDistanceCubed; - fVScalar = 2 * (fX * fY) * fOneOverDistanceCubed; - } - else { - /* Avoid division by zero issues. */ - fXScalar = fYScalar = fZScalar - = fRScalar = fSScalar = fTScalar - = fUScalar = fVScalar = 0; - } - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fInput = *(pfInput++); - *(pfOutW++) = fWScalar * fInput; - *(pfOutX++) = fXScalar * fInput; - *(pfOutY++) = fYScalar * fInput; - *(pfOutZ++) = fZScalar * fInput; - *(pfOutR++) = fRScalar * fInput; - *(pfOutS++) = fSScalar * fInput; - *(pfOutT++) = fTScalar * fInput; - *(pfOutU++) = fUScalar * fInput; - *(pfOutV++) = fVScalar * fInput; - } -} - -/*****************************************************************************/ - -void -runFMHToB(LADSPA_Handle Instance, - unsigned long SampleCount) { - - FMHToB * poProcessor = (FMHToB *)Instance; - - LADSPA_Data * pfInW = poProcessor->m_ppfPorts[F2B_IN_W]; - LADSPA_Data * pfInX = poProcessor->m_ppfPorts[F2B_IN_X]; - LADSPA_Data * pfInY = poProcessor->m_ppfPorts[F2B_IN_Y]; - LADSPA_Data * pfInZ = poProcessor->m_ppfPorts[F2B_IN_Z]; - LADSPA_Data * pfOutW = poProcessor->m_ppfPorts[F2B_OUT_W]; - LADSPA_Data * pfOutX = poProcessor->m_ppfPorts[F2B_OUT_X]; - LADSPA_Data * pfOutY = poProcessor->m_ppfPorts[F2B_OUT_Y]; - LADSPA_Data * pfOutZ = poProcessor->m_ppfPorts[F2B_OUT_Z]; - - int iSize = sizeof(LADSPA_Data) * SampleCount; - memcpy(pfOutW, pfInW, iSize); - memcpy(pfOutX, pfInX, iSize); - memcpy(pfOutY, pfInY, iSize); - memcpy(pfOutZ, pfInZ, iSize); -} - -/*****************************************************************************/ - -void -runBFormatToStereo(LADSPA_Handle Instance, - unsigned long SampleCount) { - - BFormatToStereo * poProcessor = (BFormatToStereo *)Instance; - - LADSPA_Data * pfInW = poProcessor->m_ppfPorts[DECST_IN_W]; - LADSPA_Data * pfInY = poProcessor->m_ppfPorts[DECST_IN_Y]; - - LADSPA_Data * pfOutL = poProcessor->m_ppfPorts[DECST_OUT_L]; - LADSPA_Data * pfOutR = poProcessor->m_ppfPorts[DECST_OUT_R]; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fA = 0.707107 * *(pfInW++); - LADSPA_Data fB = 0.5 * *(pfInY++); - *(pfOutL++) = fA + fB; - *(pfOutR++) = fA - fB; - } - -} - -/*****************************************************************************/ - -void -runBFormatToQuad(LADSPA_Handle Instance, - unsigned long SampleCount) { - - BFormatToQuad * poProcessor = (BFormatToQuad *)Instance; - - LADSPA_Data * pfInW = poProcessor->m_ppfPorts[DECQ_IN_W]; - LADSPA_Data * pfInX = poProcessor->m_ppfPorts[DECQ_IN_X]; - LADSPA_Data * pfInY = poProcessor->m_ppfPorts[DECQ_IN_Y]; - - LADSPA_Data * pfOutFL = poProcessor->m_ppfPorts[DECQ_OUT_FL]; - LADSPA_Data * pfOutFR = poProcessor->m_ppfPorts[DECQ_OUT_FR]; - LADSPA_Data * pfOutBL = poProcessor->m_ppfPorts[DECQ_OUT_BL]; - LADSPA_Data * pfOutBR = poProcessor->m_ppfPorts[DECQ_OUT_BR]; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fW = 0.353553 * *(pfInW++); - LADSPA_Data fX = 0.243361 * *(pfInX++); - LADSPA_Data fY = 0.243361 * *(pfInY++); - LADSPA_Data fV = 0.096383 * *(pfInY++); - *(pfOutFL++) = fW + fX + fY + fV; - *(pfOutFR++) = fW + fX - fY - fV; - *(pfOutBL++) = fW - fX + fY + fV; - *(pfOutBR++) = fW - fX - fY - fV; - } - -} - -/*****************************************************************************/ - -void -runBFormatToCube(LADSPA_Handle Instance, - unsigned long SampleCount) { - - BFormatToCube * poProcessor = (BFormatToCube *)Instance; - - LADSPA_Data * pfInW = poProcessor->m_ppfPorts[DECC_IN_W]; - LADSPA_Data * pfInX = poProcessor->m_ppfPorts[DECC_IN_X]; - LADSPA_Data * pfInY = poProcessor->m_ppfPorts[DECC_IN_Y]; - LADSPA_Data * pfInZ = poProcessor->m_ppfPorts[DECC_IN_Z]; - - LADSPA_Data * pfOutBFL = poProcessor->m_ppfPorts[DECC_OUT_BFL]; - LADSPA_Data * pfOutBFR = poProcessor->m_ppfPorts[DECC_OUT_BFR]; - LADSPA_Data * pfOutBBL = poProcessor->m_ppfPorts[DECC_OUT_BBL]; - LADSPA_Data * pfOutBBR = poProcessor->m_ppfPorts[DECC_OUT_BBR]; - LADSPA_Data * pfOutTFL = poProcessor->m_ppfPorts[DECC_OUT_BFL]; - LADSPA_Data * pfOutTFR = poProcessor->m_ppfPorts[DECC_OUT_BFR]; - LADSPA_Data * pfOutTBL = poProcessor->m_ppfPorts[DECC_OUT_BBL]; - LADSPA_Data * pfOutTBR = poProcessor->m_ppfPorts[DECC_OUT_BBR]; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fW = 0.176777 * *(pfInW++); - LADSPA_Data fX = 0.113996 * *(pfInX++); - LADSPA_Data fY = 0.113996 * *(pfInY++); - LADSPA_Data fZ = 0.113996 * *(pfInZ++); - LADSPA_Data fS = 0.036859 * *(pfInX++); - LADSPA_Data fT = 0.036859 * *(pfInY++); - LADSPA_Data fV = 0.036859 * *(pfInZ++); - *(pfOutBFL++) = fW + fX + fY - fZ + fV - fT - fS; - *(pfOutBFR++) = fW + fX - fY - fZ - fV + fT - fS; - *(pfOutBBL++) = fW - fX + fY - fZ + fV + fT + fS; - *(pfOutBBR++) = fW - fX - fY - fZ - fV - fT + fS; - *(pfOutTFL++) = fW + fX + fY + fZ + fV + fT + fS; - *(pfOutTFR++) = fW + fX - fY + fZ - fV - fT + fS; - *(pfOutTBL++) = fW - fX + fY + fZ + fV - fT - fS; - *(pfOutTBR++) = fW - fX - fY + fZ - fV + fT - fS; - } - -} - -/*****************************************************************************/ - -void -runFMHFormatToOct(LADSPA_Handle Instance, - unsigned long SampleCount) { - - FMHFormatToOct * poProcessor = (FMHFormatToOct *)Instance; - - LADSPA_Data * pfInW = poProcessor->m_ppfPorts[DECO_IN_W]; - LADSPA_Data * pfInX = poProcessor->m_ppfPorts[DECO_IN_X]; - LADSPA_Data * pfInY = poProcessor->m_ppfPorts[DECO_IN_Y]; - LADSPA_Data * pfInU = poProcessor->m_ppfPorts[DECO_IN_U]; - LADSPA_Data * pfInV = poProcessor->m_ppfPorts[DECO_IN_V]; - - LADSPA_Data * pfOutFFL = poProcessor->m_ppfPorts[DECO_OUT_FFL]; - LADSPA_Data * pfOutFFR = poProcessor->m_ppfPorts[DECO_OUT_FFR]; - LADSPA_Data * pfOutFRR = poProcessor->m_ppfPorts[DECO_OUT_FRR]; - LADSPA_Data * pfOutBRR = poProcessor->m_ppfPorts[DECO_OUT_BRR]; - LADSPA_Data * pfOutBBR = poProcessor->m_ppfPorts[DECO_OUT_BBR]; - LADSPA_Data * pfOutBBL = poProcessor->m_ppfPorts[DECO_OUT_BBL]; - LADSPA_Data * pfOutBLL = poProcessor->m_ppfPorts[DECO_OUT_BLL]; - LADSPA_Data * pfOutFLL = poProcessor->m_ppfPorts[DECO_OUT_FLL]; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fW = 0.176777 * *(pfInW++); - LADSPA_Data fX1 = 0.065888 * *pfInX; - LADSPA_Data fX2 = 0.159068 * *(pfInX++); - LADSPA_Data fY1 = 0.065888 * *pfInY; - LADSPA_Data fY2 = 0.159068 * *(pfInY++); - LADSPA_Data fU = 0.034175 * *(pfInU++); - LADSPA_Data fV = 0.034175 * *(pfInV++); - *(pfOutFFL++) = fW + fX2 + fY1 + fU + fV; - *(pfOutFFR++) = fW + fX2 - fY1 + fU - fV; - *(pfOutFRR++) = fW + fX1 - fY2 - fU - fV; - *(pfOutBRR++) = fW - fX1 + fY2 - fU + fV; - *(pfOutBBR++) = fW - fX2 + fY1 + fU + fV; - *(pfOutBBL++) = fW - fX2 - fY1 + fU - fV; - *(pfOutBLL++) = fW - fX1 - fY2 - fU - fV; - *(pfOutFLL++) = fW + fX1 + fY2 - fU + fV; - } - -} - -/*****************************************************************************/ - -void -runBFormatRotation(LADSPA_Handle Instance, - unsigned long SampleCount) { - - BFormatRotation * poProcessor = (BFormatRotation *)Instance; - - /* Work in radians. */ - LADSPA_Data fAngle - = LADSPA_Data(M_PI / 180.0) * *(poProcessor->m_ppfPorts[FMHROT_ANGLE]); - LADSPA_Data fSin = sin(fAngle); - LADSPA_Data fCos = cos(fAngle); - - LADSPA_Data * pfInW = poProcessor->m_ppfPorts[BFROT_IN_W]; - LADSPA_Data * pfInX = poProcessor->m_ppfPorts[BFROT_IN_X]; - LADSPA_Data * pfInY = poProcessor->m_ppfPorts[BFROT_IN_Y]; - LADSPA_Data * pfInZ = poProcessor->m_ppfPorts[BFROT_IN_Z]; - - LADSPA_Data * pfOutW = poProcessor->m_ppfPorts[BFROT_OUT_W]; - LADSPA_Data * pfOutX = poProcessor->m_ppfPorts[BFROT_OUT_X]; - LADSPA_Data * pfOutY = poProcessor->m_ppfPorts[BFROT_OUT_Y]; - LADSPA_Data * pfOutZ = poProcessor->m_ppfPorts[BFROT_OUT_Z]; - - int iSize = sizeof(LADSPA_Data) * SampleCount; - memcpy(pfOutW, pfInW, iSize); - memcpy(pfOutZ, pfInZ, iSize); - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - float fInX = *(pfInX++); - float fInY = *(pfInY++); - *(pfOutX++) = fCos * fInX - fSin * fInY; - *(pfOutY++) = fSin * fInX + fCos * fInY; - } -} - -/*****************************************************************************/ - -void -runFMHFormatRotation(LADSPA_Handle Instance, - unsigned long SampleCount) { - - FMHFormatRotation * poProcessor = (FMHFormatRotation *)Instance; - - /* Work in radians. */ - LADSPA_Data fAngle - = LADSPA_Data(M_PI / 180.0) * *(poProcessor->m_ppfPorts[FMHROT_ANGLE]); - LADSPA_Data fSin = sin(fAngle); - LADSPA_Data fCos = cos(fAngle); - LADSPA_Data fSin2 = sin(fAngle * 2); - LADSPA_Data fCos2 = cos(fAngle * 2); - - LADSPA_Data * pfInW = poProcessor->m_ppfPorts[FMHROT_IN_W]; - LADSPA_Data * pfInX = poProcessor->m_ppfPorts[FMHROT_IN_X]; - LADSPA_Data * pfInY = poProcessor->m_ppfPorts[FMHROT_IN_Y]; - LADSPA_Data * pfInZ = poProcessor->m_ppfPorts[FMHROT_IN_Z]; - LADSPA_Data * pfInR = poProcessor->m_ppfPorts[FMHROT_IN_R]; - LADSPA_Data * pfInS = poProcessor->m_ppfPorts[FMHROT_IN_S]; - LADSPA_Data * pfInT = poProcessor->m_ppfPorts[FMHROT_IN_T]; - LADSPA_Data * pfInU = poProcessor->m_ppfPorts[FMHROT_IN_U]; - LADSPA_Data * pfInV = poProcessor->m_ppfPorts[FMHROT_IN_V]; - - LADSPA_Data * pfOutW = poProcessor->m_ppfPorts[FMHROT_OUT_W]; - LADSPA_Data * pfOutX = poProcessor->m_ppfPorts[FMHROT_OUT_X]; - LADSPA_Data * pfOutY = poProcessor->m_ppfPorts[FMHROT_OUT_Y]; - LADSPA_Data * pfOutZ = poProcessor->m_ppfPorts[FMHROT_OUT_Z]; - LADSPA_Data * pfOutR = poProcessor->m_ppfPorts[FMHROT_OUT_R]; - LADSPA_Data * pfOutS = poProcessor->m_ppfPorts[FMHROT_OUT_S]; - LADSPA_Data * pfOutT = poProcessor->m_ppfPorts[FMHROT_OUT_T]; - LADSPA_Data * pfOutU = poProcessor->m_ppfPorts[FMHROT_OUT_U]; - LADSPA_Data * pfOutV = poProcessor->m_ppfPorts[FMHROT_OUT_V]; - - int iSize = sizeof(LADSPA_Data) * SampleCount; - memcpy(pfOutW, pfInW, iSize); - memcpy(pfOutZ, pfInZ, iSize); - memcpy(pfOutR, pfInR, iSize); - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - - float fInX = *(pfInX++); - float fInY = *(pfInY++); - float fInS = *(pfInS++); - float fInT = *(pfInT++); - float fInU = *(pfInU++); - float fInV = *(pfInV++); - - *(pfOutX++) = fCos * fInX - fSin * fInY; - *(pfOutY++) = fSin * fInX + fCos * fInY; - *(pfOutS++) = fCos * fInS - fSin * fInT; - *(pfOutT++) = fSin * fInS + fCos * fInT; - *(pfOutU++) = fCos2 * fInU - fSin2 * fInV; - *(pfOutV++) = fSin2 * fInU + fCos2 * fInV; - } -} - -/*****************************************************************************/ - -void -initialise_ambisonic() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1087, - "encode_bformat", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Ambisonic Encoder (B-Format)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runBFormatEncoder, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Sound Source X Coordinate", - LADSPA_HINT_DEFAULT_1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Sound Source Y Coordinate", - LADSPA_HINT_DEFAULT_0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Sound Source Z Coordinate", - LADSPA_HINT_DEFAULT_0); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (W)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (X)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Y)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Z)"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1088, - "encode_fmh", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Ambisonic Encoder (FMH-Format)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runFMHFormatEncoder, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Sound Source X Coordinate", - LADSPA_HINT_DEFAULT_1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Sound Source Y Coordinate", - LADSPA_HINT_DEFAULT_0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Sound Source Z Coordinate", - LADSPA_HINT_DEFAULT_0); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (W)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (X)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Y)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Z)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (R)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (S)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (T)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (U)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (V)"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1089, - "fmh2bf", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "FMH-Format to B-Format (Discards RSTUV Channels)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runFMHToB, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (W)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (X)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Y)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Z)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (R)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (S)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (T)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (U)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (V)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (W)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (X)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Y)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Z)"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1090, - "bf2stereo", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Ambisonic Decoder (B-Format to Stereo)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runBFormatToStereo, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (W)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (X)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Y)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Z)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Right)"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1091, - "bf2quad", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Ambisonic Decoder (B-Format to Quad)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runBFormatToQuad, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (W)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (X)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Y)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Z)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Front Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Front Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Back Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Back Right)"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1092, - "bf2cube", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Ambisonic Decoder (B-Format to Cube)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runBFormatToCube, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (W)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (X)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Y)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Z)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Base Front Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Base Front Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Base Back Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Base Back Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Top Front Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Top Front Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Top Back Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Top Back Right)"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1093, - "fmh2oct", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Ambisonic Decoder (FMH-Format to Octagon)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runFMHFormatToOct, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (W)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (X)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Y)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Z)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (R)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (S)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (T)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (U)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (V)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Front Front Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Front Front Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Front Right Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Back Right Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Back Back Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Back Back Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Back Left Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Front Left Left)"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1094, - "bf_rotate_z", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Ambisonic Rotation (B-Format, Horizontal)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runBFormatRotation, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Angle of Rotation (Degrees Anticlockwise)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_HIGH), - -180, - 180); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (W)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (X)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Y)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Z)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (W)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (X)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Y)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Z)"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1095, - "fmh_rotate_z", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Ambisonic Rotation (FMH-Format, Horizontal)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runFMHFormatRotation, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Angle of Rotation (Degrees Anticlockwise)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_HIGH), - -180, - 180); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (W)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (X)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Y)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Z)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (R)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (S)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (T)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (U)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (V)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (W)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (X)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Y)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Z)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (R)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (S)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (T)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (U)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (V)"); - registerNewPluginDescriptor(psDescriptor); - -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/amp.cpp b/plugins/LadspaEffect/cmt/src/amp.cpp deleted file mode 100644 index 1d806f1b891..00000000000 --- a/plugins/LadspaEffect/cmt/src/amp.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* amp.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -#define AMP_CONTROL 0 -#define AMP_INPUT1 1 -#define AMP_OUTPUT1 2 - -/** This plugin applies a gain to a mono signal. */ -class MonoAmplifier : public CMT_PluginInstance { -public: - - MonoAmplifier(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(3) { - } - - friend void runMonoAmplifier(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -/* Ports as above, plus... */ -#define AMP_INPUT2 3 -#define AMP_OUTPUT2 4 - -/** This plugin applies a gain to a stereo signal. */ -class StereoAmplifier : public CMT_PluginInstance { -public: - - StereoAmplifier(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(5) { - } - - friend void runStereoAmplifier(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -void -runMonoAmplifier(LADSPA_Handle Instance, - unsigned long SampleCount) { - - MonoAmplifier * poAmplifier = (MonoAmplifier *)Instance; - - LADSPA_Data * pfInput = poAmplifier->m_ppfPorts[AMP_INPUT1]; - LADSPA_Data * pfOutput = poAmplifier->m_ppfPorts[AMP_OUTPUT1]; - LADSPA_Data fGain = *(poAmplifier->m_ppfPorts[AMP_CONTROL]); - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) - *(pfOutput++) = *(pfInput++) * fGain; -} - -/*****************************************************************************/ - -void -runStereoAmplifier(LADSPA_Handle Instance, - unsigned long SampleCount) { - - unsigned long lSampleIndex; - - StereoAmplifier * poAmplifier = (StereoAmplifier *)Instance; - - LADSPA_Data fGain = *(poAmplifier->m_ppfPorts[AMP_CONTROL]); - - LADSPA_Data * pfInput = poAmplifier->m_ppfPorts[AMP_INPUT1]; - LADSPA_Data * pfOutput = poAmplifier->m_ppfPorts[AMP_OUTPUT1]; - for (lSampleIndex = 0; lSampleIndex < SampleCount; lSampleIndex++) - *(pfOutput++) = *(pfInput++) * fGain; - - pfInput = poAmplifier->m_ppfPorts[AMP_INPUT2]; - pfOutput = poAmplifier->m_ppfPorts[AMP_OUTPUT2]; - for (lSampleIndex = 0; lSampleIndex < SampleCount; lSampleIndex++) - *(pfOutput++) = *(pfInput++) * fGain; -} - -/*****************************************************************************/ - -void -initialise_amp() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1067, - "amp_mono", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Amplifier (Mono)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runMonoAmplifier, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Gain", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1068, - "amp_stereo", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Amplifier (Stereo)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runStereoAmplifier, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Gain", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Left)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Right)"); - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/analogue.cpp b/plugins/LadspaEffect/cmt/src/analogue.cpp deleted file mode 100644 index 5a8dc265cdb..00000000000 --- a/plugins/LadspaEffect/cmt/src/analogue.cpp +++ /dev/null @@ -1,504 +0,0 @@ -/* analogue.cpp - - Analogue Voice - Analog synthesizer voice - Copyright (c) 2000 David A. Bartold - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include -#include "cmt.h" - -#define PORT_OUT 0 -#define PORT_GATE 1 -#define PORT_VELOCITY 2 -#define PORT_FREQ 3 -#define PORT_DCO1_OCTAVE 4 -#define PORT_DCO1_WAVEFORM 5 -#define PORT_DCO1_FM 6 -#define PORT_DCO1_PWM 7 -#define PORT_DCO1_ATTACK 8 -#define PORT_DCO1_DECAY 9 -#define PORT_DCO1_SUSTAIN 10 -#define PORT_DCO1_RELEASE 11 -#define PORT_DCO2_OCTAVE 12 -#define PORT_DCO2_WAVEFORM 13 -#define PORT_DCO2_FM 14 -#define PORT_DCO2_PWM 15 -#define PORT_DCO2_ATTACK 16 -#define PORT_DCO2_DECAY 17 -#define PORT_DCO2_SUSTAIN 18 -#define PORT_DCO2_RELEASE 19 -#define PORT_LFO_FREQ 20 -#define PORT_LFO_FADEIN 21 -#define PORT_FILT_ENV_MOD 22 -#define PORT_FILT_LFO_MOD 23 -#define PORT_FILT_RES 24 -#define PORT_FILT_ATTACK 25 -#define PORT_FILT_DECAY 26 -#define PORT_FILT_SUSTAIN 27 -#define PORT_FILT_RELEASE 28 - -#define NUM_PORTS 29 - -#ifndef PI -#define PI 3.14159265358979F -#endif - -typedef struct Envelope -{ - int envelope_decay; - LADSPA_Data envelope; - - Envelope () : envelope_decay (0), envelope (0.0) {} -} Envelope; - -class Analogue : public CMT_PluginInstance -{ - LADSPA_Data sample_rate; - - int trigger; - Envelope dco1_env; - Envelope dco2_env; - Envelope filt_env; - LADSPA_Data d1; - LADSPA_Data d2; - - LADSPA_Data dco1_accum; - LADSPA_Data dco2_accum; - LADSPA_Data lfo_accum; - - LADSPA_Data lfo_vol; - -public: - Analogue(const LADSPA_Descriptor * Descriptor, - unsigned long SampleRate) - : CMT_PluginInstance(NUM_PORTS), - sample_rate (SampleRate), - trigger (0), - d1 (0.0), d2 (0.0), - dco1_accum (0.0), dco2_accum (0.0), lfo_accum (0.0) { - } - - ~Analogue () { - } - - /* Third-order approximation of a sine wave. */ - static inline LADSPA_Data - fast_sin(LADSPA_Data x) { - if (x > PI) - x = (x < PI * 1.5F) ? (PI - x) : (x - 2.0F * PI); - else if (x > PI * 0.5F) - x = PI - x; - - return x * (1.05F - x * x * 0.175F); - } - - static inline LADSPA_Data - tri(LADSPA_Data x) { - if (x > 0.75F) - x = x - 1.0F; - else if (x > 0.25F) - x = 0.5F - x; - - return x * 4.0F; - } - - static inline LADSPA_Data - envelope(Envelope *env, - int gate, - LADSPA_Data attack, - LADSPA_Data decay, - LADSPA_Data sustain, - LADSPA_Data release) - { - if (gate) - if (env->envelope_decay == 0) - { - env->envelope += (1.0F - env->envelope) * attack; - if (env->envelope >= 0.95F) - env->envelope_decay = 1; - } - else - env->envelope += (sustain - env->envelope) * decay; - else - env->envelope += -env->envelope * release; - - return env->envelope; - } - - static void - activate(LADSPA_Handle Instance) { - Analogue *analogue = (Analogue*) Instance; - - analogue->trigger = 0; - analogue->dco1_env.envelope_decay = 0; - analogue->dco1_env.envelope = 0.0; - analogue->dco2_env.envelope_decay = 0; - analogue->dco2_env.envelope = 0.0; - analogue->filt_env.envelope_decay = 0; - analogue->filt_env.envelope = 0.0; - analogue->d1 = 0.0F; - analogue->d2 = 0.0F; - - analogue->dco1_accum = 0.0F; - analogue->dco2_accum = 0.0F; - analogue->lfo_accum = 0.0F; - analogue->lfo_vol = 0.0F; - } - - static inline LADSPA_Data - osc(int waveform, - LADSPA_Data inc, - LADSPA_Data width, - LADSPA_Data *accum) { - *accum += inc; - while (*accum >= 1.0F) - *accum -= 1.0F; - - /* 0 = Sine wave */ - if (waveform == 0) - if (*accum < width) - return fast_sin (*accum / width * PI); - else - return fast_sin (PI + (*accum - width) / (1.0F - width) * PI); - - /* 1 = Triangle wave */ - else if (waveform == 1) - if (*accum < width) - return tri (*accum / width * 0.5); - else - return tri (0.5 + (*accum - width) * 0.5 / (1.0F - width)); - - /* 2 = Square wave */ - else if (waveform == 2) - return (*accum > width) ? 1.0F : -1.0F; - - /* 3 = Sawtooth wave */ - else if (waveform == 3) - if (*accum < width) - return *accum / width * 2.0F - 1.0F; - else - return (*accum - width) / (1.0F - width) * 2.0F - 1.0F; - - /* 4 = Fullwave Rectified Sine wave */ - else if (waveform == 4) - if (*accum < width) - return fast_sin (*accum / width * PI); - else - return fast_sin ((*accum - width) / (1.0F - width) * PI); - - /* 5 = Static */ - else - return (rand () & 1) ? -1.0F : 1.0F; - } - - static LADSPA_Data - inc(LADSPA_Data oct, - LADSPA_Data freq, - LADSPA_Data sample_rate) { - return pow (2.0, oct) * freq / sample_rate; - } - - static void - calc_a_b_c(Analogue *analogue, - LADSPA_Data freq, - LADSPA_Data *a, - LADSPA_Data *b, - LADSPA_Data *c) { - LADSPA_Data top_freq, k, res; - - top_freq = freq; - top_freq *= PI / analogue->sample_rate; - res = exp (-1.20 + 3.455 * *analogue->m_ppfPorts[PORT_FILT_RES]); - - k = exp (-top_freq / res); - - *a = 2.0 * cos (2.0 * top_freq) * k; - *b = -k * k; - *c = (1.0 - *a - *b) * 0.2; - } - - static inline LADSPA_Data - multiplier(Analogue *analogue, - LADSPA_Data value) { - return 1.0 - pow (0.05, 1.0 / (analogue->sample_rate * value)); - } - - static void - run(LADSPA_Handle Instance, - unsigned long SampleCount) { - Analogue *analogue = (Analogue*) Instance; - unsigned long i; - int waveform1, waveform2; - int gate; - LADSPA_Data lfo_inc, inc1, inc2; - LADSPA_Data attack1, decay1, release1; - LADSPA_Data attack2, decay2, release2; - LADSPA_Data filt_attack, filt_decay, filt_release; - LADSPA_Data lfo_fadein, a = 0, b = 0, c = 0; - LADSPA_Data dco1_pwm, dco2_pwm; - LADSPA_Data dco1_fm, dco2_fm; - LADSPA_Data filt_lfo_mod; - LADSPA_Data **ports; - - ports = analogue->m_ppfPorts; - gate = (*ports[PORT_GATE] > 0.0); - if (gate == 1 && analogue->trigger == 0) - { - analogue->lfo_vol = 0.0F; - analogue->dco1_env.envelope_decay = 0; - analogue->dco1_env.envelope = 0.0; - analogue->dco2_env.envelope_decay = 0; - analogue->dco2_env.envelope = 0.0; - analogue->filt_env.envelope_decay = 0; - analogue->filt_env.envelope = 0.0; - } - - analogue->trigger = gate; - - waveform1 = (int) *ports[PORT_DCO1_WAVEFORM]; - waveform2 = (int) *ports[PORT_DCO2_WAVEFORM]; - - inc1 = inc (*ports[PORT_DCO1_OCTAVE], - *ports[PORT_FREQ], - analogue->sample_rate); - inc2 = inc (*ports[PORT_DCO2_OCTAVE], - *ports[PORT_FREQ], - analogue->sample_rate); - lfo_inc = 2.0F * PI * *ports[PORT_LFO_FREQ] / analogue->sample_rate; - - attack1 = multiplier (analogue, *ports[PORT_DCO1_ATTACK]); - decay1 = multiplier (analogue, *ports[PORT_DCO1_DECAY]); - release1 = multiplier (analogue, *ports[PORT_DCO1_RELEASE]); - - attack2 = multiplier (analogue, *ports[PORT_DCO2_ATTACK]); - decay2 = multiplier (analogue, *ports[PORT_DCO2_DECAY]); - release2 = multiplier (analogue, *ports[PORT_DCO2_RELEASE]); - - filt_attack = multiplier (analogue, *ports[PORT_FILT_ATTACK]); - filt_decay = multiplier (analogue, *ports[PORT_FILT_DECAY]); - filt_release = multiplier (analogue, *ports[PORT_FILT_RELEASE]); - - lfo_fadein = 1.0 / (*ports[PORT_LFO_FADEIN] * analogue->sample_rate); - - dco1_pwm = *analogue->m_ppfPorts[PORT_DCO1_PWM] * 0.225F; - dco2_pwm = *analogue->m_ppfPorts[PORT_DCO2_PWM] * 0.225F; - dco1_fm = *analogue->m_ppfPorts[PORT_DCO1_FM] * inc1 * 0.45F; - dco2_fm = *analogue->m_ppfPorts[PORT_DCO2_FM] * inc2 * 0.45F; - filt_lfo_mod = *analogue->m_ppfPorts[PORT_FILT_LFO_MOD] * 0.45F; - - for (i = 0; i < SampleCount; i++) - { - LADSPA_Data lfo, sample; - - analogue->lfo_accum += lfo_inc; - while (analogue->lfo_accum >= 2.0F * PI) - analogue->lfo_accum -= 2.0F * PI; - - lfo = fast_sin (analogue->lfo_accum) * analogue->lfo_vol; - - analogue->lfo_vol += lfo_fadein; - if (analogue->lfo_vol >= 1.0F) - analogue->lfo_vol = 1.0F; - - envelope (&analogue->filt_env, - gate, filt_attack, filt_decay, - *ports[PORT_FILT_SUSTAIN], filt_release); - - if ((i & 0x000f) == 0) - calc_a_b_c (analogue, - *ports[PORT_FREQ] * 0.25F + (analogue->filt_env.envelope * - *ports[PORT_FILT_ENV_MOD] * *ports[PORT_VELOCITY] * - (1.5 + filt_lfo_mod * lfo)) * *ports[PORT_FREQ] * 10.0F, &a, &b, &c); - - sample = osc (waveform1, inc1 * (1.0 + lfo * dco1_fm), - 0.5F + lfo * dco1_pwm, - &analogue->dco1_accum) - * envelope (&analogue->dco1_env, - gate, attack1, decay1, - *ports[PORT_DCO1_SUSTAIN], release1) - + osc (waveform2, inc2 * (1.0 + lfo * dco2_fm), - 0.5F + lfo * dco2_pwm, - &analogue->dco2_accum) - * envelope (&analogue->dco2_env, - gate, attack2, decay2, - *ports[PORT_DCO2_SUSTAIN], release2); - - sample = a * analogue->d1 + - b * analogue->d2 + - c * *ports[PORT_VELOCITY] * sample; - - analogue->d2 = analogue->d1; - analogue->d1 = sample; - ports[PORT_OUT][i] = sample; - } - } -}; - -static LADSPA_PortDescriptor g_psPortDescriptors[] = -{ - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT -}; - -static const char * const g_psPortNames[] = -{ - "Out", - "Gate", - "Velocity", - "Frequency (Hz)", - - "DCO1 Octave", - "DCO1 Waveform", - "DCO1 LFO Frequency Modulation", - "DCO1 LFO Pulse Width Modulation", - - "DCO1 Attack", - "DCO1 Decay", - "DCO1 Sustain", - "DCO1 Release", - - "DCO2 Octave", - "DCO2 Waveform", - "DCO2 LFO Frequency Modulation", - "DCO2 LFO Pulse Width Modulation", - - "DCO2 Attack", - "DCO2 Decay", - "DCO2 Sustain", - "DCO2 Release", - - "LFO Frequency (Hz)", - "LFO Fadein", - - "Filter Envelope Modulation", - "Filter LFO Modulation", - "Filter Resonance", - - "Filter Attack", - "Filter Decay", - "Filter Sustain", - "Filter Release" -}; - -static LADSPA_PortRangeHint g_psPortRangeHints[] = -{ - /* Hints, Lower bound, Upper bound */ - { 0, 0.0, 0.0 }, - { LADSPA_HINT_TOGGLED, 0.0, 0.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 20000.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.001, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 10.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -2.0, 2.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 5.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.00, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -2.0, 2.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 5.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.00, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 20.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.00, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 } -}; - -void -initialise_analogue() { - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1221, - "analogue", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Analogue Voice", - CMT_MAKER("David A. Bartold"), - CMT_COPYRIGHT("2000", "David A. Bartold"), - NULL, - CMT_Instantiate, - Analogue::activate, - Analogue::run, - NULL, - NULL, - NULL); - - for (int i = 0; i < NUM_PORTS; i++) - psDescriptor->addPort( - g_psPortDescriptors[i], - g_psPortNames[i], - g_psPortRangeHints[i].HintDescriptor, - g_psPortRangeHints[i].LowerBound, - g_psPortRangeHints[i].UpperBound); - - registerNewPluginDescriptor(psDescriptor); -} diff --git a/plugins/LadspaEffect/cmt/src/canyondelay.cpp b/plugins/LadspaEffect/cmt/src/canyondelay.cpp deleted file mode 100644 index 23651bd50af..00000000000 --- a/plugins/LadspaEffect/cmt/src/canyondelay.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/* canyondelay.cpp - - Canyon Delay - Deep Stereo Cross Delay - Copyright (c) 1999, 2000 David A. Bartold - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - - -#include -#include -#include "cmt.h" - -#define PORT_IN_LEFT 0 -#define PORT_IN_RIGHT 1 -#define PORT_OUT_LEFT 2 -#define PORT_OUT_RIGHT 3 -#define PORT_LTR_TIME 4 -#define PORT_LTR_FEEDBACK 5 -#define PORT_RTL_TIME 6 -#define PORT_RTL_FEEDBACK 7 -#define PORT_CUTOFF 8 - -#define NUM_PORTS 9 - -#ifndef PI -#define PI 3.14159265358979 -#endif - -class CanyonDelay : public CMT_PluginInstance { - LADSPA_Data sample_rate; - - long datasize; - LADSPA_Data *data_l; - LADSPA_Data *data_r; - LADSPA_Data accum_l; - LADSPA_Data accum_r; - - int pos; - -public: - CanyonDelay(const LADSPA_Descriptor *, - unsigned long s_rate) - : CMT_PluginInstance(NUM_PORTS), - sample_rate(s_rate), - datasize(s_rate), - data_l(new LADSPA_Data[datasize]), - data_r(new LADSPA_Data[datasize]), - accum_l(0.0), - accum_r(0.0), - pos(0) { - for (long i = 0; i < datasize; i++) - data_l[i] = data_r[i] = 0.0; - } - - ~CanyonDelay() { - delete[] data_l; - delete[] data_r; - } - - static void - activate(LADSPA_Handle Instance) { - CanyonDelay *delay = (CanyonDelay*) Instance; - - for (long i = 0; i < delay->datasize; i++) - delay->data_l[i] = delay->data_r[i] = 0.0; - - delay->accum_l = 0.0; - delay->accum_r = 0.0; - delay->pos = 0; - } - - static void - run(LADSPA_Handle Instance, - unsigned long SampleCount) { - CanyonDelay *delay = (CanyonDelay*) Instance; - LADSPA_Data **ports; - unsigned long i; - int l_to_r_offset, r_to_l_offset; - LADSPA_Data ltr_invmag, rtl_invmag; - LADSPA_Data filter_mag, filter_invmag; - - ports = delay->m_ppfPorts; - - l_to_r_offset = (int) (*ports[PORT_LTR_TIME] * delay->sample_rate); - r_to_l_offset = (int) (*ports[PORT_RTL_TIME] * delay->sample_rate); - - ltr_invmag = 1.0 - fabs (*ports[PORT_LTR_FEEDBACK]); - rtl_invmag = 1.0 - fabs (*ports[PORT_RTL_FEEDBACK]); - - filter_invmag = pow (0.5, (4.0 * PI * *ports[PORT_CUTOFF]) / delay->sample_rate); - filter_mag = 1.0 - filter_invmag; - - for (i = 0; i < SampleCount; i++) - { - LADSPA_Data accum_l, accum_r; - int pos1, pos2; - - accum_l = ports[PORT_IN_LEFT][i]; - accum_r = ports[PORT_IN_RIGHT][i]; - - pos1 = delay->pos - r_to_l_offset + delay->datasize; - while (pos1 >= delay->datasize) - pos1 -= delay->datasize; - - pos2 = delay->pos - l_to_r_offset + delay->datasize; - while (pos2 >= delay->datasize) - pos2 -= delay->datasize; - - /* Mix channels with past samples. */ - accum_l = accum_l * rtl_invmag + delay->data_r[pos1] * *ports[PORT_RTL_FEEDBACK]; - accum_r = accum_r * ltr_invmag + delay->data_l[pos2] * *ports[PORT_LTR_FEEDBACK]; - - /* Low-pass filter output. */ - accum_l = delay->accum_l * filter_invmag + accum_l * filter_mag; - accum_r = delay->accum_r * filter_invmag + accum_r * filter_mag; - - /* Store IIR samples. */ - delay->accum_l = accum_l; - delay->accum_r = accum_r; - - /* Store samples in arrays. */ - delay->data_l[delay->pos] = accum_l; - delay->data_r[delay->pos] = accum_r; - - ports[PORT_OUT_LEFT][i] = accum_l; - ports[PORT_OUT_RIGHT][i] = accum_r; - - delay->pos++; - if (delay->pos >= delay->datasize) - delay->pos -= delay->datasize; - } - } -}; - - -static LADSPA_PortDescriptor g_psPortDescriptors[] = -{ - LADSPA_PORT_AUDIO | LADSPA_PORT_INPUT, - LADSPA_PORT_AUDIO | LADSPA_PORT_INPUT, - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT -}; - -static const char * const g_psPortNames[] = -{ - "In (Left)", - "In (Right)", - "Out (Left)", - "Out (Right)", - "Left to Right Time (Seconds)", - "Left to Right Feedback (Percent)", - "Right to Left Time (Seconds)", - "Right to Left Feedback (Percent)", - "Low-Pass Cutoff (Hz)" -}; - -static LADSPA_PortRangeHint g_psPortRangeHints[] = -{ - /* Hints, Lower bound, Upper bound */ - { 0, 0.0, 0.0 }, - { 0, 0.0, 0.0 }, - { 0, 0.0, 0.0 }, - { 0, 0.0, 0.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 0.99 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -1.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 0.99 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -1.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 1.0, 5000.0 } -}; - -void -initialise_canyondelay() { - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1225, - "canyon_delay", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Canyon Delay", - CMT_MAKER("David A. Bartold"), - CMT_COPYRIGHT("1999, 2000", "David A. Bartold"), - NULL, - CMT_Instantiate, - CanyonDelay::activate, - CanyonDelay::run, - NULL, - NULL, - NULL); - - for (int i = 0; i < NUM_PORTS; i++) - psDescriptor->addPort( - g_psPortDescriptors[i], - g_psPortNames[i], - g_psPortRangeHints[i].HintDescriptor, - g_psPortRangeHints[i].LowerBound, - g_psPortRangeHints[i].UpperBound); - - registerNewPluginDescriptor(psDescriptor); -} diff --git a/plugins/LadspaEffect/cmt/src/cmt.cpp b/plugins/LadspaEffect/cmt/src/cmt.cpp deleted file mode 100644 index d735c44b970..00000000000 --- a/plugins/LadspaEffect/cmt/src/cmt.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/* cmt.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -inline char * -localStrdup(const char * input) { - char * output = new char[strlen(input) + 1]; - strcpy(output, input); - return output; -} - -/*****************************************************************************/ - -CMT_Descriptor:: -~CMT_Descriptor() { - if (Label) - delete [] Label; - if (Name) - delete [] Name; - if (Maker) - delete [] Maker; - if (Copyright) - delete [] Copyright; - if (ImplementationData) - delete (CMT_ImplementationData *)ImplementationData; - if (PortDescriptors) - delete [] PortDescriptors; - if (PortNames) { - for (unsigned long lIndex = 0; lIndex < PortCount; lIndex++) - if (PortNames[lIndex]) - delete [] PortNames[lIndex]; - delete [] PortNames; - } - if (PortRangeHints) - delete [] PortRangeHints; -} - -/*****************************************************************************/ - -void -CMT_ConnectPort(LADSPA_Handle Instance, - unsigned long Port, - LADSPA_Data * DataLocation) { - CMT_PluginInstance * poInstance = (CMT_PluginInstance *)Instance; - poInstance->m_ppfPorts[Port] = DataLocation; -} - -/*****************************************************************************/ - -void -CMT_Cleanup(LADSPA_Handle Instance) { - CMT_PluginInstance * poInstance = (CMT_PluginInstance *)Instance; - delete poInstance; -} - -/*****************************************************************************/ - -CMT_Descriptor:: -CMT_Descriptor(unsigned long lUniqueID, - const char * pcLabel, - LADSPA_Properties iProperties, - const char * pcName, - const char * pcMaker, - const char * pcCopyright, - CMT_ImplementationData * poImplementationData, - LADSPA_Instantiate_Function fInstantiate, - LADSPA_Activate_Function fActivate, - LADSPA_Run_Function fRun, - LADSPA_Run_Adding_Function fRunAdding, - LADSPA_Set_Run_Adding_Gain_Function fSetRunAddingGain, - LADSPA_Deactivate_Function fDeactivate) { - - UniqueID = lUniqueID; - Label = localStrdup(pcLabel); - Properties = iProperties; - Name = localStrdup(pcName); - Maker = localStrdup(pcMaker); - Copyright = localStrdup(pcCopyright); - PortCount = 0; - ImplementationData = poImplementationData; - - instantiate = fInstantiate; - connect_port = CMT_ConnectPort; - activate = fActivate; - run = fRun; - run_adding = fRunAdding; - set_run_adding_gain = fSetRunAddingGain; - deactivate = fDeactivate; - cleanup = CMT_Cleanup; - -}; - -/*****************************************************************************/ - -typedef char * char_ptr; - -void CMT_Descriptor:: -addPort(LADSPA_PortDescriptor iPortDescriptor, - const char * pcPortName, - LADSPA_PortRangeHintDescriptor iHintDescriptor, - LADSPA_Data fLowerBound, - LADSPA_Data fUpperBound) { - - unsigned long lOldPortCount = PortCount; - unsigned long lNewPortCount = PortCount + 1; - - LADSPA_PortDescriptor * piOldPortDescriptors - = (LADSPA_PortDescriptor *)PortDescriptors; - char ** ppcOldPortNames - = (char **)PortNames; - LADSPA_PortRangeHint * psOldPortRangeHints - = (LADSPA_PortRangeHint *)PortRangeHints; - - LADSPA_PortDescriptor * piNewPortDescriptors - = new LADSPA_PortDescriptor[lNewPortCount]; - char ** ppcNewPortNames - = new char_ptr[lNewPortCount]; - LADSPA_PortRangeHint * psNewPortRangeHints - = new LADSPA_PortRangeHint[lNewPortCount]; - - if (piNewPortDescriptors == NULL - || ppcNewPortNames == NULL - || psNewPortRangeHints == NULL) { - /* Memory allocation failure that we cannot handle. Best option is - probably just to get out while the going is reasonably good. */ - return; - } - - for (unsigned long lPortIndex = 0; - lPortIndex < lOldPortCount; - lPortIndex++) { - piNewPortDescriptors[lPortIndex] = piOldPortDescriptors[lPortIndex]; - ppcNewPortNames[lPortIndex] = ppcOldPortNames[lPortIndex]; - psNewPortRangeHints[lPortIndex] = psOldPortRangeHints[lPortIndex]; - } - if (lOldPortCount > 0) { - delete [] piOldPortDescriptors; - delete [] ppcOldPortNames; - delete [] psOldPortRangeHints; - } - - piNewPortDescriptors[lOldPortCount] = iPortDescriptor; - ppcNewPortNames[lOldPortCount] = localStrdup(pcPortName); - psNewPortRangeHints[lOldPortCount].HintDescriptor = iHintDescriptor; - psNewPortRangeHints[lOldPortCount].LowerBound = fLowerBound; - psNewPortRangeHints[lOldPortCount].UpperBound = fUpperBound; - - PortDescriptors = piNewPortDescriptors; - PortNames = ppcNewPortNames; - PortRangeHints = psNewPortRangeHints; - - PortCount++; -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/cmt.h b/plugins/LadspaEffect/cmt/src/cmt.h deleted file mode 100644 index f151f34dfa2..00000000000 --- a/plugins/LadspaEffect/cmt/src/cmt.h +++ /dev/null @@ -1,180 +0,0 @@ -/* cmt.h - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef CMT_BASE_INCLUDED -#define CMT_BASE_INCLUDED - -/*****************************************************************************/ - -#include "ladspa_types.h" - -/*****************************************************************************/ - -/** This class is the baseclass of all CMT plugin implementation - data. Baseclassed so virtual destructors can be used. */ -class CMT_ImplementationData { -public: - virtual ~CMT_ImplementationData() { - } -}; - -/*****************************************************************************/ - -/** This structure describes a CMT LADSPA Plugin. It is a direct - ancestor of the _LADSPA_Descriptor structure which allows direct - casting. A rich constructor function is provided make it easier to - write LADSPA_Descriptor objects. (Less code is required and the - compiler will tell you when you have missed an entry.) An - addPort() function makes configuration of ports more - straightforward than using the _LADSPA_Descriptor structure - directly. */ - -struct CMT_Descriptor : public _LADSPA_Descriptor { -private: - - CMT_Descriptor &operator=(const CMT_Descriptor &) { - return *this; - } - CMT_Descriptor(const CMT_Descriptor &) { - } - -public: - - ~CMT_Descriptor(); - - /** The basic constructor for a CMT_Descriptor object. If you do not - know what the parameters mean, please see the fields in the - LADSPA_Descriptor structure, described in ladspa.h. Note that - some parameters may be NULL. Note also that a template is - provided to generate instantiate functions automatically (see - CMT_Instantiate<>() below). Implementation data must be NULL if - not allocated. */ - CMT_Descriptor(unsigned long lUniqueID, - const char * pcLabel, - LADSPA_Properties iProperties, - const char * pcName, - const char * pcMaker, - const char * pcCopyright, - CMT_ImplementationData * poImplementationData, - LADSPA_Instantiate_Function fInstantiate, - LADSPA_Activate_Function fActivate, - LADSPA_Run_Function fRun, - LADSPA_Run_Adding_Function fRunAdding, - LADSPA_Set_Run_Adding_Gain_Function fSetRunAddingGain, - LADSPA_Deactivate_Function fDeactivate); - - /** This method adds a new port to the descriptor. If you do not - know what the parameters mean, please see the fields in the - LADSPA_Descriptor structure, described in ladspa.h. */ - void addPort(LADSPA_PortDescriptor iPortDescriptor, - const char * pcPortName, - LADSPA_PortRangeHintDescriptor iHintDescriptor = 0, - LADSPA_Data fLowerBound = 0, - LADSPA_Data fUpperBound = 0); - -}; - -typedef CMT_Descriptor * CMT_Descriptor_ptr; - -/*****************************************************************************/ - -/** Each plugin type must register itself with the descriptor - registry. This is done by calling the following function, passing - a newly allocated structure (that will be cleaned up on library - unload automatically). - - Each module needs to be initialised in order to have a chance to - register new plugins. This can be achieved by modifying the list - of initialiser functions in descriptor.cpp. */ -void registerNewPluginDescriptor(CMT_Descriptor * psDescriptor); - -/*****************************************************************************/ - -/** This class is the baseclass of all CMT plugins. It provides - functionality to handle LADSPA connect_port() and cleanup() - requirements (as long as plugins have correctly written - destructors!) A CMT_Instantiate<>() template is provided also, - which makes LADSPA instantiate() methods easier to write. - - Derived classes access port data through the m_ppfPorts[] - array. This contains one entry for each port, in the order in - which ports were added to the corresponding CMT_Descriptor - object. */ -class CMT_PluginInstance { -private: - - CMT_PluginInstance &operator=(const CMT_PluginInstance &) { - return *this; - } - CMT_PluginInstance(const CMT_PluginInstance &) { - } - -protected: - - LADSPA_Data ** m_ppfPorts; - - CMT_PluginInstance(const unsigned long lPortCount) - : m_ppfPorts(new LADSPA_Data_ptr[lPortCount]) { - } - virtual ~CMT_PluginInstance() { - delete [] m_ppfPorts; - } - - friend void CMT_ConnectPort(LADSPA_Handle Instance, - unsigned long Port, - LADSPA_Data * DataLocation); - friend void CMT_Cleanup(LADSPA_Handle Instance); - -}; - -/*****************************************************************************/ - -/** This template can be used to generate functions to instantiate CMT - plugins. To be used with this function, the plugin must accept two - parameters (a LADSPA_Descriptor pointer and a sample rate). See - the SimpleMixer class and mixer_descriptor() in mixer.cpp for a - simple example of this: the instantiate function for the mixer - class is generated within the mixer_descriptor() function as - "CMT_Instantiate". */ -template LADSPA_Handle -CMT_Instantiate(const LADSPA_Descriptor * Descriptor, - unsigned long SampleRate) { - return new T(Descriptor, SampleRate); -} - -/*****************************************************************************/ - -/** This macro should be used to fill in the `Maker' field in the - CMT_Descriptor. */ -#define CMT_MAKER(AUTHORS) \ - "CMT (http://www.ladspa.org/cmt, plugin by " AUTHORS ")" - -/** This macro should be used to fill in the `Copyright' field in the - CMT_Descriptor. */ -#define CMT_COPYRIGHT(YEARS, AUTHORS) \ - "(C)" YEARS ", " AUTHORS ". " \ - "GNU General Public Licence Version 2 applies." - -/*****************************************************************************/ - -#endif - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/delay.cpp b/plugins/LadspaEffect/cmt/src/delay.cpp deleted file mode 100644 index 12f6fedaa4c..00000000000 --- a/plugins/LadspaEffect/cmt/src/delay.cpp +++ /dev/null @@ -1,351 +0,0 @@ -/* delay.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -/* This module provides delays and delays with feedback. A variety of - maximum delay times are available. (The plugins reserve different - amounts of memory space on this basis.) */ - -/*****************************************************************************/ - -#include -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -#define DELAY_TYPE_COUNT 2 - -#define DELAY_LENGTH_COUNT 5 - -/*****************************************************************************/ - -#define LIMIT_BETWEEN(x, a, b) \ -(((x) < a) ? a : (((x) > b) ? b : (x))) - -/*****************************************************************************/ - -#define DL_DELAY_LENGTH 0 -#define DL_DRY_WET 1 -#define DL_INPUT 2 -#define DL_OUTPUT 3 -/* Present only on feedback delays: */ -#define DL_FEEDBACK 4 - -/** This class is used to implement delay line plugins. Different - maximum delay times are supported as are both echo and feedback - delays. */ -class DelayLine : public CMT_PluginInstance { -private: - - LADSPA_Data m_fSampleRate; - - LADSPA_Data m_fMaximumDelay; - - LADSPA_Data * m_pfBuffer; - - /** Buffer size, a power of two. */ - unsigned long m_lBufferSize; - - /** Write pointer in buffer. */ - unsigned long m_lWritePointer; - - friend void activateDelayLine(LADSPA_Handle Instance); - friend void runSimpleDelayLine(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runFeedbackDelayLine(LADSPA_Handle Instance, - unsigned long SampleCount); - -public: - - DelayLine(const unsigned long lSampleRate, - const LADSPA_Data fMaximumDelay) - : CMT_PluginInstance(5), - m_fSampleRate(LADSPA_Data(lSampleRate)), - m_fMaximumDelay(fMaximumDelay) { - /* Buffer size is a power of two bigger than max delay time. */ - unsigned long lMinimumBufferSize - = (unsigned long)((LADSPA_Data)lSampleRate * m_fMaximumDelay); - m_lBufferSize = 1; - while (m_lBufferSize < lMinimumBufferSize) - m_lBufferSize <<= 1; - m_pfBuffer = new LADSPA_Data[m_lBufferSize]; - } - - ~DelayLine() { - delete [] m_pfBuffer; - } -}; - -/*****************************************************************************/ - -/* Initialise and activate a plugin instance. */ -void -activateDelayLine(LADSPA_Handle Instance) { - - DelayLine * poDelayLine = (DelayLine *)Instance; - - /* Need to reset the delay history in this function rather than - instantiate() in case deactivate() followed by activate() have - been called to reinitialise a delay line. */ - memset(poDelayLine->m_pfBuffer, - 0, - sizeof(LADSPA_Data) * poDelayLine->m_lBufferSize); - - poDelayLine->m_lWritePointer = 0; -} - -/*****************************************************************************/ - -/* Run a delay line instance for a block of SampleCount samples. */ -void -runSimpleDelayLine(LADSPA_Handle Instance, - unsigned long SampleCount) { - - DelayLine * poDelayLine = (DelayLine *)Instance; - - unsigned long lBufferSizeMinusOne = poDelayLine->m_lBufferSize - 1; - unsigned long lDelay = (unsigned long) - (LIMIT_BETWEEN(*(poDelayLine->m_ppfPorts[DL_DELAY_LENGTH]), - 0, - poDelayLine->m_fMaximumDelay) - * poDelayLine->m_fSampleRate); - - LADSPA_Data * pfInput - = poDelayLine->m_ppfPorts[DL_INPUT]; - LADSPA_Data * pfOutput - = poDelayLine->m_ppfPorts[DL_OUTPUT]; - LADSPA_Data * pfBuffer - = poDelayLine->m_pfBuffer; - - unsigned long lBufferWriteOffset - = poDelayLine->m_lWritePointer; - unsigned long lBufferReadOffset - = lBufferWriteOffset + poDelayLine->m_lBufferSize - lDelay; - LADSPA_Data fWet - = LIMIT_BETWEEN(*(poDelayLine->m_ppfPorts[DL_DRY_WET]), - 0, - 1); - LADSPA_Data fDry - = 1 - fWet; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fInputSample = *(pfInput++); - *(pfOutput++) = (fDry * fInputSample - + fWet * pfBuffer[((lSampleIndex + lBufferReadOffset) - & lBufferSizeMinusOne)]); - pfBuffer[((lSampleIndex + lBufferWriteOffset) - & lBufferSizeMinusOne)] = fInputSample; - } - - poDelayLine->m_lWritePointer - = ((poDelayLine->m_lWritePointer + SampleCount) - & lBufferSizeMinusOne); -} - -/*****************************************************************************/ - -/** Run a feedback delay line instance for a block of SampleCount samples. */ -void -runFeedbackDelayLine(LADSPA_Handle Instance, - unsigned long SampleCount) { - - DelayLine * poDelayLine = (DelayLine *)Instance; - - unsigned long lBufferSizeMinusOne = poDelayLine->m_lBufferSize - 1; - unsigned long lDelay = (unsigned long) - (LIMIT_BETWEEN(*(poDelayLine->m_ppfPorts[DL_DELAY_LENGTH]), - 0, - poDelayLine->m_fMaximumDelay) - * poDelayLine->m_fSampleRate); - - LADSPA_Data * pfInput - = poDelayLine->m_ppfPorts[DL_INPUT]; - LADSPA_Data * pfOutput - = poDelayLine->m_ppfPorts[DL_OUTPUT]; - LADSPA_Data * pfBuffer - = poDelayLine->m_pfBuffer; - - unsigned long lBufferWriteOffset - = poDelayLine->m_lWritePointer; - unsigned long lBufferReadOffset - = lBufferWriteOffset + poDelayLine->m_lBufferSize - lDelay; - LADSPA_Data fWet - = LIMIT_BETWEEN(*(poDelayLine->m_ppfPorts[DL_DRY_WET]), - 0, - 1); - LADSPA_Data fDry - = 1 - fWet; - LADSPA_Data fFeedback - = LIMIT_BETWEEN(*(poDelayLine->m_ppfPorts[DL_FEEDBACK]), - -1, - 1); - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - - LADSPA_Data fInputSample = *(pfInput++); - LADSPA_Data &fDelayedSample = pfBuffer[((lSampleIndex + lBufferReadOffset) - & lBufferSizeMinusOne)]; - - *(pfOutput++) = (fDry * fInputSample + fWet * fDelayedSample); - - pfBuffer[((lSampleIndex + lBufferWriteOffset) - & lBufferSizeMinusOne)] - = fInputSample + fDelayedSample * fFeedback; - } - - poDelayLine->m_lWritePointer - = ((poDelayLine->m_lWritePointer + SampleCount) - & lBufferSizeMinusOne); -} - -/*****************************************************************************/ - -template LADSPA_Handle -CMT_Delay_Instantiate(const LADSPA_Descriptor * Descriptor, - unsigned long SampleRate) { - return new DelayLine(SampleRate, - LADSPA_Data(lMaximumDelayMilliseconds - * 0.001)); -} - -/*****************************************************************************/ - -void -initialise_delay() { - - CMT_Descriptor * psDescriptor; - - const char * apcDelayTypeNames[DELAY_TYPE_COUNT] = { - "Echo", - "Feedback" - }; - const char * apcDelayTypeLabels[DELAY_TYPE_COUNT] = { - "delay", - "fbdelay" - }; - LADSPA_Run_Function afRunFunctions[DELAY_TYPE_COUNT] = { - runSimpleDelayLine, - runFeedbackDelayLine - }; - - LADSPA_Data afMaximumDelays[DELAY_LENGTH_COUNT] = { - 0.01, - 0.1, - 1, - 5, - 60 - }; - LADSPA_Instantiate_Function afInstantiateFunctions[DELAY_LENGTH_COUNT] = { - CMT_Delay_Instantiate<10>, - CMT_Delay_Instantiate<100>, - CMT_Delay_Instantiate<1000>, - CMT_Delay_Instantiate<5000>, - CMT_Delay_Instantiate<60000> - }; - - for (long lDelayTypeIndex = 0; - lDelayTypeIndex < DELAY_TYPE_COUNT; - lDelayTypeIndex++) { - - for (long lDelayLengthIndex = 0; - lDelayLengthIndex < DELAY_LENGTH_COUNT; - lDelayLengthIndex++) { - - long lPluginIndex - = lDelayTypeIndex * DELAY_LENGTH_COUNT + lDelayLengthIndex; - - char acLabel[100]; - sprintf(acLabel, - "%s_%gs", - apcDelayTypeLabels[lDelayTypeIndex], - afMaximumDelays[lDelayLengthIndex]); - char acName[100]; - sprintf(acName, - "%s Delay Line (Maximum Delay %gs)", - apcDelayTypeNames[lDelayTypeIndex], - afMaximumDelays[lDelayLengthIndex]); - - psDescriptor = new CMT_Descriptor - (1053 + lPluginIndex, - acLabel, - LADSPA_PROPERTY_HARD_RT_CAPABLE, - acName, - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - afInstantiateFunctions[lDelayLengthIndex], - activateDelayLine, - afRunFunctions[lDelayTypeIndex], - NULL, - NULL, - NULL); - - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Delay (Seconds)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_1), - 0, - afMaximumDelays[lDelayLengthIndex]); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Dry/Wet Balance", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - - if (lDelayTypeIndex == 1) - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Feedback", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_HIGH), - -1, - 1); - - registerNewPluginDescriptor(psDescriptor); - } - } -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/descriptor.cpp b/plugins/LadspaEffect/cmt/src/descriptor.cpp deleted file mode 100644 index 0a20dc67a99..00000000000 --- a/plugins/LadspaEffect/cmt/src/descriptor.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* descriptor.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -/* This module contains code providing and supporting the - CMT_Descriptor() function that provides hosts with initial access - to LADSPA plugins. ALL PLUGINS MUST BE REGISTERED IN THIS FILE (see - below). */ - -/*****************************************************************************/ - -/* Module Initialisation: - ---------------------- */ - -void initialise_am(); -void initialise_ambisonic(); -void initialise_amp(); -void initialise_analogue(); -void initialise_canyondelay(); -void initialise_delay(); -void initialise_dynamic(); -void initialise_filter(); -void initialise_freeverb3(); -void initialise_grain(); -void initialise_lofi(); -void initialise_mixer(); -void initialise_noise(); -void initialise_null(); -void initialise_organ(); -void initialise_peak(); -void initialise_phasemod(); -void initialise_sine(); -void initialise_syndrum(); -void initialise_vcf303(); -void initialise_wshape_sine(); -namespace hardgate { void initialise(); } -namespace disintegrator { void initialise(); } -namespace pink { void initialise(); } -namespace pink_full { void initialise(); } -namespace pink_sh { void initialise(); } -namespace sledgehammer { void initialise(); } -namespace logistic { void initialise(); } - -/** This function should initialise all modules in the library. This - will lead to all plugin descriptors being registered. If you write - a new plugin you should initialise it here. If the module has - structures it wishes to remove also then these should be included - in finalise_modules(). */ -void -initialise_modules() { - initialise_am(); - initialise_ambisonic(); - initialise_amp(); - initialise_analogue(); - initialise_canyondelay(); - initialise_delay(); - initialise_dynamic(); - initialise_filter(); - initialise_freeverb3(); - initialise_grain(); - initialise_lofi(); - initialise_mixer(); - initialise_noise(); - initialise_null(); - initialise_organ(); - initialise_peak(); - initialise_phasemod(); - initialise_sine(); - initialise_syndrum(); - initialise_vcf303(); - initialise_wshape_sine(); - hardgate::initialise(); - disintegrator::initialise(); - pink::initialise(); - pink_full::initialise(); - pink_sh::initialise(); - sledgehammer::initialise(); - logistic::initialise(); -} - -/*****************************************************************************/ - -/* Module Finalisation: - -------------------- */ - -void finalise_sine(); - -/** Finalise any structures allocated by the modules. This does not - include descriptors passed to registerNewPluginDescriptor(). */ -void -finalise_modules() { - finalise_sine(); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/disintegrator.cpp b/plugins/LadspaEffect/cmt/src/disintegrator.cpp deleted file mode 100644 index 39edefc5bd2..00000000000 --- a/plugins/LadspaEffect/cmt/src/disintegrator.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* disintegrator.cpp - - (c) 2002 Nathaniel Virgo - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" -#include "run_adding.h" - -/*****************************************************************************/ - -namespace disintegrator { - - enum { - port_probability = 0, - port_multiplier = 1, - port_input = 2, - port_output = 3, - n_ports = 4 - }; - -/** This plugin multiplies random half-waveforms by port_multiplier, - with probability port_probability */ - class Plugin : public CMT_PluginInstance { - LADSPA_Data run_adding_gain; - bool active; - LADSPA_Data last_input; - public: - Plugin(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(n_ports) { - active = false; last_input = 0.0f; - } - - template - friend void run(LADSPA_Handle instance, - unsigned long sample_count); - - friend void set_run_adding_gain(LADSPA_Handle instance, - LADSPA_Data new_gain); - }; - - template - void run(LADSPA_Handle instance, - unsigned long sample_count) { - - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - LADSPA_Data prob = *pp->m_ppfPorts[port_probability]; - LADSPA_Data mult = *pp->m_ppfPorts[port_multiplier]; - LADSPA_Data * in = pp->m_ppfPorts[port_input]; - LADSPA_Data * out = pp->m_ppfPorts[port_output]; - - mult *= get_gain(p.run_adding_gain); - - for ( unsigned long i = 0; i < sample_count ; ++i ) { - LADSPA_Data insig = *(in++); - if ( ( p.last_input>0 && insig<0 ) || ( p.last_input<0 && insig>0 ) ) - p.active = rand() < prob*RAND_MAX; - p.last_input = insig; - if (p.active) - write_output(out, insig*mult, 1.0f); - else - write_output(out, insig, p.run_adding_gain); - } - } - - void set_run_adding_gain(LADSPA_Handle instance, - LADSPA_Data new_gain) { - ((Plugin *) instance)->run_adding_gain = new_gain; - } - - void - initialise() { - - CMT_Descriptor * d = new CMT_Descriptor - (1846, - "disintegrator", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Disintegrator", - CMT_MAKER("Nathaniel Virgo"), - CMT_COPYRIGHT("2002", "Nathaniel Virgo"), - NULL, - CMT_Instantiate, - NULL, - run, - run, - set_run_adding_gain, - NULL); - - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Probability", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_0), - 0, - 1); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Multiplier", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_0), - -1, - 1); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - d->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - - registerNewPluginDescriptor(d); - - } - -} // end of namespace - -/*****************************************************************************/ - -/* EOF */ - - - - - diff --git a/plugins/LadspaEffect/cmt/src/dynamic.cpp b/plugins/LadspaEffect/cmt/src/dynamic.cpp deleted file mode 100644 index 6314cdfeb6f..00000000000 --- a/plugins/LadspaEffect/cmt/src/dynamic.cpp +++ /dev/null @@ -1,800 +0,0 @@ -/* dynamic.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -/* This module provides unsophisticated implementations of compressor, - expander and limiter plugins. Note that attack and decay times are - applied at the LEVEL DETECTION stage rather than at gain processing - (the reason no noise gate is provided). No delay is applied to the - main signal. These are useful (and efficient) tools and extended - compressors should probably allocate new IDs rather than break - compatibility in parameter set and sound for this set. */ - -// Having said this, I'm not sure the attack/decay parameters are the -// right way around. - -/*****************************************************************************/ - -#include -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" -#include "utils.h" - -/*****************************************************************************/ - -class DynamicProcessor { -protected: - - /** This state variable is used to track the input envelope (peak or - rms). The state is stored here so that the run function can - perform low-pass filtering to produce a smoothed envelope. */ - LADSPA_Data m_fEnvelopeState; - - /** The sample rate in the world this instance exists in. */ - LADSPA_Data m_fSampleRate; - - DynamicProcessor(const LADSPA_Data fSampleRate) - : m_fSampleRate(fSampleRate) { - } - -}; - -/*****************************************************************************/ - -#define CE_THRESHOLD 0 -#define CE_RATIO 1 -#define CE_ATTACK 2 -#define CE_DECAY 3 -#define CE_INPUT 4 -#define CE_OUTPUT 5 - -/** This class is used to implement simple compressor and expander - plugins. Attack and decay times are applied at the level detection - stage rather than at gain processing. No delay is applied to the - main signal. Both peak and RMS support is included. */ -class CompressorExpander - : public CMT_PluginInstance, public DynamicProcessor { -public: - - CompressorExpander(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(6), - DynamicProcessor(lSampleRate) { - } - - friend void activateCompressorExpander(void * pvHandle); - friend void runCompressor_Peak(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runCompressor_RMS(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runExpander_Peak(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runExpander_RMS(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -#define LN_THRESHOLD 0 -#define LN_ATTACK 1 -#define LN_DECAY 2 -#define LN_INPUT 3 -#define LN_OUTPUT 4 - -/** This class is used to implement simple limiter plugins. Attack and - decay times are applied at the level detection stage rather than - at gain processing. No delay is applied to the main signal. Both - peak and RMS support is included. */ -class Limiter - : public CMT_PluginInstance, public DynamicProcessor { -public: - - Limiter(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(5), - DynamicProcessor(lSampleRate) { - } - - friend void activateLimiter(void * pvHandle); - friend void runLimiter_Peak(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runLimiter_RMS(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -void -activateCompressorExpander(void * pvHandle) { - CompressorExpander * poProcessor = (CompressorExpander *)pvHandle; - poProcessor->m_fEnvelopeState = 0; -} - -/*****************************************************************************/ - -void -activateLimiter(void * pvHandle) { - Limiter * poProcessor = (Limiter *)pvHandle; - poProcessor->m_fEnvelopeState = 0; -} - -/*****************************************************************************/ - -void -runCompressor_Peak(LADSPA_Handle Instance, - unsigned long SampleCount) { - - CompressorExpander * poProcessor = (CompressorExpander *)Instance; - - LADSPA_Data fThreshold - = BOUNDED_BELOW(*(poProcessor->m_ppfPorts[CE_THRESHOLD]), - 0); - LADSPA_Data fOneOverThreshold - = 1 / fThreshold; - LADSPA_Data fRatioMinusOne - = *(poProcessor->m_ppfPorts[CE_RATIO]) - 1; - LADSPA_Data * pfInput - = poProcessor->m_ppfPorts[CE_INPUT]; - LADSPA_Data * pfOutput - = poProcessor->m_ppfPorts[CE_OUTPUT]; - - LADSPA_Data fEnvelopeDrag_Attack - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_ATTACK]), - poProcessor->m_fSampleRate); - LADSPA_Data fEnvelopeDrag_Decay - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_DECAY]), - poProcessor->m_fSampleRate); - - LADSPA_Data &rfEnvelopeState - = poProcessor->m_fEnvelopeState; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fabs(fInput); - if (fEnvelopeTarget > rfEnvelopeState) - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Attack - + fEnvelopeTarget * (1 - fEnvelopeDrag_Attack)); - else - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Decay - + fEnvelopeTarget * (1 - fEnvelopeDrag_Decay)); - - /* Perform the mapping. This questions this plugin's claim of - being `hard-realtime.' */ - LADSPA_Data fGain; - if (rfEnvelopeState < fThreshold) - fGain = 1; - else { - fGain = pow(rfEnvelopeState * fOneOverThreshold, fRatioMinusOne); - if (isnan(fGain)) - fGain = 0; - } - - /* Perform output. */ - *(pfOutput++) = fInput * fGain; - } -} - -/*****************************************************************************/ - -void -runCompressor_RMS(LADSPA_Handle Instance, - unsigned long SampleCount) { - - CompressorExpander * poProcessor = (CompressorExpander *)Instance; - - LADSPA_Data fThreshold - = BOUNDED_BELOW(*(poProcessor->m_ppfPorts[CE_THRESHOLD]), - 0); - LADSPA_Data fOneOverThreshold - = 1 / fThreshold; - LADSPA_Data fRatioMinusOne - = *(poProcessor->m_ppfPorts[CE_RATIO]) - 1; - LADSPA_Data * pfInput - = poProcessor->m_ppfPorts[CE_INPUT]; - LADSPA_Data * pfOutput - = poProcessor->m_ppfPorts[CE_OUTPUT]; - - LADSPA_Data fEnvelopeDrag_Attack - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_ATTACK]), - poProcessor->m_fSampleRate); - LADSPA_Data fEnvelopeDrag_Decay - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_DECAY]), - poProcessor->m_fSampleRate); - - LADSPA_Data &rfEnvelopeState - = poProcessor->m_fEnvelopeState; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fInput * fInput; - if (fEnvelopeTarget > rfEnvelopeState) - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Attack - + fEnvelopeTarget * (1 - fEnvelopeDrag_Attack)); - else - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Decay - + fEnvelopeTarget * (1 - fEnvelopeDrag_Decay)); - - LADSPA_Data fEnvelopeAmplitude = sqrt(rfEnvelopeState); - - /* Perform the mapping. This questions this plugin's claim of - being `hard-realtime.' */ - LADSPA_Data fGain; - if (fEnvelopeAmplitude < fThreshold) - fGain = 1; - else { - fGain = pow(fEnvelopeAmplitude * fOneOverThreshold, fRatioMinusOne); - if (isnan(fGain)) - fGain = 0; - } - - /* Perform output. */ - *(pfOutput++) = fInput * fGain; - } -} - -/*****************************************************************************/ - -void -runExpander_Peak(LADSPA_Handle Instance, - unsigned long SampleCount) { - - CompressorExpander * poProcessor = (CompressorExpander *)Instance; - - LADSPA_Data fThreshold - = BOUNDED_BELOW(*(poProcessor->m_ppfPorts[CE_THRESHOLD]), - 0); - LADSPA_Data fOneOverThreshold - = 1 / fThreshold; - LADSPA_Data fOneMinusRatio - = 1 - *(poProcessor->m_ppfPorts[CE_RATIO]); - LADSPA_Data * pfInput - = poProcessor->m_ppfPorts[CE_INPUT]; - LADSPA_Data * pfOutput - = poProcessor->m_ppfPorts[CE_OUTPUT]; - - LADSPA_Data fEnvelopeDrag_Attack - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_ATTACK]), - poProcessor->m_fSampleRate); - LADSPA_Data fEnvelopeDrag_Decay - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_DECAY]), - poProcessor->m_fSampleRate); - - LADSPA_Data &rfEnvelopeState - = poProcessor->m_fEnvelopeState; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fabs(fInput); - if (fEnvelopeTarget > rfEnvelopeState) - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Attack - + fEnvelopeTarget * (1 - fEnvelopeDrag_Attack)); - else - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Decay - + fEnvelopeTarget * (1 - fEnvelopeDrag_Decay)); - - /* Perform the mapping. This questions this plugin's claim of - being `hard-realtime.' */ - LADSPA_Data fGain; - if (rfEnvelopeState > fThreshold) - fGain = 1; - else { - fGain = pow(rfEnvelopeState * fOneOverThreshold, fOneMinusRatio); - if (isnan(fGain)) - fGain = 0; - } - - /* Perform output. */ - *(pfOutput++) = fInput * fGain; - } -} - -/*****************************************************************************/ - -void -runExpander_RMS(LADSPA_Handle Instance, - unsigned long SampleCount) { - - CompressorExpander * poProcessor = (CompressorExpander *)Instance; - - LADSPA_Data fThreshold - = BOUNDED_BELOW(*(poProcessor->m_ppfPorts[CE_THRESHOLD]), - 0); - LADSPA_Data fOneOverThreshold - = 1 / fThreshold; - LADSPA_Data fOneMinusRatio - = 1 - *(poProcessor->m_ppfPorts[CE_RATIO]); - LADSPA_Data * pfInput - = poProcessor->m_ppfPorts[CE_INPUT]; - LADSPA_Data * pfOutput - = poProcessor->m_ppfPorts[CE_OUTPUT]; - - LADSPA_Data fEnvelopeDrag_Attack - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_ATTACK]), - poProcessor->m_fSampleRate); - LADSPA_Data fEnvelopeDrag_Decay - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_DECAY]), - poProcessor->m_fSampleRate); - - LADSPA_Data &rfEnvelopeState - = poProcessor->m_fEnvelopeState; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fInput * fInput; - if (fEnvelopeTarget > rfEnvelopeState) - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Attack - + fEnvelopeTarget * (1 - fEnvelopeDrag_Attack)); - else - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Decay - + fEnvelopeTarget * (1 - fEnvelopeDrag_Decay)); - - LADSPA_Data fEnvelopeAmplitude = sqrt(rfEnvelopeState); - - /* Perform the mapping. This questions this plugin's claim of - being `hard-realtime.' */ - LADSPA_Data fGain; - if (fEnvelopeAmplitude > fThreshold) - fGain = 1; - else { - fGain = pow(fEnvelopeAmplitude * fOneOverThreshold, fOneMinusRatio); - if (isnan(fGain)) - fGain = 0; - } - - /* Perform output. */ - *(pfOutput++) = fInput * fGain; - } -} - -/*****************************************************************************/ - -void -runLimiter_Peak(LADSPA_Handle Instance, - unsigned long SampleCount) { - - Limiter * poProcessor = (Limiter *)Instance; - - LADSPA_Data fThreshold - = BOUNDED_BELOW(*(poProcessor->m_ppfPorts[LN_THRESHOLD]), - 0); - LADSPA_Data * pfInput - = poProcessor->m_ppfPorts[LN_INPUT]; - LADSPA_Data * pfOutput - = poProcessor->m_ppfPorts[LN_OUTPUT]; - - LADSPA_Data fEnvelopeDrag_Attack - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_ATTACK]), - poProcessor->m_fSampleRate); - LADSPA_Data fEnvelopeDrag_Decay - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_DECAY]), - poProcessor->m_fSampleRate); - - LADSPA_Data &rfEnvelopeState - = poProcessor->m_fEnvelopeState; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fabs(fInput); - if (fEnvelopeTarget > rfEnvelopeState) - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Attack - + fEnvelopeTarget * (1 - fEnvelopeDrag_Attack)); - else - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Decay - + fEnvelopeTarget * (1 - fEnvelopeDrag_Decay)); - - /* Perform the mapping. This questions this plugin's claim of - being `hard-realtime.' */ - LADSPA_Data fGain; - if (rfEnvelopeState < fThreshold) - fGain = 1; - else { - fGain = fThreshold / rfEnvelopeState; - if (isnan(fGain)) - fGain = 0; - } - - /* Perform output. */ - *(pfOutput++) = fInput * fGain; - } -} - -/*****************************************************************************/ - -void -runLimiter_RMS(LADSPA_Handle Instance, - unsigned long SampleCount) { - - Limiter * poProcessor = (Limiter *)Instance; - - LADSPA_Data fThreshold - = BOUNDED_BELOW(*(poProcessor->m_ppfPorts[LN_THRESHOLD]), - 0); - LADSPA_Data * pfInput - = poProcessor->m_ppfPorts[LN_INPUT]; - LADSPA_Data * pfOutput - = poProcessor->m_ppfPorts[LN_OUTPUT]; - - LADSPA_Data fEnvelopeDrag_Attack - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_ATTACK]), - poProcessor->m_fSampleRate); - LADSPA_Data fEnvelopeDrag_Decay - = calculate60dBDrag(*(poProcessor->m_ppfPorts[CE_DECAY]), - poProcessor->m_fSampleRate); - - LADSPA_Data &rfEnvelopeState - = poProcessor->m_fEnvelopeState; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fInput * fInput; - if (fEnvelopeTarget > rfEnvelopeState) - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Attack - + fEnvelopeTarget * (1 - fEnvelopeDrag_Attack)); - else - rfEnvelopeState = (rfEnvelopeState * fEnvelopeDrag_Decay - + fEnvelopeTarget * (1 - fEnvelopeDrag_Decay)); - - LADSPA_Data fEnvelopeAmplitude = sqrt(rfEnvelopeState); - - /* Perform the mapping. This questions this plugin's claim of - being `hard-realtime.' */ - LADSPA_Data fGain; - if (fEnvelopeAmplitude < fThreshold) - fGain = 1; - else { - fGain = fThreshold / fEnvelopeAmplitude; - if (isnan(fGain)) - fGain = 0; - } - - /* Perform output. */ - *(pfOutput++) = fInput * fGain; - } -} - -/*****************************************************************************/ - -void -initialise_dynamic() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1072, - "compress_peak", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Simple Compressor (Peak Envelope Tracking)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateCompressorExpander, - runCompressor_Peak, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Threshold", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Compression Ratio", - (LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Attack (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Decay (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1073, - "compress_rms", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Simple Compressor (RMS Envelope Tracking)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateCompressorExpander, - runCompressor_RMS, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Threshold", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Compression Ratio", - (LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Attack (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Decay (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1074, - "expand_peak", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Simple Expander (Peak Envelope Tracking)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateCompressorExpander, - runExpander_Peak, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Threshold", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Expansion Ratio", - (LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Attack (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Decay (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1075, - "expand_rms", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Simple Expander (RMS Envelope Tracking)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateCompressorExpander, - runExpander_RMS, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Threshold", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Expansion Ratio", - (LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Attack (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Decay (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1076, - "limit_peak", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Simple Limiter (Peak Envelope Tracking)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateLimiter, - runLimiter_Peak, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Threshold", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Attack (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Decay (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1077, - "limit_rms", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Simple Limiter (RMS Envelope Tracking)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateLimiter, - runLimiter_RMS, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Threshold", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Attack (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Output Envelope Decay (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.1f); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/filter.cpp b/plugins/LadspaEffect/cmt/src/filter.cpp deleted file mode 100644 index a9006fbb7cf..00000000000 --- a/plugins/LadspaEffect/cmt/src/filter.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* filter.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -#define SF_CUTOFF 0 -#define SF_INPUT 1 -#define SF_OUTPUT 2 - -/** Instance data for the OnePoll filter (one-poll, low or high - pass). We can get away with using this structure for both low- and - high-pass filters because the data stored is the same. Note that - the actual run() calls differ however. */ -class OnePollFilter : public CMT_PluginInstance { -private: - - LADSPA_Data m_fSampleRate; - LADSPA_Data m_fTwoPiOverSampleRate; - - LADSPA_Data m_fLastOutput; - LADSPA_Data m_fLastCutoff; - LADSPA_Data m_fAmountOfCurrent; - LADSPA_Data m_fAmountOfLast; - -public: - - OnePollFilter(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(3), - m_fSampleRate(LADSPA_Data(lSampleRate)), - m_fTwoPiOverSampleRate(LADSPA_Data((2 * M_PI) / lSampleRate)), - m_fLastCutoff(0), - m_fAmountOfCurrent(0), - m_fAmountOfLast(0) { - } - - friend void activateOnePollFilter(LADSPA_Handle Instance); - friend void runOnePollLowPassFilter(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runOnePollHighPassFilter(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -void -activateOnePollFilter(LADSPA_Handle Instance) { - ((OnePollFilter *)Instance)->m_fLastOutput = 0; -} - -/*****************************************************************************/ - -/** Run the LPF algorithm for a block of SampleCount samples. */ -void -runOnePollLowPassFilter(LADSPA_Handle Instance, - unsigned long SampleCount) { - - OnePollFilter * poFilter = (OnePollFilter *)Instance; - - LADSPA_Data * pfInput = poFilter->m_ppfPorts[SF_INPUT]; - LADSPA_Data * pfOutput = poFilter->m_ppfPorts[SF_OUTPUT]; - - if (poFilter->m_fLastCutoff != *(poFilter->m_ppfPorts[SF_CUTOFF])) { - poFilter->m_fLastCutoff = *(poFilter->m_ppfPorts[SF_CUTOFF]); - if (poFilter->m_fLastCutoff <= 0) { - /* Reject everything. */ - poFilter->m_fAmountOfCurrent = poFilter->m_fAmountOfLast = 0; - } - else if (poFilter->m_fLastCutoff > poFilter->m_fSampleRate * 0.5) { - /* Above Nyquist frequency. Let everything through. */ - poFilter->m_fAmountOfCurrent = 1; - poFilter->m_fAmountOfLast = 0; - } - else { - poFilter->m_fAmountOfLast = 0; - LADSPA_Data fComp = 2 - cos(poFilter->m_fTwoPiOverSampleRate - * poFilter->m_fLastCutoff); - poFilter->m_fAmountOfLast = fComp - (LADSPA_Data)sqrt(fComp * fComp - 1); - poFilter->m_fAmountOfCurrent = 1 - poFilter->m_fAmountOfLast; - } - } - - LADSPA_Data fAmountOfCurrent = poFilter->m_fAmountOfCurrent; - LADSPA_Data fAmountOfLast = poFilter->m_fAmountOfLast; - LADSPA_Data fLastOutput = poFilter->m_fLastOutput; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - *(pfOutput++) - = fLastOutput - = (fAmountOfCurrent * *(pfInput++) - + fAmountOfLast * fLastOutput); - } - - poFilter->m_fLastOutput = fLastOutput; -} - -/*****************************************************************************/ - -/** Run the HPF algorithm for a block of SampleCount samples. */ -void -runOnePollHighPassFilter(LADSPA_Handle Instance, - unsigned long SampleCount) { - - OnePollFilter * poFilter = (OnePollFilter *)Instance; - - LADSPA_Data * pfInput = poFilter->m_ppfPorts[SF_INPUT]; - LADSPA_Data * pfOutput = poFilter->m_ppfPorts[SF_OUTPUT]; - - if (poFilter->m_fLastCutoff != *(poFilter->m_ppfPorts[SF_CUTOFF])) { - poFilter->m_fLastCutoff = *(poFilter->m_ppfPorts[SF_CUTOFF]); - if (poFilter->m_fLastCutoff <= 0) { - /* Let everything through. */ - poFilter->m_fAmountOfCurrent = 1; - poFilter->m_fAmountOfLast = 0; - } - else if (poFilter->m_fLastCutoff > poFilter->m_fSampleRate * 0.5) { - /* Above Nyquist frequency. Reject everything. */ - poFilter->m_fAmountOfCurrent = poFilter->m_fAmountOfLast = 0; - } - else { - poFilter->m_fAmountOfLast = 0; - LADSPA_Data fComp = 2 - cos(poFilter->m_fTwoPiOverSampleRate - * poFilter->m_fLastCutoff); - poFilter->m_fAmountOfLast = fComp - (LADSPA_Data)sqrt(fComp * fComp - 1); - poFilter->m_fAmountOfCurrent = 1 - poFilter->m_fAmountOfLast; - } - - } - - LADSPA_Data fAmountOfCurrent = poFilter->m_fAmountOfCurrent; - LADSPA_Data fAmountOfLast = poFilter->m_fAmountOfLast; - LADSPA_Data fLastOutput = poFilter->m_fLastOutput; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - fLastOutput - = (fAmountOfCurrent * *pfInput - + fAmountOfLast * fLastOutput); - *(pfOutput++) = *(pfInput++) - fLastOutput; - } - - poFilter->m_fLastOutput = fLastOutput; -} - -/*****************************************************************************/ - -void -initialise_filter() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1051, - "lpf", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Low Pass Filter (One Pole)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateOnePollFilter, - runOnePollLowPassFilter, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Cutoff Frequency (Hz)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_SAMPLE_RATE - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_440), - 0, - 0.5f); /* Nyquist frequency (half the sample rate) */ - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1052, - "hpf", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "High Pass Filter (One Pole)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateOnePollFilter, - runOnePollHighPassFilter, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Cutoff Frequency (Hz)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_SAMPLE_RATE - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_440), - 0, - 0.5f); /* Nyquist frequency (half the sample rate) */ - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/freeverb/Components/allpass.cpp b/plugins/LadspaEffect/cmt/src/freeverb/Components/allpass.cpp deleted file mode 100644 index 850337e3a33..00000000000 --- a/plugins/LadspaEffect/cmt/src/freeverb/Components/allpass.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// Allpass filter implementation -// -// Written by Jezar at Dreampoint, June 2000 -// http://www.dreampoint.co.uk -// This code is public domain - -#include "allpass.h" - -allpass::allpass() -{ - bufidx = 0; -} - -void allpass::setbuffer(float *buf, int size) -{ - buffer = buf; - bufsize = size; -} - -void allpass::mute() -{ - for (int i=0; i=bufsize) bufidx = 0; - - return output; -} - -#endif//_allpass - -//ends diff --git a/plugins/LadspaEffect/cmt/src/freeverb/Components/comb.cpp b/plugins/LadspaEffect/cmt/src/freeverb/Components/comb.cpp deleted file mode 100644 index 62be706d705..00000000000 --- a/plugins/LadspaEffect/cmt/src/freeverb/Components/comb.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// Comb filter implementation -// -// Written by Jezar at Dreampoint, June 2000 -// http://www.dreampoint.co.uk -// This code is public domain - -#include "comb.h" - -comb::comb() -{ - filterstore = 0; - bufidx = 0; -} - -void comb::setbuffer(float *buf, int size) -{ - buffer = buf; - bufsize = size; -} - -void comb::mute() -{ - for (int i=0; i=bufsize) bufidx = 0; - - return output; -} - -#endif //_comb_ - -//ends diff --git a/plugins/LadspaEffect/cmt/src/freeverb/Components/denormals.h b/plugins/LadspaEffect/cmt/src/freeverb/Components/denormals.h deleted file mode 100644 index 01990916a53..00000000000 --- a/plugins/LadspaEffect/cmt/src/freeverb/Components/denormals.h +++ /dev/null @@ -1,20 +0,0 @@ -// Macro for killing denormalled numbers -// -// Written by Jezar at Dreampoint, June 2000 -// http://www.dreampoint.co.uk -// Based on IS_DENORMAL macro by Jon Watte -// This code is public domain - -#ifndef _denormals_ -#define _denormals_ - -/*#define undenormalise(sample) if(((*(unsigned int*)&sample)&0x7f800000)==0) sample=0.0f*/ -static void inline undenormalise(float *sample) -{ - if (((*(unsigned int*)sample) & 0x7f800000) == 0) - *sample = 0.0f; -} - -#endif//_denormals_ - -//ends diff --git a/plugins/LadspaEffect/cmt/src/freeverb/Components/revmodel.cpp b/plugins/LadspaEffect/cmt/src/freeverb/Components/revmodel.cpp deleted file mode 100644 index 4f7fcd4d1e7..00000000000 --- a/plugins/LadspaEffect/cmt/src/freeverb/Components/revmodel.cpp +++ /dev/null @@ -1,257 +0,0 @@ -// Reverb model implementation -// -// Written by Jezar at Dreampoint, June 2000 -// http://www.dreampoint.co.uk -// This code is public domain - -#include "revmodel.h" - -revmodel::revmodel( float sampleRatio ) : - m_sampleRatio( sampleRatio ) -{ - // Tie the components to their buffers - combL[0].setbuffer(bufcombL1,static_cast( combtuningL1 * m_sampleRatio )); - combR[0].setbuffer(bufcombR1,static_cast( combtuningR1 * m_sampleRatio )); - combL[1].setbuffer(bufcombL2,static_cast( combtuningL2 * m_sampleRatio )); - combR[1].setbuffer(bufcombR2,static_cast( combtuningR2 * m_sampleRatio )); - combL[2].setbuffer(bufcombL3,static_cast( combtuningL3 * m_sampleRatio )); - combR[2].setbuffer(bufcombR3,static_cast( combtuningR3 * m_sampleRatio )); - combL[3].setbuffer(bufcombL4,static_cast( combtuningL4 * m_sampleRatio )); - combR[3].setbuffer(bufcombR4,static_cast( combtuningR4 * m_sampleRatio )); - combL[4].setbuffer(bufcombL5,static_cast( combtuningL5 * m_sampleRatio )); - combR[4].setbuffer(bufcombR5,static_cast( combtuningR5 * m_sampleRatio )); - combL[5].setbuffer(bufcombL6,static_cast( combtuningL6 * m_sampleRatio )); - combR[5].setbuffer(bufcombR6,static_cast( combtuningR6 * m_sampleRatio )); - combL[6].setbuffer(bufcombL7,static_cast( combtuningL7 * m_sampleRatio )); - combR[6].setbuffer(bufcombR7,static_cast( combtuningR7 * m_sampleRatio )); - combL[7].setbuffer(bufcombL8,static_cast( combtuningL8 * m_sampleRatio )); - combR[7].setbuffer(bufcombR8,static_cast( combtuningR8 * m_sampleRatio )); - allpassL[0].setbuffer(bufallpassL1,static_cast( allpasstuningL1 * m_sampleRatio )); - allpassR[0].setbuffer(bufallpassR1,static_cast( allpasstuningR1 * m_sampleRatio )); - allpassL[1].setbuffer(bufallpassL2,static_cast( allpasstuningL2 * m_sampleRatio )); - allpassR[1].setbuffer(bufallpassR2,static_cast( allpasstuningR2 * m_sampleRatio )); - allpassL[2].setbuffer(bufallpassL3,static_cast( allpasstuningL3 * m_sampleRatio )); - allpassR[2].setbuffer(bufallpassR3,static_cast( allpasstuningR3 * m_sampleRatio )); - allpassL[3].setbuffer(bufallpassL4,static_cast( allpasstuningL4 * m_sampleRatio )); - allpassR[3].setbuffer(bufallpassR4,static_cast( allpasstuningR4 * m_sampleRatio )); - - // Set default values - allpassL[0].setfeedback(0.5f); - allpassR[0].setfeedback(0.5f); - allpassL[1].setfeedback(0.5f); - allpassR[1].setfeedback(0.5f); - allpassL[2].setfeedback(0.5f); - allpassR[2].setfeedback(0.5f); - allpassL[3].setfeedback(0.5f); - allpassR[3].setfeedback(0.5f); - setwet(initialwet); - setroomsize(initialroom); - setdry(initialdry); - setdamp(initialdamp); - setwidth(initialwidth); - setmode(initialmode); - - // Buffer will be full of rubbish - so we MUST mute them - mute(); -} - -void revmodel::mute() -{ - int i; - - if (getmode() >= freezemode) - return; - - for (i=0;i 0) - { - outL = outR = 0; - input = (*inputL + *inputR) * gain; - - // Accumulate comb filters in parallel - for(i=0; i 0) - { - outL = outR = 0; - input = (*inputL + *inputR) * gain; - - // Accumulate comb filters in parallel - for(i=0; i= freezemode) - { - roomsize1 = 1; - damp1 = 0; - gain = muted; - } - else - { - roomsize1 = roomsize; - damp1 = damp; - gain = fixedgain; - } - - for(i=0; i= freezemode) - return 1; - else - return 0; -} - -//ends diff --git a/plugins/LadspaEffect/cmt/src/freeverb/Components/revmodel.h b/plugins/LadspaEffect/cmt/src/freeverb/Components/revmodel.h deleted file mode 100644 index 9846eb40de3..00000000000 --- a/plugins/LadspaEffect/cmt/src/freeverb/Components/revmodel.h +++ /dev/null @@ -1,91 +0,0 @@ -// Reverb model declaration -// -// Written by Jezar at Dreampoint, June 2000 -// http://www.dreampoint.co.uk -// This code is public domain - -#ifndef _revmodel_ -#define _revmodel_ - -#include "comb.h" -#include "allpass.h" -#include "tuning.h" - -const int maxSampleRatio = 18; // enough for largest possible samplerate, 8 * 96000 - -class revmodel -{ -public: - revmodel( float sampleRatio ); - void mute(); - void processmix(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip); - void processreplace(float *inputL, float *inputR, float *outputL, float *outputR, long numsamples, int skip); - void setroomsize(float value); - float getroomsize(); - void setdamp(float value); - float getdamp(); - void setwet(float value); - float getwet(); - void setdry(float value); - float getdry(); - void setwidth(float value); - float getwidth(); - void setmode(float value); - float getmode(); -private: - void update(); -private: - float gain; - float roomsize,roomsize1; - float damp,damp1; - float wet,wet1,wet2; - float dry; - float width; - float mode; - - float m_sampleRatio; - - // The following are all declared inline - // to remove the need for dynamic allocation - // with its subsequent error-checking messiness - - // Comb filters - comb combL[numcombs]; - comb combR[numcombs]; - - // Allpass filters - allpass allpassL[numallpasses]; - allpass allpassR[numallpasses]; - - // Buffers for the combs - float bufcombL1[combtuningL1 * maxSampleRatio]; - float bufcombR1[combtuningR1 * maxSampleRatio]; - float bufcombL2[combtuningL2 * maxSampleRatio]; - float bufcombR2[combtuningR2 * maxSampleRatio]; - float bufcombL3[combtuningL3 * maxSampleRatio]; - float bufcombR3[combtuningR3 * maxSampleRatio]; - float bufcombL4[combtuningL4 * maxSampleRatio]; - float bufcombR4[ combtuningR4 * maxSampleRatio ]; - float bufcombL5[ combtuningL5 * maxSampleRatio ]; - float bufcombR5[ combtuningR5 * maxSampleRatio ]; - float bufcombL6[ combtuningL6 * maxSampleRatio ]; - float bufcombR6[ combtuningR6 * maxSampleRatio ]; - float bufcombL7[ combtuningL7 * maxSampleRatio ]; - float bufcombR7[ combtuningR7 * maxSampleRatio ]; - float bufcombL8[ combtuningL8 * maxSampleRatio ]; - float bufcombR8[ combtuningR8 * maxSampleRatio ]; - - // Buffers for the allpasses - float bufallpassL1[ allpasstuningL1 * maxSampleRatio ]; - float bufallpassR1[ allpasstuningR1 * maxSampleRatio ]; - float bufallpassL2[ allpasstuningL2 * maxSampleRatio ]; - float bufallpassR2[ allpasstuningR2 * maxSampleRatio ]; - float bufallpassL3[ allpasstuningL3 * maxSampleRatio ]; - float bufallpassR3[ allpasstuningR3 * maxSampleRatio ]; - float bufallpassL4[ allpasstuningL4 * maxSampleRatio ]; - float bufallpassR4[ allpasstuningR4 * maxSampleRatio ]; -}; - -#endif//_revmodel_ - -//ends diff --git a/plugins/LadspaEffect/cmt/src/freeverb/Components/tuning.h b/plugins/LadspaEffect/cmt/src/freeverb/Components/tuning.h deleted file mode 100644 index ced89252813..00000000000 --- a/plugins/LadspaEffect/cmt/src/freeverb/Components/tuning.h +++ /dev/null @@ -1,60 +0,0 @@ -// Reverb model tuning values -// -// Written by Jezar at Dreampoint, June 2000 -// http://www.dreampoint.co.uk -// This code is public domain - -#ifndef _tuning_ -#define _tuning_ - -const int numcombs = 8; -const int numallpasses = 4; -const float muted = 0; -const float fixedgain = 0.015f; -const float scalewet = 3; -const float scaledry = 2; -const float scaledamp = 0.4f; -const float scaleroom = 0.28f; -const float offsetroom = 0.7f; -const float initialroom = 0.5f; -const float initialdamp = 0.5f; -const float initialwet = 1/scalewet; -const float initialdry = 0; -const float initialwidth = 1; -const float initialmode = 0; -const float freezemode = 0.5f; -const int stereospread = 23; - -// These values assume 44.1KHz sample rate -// they will probably be OK for 48KHz sample rate -// but would need scaling for 96KHz (or other) sample rates. -// The values were obtained by listening tests. -const int combtuningL1 = 1116; -const int combtuningR1 = 1116+stereospread; -const int combtuningL2 = 1188; -const int combtuningR2 = 1188+stereospread; -const int combtuningL3 = 1277; -const int combtuningR3 = 1277+stereospread; -const int combtuningL4 = 1356; -const int combtuningR4 = 1356+stereospread; -const int combtuningL5 = 1422; -const int combtuningR5 = 1422+stereospread; -const int combtuningL6 = 1491; -const int combtuningR6 = 1491+stereospread; -const int combtuningL7 = 1557; -const int combtuningR7 = 1557+stereospread; -const int combtuningL8 = 1617; -const int combtuningR8 = 1617+stereospread; -const int allpasstuningL1 = 556; -const int allpasstuningR1 = 556+stereospread; -const int allpasstuningL2 = 441; -const int allpasstuningR2 = 441+stereospread; -const int allpasstuningL3 = 341; -const int allpasstuningR3 = 341+stereospread; -const int allpasstuningL4 = 225; -const int allpasstuningR4 = 225+stereospread; - -#endif//_tuning_ - -//ends - diff --git a/plugins/LadspaEffect/cmt/src/freeverb/freeverb.cpp b/plugins/LadspaEffect/cmt/src/freeverb/freeverb.cpp deleted file mode 100644 index 418e4d91c47..00000000000 --- a/plugins/LadspaEffect/cmt/src/freeverb/freeverb.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/* freeverb.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. Freeverb is also Copyright (C) 2000 - Jezar. Richard may be contacted at richard@muse.demon.co.uk. [V1 - Ported to LADSPA 15/7/2000 Richard W.E. Furse, V3 ported to CMT - 4/11/2000.] - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "../cmt.h" -#include "Components/revmodel.h" - -/*****************************************************************************/ - -enum { - - FV_Input1 = 0, - FV_Input2, - FV_Output1, - FV_Output2, - FV_Mode, - FV_RoomSize, - FV_Damping, - FV_Wet, - FV_Dry, - FV_Width, - - FV_NumPorts - -}; - -/*****************************************************************************/ - -/** This plugin wraps Jezar's Freeverb free reverberation module - (version 3). */ -class Freeverb3 : public CMT_PluginInstance, public revmodel { -public: - - Freeverb3(const LADSPA_Descriptor *, unsigned long lSampleRate) - : CMT_PluginInstance(FV_NumPorts), - revmodel( (float) lSampleRate / 44100.0f ) - {} - - friend void activateFreeverb3(LADSPA_Handle Instance); - friend void runFreeverb3(LADSPA_Handle Instance, - unsigned long SampleCount); -}; - -/*****************************************************************************/ - -void -activateFreeverb3(LADSPA_Handle Instance) { - Freeverb3 * poFreeverb = (Freeverb3 *)Instance; - poFreeverb->mute(); -} - -/*****************************************************************************/ - -void -runFreeverb3(LADSPA_Handle Instance, - const unsigned long SampleCount) { - - Freeverb3 * poFreeverb = ((Freeverb3 *)Instance); - - /* Handle control ports. Note that this isn't especially efficient - because of the way the update() code works in revmodel.cpp, but - at least this approach allows Freeverb to work with almost no - code changes. */ - - if (*(poFreeverb->m_ppfPorts[FV_Mode]) > 0) - poFreeverb->setmode(1); - else - poFreeverb->setmode(0); - poFreeverb->setdamp(*(poFreeverb->m_ppfPorts[FV_Damping])); - poFreeverb->setwet(*(poFreeverb->m_ppfPorts[FV_Wet])); - poFreeverb->setdry(*(poFreeverb->m_ppfPorts[FV_Dry])); - poFreeverb->setroomsize(*(poFreeverb->m_ppfPorts[FV_RoomSize])); - poFreeverb->setwidth(*(poFreeverb->m_ppfPorts[FV_Width])); - - /* Connect to audio ports and run. */ - - poFreeverb->processreplace(poFreeverb->m_ppfPorts[FV_Input1], - poFreeverb->m_ppfPorts[FV_Input2], - poFreeverb->m_ppfPorts[FV_Output1], - poFreeverb->m_ppfPorts[FV_Output2], - SampleCount, - 1); -} - -/*****************************************************************************/ - -void -initialise_freeverb3() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1123, - "freeverb3", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Freeverb (Version 3)", - CMT_MAKER("Jezar at Dreampoint, ported by Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Jezar at Dreampoint"), - NULL, - CMT_Instantiate, - activateFreeverb3, - runFreeverb3, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Left)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input (Right)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Left)"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output (Right)"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Freeze Mode", - (LADSPA_HINT_TOGGLED - | LADSPA_HINT_DEFAULT_0), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Room Size", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Damping", - (LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Wet Level", - (LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Dry Level", - (LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 1); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Width", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - 1); - - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/freeverb/readme.txt b/plugins/LadspaEffect/cmt/src/freeverb/readme.txt deleted file mode 100644 index 1cc5e8b0097..00000000000 --- a/plugins/LadspaEffect/cmt/src/freeverb/readme.txt +++ /dev/null @@ -1,67 +0,0 @@ -Freeverb - Free, studio-quality reverb SOURCE CODE in the public domain ------------------------------------------------------------------------ - -Written by Jezar at Dreampoint - http://www.dreampoint.co.uk - - -Introduction ------------- - -Hello. - -I'll try to keep this "readme" reasonably small. There are few things in the world that I hate more than long "readme" files. Except "coding conventions" - but more on that later... - -In this zip file you will find two folders of C++ source code: - -"Components" - Contains files that should clean-compile ON ANY TYPE OF COMPUTER OR SYSTEM WHATSOEVER. It should not be necessary to make ANY changes to these files to get them to compile, except to make up for inadequacies of certain compilers. These files create three classes - a comb filter, an allpass filter, and a reverb model made up of a number of instances of the filters, with some features to control the filters at a macro level. You will need to link these classes into another program that interfaces with them. The files in the components drawer are completely independant, and can be built without dependancies on anything else. Because of the simple interface, it should be possible to interface these files to any system - VST, DirectX, anything - without changing them AT ALL. - -"FreeverbVST" - Contains a Steinberg VST implementation of this version of Freeverb, using the components in (surprise) the components folder. It was built on a PC but may compile properly for the Macintosh with no problems. I don't know - I don't have a Macintosh. If you've figured out how to compile the examples in the Steinberg VST Development Kit, then you should easilly figure out how to bring the files into a project and get it working in a few minutes. It should be very simple. - -Note that this version of Freeverb doesn't contain predelay, or any EQ. I thought that might make it difficult to understand the "reverb" part of the code. Once you figure out how Freeverb works, you should find it trivial to add such features with little CPU overhead. - -Also, the code in this version of Freeverb has been optimised. This has changed the sound *slightly*, but not significantly compared to how much processing power it saves. - -Finally, note that there is also a built copy of this version of Freeverb called "Freeverb3.dll" - this is a VST plugin for the PC. If you want a version for the Mac or anything else, then you'll need to build it yourself from the code. - - -Technical Explanation ---------------------- - -Freeverb is a simple implementation of the standard Schroeder/Moorer reverb model. I guess the only reason why it sounds better than other reverbs, is simply because I spent a long while doing listening tests in order to create the values found in "tuning.h". It uses 8 comb filters on both the left and right channels), and you might possibly be able to get away with less if CPU power is a serious constraint for you. It then feeds the result of the reverb through 4 allpass filters on both the left and right channels. These "smooth" the sound. Adding more than four allpasses doesn't seem to add anything significant to the sound, and if you use less, the sound gets a bit "grainy". The filters on the right channel are slightly detuned compared to the left channel in order to create a stereo effect. - -Hopefully, you should find the code in the components drawer a model of brevity and clarity. Notice that I don't use any "coding conventions". Personally, I think that coding conventions suck. They are meant to make the code "clearer", but they inevitably do the complete opposite, making the code completely unfathomable. Anyone whose done Windows programming with its - frankly stupid - "Hungarian notation" will know exactly what I mean. Coding conventions typically promote issues that are irrelevant up to the status of appearing supremely important. It may have helped back people in the days when compilers where somewhat feeble in their type-safety, but not in the new millenium with advanced C++ compilers. - -Imagine if we rewrote the English language to conform to coding conventions. After all, The arguments should be just as valid for the English language as they are for a computer language. For example, we could put a lower-case "n" in front of every noun, a lower-case "p" in front of a persons name, a lower-case "v" in front of every verb, and a lower-case "a" in front of every adjective. Can you imagine what the English language would look like? All in the name of "clarity". It's just as stupid to do this for computer code as it would be to do it for the English language. I hope that the code for Freeverb in the components drawer demonstrates this, and helps start a movement back towards sanity in coding practices. - - -Background ----------- - -Why is the Freeverb code now public domain? Simple. I only intended to create Freeverb to provide me and my friends with studio-quality reverb for free. I never intended to make any money out of it. However, I simply do not have the time to develop it any further. I'm working on a "concept album" at the moment, and I'll never finish it if I spend any more time programming. - -In any case, I make more far money as a contract programmer - making Mobile Internet products - than I ever could writing plugins, so it simply doesn't make financial sense for me to spend any more time on it. - -Rather than give Freeverb to any particular individual or organisation to profit from it, I've decided to give it away to the internet community at large, so that quality, FREE (or at the very least, low-cost) reverbs can be developed for all platforms. - -Feel free to use the source code for Freeverb in any of your own products, whether they are also available for free, or even if they are commercial - I really don't mind. You may do with the code whatever you wish. If you use it in a product (whether commercial or not), it would be very nice of you, if you were to send me a copy of your product - although I appreciate that this isn't always possible in all circumstances. - -HOWEVER, please don't bug me with questions about how to use this code. I gave away Freeverb because I don't have time to maintain it. That means I *certainly* don't have time to answer questions about the source code, so please don't email questions to me. I *will* ignore them. If you can't figure the code for Freeverb out - then find somebody who can. I hope that either way, you enjoy experimenting with it. - - -Disclaimer ----------- - -This software and source code is given away for free, without any warranties of any kind. It has been given away to the internet community as a free gift, so please treat it in the same spirit. - - -I hope this code is useful and interesting to you all! -I hope you have lots of fun experimenting with it and make good products! - -Very best regards, -Jezar. -Technology Consultant -Dreampoint Design and Engineering -http://www.dreampoint.co.uk - - -//ends diff --git a/plugins/LadspaEffect/cmt/src/grain.cpp b/plugins/LadspaEffect/cmt/src/grain.cpp deleted file mode 100644 index 3ec25436e8d..00000000000 --- a/plugins/LadspaEffect/cmt/src/grain.cpp +++ /dev/null @@ -1,401 +0,0 @@ -/* grain.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" -#include "utils.h" - -/*****************************************************************************/ - -/** Period (in seconds) from which grains are selected. */ -#define GRAIN_MAXIMUM_HISTORY 6 -#define GRAIN_MAXIMUM_BLOCK 1 /* (seconds) */ - -#define GRAIN_MAXIMUM_SCATTER (GRAIN_MAXIMUM_HISTORY - GRAIN_MAXIMUM_BLOCK) -#define GRAIN_MAXIMUM_LENGTH (GRAIN_MAXIMUM_HISTORY - GRAIN_MAXIMUM_BLOCK) - -/** What quality should we require when sampling the normal - distribution to generate grain counts? */ -#define GRAIN_NORMAL_RV_QUALITY 16 - -/*****************************************************************************/ - -/** Pointers to this can be used as linked list of grains. */ -class Grain { -private: - - long m_lReadPointer; - long m_lGrainLength; - long m_lAttackTime; - - long m_lRunTime; - - bool m_bFinished; - - LADSPA_Data m_fAttackSlope; - LADSPA_Data m_fDecaySlope; - -public: - - Grain(const long lReadPointer, - const long lGrainLength, - const long lAttackTime) - : m_lReadPointer(lReadPointer), - m_lGrainLength(lGrainLength), - m_lAttackTime(lAttackTime), - m_lRunTime(0), - m_bFinished(false) { - if (lAttackTime <= 0) { - m_fAttackSlope = 0; - m_fDecaySlope = LADSPA_Data(1.0 / lGrainLength); - } - else { - m_fAttackSlope = LADSPA_Data(1.0 / lAttackTime); - if (lAttackTime >= lGrainLength) - m_fDecaySlope = 0; - else - m_fDecaySlope = LADSPA_Data(1.0 / (lGrainLength - lAttackTime)); - } - } - - bool isFinished() const { - return m_bFinished; - } - - /** NULL if end of grain list. */ - Grain * m_poNextGrain; - - void run(const unsigned long lSampleCount, - float * pfOutput, - const float * pfHistoryBuffer, - const unsigned long lHistoryBufferSize) { - - LADSPA_Data fAmp; - if (m_lRunTime < m_lAttackTime) - fAmp = m_fAttackSlope * m_lRunTime; - else - fAmp = m_fDecaySlope * (m_lGrainLength - m_lRunTime); - - for (unsigned long lSampleIndex = 0; - lSampleIndex < lSampleCount; - lSampleIndex++) { - - if (fAmp < 0) { - m_bFinished = true; - break; - } - - *(pfOutput++) += fAmp * pfHistoryBuffer[m_lReadPointer]; - - m_lReadPointer = (m_lReadPointer + 1) & (lHistoryBufferSize - 1); - - if (m_lRunTime < m_lAttackTime) - fAmp += m_fAttackSlope; - else - fAmp -= m_fDecaySlope; - - m_lRunTime++; - } - } -}; - -/*****************************************************************************/ - -#define GRN_INPUT 0 -#define GRN_OUTPUT 1 -#define GRN_DENSITY 2 -#define GRN_SCATTER 3 -#define GRN_GRAIN_LENGTH 4 -#define GRN_GRAIN_ATTACK 5 - -/** This plugin cuts an audio stream up and uses it to generate a - granular texture. */ -class GrainScatter : public CMT_PluginInstance { -private: - - Grain * m_poCurrentGrains; - - long m_lSampleRate; - - LADSPA_Data * m_pfBuffer; - - /** Buffer size, a power of two. */ - unsigned long m_lBufferSize; - - /** Write pointer in buffer. */ - unsigned long m_lWritePointer; - -public: - - GrainScatter(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(6), - m_poCurrentGrains(NULL), - m_lSampleRate(lSampleRate) { - /* Buffer size is a power of two bigger than max delay time. */ - unsigned long lMinimumBufferSize - = (unsigned long)((LADSPA_Data)lSampleRate * GRAIN_MAXIMUM_HISTORY); - m_lBufferSize = 1; - while (m_lBufferSize < lMinimumBufferSize) - m_lBufferSize <<= 1; - m_pfBuffer = new LADSPA_Data[m_lBufferSize]; - } - - ~GrainScatter() { - delete [] m_pfBuffer; - } - - friend void activateGrainScatter(LADSPA_Handle Instance); - friend void runGrainScatter(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -/** Initialise and activate a plugin instance. */ -void -activateGrainScatter(LADSPA_Handle Instance) { - - GrainScatter * poGrainScatter = (GrainScatter *)Instance; - - /* Need to reset the delay history in this function rather than - instantiate() in case deactivate() followed by activate() have - been called to reinitialise a delay line. */ - memset(poGrainScatter->m_pfBuffer, - 0, - sizeof(LADSPA_Data) * poGrainScatter->m_lBufferSize); - - poGrainScatter->m_lWritePointer = 0; -} - -/*****************************************************************************/ - -void -runGrainScatter(LADSPA_Handle Instance, - unsigned long SampleCount) { - - GrainScatter * poGrainScatter = (GrainScatter *)Instance; - - LADSPA_Data * pfInput = poGrainScatter->m_ppfPorts[GRN_INPUT]; - LADSPA_Data * pfOutput = poGrainScatter->m_ppfPorts[GRN_OUTPUT]; - - unsigned long lMaximumSampleCount - = (unsigned long)(poGrainScatter->m_lSampleRate - * GRAIN_MAXIMUM_BLOCK); - - if (SampleCount > lMaximumSampleCount) { - - /* We're beyond our capabilities. We're going to run out of delay - line for a large grain. Divide and conquer. */ - - runGrainScatter(Instance, lMaximumSampleCount); - - poGrainScatter->m_ppfPorts[GRN_INPUT] += lMaximumSampleCount; - poGrainScatter->m_ppfPorts[GRN_OUTPUT] += lMaximumSampleCount; - runGrainScatter(Instance, SampleCount - lMaximumSampleCount); - poGrainScatter->m_ppfPorts[GRN_INPUT] = pfInput; - poGrainScatter->m_ppfPorts[GRN_OUTPUT] = pfOutput; - - } - else { - - /* Move the delay line along. */ - if (poGrainScatter->m_lWritePointer - + SampleCount - > poGrainScatter->m_lBufferSize) { - memcpy(poGrainScatter->m_pfBuffer + poGrainScatter->m_lWritePointer, - pfInput, - sizeof(LADSPA_Data) * (poGrainScatter->m_lBufferSize - - poGrainScatter->m_lWritePointer)); - memcpy(poGrainScatter->m_pfBuffer, - pfInput + (poGrainScatter->m_lBufferSize - - poGrainScatter->m_lWritePointer), - sizeof(LADSPA_Data) * (SampleCount - - (poGrainScatter->m_lBufferSize - - poGrainScatter->m_lWritePointer))); - } - else { - memcpy(poGrainScatter->m_pfBuffer + poGrainScatter->m_lWritePointer, - pfInput, - sizeof(LADSPA_Data) * SampleCount); - } - poGrainScatter->m_lWritePointer - = ((poGrainScatter->m_lWritePointer + SampleCount) - & (poGrainScatter->m_lBufferSize - 1)); - - /* Empty the output buffer. */ - memset(pfOutput, 0, SampleCount * sizeof(LADSPA_Data)); - - /* Process current grains. */ - Grain ** ppoGrainReference = &(poGrainScatter->m_poCurrentGrains); - while (*ppoGrainReference != NULL) { - (*ppoGrainReference)->run(SampleCount, - pfOutput, - poGrainScatter->m_pfBuffer, - poGrainScatter->m_lBufferSize); - if ((*ppoGrainReference)->isFinished()) { - Grain *poNextGrain = (*ppoGrainReference)->m_poNextGrain; - delete *ppoGrainReference; - *ppoGrainReference = poNextGrain; - } - else { - ppoGrainReference = &((*ppoGrainReference)->m_poNextGrain); - } - } - - LADSPA_Data fSampleRate = LADSPA_Data(poGrainScatter->m_lSampleRate); - LADSPA_Data fDensity - = BOUNDED_BELOW(*(poGrainScatter->m_ppfPorts[GRN_DENSITY]), - 0); - - /* We want to average fDensity new grains per second. We need to - use a RNG to generate a new grain count from the fraction of a - second we are dealing with. Use a normal distribution and - choose standard deviation also to be fDensity. This could be - separately parameterised but any guarantees could be confusing - given that individual grains are uniformly distributed within - the block. Note that fDensity isn't quite grains/sec as we - discard negative samples from the RV. */ - double dGrainCountRV_Mean = fDensity * SampleCount / fSampleRate; - double dGrainCountRV_SD = dGrainCountRV_Mean; - double dGrainCountRV = sampleNormalDistribution(dGrainCountRV_Mean, - dGrainCountRV_SD, - GRAIN_NORMAL_RV_QUALITY); - unsigned long lNewGrainCount = 0; - if (dGrainCountRV > 0) - lNewGrainCount = (unsigned long)(0.5 + dGrainCountRV); - if (lNewGrainCount > 0) { - - LADSPA_Data fScatter - = BOUNDED(*(poGrainScatter->m_ppfPorts[GRN_SCATTER]), - 0, - GRAIN_MAXIMUM_SCATTER); - LADSPA_Data fGrainLength - = BOUNDED_BELOW(*(poGrainScatter->m_ppfPorts[GRN_GRAIN_LENGTH]), - 0); - LADSPA_Data fAttack - = BOUNDED_BELOW(*(poGrainScatter->m_ppfPorts[GRN_GRAIN_ATTACK]), - 0); - - long lScatterSampleWidth - = long(fSampleRate * fScatter) + 1; - long lGrainLength - = long(fSampleRate * fGrainLength); - long lAttackTime - = long(fSampleRate * fAttack); - - for (unsigned long lIndex = 0; lIndex < lNewGrainCount; lIndex++) { - - long lOffset = rand() % SampleCount; - - long lGrainReadPointer - = (poGrainScatter->m_lWritePointer - - SampleCount - + lOffset - - (rand() % lScatterSampleWidth)); - while (lGrainReadPointer < 0) - lGrainReadPointer += poGrainScatter->m_lBufferSize; - lGrainReadPointer &= (poGrainScatter->m_lBufferSize - 1); - - Grain * poNewGrain = new Grain(lGrainReadPointer, - lGrainLength, - lAttackTime); - - poNewGrain->m_poNextGrain = poGrainScatter->m_poCurrentGrains; - poGrainScatter->m_poCurrentGrains = poNewGrain; - - poNewGrain->run(SampleCount - lOffset, - pfOutput + lOffset, - poGrainScatter->m_pfBuffer, - poGrainScatter->m_lBufferSize); - } - } - } -} - -/*****************************************************************************/ - -void -initialise_grain() { - - CMT_Descriptor * psDescriptor = new CMT_Descriptor - (1096, - "grain_scatter", - 0, - "Granular Scatter Processor", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateGrainScatter, - runGrainScatter, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Density (Grains/s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 10); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Scatter (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, - GRAIN_MAXIMUM_SCATTER); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Grain Length (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.2); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Grain Attack (s)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 0.05); - - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/hardgate.cpp b/plugins/LadspaEffect/cmt/src/hardgate.cpp deleted file mode 100644 index a2f04b10e96..00000000000 --- a/plugins/LadspaEffect/cmt/src/hardgate.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* hardgate.cpp - - (c) 2002 Nathaniel Virgo - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -namespace hardgate { - - enum { - port_threshold = 0, - port_input = 1, - port_output = 2, - n_ports = 3 - }; - -/** This plugin sets its input signal to 0 if it falls below a threshold. */ - class Plugin : public CMT_PluginInstance { - public: - - Plugin(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(n_ports) { - } - - friend void run(LADSPA_Handle instance, - unsigned long sample_count); - - }; - - void run(LADSPA_Handle instance, - unsigned long sample_count) { - - Plugin *pp = (Plugin *) instance; - - LADSPA_Data threshold = *pp->m_ppfPorts[port_threshold]; - LADSPA_Data * in = pp->m_ppfPorts[port_input]; - LADSPA_Data * out = pp->m_ppfPorts[port_output]; - - for ( unsigned long i = 0; i < sample_count ; ++i ) - { - LADSPA_Data insig = *(in++); - if ( insig < threshold && insig > -threshold ) - *(out++) = 0.0f; - else - *(out++) = insig; - } - } - - void - initialise() { - - CMT_Descriptor * d = new CMT_Descriptor - (1845, - "hard_gate", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Hard Gate", - CMT_MAKER("Nathaniel Virgo"), - CMT_COPYRIGHT("2002", "Nathaniel Virgo"), - NULL, - CMT_Instantiate, - NULL, - run, - NULL, - NULL, - NULL); - - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Threshold", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_0), - 0, - 1); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - d->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - - registerNewPluginDescriptor(d); - - } - -} // end of namespace - -/*****************************************************************************/ - -/* EOF */ - - - - - diff --git a/plugins/LadspaEffect/cmt/src/init.cpp b/plugins/LadspaEffect/cmt/src/init.cpp deleted file mode 100644 index f232840fa9c..00000000000 --- a/plugins/LadspaEffect/cmt/src/init.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* init.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -void initialise_modules(); -void finalise_modules(); - -/*****************************************************************************/ - -int -pluginNameComparator(const void * pvDescriptor1, const void * pvDescriptor2) { - - const CMT_Descriptor * psDescriptor1 - = *(const CMT_Descriptor **)pvDescriptor1; - const CMT_Descriptor * psDescriptor2 - = *(const CMT_Descriptor **)pvDescriptor2; - - int iResult = strcmp(psDescriptor1->Name, psDescriptor2->Name); - if (iResult < 0) - return -1; - else if (iResult > 0) - return 1; - else - return 0; -} - -/*****************************************************************************/ - -CMT_Descriptor ** g_ppsRegisteredDescriptors = NULL; -unsigned long g_lPluginCapacity = 0; -unsigned long g_lPluginCount = 0; - -/*****************************************************************************/ - -#define CAPACITY_STEP 20 - -void -registerNewPluginDescriptor(CMT_Descriptor * psDescriptor) { - if (g_lPluginCapacity == g_lPluginCount) { - /* Full. Enlarge capacity. */ - CMT_Descriptor ** ppsOldDescriptors - = g_ppsRegisteredDescriptors; - g_ppsRegisteredDescriptors - = new CMT_Descriptor_ptr[g_lPluginCapacity + CAPACITY_STEP]; - if (g_lPluginCapacity > 0) { - memcpy(g_ppsRegisteredDescriptors, - ppsOldDescriptors, - g_lPluginCapacity * sizeof(CMT_Descriptor_ptr)); - delete [] ppsOldDescriptors; - } - g_lPluginCapacity += CAPACITY_STEP; - } - g_ppsRegisteredDescriptors[g_lPluginCount++] = psDescriptor; -} - -/*****************************************************************************/ - -/** A global object of this class is used to perform initialisation - and shutdown services for the entire library. The constructor is - run when the library is loaded and the destructor when it is - unloaded. */ -class StartupShutdownHandler { -public: - - StartupShutdownHandler() { - initialise_modules(); - qsort(g_ppsRegisteredDescriptors, - g_lPluginCount, - sizeof(CMT_Descriptor_ptr), - pluginNameComparator); - } - - ~StartupShutdownHandler() { - if (g_ppsRegisteredDescriptors != NULL) { - for (unsigned long lIndex = 0; lIndex < g_lPluginCount; lIndex++) - delete g_ppsRegisteredDescriptors[lIndex]; - delete [] g_ppsRegisteredDescriptors; - } - finalise_modules(); - } - -} ; - -/*****************************************************************************/ - -extern "C" -{ - -const LADSPA_Descriptor * -ladspa_descriptor(unsigned long Index) { - - static StartupShutdownHandler handler; - - if (Index < g_lPluginCount) - return g_ppsRegisteredDescriptors[Index]; - else - return NULL; -} - -}; - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/ladspa_types.h b/plugins/LadspaEffect/cmt/src/ladspa_types.h deleted file mode 100644 index 31197b31bb2..00000000000 --- a/plugins/LadspaEffect/cmt/src/ladspa_types.h +++ /dev/null @@ -1,80 +0,0 @@ -/* ladspa_types.h - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef CMT_LADSPA_TYPES_INCLUDED -#define CMT_LADSPA_TYPES_INCLUDED - -/*****************************************************************************/ - -#include - -/* Compatibility hack for version 1.0. */ -#ifndef LADSPA_VERSION_MAJOR -#define LADSPA_HINT_DEFAULT_MINIMUM 0x40 -#define LADSPA_HINT_DEFAULT_LOW 0x80 -#define LADSPA_HINT_DEFAULT_MIDDLE 0xC0 -#define LADSPA_HINT_DEFAULT_HIGH 0x100 -#define LADSPA_HINT_DEFAULT_MAXIMUM 0x140 -#define LADSPA_HINT_DEFAULT_0 0x200 -#define LADSPA_HINT_DEFAULT_1 0x240 -#define LADSPA_HINT_DEFAULT_100 0x280 -#define LADSPA_HINT_DEFAULT_440 0x2C0 -#endif - -/*****************************************************************************/ - -typedef LADSPA_Handle (*LADSPA_Instantiate_Function) - (const struct _LADSPA_Descriptor * Descriptor, - unsigned long SampleRate); - -typedef void (*LADSPA_Connect_Port_Function) - (LADSPA_Handle Instance, - unsigned long Port, - LADSPA_Data * DataLocation); - -typedef void (*LADSPA_Activate_Function) - (LADSPA_Handle Instance); - -typedef void (*LADSPA_Run_Function) - (LADSPA_Handle Instance, - unsigned long SampleCount); - -typedef void (*LADSPA_Run_Adding_Function) - (LADSPA_Handle Instance, - unsigned long SampleCount); - -typedef void (*LADSPA_Set_Run_Adding_Gain_Function) - (LADSPA_Handle Instance, - LADSPA_Data Gain); - -typedef void (*LADSPA_Deactivate_Function) - (LADSPA_Handle Instance); - -typedef void (*LADSPA_Cleanup_Function) - (LADSPA_Handle Instance); - -typedef LADSPA_Data * LADSPA_Data_ptr; - -/*****************************************************************************/ - -#endif - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/lofi.cpp b/plugins/LadspaEffect/cmt/src/lofi.cpp deleted file mode 100644 index 67be8008d08..00000000000 --- a/plugins/LadspaEffect/cmt/src/lofi.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/* lofi.cpp - - Lo Fi - Simulate low quality audio equipment - Copyright (c) 2001 David A. Bartold - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include -#include "cmt.h" - -#define PORT_IN_LEFT 0 -#define PORT_IN_RIGHT 1 -#define PORT_OUT_LEFT 2 -#define PORT_OUT_RIGHT 3 -#define PORT_CRACKLING 4 -#define PORT_OVERLOADING 5 -#define PORT_BANDWIDTH 6 - -#define NUM_PORTS 7 - -#ifndef PI -#define PI 3.14159265358979 -#endif - -#ifndef MIN -#define MIN(x,y) ((x)<(y)?(x):(y)) -#endif - -#ifndef MAX -#define MAX(x,y) ((x)>(y)?(x):(y)) -#endif - -class Pop -{ -public: - float x; - float dx; - float amp; - float pwr; - Pop *next; - - Pop (float dx, float amp, float pwr, Pop *next); - ~Pop (); -}; - -Pop::Pop (float _dx, - float _amp, - float _pwr, - Pop *_next) - : x (0.0), dx (_dx), amp (_amp), pwr (_pwr), next (_next) -{ -} - -Pop::~Pop () -{ - delete next; -} - - -class Record -{ -public: - int rate; - int amount; /* 0 -> 100% */ - Pop *pops; - - LADSPA_Data process (LADSPA_Data sample); - void setAmount (int _amount); - - Record (int sample_rate); - ~Record (); -}; - -Record::Record (int sample_rate) - : rate (sample_rate), - amount (0), - pops (NULL) -{ -} - -Record::~Record () -{ - delete pops; -} - -static Pop * -record_pop_new (Record *record, - Pop *next) -{ - return new Pop ((rand () % 1500 + 500.0) / record->rate, - (rand () % 50) / 10000.0, - 1.0, - next); -} - -static Pop * -record_pop_loud_new (Record *record, - Pop *next) -{ - return new Pop ((rand () % 500 + 2500.0) / record->rate, - (rand () % 100) / 400.0 + 0.5, - (rand () % 50) / 20.0, - next); -} - -LADSPA_Data -Record::process (LADSPA_Data sample) -{ - Pop *pop; - Pop **pop_prev; - - /* Add some crackle */ - if (rand () % rate < rate * amount / 4000) - pops = record_pop_new (this, pops); - - /* Add some loud pops */ - if (rand () % (rate * 10) < rate * amount / 400000) - pops = record_pop_loud_new (this, pops); - - /* Compute pops */ - pop_prev = &pops; - pop = *pop_prev; - while (pop != NULL) - { - if (pop->x >= 0.5) - sample += (pow ((1.0 - pop->x) * 2.0, pop->pwr) - 0.5) * pop->amp; - else - sample += (pow (pop->x * 2.0, pop->pwr) - 0.5) * pop->amp; - - pop->x += pop->dx; - if (pop->x > 1.0) - { - *pop_prev = pop->next; - pop->next = NULL; - delete pop; - } - else - pop_prev = &pop->next; - - pop = *pop_prev; - } - - return sample; -} - -void -Record::setAmount (int _amount) -{ - amount = _amount; -} - - -class Compressor -{ -public: - int rate; - double amp; - double up; - double down; - float vol; - float clamp_hi; - float clamp_lo; - - LADSPA_Data process (LADSPA_Data sample); - void setClamp (float clamp); - - Compressor (int sample_rate, float clamp); -}; - -Compressor::Compressor (int sample_rate, float clamp) - : rate (sample_rate), amp (0.5), - up (1.0 / pow (0.5, 20.0 / sample_rate)), - down (pow (0.5, 50.0 / sample_rate)), - vol (0.5), clamp_hi (clamp), clamp_lo (1.0 / clamp) -{ -} - -LADSPA_Data -Compressor::process (LADSPA_Data sample) -{ - sample *= amp; - - if (fabs (sample) > vol) - { - amp *= down; - if (amp < clamp_lo) - amp = clamp_lo; - } - else - { - amp *= up; - if (amp > clamp_hi) - amp = clamp_hi; - } - - return sample; -} - -void -Compressor::setClamp (float clamp) -{ - clamp_hi = clamp; - clamp_lo = 1.0 / clamp; -} - - -static inline LADSPA_Data -distort (LADSPA_Data in) -{ - if (in > 0.0F) - return (in * 1.0F) / (in + 1.0F) * 2.0F; - else - return -(-in * 1.0F) / (-in + 1.0F) * 2.0F; -} - - -class BandwidthLimit -{ -public: - int rate; - float x; - float dx; - - void setFreq (float freq); - - LADSPA_Data process (LADSPA_Data sample); - BandwidthLimit (int _rate, float _freq); -}; - -BandwidthLimit::BandwidthLimit (int _rate, float _freq) - : rate (_rate), x (0.0), dx (_freq / _rate) -{ -} - -LADSPA_Data -BandwidthLimit::process (LADSPA_Data sample) -{ - if (sample >= x) - sample = MIN (x + dx, sample); - else - sample = MAX (x - dx, sample); - x = sample; - - return sample; -} - -void -BandwidthLimit::setFreq (float freq) -{ - dx = freq / rate; -} - - -class LoFi : public CMT_PluginInstance { - Record *record; - Compressor *compressor; - BandwidthLimit *bandwidth_l; - BandwidthLimit *bandwidth_r; - -public: - LoFi(const LADSPA_Descriptor *, - unsigned long s_rate) - : CMT_PluginInstance (NUM_PORTS), - record (new Record (s_rate * 2)), - compressor (new Compressor (s_rate * 2, 1.6)), - bandwidth_l (new BandwidthLimit (s_rate, 8000.0)), - bandwidth_r (new BandwidthLimit (s_rate, 8000.0)) { - } - - ~LoFi() { - delete bandwidth_l; - delete bandwidth_r; - delete compressor; - delete record; - } - - static void - activate (LADSPA_Handle Instance) { - LoFi *lofi = (LoFi*) Instance; - - lofi->bandwidth_l->setFreq (8000); - lofi->bandwidth_r->setFreq (8000); - lofi->compressor->setClamp (1.6); - lofi->record->setAmount (0); - } - - static void - run(LADSPA_Handle Instance, - unsigned long SampleCount) { - LoFi *lofi = (LoFi*) Instance; - unsigned long i; - LADSPA_Data **ports = lofi->m_ppfPorts; - LADSPA_Data clamp; - - lofi->bandwidth_l->setFreq (ports[PORT_BANDWIDTH][0]); - lofi->bandwidth_r->setFreq (ports[PORT_BANDWIDTH][0]); - - if (ports[PORT_OVERLOADING][0] > 99.0) - clamp = 100.0; - else - clamp = 100.0 / (100.0 - ports[PORT_OVERLOADING][0]); - - lofi->compressor->setClamp (clamp); - - lofi->record->setAmount ((int) ports[PORT_CRACKLING][0]); - - for (i = 0; i < SampleCount; i++) - { - LADSPA_Data sample_l, sample_r; - - sample_l = ports[PORT_IN_LEFT][i]; - sample_r = ports[PORT_IN_RIGHT][i]; - - sample_l = lofi->compressor->process (sample_l); - sample_r = lofi->compressor->process (sample_r); - sample_l = lofi->bandwidth_l->process (sample_l); - sample_r = lofi->bandwidth_r->process (sample_r); - sample_l = distort (sample_l); - sample_r = distort (sample_r); - sample_l = lofi->record->process (sample_l); - sample_r = lofi->record->process (sample_r); - - ports[PORT_OUT_LEFT][i] = sample_l; - ports[PORT_OUT_RIGHT][i] = sample_r; - } - } -}; - - -static LADSPA_PortDescriptor g_psPortDescriptors[] = -{ - LADSPA_PORT_AUDIO | LADSPA_PORT_INPUT, - LADSPA_PORT_AUDIO | LADSPA_PORT_INPUT, - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT -}; - -static const char * const g_psPortNames[] = -{ - "In (Left)", - "In (Right)", - - "Out (Left)", - "Out (Right)", - - "Crackling (%)", - "Powersupply Overloading (%)", - "Opamp Bandwidth Limiting (Hz)" -}; - -static LADSPA_PortRangeHint g_psPortRangeHints[] = -{ - /* Hints, Lower bound, Upper bound */ - { 0, 0.0, 0.0 }, - { 0, 0.0, 0.0 }, - { 0, 0.0, 0.0 }, - { 0, 0.0, 0.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 100.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 100.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 1.0, 10000.0 } -}; - -void -initialise_lofi() { - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1227, - "lofi", - 0 /* Sorry, this module is not RT capable, run() calls malloc() */, - "Lo Fi", - CMT_MAKER("David A. Bartold"), - CMT_COPYRIGHT("2001", "David A. Bartold"), - NULL, - CMT_Instantiate, - LoFi::activate, - LoFi::run, - NULL, - NULL, - NULL); - - for (int i = 0; i < NUM_PORTS; i++) - psDescriptor->addPort( - g_psPortDescriptors[i], - g_psPortNames[i], - g_psPortRangeHints[i].HintDescriptor, - g_psPortRangeHints[i].LowerBound, - g_psPortRangeHints[i].UpperBound); - - registerNewPluginDescriptor(psDescriptor); -} diff --git a/plugins/LadspaEffect/cmt/src/logistic.cpp b/plugins/LadspaEffect/cmt/src/logistic.cpp deleted file mode 100644 index b2dfcb7fbf5..00000000000 --- a/plugins/LadspaEffect/cmt/src/logistic.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* logistic.cpp - - A sample-and-hold logistic map control generator - - (c) 2002 Nathaniel Virgo - - Part of the Computer Music Toolkit - a library of LADSPA plugins. - The Computer Music Toolkit is Copyright (C) 2000-2002 - Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" - -#include "pinknoise.h" -#include "utils.h" - -/*****************************************************************************/ - -namespace logistic { - - enum { - port_r = 0, - port_frequency = 1, - port_output = 2, - n_ports = 3 - }; - - /** This plugin uses the logistic map to generate periodic or - chaotic control signals. */ - class Plugin : public CMT_PluginInstance { - private: - LADSPA_Data sample_rate; - LADSPA_Data x; - unsigned counter; - public: - - Plugin(const LADSPA_Descriptor *, - unsigned long s_rate) : - CMT_PluginInstance(n_ports), - sample_rate(s_rate) { - } - - ~Plugin() { - } - - friend void activate(LADSPA_Handle instance); - - friend void run(LADSPA_Handle instance, - unsigned long sample_count); - }; - - void activate(LADSPA_Handle instance) { - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - p.x = 0.3; // arbitrary non-zero value. - } - - void run(LADSPA_Handle instance, - unsigned long sample_count) { - - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - LADSPA_Data r = *pp->m_ppfPorts[port_r]; - LADSPA_Data frequency = *pp->m_ppfPorts[port_frequency]; - LADSPA_Data * out = pp->m_ppfPorts[port_output]; - - frequency = BOUNDED_ABOVE(frequency,p.sample_rate); - r = BOUNDED_ABOVE(r,4); - unsigned remain = sample_count; - - if (frequency > 0) { - while (remain) { - unsigned jump_samples = (remain, - activate, - run, - NULL, - NULL, - NULL); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "\"r\" parameter", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MAXIMUM), - 2.9, 3.9999); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Step frequency", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_SAMPLE_RATE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0, 0.001); - d->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(d); - } - -} // end of namespace - -/*****************************************************************************/ - -/* EOF */ - diff --git a/plugins/LadspaEffect/cmt/src/mixer.cpp b/plugins/LadspaEffect/cmt/src/mixer.cpp deleted file mode 100644 index 32d3ec4a74b..00000000000 --- a/plugins/LadspaEffect/cmt/src/mixer.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* mixer.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -/* The port numbers for the plugin: */ - -#define MIXER_INPUT1 0 -#define MIXER_INPUT2 1 -#define MIXER_OUTPUT 2 - -/** This plugin adds two signals together to produce a third. */ -class SimpleMixer : public CMT_PluginInstance { -public: - - SimpleMixer(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(3) { - } - - friend void runSimpleMixer(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -void -runSimpleMixer(LADSPA_Handle Instance, - unsigned long SampleCount) { - - SimpleMixer * poMixer = (SimpleMixer *)Instance; - - LADSPA_Data * pfInput1 = poMixer->m_ppfPorts[MIXER_INPUT1]; - LADSPA_Data * pfInput2 = poMixer->m_ppfPorts[MIXER_INPUT2]; - LADSPA_Data * pfOutput = poMixer->m_ppfPorts[MIXER_OUTPUT]; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) - *(pfOutput++) = *(pfInput1++) + *(pfInput2++); -} - -/*****************************************************************************/ - -void -initialise_mixer() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1071, - "mixer", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Mixer (Stereo to Mono)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runSimpleMixer, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input 1"); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input 2"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/noise.cpp b/plugins/LadspaEffect/cmt/src/noise.cpp deleted file mode 100644 index bf6c5a89fc4..00000000000 --- a/plugins/LadspaEffect/cmt/src/noise.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* noise.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -/* The port numbers for the plugin: */ - -#define NOISE_AMPLITUDE 0 -#define NOISE_OUTPUT 1 - -/** Plugin that provides white noise output. This is provided by - calling rand() repeatedly. */ -class WhiteNoise : public CMT_PluginInstance { -private: - - LADSPA_Data m_fRunAddingGain; - -public: - - WhiteNoise(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(2) { - } - - friend void runWhiteNoise(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runWhiteNoiseAdding(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void setWhiteNoiseRunAddingGain(LADSPA_Handle Instance, - LADSPA_Data Gain); - -}; - -/*****************************************************************************/ - -void -runWhiteNoise(LADSPA_Handle Instance, - unsigned long SampleCount) { - - WhiteNoise * poNoise = (WhiteNoise *)Instance; - - LADSPA_Data fAmplitude = *(poNoise->m_ppfPorts[NOISE_AMPLITUDE]); - LADSPA_Data fScalar = fAmplitude * LADSPA_Data(2.0 / RAND_MAX); - - LADSPA_Data * pfOutput = poNoise->m_ppfPorts[NOISE_OUTPUT]; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) - *(pfOutput++) = rand() * fScalar - fAmplitude; -} - -void -runWhiteNoiseAdding(LADSPA_Handle Instance, - unsigned long SampleCount) { - - WhiteNoise * poNoise = (WhiteNoise *)Instance; - - LADSPA_Data fAmplitude - = *(poNoise->m_ppfPorts[NOISE_AMPLITUDE]); - LADSPA_Data fScalar - = poNoise->m_fRunAddingGain * fAmplitude * LADSPA_Data(2.0 / RAND_MAX); - - LADSPA_Data * pfOutput = poNoise->m_ppfPorts[NOISE_OUTPUT]; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) - *(pfOutput++) += rand() * fScalar - fAmplitude; - -} - -void -setWhiteNoiseRunAddingGain(LADSPA_Handle Instance, - LADSPA_Data Gain) { -} - -/*****************************************************************************/ - -void -initialise_noise() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1069, - "noise_source_white", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Noise Source (White)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runWhiteNoise, - runWhiteNoiseAdding, - setWhiteNoiseRunAddingGain, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Amplitude", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/null.cpp b/plugins/LadspaEffect/cmt/src/null.cpp deleted file mode 100644 index afae4f48c67..00000000000 --- a/plugins/LadspaEffect/cmt/src/null.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* null.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -/* The port numbers for the plugin: */ - -#define NULL_PORT 0 - -/** This plugin can be used to take care of unwanted connections in a - host's plugin network by generating zero data and audio or - accepting (but ignoring) data and audio. */ -class NullPlugin : public CMT_PluginInstance { -public: - - NullPlugin(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(1) { - } - - friend void runNull_Nop(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runNull_OutputAudio(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runNull_OutputControl(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -#define IDENTITY_INPUT 0 -#define IDENTITY_OUTPUT 1 - -/* This plugin passes its input to its output. There are audio and - control varieties. */ -class IdentityPlugin : public CMT_PluginInstance { -public: - - IdentityPlugin(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(2) { - } - - friend void runIdentity_Audio(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runIdentity_Control(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -void -runNull_Nop(LADSPA_Handle Instance, - unsigned long SampleCount) { - /* Nothing to do. */ -} - -/*****************************************************************************/ - -void -runNull_OutputAudio(LADSPA_Handle Instance, - unsigned long SampleCount) { - NullPlugin * poPlugin = (NullPlugin *)Instance; - memset(poPlugin->m_ppfPorts[NULL_PORT], - 0, - sizeof(LADSPA_Data) * SampleCount); -} - -/*****************************************************************************/ - -void -runNull_OutputControl(LADSPA_Handle Instance, - unsigned long) { - NullPlugin * poPlugin = (NullPlugin *)Instance; - *(poPlugin->m_ppfPorts[NULL_PORT]) = 0; -} - -/*****************************************************************************/ - -void -runIdentity_Audio(LADSPA_Handle Instance, - unsigned long SampleCount) { - IdentityPlugin * poPlugin = (IdentityPlugin *)Instance; - if (poPlugin->m_ppfPorts[IDENTITY_OUTPUT] - != poPlugin->m_ppfPorts[IDENTITY_INPUT]) - memcpy(poPlugin->m_ppfPorts[IDENTITY_OUTPUT], - poPlugin->m_ppfPorts[IDENTITY_INPUT], - sizeof(LADSPA_Data) * SampleCount); -} - -/*****************************************************************************/ - -void -runIdentity_Control(LADSPA_Handle Instance, - unsigned long) { - IdentityPlugin * poPlugin = (IdentityPlugin *)Instance; - *(poPlugin->m_ppfPorts[IDENTITY_OUTPUT]) - = *(poPlugin->m_ppfPorts[IDENTITY_INPUT]); -} - -/*****************************************************************************/ - -void -initialise_null() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1083, - "null_ci", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Null (Control Input)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runNull_Nop, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Input"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1084, - "null_ai", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Null (Audio Input)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runNull_Nop, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1085, - "null_co", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Null (Control Output)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runNull_OutputControl, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1086, - "null_ao", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Null (Audio Output)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runNull_OutputAudio, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1098, - "identity_audio", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Identity (Audio)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runIdentity_Audio, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1099, - "identity_control", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Identity (Control)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runIdentity_Control, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL, - "Output"); - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/organ.cpp b/plugins/LadspaEffect/cmt/src/organ.cpp deleted file mode 100644 index f05d6b02ffb..00000000000 --- a/plugins/LadspaEffect/cmt/src/organ.cpp +++ /dev/null @@ -1,375 +0,0 @@ -/* organ.cpp - - Organ - Additive Organ Synthesizer Voice - Copyright (c) 1999, 2000 David A. Bartold - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include -#include "cmt.h" - -#define PORT_OUT 0 -#define PORT_GATE 1 -#define PORT_VELOCITY 2 -#define PORT_FREQ 3 -#define PORT_BRASS 4 -#define PORT_FLUTE 5 -#define PORT_REED 6 -#define PORT_HARM0 7 -#define PORT_HARM1 8 -#define PORT_HARM2 9 -#define PORT_HARM3 10 -#define PORT_HARM4 11 -#define PORT_HARM5 12 -#define PORT_ATTACK_LO 13 -#define PORT_DECAY_LO 14 -#define PORT_SUSTAIN_LO 15 -#define PORT_RELEASE_LO 16 -#define PORT_ATTACK_HI 17 -#define PORT_DECAY_HI 18 -#define PORT_SUSTAIN_HI 19 -#define PORT_RELEASE_HI 20 - -#define NUM_PORTS 21 - -#define RESOLUTION 16384 - -#ifndef PI -#define PI 3.14159265358979 -#endif - -typedef struct Envelope -{ - int envelope_decay; - double envelope; - - Envelope () : envelope_decay (0), envelope (0.0) {} -} Envelope; - -static LADSPA_Data *g_sine_table; -static LADSPA_Data *g_triangle_table; -static LADSPA_Data *g_pulse_table; -static int ref_count; - -class Organ : CMT_PluginInstance -{ - LADSPA_Data sample_rate; - - Envelope env0; - Envelope env1; - - unsigned long harm0_accum; - unsigned long harm1_accum; - unsigned long harm2_accum; - unsigned long harm3_accum; - unsigned long harm4_accum; - unsigned long harm5_accum; - - public: - - Organ(const LADSPA_Descriptor * Descriptor, - unsigned long SampleRate) - : CMT_PluginInstance(NUM_PORTS), - sample_rate(SampleRate), - harm0_accum(0), harm1_accum(0), - harm2_accum(0), harm3_accum(0), - harm4_accum(0), harm5_accum(0) { - if (ref_count++ == 0) - { - int size = RESOLUTION; - int half = size / 2; - int slope = size / 10; - int i; - - /* Initialize sine table. */ - g_sine_table = new LADSPA_Data[size]; - for (i = 0; i < size; i++) - g_sine_table[i] = sin ((i * 2.0 * PI) / size) / 6.0; - - /* Initialize triangle table. */ - g_triangle_table = new LADSPA_Data[size]; - for (i = 0; i < half; i++) - g_triangle_table[i] = (4.0 / size * i - 1.0) / 6.0; - for (; i < size; i++) - g_triangle_table[i] = (4.0 / size * (size - i) - 1.0) / 6.0; - - /* Initialize pulse table. */ - g_pulse_table = new LADSPA_Data[size]; - for (i = 0; i < slope; i++) - g_pulse_table[i] = ((double) -i) / slope / 6.0; - for (; i < half - slope; i++) - g_pulse_table[i] = -1.0 / 6.0; - for (; i < half + slope; i++) - g_pulse_table[i] = ((double) i - half) / slope / 6.0; - for (; i < size - slope; i++) - g_pulse_table[i] = 1.0 / 6.0; - for (; i < size; i++) - g_pulse_table[i] = ((double) size - i) / slope / 6.0; - } - } - - ~Organ () { - if (--ref_count == 0) - { - delete[] g_pulse_table; - delete[] g_triangle_table; - delete[] g_sine_table; - } - } - - static inline LADSPA_Data - table_pos (LADSPA_Data *table, - unsigned long freq_256, - unsigned long *accum) { - *accum += freq_256; - while (*accum >= RESOLUTION * 256) - *accum -= RESOLUTION * 256; - - return table[*accum >> 8]; - } - - static inline LADSPA_Data - envelope(Envelope *env, - int gate, - LADSPA_Data attack, - LADSPA_Data decay, - LADSPA_Data sustain, - LADSPA_Data release) - { - if (gate) - if (env->envelope_decay == 0) - { - env->envelope += (1.0F - env->envelope) * attack; - if (env->envelope >= 0.95F) - env->envelope_decay = 1; - } - else - env->envelope += (sustain - env->envelope) * decay; - else - env->envelope += -env->envelope * release; - - return env->envelope; - } - - static inline LADSPA_Data - multiplier(Organ *organ, - LADSPA_Data value) { - return 1.0 - pow (0.05, 1.0 / (organ->sample_rate * value)); - } - - static void - activate(LADSPA_Handle Instance) { - Organ *organ = (Organ*) Instance; - - organ->env0.envelope_decay = 0; - organ->env0.envelope = 0.0; - organ->env1.envelope_decay = 0; - organ->env1.envelope = 0.0; - organ->harm0_accum = 0; - organ->harm1_accum = 0; - organ->harm2_accum = 0; - organ->harm3_accum = 0; - organ->harm4_accum = 0; - organ->harm5_accum = 0; - } - - static void - run(LADSPA_Handle Instance, - unsigned long SampleCount) { - Organ *organ = (Organ*) Instance; - unsigned long i; - LADSPA_Data **ports; - LADSPA_Data *sine_table; - LADSPA_Data *reed_table; - LADSPA_Data *flute_table; - unsigned long freq_256; - unsigned long freq_256_harm0, freq_256_harm1; - unsigned long freq_256_harm2, freq_256_harm3; - unsigned long freq_256_harm4, freq_256_harm5; - double attack0, decay0, release0; - double attack1, decay1, release1; - int gate; - - ports = organ->m_ppfPorts; - - gate = (*ports[PORT_GATE] > 0.0); - if (gate == 0) - { - organ->env0.envelope_decay = 0; - organ->env1.envelope_decay = 0; - } - - sine_table = g_sine_table; - reed_table = (*ports[PORT_REED] > 0.0) ? g_pulse_table : sine_table; - flute_table = (*ports[PORT_FLUTE] > 0.0) ? g_triangle_table : sine_table; - freq_256 = (int) (*ports[PORT_FREQ] * - ((double) RESOLUTION) / - organ->sample_rate * 256.0); - - freq_256_harm0 = freq_256 / 2; - freq_256_harm1 = freq_256; - - attack0 = multiplier (organ, *ports[PORT_ATTACK_LO]); - decay0 = multiplier (organ, *ports[PORT_DECAY_LO]); - release0 = multiplier (organ, *ports[PORT_RELEASE_LO]); - - attack1 = multiplier (organ, *ports[PORT_ATTACK_HI]); - decay1 = multiplier (organ, *ports[PORT_DECAY_HI]); - release1 = multiplier (organ, *ports[PORT_RELEASE_HI]); - - if (*ports[PORT_BRASS] > 0.0) - { - freq_256_harm2 = freq_256 * 2; - freq_256_harm3 = freq_256_harm2 * 2; - freq_256_harm4 = freq_256_harm3 * 2; - freq_256_harm5 = freq_256_harm4 * 2; - - for (i = 0; i < SampleCount; i++) - ports[PORT_OUT][i] = - ((table_pos (sine_table, freq_256_harm0, &organ->harm0_accum) * *ports[PORT_HARM0] - + table_pos (sine_table, freq_256_harm1, &organ->harm1_accum) * *ports[PORT_HARM1] - + table_pos (reed_table, freq_256_harm2, &organ->harm2_accum) * *ports[PORT_HARM2]) - * envelope (&organ->env0, gate, attack0, decay0, *ports[PORT_SUSTAIN_LO], release0) - + (table_pos (sine_table, freq_256_harm3, &organ->harm3_accum) * *ports[PORT_HARM3] - + table_pos (flute_table, freq_256_harm4, &organ->harm4_accum) * *ports[PORT_HARM4] - + table_pos (flute_table, freq_256_harm5, &organ->harm5_accum) * *ports[PORT_HARM5]) - * envelope (&organ->env1, gate, attack1, decay1, *ports[PORT_SUSTAIN_HI], release1)) * *ports[PORT_VELOCITY]; - } - else - { - freq_256_harm2 = freq_256 * 3 / 2; - freq_256_harm3 = freq_256 * 2; - freq_256_harm4 = freq_256 * 3; - freq_256_harm5 = freq_256_harm3 * 2; - - for (i = 0; i < SampleCount; i++) - ports[PORT_OUT][i] = - ((table_pos (sine_table, freq_256_harm0, &organ->harm0_accum) * *ports[PORT_HARM0] - + table_pos (sine_table, freq_256_harm1, &organ->harm1_accum) * *ports[PORT_HARM1] - + table_pos (sine_table, freq_256_harm2, &organ->harm2_accum) * *ports[PORT_HARM2]) - * envelope (&organ->env0, gate, attack0, decay0, *ports[PORT_SUSTAIN_LO], release0) - - + (table_pos (reed_table, freq_256_harm3, &organ->harm3_accum) * *ports[PORT_HARM3] - + table_pos (sine_table, freq_256_harm4, &organ->harm4_accum) * *ports[PORT_HARM4] - + table_pos (flute_table, freq_256_harm5, &organ->harm5_accum) * *ports[PORT_HARM5]) - * envelope (&organ->env1, gate, attack1, decay1, *ports[PORT_SUSTAIN_HI], release1)) * *ports[PORT_VELOCITY]; - } -} - - -}; - -static LADSPA_PortDescriptor g_psPortDescriptors[] = -{ - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT -}; - -static const char * const g_psPortNames[] = -{ - "Out", - "Gate", - "Velocity", - "Frequency (Hz)", - "Brass", "Reed", "Flute", - "16th Harmonic", "8th Harmonic", - "5 1/3rd Harmonic", "4th Harmonic", - "2 2/3rd Harmonic", "2nd Harmonic", - "Attack Lo (Secs)", "Decay Lo (Secs)", "Sustain Lo (Level)", "Release Lo (Secs)", - "Attack Hi (Secs)", "Decay Hi (Secs)", "Sustain Hi (Level)", "Release Hi (Secs)", -}; - -static LADSPA_PortRangeHint g_psPortRangeHints[] = -{ - /* Hints, Lower bound, Upper bound */ - { 0, 0.0, 0.0 }, - { LADSPA_HINT_TOGGLED, 0.0, 0.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 20000.0 }, - { LADSPA_HINT_TOGGLED, 0.0, 0.0 }, - { LADSPA_HINT_TOGGLED, 0.0, 0.0 }, - { LADSPA_HINT_TOGGLED, 0.0, 0.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.00, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.00, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 1.0 } -}; - -void -initialise_organ() { - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1222, - "organ", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Organ", - CMT_MAKER("David A. Bartold"), - CMT_COPYRIGHT("1999, 2000", "David A. Bartold"), - NULL, - CMT_Instantiate, - Organ::activate, - Organ::run, - NULL, - NULL, - NULL); - - for (int i = 0; i < NUM_PORTS; i++) - psDescriptor->addPort( - g_psPortDescriptors[i], - g_psPortNames[i], - g_psPortRangeHints[i].HintDescriptor, - g_psPortRangeHints[i].LowerBound, - g_psPortRangeHints[i].UpperBound); - - registerNewPluginDescriptor(psDescriptor); -} diff --git a/plugins/LadspaEffect/cmt/src/peak.cpp b/plugins/LadspaEffect/cmt/src/peak.cpp deleted file mode 100644 index d17fc2c7eb0..00000000000 --- a/plugins/LadspaEffect/cmt/src/peak.cpp +++ /dev/null @@ -1,371 +0,0 @@ -/* peak.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" -#include "utils.h" - -/*****************************************************************************/ - -#define ET_INPUT 0 -#define ET_OUTPUT 1 - -#define ET_FILTER 2 - -/** This class is used to provide plugins that perform envelope - tracking. Peak and RMS are supported and smoothed or smoothed - maximum approaches are available. */ -class Tracker : public CMT_PluginInstance { -private: - - LADSPA_Data m_fState; - LADSPA_Data m_fSampleRate; - -public: - - Tracker(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(3), - m_fSampleRate(LADSPA_Data(lSampleRate)) { - } - - friend void activateTracker(void * pvHandle); - friend void runEnvelopeTracker_Peak(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runEnvelopeTracker_RMS(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runEnvelopeTracker_MaxPeak(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runEnvelopeTracker_MaxRMS(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/** This class provides a simple peak monitor that records the highest - signal peak present ever. It can be useful to identify clipping - cases. */ -class PeakMonitor : public CMT_PluginInstance { -private: - - LADSPA_Data m_fState; - -public: - - PeakMonitor(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(2) { - } - - friend void activatePeakMonitor(void * pvHandle); - friend void runPeakMonitor(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -void -activateTracker(void * pvHandle) { - ((Tracker *)pvHandle)->m_fState = 0; -} - -/*****************************************************************************/ - -void -activatePeakMonitor(void * pvHandle) { - ((PeakMonitor *)pvHandle)->m_fState = 0; -} - -/*****************************************************************************/ - -void -runEnvelopeTracker_Peak(LADSPA_Handle Instance, - unsigned long SampleCount) { - Tracker * poProcessor = (Tracker *)Instance; - LADSPA_Data * pfInput = poProcessor->m_ppfPorts[ET_INPUT]; - LADSPA_Data fDrag = *(poProcessor->m_ppfPorts[ET_FILTER]); - LADSPA_Data fOneMinusDrag = 1 - fDrag; - LADSPA_Data &rfState = poProcessor->m_fState; - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fabs(fInput); - rfState = rfState * fDrag + fEnvelopeTarget * fOneMinusDrag; - } - *(poProcessor->m_ppfPorts[ET_OUTPUT]) = rfState; -} - -/*****************************************************************************/ - -void -runEnvelopeTracker_RMS(LADSPA_Handle Instance, - unsigned long SampleCount) { - Tracker * poProcessor = (Tracker *)Instance; - LADSPA_Data * pfInput = poProcessor->m_ppfPorts[ET_INPUT]; - LADSPA_Data fDrag = *(poProcessor->m_ppfPorts[ET_FILTER]); - LADSPA_Data fOneMinusDrag = 1 - fDrag; - LADSPA_Data &rfState = poProcessor->m_fState; - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fInput * fInput; - rfState = rfState * fDrag + fEnvelopeTarget * fOneMinusDrag; - } - *(poProcessor->m_ppfPorts[ET_OUTPUT]) = sqrt(rfState); -} - -/*****************************************************************************/ - -void -runEnvelopeTracker_MaxPeak(LADSPA_Handle Instance, - unsigned long SampleCount) { - Tracker * poProcessor = (Tracker *)Instance; - LADSPA_Data * pfInput = poProcessor->m_ppfPorts[ET_INPUT]; - LADSPA_Data fDrag = calculate60dBDrag(*(poProcessor->m_ppfPorts[ET_FILTER]), - poProcessor->m_fSampleRate); - LADSPA_Data &rfState = poProcessor->m_fState; - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fabs(fInput); - if (fEnvelopeTarget > rfState) - rfState = fEnvelopeTarget; - else { - rfState *= fDrag; - if (fEnvelopeTarget > rfState) - rfState = fEnvelopeTarget; - } - } - *(poProcessor->m_ppfPorts[ET_OUTPUT]) = rfState; -} - -/*****************************************************************************/ - -void -runEnvelopeTracker_MaxRMS(LADSPA_Handle Instance, - unsigned long SampleCount) { - Tracker * poProcessor = (Tracker *)Instance; - LADSPA_Data * pfInput = poProcessor->m_ppfPorts[ET_INPUT]; - LADSPA_Data fDrag = calculate60dBDrag(*(poProcessor->m_ppfPorts[ET_FILTER]), - poProcessor->m_fSampleRate); - LADSPA_Data &rfState = poProcessor->m_fState; - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fInput * fInput; - if (fEnvelopeTarget > rfState) - rfState = fEnvelopeTarget; - else { - rfState *= fDrag; - if (fEnvelopeTarget > rfState) - rfState = fEnvelopeTarget; - } - } - *(poProcessor->m_ppfPorts[ET_OUTPUT]) = sqrt(rfState); -} - -/*****************************************************************************/ - -void -runPeakMonitor(LADSPA_Handle Instance, - unsigned long SampleCount) { - PeakMonitor * poProcessor = (PeakMonitor *)Instance; - LADSPA_Data * pfInput = poProcessor->m_ppfPorts[ET_INPUT]; - LADSPA_Data &rfState = poProcessor->m_fState; - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) { - LADSPA_Data fInput = *(pfInput++); - LADSPA_Data fEnvelopeTarget = fabs(fInput); - if (rfState < fEnvelopeTarget) - rfState = fEnvelopeTarget; - } - *(poProcessor->m_ppfPorts[ET_OUTPUT]) = rfState; -} - -/*****************************************************************************/ - -void -initialise_peak() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1078, - "track_peak", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Envelope Tracker (Peak)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateTracker, - runEnvelopeTracker_Peak, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL, - "Output", - LADSPA_HINT_BOUNDED_BELOW, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Smoothing Factor", - LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, - 0, - 1); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1079, - "track_rms", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Envelope Tracker (RMS)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateTracker, - runEnvelopeTracker_RMS, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL, - "Output", - LADSPA_HINT_BOUNDED_BELOW, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Smoothing Factor", - LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, - 0, - 1); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1080, - "track_max_peak", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Envelope Tracker (Maximum Peak)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateTracker, - runEnvelopeTracker_MaxPeak, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL, - "Output", - LADSPA_HINT_BOUNDED_BELOW, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Envelope Forgetting Factor (s/60dB)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 10); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1081, - "track_max_rms", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Envelope Tracker (Maximum RMS)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateTracker, - runEnvelopeTracker_MaxRMS, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL, - "Output", - LADSPA_HINT_BOUNDED_BELOW, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Envelope Forgetting Factor (s/60dB)", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_DEFAULT_MAXIMUM), - 0, - 10); - registerNewPluginDescriptor(psDescriptor); - - psDescriptor = new CMT_Descriptor - (1082, - "peak", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Peak Monitor", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activatePeakMonitor, - runPeakMonitor, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL, - "Peak", - LADSPA_HINT_BOUNDED_BELOW, - 0); - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/phasemod.cpp b/plugins/LadspaEffect/cmt/src/phasemod.cpp deleted file mode 100644 index 0a8c8e27c4e..00000000000 --- a/plugins/LadspaEffect/cmt/src/phasemod.cpp +++ /dev/null @@ -1,465 +0,0 @@ -/* phasemod.cpp - - Phase Modulated Voice - Phase Modulation synthesizer voice - Copyright (c) 2001 David A. Bartold - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include -#include "cmt.h" - -#define PORT_OUT 0 -#define PORT_GATE 1 -#define PORT_VELOCITY 2 -#define PORT_FREQ 3 -#define PORT_DCO_MODULATION 4 -#define PORT_DCO_OCTAVE 5 -#define PORT_DCO_WAVEFORM 6 -#define PORT_DCO_ATTACK 7 -#define PORT_DCO_DECAY 8 -#define PORT_DCO_SUSTAIN 9 -#define PORT_DCO_RELEASE 10 - -#define DCO_MULTIPLIER 7 - -#define NUM_PORTS 46 - -#ifndef PI -#define PI 3.14159265358979F -#endif - -typedef struct Envelope -{ - int envelope_decay; - LADSPA_Data envelope; - - Envelope () : envelope_decay (0), envelope (0.0) {} -} Envelope; - -class PhaseMod : public CMT_PluginInstance -{ - LADSPA_Data sample_rate; - - int trigger; - - Envelope dco_env[6]; - LADSPA_Data dco_accum[6]; - -public: - PhaseMod(const LADSPA_Descriptor * Descriptor, - unsigned long SampleRate) - : CMT_PluginInstance(NUM_PORTS), - sample_rate (SampleRate), - trigger (0) { - int i; - - for (i = 0; i < 6; i++) - dco_accum[i] = 0.0; - } - - ~PhaseMod () { - } - - static inline LADSPA_Data - tri(LADSPA_Data x) { - if (x > 0.75F) - x = x - 1.0F; - else if (x > 0.25F) - x = 0.5F - x; - - return x * 4.0F; - } - - static inline LADSPA_Data - envelope(Envelope *env, - int gate, - LADSPA_Data attack, - LADSPA_Data decay, - LADSPA_Data sustain, - LADSPA_Data release) - { - if (gate) - if (env->envelope_decay == 0) - { - env->envelope += (1.0F - env->envelope) * attack; - if (env->envelope >= 0.95F) - env->envelope_decay = 1; - } - else - env->envelope += (sustain - env->envelope) * decay; - else - env->envelope += -env->envelope * release; - - return env->envelope; - } - - static void - activate(LADSPA_Handle Instance) { - PhaseMod *phasemod = (PhaseMod*) Instance; - int i; - - phasemod->trigger = 0; - - for (i = 0; i < 6; i++) - { - phasemod->dco_env[i].envelope_decay = 0; - phasemod->dco_env[i].envelope = 0.0; - phasemod->dco_accum[i] = 0.0; - } - } - - static inline LADSPA_Data - osc(int waveform, - LADSPA_Data inc, - LADSPA_Data phasemod, - LADSPA_Data *accum) { - LADSPA_Data pos; - - *accum += inc; - while (*accum >= 1.0F) - *accum -= 1.0F; - - pos = *accum + phasemod; - while (pos < 0.0F) pos += 1.0F; - while (pos > 1.0F) pos -= 1.0F; - - /* 0 = Sine wave */ - if (waveform == 0) - return sin (pos * 2.0 * PI); - - /* 1 = Triangle wave */ - else if (waveform == 1) - return tri (pos); - - /* 2 = Square wave */ - else if (waveform == 2) - return (pos > 0.5) ? 1.0F : -1.0F; - - /* 3 = Sawtooth wave */ - else if (waveform == 3) - return pos * 2.0F - 1.0F; - - /* 4 = Fullwave Rectified Sine wave */ - else if (waveform == 4) - return fabs (pos * PI); - - /* 5 = Static */ - else - return (rand () & 1) ? -1.0F : 1.0F; - } - - static LADSPA_Data - calc_inc(LADSPA_Data oct, - LADSPA_Data freq, - LADSPA_Data sample_rate) { - return pow (2.0, oct) * freq / sample_rate; - } - - static inline LADSPA_Data - multiplier(PhaseMod *phasemod, - LADSPA_Data value) { - return 1.0 - pow (0.05, 1.0 / (phasemod->sample_rate * value)); - } - - static void - run(LADSPA_Handle Instance, - unsigned long SampleCount) { - PhaseMod *phasemod = (PhaseMod*) Instance; - - unsigned long i, j; - int gate; - int waveform[6]; - int store[6]; - LADSPA_Data inc[6]; - LADSPA_Data attack[6]; - LADSPA_Data decay[6]; - LADSPA_Data release[6]; - LADSPA_Data **ports; - LADSPA_Data vol; - - ports = phasemod->m_ppfPorts; - gate = (*ports[PORT_GATE] > 0.0); - - if (gate == 1 && phasemod->trigger == 0) - for (i = 0; i < 6; i++) - phasemod->dco_env[i].envelope_decay = 0; - - phasemod->trigger = gate; - - for (i = 0; i < 6; i++) - { - int offset = DCO_MULTIPLIER * i; - - waveform[i] = (int) *ports[PORT_DCO_WAVEFORM + offset]; - inc[i] = calc_inc (*ports[PORT_DCO_OCTAVE + offset], - *ports[PORT_FREQ], - phasemod->sample_rate); - attack[i] = multiplier (phasemod, *ports[PORT_DCO_ATTACK + offset]); - decay[i] = multiplier (phasemod, *ports[PORT_DCO_DECAY + offset]); - release[i] = multiplier (phasemod, *ports[PORT_DCO_RELEASE + offset]); - } - - j = 1; - for (i = 0; i < 5; i++) - if (*ports[PORT_DCO_MODULATION + (i + 1) * DCO_MULTIPLIER] < 0.0001) - store[i] = 1, j++; - else - store[i] = 0; - store[5] = 1; - vol = 1.0 / j; - - for (i = 0; i < SampleCount; i++) - { - LADSPA_Data sample; - LADSPA_Data prev; - - sample = 0.0; - prev = 1.0; - for (j = 0; j < 6; j++) - { - int offset = DCO_MULTIPLIER * j; - - prev = - envelope (&phasemod->dco_env[j], - gate, attack[j], decay[j], - *ports[PORT_DCO_SUSTAIN + offset], release[j]) * - osc (waveform[j], inc[j], - prev * *ports[PORT_DCO_MODULATION + offset], - &phasemod->dco_accum[j]) * - *ports[PORT_VELOCITY]; - - if (store[j]) - sample += prev; - } - ports[PORT_OUT][i] = sample * vol; - } - } -}; - -static LADSPA_PortDescriptor g_psPortDescriptors[] = -{ - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT -}; - -static const char * const g_psPortNames[] = -{ - "Out", - - "Gate", - "Velocity", - "Frequency (Hz)", - - "DCO1 Modulation", - "DCO1 Octave", - "DCO1 Waveform", - "DCO1 Attack", - "DCO1 Decay", - "DCO1 Sustain", - "DCO1 Release", - - "DCO2 Modulation", - "DCO2 Octave", - "DCO2 Waveform", - "DCO2 Attack", - "DCO2 Decay", - "DCO2 Sustain", - "DCO2 Release", - - "DCO3 Modulation", - "DCO3 Octave", - "DCO3 Waveform", - "DCO3 Attack", - "DCO3 Decay", - "DCO3 Sustain", - "DCO3 Release", - - "DCO4 Modulation", - "DCO4 Octave", - "DCO4 Waveform", - "DCO4 Attack", - "DCO4 Decay", - "DCO4 Sustain", - "DCO4 Release", - - "DCO5 Modulation", - "DCO5 Octave", - "DCO5 Waveform", - "DCO5 Attack", - "DCO5 Decay", - "DCO5 Sustain", - "DCO5 Release", - - "DCO6 Modulation", - "DCO6 Octave", - "DCO6 Waveform", - "DCO6 Attack", - "DCO6 Decay", - "DCO6 Sustain", - "DCO6 Release" -}; - -static LADSPA_PortRangeHint g_psPortRangeHints[] = -{ - /* Hints, Lower bound, Upper bound */ - { 0, 0.0, 0.0 }, - - { LADSPA_HINT_TOGGLED, 0.0, 0.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 20000.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -2.0, 2.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 5.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -2.0, 2.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 5.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -2.0, 2.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 5.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -2.0, 2.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 5.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -2.0, 2.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 5.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, -2.0, 2.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | - LADSPA_HINT_INTEGER, -0.1, 5.1 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.01, 8.0 } -}; - -void -initialise_phasemod() { - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1226, - "phasemod", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Phase Modulated Voice", - CMT_MAKER("David A. Bartold"), - CMT_COPYRIGHT("2001", "David A. Bartold"), - NULL, - CMT_Instantiate, - PhaseMod::activate, - PhaseMod::run, - NULL, - NULL, - NULL); - - for (int i = 0; i < NUM_PORTS; i++) - psDescriptor->addPort( - g_psPortDescriptors[i], - g_psPortNames[i], - g_psPortRangeHints[i].HintDescriptor, - g_psPortRangeHints[i].LowerBound, - g_psPortRangeHints[i].UpperBound); - - registerNewPluginDescriptor(psDescriptor); -} diff --git a/plugins/LadspaEffect/cmt/src/pink.cpp b/plugins/LadspaEffect/cmt/src/pink.cpp deleted file mode 100644 index bf3e1bb48e1..00000000000 --- a/plugins/LadspaEffect/cmt/src/pink.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/* pink.cpp - - Interpolated pink noise plugins for use as control signals. - - (c) 2002 Nathaniel Virgo - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" - -#include "pinknoise.h" -#include "utils.h" - -/*****************************************************************************/ - -namespace pink { - - enum { - port_frequency = 0, - port_output = 1, - n_ports = 2 - }; - - /** This plugin generates a signal which approximates the effect of low-pass - filtered pink noise, which makes for an interesting randomly changing - control parameter. It should probably use sinc interpolation, but in fact - it uses third-order splines, which sound more-or-less okay to me. */ - class Plugin : public CMT_PluginInstance { - private: - - LADSPA_Data sample_rate; - - PinkNoise noise_source; - LADSPA_Data *data_points; - int first_point; - unsigned long counter; - float multiplier; // 1/(max counter value) - - public: - - Plugin(const LADSPA_Descriptor *, - unsigned long s_rate) : - CMT_PluginInstance(n_ports), - sample_rate(s_rate) { - data_points = new LADSPA_Data[4]; - } - - ~Plugin() { - delete [] data_points; - } - - friend void activate(LADSPA_Handle instance); - - friend void run_interpolated_audio(LADSPA_Handle instance, - unsigned long sample_count); - - friend void run_interpolated_control(LADSPA_Handle instance, - unsigned long sample_count); - - }; - - void activate(LADSPA_Handle instance) { - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - p.noise_source.reset(); - for (int i=0; i<4; ++i) - p.data_points[i] = p.noise_source.getValue(); - p.first_point = 0; - p.counter = 0; - p.multiplier = 1; - } - - inline float thirdInterp(const float &x, - const float &L1,const float &L0, - const float &H0,const float &H1) { - return - L0 + - .5f* - x*(H0-L1 + - x*(H0 + L0*(-2) + L1 + - x*( (H0 - L0)*9 + (L1 - H1)*3 + - x*((L0 - H0)*15 + (H1 - L1)*5 + - x*((H0 - L0)*6 + (L1 - H1)*2 ))))); - } - - void run_interpolated_audio(LADSPA_Handle instance, - unsigned long sample_count) { - - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - LADSPA_Data frequency = *pp->m_ppfPorts[port_frequency]; - LADSPA_Data * out = pp->m_ppfPorts[port_output]; - - if (frequency<=0) { - LADSPA_Data value = thirdInterp( 1 - p.counter*p.multiplier, - p.data_points[ p.first_point ], - p.data_points[ (p.first_point+1) % 4 ], - p.data_points[ (p.first_point+2) % 4 ], - p.data_points[ (p.first_point+3) % 4 ] ); - for (unsigned long i=0; im_ppfPorts[port_frequency]; - LADSPA_Data * out = pp->m_ppfPorts[port_output]; - - float value = thirdInterp( 1 - p.counter*p.multiplier, - p.data_points[ p.first_point ], - p.data_points[ (p.first_point+1) % 4 ], - p.data_points[ (p.first_point+2) % 4 ], - p.data_points[ (p.first_point+3) % 4 ] ); - if (frequency>0) { - frequency = BOUNDED_ABOVE(frequency, p.sample_rate/sample_count); - while (p.counter <= sample_count) { - p.data_points[ p.first_point ] = p.noise_source.getValue(); - p.first_point = (p.first_point + 1) % 4; - p.multiplier = frequency/p.sample_rate; - p.counter += (unsigned long)(p.sample_rate/frequency); - } - p.counter -= (p.counter < sample_count) ? p.counter : sample_count; - } - *(out)=value; - } - - void initialise() { - CMT_Descriptor * d = new CMT_Descriptor - (1841, - "pink_interpolated_audio", - 0, - "Pink Noise (Interpolated)", - CMT_MAKER("Nathaniel Virgo"), - CMT_COPYRIGHT("2002", "Nathaniel Virgo"), - NULL, - CMT_Instantiate, - activate, - run_interpolated_audio, - NULL, - NULL, - NULL); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Highest frequency", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_SAMPLE_RATE - | LADSPA_HINT_DEFAULT_1), - 0, - 1); - d->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(d); - - // the following has been commented out because I'm pretty sure that - // control-rate outputs don't make sense for the vast majority of hosts. - // (SSM being the notable exception) - /* - d = new CMT_Descriptor - (1842, - "pink_interpolated_control", - 0, - "Pink Noise (Interpolated, control rate)", - CMT_MAKER("Nathaniel Virgo"), - CMT_COPYRIGHT("2002", "Nathaniel Virgo"), - NULL, - CMT_Instantiate, - activate, - run_interpolated_control, - NULL, - NULL, - NULL); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Highest frequency", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_SAMPLE_RATE - | LADSPA_HINT_DEFAULT_1), - 0, - 0.002); // arbitrary low value (sensible for sample_count around 500) - d->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL, - "Output"); - registerNewPluginDescriptor(d); - */ - } - -} // end of namespace - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/pink_full.cpp b/plugins/LadspaEffect/cmt/src/pink_full.cpp deleted file mode 100644 index 59c92906eca..00000000000 --- a/plugins/LadspaEffect/cmt/src/pink_full.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* pink_full.cpp - - A full-frequency pink noise generator. - - (c) 2002 Nathaniel Virgo - - Part of the Computer Music Toolkit - a library of LADSPA plugins. - The Computer Music Toolkit is Copyright (C) 2000-2002 - Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" - -#include "pinknoise.h" -#include "utils.h" - -/*****************************************************************************/ - -namespace pink_full { - - enum { - port_output = 0, - - n_ports = 1 - }; - - /** This plugin generates a signal which approximates pink noise, using the - Voss-McCartney algorithm described at www.firstpr.com.au/dsp/pink-noise/ */ - class Plugin : public CMT_PluginInstance { - private: - PinkNoise noise_source; - public: - - Plugin(const LADSPA_Descriptor *, - unsigned long s_rate) : - CMT_PluginInstance(n_ports) - { - } - - ~Plugin() { - } - - friend void activate(LADSPA_Handle instance); - - friend void run(LADSPA_Handle instance, - unsigned long sample_count); - }; - - void activate(LADSPA_Handle instance) { - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - p.noise_source.reset(); - } - - void run(LADSPA_Handle instance, - unsigned long sample_count) { - - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - LADSPA_Data * out = pp->m_ppfPorts[port_output]; - - for (unsigned long i=0; i, - activate, - run, - NULL, - NULL, - NULL); - d->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(d); - } - -} // end of namespace - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/pink_sh.cpp b/plugins/LadspaEffect/cmt/src/pink_sh.cpp deleted file mode 100644 index 13f2a69d5e5..00000000000 --- a/plugins/LadspaEffect/cmt/src/pink_sh.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* pink_sh.cpp - - A sample-and-hold pink noise generator. - - (c) 2002 Nathaniel Virgo - - Part of the Computer Music Toolkit - a library of LADSPA plugins. - The Computer Music Toolkit is Copyright (C) 2000-2002 - Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -#include "cmt.h" - -#include "pinknoise.h" -#include "utils.h" - -/*****************************************************************************/ - -namespace pink_sh { - - enum { - port_frequency = 0, - port_output = 1, - n_ports = 2 - }; - - /** This plugin generates a signal which approximates stepped - (sample-and-hold like) pink noise, using the - Voss-McCartney algorithm described at www.firstpr.com.au/dsp/pink-noise/ */ - class Plugin : public CMT_PluginInstance { - private: - LADSPA_Data sample_rate; - PinkNoise noise_source; - unsigned counter; - public: - - Plugin(const LADSPA_Descriptor *, - unsigned long s_rate) : - CMT_PluginInstance(n_ports), - sample_rate(s_rate) { - } - - ~Plugin() { - } - - friend void activate(LADSPA_Handle instance); - - friend void run(LADSPA_Handle instance, - unsigned long sample_count); - }; - - void activate(LADSPA_Handle instance) { - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - p.noise_source.reset(); - p.counter = 0; - } - - void run(LADSPA_Handle instance, - unsigned long sample_count) { - - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - LADSPA_Data frequency = *pp->m_ppfPorts[port_frequency]; - LADSPA_Data * out = pp->m_ppfPorts[port_output]; - - frequency = BOUNDED_ABOVE(frequency,p.sample_rate); - unsigned remain = sample_count; - - if (frequency > 0) { - while (remain) { - unsigned jump_samples = (remain, - activate, - run, - NULL, - NULL, - NULL); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Sample and hold frequency", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_SAMPLE_RATE - | LADSPA_HINT_DEFAULT_1), - 0, 0.02); - d->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(d); - } - -} // end of namespace - -/*****************************************************************************/ - -/* EOF */ - diff --git a/plugins/LadspaEffect/cmt/src/pinknoise.h b/plugins/LadspaEffect/cmt/src/pinknoise.h deleted file mode 100644 index c6b350ff8f6..00000000000 --- a/plugins/LadspaEffect/cmt/src/pinknoise.h +++ /dev/null @@ -1,111 +0,0 @@ -/* pinknoise.h - - pink noise generating class using the Voss-McCartney algorithm, as - described at www.firstpr.com.au/dsp/pink-noise/ - - (c) 2002 Nathaniel Virgo - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef _PINKNOISE_H -#define _PINKNOISE_H - -#include - -typedef unsigned int CounterType; -typedef float DataValue; - -const int n_generators = 8*sizeof(CounterType); - -class PinkNoise { - private: - - CounterType counter; - DataValue * generators; - DataValue last_value; - - public: - - PinkNoise() { - generators = new DataValue[n_generators]; - reset(); - } - - ~PinkNoise() {delete [] generators;}; - - void reset() { - counter = 0; - last_value = 0; - for (int i=0; i>= 1; - index++; - // this loop means that the plugins cannot be labelled as - // capable of hard real-time performance. - } - - last_value -= generators[index]; - generators[index] = 2*(rand()/DataValue(RAND_MAX))-1; - last_value += generators[index]; - } - - counter++; - - return last_value; - } - - inline DataValue getValue() { - return getUnscaledValue()/n_generators; - } - - inline DataValue getLastValue() { - return last_value/n_generators; - } - - inline DataValue getValue2() { - // adding some white noise gets rid of some nulls in the frequency spectrum - // but makes the signal spikier, so possibly not so good for control signals. - return (getUnscaledValue() + rand()/DataValue(RAND_MAX*0.5)-1)/(n_generators+1); - } - -}; - -#endif - - - - - - - - - diff --git a/plugins/LadspaEffect/cmt/src/run_adding.h b/plugins/LadspaEffect/cmt/src/run_adding.h deleted file mode 100644 index 2ab1892af91..00000000000 --- a/plugins/LadspaEffect/cmt/src/run_adding.h +++ /dev/null @@ -1,159 +0,0 @@ -/* run_adding.h - - (c) 2002 Nathaniel Virgo - - a few simple inline functions that can be used with templates - to get run_adding for free. - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -/* - How to use this - --------------- - - Templates can be used to automatically generate code for both the run and - run_adding LADSPA functions. Simply define the plugin's run function as - - template - void run_foo(LADSPA_Handle Instance, unsigned long SampleCount); - - and in the body of the function use - - write_output(pfOutput, fValue, poFoo->m_fRunAddingGain); - - instead of - - *(pfOutput++) = fValue. - - and be sure to include a set_run_adding_gain function. - then set the LADSPA run function as - - run_foo; - - and the run_adding function as - - run_foo; - - With -O1 or greater g++ will inline the write_output function, and - although the code ends up slightly bigger there is no overhead compared to - having two seperate functions. - - Sometimes the run_adding_gain function can be made more efficient than this - - for instance, if the output is multiplied by a gain already then you are - doing one more multiplication than necessary on every sample. It's a lot - less code to maintain, though, and it should still save some work for the - host compared to not having a run_adding function. -*/ - -/*****************************************************************************/ - -#include - -/*****************************************************************************/ - -typedef void OutputFunction(LADSPA_Data *&, const LADSPA_Data &, - const LADSPA_Data &); - -inline void write_output_normal(LADSPA_Data *&out, const LADSPA_Data &value, - const LADSPA_Data &run_adding_gain) -{ - *(out++) = value; -} - -inline void write_output_adding(LADSPA_Data *&out, const LADSPA_Data &value, - const LADSPA_Data &run_adding_gain) -{ - *(out++) += value*run_adding_gain; -} - -/*****************************************************************************/ - -/* - If the plugin has a control-rate ouput then you don't want the write_output - function to try to increment the pointer. To achieve this, use - - write_control(pfOutput, fValue, poFoo->m_fRunAddingGain); - - instead of just - - write_output(...); - - I realise this feels a bit hacky, but it works. -*/ - -template -inline void write_control(LADSPA_Data *const, - const LADSPA_Data &, const LADSPA_Data &); - -template <> -inline void write_control(LADSPA_Data *const out, - const LADSPA_Data &value, - const LADSPA_Data &run_adding_gain) -{ - *out = value; -} - -template <> -inline void write_control(LADSPA_Data *const out, - const LADSPA_Data &value, - const LADSPA_Data &run_adding_gain) -{ - *out += value*run_adding_gain; -} - - -/*****************************************************************************/ - -/* - This next bit is an attempt to facilitate the writing of slightly - more efficent run_adding functions without writing two seperate pieces of - code. You can say something like - - LADSPA_Data fOutputGain = ... ; - ... - fOutputGain *= get_gain(poFoo->m_fRunAddingGain); - ... - write_output(pfOutput, fValue*fOutputGain, 1.0f); - - in run_foo. With -O1 or greater g++ should inline the functions and - optimise away the multiplies by 1.0f, so in run_foo - fOutputGain will be multiplied by m_fRunAddingGain and in - run_foo it will be left alone. - - This does not make for very clear code, sorry about that. See disintegrator.cpp - for an example. -*/ - -template -inline float get_gain(const LADSPA_Data &); - -template <> -inline float get_gain(const LADSPA_Data &) -{ - return 1.0f; -} - -template <> -inline float get_gain(const LADSPA_Data &run_adding_gain) -{ - return run_adding_gain; -} diff --git a/plugins/LadspaEffect/cmt/src/sine.cpp b/plugins/LadspaEffect/cmt/src/sine.cpp deleted file mode 100644 index 7b27ff4cf2c..00000000000 --- a/plugins/LadspaEffect/cmt/src/sine.cpp +++ /dev/null @@ -1,296 +0,0 @@ -/* sine.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -/* Sine table size is given by (1 << SINE_TABLE_BITS). */ -#define SINE_TABLE_BITS 14 -#define SINE_TABLE_SHIFT (8 * sizeof(unsigned long) - SINE_TABLE_BITS) - -/*****************************************************************************/ - -LADSPA_Data * g_pfSineTable = NULL; -LADSPA_Data g_fPhaseStepBase = 0; - -/*****************************************************************************/ - -void -initialise_sine_wavetable() { - if (g_pfSineTable == NULL) { - long lTableSize = (1 << SINE_TABLE_BITS); - double dShift = (double(M_PI) * 2) / lTableSize; - g_pfSineTable = new float[lTableSize]; - if (g_pfSineTable != NULL) - for (long lIndex = 0; lIndex < lTableSize; lIndex++) - g_pfSineTable[lIndex] = LADSPA_Data(sin(dShift * lIndex)); - } - if (g_fPhaseStepBase == 0) { - g_fPhaseStepBase = (LADSPA_Data)pow(2, sizeof(unsigned long) * 8); - } -} - -/*****************************************************************************/ - -#define OSC_FREQUENCY 0 -#define OSC_AMPLITUDE 1 -#define OSC_OUTPUT 2 - -/* This class provides sine wavetable oscillator - plugins. Band-limiting to avoid aliasing is trivial because of the - waveform in use. Four versions of the oscillator are provided, - allowing the amplitude and frequency inputs of the oscillator to be - audio signals rather than controls (for use in AM and FM - synthesis). */ -class SineOscillator : public CMT_PluginInstance{ -private: - - /* Oscillator state: */ - - unsigned long m_lPhase; - unsigned long m_lPhaseStep; - LADSPA_Data m_fCachedFrequency; - const LADSPA_Data m_fLimitFrequency; - const LADSPA_Data m_fPhaseStepScalar; - - void setPhaseStepFromFrequency(const LADSPA_Data fFrequency) { - if (fFrequency != m_fCachedFrequency) { - if (fFrequency >= 0 && fFrequency < m_fLimitFrequency) - m_lPhaseStep = (unsigned long)(m_fPhaseStepScalar * fFrequency); - else - m_lPhaseStep = 0; - m_fCachedFrequency = fFrequency; - } - } - -public: - - SineOscillator(const LADSPA_Descriptor *, - unsigned long lSampleRate) - : CMT_PluginInstance(3), - m_lPhaseStep(0), - m_fCachedFrequency(0), - m_fLimitFrequency(LADSPA_Data(lSampleRate * 0.5)), - m_fPhaseStepScalar(LADSPA_Data(g_fPhaseStepBase / lSampleRate)) { - } - - friend void activateSineOscillator(void * pvHandle); - friend void runSineOscillator_FreqAudio_AmpAudio(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runSineOscillator_FreqAudio_AmpCtrl(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runSineOscillator_FreqCtrl_AmpAudio(LADSPA_Handle Instance, - unsigned long SampleCount); - friend void runSineOscillator_FreqCtrl_AmpCtrl(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -void -activateSineOscillator(void * pvHandle) { - ((SineOscillator *)pvHandle)->m_lPhase = 0; -} - -/*****************************************************************************/ - -void -runSineOscillator_FreqAudio_AmpAudio(LADSPA_Handle Instance, - unsigned long SampleCount) { - SineOscillator * poSineOscillator = (SineOscillator *)Instance; - LADSPA_Data * pfFrequency = poSineOscillator->m_ppfPorts[OSC_FREQUENCY]; - LADSPA_Data * pfAmplitude = poSineOscillator->m_ppfPorts[OSC_AMPLITUDE]; - LADSPA_Data * pfOutput = poSineOscillator->m_ppfPorts[OSC_OUTPUT]; - for (unsigned long lIndex = 0; lIndex < SampleCount; lIndex++) { - /* Extract frequency at this point to guarantee inplace - support. */ - LADSPA_Data fFrequency = *(pfFrequency++); - *(pfOutput++) - = (g_pfSineTable[poSineOscillator->m_lPhase >> SINE_TABLE_SHIFT] - * *(pfAmplitude++)); - poSineOscillator->setPhaseStepFromFrequency(fFrequency); - poSineOscillator->m_lPhase - += poSineOscillator->m_lPhaseStep; - } -} - -/*****************************************************************************/ - -void -runSineOscillator_FreqAudio_AmpCtrl(LADSPA_Handle Instance, - unsigned long SampleCount) { - SineOscillator * poSineOscillator = (SineOscillator *)Instance; - LADSPA_Data fAmplitude = *(poSineOscillator->m_ppfPorts[OSC_AMPLITUDE]); - LADSPA_Data * pfFrequency = poSineOscillator->m_ppfPorts[OSC_FREQUENCY]; - LADSPA_Data * pfOutput = poSineOscillator->m_ppfPorts[OSC_OUTPUT]; - for (unsigned long lIndex = 0; lIndex < SampleCount; lIndex++) { - /* Extract frequency at this point to guarantee inplace - support. */ - LADSPA_Data fFrequency = *(pfFrequency++); - *(pfOutput++) - = (g_pfSineTable[poSineOscillator->m_lPhase >> SINE_TABLE_SHIFT] - * fAmplitude); - poSineOscillator->setPhaseStepFromFrequency(fFrequency); - poSineOscillator->m_lPhase - += poSineOscillator->m_lPhaseStep; - } -} - -/*****************************************************************************/ - -void -runSineOscillator_FreqCtrl_AmpAudio(LADSPA_Handle Instance, - unsigned long SampleCount) { - SineOscillator * poSineOscillator = (SineOscillator *)Instance; - poSineOscillator->setPhaseStepFromFrequency - (*(poSineOscillator->m_ppfPorts[OSC_FREQUENCY])); - LADSPA_Data * pfAmplitude = poSineOscillator->m_ppfPorts[OSC_AMPLITUDE]; - LADSPA_Data * pfOutput = poSineOscillator->m_ppfPorts[OSC_OUTPUT]; - for (unsigned long lIndex = 0; lIndex < SampleCount; lIndex++) { - *(pfOutput++) - = (g_pfSineTable[poSineOscillator->m_lPhase >> SINE_TABLE_SHIFT] - * *(pfAmplitude++)); - poSineOscillator->m_lPhase - += poSineOscillator->m_lPhaseStep; - } -} - -/*****************************************************************************/ - -void -runSineOscillator_FreqCtrl_AmpCtrl(LADSPA_Handle Instance, - unsigned long SampleCount) { - SineOscillator * poSineOscillator = (SineOscillator *)Instance; - LADSPA_Data fAmplitude = *(poSineOscillator->m_ppfPorts[OSC_AMPLITUDE]); - poSineOscillator->setPhaseStepFromFrequency - (*(poSineOscillator->m_ppfPorts[OSC_FREQUENCY])); - LADSPA_Data * pfOutput = poSineOscillator->m_ppfPorts[OSC_OUTPUT]; - for (unsigned long lIndex = 0; lIndex < SampleCount; lIndex++) { - *(pfOutput++) - = (g_pfSineTable[poSineOscillator->m_lPhase >> SINE_TABLE_SHIFT] - * fAmplitude); - poSineOscillator->m_lPhase - += poSineOscillator->m_lPhaseStep; - } -} - -/*****************************************************************************/ - -void -initialise_sine() { - - initialise_sine_wavetable(); - - const char * apcLabels[] = { - "sine_faaa", - "sine_faac", - "sine_fcaa", - "sine_fcac" - }; - const char * apcNames[] = { - "Sine Oscillator (Freq:audio, Amp:audio)", - "Sine Oscillator (Freq:audio, Amp:control)", - "Sine Oscillator (Freq:control, Amp:audio)", - "Sine Oscillator (Freq:control, Amp:control)" - }; - LADSPA_Run_Function afRunFunction[] = { - runSineOscillator_FreqAudio_AmpAudio, - runSineOscillator_FreqAudio_AmpCtrl, - runSineOscillator_FreqCtrl_AmpAudio, - runSineOscillator_FreqCtrl_AmpCtrl - }; - LADSPA_PortDescriptor piFrequencyPortProperties[] = { - LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL - }; - LADSPA_PortDescriptor piAmplitudePortProperties[] = { - LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL - }; - - for (long lPluginIndex = 0; lPluginIndex < 4; lPluginIndex++) { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1063 + lPluginIndex, - apcLabels[lPluginIndex], - LADSPA_PROPERTY_HARD_RT_CAPABLE, - apcNames[lPluginIndex], - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - activateSineOscillator, - afRunFunction[lPluginIndex], - NULL, - NULL, - NULL); - - psDescriptor->addPort - (piFrequencyPortProperties[lPluginIndex], - "Frequency", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_SAMPLE_RATE - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_440), - 0, - 0.5); - psDescriptor->addPort - (piAmplitudePortProperties[lPluginIndex], - "Amplitude", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - - registerNewPluginDescriptor(psDescriptor); - } -} - -/*****************************************************************************/ - -void -finalise_sine() { - delete [] g_pfSineTable; -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/sledgehammer.cpp b/plugins/LadspaEffect/cmt/src/sledgehammer.cpp deleted file mode 100644 index 60eb79f70cf..00000000000 --- a/plugins/LadspaEffect/cmt/src/sledgehammer.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* sledgehammer.cpp - - "Dynamic Sledgehammer" - a thing to brutally mangle the dynamics of - a sound. - - (c) 2002 Nathaniel Virgo - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" -#include "run_adding.h" - -/*****************************************************************************/ - -namespace sledgehammer { - - enum { - port_rate = 0, - port_mod_infl = 1, // modulator influence - port_car_infl = 2, // carrier influence (0 to 1 for compression) - port_modulator = 3, - port_carrier = 4, - port_output = 5, - n_ports = 6 - }; - -/** This plugin imposes the dynamics of one sound onto another. - It can be seen as a brutal compressor with a sidechain, or - as a kind of one-band vocoder. */ - class Plugin : public CMT_PluginInstance { - LADSPA_Data run_adding_gain; - LADSPA_Data running_ms_mod; - LADSPA_Data running_ms_car; // current mean square average - public: - Plugin(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(n_ports) {} - - friend void activate(LADSPA_Handle instance); - - template - friend void run(LADSPA_Handle instance, - unsigned long sample_count); - - friend void set_run_adding_gain(LADSPA_Handle instance, - LADSPA_Data new_gain); - }; - - void activate(LADSPA_Handle instance) { - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - p.running_ms_mod = 0; - p.running_ms_car = 0; - } - - template - void run(LADSPA_Handle instance, - unsigned long sample_count) { - - Plugin *pp = (Plugin *) instance; - Plugin &p = *pp; - - LADSPA_Data rate = *pp->m_ppfPorts[port_rate]; - LADSPA_Data mod_infl = *pp->m_ppfPorts[port_mod_infl]; - LADSPA_Data car_infl = *pp->m_ppfPorts[port_car_infl]; - LADSPA_Data * modptr = pp->m_ppfPorts[port_modulator]; - LADSPA_Data * carptr = pp->m_ppfPorts[port_carrier]; - LADSPA_Data * out = pp->m_ppfPorts[port_output]; - - for ( unsigned long i = 0; i < sample_count ; ++i ) { - LADSPA_Data mod = *(modptr++); - LADSPA_Data car = *(carptr++); - - p.running_ms_mod = p.running_ms_mod*(1-rate) + (mod*mod)*rate; - p.running_ms_car = p.running_ms_car*(1-rate) + (car*car)*rate; - - LADSPA_Data rms_mod = sqrt(p.running_ms_mod); - LADSPA_Data rms_car = sqrt(p.running_ms_car); - - LADSPA_Data outsig = car; - - if (rms_car>0) - outsig *= ((rms_car-0.5)*car_infl+0.5)/rms_car; - - outsig *= ((rms_mod-0.5)*mod_infl+0.5); - - write_output(out, outsig ,p.run_adding_gain); - } - } - - void set_run_adding_gain(LADSPA_Handle instance, - LADSPA_Data new_gain) { - ((Plugin *) instance)->run_adding_gain = new_gain; - } - - void - initialise() { - - CMT_Descriptor * d = new CMT_Descriptor - (1848, - "sledgehammer", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Dynamic Sledgehammer", - CMT_MAKER("Nathaniel Virgo"), - CMT_COPYRIGHT("2002", "Nathaniel Virgo"), - NULL, - CMT_Instantiate, - activate, - run, - run, - set_run_adding_gain, - NULL); - - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Rate", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_MIDDLE), - 0.00001, - 0.001); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Modulator influence", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_0), - -1, - 1); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Carrier influence", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_BOUNDED_ABOVE - | LADSPA_HINT_DEFAULT_1), - -1, - 1); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Modulator"); - d->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Carrier"); - d->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - - registerNewPluginDescriptor(d); - - } - -} // end of namespace - -/*****************************************************************************/ - -/* EOF */ - - - - - diff --git a/plugins/LadspaEffect/cmt/src/syndrum.cpp b/plugins/LadspaEffect/cmt/src/syndrum.cpp deleted file mode 100644 index 0ff2e9b3941..00000000000 --- a/plugins/LadspaEffect/cmt/src/syndrum.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* syndrum.cpp - - SynDrum - Drum Synthesizer - Copyright (c) 1999, 2000 David A. Bartold - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include -#include "cmt.h" - -#define PORT_OUT 0 -#define PORT_TRIGGER 1 -#define PORT_VELOCITY 2 -#define PORT_FREQ 3 -#define PORT_RESONANCE 4 -#define PORT_RATIO 5 - -#define NUM_PORTS 6 - -#ifndef PI -#define PI 3.14159265358979 -#endif - -class SynDrum : public CMT_PluginInstance { - LADSPA_Data sample_rate; - - LADSPA_Data spring_vel; - LADSPA_Data spring_pos; - LADSPA_Data env; - - int last_trigger; - -public: - SynDrum(const LADSPA_Descriptor *, - unsigned long s_rate) - : CMT_PluginInstance(NUM_PORTS), - sample_rate(s_rate), - spring_vel(0.0F), - spring_pos(0.0F), - env(0.0F) { - } - - ~SynDrum() { - } - - static void - activate(LADSPA_Handle Instance) { - SynDrum *syndrum = (SynDrum*) Instance; - syndrum->spring_vel = 0.0F; - syndrum->spring_pos = 0.0F; - syndrum->env = 0.0F; - syndrum->last_trigger = 0; - } - - static void - run(LADSPA_Handle Instance, - unsigned long SampleCount) { - SynDrum *syndrum = (SynDrum*) Instance; - unsigned long i; - int trigger; - LADSPA_Data freq_shift; - LADSPA_Data factor; - LADSPA_Data res; - - trigger = *syndrum->m_ppfPorts[PORT_TRIGGER] > 0.0; - if (trigger == 1 && syndrum->last_trigger == 0) - { - syndrum->spring_vel = *syndrum->m_ppfPorts[PORT_VELOCITY]; - syndrum->env = *syndrum->m_ppfPorts[PORT_VELOCITY]; - } - syndrum->last_trigger = trigger; - - factor = 2.0 * PI / syndrum->sample_rate; - freq_shift = *syndrum->m_ppfPorts[PORT_FREQ] * - *syndrum->m_ppfPorts[PORT_RATIO]; - res = pow (0.05, 1.0 / (syndrum->sample_rate * *syndrum->m_ppfPorts[PORT_RESONANCE])); - - for (i = 0; i < SampleCount; i++) - { - LADSPA_Data cur_freq; - - cur_freq = *syndrum->m_ppfPorts[PORT_FREQ] + - (syndrum->env * freq_shift); - cur_freq *= factor; - syndrum->spring_vel -= syndrum->spring_pos * cur_freq; - syndrum->spring_pos += syndrum->spring_vel * cur_freq; - syndrum->spring_vel *= res; - syndrum->env *= res; - - syndrum->m_ppfPorts[PORT_OUT][i] = syndrum->spring_pos; - } - } -}; - - -static LADSPA_PortDescriptor g_psPortDescriptors[] = -{ - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT -}; - -static const char * const g_psPortNames[] = -{ - "Out", - "Trigger", - "Velocity", - "Frequency (Hz)", - "Resonance", - "Frequency Ratio" -}; - -static LADSPA_PortRangeHint g_psPortRangeHints[] = -{ - /* Hints, Lower bound, Upper bound */ - { 0, 0.0, 0.0 }, - { LADSPA_HINT_TOGGLED, 0.0, 0.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 10.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 20000.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.001, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 10.0 } -}; - -void -initialise_syndrum() { - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1223, - "syndrum", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Syn Drum", - CMT_MAKER("David A. Bartold"), - CMT_COPYRIGHT("1999, 2000", "David A. Bartold"), - NULL, - CMT_Instantiate, - SynDrum::activate, - SynDrum::run, - NULL, - NULL, - NULL); - - for (int i = 0; i < NUM_PORTS; i++) - psDescriptor->addPort( - g_psPortDescriptors[i], - g_psPortNames[i], - g_psPortRangeHints[i].HintDescriptor, - g_psPortRangeHints[i].LowerBound, - g_psPortRangeHints[i].UpperBound); - - registerNewPluginDescriptor(psDescriptor); -} diff --git a/plugins/LadspaEffect/cmt/src/utils.h b/plugins/LadspaEffect/cmt/src/utils.h deleted file mode 100644 index 120567546e1..00000000000 --- a/plugins/LadspaEffect/cmt/src/utils.h +++ /dev/null @@ -1,103 +0,0 @@ -/* utils.h - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -#ifndef CMT_UTILS_INCLUDED -#define CMT_UTILS_INCLUDED - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "ladspa_types.h" - -/*****************************************************************************/ - -/** The drag setting is arranged so that the gain drops by a factor of - 1e3 (60dB) in the time specified. This is a bit of an arbitrary - value but ties in with what the user will probably expect from - his/her experience with reverb units. */ -inline LADSPA_Data -calculate60dBDrag(const LADSPA_Data fTime, - const LADSPA_Data fSampleRate) { - if (fTime <= 0) - return 0; - else - return pow(1e3, -1 / (fTime * fSampleRate)); -} - -/*****************************************************************************/ - -inline LADSPA_Data -BOUNDED_BELOW(const LADSPA_Data fData, - const LADSPA_Data fLowerBound) { - if (fData <= fLowerBound) - return fLowerBound; - else - return fData; -} - -inline LADSPA_Data BOUNDED_ABOVE(const LADSPA_Data fData, - const LADSPA_Data fUpperBound) { - if (fData >= fUpperBound) - return fUpperBound; - else - return fData; -} - -inline LADSPA_Data -BOUNDED(const LADSPA_Data fData, - const LADSPA_Data fLowerBound, - const LADSPA_Data fUpperBound) { - if (fData <= fLowerBound) - return fLowerBound; - else if (fData >= fUpperBound) - return fUpperBound; - else - return fData; -} - -/*****************************************************************************/ - -/* Take a reading from a normal RV. The algorithm works by repeated - sampling of the uniform distribution, the lQuality variable giving - the number of samples. */ -inline double -sampleNormalDistribution(const double dMean, - const double dStandardDeviation, - const long lQuality = 12) { - - double dValue = 0; - for (long lIter = 0; lIter < lQuality; lIter++) - dValue += rand(); - - double dSampleFromNormal01 = (dValue / RAND_MAX) - (lQuality * 0.5); - - return dMean + dStandardDeviation * dSampleFromNormal01; -} - -/*****************************************************************************/ - -#endif - -/* EOF */ diff --git a/plugins/LadspaEffect/cmt/src/vcf303.cpp b/plugins/LadspaEffect/cmt/src/vcf303.cpp deleted file mode 100644 index 734850ec691..00000000000 --- a/plugins/LadspaEffect/cmt/src/vcf303.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* vcf303.cpp - - VCF 303 - TB-303 Resonant Filter - Copyright (c) 1998 Andy Sloane - Copyright (c) 1999, 2000 David A. Bartold - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - - -#include -#include -#include "cmt.h" - -#define PORT_IN 0 -#define PORT_OUT 1 -#define PORT_TRIGGER 2 -#define PORT_CUTOFF 3 -#define PORT_RESONANCE 4 -#define PORT_ENV_MOD 5 -#define PORT_DECAY 6 - -#define NUM_PORTS 7 - -#ifndef PI -#define PI 3.14159265358979 -#endif - -class Vcf303 : public CMT_PluginInstance { - LADSPA_Data sample_rate; - - LADSPA_Data d1, d2, c0; - int last_trigger; - int envpos; - -public: - Vcf303(const LADSPA_Descriptor *, - unsigned long s_rate) - : CMT_PluginInstance(NUM_PORTS), - sample_rate(s_rate), - d1(0.0), d2(0.0), c0(0.0), - last_trigger(0), - envpos(0) { - } - - ~Vcf303() { - } - - static void - activate(LADSPA_Handle Instance) { - Vcf303 *vcf303 = (Vcf303*) Instance; - - vcf303->d1 = 0.0; - vcf303->d2 = 0.0; - vcf303->c0 = 0.0; - vcf303->last_trigger = 0; - vcf303->envpos = 0; - } - - static inline void - recalc_a_b_c (Vcf303 *filter, - LADSPA_Data e0, - LADSPA_Data c0, - LADSPA_Data resonance, - LADSPA_Data *a, - LADSPA_Data *b, - LADSPA_Data *c) { - LADSPA_Data whopping, k; - - whopping = e0 + c0; - k = exp (-whopping / resonance); - - *a = 2.0 * cos (2.0 * whopping) * k; - *b = -k * k; - *c = (1.0 - *a - *b) * 0.2; - } - - static void - run(LADSPA_Handle Instance, - unsigned long SampleCount) { - Vcf303 *vcf303 = (Vcf303*) Instance; - unsigned long i; - LADSPA_Data e0, d, a, b, c; - LADSPA_Data decay, resonance; - LADSPA_Data **ports; - int trigger; - - /* Update vars given envmod, cutoff, and reso. */ - ports = vcf303->m_ppfPorts; - e0 = exp (5.613 - 0.8 * *ports[PORT_ENV_MOD] + 2.1553 * - *ports[PORT_CUTOFF] - 0.7696 * (1.0 - *ports[PORT_RESONANCE])); - e0 *= PI / vcf303->sample_rate; - - trigger = (*ports[PORT_TRIGGER] > 0.0); - if (trigger == 1 && vcf303->last_trigger == 0) - { - LADSPA_Data e1; - - e1 = exp (6.109 + 1.5876 * *ports[PORT_ENV_MOD] + 2.1553 * - *ports[PORT_CUTOFF] - 1.2 * (1.0 - *ports[PORT_RESONANCE])); - e1 *= PI / vcf303->sample_rate; - vcf303->c0 = e1 - e0; - } - vcf303->last_trigger = trigger; - - /* Update decay given envdecay. */ - d = 0.2 + (2.3 * *ports[PORT_DECAY]); - d *= vcf303->sample_rate; - d = pow (0.1, 1.0 / d); - decay = pow (d, 64); - - /* Update resonance. */ - resonance = exp (-1.20 + 3.455 * *ports[PORT_RESONANCE]); - - recalc_a_b_c (vcf303, e0, vcf303->c0, resonance, &a, &b, &c); - - for (i = 0; i < SampleCount; i++) - { - LADSPA_Data sample; - - sample = a * vcf303->d1 + b * vcf303->d2 + c * ports[PORT_IN][i]; - ports[PORT_OUT][i] = sample; - - vcf303->d2 = vcf303->d1; - vcf303->d1 = sample; - - vcf303->envpos++; - if (vcf303->envpos >= 64) - { - vcf303->envpos = 0; - vcf303->c0 *= decay; - recalc_a_b_c (vcf303, e0, vcf303->c0, resonance, &a, &b, &c); - } - } - } -}; - - -static LADSPA_PortDescriptor g_psPortDescriptors[] = -{ - LADSPA_PORT_AUDIO | LADSPA_PORT_INPUT, - LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT, - LADSPA_PORT_CONTROL | LADSPA_PORT_INPUT -}; - -static const char * const g_psPortNames[] = -{ - "In", - "Out", - "Trigger", - "Cutoff", - "Resonance", - "Envelope Modulation", - "Decay" -}; - -static LADSPA_PortRangeHint g_psPortRangeHints[] = -{ - /* Hints, Lower bound, Upper bound */ - { 0, 0.0, 0.0 }, - { 0, 0.0, 0.0 }, - { LADSPA_HINT_TOGGLED, 0.0, 0.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 }, - { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW, 0.0, 1.0 } -}; - -void -initialise_vcf303() { - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1224, - "vcf303", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "VCF 303", - CMT_MAKER("David A. Bartold"), - CMT_COPYRIGHT("1998-2000", "Andy Sloane, David A. Bartold"), - NULL, - CMT_Instantiate, - Vcf303::activate, - Vcf303::run, - NULL, - NULL, - NULL); - - for (int i = 0; i < NUM_PORTS; i++) - psDescriptor->addPort( - g_psPortDescriptors[i], - g_psPortNames[i], - g_psPortRangeHints[i].HintDescriptor, - g_psPortRangeHints[i].LowerBound, - g_psPortRangeHints[i].UpperBound); - - registerNewPluginDescriptor(psDescriptor); -} diff --git a/plugins/LadspaEffect/cmt/src/wshape_sine.cpp b/plugins/LadspaEffect/cmt/src/wshape_sine.cpp deleted file mode 100644 index 07eab074f88..00000000000 --- a/plugins/LadspaEffect/cmt/src/wshape_sine.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* wshape_sine.cpp - - Computer Music Toolkit - a library of LADSPA plugins. Copyright (C) - 2000-2002 Richard W.E. Furse. The author may be contacted at - richard@muse.demon.co.uk. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public Licence as - published by the Free Software Foundation; either version 2 of the - Licence, or (at your option) any later version. - - This library 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 - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307, USA. */ - -/*****************************************************************************/ - -#include -#include - -/*****************************************************************************/ - -#include "cmt.h" - -/*****************************************************************************/ - -#define WSS_CONTROL 0 -#define WSS_INPUT 1 -#define WSS_OUTPUT 2 - -/** This plugin applies a gain to a mono signal. */ -class SineWaveshaper : public CMT_PluginInstance { -public: - - SineWaveshaper(const LADSPA_Descriptor *, - unsigned long) - : CMT_PluginInstance(3) { - } - - friend void runSineWaveshaper(LADSPA_Handle Instance, - unsigned long SampleCount); - -}; - -/*****************************************************************************/ - -void -runSineWaveshaper(LADSPA_Handle Instance, - unsigned long SampleCount) { - - SineWaveshaper * poProcessor = (SineWaveshaper *)Instance; - - LADSPA_Data * pfInput = poProcessor->m_ppfPorts[WSS_INPUT]; - LADSPA_Data * pfOutput = poProcessor->m_ppfPorts[WSS_OUTPUT]; - LADSPA_Data fLimit = *(poProcessor->m_ppfPorts[WSS_CONTROL]); - LADSPA_Data fOneOverLimit = 1 / fLimit; - - for (unsigned long lSampleIndex = 0; - lSampleIndex < SampleCount; - lSampleIndex++) - *(pfOutput++) = fLimit * sin(*(pfInput++) * fOneOverLimit); -} - -/*****************************************************************************/ - -void -initialise_wshape_sine() { - - CMT_Descriptor * psDescriptor; - - psDescriptor = new CMT_Descriptor - (1097, - "wshape_sine", - LADSPA_PROPERTY_HARD_RT_CAPABLE, - "Wave Shaper (Sine-Based)", - CMT_MAKER("Richard W.E. Furse"), - CMT_COPYRIGHT("2000-2002", "Richard W.E. Furse"), - NULL, - CMT_Instantiate, - NULL, - runSineWaveshaper, - NULL, - NULL, - NULL); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL, - "Limiting Amplitude", - (LADSPA_HINT_BOUNDED_BELOW - | LADSPA_HINT_LOGARITHMIC - | LADSPA_HINT_DEFAULT_1), - 0, - 0); - psDescriptor->addPort - (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO, - "Input"); - psDescriptor->addPort - (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, - "Output"); - registerNewPluginDescriptor(psDescriptor); -} - -/*****************************************************************************/ - -/* EOF */ diff --git a/plugins/Lv2Effect/Lv2Effect.cpp b/plugins/Lv2Effect/Lv2Effect.cpp index 4f84104bbe9..dd0c4c44ff9 100644 --- a/plugins/Lv2Effect/Lv2Effect.cpp +++ b/plugins/Lv2Effect/Lv2Effect.cpp @@ -35,6 +35,9 @@ +extern "C" +{ + Plugin::Descriptor PLUGIN_EXPORT lv2effect_plugin_descriptor = { STRINGIFY(PLUGIN_NAME), @@ -49,6 +52,8 @@ Plugin::Descriptor PLUGIN_EXPORT lv2effect_plugin_descriptor = new Lv2SubPluginFeatures(Plugin::Effect) }; +} + diff --git a/plugins/Lv2Instrument/Lv2Instrument.cpp b/plugins/Lv2Instrument/Lv2Instrument.cpp index ca918d2ed04..d67e2549290 100644 --- a/plugins/Lv2Instrument/Lv2Instrument.cpp +++ b/plugins/Lv2Instrument/Lv2Instrument.cpp @@ -41,6 +41,9 @@ +extern "C" +{ + Plugin::Descriptor PLUGIN_EXPORT lv2instrument_plugin_descriptor = { STRINGIFY(PLUGIN_NAME), @@ -55,6 +58,8 @@ Plugin::Descriptor PLUGIN_EXPORT lv2instrument_plugin_descriptor = new Lv2SubPluginFeatures(Plugin::Instrument) }; +} + @@ -221,7 +226,7 @@ Lv2InsView::Lv2InsView(Lv2Instrument *_instrument, QWidget *_parent) : setAutoFillBackground(true); if (m_reloadPluginButton) { connect(m_reloadPluginButton, &QPushButton::clicked, - this, [this](){ castModel()->reloadPlugin();} ); + this, [this](){ this->castModel()->reloadPlugin();} ); } if (m_toggleUIButton) { connect(m_toggleUIButton, &QPushButton::toggled, diff --git a/plugins/sid/3off.png b/plugins/Sid/3off.png similarity index 100% rename from plugins/sid/3off.png rename to plugins/Sid/3off.png diff --git a/plugins/sid/3offred.png b/plugins/Sid/3offred.png similarity index 100% rename from plugins/sid/3offred.png rename to plugins/Sid/3offred.png diff --git a/plugins/sid/6581.png b/plugins/Sid/6581.png similarity index 100% rename from plugins/sid/6581.png rename to plugins/Sid/6581.png diff --git a/plugins/sid/6581red.png b/plugins/Sid/6581red.png similarity index 100% rename from plugins/sid/6581red.png rename to plugins/Sid/6581red.png diff --git a/plugins/sid/8580.png b/plugins/Sid/8580.png similarity index 100% rename from plugins/sid/8580.png rename to plugins/Sid/8580.png diff --git a/plugins/sid/8580red.png b/plugins/Sid/8580red.png similarity index 100% rename from plugins/sid/8580red.png rename to plugins/Sid/8580red.png diff --git a/plugins/Sid/CMakeLists.txt b/plugins/Sid/CMakeLists.txt new file mode 100644 index 00000000000..c9fce7bb77d --- /dev/null +++ b/plugins/Sid/CMakeLists.txt @@ -0,0 +1,51 @@ +INCLUDE(BuildPlugin) + +INCLUDE_DIRECTORIES(resid) + +BUILD_PLUGIN(sid + SidInstrument.cpp + SidInstrument.h + resid/envelope.h + resid/extfilt.h + resid/filter.h + resid/pot.h + resid/siddefs.h + resid/sid.h + resid/spline.h + resid/voice.h + resid/wave.h + resid/envelope.cc + resid/extfilt.cc + resid/filter.cc + resid/pot.cc + resid/sid.cc + resid/version.cc + resid/voice.cc + resid/wave6581_PS_.cc + resid/wave6581_PST.cc + resid/wave6581_P_T.cc + resid/wave6581__ST.cc + resid/wave8580_PS_.cc + resid/wave8580_PST.cc + resid/wave8580_P_T.cc + resid/wave8580__ST.cc + resid/wave.cc + MOCFILES SidInstrument.h + EMBEDDED_RESOURCES *.png) + +# Parse VERSION +FILE(READ "resid/CMakeLists.txt" lines) +STRING(REGEX MATCH "set\\(MAJOR_VER [A-Za-z0-9_]*\\)" MAJOR_RAW ${lines}) +STRING(REGEX MATCH "set\\(MINOR_VER [A-Za-z0-9_]*\\)" MINOR_RAW ${lines}) +STRING(REGEX MATCH "set\\(PATCH_VER [A-Za-z0-9_]*\\)" PATCH_RAW ${lines}) +SEPARATE_ARGUMENTS(MAJOR_RAW) +SEPARATE_ARGUMENTS(MINOR_RAW) +SEPARATE_ARGUMENTS(PATCH_RAW) +LIST(GET MAJOR_RAW 1 MAJOR_RAW) +LIST(GET MINOR_RAW 1 MINOR_RAW) +LIST(GET PATCH_RAW 1 PATCH_RAW) +STRING(REPLACE ")" "" MAJOR_VER "${MAJOR_RAW}") +STRING(REPLACE ")" "" MINOR_VER "${MINOR_RAW}") +STRING(REPLACE ")" "" PATCH_VER "${PATCH_RAW}") + +TARGET_COMPILE_DEFINITIONS(sid PRIVATE VERSION="${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}") diff --git a/plugins/sid/sid_instrument.cpp b/plugins/Sid/SidInstrument.cpp similarity index 94% rename from plugins/sid/sid_instrument.cpp rename to plugins/Sid/SidInstrument.cpp index 485fdfffb58..c2620021499 100644 --- a/plugins/sid/sid_instrument.cpp +++ b/plugins/Sid/SidInstrument.cpp @@ -1,5 +1,5 @@ /* - * sid_instrument.cpp - ResID based software-synthesizer + * SidInstrument.cpp - ResID based software-synthesizer * * Copyright (c) 2008 Csaba Hruska * Attila Herman @@ -32,7 +32,7 @@ #include "sid.h" -#include "sid_instrument.h" +#include "SidInstrument.h" #include "Engine.h" #include "InstrumentTrack.h" #include "Knob.h" @@ -119,7 +119,7 @@ voiceObject::~voiceObject() } -sidInstrument::sidInstrument( InstrumentTrack * _instrument_track ) : +SidInstrument::SidInstrument( InstrumentTrack * _instrument_track ) : Instrument( _instrument_track, &sid_plugin_descriptor ), // filter m_filterFCModel( 1024.0f, 0.0f, 2047.0f, 1.0f, this, tr( "Cutoff frequency" ) ), @@ -138,12 +138,12 @@ sidInstrument::sidInstrument( InstrumentTrack * _instrument_track ) : } -sidInstrument::~sidInstrument() +SidInstrument::~SidInstrument() { } -void sidInstrument::saveSettings( QDomDocument & _doc, +void SidInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) { // voices @@ -189,7 +189,7 @@ void sidInstrument::saveSettings( QDomDocument & _doc, -void sidInstrument::loadSettings( const QDomElement & _this ) +void SidInstrument::loadSettings( const QDomElement & _this ) { // voices for( int i = 0; i < 3; ++i ) @@ -223,7 +223,7 @@ void sidInstrument::loadSettings( const QDomElement & _this ) -QString sidInstrument::nodeName() const +QString SidInstrument::nodeName() const { return( sid_plugin_descriptor.name ); } @@ -231,7 +231,7 @@ QString sidInstrument::nodeName() const -f_cnt_t sidInstrument::desiredReleaseFrames() const +f_cnt_t SidInstrument::desiredReleaseFrames() const { const float samplerate = Engine::mixer()->processingSampleRate(); int maxrel = 0; @@ -247,7 +247,7 @@ f_cnt_t sidInstrument::desiredReleaseFrames() const -static int sid_fillbuffer(unsigned char* sidreg, cSID *sid, int tdelta, short *ptr, int samples) +static int sid_fillbuffer(unsigned char* sidreg, SID *sid, int tdelta, short *ptr, int samples) { int tdelta2; int result; @@ -302,7 +302,7 @@ static int sid_fillbuffer(unsigned char* sidreg, cSID *sid, int tdelta, short *p -void sidInstrument::playNote( NotePlayHandle * _n, +void SidInstrument::playNote( NotePlayHandle * _n, sampleFrame * _working_buffer ) { const f_cnt_t tfp = _n->totalFramesPlayed(); @@ -312,7 +312,7 @@ void sidInstrument::playNote( NotePlayHandle * _n, if ( tfp == 0 ) { - cSID *sid = new cSID(); + SID *sid = new SID(); sid->set_sampling_parameters( clockrate, SAMPLE_FAST, samplerate ); sid->set_chip_model( MOS8580 ); sid->enable_filter( true ); @@ -322,7 +322,7 @@ void sidInstrument::playNote( NotePlayHandle * _n, const fpp_t frames = _n->framesLeftForCurrentPeriod(); const f_cnt_t offset = _n->noteOffset(); - cSID *sid = static_cast( _n->m_pluginData ); + SID *sid = static_cast( _n->m_pluginData ); int delta_t = clockrate * frames / samplerate + 4; // avoid variable length array for msvc compat short* buf = reinterpret_cast(_working_buffer + offset); @@ -446,17 +446,17 @@ void sidInstrument::playNote( NotePlayHandle * _n, -void sidInstrument::deleteNotePluginData( NotePlayHandle * _n ) +void SidInstrument::deleteNotePluginData( NotePlayHandle * _n ) { - delete static_cast( _n->m_pluginData ); + delete static_cast( _n->m_pluginData ); } -PluginView * sidInstrument::instantiateView( QWidget * _parent ) +PluginView * SidInstrument::instantiateView( QWidget * _parent ) { - return( new sidInstrumentView( this, _parent ) ); + return( new SidInstrumentView( this, _parent ) ); } @@ -481,7 +481,7 @@ class sidKnob : public Knob -sidInstrumentView::sidInstrumentView( Instrument * _instrument, +SidInstrumentView::SidInstrumentView( Instrument * _instrument, QWidget * _parent ) : InstrumentViewFixedSize( _instrument, _parent ) { @@ -657,13 +657,13 @@ sidInstrumentView::sidInstrumentView( Instrument * _instrument, } -sidInstrumentView::~sidInstrumentView() +SidInstrumentView::~SidInstrumentView() { } -void sidInstrumentView::updateKnobHint() +void SidInstrumentView::updateKnobHint() { - sidInstrument * k = castModel(); + SidInstrument * k = castModel(); for( int i = 0; i < 3; ++i ) { @@ -702,9 +702,9 @@ void sidInstrumentView::updateKnobHint() -void sidInstrumentView::updateKnobToolTip() +void SidInstrumentView::updateKnobToolTip() { - sidInstrument * k = castModel(); + SidInstrument * k = castModel(); for( int i = 0; i < 3; ++i ) { ToolTip::add( m_voiceKnobs[i].m_sustKnob, @@ -722,9 +722,9 @@ void sidInstrumentView::updateKnobToolTip() -void sidInstrumentView::modelChanged() +void SidInstrumentView::modelChanged() { - sidInstrument * k = castModel(); + SidInstrument * k = castModel(); m_volKnob->setModel( &k->m_volumeModel ); m_resKnob->setModel( &k->m_filterResonanceModel ); @@ -796,7 +796,7 @@ extern "C" // necessary for getting instance out of shared lib PLUGIN_EXPORT Plugin * lmms_plugin_main( Model *m, void * ) { - return( new sidInstrument( static_cast( m ) ) ); + return( new SidInstrument( static_cast( m ) ) ); } diff --git a/plugins/sid/sid_instrument.h b/plugins/Sid/SidInstrument.h similarity index 89% rename from plugins/sid/sid_instrument.h rename to plugins/Sid/SidInstrument.h index 479d09c5df1..c0998f0265d 100644 --- a/plugins/sid/sid_instrument.h +++ b/plugins/Sid/SidInstrument.h @@ -1,5 +1,5 @@ /* - * sid_Instrument.h - ResID based software-synthesizer + * SidInstrument.h - ResID based software-synthesizer * * Copyright (c) 2008 Csaba Hruska * Attila Herman @@ -33,7 +33,7 @@ #include "Knob.h" -class sidInstrumentView; +class SidInstrumentView; class NotePlayHandle; class automatableButtonGroup; class PixmapButton; @@ -67,11 +67,11 @@ class voiceObject : public Model BoolModel m_filteredModel; BoolModel m_testModel; - friend class sidInstrument; - friend class sidInstrumentView; + friend class SidInstrument; + friend class SidInstrumentView; } ; -class sidInstrument : public Instrument +class SidInstrument : public Instrument { Q_OBJECT public: @@ -89,8 +89,8 @@ class sidInstrument : public Instrument }; - sidInstrument( InstrumentTrack * _instrument_track ); - virtual ~sidInstrument(); + SidInstrument( InstrumentTrack * _instrument_track ); + virtual ~SidInstrument(); virtual void playNote( NotePlayHandle * _n, sampleFrame * _working_buffer ); @@ -126,18 +126,18 @@ class sidInstrument : public Instrument IntModel m_chipModel; - friend class sidInstrumentView; + friend class SidInstrumentView; } ; -class sidInstrumentView : public InstrumentViewFixedSize +class SidInstrumentView : public InstrumentViewFixedSize { Q_OBJECT public: - sidInstrumentView( Instrument * _instrument, QWidget * _parent ); - virtual ~sidInstrumentView(); + SidInstrumentView( Instrument * _instrument, QWidget * _parent ); + virtual ~SidInstrumentView(); private: virtual void modelChanged(); diff --git a/plugins/sid/artwork.png b/plugins/Sid/artwork.png similarity index 100% rename from plugins/sid/artwork.png rename to plugins/Sid/artwork.png diff --git a/plugins/sid/bp.png b/plugins/Sid/bp.png similarity index 100% rename from plugins/sid/bp.png rename to plugins/Sid/bp.png diff --git a/plugins/sid/bpred.png b/plugins/Sid/bpred.png similarity index 100% rename from plugins/sid/bpred.png rename to plugins/Sid/bpred.png diff --git a/plugins/sid/filterred.png b/plugins/Sid/filterred.png similarity index 100% rename from plugins/sid/filterred.png rename to plugins/Sid/filterred.png diff --git a/plugins/sid/hp.png b/plugins/Sid/hp.png similarity index 100% rename from plugins/sid/hp.png rename to plugins/Sid/hp.png diff --git a/plugins/sid/hpred.png b/plugins/Sid/hpred.png similarity index 100% rename from plugins/sid/hpred.png rename to plugins/Sid/hpred.png diff --git a/plugins/sid/logo.png b/plugins/Sid/logo.png similarity index 100% rename from plugins/sid/logo.png rename to plugins/Sid/logo.png diff --git a/plugins/sid/lp.png b/plugins/Sid/lp.png similarity index 100% rename from plugins/sid/lp.png rename to plugins/Sid/lp.png diff --git a/plugins/sid/lpred.png b/plugins/Sid/lpred.png similarity index 100% rename from plugins/sid/lpred.png rename to plugins/Sid/lpred.png diff --git a/plugins/sid/noise.png b/plugins/Sid/noise.png similarity index 100% rename from plugins/sid/noise.png rename to plugins/Sid/noise.png diff --git a/plugins/sid/noisered.png b/plugins/Sid/noisered.png similarity index 100% rename from plugins/sid/noisered.png rename to plugins/Sid/noisered.png diff --git a/plugins/sid/pulse.png b/plugins/Sid/pulse.png similarity index 100% rename from plugins/sid/pulse.png rename to plugins/Sid/pulse.png diff --git a/plugins/sid/pulsered.png b/plugins/Sid/pulsered.png similarity index 100% rename from plugins/sid/pulsered.png rename to plugins/Sid/pulsered.png diff --git a/plugins/Sid/resid b/plugins/Sid/resid new file mode 160000 index 00000000000..02afcc5cefa --- /dev/null +++ b/plugins/Sid/resid @@ -0,0 +1 @@ +Subproject commit 02afcc5cefac34bd0c665dc0fa6b748d238c1831 diff --git a/plugins/sid/ring.png b/plugins/Sid/ring.png similarity index 100% rename from plugins/sid/ring.png rename to plugins/Sid/ring.png diff --git a/plugins/sid/ringred.png b/plugins/Sid/ringred.png similarity index 100% rename from plugins/sid/ringred.png rename to plugins/Sid/ringred.png diff --git a/plugins/sid/saw.png b/plugins/Sid/saw.png similarity index 100% rename from plugins/sid/saw.png rename to plugins/Sid/saw.png diff --git a/plugins/sid/sawred.png b/plugins/Sid/sawred.png similarity index 100% rename from plugins/sid/sawred.png rename to plugins/Sid/sawred.png diff --git a/plugins/sid/sync.png b/plugins/Sid/sync.png similarity index 100% rename from plugins/sid/sync.png rename to plugins/Sid/sync.png diff --git a/plugins/sid/syncred.png b/plugins/Sid/syncred.png similarity index 100% rename from plugins/sid/syncred.png rename to plugins/Sid/syncred.png diff --git a/plugins/sid/test.png b/plugins/Sid/test.png similarity index 100% rename from plugins/sid/test.png rename to plugins/Sid/test.png diff --git a/plugins/sid/testred.png b/plugins/Sid/testred.png similarity index 100% rename from plugins/sid/testred.png rename to plugins/Sid/testred.png diff --git a/plugins/sid/triangle.png b/plugins/Sid/triangle.png similarity index 100% rename from plugins/sid/triangle.png rename to plugins/Sid/triangle.png diff --git a/plugins/sid/trianglered.png b/plugins/Sid/trianglered.png similarity index 100% rename from plugins/sid/trianglered.png rename to plugins/Sid/trianglered.png diff --git a/plugins/carlabase/CMakeLists.txt b/plugins/carlabase/CMakeLists.txt index 28a1bc88c51..d382fceb8c5 100644 --- a/plugins/carlabase/CMakeLists.txt +++ b/plugins/carlabase/CMakeLists.txt @@ -14,13 +14,22 @@ if(LMMS_HAVE_WEAKCARLA) ${CMAKE_CURRENT_SOURCE_DIR}/carla/source/utils ${CMAKE_CURRENT_SOURCE_DIR}/carla/source/backend ) - ADD_LIBRARY(carla_native-plugin SHARED DummyCarla.cpp) - TARGET_INCLUDE_DIRECTORIES(carla_native-plugin PUBLIC ${CARLA_INCLUDE_DIRS}) - INSTALL(TARGETS carla_native-plugin + + IF(LMMS_BUILD_WIN32) + # use carla.dll + SET(CMAKE_SHARED_LIBRARY_PREFIX "") + SET(CARLA_NATIVE_LIB carla) + ELSE() + # use libcarla_native-plugin + SET(CARLA_NATIVE_LIB carla_native-plugin) + ENDIF() + ADD_LIBRARY(${CARLA_NATIVE_LIB} SHARED DummyCarla.cpp) + TARGET_INCLUDE_DIRECTORIES(${CARLA_NATIVE_LIB} PUBLIC ${CARLA_INCLUDE_DIRS}) + INSTALL(TARGETS ${CARLA_NATIVE_LIB} LIBRARY DESTINATION "${PLUGIN_DIR}/optional" RUNTIME DESTINATION "${PLUGIN_DIR}/optional" ) - SET(CARLA_LIBRARIES carla_native-plugin) + SET(CARLA_LIBRARIES ${CARLA_NATIVE_LIB}) # Set parent scope variables so carlarack and carlapatchbay can see them SET(CARLA_LIBRARIES ${CARLA_LIBRARIES} PARENT_SCOPE) endif() @@ -45,6 +54,6 @@ if(LMMS_HAVE_CARLA OR LMMS_HAVE_WEAKCARLA) INSTALL_RPATH_USE_LINK_PATH TRUE INSTALL_RPATH "${CARLA_RPATH}") IF(LMMS_HAVE_WEAKCARLA) - ADD_DEPENDENCIES(carlabase carla_native-plugin) + ADD_DEPENDENCIES(carlabase ${CARLA_NATIVE_LIB}) ENDIF() endif() diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index f437431271c..a01ee625afe 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -142,20 +142,14 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D fHost.uiParentId = 0; // carla/resources contains PyQt scripts required for launch - QString dllName(carla_get_library_filename()); - QString resourcesPath; + QDir path(carla_get_library_folder()); #if defined(CARLA_OS_LINUX) - // parse prefix from dll filename - QDir path = QFileInfo(dllName).dir(); path.cdUp(); path.cdUp(); - resourcesPath = path.absolutePath() + "/share/carla/resources"; -#elif defined(CARLA_OS_MAC) + QString resourcesPath = path.absolutePath() + "/share/carla/resources"; +#else // parse prefix from dll filename - QDir path = QFileInfo(dllName).dir(); - resourcesPath = path.absolutePath() + "/resources"; -#elif defined(CARLA_OS_WIN32) || defined(CARLA_OS_WIN64) - // not yet supported + QString resourcesPath = path.absolutePath() + "/resources"; #endif fHost.resourceDir = strdup(resourcesPath.toUtf8().constData()); fHost.get_buffer_size = host_get_buffer_size; @@ -444,8 +438,20 @@ CarlaInstrumentView::~CarlaInstrumentView() void CarlaInstrumentView::toggleUI(bool visible) { - if (fHandle != NULL && fDescriptor->ui_show != NULL) + if (fHandle != NULL && fDescriptor->ui_show != NULL) { +// TODO: remove when fixed upstream +// change working path to location of carla.dll to avoid conflict with lmms +#if defined(CARLA_OS_WIN32) || defined(CARLA_OS_WIN64) + if (visible) { + QString backupDir = QDir::currentPath(); + QDir::setCurrent(carla_get_library_folder()); + fDescriptor->ui_show(fHandle, true); + QDir::setCurrent(backupDir); + return; + } +#endif fDescriptor->ui_show(fHandle, visible); + } } void CarlaInstrumentView::uiClosed() diff --git a/plugins/sid/CMakeLists.txt b/plugins/sid/CMakeLists.txt deleted file mode 100644 index 3198723c05e..00000000000 --- a/plugins/sid/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -INCLUDE(BuildPlugin) - -BUILD_PLUGIN(sid sid_instrument.cpp sid_instrument.h envelope.h extfilt.h filter.h pot.h siddefs.h sid.h spline.h voice.h wave.h envelope.cc extfilt.cc filter.cc pot.cc sid.cc version.cc voice.cc wave6581_PS_.cc wave6581_PST.cc wave6581_P_T.cc wave6581__ST.cc wave8580_PS_.cc wave8580_PST.cc wave8580_P_T.cc wave8580__ST.cc wave.cc MOCFILES sid_instrument.h EMBEDDED_RESOURCES *.png) - - diff --git a/plugins/sid/envelope.cc b/plugins/sid/envelope.cc deleted file mode 100644 index e466bd67dc4..00000000000 --- a/plugins/sid/envelope.cc +++ /dev/null @@ -1,227 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __ENVELOPE_CC__ -#include "envelope.h" - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -EnvelopeGenerator::EnvelopeGenerator() -{ - reset(); -} - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void EnvelopeGenerator::reset() -{ - envelope_counter = 0; - - attack = 0; - decay = 0; - sustain = 0; - release = 0; - - gate = 0; - - rate_counter = 0; - exponential_counter = 0; - exponential_counter_period = 1; - - state = RELEASE; - rate_period = rate_counter_period[release]; - hold_zero = true; -} - - -// Rate counter periods are calculated from the Envelope Rates table in -// the Programmer's Reference Guide. The rate counter period is the number of -// cycles between each increment of the envelope counter. -// The rates have been verified by sampling ENV3. -// -// The rate counter is a 16 bit register which is incremented each cycle. -// When the counter reaches a specific comparison value, the envelope counter -// is incremented (attack) or decremented (decay/release) and the -// counter is zeroed. -// -// NB! Sampling ENV3 shows that the calculated values are not exact. -// It may seem like most calculated values have been rounded (.5 is rounded -// down) and 1 has beed added to the result. A possible explanation for this -// is that the SID designers have used the calculated values directly -// as rate counter comparison values, not considering a one cycle delay to -// zero the counter. This would yield an actual period of comparison value + 1. -// -// The time of the first envelope count can not be exactly controlled, except -// possibly by resetting the chip. Because of this we cannot do cycle exact -// sampling and must devise another method to calculate the rate counter -// periods. -// -// The exact rate counter periods can be determined e.g. by counting the number -// of cycles from envelope level 1 to envelope level 129, and dividing the -// number of cycles by 128. CIA1 timer A and B in linked mode can perform -// the cycle count. This is the method used to find the rates below. -// -// To avoid the ADSR delay bug, sampling of ENV3 should be done using -// sustain = release = 0. This ensures that the attack state will not lower -// the current rate counter period. -// -// The ENV3 sampling code below yields a maximum timing error of 14 cycles. -// lda #$01 -// l1: cmp $d41c -// bne l1 -// ... -// lda #$ff -// l2: cmp $d41c -// bne l2 -// -// This yields a maximum error for the calculated rate period of 14/128 cycles. -// The described method is thus sufficient for exact calculation of the rate -// periods. -// -reg16 EnvelopeGenerator::rate_counter_period[] = { - 9, // 2ms*1.0MHz/256 = 7.81 - 32, // 8ms*1.0MHz/256 = 31.25 - 63, // 16ms*1.0MHz/256 = 62.50 - 95, // 24ms*1.0MHz/256 = 93.75 - 149, // 38ms*1.0MHz/256 = 148.44 - 220, // 56ms*1.0MHz/256 = 218.75 - 267, // 68ms*1.0MHz/256 = 265.63 - 313, // 80ms*1.0MHz/256 = 312.50 - 392, // 100ms*1.0MHz/256 = 390.63 - 977, // 250ms*1.0MHz/256 = 976.56 - 1954, // 500ms*1.0MHz/256 = 1953.13 - 3126, // 800ms*1.0MHz/256 = 3125.00 - 3907, // 1 s*1.0MHz/256 = 3906.25 - 11720, // 3 s*1.0MHz/256 = 11718.75 - 19532, // 5 s*1.0MHz/256 = 19531.25 - 31251 // 8 s*1.0MHz/256 = 31250.00 -}; - - -// For decay and release, the clock to the envelope counter is sequentially -// divided by 1, 2, 4, 8, 16, 30, 1 to create a piece-wise linear approximation -// of an exponential. The exponential counter period is loaded at the envelope -// counter values 255, 93, 54, 26, 14, 6, 0. The period can be different for the -// same envelope counter value, depending on whether the envelope has been -// rising (attack -> release) or sinking (decay/release). -// -// Since it is not possible to reset the rate counter (the test bit has no -// influence on the envelope generator whatsoever) a method must be devised to -// do cycle exact sampling of ENV3 to do the investigation. This is possible -// with knowledge of the rate period for A=0, found above. -// -// The CPU can be synchronized with ENV3 by first synchronizing with the rate -// counter by setting A=0 and wait in a carefully timed loop for the envelope -// counter _not_ to change for 9 cycles. We can then wait for a specific value -// of ENV3 with another timed loop to fully synchronize with ENV3. -// -// At the first period when an exponential counter period larger than one -// is used (decay or release), one extra cycle is spent before the envelope is -// decremented. The envelope output is then delayed one cycle until the state -// is changed to attack. Now one cycle less will be spent before the envelope -// is incremented, and the situation is normalized. -// The delay is probably caused by the comparison with the exponential counter, -// and does not seem to affect the rate counter. This has been verified by -// timing 256 consecutive complete envelopes with A = D = R = 1, S = 0, using -// CIA1 timer A and B in linked mode. If the rate counter is not affected the -// period of each complete envelope is -// (255 + 162*1 + 39*2 + 28*4 + 12*8 + 8*16 + 6*30)*32 = 756*32 = 32352 -// which corresponds exactly to the timed value divided by the number of -// complete envelopes. -// NB! This one cycle delay is not modeled. - - -// From the sustain levels it follows that both the low and high 4 bits of the -// envelope counter are compared to the 4-bit sustain value. -// This has been verified by sampling ENV3. -// -reg8 EnvelopeGenerator::sustain_level[] = { - 0x00, - 0x11, - 0x22, - 0x33, - 0x44, - 0x55, - 0x66, - 0x77, - 0x88, - 0x99, - 0xaa, - 0xbb, - 0xcc, - 0xdd, - 0xee, - 0xff, -}; - - -// ---------------------------------------------------------------------------- -// Register functions. -// ---------------------------------------------------------------------------- -void EnvelopeGenerator::writeCONTROL_REG(reg8 control) -{ - reg8 gate_next = control & 0x01; - - // The rate counter is never reset, thus there will be a delay before the - // envelope counter starts counting up (attack) or down (release). - - // Gate bit on: Start attack, decay, sustain. - if (!gate && gate_next) { - state = ATTACK; - rate_period = rate_counter_period[attack]; - - // Switching to attack state unlocks the zero freeze. - hold_zero = false; - } - // Gate bit off: Start release. - else if (gate && !gate_next) { - state = RELEASE; - rate_period = rate_counter_period[release]; - } - - gate = gate_next; -} - -void EnvelopeGenerator::writeATTACK_DECAY(reg8 attack_decay) -{ - attack = (attack_decay >> 4) & 0x0f; - decay = attack_decay & 0x0f; - if (state == ATTACK) { - rate_period = rate_counter_period[attack]; - } - else if (state == DECAY_SUSTAIN) { - rate_period = rate_counter_period[decay]; - } -} - -void EnvelopeGenerator::writeSUSTAIN_RELEASE(reg8 sustain_release) -{ - sustain = (sustain_release >> 4) & 0x0f; - release = sustain_release & 0x0f; - if (state == RELEASE) { - rate_period = rate_counter_period[release]; - } -} - -reg8 EnvelopeGenerator::readENV() -{ - return output(); -} diff --git a/plugins/sid/envelope.h b/plugins/sid/envelope.h deleted file mode 100644 index 63a30578b7f..00000000000 --- a/plugins/sid/envelope.h +++ /dev/null @@ -1,305 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __ENVELOPE_H__ -#define __ENVELOPE_H__ - -#include "siddefs.h" - -// ---------------------------------------------------------------------------- -// A 15 bit counter is used to implement the envelope rates, in effect -// dividing the clock to the envelope counter by the currently selected rate -// period. -// In addition, another counter is used to implement the exponential envelope -// decay, in effect further dividing the clock to the envelope counter. -// The period of this counter is set to 1, 2, 4, 8, 16, 30 at the envelope -// counter values 255, 93, 54, 26, 14, 6, respectively. -// ---------------------------------------------------------------------------- -class EnvelopeGenerator -{ -public: - EnvelopeGenerator(); - - enum State { ATTACK, DECAY_SUSTAIN, RELEASE }; - - RESID_INLINE void clock(); - RESID_INLINE void clock(cycle_count delta_t); - void reset(); - - void writeCONTROL_REG(reg8); - void writeATTACK_DECAY(reg8); - void writeSUSTAIN_RELEASE(reg8); - reg8 readENV(); - - // 8-bit envelope output. - RESID_INLINE reg8 output(); - -protected: - reg16 rate_counter; - reg16 rate_period; - reg8 exponential_counter; - reg8 exponential_counter_period; - reg8 envelope_counter; - bool hold_zero; - - reg4 attack; - reg4 decay; - reg4 sustain; - reg4 release; - - reg8 gate; - - State state; - - // Lookup table to convert from attack, decay, or release value to rate - // counter period. - static reg16 rate_counter_period[]; - - // The 16 selectable sustain levels. - static reg8 sustain_level[]; - -friend class cSID; -}; - - -// ---------------------------------------------------------------------------- -// Inline functions. -// The following functions are defined inline because they are called every -// time a sample is calculated. -// ---------------------------------------------------------------------------- - -#if RESID_INLINING || defined(__ENVELOPE_CC__) - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -RESID_INLINE -void EnvelopeGenerator::clock() -{ - // Check for ADSR delay bug. - // If the rate counter comparison value is set below the current value of the - // rate counter, the counter will continue counting up until it wraps around - // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the - // envelope can finally be stepped. - // This has been verified by sampling ENV3. - // - if (++rate_counter & 0x8000) { - ++rate_counter &= 0x7fff; - } - - if (rate_counter != rate_period) { - return; - } - - rate_counter = 0; - - // The first envelope step in the attack state also resets the exponential - // counter. This has been verified by sampling ENV3. - // - if (state == ATTACK || ++exponential_counter == exponential_counter_period) - { - exponential_counter = 0; - - // Check whether the envelope counter is frozen at zero. - if (hold_zero) { - return; - } - - switch (state) { - case ATTACK: - // The envelope counter can flip from 0xff to 0x00 by changing state to - // release, then to attack. The envelope counter is then frozen at - // zero; to unlock this situation the state must be changed to release, - // then to attack. This has been verified by sampling ENV3. - // - ++envelope_counter &= 0xff; - if (envelope_counter == 0xff) { - state = DECAY_SUSTAIN; - rate_period = rate_counter_period[decay]; - } - break; - case DECAY_SUSTAIN: - if (envelope_counter != sustain_level[sustain]) { - --envelope_counter; - } - break; - case RELEASE: - // The envelope counter can flip from 0x00 to 0xff by changing state to - // attack, then to release. The envelope counter will then continue - // counting down in the release state. - // This has been verified by sampling ENV3. - // NB! The operation below requires two's complement integer. - // - --envelope_counter &= 0xff; - break; - } - - // Check for change of exponential counter period. - switch (envelope_counter) { - case 0xff: - exponential_counter_period = 1; - break; - case 0x5d: - exponential_counter_period = 2; - break; - case 0x36: - exponential_counter_period = 4; - break; - case 0x1a: - exponential_counter_period = 8; - break; - case 0x0e: - exponential_counter_period = 16; - break; - case 0x06: - exponential_counter_period = 30; - break; - case 0x00: - exponential_counter_period = 1; - - // When the envelope counter is changed to zero, it is frozen at zero. - // This has been verified by sampling ENV3. - hold_zero = true; - break; - } - } -} - - -// ---------------------------------------------------------------------------- -// SID clocking - delta_t cycles. -// ---------------------------------------------------------------------------- -RESID_INLINE -void EnvelopeGenerator::clock(cycle_count delta_t) -{ - // Check for ADSR delay bug. - // If the rate counter comparison value is set below the current value of the - // rate counter, the counter will continue counting up until it wraps around - // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the - // envelope can finally be stepped. - // This has been verified by sampling ENV3. - // - - // NB! This requires two's complement integer. - int rate_step = rate_period - rate_counter; - if (rate_step <= 0) { - rate_step += 0x7fff; - } - - while (delta_t) { - if (delta_t < rate_step) { - rate_counter += delta_t; - if (rate_counter & 0x8000) { - ++rate_counter &= 0x7fff; - } - return; - } - - rate_counter = 0; - delta_t -= rate_step; - - // The first envelope step in the attack state also resets the exponential - // counter. This has been verified by sampling ENV3. - // - if (state == ATTACK || ++exponential_counter == exponential_counter_period) - { - exponential_counter = 0; - - // Check whether the envelope counter is frozen at zero. - if (hold_zero) { - rate_step = rate_period; - continue; - } - - switch (state) { - case ATTACK: - // The envelope counter can flip from 0xff to 0x00 by changing state to - // release, then to attack. The envelope counter is then frozen at - // zero; to unlock this situation the state must be changed to release, - // then to attack. This has been verified by sampling ENV3. - // - ++envelope_counter &= 0xff; - if (envelope_counter == 0xff) { - state = DECAY_SUSTAIN; - rate_period = rate_counter_period[decay]; - } - break; - case DECAY_SUSTAIN: - if (envelope_counter != sustain_level[sustain]) { - --envelope_counter; - } - break; - case RELEASE: - // The envelope counter can flip from 0x00 to 0xff by changing state to - // attack, then to release. The envelope counter will then continue - // counting down in the release state. - // This has been verified by sampling ENV3. - // NB! The operation below requires two's complement integer. - // - --envelope_counter &= 0xff; - break; - } - - // Check for change of exponential counter period. - switch (envelope_counter) { - case 0xff: - exponential_counter_period = 1; - break; - case 0x5d: - exponential_counter_period = 2; - break; - case 0x36: - exponential_counter_period = 4; - break; - case 0x1a: - exponential_counter_period = 8; - break; - case 0x0e: - exponential_counter_period = 16; - break; - case 0x06: - exponential_counter_period = 30; - break; - case 0x00: - exponential_counter_period = 1; - - // When the envelope counter is changed to zero, it is frozen at zero. - // This has been verified by sampling ENV3. - hold_zero = true; - break; - } - } - - rate_step = rate_period; - } -} - - -// ---------------------------------------------------------------------------- -// Read the envelope generator output. -// ---------------------------------------------------------------------------- -RESID_INLINE -reg8 EnvelopeGenerator::output() -{ - return envelope_counter; -} - -#endif // RESID_INLINING || defined(__ENVELOPE_CC__) - -#endif // not __ENVELOPE_H__ diff --git a/plugins/sid/extfilt.cc b/plugins/sid/extfilt.cc deleted file mode 100644 index b875ee2ac96..00000000000 --- a/plugins/sid/extfilt.cc +++ /dev/null @@ -1,79 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __EXTFILT_CC__ -#include "extfilt.h" - - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -ExternalFilter::ExternalFilter() -{ - reset(); - enable_filter(true); - set_chip_model(MOS6581); - - // Low-pass: R = 10kOhm, C = 1000pF; w0l = 1/RC = 1/(1e4*1e-9) = 100000 - // High-pass: R = 1kOhm, C = 10uF; w0h = 1/RC = 1/(1e3*1e-5) = 100 - // Multiply with 1.048576 to facilitate division by 1 000 000 by right- - // shifting 20 times (2 ^ 20 = 1048576). - - w0lp = 104858; - w0hp = 105; -} - - -// ---------------------------------------------------------------------------- -// Enable filter. -// ---------------------------------------------------------------------------- -void ExternalFilter::enable_filter(bool enable) -{ - enabled = enable; -} - - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void ExternalFilter::set_chip_model(chip_model model) -{ - if (model == MOS6581) { - // Maximum mixer DC output level; to be removed if the external - // filter is turned off: ((wave DC + voice DC)*voices + mixer DC)*volume - // See voice.cc and filter.cc for an explanation of the values. - mixer_DC = ((((0x800 - 0x380) + 0x800)*0xff*3 - 0xfff*0xff/18) >> 7)*0x0f; - } - else { - // No DC offsets in the MOS8580. - mixer_DC = 0; - } -} - - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void ExternalFilter::reset() -{ - // State of filter. - Vlp = 0; - Vhp = 0; - Vo = 0; -} diff --git a/plugins/sid/extfilt.h b/plugins/sid/extfilt.h deleted file mode 100644 index adf602f191d..00000000000 --- a/plugins/sid/extfilt.h +++ /dev/null @@ -1,164 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __EXTFILT_H__ -#define __EXTFILT_H__ - -#include "siddefs.h" - -// ---------------------------------------------------------------------------- -// The audio output stage in a Commodore 64 consists of two STC networks, -// a low-pass filter with 3-dB frequency 16kHz followed by a high-pass -// filter with 3-dB frequency 16Hz (the latter provided an audio equipment -// input impedance of 1kOhm). -// The STC networks are connected with a BJT supposedly meant to act as -// a unity gain buffer, which is not really how it works. A more elaborate -// model would include the BJT, however DC circuit analysis yields BJT -// base-emitter and emitter-base impedances sufficiently low to produce -// additional low-pass and high-pass 3dB-frequencies in the order of hundreds -// of kHz. This calls for a sampling frequency of several MHz, which is far -// too high for practical use. -// ---------------------------------------------------------------------------- -class ExternalFilter -{ -public: - ExternalFilter(); - - void enable_filter(bool enable); - void set_chip_model(chip_model model); - - RESID_INLINE void clock(sound_sample Vi); - RESID_INLINE void clock(cycle_count delta_t, sound_sample Vi); - void reset(); - - // Audio output (20 bits). - RESID_INLINE sound_sample output(); - -protected: - // Filter enabled. - bool enabled; - - // Maximum mixer DC offset. - sound_sample mixer_DC; - - // State of filters. - sound_sample Vlp; // lowpass - sound_sample Vhp; // highpass - sound_sample Vo; - - // Cutoff frequencies. - sound_sample w0lp; - sound_sample w0hp; - -friend class cSID; -}; - - -// ---------------------------------------------------------------------------- -// Inline functions. -// The following functions are defined inline because they are called every -// time a sample is calculated. -// ---------------------------------------------------------------------------- - -#if RESID_INLINING || defined(__EXTFILT_CC__) - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -RESID_INLINE -void ExternalFilter::clock(sound_sample Vi) -{ - // This is handy for testing. - if (!enabled) { - // Remove maximum DC level since there is no filter to do it. - Vlp = Vhp = 0; - Vo = Vi - mixer_DC; - return; - } - - // delta_t is converted to seconds given a 1MHz clock by dividing - // with 1 000 000. - - // Calculate filter outputs. - // Vo = Vlp - Vhp; - // Vlp = Vlp + w0lp*(Vi - Vlp)*delta_t; - // Vhp = Vhp + w0hp*(Vlp - Vhp)*delta_t; - - sound_sample dVlp = (w0lp >> 8)*(Vi - Vlp) >> 12; - sound_sample dVhp = w0hp*(Vlp - Vhp) >> 20; - Vo = Vlp - Vhp; - Vlp += dVlp; - Vhp += dVhp; -} - -// ---------------------------------------------------------------------------- -// SID clocking - delta_t cycles. -// ---------------------------------------------------------------------------- -RESID_INLINE -void ExternalFilter::clock(cycle_count delta_t, - sound_sample Vi) -{ - // This is handy for testing. - if (!enabled) { - // Remove maximum DC level since there is no filter to do it. - Vlp = Vhp = 0; - Vo = Vi - mixer_DC; - return; - } - - // Maximum delta cycles for the external filter to work satisfactorily - // is approximately 8. - cycle_count delta_t_flt = 8; - - while (delta_t) { - if (delta_t < delta_t_flt) { - delta_t_flt = delta_t; - } - - // delta_t is converted to seconds given a 1MHz clock by dividing - // with 1 000 000. - - // Calculate filter outputs. - // Vo = Vlp - Vhp; - // Vlp = Vlp + w0lp*(Vi - Vlp)*delta_t; - // Vhp = Vhp + w0hp*(Vlp - Vhp)*delta_t; - - sound_sample dVlp = (w0lp*delta_t_flt >> 8)*(Vi - Vlp) >> 12; - sound_sample dVhp = w0hp*delta_t_flt*(Vlp - Vhp) >> 20; - Vo = Vlp - Vhp; - Vlp += dVlp; - Vhp += dVhp; - - delta_t -= delta_t_flt; - } -} - - -// ---------------------------------------------------------------------------- -// Audio output (19.5 bits). -// ---------------------------------------------------------------------------- -RESID_INLINE -sound_sample ExternalFilter::output() -{ - return Vo; -} - -#endif // RESID_INLINING || defined(__EXTFILT_CC__) - -#endif // not __EXTFILT_H__ diff --git a/plugins/sid/filter.cc b/plugins/sid/filter.cc deleted file mode 100644 index fb548e30acd..00000000000 --- a/plugins/sid/filter.cc +++ /dev/null @@ -1,305 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __FILTER_CC__ -#include "filter.h" - -// Maximum cutoff frequency is specified as -// FCmax = 2.6e-5/C = 2.6e-5/2200e-12 = 11818. -// -// Measurements indicate a cutoff frequency range of approximately -// 220Hz - 18kHz on a MOS6581 fitted with 470pF capacitors. The function -// mapping FC to cutoff frequency has the shape of the tanh function, with -// a discontinuity at FCHI = 0x80. -// In contrast, the MOS8580 almost perfectly corresponds with the -// specification of a linear mapping from 30Hz to 12kHz. -// -// The mappings have been measured by feeding the SID with an external -// signal since the chip itself is incapable of generating waveforms of -// higher fundamental frequency than 4kHz. It is best to use the bandpass -// output at full resonance to pick out the cutoff frequency at any given -// FC setting. -// -// The mapping function is specified with spline interpolation points and -// the function values are retrieved via table lookup. -// -// NB! Cutoff frequency characteristics may vary, we have modeled two -// particular Commodore 64s. - -fc_point Filter::f0_points_6581[] = -{ - // FC f FCHI FCLO - // ---------------------------- - { 0, 220 }, // 0x00 - repeated end point - { 0, 220 }, // 0x00 - { 128, 230 }, // 0x10 - { 256, 250 }, // 0x20 - { 384, 300 }, // 0x30 - { 512, 420 }, // 0x40 - { 640, 780 }, // 0x50 - { 768, 1600 }, // 0x60 - { 832, 2300 }, // 0x68 - { 896, 3200 }, // 0x70 - { 960, 4300 }, // 0x78 - { 992, 5000 }, // 0x7c - { 1008, 5400 }, // 0x7e - { 1016, 5700 }, // 0x7f - { 1023, 6000 }, // 0x7f 0x07 - { 1023, 6000 }, // 0x7f 0x07 - discontinuity - { 1024, 4600 }, // 0x80 - - { 1024, 4600 }, // 0x80 - { 1032, 4800 }, // 0x81 - { 1056, 5300 }, // 0x84 - { 1088, 6000 }, // 0x88 - { 1120, 6600 }, // 0x8c - { 1152, 7200 }, // 0x90 - { 1280, 9500 }, // 0xa0 - { 1408, 12000 }, // 0xb0 - { 1536, 14500 }, // 0xc0 - { 1664, 16000 }, // 0xd0 - { 1792, 17100 }, // 0xe0 - { 1920, 17700 }, // 0xf0 - { 2047, 18000 }, // 0xff 0x07 - { 2047, 18000 } // 0xff 0x07 - repeated end point -}; - -fc_point Filter::f0_points_8580[] = -{ - // FC f FCHI FCLO - // ---------------------------- - { 0, 0 }, // 0x00 - repeated end point - { 0, 0 }, // 0x00 - { 128, 800 }, // 0x10 - { 256, 1600 }, // 0x20 - { 384, 2500 }, // 0x30 - { 512, 3300 }, // 0x40 - { 640, 4100 }, // 0x50 - { 768, 4800 }, // 0x60 - { 896, 5600 }, // 0x70 - { 1024, 6500 }, // 0x80 - { 1152, 7500 }, // 0x90 - { 1280, 8400 }, // 0xa0 - { 1408, 9200 }, // 0xb0 - { 1536, 9800 }, // 0xc0 - { 1664, 10500 }, // 0xd0 - { 1792, 11000 }, // 0xe0 - { 1920, 11700 }, // 0xf0 - { 2047, 12500 }, // 0xff 0x07 - { 2047, 12500 } // 0xff 0x07 - repeated end point -}; - - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -Filter::Filter() -{ - fc = 0; - - res = 0; - - filt = 0; - - voice3off = 0; - - hp_bp_lp = 0; - - vol = 0; - - // State of filter. - Vhp = 0; - Vbp = 0; - Vlp = 0; - Vnf = 0; - - enable_filter(true); - - // Create mappings from FC to cutoff frequency. - interpolate(f0_points_6581, f0_points_6581 - + sizeof(f0_points_6581)/sizeof(*f0_points_6581) - 1, - PointPlotter(f0_6581), 1.0); - interpolate(f0_points_8580, f0_points_8580 - + sizeof(f0_points_8580)/sizeof(*f0_points_8580) - 1, - PointPlotter(f0_8580), 1.0); - - set_chip_model(MOS6581); -} - - -// ---------------------------------------------------------------------------- -// Enable filter. -// ---------------------------------------------------------------------------- -void Filter::enable_filter(bool enable) -{ - enabled = enable; -} - - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void Filter::set_chip_model(chip_model model) -{ - if (model == MOS6581) { - // The mixer has a small input DC offset. This is found as follows: - // - // The "zero" output level of the mixer measured on the SID audio - // output pin is 5.50V at zero volume, and 5.44 at full - // volume. This yields a DC offset of (5.44V - 5.50V) = -0.06V. - // - // The DC offset is thus -0.06V/1.05V ~ -1/18 of the dynamic range - // of one voice. See voice.cc for measurement of the dynamic - // range. - - mixer_DC = -0xfff*0xff/18 >> 7; - - f0 = f0_6581; - f0_points = f0_points_6581; - f0_count = sizeof(f0_points_6581)/sizeof(*f0_points_6581); - } - else { - // No DC offsets in the MOS8580. - mixer_DC = 0; - - f0 = f0_8580; - f0_points = f0_points_8580; - f0_count = sizeof(f0_points_8580)/sizeof(*f0_points_8580); - } - - set_w0(); - set_Q(); -} - - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void Filter::reset() -{ - fc = 0; - - res = 0; - - filt = 0; - - voice3off = 0; - - hp_bp_lp = 0; - - vol = 0; - - // State of filter. - Vhp = 0; - Vbp = 0; - Vlp = 0; - Vnf = 0; - - set_w0(); - set_Q(); -} - - -// ---------------------------------------------------------------------------- -// Register functions. -// ---------------------------------------------------------------------------- -void Filter::writeFC_LO(reg8 fc_lo) -{ - fc = ( fc & 0x7f8 ) | ( fc_lo & 0x007 ); - set_w0(); -} - -void Filter::writeFC_HI(reg8 fc_hi) -{ - fc = ( (fc_hi << 3) & 0x7f8 ) | ( fc & 0x007 ); - set_w0(); -} - -void Filter::writeRES_FILT(reg8 res_filt) -{ - res = (res_filt >> 4) & 0x0f; - set_Q(); - - filt = res_filt & 0x0f; -} - -void Filter::writeMODE_VOL(reg8 mode_vol) -{ - voice3off = mode_vol & 0x80; - - hp_bp_lp = (mode_vol >> 4) & 0x07; - - vol = mode_vol & 0x0f; -} - -// Set filter cutoff frequency. -void Filter::set_w0() -{ - const double pi = 3.1415926535897932385; - - // Multiply with 1.048576 to facilitate division by 1 000 000 by right- - // shifting 20 times (2 ^ 20 = 1048576). - w0 = static_cast(2*pi*f0[fc]*1.048576); - - // Limit f0 to 16kHz to keep 1 cycle filter stable. - const sound_sample w0_max_1 = static_cast(2*pi*16000*1.048576); - w0_ceil_1 = w0 <= w0_max_1 ? w0 : w0_max_1; - - // Limit f0 to 4kHz to keep delta_t cycle filter stable. - const sound_sample w0_max_dt = static_cast(2*pi*4000*1.048576); - w0_ceil_dt = w0 <= w0_max_dt ? w0 : w0_max_dt; -} - -// Set filter resonance. -void Filter::set_Q() -{ - // Q is controlled linearly by res. Q has approximate range [0.707, 1.7]. - // As resonance is increased, the filter must be clocked more often to keep - // stable. - - // The coefficient 1024 is dispensed of later by right-shifting 10 times - // (2 ^ 10 = 1024). - _1024_div_Q = static_cast(1024.0/(0.707 + 1.0*res/0x0f)); -} - -// ---------------------------------------------------------------------------- -// Spline functions. -// ---------------------------------------------------------------------------- - -// ---------------------------------------------------------------------------- -// Return the array of spline interpolation points used to map the FC register -// to filter cutoff frequency. -// ---------------------------------------------------------------------------- -void Filter::fc_default(const fc_point*& points, int& count) -{ - points = f0_points; - count = f0_count; -} - -// ---------------------------------------------------------------------------- -// Given an array of interpolation points p with n points, the following -// statement will specify a new FC mapping: -// interpolate(p, p + n - 1, filter.fc_plotter(), 1.0); -// Note that the x range of the interpolation points *must* be [0, 2047], -// and that additional end points *must* be present since the end points -// are not interpolated. -// ---------------------------------------------------------------------------- -PointPlotter Filter::fc_plotter() -{ - return PointPlotter(f0); -} diff --git a/plugins/sid/filter.h b/plugins/sid/filter.h deleted file mode 100644 index 8d8aece3dbe..00000000000 --- a/plugins/sid/filter.h +++ /dev/null @@ -1,531 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __FILTER_H__ -#define __FILTER_H__ - -#include "siddefs.h" -#include "spline.h" - -// ---------------------------------------------------------------------------- -// The SID filter is modeled with a two-integrator-loop biquadratic filter, -// which has been confirmed by Bob Yannes to be the actual circuit used in -// the SID chip. -// -// Measurements show that excellent emulation of the SID filter is achieved, -// except when high resonance is combined with high sustain levels. -// In this case the SID op-amps are performing less than ideally and are -// causing some peculiar behavior of the SID filter. This however seems to -// have more effect on the overall amplitude than on the color of the sound. -// -// The theory for the filter circuit can be found in "Microelectric Circuits" -// by Adel S. Sedra and Kenneth C. Smith. -// The circuit is modeled based on the explanation found there except that -// an additional inverter is used in the feedback from the bandpass output, -// allowing the summer op-amp to operate in single-ended mode. This yields -// inverted filter outputs with levels independent of Q, which corresponds with -// the results obtained from a real SID. -// -// We have been able to model the summer and the two integrators of the circuit -// to form components of an IIR filter. -// Vhp is the output of the summer, Vbp is the output of the first integrator, -// and Vlp is the output of the second integrator in the filter circuit. -// -// According to Bob Yannes, the active stages of the SID filter are not really -// op-amps. Rather, simple NMOS inverters are used. By biasing an inverter -// into its region of quasi-linear operation using a feedback resistor from -// input to output, a MOS inverter can be made to act like an op-amp for -// small signals centered around the switching threshold. -// -// Qualified guesses at SID filter schematics are depicted below. -// -// SID filter -// ---------- -// -// ----------------------------------------------- -// | | -// | ---Rq-- | -// | | | | -// | --------------|--R-----[A>--|--R-----[A>--| -// | | | | -// vi -----R1-- | | | -// -// vhp vbp vlp -// -// -// vi - input voltage -// vhp - highpass output -// vbp - bandpass output -// vlp - lowpass output -// [A> - op-amp -// R1 - summer resistor -// Rq - resistor array controlling resonance (4 resistors) -// R - NMOS FET voltage controlled resistor controlling cutoff frequency -// Rs - shunt resitor -// C - capacitor -// -// -// -// SID integrator -// -------------- -// -// V+ -// -// | -// | -// -----| -// | | -// | ||-- -// -|| -// ---C--- ||-> -// | | | -// |---Rs-----------|---- vo -// | | -// | ||-- -// vi ---- -----|------------|| -// | ^ | ||-> -// |___| | | -// ----- | | -// | | | -// |---R2-- | -// | -// R1 V- -// | -// | -// -// Vw -// -// ---------------------------------------------------------------------------- -class Filter -{ -public: - Filter(); - - void enable_filter(bool enable); - void set_chip_model(chip_model model); - - RESID_INLINE - void clock(sound_sample voice1, sound_sample voice2, sound_sample voice3, - sound_sample ext_in); - RESID_INLINE - void clock(cycle_count delta_t, - sound_sample voice1, sound_sample voice2, sound_sample voice3, - sound_sample ext_in); - void reset(); - - // Write registers. - void writeFC_LO(reg8); - void writeFC_HI(reg8); - void writeRES_FILT(reg8); - void writeMODE_VOL(reg8); - - // SID audio output (16 bits). - sound_sample output(); - - // Spline functions. - void fc_default(const fc_point*& points, int& count); - PointPlotter fc_plotter(); - -protected: - void set_w0(); - void set_Q(); - - // Filter enabled. - bool enabled; - - // Filter cutoff frequency. - reg12 fc; - - // Filter resonance. - reg8 res; - - // Selects which inputs to route through filter. - reg8 filt; - - // Switch voice 3 off. - reg8 voice3off; - - // Highpass, bandpass, and lowpass filter modes. - reg8 hp_bp_lp; - - // Output master volume. - reg4 vol; - - // Mixer DC offset. - sound_sample mixer_DC; - - // State of filter. - sound_sample Vhp; // highpass - sound_sample Vbp; // bandpass - sound_sample Vlp; // lowpass - sound_sample Vnf; // not filtered - - // Cutoff frequency, resonance. - sound_sample w0, w0_ceil_1, w0_ceil_dt; - sound_sample _1024_div_Q; - - // Cutoff frequency tables. - // FC is an 11 bit register. - sound_sample f0_6581[2048]; - sound_sample f0_8580[2048]; - sound_sample* f0; - static fc_point f0_points_6581[]; - static fc_point f0_points_8580[]; - fc_point* f0_points; - int f0_count; - -friend class cSID; -}; - - -// ---------------------------------------------------------------------------- -// Inline functions. -// The following functions are defined inline because they are called every -// time a sample is calculated. -// ---------------------------------------------------------------------------- - -#if RESID_INLINING || defined(__FILTER_CC__) - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -RESID_INLINE -void Filter::clock(sound_sample voice1, - sound_sample voice2, - sound_sample voice3, - sound_sample ext_in) -{ - // Scale each voice down from 20 to 13 bits. - voice1 >>= 7; - voice2 >>= 7; - - // NB! Voice 3 is not silenced by voice3off if it is routed through - // the filter. - if (voice3off && !(filt & 0x04)) { - voice3 = 0; - } - else { - voice3 >>= 7; - } - - ext_in >>= 7; - - // This is handy for testing. - if (!enabled) { - Vnf = voice1 + voice2 + voice3 + ext_in; - Vhp = Vbp = Vlp = 0; - return; - } - - // Route voices into or around filter. - // The code below is expanded to a switch for faster execution. - // (filt1 ? Vi : Vnf) += voice1; - // (filt2 ? Vi : Vnf) += voice2; - // (filt3 ? Vi : Vnf) += voice3; - - sound_sample Vi; - - switch (filt) { - default: - case 0x0: - Vi = 0; - Vnf = voice1 + voice2 + voice3 + ext_in; - break; - case 0x1: - Vi = voice1; - Vnf = voice2 + voice3 + ext_in; - break; - case 0x2: - Vi = voice2; - Vnf = voice1 + voice3 + ext_in; - break; - case 0x3: - Vi = voice1 + voice2; - Vnf = voice3 + ext_in; - break; - case 0x4: - Vi = voice3; - Vnf = voice1 + voice2 + ext_in; - break; - case 0x5: - Vi = voice1 + voice3; - Vnf = voice2 + ext_in; - break; - case 0x6: - Vi = voice2 + voice3; - Vnf = voice1 + ext_in; - break; - case 0x7: - Vi = voice1 + voice2 + voice3; - Vnf = ext_in; - break; - case 0x8: - Vi = ext_in; - Vnf = voice1 + voice2 + voice3; - break; - case 0x9: - Vi = voice1 + ext_in; - Vnf = voice2 + voice3; - break; - case 0xa: - Vi = voice2 + ext_in; - Vnf = voice1 + voice3; - break; - case 0xb: - Vi = voice1 + voice2 + ext_in; - Vnf = voice3; - break; - case 0xc: - Vi = voice3 + ext_in; - Vnf = voice1 + voice2; - break; - case 0xd: - Vi = voice1 + voice3 + ext_in; - Vnf = voice2; - break; - case 0xe: - Vi = voice2 + voice3 + ext_in; - Vnf = voice1; - break; - case 0xf: - Vi = voice1 + voice2 + voice3 + ext_in; - Vnf = 0; - break; - } - - // delta_t = 1 is converted to seconds given a 1MHz clock by dividing - // with 1 000 000. - - // Calculate filter outputs. - // Vhp = Vbp/Q - Vlp - Vi; - // dVbp = -w0*Vhp*dt; - // dVlp = -w0*Vbp*dt; - - sound_sample dVbp = (w0_ceil_1*Vhp >> 20); - sound_sample dVlp = (w0_ceil_1*Vbp >> 20); - Vbp -= dVbp; - Vlp -= dVlp; - Vhp = (Vbp*_1024_div_Q >> 10) - Vlp - Vi; -} - -// ---------------------------------------------------------------------------- -// SID clocking - delta_t cycles. -// ---------------------------------------------------------------------------- -RESID_INLINE -void Filter::clock(cycle_count delta_t, - sound_sample voice1, - sound_sample voice2, - sound_sample voice3, - sound_sample ext_in) -{ - // Scale each voice down from 20 to 13 bits. - voice1 >>= 7; - voice2 >>= 7; - - // NB! Voice 3 is not silenced by voice3off if it is routed through - // the filter. - if (voice3off && !(filt & 0x04)) { - voice3 = 0; - } - else { - voice3 >>= 7; - } - - ext_in >>= 7; - - // Enable filter on/off. - // This is not really part of SID, but is useful for testing. - // On slow CPUs it may be necessary to bypass the filter to lower the CPU - // load. - if (!enabled) { - Vnf = voice1 + voice2 + voice3 + ext_in; - Vhp = Vbp = Vlp = 0; - return; - } - - // Route voices into or around filter. - // The code below is expanded to a switch for faster execution. - // (filt1 ? Vi : Vnf) += voice1; - // (filt2 ? Vi : Vnf) += voice2; - // (filt3 ? Vi : Vnf) += voice3; - - sound_sample Vi; - - switch (filt) { - default: - case 0x0: - Vi = 0; - Vnf = voice1 + voice2 + voice3 + ext_in; - break; - case 0x1: - Vi = voice1; - Vnf = voice2 + voice3 + ext_in; - break; - case 0x2: - Vi = voice2; - Vnf = voice1 + voice3 + ext_in; - break; - case 0x3: - Vi = voice1 + voice2; - Vnf = voice3 + ext_in; - break; - case 0x4: - Vi = voice3; - Vnf = voice1 + voice2 + ext_in; - break; - case 0x5: - Vi = voice1 + voice3; - Vnf = voice2 + ext_in; - break; - case 0x6: - Vi = voice2 + voice3; - Vnf = voice1 + ext_in; - break; - case 0x7: - Vi = voice1 + voice2 + voice3; - Vnf = ext_in; - break; - case 0x8: - Vi = ext_in; - Vnf = voice1 + voice2 + voice3; - break; - case 0x9: - Vi = voice1 + ext_in; - Vnf = voice2 + voice3; - break; - case 0xa: - Vi = voice2 + ext_in; - Vnf = voice1 + voice3; - break; - case 0xb: - Vi = voice1 + voice2 + ext_in; - Vnf = voice3; - break; - case 0xc: - Vi = voice3 + ext_in; - Vnf = voice1 + voice2; - break; - case 0xd: - Vi = voice1 + voice3 + ext_in; - Vnf = voice2; - break; - case 0xe: - Vi = voice2 + voice3 + ext_in; - Vnf = voice1; - break; - case 0xf: - Vi = voice1 + voice2 + voice3 + ext_in; - Vnf = 0; - break; - } - - // Maximum delta cycles for the filter to work satisfactorily under current - // cutoff frequency and resonance constraints is approximately 8. - cycle_count delta_t_flt = 8; - - while (delta_t) { - if (delta_t < delta_t_flt) { - delta_t_flt = delta_t; - } - - // delta_t is converted to seconds given a 1MHz clock by dividing - // with 1 000 000. This is done in two operations to avoid integer - // multiplication overflow. - - // Calculate filter outputs. - // Vhp = Vbp/Q - Vlp - Vi; - // dVbp = -w0*Vhp*dt; - // dVlp = -w0*Vbp*dt; - sound_sample w0_delta_t = w0_ceil_dt*delta_t_flt >> 6; - - sound_sample dVbp = (w0_delta_t*Vhp >> 14); - sound_sample dVlp = (w0_delta_t*Vbp >> 14); - Vbp -= dVbp; - Vlp -= dVlp; - Vhp = (Vbp*_1024_div_Q >> 10) - Vlp - Vi; - - delta_t -= delta_t_flt; - } -} - - -// ---------------------------------------------------------------------------- -// SID audio output (20 bits). -// ---------------------------------------------------------------------------- -RESID_INLINE -sound_sample Filter::output() -{ - // This is handy for testing. - if (!enabled) { - return (Vnf + mixer_DC)*static_cast(vol); - } - - // Mix highpass, bandpass, and lowpass outputs. The sum is not - // weighted, this can be confirmed by sampling sound output for - // e.g. bandpass, lowpass, and bandpass+lowpass from a SID chip. - - // The code below is expanded to a switch for faster execution. - // if (hp) Vf += Vhp; - // if (bp) Vf += Vbp; - // if (lp) Vf += Vlp; - - sound_sample Vf; - - switch (hp_bp_lp) { - default: - case 0x0: - Vf = 0; - break; - case 0x1: - Vf = Vlp; - break; - case 0x2: - Vf = Vbp; - break; - case 0x3: - Vf = Vlp + Vbp; - break; - case 0x4: - Vf = Vhp; - break; - case 0x5: - Vf = Vlp + Vhp; - break; - case 0x6: - Vf = Vbp + Vhp; - break; - case 0x7: - Vf = Vlp + Vbp + Vhp; - break; - } - - // Sum non-filtered and filtered output. - // Multiply the sum with volume. - return (Vnf + Vf + mixer_DC)*static_cast(vol); -} - -#endif // RESID_INLINING || defined(__FILTER_CC__) - -#endif // not __FILTER_H__ diff --git a/plugins/sid/filter.png b/plugins/sid/filter.png deleted file mode 100644 index ff5c760db9b..00000000000 Binary files a/plugins/sid/filter.png and /dev/null differ diff --git a/plugins/sid/pot.cc b/plugins/sid/pot.cc deleted file mode 100644 index b60b2ec75c9..00000000000 --- a/plugins/sid/pot.cc +++ /dev/null @@ -1,26 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "pot.h" - -reg8 Potentiometer::readPOT() -{ - // NB! Not modeled. - return 0xff; -} diff --git a/plugins/sid/pot.h b/plugins/sid/pot.h deleted file mode 100644 index 6d44cb1a070..00000000000 --- a/plugins/sid/pot.h +++ /dev/null @@ -1,31 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __POT_H__ -#define __POT_H__ - -#include "siddefs.h" - -class Potentiometer -{ -public: - reg8 readPOT(); -}; - -#endif diff --git a/plugins/sid/sid.cc b/plugins/sid/sid.cc deleted file mode 100644 index c6e234fe0ca..00000000000 --- a/plugins/sid/sid.cc +++ /dev/null @@ -1,1019 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "sid.h" -#include - - -const int cSID::FIR_N = 125; -const int cSID::FIR_RES_INTERPOLATE = 285; -const int cSID::FIR_RES_FAST = 51473; -const int cSID::FIR_SHIFT = 15; -const int cSID::RINGSIZE = 16384; - - // Fixpoint constants (16.16 bits). -const int cSID::FIXP_SHIFT = 16; -const int cSID::FIXP_MASK = 0xffff; - - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -cSID::cSID() -{ - // Initialize pointers. - sample = 0; - fir = 0; - - voice[0].set_sync_source(&voice[2]); - voice[1].set_sync_source(&voice[0]); - voice[2].set_sync_source(&voice[1]); - - set_sampling_parameters(985248, SAMPLE_FAST, 44100); - - bus_value = 0; - bus_value_ttl = 0; - - ext_in = 0; -} - - -// ---------------------------------------------------------------------------- -// Destructor. -// ---------------------------------------------------------------------------- -cSID::~cSID() -{ - delete[] sample; - delete[] fir; -} - - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void cSID::set_chip_model(chip_model model) -{ - for (int i = 0; i < 3; i++) { - voice[i].set_chip_model(model); - } - - filter.set_chip_model(model); - extfilt.set_chip_model(model); -} - - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void cSID::reset() -{ - for (int i = 0; i < 3; i++) { - voice[i].reset(); - } - filter.reset(); - extfilt.reset(); - - bus_value = 0; - bus_value_ttl = 0; -} - - -// ---------------------------------------------------------------------------- -// Write 16-bit sample to audio input. -// NB! The caller is responsible for keeping the value within 16 bits. -// Note that to mix in an external audio signal, the signal should be -// resampled to 1MHz first to avoid sampling noise. -// ---------------------------------------------------------------------------- -void cSID::input(int sample) -{ - // Voice outputs are 20 bits. Scale up to match three voices in order - // to facilitate simulation of the MOS8580 "digi boost" hardware hack. - ext_in = (sample << 4)*3; -} - -// ---------------------------------------------------------------------------- -// Read sample from audio output. -// Both 16-bit and n-bit output is provided. -// ---------------------------------------------------------------------------- -int cSID::output() -{ - const int range = 1 << 16; - const int half = range >> 1; - int sample = extfilt.output()/((4095*255 >> 7)*3*15*2/range); - if (sample >= half) { - return half - 1; - } - if (sample < -half) { - return -half; - } - return sample; -} - -int cSID::output(int bits) -{ - const int range = 1 << bits; - const int half = range >> 1; - int sample = extfilt.output()/((4095*255 >> 7)*3*15*2/range); - if (sample >= half) { - return half - 1; - } - if (sample < -half) { - return -half; - } - return sample; -} - - -// ---------------------------------------------------------------------------- -// Read registers. -// -// Reading a write only register returns the last byte written to any SID -// register. The individual bits in this value start to fade down towards -// zero after a few cycles. All bits reach zero within approximately -// $2000 - $4000 cycles. -// It has been claimed that this fading happens in an orderly fashion, however -// sampling of write only registers reveals that this is not the case. -// NB! This is not correctly modeled. -// The actual use of write only registers has largely been made in the belief -// that all SID registers are readable. To support this belief the read -// would have to be done immediately after a write to the same register -// (remember that an intermediate write to another register would yield that -// value instead). With this in mind we return the last value written to -// any SID register for $2000 cycles without modeling the bit fading. -// ---------------------------------------------------------------------------- -reg8 cSID::read(reg8 offset) -{ - switch (offset) { - case 0x19: - return potx.readPOT(); - case 0x1a: - return poty.readPOT(); - case 0x1b: - return voice[2].wave.readOSC(); - case 0x1c: - return voice[2].envelope.readENV(); - default: - return bus_value; - } -} - - -// ---------------------------------------------------------------------------- -// Write registers. -// ---------------------------------------------------------------------------- -void cSID::write(reg8 offset, reg8 value) -{ - bus_value = value; - bus_value_ttl = 0x2000; - - switch (offset) { - case 0x00: - voice[0].wave.writeFREQ_LO(value); - break; - case 0x01: - voice[0].wave.writeFREQ_HI(value); - break; - case 0x02: - voice[0].wave.writePW_LO(value); - break; - case 0x03: - voice[0].wave.writePW_HI(value); - break; - case 0x04: - voice[0].writeCONTROL_REG(value); - break; - case 0x05: - voice[0].envelope.writeATTACK_DECAY(value); - break; - case 0x06: - voice[0].envelope.writeSUSTAIN_RELEASE(value); - break; - case 0x07: - voice[1].wave.writeFREQ_LO(value); - break; - case 0x08: - voice[1].wave.writeFREQ_HI(value); - break; - case 0x09: - voice[1].wave.writePW_LO(value); - break; - case 0x0a: - voice[1].wave.writePW_HI(value); - break; - case 0x0b: - voice[1].writeCONTROL_REG(value); - break; - case 0x0c: - voice[1].envelope.writeATTACK_DECAY(value); - break; - case 0x0d: - voice[1].envelope.writeSUSTAIN_RELEASE(value); - break; - case 0x0e: - voice[2].wave.writeFREQ_LO(value); - break; - case 0x0f: - voice[2].wave.writeFREQ_HI(value); - break; - case 0x10: - voice[2].wave.writePW_LO(value); - break; - case 0x11: - voice[2].wave.writePW_HI(value); - break; - case 0x12: - voice[2].writeCONTROL_REG(value); - break; - case 0x13: - voice[2].envelope.writeATTACK_DECAY(value); - break; - case 0x14: - voice[2].envelope.writeSUSTAIN_RELEASE(value); - break; - case 0x15: - filter.writeFC_LO(value); - break; - case 0x16: - filter.writeFC_HI(value); - break; - case 0x17: - filter.writeRES_FILT(value); - break; - case 0x18: - filter.writeMODE_VOL(value); - break; - default: - break; - } -} - - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -cSID::State::State() -{ - int i; - - for (i = 0; i < 0x20; i++) { - sid_register[i] = 0; - } - - bus_value = 0; - bus_value_ttl = 0; - - for (i = 0; i < 3; i++) { - accumulator[i] = 0; - shift_register[i] = 0x7ffff8; - rate_counter[i] = 0; - rate_counter_period[i] = 9; - exponential_counter[i] = 0; - exponential_counter_period[i] = 1; - envelope_counter[i] = 0; - envelope_state[i] = EnvelopeGenerator::RELEASE; - hold_zero[i] = true; - } -} - - -// ---------------------------------------------------------------------------- -// Read state. -// ---------------------------------------------------------------------------- -cSID::State cSID::read_state() -{ - State state; - int i, j; - - for (i = 0, j = 0; i < 3; i++, j += 7) { - WaveformGenerator& wave = voice[i].wave; - EnvelopeGenerator& envelope = voice[i].envelope; - state.sid_register[j + 0] = wave.freq & 0xff; - state.sid_register[j + 1] = wave.freq >> 8; - state.sid_register[j + 2] = wave.pw & 0xff; - state.sid_register[j + 3] = wave.pw >> 8; - state.sid_register[j + 4] = - (wave.waveform << 4) - | (wave.test ? 0x08 : 0) - | (wave.ring_mod ? 0x04 : 0) - | (wave.sync ? 0x02 : 0) - | (envelope.gate ? 0x01 : 0); - state.sid_register[j + 5] = (envelope.attack << 4) | envelope.decay; - state.sid_register[j + 6] = (envelope.sustain << 4) | envelope.release; - } - - state.sid_register[j++] = filter.fc & 0x007; - state.sid_register[j++] = filter.fc >> 3; - state.sid_register[j++] = (filter.res << 4) | filter.filt; - state.sid_register[j++] = - (filter.voice3off ? 0x80 : 0) - | (filter.hp_bp_lp << 4) - | filter.vol; - - // These registers are superfluous, but included for completeness. - for (; j < 0x1d; j++) { - state.sid_register[j] = read(j); - } - for (; j < 0x20; j++) { - state.sid_register[j] = 0; - } - - state.bus_value = bus_value; - state.bus_value_ttl = bus_value_ttl; - - for (i = 0; i < 3; i++) { - state.accumulator[i] = voice[i].wave.accumulator; - state.shift_register[i] = voice[i].wave.shift_register; - state.rate_counter[i] = voice[i].envelope.rate_counter; - state.rate_counter_period[i] = voice[i].envelope.rate_period; - state.exponential_counter[i] = voice[i].envelope.exponential_counter; - state.exponential_counter_period[i] = voice[i].envelope.exponential_counter_period; - state.envelope_counter[i] = voice[i].envelope.envelope_counter; - state.envelope_state[i] = voice[i].envelope.state; - state.hold_zero[i] = voice[i].envelope.hold_zero; - } - - return state; -} - - -// ---------------------------------------------------------------------------- -// Write state. -// ---------------------------------------------------------------------------- -void cSID::write_state(const State& state) -{ - int i; - - for (i = 0; i <= 0x18; i++) { - write(i, state.sid_register[i]); - } - - bus_value = state.bus_value; - bus_value_ttl = state.bus_value_ttl; - - for (i = 0; i < 3; i++) { - voice[i].wave.accumulator = state.accumulator[i]; - voice[i].wave.shift_register = state.shift_register[i]; - voice[i].envelope.rate_counter = state.rate_counter[i]; - voice[i].envelope.rate_period = state.rate_counter_period[i]; - voice[i].envelope.exponential_counter = state.exponential_counter[i]; - voice[i].envelope.exponential_counter_period = state.exponential_counter_period[i]; - voice[i].envelope.envelope_counter = state.envelope_counter[i]; - voice[i].envelope.state = state.envelope_state[i]; - voice[i].envelope.hold_zero = state.hold_zero[i]; - } -} - - -// ---------------------------------------------------------------------------- -// Enable filter. -// ---------------------------------------------------------------------------- -void cSID::enable_filter(bool enable) -{ - filter.enable_filter(enable); -} - - -// ---------------------------------------------------------------------------- -// Enable external filter. -// ---------------------------------------------------------------------------- -void cSID::enable_external_filter(bool enable) -{ - extfilt.enable_filter(enable); -} - - -// ---------------------------------------------------------------------------- -// I0() computes the 0th order modified Bessel function of the first kind. -// This function is originally from resample-1.5/filterkit.c by J. O. Smith. -// ---------------------------------------------------------------------------- -double cSID::I0(double x) -{ - // Max error acceptable in I0. - const double I0e = 1e-6; - - double sum, u, halfx, temp; - int n; - - sum = u = n = 1; - halfx = x/2.0; - - do { - temp = halfx/n++; - u *= temp*temp; - sum += u; - } while (u >= I0e*sum); - - return sum; -} - - -// ---------------------------------------------------------------------------- -// Setting of SID sampling parameters. -// -// Use a clock freqency of 985248Hz for PAL C64, 1022730Hz for NTSC C64. -// The default end of passband frequency is pass_freq = 0.9*sample_freq/2 -// for sample frequencies up to ~ 44.1kHz, and 20kHz for higher sample -// frequencies. -// -// For resampling, the ratio between the clock frequency and the sample -// frequency is limited as follows: -// 125*clock_freq/sample_freq < 16384 -// E.g. provided a clock frequency of ~ 1MHz, the sample frequency can not -// be set lower than ~ 8kHz. A lower sample frequency would make the -// resampling code overfill its 16k sample ring buffer. -// -// The end of passband frequency is also limited: -// pass_freq <= 0.9*sample_freq/2 - -// E.g. for a 44.1kHz sampling rate the end of passband frequency is limited -// to slightly below 20kHz. This constraint ensures that the FIR table is -// not overfilled. -// ---------------------------------------------------------------------------- -bool cSID::set_sampling_parameters(double clock_freq, sampling_method method, - double sample_freq, double pass_freq, - double filter_scale) -{ - // Check resampling constraints. - if (method == SAMPLE_RESAMPLE_INTERPOLATE || method == SAMPLE_RESAMPLE_FAST) - { - // Check whether the sample ring buffer would overfill. - if (FIR_N*clock_freq/sample_freq >= RINGSIZE) { - return false; - } - - // The default passband limit is 0.9*sample_freq/2 for sample - // frequencies below ~ 44.1kHz, and 20kHz for higher sample frequencies. - if (pass_freq < 0) { - pass_freq = 20000; - if (2*pass_freq/sample_freq >= 0.9) { - pass_freq = 0.9*sample_freq/2; - } - } - // Check whether the FIR table would overfill. - else if (pass_freq > 0.9*sample_freq/2) { - return false; - } - - // The filter scaling is only included to avoid clipping, so keep - // it sane. - if (filter_scale < 0.9 || filter_scale > 1.0) { - return false; - } - } - - clock_frequency = clock_freq; - sampling = method; - - cycles_per_sample = - cycle_count(clock_freq/sample_freq*(1 << FIXP_SHIFT) + 0.5); - - sample_offset = 0; - sample_prev = 0; - - // FIR initialization is only necessary for resampling. - if (method != SAMPLE_RESAMPLE_INTERPOLATE && method != SAMPLE_RESAMPLE_FAST) - { - delete[] sample; - delete[] fir; - sample = 0; - fir = 0; - return true; - } - - const double pi = 3.1415926535897932385; - - // 16 bits -> -96dB stopband attenuation. - const double A = -20*log10(1.0/(1 << 16)); - // A fraction of the bandwidth is allocated to the transition band, - double dw = (1 - 2*pass_freq/sample_freq)*pi; - // The cutoff frequency is midway through the transition band. - double wc = (2*pass_freq/sample_freq + 1)*pi/2; - - // For calculation of beta and N see the reference for the kaiserord - // function in the MATLAB Signal Processing Toolbox: - // http://www.mathworks.com/access/helpdesk/help/toolbox/signal/kaiserord.html - const double beta = 0.1102*(A - 8.7); - const double I0beta = I0(beta); - - // The filter order will maximally be 124 with the current constraints. - // N >= (96.33 - 7.95)/(2.285*0.1*pi) -> N >= 123 - // The filter order is equal to the number of zero crossings, i.e. - // it should be an even number (sinc is symmetric about x = 0). - int N = int((A - 7.95)/(2.285*dw) + 0.5); - N += N & 1; - - double f_samples_per_cycle = sample_freq/clock_freq; - double f_cycles_per_sample = clock_freq/sample_freq; - - // The filter length is equal to the filter order + 1. - // The filter length must be an odd number (sinc is symmetric about x = 0). - fir_N = int(N*f_cycles_per_sample) + 1; - fir_N |= 1; - - // We clamp the filter table resolution to 2^n, making the fixpoint - // sample_offset a whole multiple of the filter table resolution. - int res = method == SAMPLE_RESAMPLE_INTERPOLATE ? - FIR_RES_INTERPOLATE : FIR_RES_FAST; - int n = (int)ceil(log(res/f_cycles_per_sample)/log(2)); - fir_RES = 1 << n; - - // Allocate memory for FIR tables. - delete[] fir; - fir = new short[fir_N*fir_RES]; - - // Calculate fir_RES FIR tables for linear interpolation. - for (int i = 0; i < fir_RES; i++) { - int fir_offset = i*fir_N + fir_N/2; - double j_offset = double(i)/fir_RES; - // Calculate FIR table. This is the sinc function, weighted by the - // Kaiser window. - for (int j = -fir_N/2; j <= fir_N/2; j++) { - double jx = j - j_offset; - double wt = wc*jx/f_cycles_per_sample; - double temp = jx/(fir_N/2); - double Kaiser = - fabs(temp) <= 1 ? I0(beta*sqrt(1 - temp*temp))/I0beta : 0; - double sincwt = - fabs(wt) >= 1e-6 ? sin(wt)/wt : 1; - double val = - (1 << FIR_SHIFT)*filter_scale*f_samples_per_cycle*wc/pi*sincwt*Kaiser; - fir[fir_offset + j] = short(val + 0.5); - } - } - - // Allocate sample buffer. - if (!sample) { - sample = new short[RINGSIZE*2]; - } - // Clear sample buffer. - for (int j = 0; j < RINGSIZE*2; j++) { - sample[j] = 0; - } - sample_index = 0; - - return true; -} - - -// ---------------------------------------------------------------------------- -// Adjustment of SID sampling frequency. -// -// In some applications, e.g. a C64 emulator, it can be desirable to -// synchronize sound with a timer source. This is supported by adjustment of -// the SID sampling frequency. -// -// NB! Adjustment of the sampling frequency may lead to noticeable shifts in -// frequency, and should only be used for interactive applications. Note also -// that any adjustment of the sampling frequency will change the -// characteristics of the resampling filter, since the filter is not rebuilt. -// ---------------------------------------------------------------------------- -void cSID::adjust_sampling_frequency(double sample_freq) -{ - cycles_per_sample = - cycle_count(clock_frequency/sample_freq*(1 << FIXP_SHIFT) + 0.5); -} - - -// ---------------------------------------------------------------------------- -// Return array of default spline interpolation points to map FC to -// filter cutoff frequency. -// ---------------------------------------------------------------------------- -void cSID::fc_default(const fc_point*& points, int& count) -{ - filter.fc_default(points, count); -} - - -// ---------------------------------------------------------------------------- -// Return FC spline plotter object. -// ---------------------------------------------------------------------------- -PointPlotter cSID::fc_plotter() -{ - return filter.fc_plotter(); -} - - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -void cSID::clock() -{ - int i; - - // Age bus value. - if (--bus_value_ttl <= 0) { - bus_value = 0; - bus_value_ttl = 0; - } - - // Clock amplitude modulators. - for (i = 0; i < 3; i++) { - voice[i].envelope.clock(); - } - - // Clock oscillators. - for (i = 0; i < 3; i++) { - voice[i].wave.clock(); - } - - // Synchronize oscillators. - for (i = 0; i < 3; i++) { - voice[i].wave.synchronize(); - } - - // Clock filter. - filter.clock(voice[0].output(), voice[1].output(), voice[2].output(), ext_in); - - // Clock external filter. - extfilt.clock(filter.output()); -} - - -// ---------------------------------------------------------------------------- -// SID clocking - delta_t cycles. -// ---------------------------------------------------------------------------- -void cSID::clock(cycle_count delta_t) -{ - int i; - - if (delta_t <= 0) { - return; - } - - // Age bus value. - bus_value_ttl -= delta_t; - if (bus_value_ttl <= 0) { - bus_value = 0; - bus_value_ttl = 0; - } - - // Clock amplitude modulators. - for (i = 0; i < 3; i++) { - voice[i].envelope.clock(delta_t); - } - - // Clock and synchronize oscillators. - // Loop until we reach the current cycle. - cycle_count delta_t_osc = delta_t; - while (delta_t_osc) { - cycle_count delta_t_min = delta_t_osc; - - // Find minimum number of cycles to an oscillator accumulator MSB toggle. - // We have to clock on each MSB on / MSB off for hard sync to operate - // correctly. - for (i = 0; i < 3; i++) { - WaveformGenerator& wave = voice[i].wave; - - // It is only necessary to clock on the MSB of an oscillator that is - // a sync source and has freq != 0. - if (!(wave.sync_dest->sync && wave.freq)) { - continue; - } - - reg16 freq = wave.freq; - reg24 accumulator = wave.accumulator; - - // Clock on MSB off if MSB is on, clock on MSB on if MSB is off. - reg24 delta_accumulator = - (accumulator & 0x800000 ? 0x1000000 : 0x800000) - accumulator; - - cycle_count delta_t_next = delta_accumulator/freq; - if (delta_accumulator%freq) { - ++delta_t_next; - } - - if (delta_t_next < delta_t_min) { - delta_t_min = delta_t_next; - } - } - - // Clock oscillators. - for (i = 0; i < 3; i++) { - voice[i].wave.clock(delta_t_min); - } - - // Synchronize oscillators. - for (i = 0; i < 3; i++) { - voice[i].wave.synchronize(); - } - - delta_t_osc -= delta_t_min; - } - - // Clock filter. - filter.clock(delta_t, - voice[0].output(), voice[1].output(), voice[2].output(), ext_in); - - // Clock external filter. - extfilt.clock(delta_t, filter.output()); -} - - -// ---------------------------------------------------------------------------- -// SID clocking with audio sampling. -// Fixpoint arithmetics is used. -// -// The example below shows how to clock the SID a specified amount of cycles -// while producing audio output: -// -// while (delta_t) { -// bufindex += sid.clock(delta_t, buf + bufindex, buflength - bufindex); -// write(dsp, buf, bufindex*2); -// bufindex = 0; -// } -// -// ---------------------------------------------------------------------------- -int cSID::clock(cycle_count& delta_t, short* buf, int n, int interleave) -{ - switch (sampling) { - default: - case SAMPLE_FAST: - return clock_fast(delta_t, buf, n, interleave); - case SAMPLE_INTERPOLATE: - return clock_interpolate(delta_t, buf, n, interleave); - case SAMPLE_RESAMPLE_INTERPOLATE: - return clock_resample_interpolate(delta_t, buf, n, interleave); - case SAMPLE_RESAMPLE_FAST: - return clock_resample_fast(delta_t, buf, n, interleave); - } -} - -// ---------------------------------------------------------------------------- -// SID clocking with audio sampling - delta clocking picking nearest sample. -// ---------------------------------------------------------------------------- -RESID_INLINE -int cSID::clock_fast(cycle_count& delta_t, short* buf, int n, - int interleave) -{ - int s = 0; - - for (;;) { - cycle_count next_sample_offset = sample_offset + cycles_per_sample + (1 << (FIXP_SHIFT - 1)); - cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; - if (delta_t_sample > delta_t) { - break; - } - if (s >= n) { - return s; - } - clock(delta_t_sample); - delta_t -= delta_t_sample; - sample_offset = (next_sample_offset & FIXP_MASK) - (1 << (FIXP_SHIFT - 1)); - buf[s++*interleave] = output(); - } - - clock(delta_t); - sample_offset -= delta_t << FIXP_SHIFT; - delta_t = 0; - return s; -} - - -// ---------------------------------------------------------------------------- -// SID clocking with audio sampling - cycle based with linear sample -// interpolation. -// -// Here the chip is clocked every cycle. This yields higher quality -// sound since the samples are linearly interpolated, and since the -// external filter attenuates frequencies above 16kHz, thus reducing -// sampling noise. -// ---------------------------------------------------------------------------- -RESID_INLINE -int cSID::clock_interpolate(cycle_count& delta_t, short* buf, int n, - int interleave) -{ - int s = 0; - int i; - - for (;;) { - cycle_count next_sample_offset = sample_offset + cycles_per_sample; - cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; - if (delta_t_sample > delta_t) { - break; - } - if (s >= n) { - return s; - } - for (i = 0; i < delta_t_sample - 1; i++) { - clock(); - } - if (i < delta_t_sample) { - sample_prev = output(); - clock(); - } - - delta_t -= delta_t_sample; - sample_offset = next_sample_offset & FIXP_MASK; - - short sample_now = output(); - buf[s++*interleave] = - sample_prev + (sample_offset*(sample_now - sample_prev) >> FIXP_SHIFT); - sample_prev = sample_now; - } - - for (i = 0; i < delta_t - 1; i++) { - clock(); - } - if (i < delta_t) { - sample_prev = output(); - clock(); - } - sample_offset -= delta_t << FIXP_SHIFT; - delta_t = 0; - return s; -} - - -// ---------------------------------------------------------------------------- -// SID clocking with audio sampling - cycle based with audio resampling. -// -// This is the theoretically correct (and computationally intensive) audio -// sample generation. The samples are generated by resampling to the specified -// sampling frequency. The work rate is inversely proportional to the -// percentage of the bandwidth allocated to the filter transition band. -// -// This implementation is based on the paper "A Flexible Sampling-Rate -// Conversion Method", by J. O. Smith and P. Gosset, or rather on the -// expanded tutorial on the "Digital Audio Resampling Home Page": -// http://www-ccrma.stanford.edu/~jos/resample/ -// -// By building shifted FIR tables with samples according to the -// sampling frequency, this implementation dramatically reduces the -// computational effort in the filter convolutions, without any loss -// of accuracy. The filter convolutions are also vectorizable on -// current hardware. -// -// Further possible optimizations are: -// * An equiripple filter design could yield a lower filter order, see -// http://www.mwrf.com/Articles/ArticleID/7229/7229.html -// * The Convolution Theorem could be used to bring the complexity of -// convolution down from O(n*n) to O(n*log(n)) using the Fast Fourier -// Transform, see http://en.wikipedia.org/wiki/Convolution_theorem -// * Simply resampling in two steps can also yield computational -// savings, since the transition band will be wider in the first step -// and the required filter order is thus lower in this step. -// Laurent Ganier has found the optimal intermediate sampling frequency -// to be (via derivation of sum of two steps): -// 2 * pass_freq + sqrt [ 2 * pass_freq * orig_sample_freq -// * (dest_sample_freq - 2 * pass_freq) / dest_sample_freq ] -// -// NB! the result of right shifting negative numbers is really -// implementation dependent in the C++ standard. -// ---------------------------------------------------------------------------- -RESID_INLINE -int cSID::clock_resample_interpolate(cycle_count& delta_t, short* buf, int n, - int interleave) -{ - int s = 0; - - for (;;) { - cycle_count next_sample_offset = sample_offset + cycles_per_sample; - cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; - if (delta_t_sample > delta_t) { - break; - } - if (s >= n) { - return s; - } - for (int i = 0; i < delta_t_sample; i++) { - clock(); - sample[sample_index] = sample[sample_index + RINGSIZE] = output(); - ++sample_index; - sample_index &= 0x3fff; - } - delta_t -= delta_t_sample; - sample_offset = next_sample_offset & FIXP_MASK; - - int fir_offset = sample_offset*fir_RES >> FIXP_SHIFT; - int fir_offset_rmd = sample_offset*fir_RES & FIXP_MASK; - short* fir_start = fir + fir_offset*fir_N; - short* sample_start = sample + sample_index - fir_N + RINGSIZE; - - // Convolution with filter impulse response. - int v1 = 0; - for (int j = 0; j < fir_N; j++) { - v1 += sample_start[j]*fir_start[j]; - } - - // Use next FIR table, wrap around to first FIR table using - // previous sample. - if (++fir_offset == fir_RES) { - fir_offset = 0; - --sample_start; - } - fir_start = fir + fir_offset*fir_N; - - // Convolution with filter impulse response. - int v2 = 0; - for (int j = 0; j < fir_N; j++) { - v2 += sample_start[j]*fir_start[j]; - } - - // Linear interpolation. - // fir_offset_rmd is equal for all samples, it can thus be factorized out: - // sum(v1 + rmd*(v2 - v1)) = sum(v1) + rmd*(sum(v2) - sum(v1)) - int v = v1 + (fir_offset_rmd*(v2 - v1) >> FIXP_SHIFT); - - v >>= FIR_SHIFT; - - // Saturated arithmetics to guard against 16 bit sample overflow. - const int half = 1 << 15; - if (v >= half) { - v = half - 1; - } - else if (v < -half) { - v = -half; - } - - buf[s++*interleave] = v; - } - - for (int i = 0; i < delta_t; i++) { - clock(); - sample[sample_index] = sample[sample_index + RINGSIZE] = output(); - ++sample_index; - sample_index &= 0x3fff; - } - sample_offset -= delta_t << FIXP_SHIFT; - delta_t = 0; - return s; -} - - -// ---------------------------------------------------------------------------- -// SID clocking with audio sampling - cycle based with audio resampling. -// ---------------------------------------------------------------------------- -RESID_INLINE -int cSID::clock_resample_fast(cycle_count& delta_t, short* buf, int n, - int interleave) -{ - int s = 0; - - for (;;) { - cycle_count next_sample_offset = sample_offset + cycles_per_sample; - cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; - if (delta_t_sample > delta_t) { - break; - } - if (s >= n) { - return s; - } - for (int i = 0; i < delta_t_sample; i++) { - clock(); - sample[sample_index] = sample[sample_index + RINGSIZE] = output(); - ++sample_index; - sample_index &= 0x3fff; - } - delta_t -= delta_t_sample; - sample_offset = next_sample_offset & FIXP_MASK; - - int fir_offset = sample_offset*fir_RES >> FIXP_SHIFT; - short* fir_start = fir + fir_offset*fir_N; - short* sample_start = sample + sample_index - fir_N + RINGSIZE; - - // Convolution with filter impulse response. - int v = 0; - for (int j = 0; j < fir_N; j++) { - v += sample_start[j]*fir_start[j]; - } - - v >>= FIR_SHIFT; - - // Saturated arithmetics to guard against 16 bit sample overflow. - const int half = 1 << 15; - if (v >= half) { - v = half - 1; - } - else if (v < -half) { - v = -half; - } - - buf[s++*interleave] = v; - } - - for (int i = 0; i < delta_t; i++) { - clock(); - sample[sample_index] = sample[sample_index + RINGSIZE] = output(); - ++sample_index; - sample_index &= 0x3fff; - } - sample_offset -= delta_t << FIXP_SHIFT; - delta_t = 0; - return s; -} diff --git a/plugins/sid/sid.h b/plugins/sid/sid.h deleted file mode 100644 index 0f596a55604..00000000000 --- a/plugins/sid/sid.h +++ /dev/null @@ -1,146 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __SID_H__ -#define __SID_H__ - -#include "siddefs.h" -#include "voice.h" -#include "filter.h" -#include "extfilt.h" -#include "pot.h" - -class cSID -{ -public: - cSID(); - ~cSID(); - - void set_chip_model(chip_model model); - void enable_filter(bool enable); - void enable_external_filter(bool enable); - bool set_sampling_parameters(double clock_freq, sampling_method method, - double sample_freq, double pass_freq = -1, - double filter_scale = 0.97); - void adjust_sampling_frequency(double sample_freq); - - void fc_default(const fc_point*& points, int& count); - PointPlotter fc_plotter(); - - void clock(); - void clock(cycle_count delta_t); - int clock(cycle_count& delta_t, short* buf, int n, int interleave = 1); - void reset(); - - // Read/write registers. - reg8 read(reg8 offset); - void write(reg8 offset, reg8 value); - - // Read/write state. - class State - { - public: - State(); - - char sid_register[0x20]; - - reg8 bus_value; - cycle_count bus_value_ttl; - - reg24 accumulator[3]; - reg24 shift_register[3]; - reg16 rate_counter[3]; - reg16 rate_counter_period[3]; - reg16 exponential_counter[3]; - reg16 exponential_counter_period[3]; - reg8 envelope_counter[3]; - EnvelopeGenerator::State envelope_state[3]; - bool hold_zero[3]; - }; - - State read_state(); - void write_state(const State& state); - - // 16-bit input (EXT IN). - void input(int sample); - - // 16-bit output (AUDIO OUT). - int output(); - // n-bit output. - int output(int bits); - -protected: - static double I0(double x); - RESID_INLINE int clock_fast(cycle_count& delta_t, short* buf, int n, - int interleave); - RESID_INLINE int clock_interpolate(cycle_count& delta_t, short* buf, int n, - int interleave); - RESID_INLINE int clock_resample_interpolate(cycle_count& delta_t, short* buf, - int n, int interleave); - RESID_INLINE int clock_resample_fast(cycle_count& delta_t, short* buf, - int n, int interleave); - - Voice voice[3]; - Filter filter; - ExternalFilter extfilt; - Potentiometer potx; - Potentiometer poty; - - reg8 bus_value; - cycle_count bus_value_ttl; - - double clock_frequency; - - // External audio input. - int ext_in; - - // Resampling constants. - // The error in interpolated lookup is bounded by 1.234/L^2, - // while the error in non-interpolated lookup is bounded by - // 0.7854/L + 0.4113/L^2, see - // http://www-ccrma.stanford.edu/~jos/resample/Choice_Table_Size.html - // For a resolution of 16 bits this yields L >= 285 and L >= 51473, - // respectively. - static const int FIR_N; - static const int FIR_RES_INTERPOLATE; - static const int FIR_RES_FAST; - static const int FIR_SHIFT; - static const int RINGSIZE; - - // Fixpoint constants (16.16 bits). - static const int FIXP_SHIFT; - static const int FIXP_MASK; - - // Sampling variables. - sampling_method sampling; - cycle_count cycles_per_sample; - cycle_count sample_offset; - int sample_index; - short sample_prev; - int fir_N; - int fir_RES; - - // Ring buffer with overflow for contiguous storage of RINGSIZE samples. - short* sample; - - // FIR_RES filter tables (FIR_N*FIR_RES). - short* fir; -}; - -#endif // not __SID_H__ diff --git a/plugins/sid/siddefs.h b/plugins/sid/siddefs.h deleted file mode 100644 index e8a9ef57816..00000000000 --- a/plugins/sid/siddefs.h +++ /dev/null @@ -1,69 +0,0 @@ -#define VERSION "0.16" - -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 1999 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __SIDDEFS_H__ -#define __SIDDEFS_H__ - -// Define bool, true, and false for C++ compilers that lack these keywords. -#define RESID_HAVE_BOOL 1 - -#if !RESID_HAVE_BOOL -typedef int bool; -const bool true = 1; -const bool false = 0; -#endif - -// We could have used the smallest possible data type for each SID register, -// however this would give a slower engine because of data type conversions. -// An int is assumed to be at least 32 bits (necessary in the types reg24, -// cycle_count, and sound_sample). GNU does not support 16-bit machines -// (GNU Coding Standards: Portability between CPUs), so this should be -// a valid assumption. - -typedef unsigned int reg4; -typedef unsigned int reg8; -typedef unsigned int reg12; -typedef unsigned int reg16; -typedef unsigned int reg24; - -typedef int cycle_count; -typedef int sound_sample; -typedef sound_sample fc_point[2]; - -enum chip_model { MOS6581, MOS8580 }; - -enum sampling_method { SAMPLE_FAST, SAMPLE_INTERPOLATE, - SAMPLE_RESAMPLE_INTERPOLATE, SAMPLE_RESAMPLE_FAST }; - -extern "C" -{ -#ifndef __VERSION_CC__ -extern const char* resid_version_string; -#else -const char* resid_version_string = VERSION; -#endif -} - -// Inlining on/off. -#define RESID_INLINING 1 -#define RESID_INLINE inline - -#endif // not __SIDDEFS_H__ diff --git a/plugins/sid/spline.h b/plugins/sid/spline.h deleted file mode 100644 index 93ba2776aa0..00000000000 --- a/plugins/sid/spline.h +++ /dev/null @@ -1,272 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __SPLINE_H__ -#define __SPLINE_H__ - -// Our objective is to construct a smooth interpolating single-valued function -// y = f(x). -// -// Catmull-Rom splines are widely used for interpolation, however these are -// parametric curves [x(t) y(t) ...] and can not be used to directly calculate -// y = f(x). -// For a discussion of Catmull-Rom splines see Catmull, E., and R. Rom, -// "A Class of Local Interpolating Splines", Computer Aided Geometric Design. -// -// Natural cubic splines are single-valued functions, and have been used in -// several applications e.g. to specify gamma curves for image display. -// These splines do not afford local control, and a set of linear equations -// including all interpolation points must be solved before any point on the -// curve can be calculated. The lack of local control makes the splines -// more difficult to handle than e.g. Catmull-Rom splines, and real-time -// interpolation of a stream of data points is not possible. -// For a discussion of natural cubic splines, see e.g. Kreyszig, E., "Advanced -// Engineering Mathematics". -// -// Our approach is to approximate the properties of Catmull-Rom splines for -// piecewice cubic polynomials f(x) = ax^3 + bx^2 + cx + d as follows: -// Each curve segment is specified by four interpolation points, -// p0, p1, p2, p3. -// The curve between p1 and p2 must interpolate both p1 and p2, and in addition -// f'(p1.x) = k1 = (p2.y - p0.y)/(p2.x - p0.x) and -// f'(p2.x) = k2 = (p3.y - p1.y)/(p3.x - p1.x). -// -// The constraints are expressed by the following system of linear equations -// -// [ 1 xi xi^2 xi^3 ] [ d ] [ yi ] -// [ 1 2*xi 3*xi^2 ] * [ c ] = [ ki ] -// [ 1 xj xj^2 xj^3 ] [ b ] [ yj ] -// [ 1 2*xj 3*xj^2 ] [ a ] [ kj ] -// -// Solving using Gaussian elimination and back substitution, setting -// dy = yj - yi, dx = xj - xi, we get -// -// a = ((ki + kj) - 2*dy/dx)/(dx*dx); -// b = ((kj - ki)/dx - 3*(xi + xj)*a)/2; -// c = ki - (3*xi*a + 2*b)*xi; -// d = yi - ((xi*a + b)*xi + c)*xi; -// -// Having calculated the coefficients of the cubic polynomial we have the -// choice of evaluation by brute force -// -// for (x = x1; x <= x2; x += res) { -// y = ((a*x + b)*x + c)*x + d; -// plot(x, y); -// } -// -// or by forward differencing -// -// y = ((a*x1 + b)*x1 + c)*x1 + d; -// dy = (3*a*(x1 + res) + 2*b)*x1*res + ((a*res + b)*res + c)*res; -// d2y = (6*a*(x1 + res) + 2*b)*res*res; -// d3y = 6*a*res*res*res; -// -// for (x = x1; x <= x2; x += res) { -// plot(x, y); -// y += dy; dy += d2y; d2y += d3y; -// } -// -// See Foley, Van Dam, Feiner, Hughes, "Computer Graphics, Principles and -// Practice" for a discussion of forward differencing. -// -// If we have a set of interpolation points p0, ..., pn, we may specify -// curve segments between p0 and p1, and between pn-1 and pn by using the -// following constraints: -// f''(p0.x) = 0 and -// f''(pn.x) = 0. -// -// Substituting the results for a and b in -// -// 2*b + 6*a*xi = 0 -// -// we get -// -// ki = (3*dy/dx - kj)/2; -// -// or by substituting the results for a and b in -// -// 2*b + 6*a*xj = 0 -// -// we get -// -// kj = (3*dy/dx - ki)/2; -// -// Finally, if we have only two interpolation points, the cubic polynomial -// will degenerate to a straight line if we set -// -// ki = kj = dy/dx; -// - - -#if SPLINE_BRUTE_FORCE -#define interpolate_segment interpolate_brute_force -#else -#define interpolate_segment interpolate_forward_difference -#endif - - -// ---------------------------------------------------------------------------- -// Calculation of coefficients. -// ---------------------------------------------------------------------------- -inline -void cubic_coefficients(double x1, double y1, double x2, double y2, - double k1, double k2, - double& a, double& b, double& c, double& d) -{ - double dx = x2 - x1, dy = y2 - y1; - - a = ((k1 + k2) - 2*dy/dx)/(dx*dx); - b = ((k2 - k1)/dx - 3*(x1 + x2)*a)/2; - c = k1 - (3*x1*a + 2*b)*x1; - d = y1 - ((x1*a + b)*x1 + c)*x1; -} - -// ---------------------------------------------------------------------------- -// Evaluation of cubic polynomial by brute force. -// ---------------------------------------------------------------------------- -template -inline -void interpolate_brute_force(double x1, double y1, double x2, double y2, - double k1, double k2, - PointPlotter plot, double res) -{ - double a, b, c, d; - cubic_coefficients(x1, y1, x2, y2, k1, k2, a, b, c, d); - - // Calculate each point. - for (double x = x1; x <= x2; x += res) { - double y = ((a*x + b)*x + c)*x + d; - plot(x, y); - } -} - -// ---------------------------------------------------------------------------- -// Evaluation of cubic polynomial by forward differencing. -// ---------------------------------------------------------------------------- -template -inline -void interpolate_forward_difference(double x1, double y1, double x2, double y2, - double k1, double k2, - PointPlotter plot, double res) -{ - double a, b, c, d; - cubic_coefficients(x1, y1, x2, y2, k1, k2, a, b, c, d); - - double y = ((a*x1 + b)*x1 + c)*x1 + d; - double dy = (3*a*(x1 + res) + 2*b)*x1*res + ((a*res + b)*res + c)*res; - double d2y = (6*a*(x1 + res) + 2*b)*res*res; - double d3y = 6*a*res*res*res; - - // Calculate each point. - for (double x = x1; x <= x2; x += res) { - plot(x, y); - y += dy; dy += d2y; d2y += d3y; - } -} - -template -inline -double x(PointIter p) -{ - return (*p)[0]; -} - -template -inline -double y(PointIter p) -{ - return (*p)[1]; -} - -// ---------------------------------------------------------------------------- -// Evaluation of complete interpolating function. -// Note that since each curve segment is controlled by four points, the -// end points will not be interpolated. If extra control points are not -// desirable, the end points can simply be repeated to ensure interpolation. -// Note also that points of non-differentiability and discontinuity can be -// introduced by repeating points. -// ---------------------------------------------------------------------------- -template -inline -void interpolate(PointIter p0, PointIter pn, PointPlotter plot, double res) -{ - double k1, k2; - - // Set up points for first curve segment. - PointIter p1 = p0; ++p1; - PointIter p2 = p1; ++p2; - PointIter p3 = p2; ++p3; - - // Draw each curve segment. - for (; p2 != pn; ++p0, ++p1, ++p2, ++p3) { - // p1 and p2 equal; single point. - if (x(p1) == x(p2)) { - continue; - } - // Both end points repeated; straight line. - if (x(p0) == x(p1) && x(p2) == x(p3)) { - k1 = k2 = (y(p2) - y(p1))/(x(p2) - x(p1)); - } - // p0 and p1 equal; use f''(x1) = 0. - else if (x(p0) == x(p1)) { - k2 = (y(p3) - y(p1))/(x(p3) - x(p1)); - k1 = (3*(y(p2) - y(p1))/(x(p2) - x(p1)) - k2)/2; - } - // p2 and p3 equal; use f''(x2) = 0. - else if (x(p2) == x(p3)) { - k1 = (y(p2) - y(p0))/(x(p2) - x(p0)); - k2 = (3*(y(p2) - y(p1))/(x(p2) - x(p1)) - k1)/2; - } - // Normal curve. - else { - k1 = (y(p2) - y(p0))/(x(p2) - x(p0)); - k2 = (y(p3) - y(p1))/(x(p3) - x(p1)); - } - - interpolate_segment(x(p1), y(p1), x(p2), y(p2), k1, k2, plot, res); - } -} - -// ---------------------------------------------------------------------------- -// Class for plotting integers into an array. -// ---------------------------------------------------------------------------- -template -class PointPlotter -{ - protected: - F* f; - - public: - PointPlotter(F* arr) : f(arr) - { - } - - void operator ()(double x, double y) - { - // Clamp negative values to zero. - if (y < 0) { - y = 0; - } - - f[F(x)] = F(y); - } -}; - - -#endif // not __SPLINE_H__ diff --git a/plugins/sid/version.cc b/plugins/sid/version.cc deleted file mode 100644 index 3b61afd2499..00000000000 --- a/plugins/sid/version.cc +++ /dev/null @@ -1,21 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __VERSION_CC__ -#include "siddefs.h" diff --git a/plugins/sid/voice.cc b/plugins/sid/voice.cc deleted file mode 100644 index 9c0017f99b2..00000000000 --- a/plugins/sid/voice.cc +++ /dev/null @@ -1,132 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __VOICE_CC__ -#include "voice.h" - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -Voice::Voice() -{ - set_chip_model(MOS6581); -} - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void Voice::set_chip_model(chip_model model) -{ - wave.set_chip_model(model); - - if (model == MOS6581) { - // The waveform D/A converter introduces a DC offset in the signal - // to the envelope multiplying D/A converter. The "zero" level of - // the waveform D/A converter can be found as follows: - // - // Measure the "zero" voltage of voice 3 on the SID audio output - // pin, routing only voice 3 to the mixer ($d417 = $0b, $d418 = - // $0f, all other registers zeroed). - // - // Then set the sustain level for voice 3 to maximum and search for - // the waveform output value yielding the same voltage as found - // above. This is done by trying out different waveform output - // values until the correct value is found, e.g. with the following - // program: - // - // lda #$08 - // sta $d412 - // lda #$0b - // sta $d417 - // lda #$0f - // sta $d418 - // lda #$f0 - // sta $d414 - // lda #$21 - // sta $d412 - // lda #$01 - // sta $d40e - // - // ldx #$00 - // lda #$38 ; Tweak this to find the "zero" level - //l cmp $d41b - // bne l - // stx $d40e ; Stop frequency counter - freeze waveform output - // brk - // - // The waveform output range is 0x000 to 0xfff, so the "zero" - // level should ideally have been 0x800. In the measured chip, the - // waveform output "zero" level was found to be 0x380 (i.e. $d41b - // = 0x38) at 5.94V. - - wave_zero = 0x380; - - // The envelope multiplying D/A converter introduces another DC - // offset. This is isolated by the following measurements: - // - // * The "zero" output level of the mixer at full volume is 5.44V. - // * Routing one voice to the mixer at full volume yields - // 6.75V at maximum voice output (wave = 0xfff, sustain = 0xf) - // 5.94V at "zero" voice output (wave = any, sustain = 0x0) - // 5.70V at minimum voice output (wave = 0x000, sustain = 0xf) - // * The DC offset of one voice is (5.94V - 5.44V) = 0.50V - // * The dynamic range of one voice is |6.75V - 5.70V| = 1.05V - // * The DC offset is thus 0.50V/1.05V ~ 1/2 of the dynamic range. - // - // Note that by removing the DC offset, we get the following ranges for - // one voice: - // y > 0: (6.75V - 5.44V) - 0.50V = 0.81V - // y < 0: (5.70V - 5.44V) - 0.50V = -0.24V - // The scaling of the voice amplitude is not symmetric about y = 0; - // this follows from the DC level in the waveform output. - - voice_DC = 0x800*0xff; - } - else { - // No DC offsets in the MOS8580. - wave_zero = 0x800; - voice_DC = 0; - } -} - -// ---------------------------------------------------------------------------- -// Set sync source. -// ---------------------------------------------------------------------------- -void Voice::set_sync_source(Voice* source) -{ - wave.set_sync_source(&source->wave); -} - -// ---------------------------------------------------------------------------- -// Register functions. -// ---------------------------------------------------------------------------- -void Voice::writeCONTROL_REG(reg8 control) -{ - wave.writeCONTROL_REG(control); - envelope.writeCONTROL_REG(control); -} - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void Voice::reset() -{ - wave.reset(); - envelope.reset(); -} diff --git a/plugins/sid/voice.h b/plugins/sid/voice.h deleted file mode 100644 index 599a77ab4a0..00000000000 --- a/plugins/sid/voice.h +++ /dev/null @@ -1,77 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __VOICE_H__ -#define __VOICE_H__ - -#include "siddefs.h" -#include "wave.h" -#include "envelope.h" - -class Voice -{ -public: - Voice(); - - void set_chip_model(chip_model model); - void set_sync_source(Voice*); - void reset(); - - void writeCONTROL_REG(reg8); - - // Amplitude modulated waveform output. - // Range [-2048*255, 2047*255]. - RESID_INLINE sound_sample output(); - -protected: - WaveformGenerator wave; - EnvelopeGenerator envelope; - - // Waveform D/A zero level. - sound_sample wave_zero; - - // Multiplying D/A DC offset. - sound_sample voice_DC; - -friend class cSID; -}; - - -// ---------------------------------------------------------------------------- -// Inline functions. -// The following function is defined inline because it is called every -// time a sample is calculated. -// ---------------------------------------------------------------------------- - -#if RESID_INLINING || defined(__VOICE_CC__) - -// ---------------------------------------------------------------------------- -// Amplitude modulated waveform output. -// Ideal range [-2048*255, 2047*255]. -// ---------------------------------------------------------------------------- -RESID_INLINE -sound_sample Voice::output() -{ - // Multiply oscillator output with envelope output. - return (wave.output() - wave_zero)*envelope.output() + voice_DC; -} - -#endif // RESID_INLINING || defined(__VOICE_CC__) - -#endif // not __VOICE_H__ diff --git a/plugins/sid/wave.cc b/plugins/sid/wave.cc deleted file mode 100644 index a72abd6450a..00000000000 --- a/plugins/sid/wave.cc +++ /dev/null @@ -1,144 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __WAVE_CC__ -#include "wave.h" - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -WaveformGenerator::WaveformGenerator() -{ - sync_source = this; - - set_chip_model(MOS6581); - - reset(); -} - - -// ---------------------------------------------------------------------------- -// Set sync source. -// ---------------------------------------------------------------------------- -void WaveformGenerator::set_sync_source(WaveformGenerator* source) -{ - sync_source = source; - source->sync_dest = this; -} - - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void WaveformGenerator::set_chip_model(chip_model model) -{ - if (model == MOS6581) { - wave__ST = wave6581__ST; - wave_P_T = wave6581_P_T; - wave_PS_ = wave6581_PS_; - wave_PST = wave6581_PST; - } - else { - wave__ST = wave8580__ST; - wave_P_T = wave8580_P_T; - wave_PS_ = wave8580_PS_; - wave_PST = wave8580_PST; - } -} - - -// ---------------------------------------------------------------------------- -// Register functions. -// ---------------------------------------------------------------------------- -void WaveformGenerator::writeFREQ_LO(reg8 freq_lo) -{ - freq = ( freq & 0xff00 ) | ( freq_lo & 0x00ff ); -} - -void WaveformGenerator::writeFREQ_HI(reg8 freq_hi) -{ - freq = ( (freq_hi << 8) & 0xff00 ) | ( freq & 0x00ff ); -} - -void WaveformGenerator::writePW_LO(reg8 pw_lo) -{ - pw = ( pw & 0xf00 ) | ( pw_lo & 0x0ff ); -} - -void WaveformGenerator::writePW_HI(reg8 pw_hi) -{ - pw = ( (pw_hi << 8) & 0xf00 ) | ( pw & 0x0ff ); -} - -void WaveformGenerator::writeCONTROL_REG(reg8 control) -{ - waveform = (control >> 4) & 0x0f; - ring_mod = control & 0x04; - sync = control & 0x02; - - reg8 test_next = control & 0x08; - - // Test bit set. - // The accumulator and the shift register are both cleared. - // NB! The shift register is not really cleared immediately. It seems like - // the individual bits in the shift register start to fade down towards - // zero when test is set. All bits reach zero within approximately - // $2000 - $4000 cycles. - // This is not modeled. There should fortunately be little audible output - // from this peculiar behavior. - if (test_next) { - accumulator = 0; - shift_register = 0; - } - // Test bit cleared. - // The accumulator starts counting, and the shift register is reset to - // the value 0x7ffff8. - // NB! The shift register will not actually be set to this exact value if the - // shift register bits have not had time to fade to zero. - // This is not modeled. - else if (test) { - shift_register = 0x7ffff8; - } - - test = test_next; - - // The gate bit is handled by the EnvelopeGenerator. -} - -reg8 WaveformGenerator::readOSC() -{ - return output() >> 4; -} - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void WaveformGenerator::reset() -{ - accumulator = 0; - shift_register = 0x7ffff8; - freq = 0; - pw = 0; - - test = 0; - ring_mod = 0; - sync = 0; - - msb_rising = false; -} diff --git a/plugins/sid/wave.h b/plugins/sid/wave.h deleted file mode 100644 index 9101b30851c..00000000000 --- a/plugins/sid/wave.h +++ /dev/null @@ -1,503 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __WAVE_H__ -#define __WAVE_H__ - -#include "siddefs.h" - -// ---------------------------------------------------------------------------- -// A 24 bit accumulator is the basis for waveform generation. FREQ is added to -// the lower 16 bits of the accumulator each cycle. -// The accumulator is set to zero when TEST is set, and starts counting -// when TEST is cleared. -// The noise waveform is taken from intermediate bits of a 23 bit shift -// register. This register is clocked by bit 19 of the accumulator. -// ---------------------------------------------------------------------------- -class WaveformGenerator -{ -public: - WaveformGenerator(); - - void set_sync_source(WaveformGenerator*); - void set_chip_model(chip_model model); - - RESID_INLINE void clock(); - RESID_INLINE void clock(cycle_count delta_t); - RESID_INLINE void synchronize(); - void reset(); - - void writeFREQ_LO(reg8); - void writeFREQ_HI(reg8); - void writePW_LO(reg8); - void writePW_HI(reg8); - void writeCONTROL_REG(reg8); - reg8 readOSC(); - - // 12-bit waveform output. - RESID_INLINE reg12 output(); - -protected: - const WaveformGenerator* sync_source; - WaveformGenerator* sync_dest; - - // Tell whether the accumulator MSB was set high on this cycle. - bool msb_rising; - - reg24 accumulator; - reg24 shift_register; - - // Fout = (Fn*Fclk/16777216)Hz - reg16 freq; - // PWout = (PWn/40.95)% - reg12 pw; - - // The control register right-shifted 4 bits; used for output function - // table lookup. - reg8 waveform; - - // The remaining control register bits. - reg8 test; - reg8 ring_mod; - reg8 sync; - // The gate bit is handled by the EnvelopeGenerator. - - // 16 possible combinations of waveforms. - RESID_INLINE reg12 output____(); - RESID_INLINE reg12 output___T(); - RESID_INLINE reg12 output__S_(); - RESID_INLINE reg12 output__ST(); - RESID_INLINE reg12 output_P__(); - RESID_INLINE reg12 output_P_T(); - RESID_INLINE reg12 output_PS_(); - RESID_INLINE reg12 output_PST(); - RESID_INLINE reg12 outputN___(); - RESID_INLINE reg12 outputN__T(); - RESID_INLINE reg12 outputN_S_(); - RESID_INLINE reg12 outputN_ST(); - RESID_INLINE reg12 outputNP__(); - RESID_INLINE reg12 outputNP_T(); - RESID_INLINE reg12 outputNPS_(); - RESID_INLINE reg12 outputNPST(); - - // Sample data for combinations of waveforms. - static reg8 wave6581__ST[]; - static reg8 wave6581_P_T[]; - static reg8 wave6581_PS_[]; - static reg8 wave6581_PST[]; - - static reg8 wave8580__ST[]; - static reg8 wave8580_P_T[]; - static reg8 wave8580_PS_[]; - static reg8 wave8580_PST[]; - - reg8* wave__ST; - reg8* wave_P_T; - reg8* wave_PS_; - reg8* wave_PST; - -friend class Voice; -friend class cSID; -}; - - -// ---------------------------------------------------------------------------- -// Inline functions. -// The following functions are defined inline because they are called every -// time a sample is calculated. -// ---------------------------------------------------------------------------- - -#if RESID_INLINING || defined(__WAVE_CC__) - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -RESID_INLINE -void WaveformGenerator::clock() -{ - // No operation if test bit is set. - if (test) { - return; - } - - reg24 accumulator_prev = accumulator; - - // Calculate new accumulator value; - accumulator += freq; - accumulator &= 0xffffff; - - // Check whether the MSB is set high. This is used for synchronization. - msb_rising = !(accumulator_prev & 0x800000) && (accumulator & 0x800000); - - // Shift noise register once for each time accumulator bit 19 is set high. - if (!(accumulator_prev & 0x080000) && (accumulator & 0x080000)) { - reg24 bit0 = ((shift_register >> 22) ^ (shift_register >> 17)) & 0x1; - shift_register <<= 1; - shift_register &= 0x7fffff; - shift_register |= bit0; - } -} - -// ---------------------------------------------------------------------------- -// SID clocking - delta_t cycles. -// ---------------------------------------------------------------------------- -RESID_INLINE -void WaveformGenerator::clock(cycle_count delta_t) -{ - // No operation if test bit is set. - if (test) { - return; - } - - reg24 accumulator_prev = accumulator; - - // Calculate new accumulator value; - reg24 delta_accumulator = delta_t*freq; - accumulator += delta_accumulator; - accumulator &= 0xffffff; - - // Check whether the MSB is set high. This is used for synchronization. - msb_rising = !(accumulator_prev & 0x800000) && (accumulator & 0x800000); - - // Shift noise register once for each time accumulator bit 19 is set high. - // Bit 19 is set high each time 2^20 (0x100000) is added to the accumulator. - reg24 shift_period = 0x100000; - - while (delta_accumulator) { - if (delta_accumulator < shift_period) { - shift_period = delta_accumulator; - // Determine whether bit 19 is set on the last period. - // NB! Requires two's complement integer. - if (shift_period <= 0x080000) { - // Check for flip from 0 to 1. - if (((accumulator - shift_period) & 0x080000) || !(accumulator & 0x080000)) - { - break; - } - } - else { - // Check for flip from 0 (to 1 or via 1 to 0) or from 1 via 0 to 1. - if (((accumulator - shift_period) & 0x080000) && !(accumulator & 0x080000)) - { - break; - } - } - } - - // Shift the noise/random register. - // NB! The shift is actually delayed 2 cycles, this is not modeled. - reg24 bit0 = ((shift_register >> 22) ^ (shift_register >> 17)) & 0x1; - shift_register <<= 1; - shift_register &= 0x7fffff; - shift_register |= bit0; - - delta_accumulator -= shift_period; - } -} - - -// ---------------------------------------------------------------------------- -// Synchronize oscillators. -// This must be done after all the oscillators have been clock()'ed since the -// oscillators operate in parallel. -// Note that the oscillators must be clocked exactly on the cycle when the -// MSB is set high for hard sync to operate correctly. See SID::clock(). -// ---------------------------------------------------------------------------- -RESID_INLINE -void WaveformGenerator::synchronize() -{ - // A special case occurs when a sync source is synced itself on the same - // cycle as when its MSB is set high. In this case the destination will - // not be synced. This has been verified by sampling OSC3. - if (msb_rising && sync_dest->sync && !(sync && sync_source->msb_rising)) { - sync_dest->accumulator = 0; - } -} - - -// ---------------------------------------------------------------------------- -// Output functions. -// NB! The output from SID 8580 is delayed one cycle compared to SID 6581, -// this is not modeled. -// ---------------------------------------------------------------------------- - -// No waveform: -// Zero output. -// -RESID_INLINE -reg12 WaveformGenerator::output____() -{ - return 0x000; -} - -// Triangle: -// The upper 12 bits of the accumulator are used. -// The MSB is used to create the falling edge of the triangle by inverting -// the lower 11 bits. The MSB is thrown away and the lower 11 bits are -// left-shifted (half the resolution, full amplitude). -// Ring modulation substitutes the MSB with MSB EOR sync_source MSB. -// -RESID_INLINE -reg12 WaveformGenerator::output___T() -{ - reg24 msb = (ring_mod ? accumulator ^ sync_source->accumulator : accumulator) - & 0x800000; - return ((msb ? ~accumulator : accumulator) >> 11) & 0xfff; -} - -// Sawtooth: -// The output is identical to the upper 12 bits of the accumulator. -// -RESID_INLINE -reg12 WaveformGenerator::output__S_() -{ - return accumulator >> 12; -} - -// Pulse: -// The upper 12 bits of the accumulator are used. -// These bits are compared to the pulse width register by a 12 bit digital -// comparator; output is either all one or all zero bits. -// NB! The output is actually delayed one cycle after the compare. -// This is not modeled. -// -// The test bit, when set to one, holds the pulse waveform output at 0xfff -// regardless of the pulse width setting. -// -RESID_INLINE -reg12 WaveformGenerator::output_P__() -{ - return (test || (accumulator >> 12) >= pw) ? 0xfff : 0x000; -} - -// Noise: -// The noise output is taken from intermediate bits of a 23-bit shift register -// which is clocked by bit 19 of the accumulator. -// NB! The output is actually delayed 2 cycles after bit 19 is set high. -// This is not modeled. -// -// Operation: Calculate EOR result, shift register, set bit 0 = result. -// -// ----------------------->--------------------- -// | | -// ----EOR---- | -// | | | -// 2 2 2 1 1 1 1 1 1 1 1 1 1 | -// Register bits: 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 <--- -// | | | | | | | | -// OSC3 bits : 7 6 5 4 3 2 1 0 -// -// Since waveform output is 12 bits the output is left-shifted 4 times. -// -RESID_INLINE -reg12 WaveformGenerator::outputN___() -{ - return - ((shift_register & 0x400000) >> 11) | - ((shift_register & 0x100000) >> 10) | - ((shift_register & 0x010000) >> 7) | - ((shift_register & 0x002000) >> 5) | - ((shift_register & 0x000800) >> 4) | - ((shift_register & 0x000080) >> 1) | - ((shift_register & 0x000010) << 1) | - ((shift_register & 0x000004) << 2); -} - -// Combined waveforms: -// By combining waveforms, the bits of each waveform are effectively short -// circuited. A zero bit in one waveform will result in a zero output bit -// (thus the infamous claim that the waveforms are AND'ed). -// However, a zero bit in one waveform will also affect the neighboring bits -// in the output. The reason for this has not been determined. -// -// Example: -// -// 1 1 -// Bit # 1 0 9 8 7 6 5 4 3 2 1 0 -// ----------------------- -// Sawtooth 0 0 0 1 1 1 1 1 1 0 0 0 -// -// Triangle 0 0 1 1 1 1 1 1 0 0 0 0 -// -// AND 0 0 0 1 1 1 1 1 0 0 0 0 -// -// Output 0 0 0 0 1 1 1 0 0 0 0 0 -// -// -// This behavior would be quite difficult to model exactly, since the SID -// in this case does not act as a digital state machine. Tests show that minor -// (1 bit) differences can actually occur in the output from otherwise -// identical samples from OSC3 when waveforms are combined. To further -// complicate the situation the output changes slightly with time (more -// neighboring bits are successively set) when the 12-bit waveform -// registers are kept unchanged. -// -// It is probably possible to come up with a valid model for the -// behavior, however this would be far too slow for practical use since it -// would have to be based on the mutual influence of individual bits. -// -// The output is instead approximated by using the upper bits of the -// accumulator as an index to look up the combined output in a table -// containing actual combined waveform samples from OSC3. -// These samples are 8 bit, so 4 bits of waveform resolution is lost. -// All OSC3 samples are taken with FREQ=0x1000, adding a 1 to the upper 12 -// bits of the accumulator each cycle for a sample period of 4096 cycles. -// -// Sawtooth+Triangle: -// The sawtooth output is used to look up an OSC3 sample. -// -// Pulse+Triangle: -// The triangle output is right-shifted and used to look up an OSC3 sample. -// The sample is output if the pulse output is on. -// The reason for using the triangle output as the index is to handle ring -// modulation. Only the first half of the sample is used, which should be OK -// since the triangle waveform has half the resolution of the accumulator. -// -// Pulse+Sawtooth: -// The sawtooth output is used to look up an OSC3 sample. -// The sample is output if the pulse output is on. -// -// Pulse+Sawtooth+Triangle: -// The sawtooth output is used to look up an OSC3 sample. -// The sample is output if the pulse output is on. -// -RESID_INLINE -reg12 WaveformGenerator::output__ST() -{ - return wave__ST[output__S_()] << 4; -} - -RESID_INLINE -reg12 WaveformGenerator::output_P_T() -{ - return (wave_P_T[output___T() >> 1] << 4) & output_P__(); -} - -RESID_INLINE -reg12 WaveformGenerator::output_PS_() -{ - return (wave_PS_[output__S_()] << 4) & output_P__(); -} - -RESID_INLINE -reg12 WaveformGenerator::output_PST() -{ - return (wave_PST[output__S_()] << 4) & output_P__(); -} - -// Combined waveforms including noise: -// All waveform combinations including noise output zero after a few cycles. -// NB! The effects of such combinations are not fully explored. It is claimed -// that the shift register may be filled with zeroes and locked up, which -// seems to be true. -// We have not attempted to model this behavior, suffice to say that -// there is very little audible output from waveform combinations including -// noise. We hope that nobody is actually using it. -// -RESID_INLINE -reg12 WaveformGenerator::outputN__T() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGenerator::outputN_S_() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGenerator::outputN_ST() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGenerator::outputNP__() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGenerator::outputNP_T() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGenerator::outputNPS_() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGenerator::outputNPST() -{ - return 0; -} - -// ---------------------------------------------------------------------------- -// Select one of 16 possible combinations of waveforms. -// ---------------------------------------------------------------------------- -RESID_INLINE -reg12 WaveformGenerator::output() -{ - // It may seem cleaner to use an array of member functions to return - // waveform output; however a switch with inline functions is faster. - - switch (waveform) { - default: - case 0x0: - return output____(); - case 0x1: - return output___T(); - case 0x2: - return output__S_(); - case 0x3: - return output__ST(); - case 0x4: - return output_P__(); - case 0x5: - return output_P_T(); - case 0x6: - return output_PS_(); - case 0x7: - return output_PST(); - case 0x8: - return outputN___(); - case 0x9: - return outputN__T(); - case 0xa: - return outputN_S_(); - case 0xb: - return outputN_ST(); - case 0xc: - return outputNP__(); - case 0xd: - return outputNP_T(); - case 0xe: - return outputNPS_(); - case 0xf: - return outputNPST(); - } -} - -#endif // RESID_INLINING || defined(__WAVE_CC__) - -#endif // not __WAVE_H__ diff --git a/plugins/sid/wave6581_PST.cc b/plugins/sid/wave6581_PST.cc deleted file mode 100644 index 49a4ea246d9..00000000000 --- a/plugins/sid/wave6581_PST.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGenerator::wave6581_PST[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, -/* 0x7f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, -/* 0x7f8: */ 0x00, 0x00, 0x00, 0x78, 0x78, 0x7e, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, -/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, -/* 0xff8: */ 0x00, 0x00, 0x00, 0x78, 0x78, 0x7e, 0x7f, 0x7f, -}; diff --git a/plugins/sid/wave6581_PS_.cc b/plugins/sid/wave6581_PS_.cc deleted file mode 100644 index ffccd23e8b1..00000000000 --- a/plugins/sid/wave6581_PS_.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGenerator::wave6581_PS_[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, -/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3f, -/* 0x3f8: */ 0x00, 0x30, 0x38, 0x3f, 0x3e, 0x3f, 0x3f, 0x3f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, -/* 0x5f8: */ 0x00, 0x40, 0x40, 0x5f, 0x5c, 0x5f, 0x5f, 0x5f, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6b, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x6d, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x6e, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x6f, -/* 0x6f8: */ 0x00, 0x60, 0x60, 0x6f, 0x60, 0x6f, 0x6f, 0x6f, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x738: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x60, 0x73, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x758: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x75, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x768: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x76, -/* 0x770: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x77, -/* 0x778: */ 0x00, 0x70, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x798: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x79, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x70, 0x70, 0x7a, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7b, -/* 0x7b8: */ 0x40, 0x70, 0x70, 0x7b, 0x78, 0x7b, 0x7b, 0x7b, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7c, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7d, -/* 0x7d8: */ 0x40, 0x70, 0x78, 0x7d, 0x78, 0x7d, 0x7d, 0x7d, -/* 0x7e0: */ 0x00, 0x40, 0x40, 0x78, 0x60, 0x78, 0x78, 0x7e, -/* 0x7e8: */ 0x60, 0x78, 0x78, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, -/* 0x7f0: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, -/* 0x7f8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3f, -/* 0xbf8: */ 0x00, 0x30, 0x38, 0x3f, 0x3e, 0x3f, 0x3f, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, -/* 0xdf8: */ 0x00, 0x40, 0x40, 0x5f, 0x5c, 0x5f, 0x5f, 0x5f, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6b, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6d, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x6e, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x6f, -/* 0xef8: */ 0x00, 0x60, 0x60, 0x6f, 0x60, 0x6f, 0x6f, 0x6f, -/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x60, 0x73, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x75, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x76, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x77, -/* 0xf78: */ 0x00, 0x70, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x79, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x70, 0x70, 0x7a, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7b, -/* 0xfb8: */ 0x40, 0x70, 0x70, 0x7b, 0x78, 0x7b, 0x7b, 0x7b, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7c, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7d, -/* 0xfd8: */ 0x40, 0x70, 0x78, 0x7d, 0x78, 0x7d, 0x7d, 0x7d, -/* 0xfe0: */ 0x00, 0x40, 0x40, 0x78, 0x60, 0x78, 0x78, 0x7e, -/* 0xfe8: */ 0x60, 0x78, 0x78, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, -/* 0xff0: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7c, 0x7f, 0x7f, 0x7f, -/* 0xff8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, -}; diff --git a/plugins/sid/wave6581_P_T.cc b/plugins/sid/wave6581_P_T.cc deleted file mode 100644 index a8109eeb115..00000000000 --- a/plugins/sid/wave6581_P_T.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGenerator::wave6581_P_T[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x38, 0x3f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x5f, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x378: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x6f, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x70, 0x77, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7b, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, -/* 0x3e8: */ 0x00, 0x40, 0x40, 0x70, 0x60, 0x70, 0x78, 0x7d, -/* 0x3f0: */ 0x00, 0x40, 0x60, 0x78, 0x60, 0x78, 0x78, 0x7e, -/* 0x3f8: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9f, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x578: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xa0, 0xaf, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, -/* 0x5b8: */ 0x00, 0x80, 0x80, 0xa0, 0x80, 0xa0, 0xb0, 0xb7, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, -/* 0x5d8: */ 0x00, 0x80, 0x80, 0xa0, 0x80, 0xb0, 0xb0, 0xbb, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xb0, -/* 0x5e8: */ 0x80, 0x80, 0x80, 0xb0, 0x80, 0xb0, 0xb8, 0xbd, -/* 0x5f0: */ 0x80, 0x80, 0x80, 0xb8, 0xa0, 0xb8, 0xb8, 0xbe, -/* 0x5f8: */ 0xa0, 0xb8, 0xbc, 0xbf, 0xbe, 0xbf, 0xbf, 0xbf, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x670: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x678: */ 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x698: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0xc0, 0xc0, -/* 0x6b8: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd7, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0x6d0: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, -/* 0x6d8: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd0, 0xdb, -/* 0x6e0: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xd0, -/* 0x6e8: */ 0x80, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd8, 0xdd, -/* 0x6f0: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd8, 0xd8, 0xde, -/* 0x6f8: */ 0xc0, 0xd8, 0xdc, 0xdf, 0xdc, 0xdf, 0xdf, 0xdf, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x718: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x728: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x730: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x738: */ 0x80, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe7, -/* 0x740: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x748: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x750: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x758: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xeb, -/* 0x760: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0x768: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xed, -/* 0x770: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, 0xe8, 0xee, -/* 0x778: */ 0xe0, 0xe8, 0xec, 0xef, 0xec, 0xef, 0xef, 0xef, -/* 0x780: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0x788: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf0, -/* 0x790: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, -/* 0x798: */ 0xc0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf3, -/* 0x7a0: */ 0x80, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xf0, -/* 0x7a8: */ 0xc0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf5, -/* 0x7b0: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf6, -/* 0x7b8: */ 0xf0, 0xf0, 0xf4, 0xf7, 0xf4, 0xf7, 0xf7, 0xf7, -/* 0x7c0: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, -/* 0x7c8: */ 0xe0, 0xe0, 0xe0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf9, -/* 0x7d0: */ 0xe0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xfa, -/* 0x7d8: */ 0xf0, 0xf8, 0xf8, 0xfb, 0xf8, 0xfb, 0xfb, 0xfb, -/* 0x7e0: */ 0xe0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xfc, 0xfc, -/* 0x7e8: */ 0xf8, 0xfc, 0xfc, 0xfd, 0xfc, 0xfd, 0xfd, 0xfd, -/* 0x7f0: */ 0xf8, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0x7f8: */ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -/* 0x800: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, -/* 0x808: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xf8, -/* 0x810: */ 0xfd, 0xfd, 0xfd, 0xfc, 0xfd, 0xfc, 0xfc, 0xf8, -/* 0x818: */ 0xfc, 0xfc, 0xfc, 0xf0, 0xf8, 0xf0, 0xf0, 0xe0, -/* 0x820: */ 0xfb, 0xfb, 0xfb, 0xf8, 0xfb, 0xf8, 0xf8, 0xf0, -/* 0x828: */ 0xfa, 0xf8, 0xf8, 0xf0, 0xf8, 0xf0, 0xf0, 0xe0, -/* 0x830: */ 0xf9, 0xf8, 0xf8, 0xf0, 0xf8, 0xf0, 0xe0, 0xe0, -/* 0x838: */ 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, -/* 0x840: */ 0xf7, 0xf7, 0xf7, 0xf4, 0xf7, 0xf4, 0xf0, 0xf0, -/* 0x848: */ 0xf6, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, -/* 0x850: */ 0xf5, 0xf0, 0xf0, 0xe0, 0xf0, 0xe0, 0xe0, 0xc0, -/* 0x858: */ 0xf0, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xc0, 0x80, -/* 0x860: */ 0xf3, 0xf0, 0xf0, 0xe0, 0xf0, 0xe0, 0xe0, 0xc0, -/* 0x868: */ 0xf0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, -/* 0x870: */ 0xf0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, -/* 0x878: */ 0xc0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0x880: */ 0xef, 0xef, 0xef, 0xec, 0xef, 0xec, 0xe8, 0xe0, -/* 0x888: */ 0xee, 0xe8, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, -/* 0x890: */ 0xed, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, -/* 0x898: */ 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, -/* 0x8a0: */ 0xeb, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, -/* 0x8a8: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x8b0: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x8b8: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0xe7, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xc0, 0x80, -/* 0x8c8: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x8d0: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x8d8: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x900: */ 0xdf, 0xdf, 0xdf, 0xdc, 0xdf, 0xdc, 0xd8, 0xc0, -/* 0x908: */ 0xde, 0xd8, 0xd8, 0xc0, 0xd8, 0xc0, 0xc0, 0xc0, -/* 0x910: */ 0xdd, 0xd8, 0xd0, 0xc0, 0xd0, 0xc0, 0xc0, 0x80, -/* 0x918: */ 0xd0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x920: */ 0xdb, 0xd0, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, -/* 0x928: */ 0xc0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x930: */ 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0x938: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0xd7, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, -/* 0x948: */ 0xc0, 0xc0, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x950: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x958: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x968: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x980: */ 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, -/* 0x988: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x990: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c0: */ 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa00: */ 0xbf, 0xbf, 0xbf, 0xbe, 0xbf, 0xbc, 0xbc, 0xa0, -/* 0xa08: */ 0xbe, 0xbc, 0xb8, 0xa0, 0xb8, 0xa0, 0x80, 0x80, -/* 0xa10: */ 0xbd, 0xb8, 0xb0, 0x80, 0xb0, 0x80, 0x80, 0x80, -/* 0xa18: */ 0xb0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0xa20: */ 0xbb, 0xb0, 0xb0, 0x80, 0xa0, 0x80, 0x80, 0x00, -/* 0xa28: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xa30: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0xb7, 0xb0, 0xa0, 0x80, 0xa0, 0x80, 0x80, 0x00, -/* 0xa48: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa80: */ 0xaf, 0xa0, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x00, -/* 0xa88: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb00: */ 0x9f, 0x90, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb80: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc00: */ 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7c, 0x7c, 0x70, -/* 0xc08: */ 0x7e, 0x7c, 0x78, 0x60, 0x78, 0x60, 0x60, 0x00, -/* 0xc10: */ 0x7d, 0x78, 0x78, 0x60, 0x70, 0x40, 0x40, 0x00, -/* 0xc18: */ 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x7b, 0x78, 0x70, 0x40, 0x70, 0x40, 0x00, 0x00, -/* 0xc28: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x77, 0x70, 0x70, 0x00, 0x60, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc80: */ 0x6f, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd00: */ 0x5f, 0x58, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe00: */ 0x3f, 0x3c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xff8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/plugins/sid/wave6581__ST.cc b/plugins/sid/wave6581__ST.cc deleted file mode 100644 index add4d387ad4..00000000000 --- a/plugins/sid/wave6581__ST.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGenerator::wave6581__ST[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -/* 0x3f8: */ 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x3f, 0x3f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0x7e8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0x7f0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, -/* 0x7f8: */ 0x3e, 0x3e, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -/* 0xbf8: */ 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x3f, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0xfe8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0xff0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, -/* 0xff8: */ 0x3e, 0x3e, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, -}; diff --git a/plugins/sid/wave8580_PST.cc b/plugins/sid/wave8580_PST.cc deleted file mode 100644 index a3958c1929f..00000000000 --- a/plugins/sid/wave8580_PST.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGenerator::wave8580_PST[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x70, -/* 0x7f0: */ 0x60, 0x20, 0x70, 0x70, 0x70, 0x70, 0x70, 0x78, -/* 0x7f8: */ 0x78, 0x78, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1e, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xdf8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x8c, 0x9f, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe80: */ 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, -/* 0xe88: */ 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xea0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xea8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xeb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xeb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xec0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xec8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xed0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xed8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xee0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xee8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0xef0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xef8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, -/* 0xf00: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf08: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf10: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf18: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf20: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf28: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf30: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf38: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf40: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf48: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf50: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf58: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf68: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0xf70: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, -/* 0xf80: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf88: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf90: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf98: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xfa0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xfa8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xfb0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, -/* 0xfb8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfc0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfc8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfd0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfd8: */ 0xf0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfe0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfe8: */ 0xf8, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0xff0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, -/* 0xff8: */ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -}; diff --git a/plugins/sid/wave8580_PS_.cc b/plugins/sid/wave8580_PS_.cc deleted file mode 100644 index 795044d6064..00000000000 --- a/plugins/sid/wave8580_PS_.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGenerator::wave8580_PS_[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x1f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, -/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, -/* 0x3f8: */ 0x00, 0x0c, 0x1c, 0x3f, 0x1e, 0x3f, 0x3f, 0x3f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, -/* 0x5f8: */ 0x00, 0x00, 0x00, 0x5f, 0x0c, 0x5f, 0x5f, 0x5f, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, -/* 0x6f8: */ 0x00, 0x40, 0x40, 0x6f, 0x40, 0x6f, 0x6f, 0x6f, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x61, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x768: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x70, -/* 0x770: */ 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, -/* 0x778: */ 0x40, 0x60, 0x60, 0x77, 0x60, 0x77, 0x77, 0x77, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, -/* 0x798: */ 0x00, 0x40, 0x40, 0x60, 0x40, 0x60, 0x60, 0x79, -/* 0x7a0: */ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x60, -/* 0x7a8: */ 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x78, -/* 0x7b0: */ 0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, -/* 0x7b8: */ 0x60, 0x70, 0x70, 0x78, 0x70, 0x79, 0x7b, 0x7b, -/* 0x7c0: */ 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, -/* 0x7c8: */ 0x60, 0x60, 0x60, 0x70, 0x60, 0x70, 0x70, 0x7c, -/* 0x7d0: */ 0x60, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x7c, -/* 0x7d8: */ 0x70, 0x78, 0x78, 0x7c, 0x78, 0x7c, 0x7c, 0x7d, -/* 0x7e0: */ 0x70, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x7c, -/* 0x7e8: */ 0x78, 0x7c, 0x7c, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, -/* 0x7f0: */ 0x7c, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, -/* 0x7f8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8d, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x8e, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x8f, -/* 0x9f8: */ 0x80, 0x80, 0x80, 0x9f, 0x80, 0x9f, 0x9f, 0x9f, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x87, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x83, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -/* 0xad8: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, -/* 0xae0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xae8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x84, -/* 0xaf0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x87, -/* 0xaf8: */ 0x80, 0x80, 0x80, 0x87, 0x80, 0x8f, 0xaf, 0xaf, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, -/* 0xb28: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x83, -/* 0xb40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, -/* 0xb60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, -/* 0xb70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, -/* 0xb78: */ 0x80, 0x80, 0x80, 0xa0, 0x80, 0xa3, 0xb7, 0xb7, -/* 0xb80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb1, -/* 0xba0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xba8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb0, -/* 0xbb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb0, -/* 0xbb8: */ 0x80, 0xa0, 0xa0, 0xb0, 0xa0, 0xb8, 0xb9, 0xbb, -/* 0xbc0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, -/* 0xbc8: */ 0x80, 0x80, 0x80, 0xa0, 0x80, 0xa0, 0xa0, 0xb8, -/* 0xbd0: */ 0x80, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xb8, -/* 0xbd8: */ 0xa0, 0xb0, 0xb0, 0xb8, 0xb0, 0xbc, 0xbc, 0xbd, -/* 0xbe0: */ 0xa0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb8, 0xb8, 0xbc, -/* 0xbe8: */ 0xb0, 0xb8, 0xb8, 0xbc, 0xb8, 0xbc, 0xbe, 0xbe, -/* 0xbf0: */ 0xb8, 0xbc, 0xbc, 0xbe, 0xbc, 0xbe, 0xbe, 0xbf, -/* 0xbf8: */ 0xbe, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, -/* 0xc10: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc18: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc28: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, -/* 0xc40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc7, -/* 0xc80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xca0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xca8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xcb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xcb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc3, -/* 0xcc0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xcc8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xcd0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xcd8: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc1, -/* 0xce0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xce8: */ 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xcf0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc7, -/* 0xcf8: */ 0xc0, 0xc0, 0xc0, 0xc7, 0xc0, 0xcf, 0xcf, 0xcf, -/* 0xd00: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xd08: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xd10: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xd18: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xd20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xd28: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xd30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0xd38: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc3, -/* 0xd40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xd48: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, -/* 0xd50: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd58: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, -/* 0xd60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd68: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd70: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd78: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc7, 0xd7, -/* 0xd80: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd88: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd90: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd98: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xda0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xda8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, -/* 0xdb0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, -/* 0xdb8: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd8, 0xdb, -/* 0xdc0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xdc8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd8, -/* 0xdd0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd8, -/* 0xdd8: */ 0xc0, 0xc0, 0xc0, 0xd8, 0xd0, 0xd8, 0xd8, 0xdd, -/* 0xde0: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd0, 0xdc, -/* 0xde8: */ 0xd0, 0xd8, 0xd8, 0xdc, 0xd8, 0xdc, 0xdc, 0xde, -/* 0xdf0: */ 0xd8, 0xdc, 0xdc, 0xde, 0xdc, 0xde, 0xde, 0xdf, -/* 0xdf8: */ 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, -/* 0xe00: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe08: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe10: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe18: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe20: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe28: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe30: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe38: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe3, -/* 0xe40: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe48: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe50: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0xe58: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe1, -/* 0xe60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0xe68: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xe70: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xe78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe3, 0xe7, -/* 0xe80: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0xe88: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0xe90: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0xe98: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xea0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xea8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xeb0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xeb8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xeb, -/* 0xec0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xec8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xed0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xed8: */ 0xe0, 0xe0, 0xe0, 0xe8, 0xe0, 0xe8, 0xe8, 0xed, -/* 0xee0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xec, -/* 0xee8: */ 0xe0, 0xe0, 0xe0, 0xec, 0xe8, 0xec, 0xec, 0xee, -/* 0xef0: */ 0xe8, 0xe8, 0xe8, 0xec, 0xec, 0xee, 0xee, 0xef, -/* 0xef8: */ 0xec, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, -/* 0xf00: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf08: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf10: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf18: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, -/* 0xf20: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, -/* 0xf28: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0, -/* 0xf30: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf38: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, -/* 0xf40: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf48: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf50: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf58: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf5, -/* 0xf60: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf68: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf6, -/* 0xf70: */ 0xf0, 0xf0, 0xf0, 0xf4, 0xf0, 0xf4, 0xf6, 0xf7, -/* 0xf78: */ 0xf4, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, -/* 0xf80: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, -/* 0xf88: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf8, -/* 0xf90: */ 0xf0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf8, -/* 0xf98: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, -/* 0xfa0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfa8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xfa, -/* 0xfb0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xfb, -/* 0xfb8: */ 0xf8, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, -/* 0xfc0: */ 0xf8, 0xf8, 0xf8, 0xfc, 0xf8, 0xfc, 0xfc, 0xfc, -/* 0xfc8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0xfd0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, -/* 0xfd8: */ 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, -/* 0xfe0: */ 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0xfe8: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0xff0: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -/* 0xff8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -}; diff --git a/plugins/sid/wave8580_P_T.cc b/plugins/sid/wave8580_P_T.cc deleted file mode 100644 index a2fff3a231d..00000000000 --- a/plugins/sid/wave8580_P_T.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGenerator::wave8580_P_T[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x3f, 0x3f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x5e, 0x5f, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x378: */ 0x00, 0x00, 0x00, 0x40, 0x40, 0x60, 0x60, 0x6f, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x60, -/* 0x3b8: */ 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x70, 0x77, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, -/* 0x3c8: */ 0x40, 0x40, 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, -/* 0x3d0: */ 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x70, -/* 0x3d8: */ 0x60, 0x60, 0x60, 0x70, 0x70, 0x70, 0x78, 0x7b, -/* 0x3e0: */ 0x60, 0x60, 0x60, 0x70, 0x60, 0x70, 0x70, 0x70, -/* 0x3e8: */ 0x70, 0x70, 0x70, 0x78, 0x78, 0x78, 0x78, 0x7c, -/* 0x3f0: */ 0x78, 0x78, 0x78, 0x7c, 0x78, 0x7c, 0x7c, 0x7e, -/* 0x3f8: */ 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4d8: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x4e8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x4f0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x4f8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x8e, 0x9f, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, -/* 0x530: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x538: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x540: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, -/* 0x548: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x550: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x558: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x560: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x568: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x570: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x578: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xaf, -/* 0x580: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x588: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x590: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x598: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5a0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5a8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5b0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5b8: */ 0x80, 0x80, 0x80, 0xa0, 0xa0, 0xa0, 0xa0, 0xb7, -/* 0x5c0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5c8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, -/* 0x5d0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xa0, -/* 0x5d8: */ 0xa0, 0xa0, 0xa0, 0xb0, 0xa0, 0xb0, 0xb0, 0xbb, -/* 0x5e0: */ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xb0, 0xb0, -/* 0x5e8: */ 0xa0, 0xb0, 0xb0, 0xb8, 0xb0, 0xb8, 0xb8, 0xbc, -/* 0x5f0: */ 0xb0, 0xb8, 0xb8, 0xb8, 0xb8, 0xbc, 0xbc, 0xbe, -/* 0x5f8: */ 0xbc, 0xbc, 0xbe, 0xbf, 0xbe, 0xbf, 0xbf, 0xbf, -/* 0x600: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x608: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x610: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x618: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x620: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x628: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x630: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x638: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0x640: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x648: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x650: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0x658: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x660: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, -/* 0x668: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x670: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x678: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, -/* 0x680: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0x688: */ 0xc0, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x690: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x698: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6a0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6a8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6b0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6b8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd7, -/* 0x6c0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6c8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6d0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6d8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd0, 0xd9, -/* 0x6e0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, -/* 0x6e8: */ 0xc0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd8, 0xd8, 0xdc, -/* 0x6f0: */ 0xd0, 0xd0, 0xd8, 0xd8, 0xd8, 0xdc, 0xdc, 0xde, -/* 0x6f8: */ 0xdc, 0xdc, 0xde, 0xdf, 0xde, 0xdf, 0xdf, 0xdf, -/* 0x700: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x708: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x710: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x718: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0x720: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0x728: */ 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x730: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x738: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe7, -/* 0x740: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x748: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x750: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x758: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, -/* 0x760: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x768: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, 0xec, -/* 0x770: */ 0xe0, 0xe0, 0xe0, 0xe8, 0xe8, 0xe8, 0xec, 0xee, -/* 0x778: */ 0xec, 0xec, 0xec, 0xee, 0xee, 0xef, 0xef, 0xef, -/* 0x780: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x788: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, -/* 0x790: */ 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x798: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x7a0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x7a8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, -/* 0x7b0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, -/* 0x7b8: */ 0xf0, 0xf4, 0xf4, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, -/* 0x7c0: */ 0xf0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf8, -/* 0x7c8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0x7d0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0x7d8: */ 0xf8, 0xf8, 0xf8, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, -/* 0x7e0: */ 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0x7e8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, -/* 0x7f0: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0x7f8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -/* 0x800: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -/* 0x808: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, -/* 0x810: */ 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0x818: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, -/* 0x820: */ 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xf8, 0xf8, 0xf8, -/* 0x828: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0x830: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0x838: */ 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x840: */ 0xf7, 0xf7, 0xf7, 0xf6, 0xf6, 0xf4, 0xf4, 0xf0, -/* 0x848: */ 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x850: */ 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x858: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x860: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x868: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, -/* 0x870: */ 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x878: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x880: */ 0xef, 0xef, 0xef, 0xee, 0xee, 0xec, 0xec, 0xe8, -/* 0x888: */ 0xee, 0xec, 0xe8, 0xe8, 0xe8, 0xe0, 0xe0, 0xe0, -/* 0x890: */ 0xec, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x898: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8a0: */ 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8a8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8b0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8b8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8c0: */ 0xe7, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8c8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8d0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, -/* 0x8d8: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x8e0: */ 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x8e8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x8f0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x8f8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x900: */ 0xdf, 0xdf, 0xdf, 0xde, 0xdf, 0xde, 0xdc, 0xdc, -/* 0x908: */ 0xde, 0xdc, 0xdc, 0xd8, 0xd8, 0xd8, 0xd0, 0xd0, -/* 0x910: */ 0xdc, 0xd8, 0xd8, 0xd0, 0xd0, 0xd0, 0xd0, 0xc0, -/* 0x918: */ 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x920: */ 0xd9, 0xd0, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x928: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x930: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x938: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x940: */ 0xd7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x948: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x950: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x958: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x960: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x968: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x970: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, -/* 0x978: */ 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x980: */ 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x988: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x990: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x998: */ 0xc0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x80, -/* 0x9a0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, -/* 0x9a8: */ 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9b0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9b8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9c0: */ 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9c8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9d0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9d8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9e0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9e8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9f0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9f8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa00: */ 0xbf, 0xbf, 0xbf, 0xbe, 0xbf, 0xbe, 0xbc, 0xbc, -/* 0xa08: */ 0xbe, 0xbc, 0xbc, 0xb8, 0xb8, 0xb8, 0xb8, 0xb0, -/* 0xa10: */ 0xbc, 0xb8, 0xb8, 0xb0, 0xb8, 0xb0, 0xb0, 0xb0, -/* 0xa18: */ 0xb0, 0xb0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, -/* 0xa20: */ 0xbb, 0xb0, 0xb0, 0xa0, 0xb0, 0xa0, 0xa0, 0xa0, -/* 0xa28: */ 0xa0, 0xa0, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa30: */ 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa40: */ 0xb7, 0xb0, 0xa0, 0xa0, 0xa0, 0x80, 0x80, 0x80, -/* 0xa48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa80: */ 0xaf, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xaa0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xaa8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xab0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xab8: */ 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xac8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, -/* 0xad0: */ 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb00: */ 0x9f, 0x9e, 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb08: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb10: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb18: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb80: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc00: */ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7c, -/* 0xc08: */ 0x7e, 0x7c, 0x7c, 0x78, 0x7c, 0x78, 0x78, 0x78, -/* 0xc10: */ 0x7c, 0x78, 0x78, 0x78, 0x78, 0x70, 0x70, 0x70, -/* 0xc18: */ 0x78, 0x70, 0x70, 0x60, 0x70, 0x60, 0x60, 0x60, -/* 0xc20: */ 0x7b, 0x78, 0x70, 0x70, 0x70, 0x60, 0x60, 0x60, -/* 0xc28: */ 0x70, 0x60, 0x60, 0x60, 0x60, 0x40, 0x40, 0x40, -/* 0xc30: */ 0x60, 0x60, 0x60, 0x40, 0x40, 0x40, 0x40, 0x40, -/* 0xc38: */ 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x77, 0x70, 0x60, 0x60, 0x60, 0x60, 0x40, 0x40, -/* 0xc48: */ 0x60, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc80: */ 0x6f, 0x64, 0x60, 0x40, 0x40, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd00: */ 0x5f, 0x5e, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe00: */ 0x3f, 0x3f, 0x3e, 0x00, 0x1c, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf00: */ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xff8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/plugins/sid/wave8580__ST.cc b/plugins/sid/wave8580__ST.cc deleted file mode 100644 index e50a21d8173..00000000000 --- a/plugins/sid/wave8580__ST.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program 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 General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGenerator::wave8580__ST[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -/* 0x3f8: */ 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0x7e8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0x7f0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3e, -/* 0x7f8: */ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -/* 0xbf8: */ 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x3f, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x1f, 0x1f, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x83, 0x83, -/* 0xe80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xea0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xea8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xeb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xeb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xec0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xec8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xed0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xed8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xee0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xee8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xef0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xef8: */ 0x80, 0x80, 0x80, 0x80, 0x87, 0x87, 0x87, 0x8f, -/* 0xf00: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0xf08: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf10: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf18: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf20: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0xf28: */ 0xe0, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, -/* 0xf30: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf38: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf40: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf48: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf50: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf58: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf60: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf68: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf70: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, -/* 0xf80: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf88: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf90: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf98: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfa0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfa8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfb0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfb8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, -/* 0xfc0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfc8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfd0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfd8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfe0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0xfe8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0xff0: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0xff8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -}; diff --git a/plugins/vst_base/VstPlugin.cpp b/plugins/vst_base/VstPlugin.cpp index 278ab8b2d71..a08ef072d5e 100644 --- a/plugins/vst_base/VstPlugin.cpp +++ b/plugins/vst_base/VstPlugin.cpp @@ -46,10 +46,6 @@ #include #ifdef LMMS_BUILD_WIN32 -# ifndef NOMINMAX -# define NOMINMAX -# endif - # include # include #endif diff --git a/src/3rdparty/jack2 b/src/3rdparty/jack2 new file mode 160000 index 00000000000..db76dd6bb87 --- /dev/null +++ b/src/3rdparty/jack2 @@ -0,0 +1 @@ +Subproject commit db76dd6bb879a0a24d73ec41cc2e6a21bca8ee08 diff --git a/src/3rdparty/weakjack/weakjack b/src/3rdparty/weakjack/weakjack index cbb05c52561..fd11655be3b 160000 --- a/src/3rdparty/weakjack/weakjack +++ b/src/3rdparty/weakjack/weakjack @@ -1 +1 @@ -Subproject commit cbb05c52561d921885ad6651af6c8dd9f514dc9a +Subproject commit fd11655be3b2efd6082968ecfe53f9cfe88bda2b diff --git a/src/core/DataFile.cpp b/src/core/DataFile.cpp index c1b48af38c8..9dc413566d7 100644 --- a/src/core/DataFile.cpp +++ b/src/core/DataFile.cpp @@ -146,7 +146,8 @@ DataFile::DataFile( const QString & _fileName ) : DataFile::DataFile( const QByteArray & _data ) : QDomDocument(), m_content(), - m_head() + m_head(), + m_fileVersion( UPGRADE_METHODS.size() ) { loadData( _data, "" ); } diff --git a/src/core/InstrumentFunctions.cpp b/src/core/InstrumentFunctions.cpp index c8ec24d6e45..42ad3f0a3e0 100644 --- a/src/core/InstrumentFunctions.cpp +++ b/src/core/InstrumentFunctions.cpp @@ -388,8 +388,10 @@ void InstrumentFunctionArpeggio::processNote( NotePlayHandle * _n ) while( frames_processed < Engine::mixer()->framesPerPeriod() ) { const f_cnt_t remaining_frames_for_cur_arp = arp_frames - ( cur_frame % arp_frames ); - // does current arp-note fill whole audio-buffer? - if( remaining_frames_for_cur_arp > Engine::mixer()->framesPerPeriod() ) + // does current arp-note fill whole audio-buffer or is the remaining time just + // a short bit that we can discard? + if( remaining_frames_for_cur_arp > Engine::mixer()->framesPerPeriod() || + _n->frames() - _n->totalFramesPlayed() < arp_frames / 5 ) { // then we don't have to do something! break; diff --git a/src/core/audio/AudioJack.cpp b/src/core/audio/AudioJack.cpp index 44ecafa23a0..7e7b703a1a3 100644 --- a/src/core/audio/AudioJack.cpp +++ b/src/core/audio/AudioJack.cpp @@ -204,6 +204,7 @@ void AudioJack::startProcessing() { if( m_active || m_client == NULL ) { + m_stopped = false; return; } diff --git a/src/core/audio/AudioSoundIo.cpp b/src/core/audio/AudioSoundIo.cpp index 2c3d493a6de..34deec1d0b8 100644 --- a/src/core/audio/AudioSoundIo.cpp +++ b/src/core/audio/AudioSoundIo.cpp @@ -50,6 +50,7 @@ AudioSoundIo::AudioSoundIo( bool & outSuccessful, Mixer * _mixer ) : m_outBufFrameIndex = 0; m_outBufFramesTotal = 0; m_stopped = true; + m_outstreamStarted = false; m_soundio = soundio_create(); if (!m_soundio) @@ -196,6 +197,12 @@ void AudioSoundIo::onBackendDisconnect(int err) AudioSoundIo::~AudioSoundIo() { stopProcessing(); + + if (m_outstream) + { + soundio_outstream_destroy(m_outstream); + } + if (m_soundio) { soundio_destroy(m_soundio); @@ -205,28 +212,50 @@ AudioSoundIo::~AudioSoundIo() void AudioSoundIo::startProcessing() { + int err; + m_outBufFrameIndex = 0; m_outBufFramesTotal = 0; m_outBufSize = mixer()->framesPerPeriod(); m_outBuf = new surroundSampleFrame[m_outBufSize]; + if (! m_outstreamStarted) + { + if ((err = soundio_outstream_start(m_outstream))) + { + fprintf(stderr, + "AudioSoundIo::startProcessing() :: soundio unable to start stream: %s\n", + soundio_strerror(err)); + } else { + m_outstreamStarted = true; + } + } + m_stopped = false; - int err; - if ((err = soundio_outstream_start(m_outstream))) + + if ((err = soundio_outstream_pause(m_outstream, false))) { m_stopped = true; - fprintf(stderr, "soundio unable to start stream: %s\n", soundio_strerror(err)); + fprintf(stderr, + "AudioSoundIo::startProcessing() :: resuming result error: %s\n", + soundio_strerror(err)); } } void AudioSoundIo::stopProcessing() { + int err; + m_stopped = true; if (m_outstream) { - soundio_outstream_destroy(m_outstream); - m_outstream = NULL; + if ((err = soundio_outstream_pause(m_outstream, true))) + { + fprintf(stderr, + "AudioSoundIo::stopProcessing() :: pausing result error: %s\n", + soundio_strerror(err)); + } } if (m_outBuf) diff --git a/src/core/main.cpp b/src/core/main.cpp index 9db0555222f..29be5ff6745 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -40,9 +40,6 @@ #include #ifdef LMMS_BUILD_WIN32 -#ifndef NOMINMAX -#define NOMINMAX -#endif #include #endif diff --git a/src/core/midi/MidiApple.cpp b/src/core/midi/MidiApple.cpp index f4bc0d4dd97..0575b76ae51 100644 --- a/src/core/midi/MidiApple.cpp +++ b/src/core/midi/MidiApple.cpp @@ -401,9 +401,9 @@ void MidiApple::midiInClose( MIDIEndpointRef reference ) char *getName( MIDIObjectRef &object ) { // Returns the name of a given MIDIObjectRef as char * - CFStringRef name = nil; + CFStringRef name = nullptr; if (noErr != MIDIObjectGetStringProperty(object, kMIDIPropertyName, &name)) - return nil; + return nullptr; int len = CFStringGetLength(name)+1; char *value = (char *) malloc(len); @@ -615,8 +615,12 @@ char * MidiApple::getFullName(MIDIEndpointRef &endpoint_ref) char * deviceName = getName(device); char * endPointName = getName(endpoint_ref); qDebug("device name='%s' endpoint name='%s'",deviceName,endPointName); - char * fullName = (char *)malloc(strlen(deviceName) + strlen(":") + strlen(endPointName)+1); + size_t deviceNameLen = deviceName == nullptr ? 0 : strlen(deviceName); + size_t endPointNameLen = endPointName == nullptr ? 0 : strlen(endPointName); + char * fullName = (char *)malloc(deviceNameLen + endPointNameLen + 2); sprintf(fullName, "%s:%s", deviceName,endPointName); + if (deviceName != nullptr) { free(deviceName); } + if (endPointName != nullptr) { free(endPointName); } return fullName; } diff --git a/src/gui/widgets/Knob.cpp b/src/gui/widgets/Knob.cpp index e3d22f69ab4..362207653be 100644 --- a/src/gui/widgets/Knob.cpp +++ b/src/gui/widgets/Knob.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -46,6 +47,7 @@ #include "MainWindow.h" #include "ProjectJournal.h" #include "Song.h" +#include "stdshims.h" #include "StringPairDrag.h" #include "TextFloat.h" @@ -58,7 +60,6 @@ Knob::Knob( knobTypes _knob_num, QWidget * _parent, const QString & _name ) : QWidget( _parent ), FloatModelView( new FloatModel( 0, 0, 0, 1, NULL, _name, true ), this ), m_label( "" ), - m_knobPixmap( NULL ), m_volumeKnob( false ), m_volumeRatio( 100.0, 0.0, 1000000.0 ), m_buttonPressed( false ), @@ -105,10 +106,16 @@ void Knob::initUi( const QString & _name ) case knobSmall_17: case knobBright_26: case knobDark_28: - setlineColor(QApplication::palette().color( QPalette::Active, QPalette::WindowText )); + m_lineActiveColor = QApplication::palette().color(QPalette::Active, QPalette::WindowText); + m_arcActiveColor = QColor(QApplication::palette().color( + QPalette::Active, QPalette::WindowText)); + m_arcActiveColor.setAlpha(70); break; case knobVintage_32: - setlineColor(QApplication::palette().color( QPalette::Active, QPalette::Shadow )); + m_lineActiveColor = QApplication::palette().color(QPalette::Active, QPalette::Shadow); + m_arcActiveColor = QColor(QApplication::palette().color( + QPalette::Active, QPalette::Shadow)); + m_arcActiveColor.setAlpha(70); break; default: break; @@ -144,8 +151,11 @@ void Knob::onKnobNumUpdated() } // If knobFilename is still empty here we should get the fallback pixmap of size 1x1 - m_knobPixmap = new QPixmap( embed::getIconPixmap( knobFilename.toUtf8().constData() ) ); - + m_knobPixmap = make_unique(QPixmap(embed::getIconPixmap(knobFilename.toUtf8().constData()))); + if (!this->isEnabled()) + { + convertPixmapToGrayScale(*m_knobPixmap.get()); + } setFixedSize( m_knobPixmap->width(), m_knobPixmap->height() ); } } @@ -153,17 +163,6 @@ void Knob::onKnobNumUpdated() -Knob::~Knob() -{ - if( m_knobPixmap ) - { - delete m_knobPixmap; - } -} - - - - void Knob::setLabel( const QString & txt ) { m_label = txt; @@ -308,35 +307,6 @@ void Knob::setOuterColor( const QColor & c ) -QColor Knob::lineColor() const -{ - return m_lineColor; -} - - - -void Knob::setlineColor( const QColor & c ) -{ - m_lineColor = c; -} - - - -QColor Knob::arcColor() const -{ - return m_arcColor; -} - - - -void Knob::setarcColor( const QColor & c ) -{ - m_arcColor = c; -} - - - - QColor Knob::textColor() const { return m_textColor; @@ -383,6 +353,10 @@ bool Knob::updateAngle() void Knob::drawKnob( QPainter * _p ) { + bool enabled = this->isEnabled(); + QColor currentArcColor = enabled ? m_arcActiveColor : m_arcInactiveColor; + QColor currentLineColor = enabled ? m_lineActiveColor : m_lineInactiveColor; + if( updateAngle() == false && !m_cache.isNull() ) { _p->drawImage( 0, 0, m_cache ); @@ -441,33 +415,24 @@ void Knob::drawKnob( QPainter * _p ) const int arcLineWidth = 2; const int arcRectSize = m_knobPixmap->width() - arcLineWidth; - QColor col; - if( m_knobNum == knobVintage_32 ) - { col = QApplication::palette().color( QPalette::Active, QPalette::Shadow ); } - else - { col = QApplication::palette().color( QPalette::Active, QPalette::WindowText ); } - col.setAlpha( 70 ); - - p.setPen( QPen( col, 2 ) ); + p.setPen(QPen(currentArcColor, 2)); p.drawArc( mid.x() - arcRectSize/2, 1, arcRectSize, arcRectSize, 315*16, 16*m_totalAngle ); + p.setPen(QPen(currentLineColor, 2)); switch( m_knobNum ) { case knobSmall_17: { - p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-2 ) ); break; } case knobBright_26: { - p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-5 ) ); break; } case knobDark_28: { - p.setPen( QPen( lineColor(), 2 ) ); const float rb = qMax( ( radius - 10 ) / 3.0, 0.0 ); const float re = qMax( ( radius - 4 ), 0.0 ); @@ -478,7 +443,6 @@ void Knob::drawKnob( QPainter * _p ) } case knobVintage_32: { - p.setPen( QPen( lineColor(), 2 ) ); p.drawLine( calculateLine( mid, radius-2, 2 ) ); break; } @@ -840,3 +804,35 @@ void Knob::doConnections() this, SLOT( update() ) ); } } + + +void Knob::changeEvent(QEvent * ev) +{ + if (ev->type() == QEvent::EnabledChange) + { + onKnobNumUpdated(); + if (!m_label.isEmpty()) + { + setLabel(m_label); + } + m_cache = QImage(); + update(); + } +} + + +void convertPixmapToGrayScale(QPixmap& pixMap) +{ + QImage temp = pixMap.toImage().convertToFormat(QImage::Format_ARGB32); + for (int i = 0; i < temp.height(); ++i) + { + for (int j = 0; j < temp.width(); ++j) + { + const auto pix = temp.pixelColor(i, j); + const auto gscale = 0.2126 * pix.redF() + 0.7152 * pix.greenF() + 0.0722 * pix.blueF(); + const auto pixGray = QColor::fromRgbF(gscale, gscale, gscale, pix.alphaF()); + temp.setPixelColor(i, j, pixGray); + } + } + pixMap.convertFromImage(temp); +}