diff --git a/0CC-FamiTracker.vcxproj b/0CC-FamiTracker.vcxproj
index 9649a754..532c2841 100644
--- a/0CC-FamiTracker.vcxproj
+++ b/0CC-FamiTracker.vcxproj
@@ -333,6 +333,7 @@
+
@@ -504,6 +505,7 @@
+
@@ -593,7 +595,6 @@
-
diff --git a/0CC-FamiTracker.vcxproj.filters b/0CC-FamiTracker.vcxproj.filters
index bf15e9e9..466600dd 100644
--- a/0CC-FamiTracker.vcxproj.filters
+++ b/0CC-FamiTracker.vcxproj.filters
@@ -1,1424 +1,1424 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {33fc7b8c-4228-48b1-ad4b-705cc05e2cb7}
-
-
- {d708da5e-0509-4c8f-b768-bdc6a928ee58}
-
-
- {8f8d9636-02cd-4da6-a764-677d16db1e8e}
-
-
- {49ac2042-699e-4193-ae28-7e421fcb049f}
-
-
- {ba772b5d-3108-4be1-b99f-fc929be99cd2}
-
-
- {54d69864-9198-4688-98ac-4dd96c0d7d7a}
-
-
- {5ab06cc1-2cfb-493b-a1c5-f7bc20cf78ad}
-
-
- {b5c7ca71-dd1d-4b33-a9aa-f112d57b48da}
-
-
- {04dc08c7-647f-43a5-8575-2c28ce070782}
-
-
- {a6165920-9390-4575-a96e-395b0cb7cc12}
-
-
- {685eb3ad-3708-429b-9b25-296fc1e358bb}
-
-
- {badd21c5-24b7-4045-819b-d4b0f1b2f89e}
-
-
- {b4ffb6c5-f100-47f6-9c58-1f944fbe7bd6}
-
-
- {ca5e7275-3c60-49f3-80c8-3df936eb77ff}
-
-
- {6bbfb27a-0159-4479-a18d-63cfe1dc519f}
-
-
- {e7bc6bda-ba47-42af-97f4-462e95e37eb1}
-
-
- {491bbcb9-957e-41d0-aa45-3664165a1f09}
-
-
- {a262a7e0-ac1f-4052-b0fe-a9d16bf8f04d}
-
-
- {e93ebf97-6cad-454c-bc8e-d640f86cd266}
-
-
- {b8dcf07e-2ab4-4484-bc8c-3d621cabc475}
-
-
- {b110f709-fbbc-4650-ab08-83c932118b03}
-
-
- {2387ad15-c0e0-4193-ac23-f2918b1fdf83}
-
-
- {5201f53e-7fef-4c6f-9a20-d56e2c1a5ea9}
-
-
- {1fddba42-4fff-4e13-a0a5-e045b70453dc}
-
-
- {8ebb2b18-fa85-4b21-a3fa-29c30a19ffef}
-
-
- {3c06237c-16ac-4683-a15b-b6f788bc9748}
-
-
- {5c83a23a-649e-47a7-b338-2290d6a5095c}
-
-
- {d7bcf1b4-7a3c-4837-bc81-5cea3191a79c}
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {1b57d422-ab3e-48cb-9cbf-bdd9db74289b}
-
-
- {5c52a1c6-b7f6-4738-966a-360aea51831d}
-
-
- {acdc884a-b8a0-4fe3-9890-d0ecbdcbeb52}
-
-
- {4ae5bef7-3b31-4788-9cf0-78d12b7300f9}
-
-
- {46612da3-a9a6-415d-bdf6-5e7308f67aea}
-
-
- {da8bda29-2d4d-4443-8719-cf084b746eac}
-
-
- {61f4c65c-d2d3-40b4-8b51-340ae97e2733}
-
-
- {ab8b8846-d8f9-4507-958d-91c44081d911}
-
-
- {cd106160-5aa5-418e-9ca0-390f2f51adbd}
-
-
- {1abb8872-409e-4795-8d17-3afd86d917c1}
-
-
- {028fb70b-0ac4-49a1-919a-3d0d4d07c581}
-
-
- {26014049-f403-4ac6-b445-a9abeb8715f8}
-
-
- {bbcfd10b-1aab-4725-925c-eb15fcf4542d}
-
-
- {47e07727-bdfd-42a0-9aee-e3e272d145a7}
-
-
- {52a1983c-b3ef-4db8-9132-e51d942b8642}
-
-
- {878bd418-e5f4-460d-864b-560051f19ba5}
-
-
- {4e4433af-9491-4d54-a227-c47c48392ed9}
-
-
- {320c64a9-c575-4174-aa62-9d8f2fe27a51}
-
-
- {84505517-f39f-413a-bcc5-5cf19175cc87}
-
-
- {5d9e33f1-088c-454f-b797-395732ef2968}
-
-
- {b8689e34-4199-485e-9c1b-e77372a7a27e}
-
-
- {da8ec827-80c5-46f8-a662-2e43b07d253c}
-
-
- {54b67771-5865-406d-a0bf-ccbed181dfc9}
-
-
- {15aa8cd8-2a19-4263-b35a-2c84b75254db}
-
-
- {7b452c5f-22c9-4955-adec-2c960fc3d084}
-
-
- {a79eadc6-743d-4228-954a-87d5bc093b47}
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx
-
-
- {a87c037f-cb6b-42f6-a140-dc6a0bd10969}
-
-
- {3c0eb6e1-cb4f-4199-9306-8e30e8f4bcb9}
-
-
- {902336ea-2d2b-45f8-a76f-2be92c15f953}
-
-
- {f6fc5dfb-3ada-41b9-95ff-2eacdf50def7}
-
-
- {08b0410e-d622-4d01-a401-d261e5357c93}
-
-
- {d13185f1-1372-469a-b67c-0a63deb8837b}
-
-
- {538b97c7-e44a-4820-b336-b443e2d6a17e}
-
-
- {3343ebba-3071-45d6-82d0-13da6a3d55ea}
-
-
- {07b4d88f-6ca3-4195-91e5-211da1d79ec2}
-
-
- {8a13d9a5-57df-4a74-98ed-32b22988f021}
-
-
- {3931a8ff-bd19-453d-bf1c-ffd5ac81e4bc}
-
-
- {054c1c46-130d-4482-95ae-ef122acf37ae}
-
-
- {4b2cd041-94e9-49f0-92f5-111e73c05385}
-
-
- {601b20e6-4fbc-4bbf-88e9-d2189b54a8a4}
-
-
- {9ee503ff-184b-4f1f-9262-28f317a15e44}
-
-
- {3e82601e-63d9-464e-a6d6-346452bd39b5}
-
-
- {4cc7efc0-6478-4fe0-ab32-cd34c48e735a}
-
-
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes\Config
-
-
- Source Files\Dialog Boxes\Config
-
-
- Source Files\Dialog Boxes\Config
-
-
- Source Files\Dialog Boxes\Config
-
-
- Source Files\Dialog Boxes\Config
-
-
- Source Files\Dialog Boxes\Config
-
-
- Source Files\Dialog Boxes\Instrument
-
-
- Source Files\Dialog Boxes\Instrument\Related
-
-
- Source Files\Dialog Boxes\Instrument\Related
-
-
- Source Files\Dialog Boxes\Instrument\Related
-
-
- Source Files\Dialog Boxes\Instrument\Related\Sequence editor
-
-
- Source Files\Dialog Boxes\Instrument\Related\Sequence editor
-
-
- Source Files\Dialog Boxes\Instrument\Related\Sequence editor
-
-
- Source Files\Dialog Boxes\Instrument\Related\Sequence editor
-
-
- Source Files\Dialog Boxes\Instrument\Related\Resampler
-
-
- Source Files\Dialog Boxes\Instrument\Related\Resampler
-
-
- Source Files\Dialog Boxes\Instrument\Related\DPCM Editor
-
-
- Source Files\Dialog Boxes\Instrument\Related\DPCM Editor
-
-
- Source Files\Dialog Boxes\Instrument\Instrument panels
-
-
- Source Files\Dialog Boxes\Instrument\Instrument panels
-
-
- Source Files\Dialog Boxes\Instrument\Instrument panels
-
-
- Source Files\Dialog Boxes\Instrument\Instrument panels
-
-
- Source Files\Dialog Boxes\Instrument\Instrument panels
-
-
- Source Files\Dialog Boxes\Instrument\Instrument panels
-
-
- Source Files\Dialog Boxes\Wave export
-
-
- Source Files\Dialog Boxes\Wave export
-
-
- Source Files\Exporter
-
-
- Source Files\Exporter
-
-
- Source Files\Exporter
-
-
- Source Files\Exporter\Custom Exporter
-
-
- Source Files\Exporter\Custom Exporter
-
-
- Source Files\Exporter\Custom Exporter
-
-
- Source Files\Exporter\Custom Exporter
-
-
- Source Files\Exporter\Text
-
-
- Source Files\Exporter\Chunk
-
-
- Source Files\Exporter\Chunk
-
-
- Source Files\Exporter\Chunk
-
-
- Source Files\Document Data Types
-
-
- Source Files\Document Data Types
-
-
- Source Files\Document Data Types
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Visualizer
-
-
- Source Files\Visualizer\Visualizers
-
-
- Source Files\Visualizer\Visualizers
-
-
- Source Files\Visualizer\Visualizers
-
-
- Source Files\Sound Driver
-
-
- Source Files\Sound Driver
-
-
- Source Files\Sound Driver
-
-
- Source Files\Sound Driver\Emulation
-
-
- Source Files\Sound Driver\Emulation
-
-
- Source Files\Sound Driver\Emulation\Internal Channels
-
-
- Source Files\Sound Driver\Emulation\Internal Channels
-
-
- Source Files\Sound Driver\Emulation\Internal Channels
-
-
- Source Files\Sound Driver\Emulation\Internal Channels
-
-
- Source Files\Sound Driver\Emulation\Sound Chips
-
-
- Source Files\Sound Driver\Emulation\Sound Chips
-
-
- Source Files\Sound Driver\Emulation\Sound Chips
-
-
- Source Files\Sound Driver\Emulation\Sound Chips
-
-
- Source Files\Sound Driver\Emulation\Sound Chips
-
-
- Source Files\Sound Driver\Emulation\Sound Chips\External
-
-
- Source Files\Sound Driver\Emulation\Sound Chips\External
-
-
- Source Files\Sound Driver\Emulation\Blip_Buffer
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver\Audio
-
-
- Source Files\MIDI
-
-
- Source Files\Pattern Editor
-
-
- Source Files\Pattern Editor
-
-
- Source Files\Pattern Editor
-
-
- Source Files\Pattern Editor
-
-
- Source Files\Frame Editor
-
-
- Source Files\Frame Editor
-
-
- Source Files\Custom Controls
-
-
- Source Files\Custom Controls
-
-
- Source Files\Custom Controls
-
-
- Source Files\Components
-
-
- Source Files\Components
-
-
- Source Files\Components
-
-
- Source Files\Components
-
-
- Source Files\Components
-
-
- Source Files\Components
-
-
- Source Files\Components
-
-
- Source Files\Document Data Types
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Sound Driver\Instruments
-
-
- Source Files\Sound Driver\Instruments
-
-
- Source Files\Sound Driver\Instruments
-
-
- Source Files\Sound Driver\Instruments
-
-
- Source Files\Document Data Types
-
-
- Source Files\Document Components
-
-
- Source Files\Document Components
-
-
- Source Files\Dialog Boxes\Instrument\Instrument panels
-
-
- Source Files\Dialog Boxes\Config
-
-
- Source Files\Document Components
-
-
- Source Files\Dialog Boxes\Instrument\Related
-
-
- Source Files\Dialog Boxes\Instrument\Related
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Document Components
-
-
- Source Files\Document Components
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Document Data Types\Instruments
-
-
- Source Files\Document Data Types
-
-
- Source Files\Document Components
-
-
- Source Files\Document Data Types
-
-
- Source Files\Document Data Types
-
-
- Source Files\Document Data Types
-
-
- Source Files\Sound Driver\Instruments
-
-
- Source Files\Sound Driver\Channels
-
-
- Source Files\Sound Driver
-
-
- Source Files\Document Data Types
-
-
- Source Files\Components
-
-
- Source Files\Other
-
-
- Source Files\Sound Driver\Emulation\Sound Chips
-
-
- Source Files\Document Data Types
-
-
- Source Files\Components
-
-
- Source Files\Sound Driver\Emulation
-
-
- Source Files\Sound Driver\Emulation
-
-
- Source Files\Sound Driver
-
-
- Source Files\Dialog Boxes
-
-
- Source Files\Sound Driver\Instruments
-
-
- Source Files\Sound Driver\Instruments
-
-
- Source Files\Sound Driver\Emulation\Sound Chips
-
-
- Source Files\Frame Editor
-
-
- Source Files\Pattern Editor
-
-
- Source Files\Dialog Boxes\Instrument\Related\Sequence editor
-
-
- Source Files
-
-
- Source Files\Sound Driver\Instruments
-
-
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files\Sound Driver Headers
-
-
- Header Files\Sound Driver Headers
-
-
- Header Files\Sound Driver Headers
-
-
- Header Files\Sound Driver Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers\External
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers\External
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers\External
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers\External
-
-
- Header Files\Sound Driver Headers\Blip_Buffer Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers\Audio Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers\Config Headers
-
-
- Header Files\Dialog Boxes Headers\Config Headers
-
-
- Header Files\Dialog Boxes Headers\Config Headers
-
-
- Header Files\Dialog Boxes Headers\Config Headers
-
-
- Header Files\Dialog Boxes Headers\Config Headers
-
-
- Header Files\Dialog Boxes Headers\Config Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Resampler Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Resampler Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\DPCM Editor Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\DPCM Editor Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
-
-
- Header Files\Visualizer Headers
-
-
- Header Files\Visualizer Headers\Visualizers Headers
-
-
- Header Files\Visualizer Headers\Visualizers Headers
-
-
- Header Files\Visualizer Headers\Visualizers Headers
-
-
- Header Files\Export Headers
-
-
- Header Files\Export Headers
-
-
- Header Files\Export Headers
-
-
- Header Files\Export Headers
-
-
- Header Files\Export Headers\Custom Exporter Headers
-
-
- Header Files\Export Headers\Custom Exporter Headers
-
-
- Header Files\Export Headers\Custom Exporter Headers
-
-
- Header Files\Export Headers\Custom Exporter Headers
-
-
- Header Files\Export Headers\Custom Exporter Headers
-
-
- Header Files\Export Headers\Chunk Headers
-
-
- Header Files\Export Headers\Chunk Headers
-
-
- Header Files\Export Headers\Chunk Headers
-
-
- Header Files\Export Headers\Text Headers
-
-
- Header Files\Other Headers
-
-
- Header Files\MIDI Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Pattern Editor Headers
-
-
- Header Files\Pattern Editor Headers
-
-
- Header Files\Pattern Editor Headers
-
-
- Header Files\Pattern Editor Headers
-
-
- Header Files\Pattern Editor Headers
-
-
- Header Files\Frame Editor Headers
-
-
- Header Files\Frame Editor Headers
-
-
- Header Files\Custom Control Headers
-
-
- Header Files\Custom Control Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers\Config Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Document Component Headers
-
-
- Header Files\Document Component Headers
-
-
- Header Files\Document Component Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
-
-
- Header Files\Document Component Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Dialog Boxes Headers\Wave Export Headers
-
-
- Header Files\Dialog Boxes Headers\Wave Export Headers
-
-
- Header Files\Document Component Headers
-
-
- Header Files\Document Component Headers
-
-
- Header Files\Document Component Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Document Data Type Headers\Instrument Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Document Component Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Export Headers\NSF Driver Headers
-
-
- Header Files\Export Headers\NSF Driver Headers
-
-
- Header Files\Export Headers\NSF Driver Headers
-
-
- Header Files\Export Headers\NSF Driver Headers
-
-
- Header Files\Export Headers\NSF Driver Headers
-
-
- Header Files\Export Headers\NSF Driver Headers
-
-
- Header Files\Export Headers\NSF Driver Headers
-
-
- Header Files\Export Headers\NSF Driver Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Sound Driver Headers\Channels Headers
-
-
- Header Files\Sound Driver Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Other Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files
-
-
- Header Files\Components Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers
-
-
- Header Files\Sound Driver Headers
-
-
- Header Files\Dialog Boxes Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
-
-
- Header Files\Frame Editor Headers
-
-
- Header Files\Pattern Editor Headers
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
-
-
- Header Files\Sound Driver Headers\Instruments Headers
-
-
- Header Files\Other Headers
-
-
- Header Files\Windows Headers
-
-
- Header Files\Windows Headers
-
-
- Header Files\Windows Headers
-
-
- Header Files\Windows Headers
-
-
- Header Files\Document Data Type Headers
-
-
- Header Files\Frame Editor Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Components Headers
-
-
- Header Files\Other Headers
-
-
- Header Files\Other Headers
-
-
- Header Files
-
-
-
-
- Resource Files
-
-
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Icons
-
-
- Resource Files\Bitmaps
-
-
- Resource Files\Bitmaps
-
-
- Resource Files\Bitmaps
-
-
- Resource Files\Bitmaps
-
-
- Resource Files\Bitmaps
-
-
- Resource Files\Bitmaps
-
-
- Resource Files\Bitmaps
-
-
- Resource Files\Bitmaps
-
-
- Resource Files\Bitmaps
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
-
-
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- NSF driver
-
-
- Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Resampler Headers
-
-
-
-
-
- Source Files
-
-
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {33fc7b8c-4228-48b1-ad4b-705cc05e2cb7}
+
+
+ {d708da5e-0509-4c8f-b768-bdc6a928ee58}
+
+
+ {8f8d9636-02cd-4da6-a764-677d16db1e8e}
+
+
+ {49ac2042-699e-4193-ae28-7e421fcb049f}
+
+
+ {ba772b5d-3108-4be1-b99f-fc929be99cd2}
+
+
+ {54d69864-9198-4688-98ac-4dd96c0d7d7a}
+
+
+ {5ab06cc1-2cfb-493b-a1c5-f7bc20cf78ad}
+
+
+ {b5c7ca71-dd1d-4b33-a9aa-f112d57b48da}
+
+
+ {04dc08c7-647f-43a5-8575-2c28ce070782}
+
+
+ {a6165920-9390-4575-a96e-395b0cb7cc12}
+
+
+ {685eb3ad-3708-429b-9b25-296fc1e358bb}
+
+
+ {badd21c5-24b7-4045-819b-d4b0f1b2f89e}
+
+
+ {b4ffb6c5-f100-47f6-9c58-1f944fbe7bd6}
+
+
+ {ca5e7275-3c60-49f3-80c8-3df936eb77ff}
+
+
+ {6bbfb27a-0159-4479-a18d-63cfe1dc519f}
+
+
+ {e7bc6bda-ba47-42af-97f4-462e95e37eb1}
+
+
+ {491bbcb9-957e-41d0-aa45-3664165a1f09}
+
+
+ {a262a7e0-ac1f-4052-b0fe-a9d16bf8f04d}
+
+
+ {e93ebf97-6cad-454c-bc8e-d640f86cd266}
+
+
+ {b8dcf07e-2ab4-4484-bc8c-3d621cabc475}
+
+
+ {b110f709-fbbc-4650-ab08-83c932118b03}
+
+
+ {2387ad15-c0e0-4193-ac23-f2918b1fdf83}
+
+
+ {5201f53e-7fef-4c6f-9a20-d56e2c1a5ea9}
+
+
+ {1fddba42-4fff-4e13-a0a5-e045b70453dc}
+
+
+ {8ebb2b18-fa85-4b21-a3fa-29c30a19ffef}
+
+
+ {3c06237c-16ac-4683-a15b-b6f788bc9748}
+
+
+ {5c83a23a-649e-47a7-b338-2290d6a5095c}
+
+
+ {d7bcf1b4-7a3c-4837-bc81-5cea3191a79c}
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {1b57d422-ab3e-48cb-9cbf-bdd9db74289b}
+
+
+ {5c52a1c6-b7f6-4738-966a-360aea51831d}
+
+
+ {acdc884a-b8a0-4fe3-9890-d0ecbdcbeb52}
+
+
+ {4ae5bef7-3b31-4788-9cf0-78d12b7300f9}
+
+
+ {46612da3-a9a6-415d-bdf6-5e7308f67aea}
+
+
+ {da8bda29-2d4d-4443-8719-cf084b746eac}
+
+
+ {61f4c65c-d2d3-40b4-8b51-340ae97e2733}
+
+
+ {ab8b8846-d8f9-4507-958d-91c44081d911}
+
+
+ {cd106160-5aa5-418e-9ca0-390f2f51adbd}
+
+
+ {1abb8872-409e-4795-8d17-3afd86d917c1}
+
+
+ {028fb70b-0ac4-49a1-919a-3d0d4d07c581}
+
+
+ {26014049-f403-4ac6-b445-a9abeb8715f8}
+
+
+ {bbcfd10b-1aab-4725-925c-eb15fcf4542d}
+
+
+ {47e07727-bdfd-42a0-9aee-e3e272d145a7}
+
+
+ {52a1983c-b3ef-4db8-9132-e51d942b8642}
+
+
+ {878bd418-e5f4-460d-864b-560051f19ba5}
+
+
+ {4e4433af-9491-4d54-a227-c47c48392ed9}
+
+
+ {320c64a9-c575-4174-aa62-9d8f2fe27a51}
+
+
+ {84505517-f39f-413a-bcc5-5cf19175cc87}
+
+
+ {5d9e33f1-088c-454f-b797-395732ef2968}
+
+
+ {b8689e34-4199-485e-9c1b-e77372a7a27e}
+
+
+ {da8ec827-80c5-46f8-a662-2e43b07d253c}
+
+
+ {54b67771-5865-406d-a0bf-ccbed181dfc9}
+
+
+ {15aa8cd8-2a19-4263-b35a-2c84b75254db}
+
+
+ {7b452c5f-22c9-4955-adec-2c960fc3d084}
+
+
+ {a79eadc6-743d-4228-954a-87d5bc093b47}
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx
+
+
+ {a87c037f-cb6b-42f6-a140-dc6a0bd10969}
+
+
+ {3c0eb6e1-cb4f-4199-9306-8e30e8f4bcb9}
+
+
+ {902336ea-2d2b-45f8-a76f-2be92c15f953}
+
+
+ {f6fc5dfb-3ada-41b9-95ff-2eacdf50def7}
+
+
+ {08b0410e-d622-4d01-a401-d261e5357c93}
+
+
+ {d13185f1-1372-469a-b67c-0a63deb8837b}
+
+
+ {538b97c7-e44a-4820-b336-b443e2d6a17e}
+
+
+ {3343ebba-3071-45d6-82d0-13da6a3d55ea}
+
+
+ {07b4d88f-6ca3-4195-91e5-211da1d79ec2}
+
+
+ {8a13d9a5-57df-4a74-98ed-32b22988f021}
+
+
+ {3931a8ff-bd19-453d-bf1c-ffd5ac81e4bc}
+
+
+ {054c1c46-130d-4482-95ae-ef122acf37ae}
+
+
+ {4b2cd041-94e9-49f0-92f5-111e73c05385}
+
+
+ {601b20e6-4fbc-4bbf-88e9-d2189b54a8a4}
+
+
+ {9ee503ff-184b-4f1f-9262-28f317a15e44}
+
+
+ {3e82601e-63d9-464e-a6d6-346452bd39b5}
+
+
+ {4cc7efc0-6478-4fe0-ab32-cd34c48e735a}
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes\Config
+
+
+ Source Files\Dialog Boxes\Config
+
+
+ Source Files\Dialog Boxes\Config
+
+
+ Source Files\Dialog Boxes\Config
+
+
+ Source Files\Dialog Boxes\Config
+
+
+ Source Files\Dialog Boxes\Config
+
+
+ Source Files\Dialog Boxes\Instrument
+
+
+ Source Files\Dialog Boxes\Instrument\Related
+
+
+ Source Files\Dialog Boxes\Instrument\Related
+
+
+ Source Files\Dialog Boxes\Instrument\Related
+
+
+ Source Files\Dialog Boxes\Instrument\Related\Sequence editor
+
+
+ Source Files\Dialog Boxes\Instrument\Related\Sequence editor
+
+
+ Source Files\Dialog Boxes\Instrument\Related\Sequence editor
+
+
+ Source Files\Dialog Boxes\Instrument\Related\Sequence editor
+
+
+ Source Files\Dialog Boxes\Instrument\Related\Resampler
+
+
+ Source Files\Dialog Boxes\Instrument\Related\Resampler
+
+
+ Source Files\Dialog Boxes\Instrument\Related\DPCM Editor
+
+
+ Source Files\Dialog Boxes\Instrument\Related\DPCM Editor
+
+
+ Source Files\Dialog Boxes\Instrument\Instrument panels
+
+
+ Source Files\Dialog Boxes\Instrument\Instrument panels
+
+
+ Source Files\Dialog Boxes\Instrument\Instrument panels
+
+
+ Source Files\Dialog Boxes\Instrument\Instrument panels
+
+
+ Source Files\Dialog Boxes\Instrument\Instrument panels
+
+
+ Source Files\Dialog Boxes\Instrument\Instrument panels
+
+
+ Source Files\Dialog Boxes\Wave export
+
+
+ Source Files\Dialog Boxes\Wave export
+
+
+ Source Files\Exporter
+
+
+ Source Files\Exporter
+
+
+ Source Files\Exporter
+
+
+ Source Files\Exporter\Custom Exporter
+
+
+ Source Files\Exporter\Custom Exporter
+
+
+ Source Files\Exporter\Custom Exporter
+
+
+ Source Files\Exporter\Custom Exporter
+
+
+ Source Files\Exporter\Text
+
+
+ Source Files\Exporter\Chunk
+
+
+ Source Files\Exporter\Chunk
+
+
+ Source Files\Exporter\Chunk
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Visualizer
+
+
+ Source Files\Visualizer\Visualizers
+
+
+ Source Files\Visualizer\Visualizers
+
+
+ Source Files\Visualizer\Visualizers
+
+
+ Source Files\Sound Driver
+
+
+ Source Files\Sound Driver
+
+
+ Source Files\Sound Driver
+
+
+ Source Files\Sound Driver\Emulation
+
+
+ Source Files\Sound Driver\Emulation
+
+
+ Source Files\Sound Driver\Emulation\Internal Channels
+
+
+ Source Files\Sound Driver\Emulation\Internal Channels
+
+
+ Source Files\Sound Driver\Emulation\Internal Channels
+
+
+ Source Files\Sound Driver\Emulation\Internal Channels
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips\External
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips\External
+
+
+ Source Files\Sound Driver\Emulation\Blip_Buffer
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver\Audio
+
+
+ Source Files\MIDI
+
+
+ Source Files\Pattern Editor
+
+
+ Source Files\Pattern Editor
+
+
+ Source Files\Pattern Editor
+
+
+ Source Files\Pattern Editor
+
+
+ Source Files\Frame Editor
+
+
+ Source Files\Frame Editor
+
+
+ Source Files\Custom Controls
+
+
+ Source Files\Custom Controls
+
+
+ Source Files\Custom Controls
+
+
+ Source Files\Components
+
+
+ Source Files\Components
+
+
+ Source Files\Components
+
+
+ Source Files\Components
+
+
+ Source Files\Components
+
+
+ Source Files\Components
+
+
+ Source Files\Components
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Sound Driver\Instruments
+
+
+ Source Files\Sound Driver\Instruments
+
+
+ Source Files\Sound Driver\Instruments
+
+
+ Source Files\Sound Driver\Instruments
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Document Components
+
+
+ Source Files\Document Components
+
+
+ Source Files\Dialog Boxes\Instrument\Instrument panels
+
+
+ Source Files\Dialog Boxes\Config
+
+
+ Source Files\Document Components
+
+
+ Source Files\Dialog Boxes\Instrument\Related
+
+
+ Source Files\Dialog Boxes\Instrument\Related
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Document Components
+
+
+ Source Files\Document Components
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Document Data Types\Instruments
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Document Components
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Sound Driver\Instruments
+
+
+ Source Files\Sound Driver\Channels
+
+
+ Source Files\Sound Driver
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Components
+
+
+ Source Files\Other
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips
+
+
+ Source Files\Document Data Types
+
+
+ Source Files\Components
+
+
+ Source Files\Sound Driver\Emulation
+
+
+ Source Files\Sound Driver\Emulation
+
+
+ Source Files\Sound Driver
+
+
+ Source Files\Dialog Boxes
+
+
+ Source Files\Sound Driver\Instruments
+
+
+ Source Files\Sound Driver\Instruments
+
+
+ Source Files\Sound Driver\Emulation\Sound Chips
+
+
+ Source Files\Frame Editor
+
+
+ Source Files\Pattern Editor
+
+
+ Source Files\Dialog Boxes\Instrument\Related\Sequence editor
+
+
+ Source Files
+
+
+ Source Files\Sound Driver\Instruments
+
+
+ Source Files\Visualizer\Visualizers
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files\Sound Driver Headers
+
+
+ Header Files\Sound Driver Headers
+
+
+ Header Files\Sound Driver Headers
+
+
+ Header Files\Sound Driver Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers\External
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers\External
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers\External
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers\External
+
+
+ Header Files\Sound Driver Headers\Blip_Buffer Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers\Audio Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers\Config Headers
+
+
+ Header Files\Dialog Boxes Headers\Config Headers
+
+
+ Header Files\Dialog Boxes Headers\Config Headers
+
+
+ Header Files\Dialog Boxes Headers\Config Headers
+
+
+ Header Files\Dialog Boxes Headers\Config Headers
+
+
+ Header Files\Dialog Boxes Headers\Config Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Resampler Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Resampler Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\DPCM Editor Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\DPCM Editor Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
+
+
+ Header Files\Visualizer Headers
+
+
+ Header Files\Visualizer Headers\Visualizers Headers
+
+
+ Header Files\Visualizer Headers\Visualizers Headers
+
+
+ Header Files\Visualizer Headers\Visualizers Headers
+
+
+ Header Files\Export Headers
+
+
+ Header Files\Export Headers
+
+
+ Header Files\Export Headers
+
+
+ Header Files\Export Headers
+
+
+ Header Files\Export Headers\Custom Exporter Headers
+
+
+ Header Files\Export Headers\Custom Exporter Headers
+
+
+ Header Files\Export Headers\Custom Exporter Headers
+
+
+ Header Files\Export Headers\Custom Exporter Headers
+
+
+ Header Files\Export Headers\Custom Exporter Headers
+
+
+ Header Files\Export Headers\Chunk Headers
+
+
+ Header Files\Export Headers\Chunk Headers
+
+
+ Header Files\Export Headers\Chunk Headers
+
+
+ Header Files\Export Headers\Text Headers
+
+
+ Header Files\MIDI Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Pattern Editor Headers
+
+
+ Header Files\Pattern Editor Headers
+
+
+ Header Files\Pattern Editor Headers
+
+
+ Header Files\Pattern Editor Headers
+
+
+ Header Files\Pattern Editor Headers
+
+
+ Header Files\Frame Editor Headers
+
+
+ Header Files\Frame Editor Headers
+
+
+ Header Files\Custom Control Headers
+
+
+ Header Files\Custom Control Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers\Config Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Document Component Headers
+
+
+ Header Files\Document Component Headers
+
+
+ Header Files\Document Component Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Instrument dialog
+
+
+ Header Files\Document Component Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Dialog Boxes Headers\Wave Export Headers
+
+
+ Header Files\Dialog Boxes Headers\Wave Export Headers
+
+
+ Header Files\Document Component Headers
+
+
+ Header Files\Document Component Headers
+
+
+ Header Files\Document Component Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Document Data Type Headers\Instrument Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Document Component Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Export Headers\NSF Driver Headers
+
+
+ Header Files\Export Headers\NSF Driver Headers
+
+
+ Header Files\Export Headers\NSF Driver Headers
+
+
+ Header Files\Export Headers\NSF Driver Headers
+
+
+ Header Files\Export Headers\NSF Driver Headers
+
+
+ Header Files\Export Headers\NSF Driver Headers
+
+
+ Header Files\Export Headers\NSF Driver Headers
+
+
+ Header Files\Export Headers\NSF Driver Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Sound Driver Headers\Channels Headers
+
+
+ Header Files\Sound Driver Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Other Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Internal Channels Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers
+
+
+ Header Files\Sound Driver Headers
+
+
+ Header Files\Dialog Boxes Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Sound Driver Headers\Emulation Headers\Sound Chip Headers
+
+
+ Header Files\Frame Editor Headers
+
+
+ Header Files\Pattern Editor Headers
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Sequence editor Headers
+
+
+ Header Files\Sound Driver Headers\Instruments Headers
+
+
+ Header Files\Other Headers
+
+
+ Header Files\Windows Headers
+
+
+ Header Files\Windows Headers
+
+
+ Header Files\Windows Headers
+
+
+ Header Files\Windows Headers
+
+
+ Header Files\Document Data Type Headers
+
+
+ Header Files\Frame Editor Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Components Headers
+
+
+ Header Files\Other Headers
+
+
+ Header Files\Other Headers
+
+
+ Header Files\Visualizer Headers\Visualizers Headers
+
+
+
+
+ Resource Files
+
+
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Icons
+
+
+ Resource Files\Bitmaps
+
+
+ Resource Files\Bitmaps
+
+
+ Resource Files\Bitmaps
+
+
+ Resource Files\Bitmaps
+
+
+ Resource Files\Bitmaps
+
+
+ Resource Files\Bitmaps
+
+
+ Resource Files\Bitmaps
+
+
+ Resource Files\Bitmaps
+
+
+ Resource Files\Bitmaps
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+
+
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ NSF driver
+
+
+ Header Files\Dialog Boxes Headers\Instrument Headers\Related Headers\Resampler Headers
+
+
+
+
+
+ Source Files
+
+
\ No newline at end of file
diff --git a/Source/FFT/Complex.h b/Source/FFT/Complex.h
deleted file mode 100644
index 8e0b7b2d..00000000
--- a/Source/FFT/Complex.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#if !defined COMPLEX_H
-#define COMPLEX_H
-//------------------------------------
-// complex.h
-// Complex number
-// (c) Reliable Software, 1996
-//------------------------------------
-
-#include
-
-class Complex
-{
-public:
- Complex () {}
- Complex (double re): _re(re), _im(0.0) {}
- Complex (double re, double im): _re(re), _im(im) {}
- double Re () const { return _re; }
- double Im () const { return _im; }
- void operator += (const Complex& c)
- {
- _re += c._re;
- _im += c._im;
- }
- void operator -= (const Complex& c)
- {
- _re -= c._re;
- _im -= c._im;
- }
- void operator *= (const Complex& c)
- {
- double reT = c._re * _re - c._im * _im;
- _im = c._re * _im + c._im * _re;
- _re = reT;
- }
- Complex operator- ()
- {
- return Complex (-_re, -_im);
- }
- double Mod () const { return sqrt (_re * _re + _im * _im); }
-private:
- double _re;
- double _im;
-};
-
-#endif
\ No newline at end of file
diff --git a/Source/FFT/FftBuffer.h b/Source/FFT/FftBuffer.h
index 3ef78a40..0102024f 100644
--- a/Source/FFT/FftBuffer.h
+++ b/Source/FFT/FftBuffer.h
@@ -42,6 +42,10 @@ constexpr std::array make_hann_window() {
template
class FftBuffer {
public:
+ static constexpr std::size_t GetPoints() noexcept {
+ return N;
+ }
+
void Reset() {
samples_.fill({ });
buffer_.fill({ });
@@ -53,8 +57,10 @@ class FftBuffer {
template
void CopyIn(InputIt Samples, std::size_t SampleCount) {
- if (SampleCount > std::size(samples_))
- return;
+ if (SampleCount > GetPoints()) {
+ SampleCount = GetPoints();
+ std::advance(Samples, SampleCount - GetPoints());
+ }
std::copy(samples_.cbegin() + SampleCount, samples_.cend(), samples_.begin());
std::transform(Samples, Samples + SampleCount, samples_.begin(), [] (auto x) {
return std::complex(x, 0);
@@ -62,7 +68,7 @@ class FftBuffer {
}
double GetIntensity(int i) const {
- const double sqrtpoints = 1 << (FFT::details::floor_log2(N) / 2);
+ const double sqrtpoints = 1 << (FFT::details::floor_log2(GetPoints()) / 2);
return std::abs(buffer_[i]) / sqrtpoints;
}
diff --git a/Source/VisualizerBase.cpp b/Source/VisualizerBase.cpp
new file mode 100644
index 00000000..b0efe5c6
--- /dev/null
+++ b/Source/VisualizerBase.cpp
@@ -0,0 +1,50 @@
+/*
+** FamiTracker - NES/Famicom sound tracker
+** Copyright (C) 2005-2014 Jonathan Liss
+**
+** 0CC-FamiTracker is (C) 2014-2017 HertzDevil
+**
+** 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
+** Library General Public License for more details. To obtain a
+** copy of the GNU Library General Public License, write to the Free
+** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** Any permitted reproduction of these routines, in whole or in part,
+** must bear this legend.
+*/
+
+#include "VisualizerBase.h"
+
+void CVisualizerBase::Create(int Width, int Height)
+{
+ memset(&m_bmi, 0, sizeof(BITMAPINFO));
+ m_bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ m_bmi.bmiHeader.biBitCount = 32;
+ m_bmi.bmiHeader.biHeight = -Height;
+ m_bmi.bmiHeader.biWidth = Width;
+ m_bmi.bmiHeader.biPlanes = 1;
+
+ m_iWidth = Width;
+ m_iHeight = Height;
+ m_pBlitBuffer = std::make_unique(Width * Height); // // //
+}
+
+void CVisualizerBase::SetSampleData(short *pSamples, unsigned int iCount)
+{
+ m_pSamples = pSamples;
+ m_iSampleCount = iCount;
+}
+
+void CVisualizerBase::Display(CDC *pDC, bool bPaintMsg) { // // //
+ StretchDIBits(pDC->m_hDC,
+ 0, 0, m_iWidth, m_iHeight,
+ 0, 0, m_iWidth, m_iHeight,
+ m_pBlitBuffer.get(), &m_bmi, DIB_RGB_COLORS, SRCCOPY);
+}
diff --git a/Source/VisualizerBase.h b/Source/VisualizerBase.h
new file mode 100644
index 00000000..df3c2375
--- /dev/null
+++ b/Source/VisualizerBase.h
@@ -0,0 +1,53 @@
+/*
+** FamiTracker - NES/Famicom sound tracker
+** Copyright (C) 2005-2014 Jonathan Liss
+**
+** 0CC-FamiTracker is (C) 2014-2017 HertzDevil
+**
+** 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
+** Library General Public License for more details. To obtain a
+** copy of the GNU Library General Public License, write to the Free
+** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** Any permitted reproduction of these routines, in whole or in part,
+** must bear this legend.
+*/
+
+
+#pragma once
+
+#include "stdafx.h"
+#include // // //
+
+class CVisualizerBase { // // //
+public:
+ virtual ~CVisualizerBase() = default;
+
+ // Create the visualizer
+ virtual void Create(int Width, int Height);
+ // Set rate of samples
+ virtual void SetSampleRate(int SampleRate) = 0;
+ // Set new sample data
+ virtual void SetSampleData(short *iSamples, unsigned int iCount);
+ // Render an image from the sample data
+ virtual void Draw() = 0;
+ // Display the image
+ virtual void Display(CDC *pDC, bool bPaintMsg); // // //
+
+protected:
+ BITMAPINFO m_bmi;
+ std::unique_ptr m_pBlitBuffer; // // //
+
+ int m_iWidth = 0;
+ int m_iHeight = 0;
+
+ unsigned int m_iSampleCount = 0;
+ short *m_pSamples = nullptr;
+};
diff --git a/Source/VisualizerScope.cpp b/Source/VisualizerScope.cpp
index 82ea0fb1..8f310a18 100644
--- a/Source/VisualizerScope.cpp
+++ b/Source/VisualizerScope.cpp
@@ -1,182 +1,174 @@
-/*
-** FamiTracker - NES/Famicom sound tracker
-** Copyright (C) 2005-2014 Jonathan Liss
-**
-** 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
-** Library General Public License for more details. To obtain a
-** copy of the GNU Library General Public License, write to the Free
-** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-**
-** Any permitted reproduction of these routines, in whole or in part,
-** must bear this legend.
-*/
-
-#include "stdafx.h"
-#include
-#include "FamiTracker.h"
-#include "VisualizerWnd.h"
-#include "VisualizerScope.h"
-#include "Graphics.h"
-
-/*
- * Displays a sample scope
- *
- */
-
-CVisualizerScope::CVisualizerScope(bool bBlur) :
- m_pBlitBuffer(NULL),
- m_pWindowBuf(NULL),
- m_bBlur(bBlur),
- m_iWindowBufPtr(0)
-{
-}
-
-CVisualizerScope::~CVisualizerScope()
-{
- SAFE_RELEASE_ARRAY(m_pBlitBuffer);
- SAFE_RELEASE_ARRAY(m_pWindowBuf);
-}
-
-void CVisualizerScope::Create(int Width, int Height)
-{
- CVisualizerBase::Create(Width, Height);
-
- SAFE_RELEASE_ARRAY(m_pBlitBuffer);
- SAFE_RELEASE_ARRAY(m_pWindowBuf);
-
- m_pBlitBuffer = new COLORREF[Width * (Height + 1)];
- memset(m_pBlitBuffer, 0, Width * Height * sizeof(COLORREF));
-
- m_pWindowBuf = new short[Width];
- m_iWindowBufPtr = 0;
-}
-
-void CVisualizerScope::SetSampleRate(int SampleRate)
-{
-}
-
-void CVisualizerScope::ClearBackground()
-{
- for (int y = 0; y < m_iHeight; ++y) {
- memset(m_pBlitBuffer + y * m_iWidth, int(sinf((float(y) * 3.14f) / float(m_iHeight)) * 40.0f), sizeof(COLORREF) * m_iWidth);
- }
-}
-
-void CVisualizerScope::RenderBuffer()
-{
- const float SAMPLE_SCALING = 1200.0f;
-
- const COLORREF LINE_COL1 = 0xFFFFFF;
- const COLORREF LINE_COL2 = 0x808080;
-
- const int BLUR_COLORS[] = {3, 12, 12};
-
- const float HALF_HEIGHT = float(m_iHeight) / 2.0f;
-
- if (m_bBlur)
- BlurBuffer(m_pBlitBuffer, m_iWidth, m_iHeight, BLUR_COLORS);
- else
- ClearBackground();
-
- float Sample = -float(m_pWindowBuf[0]) / SAMPLE_SCALING;
-
- for (float x = 0.0f; x < float(m_iWidth); ++x) {
- float LastSample = Sample;
- Sample = -float(m_pWindowBuf[int(x)]) / SAMPLE_SCALING;
-
- if (Sample < -HALF_HEIGHT + 1)
- Sample = -HALF_HEIGHT + 1;
- if (Sample > HALF_HEIGHT - 1)
- Sample = HALF_HEIGHT - 1;
-
- PutPixel(m_pBlitBuffer, m_iWidth, m_iHeight, x, Sample + HALF_HEIGHT - 0.5f, LINE_COL2);
- PutPixel(m_pBlitBuffer, m_iWidth, m_iHeight, x, Sample + HALF_HEIGHT + 0.5f, LINE_COL2);
- PutPixel(m_pBlitBuffer, m_iWidth, m_iHeight, x, Sample + HALF_HEIGHT + 0.0f, LINE_COL1);
-
- if ((Sample - LastSample) > 1.0f) {
- float frac = LastSample - floor(LastSample);
- for (float y = LastSample; y < Sample; ++y) {
- float Offset = (y - LastSample) / (Sample - LastSample);
- PutPixel(m_pBlitBuffer, m_iWidth, m_iHeight, x + Offset - 1.0f, y + HALF_HEIGHT + frac, LINE_COL1);
- }
- }
- else if ((LastSample - Sample) > 1.0f) {
- float frac = Sample - floor(Sample);
- for (float y = Sample; y < LastSample; ++y) {
- float Offset = (y - Sample) / (LastSample - Sample);
- PutPixel(m_pBlitBuffer, m_iWidth, m_iHeight, x - Offset, y + HALF_HEIGHT + frac, LINE_COL1);
- }
- }
- }
-}
-
-void CVisualizerScope::Draw()
-{
-#ifdef _DEBUG
- static int _peak = 0;
- static int _min = 0;
- static int _max = 0;
-#endif
-
- const int TIME_SCALING = 7;
-
- static int LastPos = 0;
- static int Accum = 0;
-
- for (unsigned int i = 0; i < m_iSampleCount; ++i) {
-
-#ifdef _DEBUG
- if (_min > m_pSamples[i])
- _min = m_pSamples[i];
- if (_max < m_pSamples[i])
- _max = m_pSamples[i];
- if (abs(m_pSamples[i]) > _peak)
- _peak = abs(m_pSamples[i]);
-#endif
-
- int Pos = m_iWindowBufPtr++ / TIME_SCALING;
-
- Accum += m_pSamples[i];
-
- if (Pos != LastPos) {
- m_pWindowBuf[LastPos] = Accum / TIME_SCALING;
- Accum = 0;
- }
-
- LastPos = Pos;
-
- if (Pos == m_iWidth) {
- m_iWindowBufPtr = 0;
- LastPos = 0;
- RenderBuffer();
- }
- }
-
-#ifdef _DEBUG
- _peak = _max - _min;
- m_iPeak = _peak;
- _peak = 0;
- _min = 0;
- _max = 0;
-#endif
-}
-
-void CVisualizerScope::Display(CDC *pDC, bool bPaintMsg)
-{
- StretchDIBits(pDC->m_hDC, 0, 0, m_iWidth, m_iHeight, 0, 0, m_iWidth, m_iHeight, m_pBlitBuffer, &m_bmi, DIB_RGB_COLORS, SRCCOPY);
-
-#ifdef _DEBUG
- CString PeakText;
- PeakText.Format(_T("%i"), m_iPeak);
- pDC->TextOut(0, 0, PeakText);
- PeakText.Format(_T("-%gdB"), 20.0 * log(double(m_iPeak) / 65535.0));
- pDC->TextOut(0, 16, PeakText);
-#endif
-}
+/*
+** FamiTracker - NES/Famicom sound tracker
+** Copyright (C) 2005-2014 Jonathan Liss
+**
+** 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
+** Library General Public License for more details. To obtain a
+** copy of the GNU Library General Public License, write to the Free
+** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** Any permitted reproduction of these routines, in whole or in part,
+** must bear this legend.
+*/
+
+#include "VisualizerScope.h"
+#include
+#include "FamiTracker.h"
+#include "Graphics.h"
+
+/*
+ * Displays a sample scope
+ *
+ */
+
+CVisualizerScope::CVisualizerScope(bool bBlur) :
+ m_pWindowBuf(NULL),
+ m_bBlur(bBlur),
+ m_iWindowBufPtr(0)
+{
+}
+
+CVisualizerScope::~CVisualizerScope()
+{
+ SAFE_RELEASE_ARRAY(m_pWindowBuf);
+}
+
+void CVisualizerScope::Create(int Width, int Height)
+{
+ CVisualizerBase::Create(Width, Height);
+
+ SAFE_RELEASE_ARRAY(m_pWindowBuf);
+ m_pWindowBuf = new short[Width];
+ m_iWindowBufPtr = 0;
+}
+
+void CVisualizerScope::SetSampleRate(int SampleRate)
+{
+}
+
+void CVisualizerScope::ClearBackground()
+{
+ for (int y = 0; y < m_iHeight; ++y) {
+ int intensity = sinf((float(y) * 3.14f) / float(m_iHeight)) * 40.0f; // // //
+ memset(&m_pBlitBuffer[y * m_iWidth], intensity, sizeof(COLORREF) * m_iWidth);
+ }
+}
+
+void CVisualizerScope::RenderBuffer()
+{
+ const float SAMPLE_SCALING = 1200.0f;
+
+ const COLORREF LINE_COL1 = 0xFFFFFF;
+ const COLORREF LINE_COL2 = 0x808080;
+
+ const int BLUR_COLORS[] = {3, 12, 12};
+
+ const float HALF_HEIGHT = float(m_iHeight) / 2.0f;
+
+ if (m_bBlur)
+ BlurBuffer(m_pBlitBuffer.get(), m_iWidth, m_iHeight, BLUR_COLORS);
+ else
+ ClearBackground();
+
+ float Sample = -float(m_pWindowBuf[0]) / SAMPLE_SCALING;
+
+ for (float x = 0.0f; x < float(m_iWidth); ++x) {
+ float LastSample = Sample;
+ Sample = -float(m_pWindowBuf[int(x)]) / SAMPLE_SCALING;
+
+ if (Sample < -HALF_HEIGHT + 1)
+ Sample = -HALF_HEIGHT + 1;
+ if (Sample > HALF_HEIGHT - 1)
+ Sample = HALF_HEIGHT - 1;
+
+ PutPixel(m_pBlitBuffer.get(), m_iWidth, m_iHeight, x, Sample + HALF_HEIGHT - 0.5f, LINE_COL2);
+ PutPixel(m_pBlitBuffer.get(), m_iWidth, m_iHeight, x, Sample + HALF_HEIGHT + 0.5f, LINE_COL2);
+ PutPixel(m_pBlitBuffer.get(), m_iWidth, m_iHeight, x, Sample + HALF_HEIGHT + 0.0f, LINE_COL1);
+
+ if ((Sample - LastSample) > 1.0f) {
+ float frac = LastSample - floor(LastSample);
+ for (float y = LastSample; y < Sample; ++y) {
+ float Offset = (y - LastSample) / (Sample - LastSample);
+ PutPixel(m_pBlitBuffer.get(), m_iWidth, m_iHeight, x + Offset - 1.0f, y + HALF_HEIGHT + frac, LINE_COL1);
+ }
+ }
+ else if ((LastSample - Sample) > 1.0f) {
+ float frac = Sample - floor(Sample);
+ for (float y = Sample; y < LastSample; ++y) {
+ float Offset = (y - Sample) / (LastSample - Sample);
+ PutPixel(m_pBlitBuffer.get(), m_iWidth, m_iHeight, x - Offset, y + HALF_HEIGHT + frac, LINE_COL1);
+ }
+ }
+ }
+}
+
+void CVisualizerScope::Draw()
+{
+#ifdef _DEBUG
+ static int _peak = 0;
+ static int _min = 0;
+ static int _max = 0;
+#endif
+
+ const int TIME_SCALING = 7;
+
+ static int LastPos = 0;
+ static int Accum = 0;
+
+ for (unsigned int i = 0; i < m_iSampleCount; ++i) {
+
+#ifdef _DEBUG
+ if (_min > m_pSamples[i])
+ _min = m_pSamples[i];
+ if (_max < m_pSamples[i])
+ _max = m_pSamples[i];
+ if (abs(m_pSamples[i]) > _peak)
+ _peak = abs(m_pSamples[i]);
+#endif
+
+ int Pos = m_iWindowBufPtr++ / TIME_SCALING;
+
+ Accum += m_pSamples[i];
+
+ if (Pos != LastPos) {
+ m_pWindowBuf[LastPos] = Accum / TIME_SCALING;
+ Accum = 0;
+ }
+
+ LastPos = Pos;
+
+ if (Pos == m_iWidth) {
+ m_iWindowBufPtr = 0;
+ LastPos = 0;
+ RenderBuffer();
+ }
+ }
+
+#ifdef _DEBUG
+ _peak = _max - _min;
+ m_iPeak = _peak;
+ _peak = 0;
+ _min = 0;
+ _max = 0;
+#endif
+}
+
+void CVisualizerScope::Display(CDC *pDC, bool bPaintMsg)
+{
+ CVisualizerBase::Display(pDC, bPaintMsg); // // //
+
+#ifdef _DEBUG
+ CString PeakText;
+ PeakText.Format(_T("%i"), m_iPeak);
+ pDC->TextOut(0, 0, PeakText);
+ PeakText.Format(_T("-%gdB"), 20.0 * log(double(m_iPeak) / 65535.0));
+ pDC->TextOut(0, 16, PeakText);
+#endif
+}
diff --git a/Source/VisualizerScope.h b/Source/VisualizerScope.h
index 21d4c0cf..a0260a84 100644
--- a/Source/VisualizerScope.h
+++ b/Source/VisualizerScope.h
@@ -18,8 +18,10 @@
** must bear this legend.
*/
+
#pragma once
+#include "VisualizerBase.h" // // //
// CVisualizerScope, scope style visualizer
@@ -29,21 +31,19 @@ class CVisualizerScope : public CVisualizerBase
CVisualizerScope(bool bBlur);
virtual ~CVisualizerScope();
- void Create(int Width, int Height);
- void SetSampleRate(int SampleRate);
- void Draw();
- void Display(CDC *pDC, bool bPaintMsg);
+ void Create(int Width, int Height) override;
+ void SetSampleRate(int SampleRate) override;
+ void Draw() override;
+ void Display(CDC *pDC, bool bPaintMsg) override;
private:
void RenderBuffer();
void ClearBackground();
private:
- COLORREF *m_pBlitBuffer;
-
- bool m_bBlur;
int m_iWindowBufPtr;
short *m_pWindowBuf;
+ bool m_bBlur;
#ifdef _DEBUG
int m_iPeak;
diff --git a/Source/VisualizerSpectrum.cpp b/Source/VisualizerSpectrum.cpp
index 6c569feb..ccca1809 100644
--- a/Source/VisualizerSpectrum.cpp
+++ b/Source/VisualizerSpectrum.cpp
@@ -20,7 +20,6 @@
#include "VisualizerSpectrum.h"
#include "FamiTracker.h"
-#include "VisualizerWnd.h"
#include "Graphics.h"
/*
@@ -29,24 +28,15 @@
*/
CVisualizerSpectrum::CVisualizerSpectrum(int Size) : // // //
- m_iBarSize(Size),
- m_pBlitBuffer(NULL)
+ m_iBarSize(Size)
{
}
-CVisualizerSpectrum::~CVisualizerSpectrum()
-{
- SAFE_RELEASE_ARRAY(m_pBlitBuffer);
-}
-
void CVisualizerSpectrum::Create(int Width, int Height)
{
CVisualizerBase::Create(Width, Height);
- SAFE_RELEASE_ARRAY(m_pBlitBuffer);
-
- m_pBlitBuffer = new COLORREF[Width * Height];
- memset(m_pBlitBuffer, BG_COLOR, Width * Height * sizeof(COLORREF));
+ std::fill(m_pBlitBuffer.get(), m_pBlitBuffer.get() + Width * Height, BG_COLOR); // // //
}
void CVisualizerSpectrum::SetSampleRate(int SampleRate)
@@ -61,7 +51,7 @@ void CVisualizerSpectrum::SetSampleRate(int SampleRate)
void CVisualizerSpectrum::Transform(short *pSamples, unsigned int Count)
{
- fft_buffer_.CopyIn(pSamples, FFT_POINTS);
+ fft_buffer_.CopyIn(pSamples, Count);
fft_buffer_.Transform();
}
@@ -69,10 +59,12 @@ void CVisualizerSpectrum::SetSampleData(short *pSamples, unsigned int iCount)
{
CVisualizerBase::SetSampleData(pSamples, iCount);
+ Transform(pSamples, iCount);
+ /*
int offset = 0;
if (m_iFillPos > 0) {
- const int size = FFT_POINTS - m_iFillPos;
+ const int size = std::min((int)iCount, FFT_POINTS - m_iFillPos);
std::copy_n(pSamples, size, m_pSampleBuffer.begin() + m_iFillPos);
Transform(m_pSampleBuffer.data(), FFT_POINTS);
offset += size;
@@ -88,6 +80,7 @@ void CVisualizerSpectrum::SetSampleData(short *pSamples, unsigned int iCount)
// Copy rest
std::copy_n(pSamples + offset, iCount, m_pSampleBuffer.begin());
m_iFillPos = iCount;
+ */
}
void CVisualizerSpectrum::Draw()
@@ -111,7 +104,7 @@ void CVisualizerSpectrum::Draw()
level /= steps;
// linear -> db
- level = (20 * logf(level / 4.0f)) * 0.8f;
+ level = (20 * std::log10(level));// *0.8f;
if (level < 0.0f)
level = 0.0f;
@@ -139,7 +132,7 @@ void CVisualizerSpectrum::Draw()
for (int x = 0; x < m_iBarSize; ++x) { // // //
if (m_iBarSize > 1 && x == m_iBarSize - 1)
Color = DIM(Color, 50);
- m_pBlitBuffer[(m_iHeight - y - 1) * m_iWidth + i * m_iBarSize + x + OFFSET] = y < level ? Color : BG_COLOR;
+ m_pBlitBuffer[(m_iHeight - 1 - y) * m_iWidth + i * m_iBarSize + x + OFFSET] = y < level ? Color : BG_COLOR;
}
}
@@ -147,9 +140,3 @@ void CVisualizerSpectrum::Draw()
Pos += Step;
}
}
-
-void CVisualizerSpectrum::Display(CDC *pDC, bool bPaintMsg)
-{
- StretchDIBits(pDC->m_hDC, 0, 0, m_iWidth, m_iHeight, 0, 0, m_iWidth, m_iHeight, m_pBlitBuffer, &m_bmi, DIB_RGB_COLORS, SRCCOPY);
-}
-
diff --git a/Source/VisualizerSpectrum.h b/Source/VisualizerSpectrum.h
index 17ed21c6..c22b0e92 100644
--- a/Source/VisualizerSpectrum.h
+++ b/Source/VisualizerSpectrum.h
@@ -24,23 +24,21 @@
#include "stdafx.h"
#include "FFT/FftBuffer.h" // // //
#include
-#include "VisualizerWnd.h" // // //
+#include "VisualizerBase.h" // // //
// CVisualizerSpectrum, spectrum style visualizer
-const int FFT_POINTS = 256;
+const int FFT_POINTS = 1024;
class CVisualizerSpectrum : public CVisualizerBase
{
public:
CVisualizerSpectrum(int Size); // // //
- virtual ~CVisualizerSpectrum();
- void Create(int Width, int Height);
- void SetSampleRate(int SampleRate);
- void SetSampleData(short *iSamples, unsigned int iCount);
- void Draw();
- void Display(CDC *pDC, bool bPaintMsg);
+ void Create(int Width, int Height) override;
+ void SetSampleRate(int SampleRate) override;
+ void SetSampleData(short *iSamples, unsigned int iCount) override;
+ void Draw() override;
protected:
void Transform(short *pSamples, unsigned int Count);
@@ -49,7 +47,6 @@ class CVisualizerSpectrum : public CVisualizerBase
static const COLORREF BG_COLOR = 0;
const int m_iBarSize;
- COLORREF *m_pBlitBuffer;
FftBuffer fft_buffer_; // // //
int m_iFillPos;
diff --git a/Source/VisualizerStatic.cpp b/Source/VisualizerStatic.cpp
index 1c3b2f98..56558da2 100644
--- a/Source/VisualizerStatic.cpp
+++ b/Source/VisualizerStatic.cpp
@@ -18,13 +18,10 @@
** must bear this legend.
*/
-#include "stdafx.h"
-#include // // //
-#include "VisualizerWnd.h"
#include "VisualizerStatic.h"
+#include // // //
#include "FamiTracker.h" // // //
#include "Settings.h" // // //
-#include "resource.h"
static const char LOGO_FONT[][7] = { // // //
{0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C}, // 0
@@ -40,24 +37,10 @@ static const char LOGO_FONT[][7] = { // // //
{0x7E, 0x60, 0x60, 0x78, 0x60, 0x60, 0x7E}, // E
};
-CVisualizerStatic::CVisualizerStatic() :
- m_pBlitBuffer(nullptr)
-{
-}
-
CVisualizerStatic::~CVisualizerStatic()
{
- SAFE_RELEASE_ARRAY(m_pBlitBuffer); // // //
- if (m_dcImage.m_hDC != NULL) {
+ if (m_dcImage.m_hDC)
m_dcImage.SelectObject(m_pOldBmp);
- }
-}
-
-void CVisualizerStatic::Create(int Width, int Height)
-{
- CVisualizerBase::Create(Width, Height);
-
- m_pBlitBuffer = new COLORREF[Width * (Height + 1)](); // // //
}
void CVisualizerStatic::SetSampleRate(int SampleRate)
@@ -66,8 +49,8 @@ void CVisualizerStatic::SetSampleRate(int SampleRate)
void CVisualizerStatic::Draw()
{
- static const char *STR = "0CC-FamiTracker"; // // //
- static const size_t COUNT = strlen(STR);
+ static const char STR[] = "0CC-FamiTracker"; // // //
+ static const size_t COUNT = std::size(STR);
static long long t = 0;
const auto FixRGB = [] (int x) { return RGB(GetBValue(x), GetGValue(x), GetRValue(x)); };
@@ -107,37 +90,33 @@ void CVisualizerStatic::Draw()
void CVisualizerStatic::DrawChar(char n, int xPos, int yPos, const COLORREF &Color) // // //
{
- int Index = 0;
- switch (n) {
- case '0': break;
- case 'C': case 'c': Index = 1; break;
- case '-': Index = 2; break;
- case 'F': case 'f': Index = 3; break;
- case 'A': case 'a': Index = 4; break;
- case 'M': case 'm': Index = 5; break;
- case 'I': case 'i': Index = 6; break;
- case 'T': case 't': Index = 7; break;
- case 'R': case 'r': Index = 8; break;
- case 'K': case 'k': Index = 9; break;
- case 'E': case 'e': Index = 10; break;
- default: return;
- }
- for (int i = 0; i < 7; ++i) {
- if (yPos >= 0 && yPos < m_iHeight) {
- int x = xPos;
- char Row = LOGO_FONT[Index][i];
- for (int j = 0; j < 8; ++j) {
- if (x >= 0 && x < m_iWidth && Row < 0)
- m_pBlitBuffer[yPos * m_iWidth + x] = Color;
- Row <<= 1;
- ++x;
+ const auto drawFunc = [&] (const char (&glyph)[7]) {
+ for (int i = 0; i < 7; ++i) {
+ if (yPos >= 0 && yPos < m_iHeight) {
+ int x = xPos;
+ char Row = glyph[i];
+ for (int j = 0; j < 8; ++j) {
+ if (x >= 0 && x < m_iWidth && Row < 0)
+ m_pBlitBuffer[yPos * m_iWidth + x] = Color;
+ Row <<= 1;
+ ++x;
+ }
}
+ ++yPos;
}
- ++yPos;
- }
-}
+ };
-void CVisualizerStatic::Display(CDC *pDC, bool bPaintMsg)
-{
- StretchDIBits(pDC->m_hDC, 0, 0, m_iWidth, m_iHeight, 0, 0, m_iWidth, m_iHeight, m_pBlitBuffer, &m_bmi, DIB_RGB_COLORS, SRCCOPY);
+ switch (n) {
+ case '0': return drawFunc(LOGO_FONT[0]);
+ case 'C': case 'c': return drawFunc(LOGO_FONT[1]);
+ case '-': return drawFunc(LOGO_FONT[2]);
+ case 'F': case 'f': return drawFunc(LOGO_FONT[3]);
+ case 'A': case 'a': return drawFunc(LOGO_FONT[4]);
+ case 'M': case 'm': return drawFunc(LOGO_FONT[5]);
+ case 'I': case 'i': return drawFunc(LOGO_FONT[6]);
+ case 'T': case 't': return drawFunc(LOGO_FONT[7]);
+ case 'R': case 'r': return drawFunc(LOGO_FONT[8]);
+ case 'K': case 'k': return drawFunc(LOGO_FONT[9]);
+ case 'E': case 'e': return drawFunc(LOGO_FONT[10]);
+ }
}
diff --git a/Source/VisualizerStatic.h b/Source/VisualizerStatic.h
index c1060e83..2ef1f45b 100644
--- a/Source/VisualizerStatic.h
+++ b/Source/VisualizerStatic.h
@@ -18,27 +18,26 @@
** must bear this legend.
*/
+
#pragma once
+#include "VisualizerBase.h" // // //
// CVisualizerStatic, static picture visualizer
class CVisualizerStatic : public CVisualizerBase
{
public:
- CVisualizerStatic();
- virtual ~CVisualizerStatic();
+ CVisualizerStatic() = default;
+ ~CVisualizerStatic();
- void Create(int Width, int Height);
- void SetSampleRate(int SampleRate);
- void Draw();
- void DrawChar(char n, int xPos, int yPos, const COLORREF &Color); // // //
- void Display(CDC *pDC, bool bPaintMsg);
+ void SetSampleRate(int SampleRate) override;
+ void Draw() override;
private:
- COLORREF *m_pBlitBuffer; // // //
+ void DrawChar(char n, int xPos, int yPos, const COLORREF &Color); // // //
CBitmap m_bmpImage;
- CBitmap *m_pOldBmp;
+ CBitmap *m_pOldBmp = nullptr;
CDC m_dcImage;
};
diff --git a/Source/VisualizerWnd.cpp b/Source/VisualizerWnd.cpp
index 43d107a7..bb1b1a38 100644
--- a/Source/VisualizerWnd.cpp
+++ b/Source/VisualizerWnd.cpp
@@ -18,43 +18,12 @@
** must bear this legend.
*/
-#include "stdafx.h"
-#include "FamiTracker.h"
#include "VisualizerWnd.h"
+#include "FamiTracker.h"
#include "Settings.h"
#include "VisualizerScope.h"
#include "VisualizerSpectrum.h"
#include "VisualizerStatic.h"
-#include "resource.h"
-
-/*
- * Class CVisualizerBase
- *
- */
-
-void CVisualizerBase::Create(int Width, int Height)
-{
- memset(&m_bmi, 0, sizeof(BITMAPINFO));
- m_bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- m_bmi.bmiHeader.biBitCount = 32;
- m_bmi.bmiHeader.biHeight = -Height;
- m_bmi.bmiHeader.biWidth = Width;
- m_bmi.bmiHeader.biPlanes = 1;
-
- m_iWidth = Width;
- m_iHeight = Height;
-}
-
-void CVisualizerBase::SetSampleData(short *pSamples, unsigned int iCount)
-{
- m_pSamples = pSamples;
- m_iSampleCount = iCount;
-}
-
-/*
- * Class CVisualizerWnd
- *
- */
// Thread entry helper
@@ -126,11 +95,9 @@ void CVisualizerWnd::NextState()
void CVisualizerWnd::SetSampleRate(int SampleRate)
{
- for (int i = 0; i < STATE_COUNT; ++i) { // // //
- if (m_pStates[i] != NULL) {
- m_pStates[i]->SetSampleRate(SampleRate);
- }
- }
+ for (auto &state : m_pStates) // // //
+ if (state)
+ state->SetSampleRate(SampleRate);
}
void CVisualizerWnd::FlushSamples(short *pSamples, int Count)
diff --git a/Source/VisualizerWnd.h b/Source/VisualizerWnd.h
index 0c07c91f..3307ad59 100644
--- a/Source/VisualizerWnd.h
+++ b/Source/VisualizerWnd.h
@@ -18,38 +18,15 @@
** must bear this legend.
*/
-#pragma once
+#pragma once
// Visualizer classes
+#include "stdafx.h" // // //
#include // Synchronization objects
-class CVisualizerBase
-{
-public:
- CVisualizerBase() : m_iWidth(0), m_iHeight(0), m_iSampleCount(0), m_pSamples(NULL) {}
- virtual ~CVisualizerBase() {}
-
- // Create the visualizer
- virtual void Create(int Width, int Height);
- // Set rate of samples
- virtual void SetSampleRate(int SampleRate) = 0;
- // Set new sample data
- virtual void SetSampleData(short *iSamples, unsigned int iCount);
- // Render an image from the sample data
- virtual void Draw() = 0;
- // Display the image
- virtual void Display(CDC *pDC, bool bPaintMsg) = 0;
-
-protected:
- BITMAPINFO m_bmi;
- int m_iWidth;
- int m_iHeight;
-
- unsigned int m_iSampleCount;
- short *m_pSamples;
-};
+class CVisualizerBase; // // //
// CVisualizerWnd