From 8af26ab1b167df91abe5cf7cd8a0b2632a94c921 Mon Sep 17 00:00:00 2001 From: nyanpasu64 Date: Thu, 22 Mar 2018 01:58:47 -0700 Subject: [PATCH 1/2] minimal hires fft --- Source/VisualizerSpectrum.cpp | 2 +- Source/VisualizerSpectrum.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/VisualizerSpectrum.cpp b/Source/VisualizerSpectrum.cpp index 6c569feb..3754c99a 100644 --- a/Source/VisualizerSpectrum.cpp +++ b/Source/VisualizerSpectrum.cpp @@ -72,7 +72,7 @@ void CVisualizerSpectrum::SetSampleData(short *pSamples, unsigned int 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; diff --git a/Source/VisualizerSpectrum.h b/Source/VisualizerSpectrum.h index 17ed21c6..491f2755 100644 --- a/Source/VisualizerSpectrum.h +++ b/Source/VisualizerSpectrum.h @@ -28,7 +28,7 @@ // CVisualizerSpectrum, spectrum style visualizer -const int FFT_POINTS = 256; +const int FFT_POINTS = 1024; class CVisualizerSpectrum : public CVisualizerBase { From 2f176ba49974b1d0e4802e8db4941eb78201fe8a Mon Sep 17 00:00:00 2001 From: HertzDevil Date: Wed, 15 Nov 2017 21:02:38 +0800 Subject: [PATCH 2/2] tidying up # Conflicts: # 0CC-FamiTracker.vcxproj.filters # Source/VisualizerScope.cpp --- 0CC-FamiTracker.vcxproj | 3 +- 0CC-FamiTracker.vcxproj.filters | 2846 +++++++++++++++---------------- Source/FFT/Complex.h | 45 - Source/FFT/FftBuffer.h | 12 +- Source/VisualizerBase.cpp | 50 + Source/VisualizerBase.h | 53 + Source/VisualizerScope.cpp | 356 ++-- Source/VisualizerScope.h | 14 +- Source/VisualizerSpectrum.cpp | 29 +- Source/VisualizerSpectrum.h | 13 +- Source/VisualizerStatic.cpp | 81 +- Source/VisualizerStatic.h | 17 +- Source/VisualizerWnd.cpp | 41 +- Source/VisualizerWnd.h | 29 +- 14 files changed, 1776 insertions(+), 1813 deletions(-) delete mode 100644 Source/FFT/Complex.h create mode 100644 Source/VisualizerBase.cpp create mode 100644 Source/VisualizerBase.h 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 3754c99a..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,6 +59,8 @@ void CVisualizerSpectrum::SetSampleData(short *pSamples, unsigned int iCount) { CVisualizerBase::SetSampleData(pSamples, iCount); + Transform(pSamples, iCount); + /* int offset = 0; if (m_iFillPos > 0) { @@ -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 491f2755..c22b0e92 100644 --- a/Source/VisualizerSpectrum.h +++ b/Source/VisualizerSpectrum.h @@ -24,7 +24,7 @@ #include "stdafx.h" #include "FFT/FftBuffer.h" // // // #include -#include "VisualizerWnd.h" // // // +#include "VisualizerBase.h" // // // // CVisualizerSpectrum, spectrum style visualizer @@ -34,13 +34,11 @@ 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