- Tune the Windows 8-10 WASAPI memory leak workaround to make it working for longer time.
- Native ARM64 build (with statically linked runtime hence the bigger binary).
Download: soundkeeper.7z (76KB). Project page →
Download: soundkeeper.7z (76KB). Project page →
Manual resource management in low level C-style C++ code might be annoying. It's not practical to create good enough RAII wrappers for every single C API you use, but approaches with goto cleanup or loads of nested if (success) hurt readability.
A Go-inspired defer macro to the rescue! The usage is as simple as that:
void* p = malloc(0x1000); defer [&] { free(p); };
The deferred lambda will be executed on scope exit, no matter how it happens: you can return from any point, throw an exception (if allowed), or even use a goto to an outer scope.
Macro implementation is concise and relies on basic features of C++17 (Clang 5+, GCC 7+, MSVC 2017+):
#ifndef defer template <typename T> struct Deferrer { T f; Deferrer(T f) : f(f) { }; Deferrer(const Deferrer&) = delete; ~Deferrer() { f(); } }; #define TOKEN_CONCAT_NX(a, b) a ## b #define TOKEN_CONCAT(a, b) TOKEN_CONCAT_NX(a, b) #define defer Deferrer TOKEN_CONCAT(__deferred, __COUNTER__) = #endif
It is truly zero-cost and doesn't rely on C runtime or standard library, so it can be used even in kernel development.
A Famicom/NES/Dendy demo based on the notorious 9999-in-1 pirate multicart with Unchained Melody in its menu.
In 2023, I was preparing an anniversary update: 10 years since the first version of the demo, 30 years since the first multicarts with Unchained Melody and the Dendy itself, and 40 years of the original Famicom. But I got distracted by something at the end of the year, so it remained unreleased. I'm releasing it now retroactively in the state the project was in November 2023.
Download: unchained_nostalgia.zip (20KB). Project page →
I started to learn Finnish a few months ago. There is a great intro-level Finnish course on Duolingo that is quite entertaining and lets you try the taste of Finnish before you'll be ready to make a deep dive into the language. But it provides just exercises and doesn't explain anything, you are supposed to guess what is right just based on provided examples. It mostly works, but sometimes you are left with an open question "why?" without a chance to get an explanation.
The truth is, originally the course had proper lessons with explanations of basic grammar mixed with some jokes about Finnish culture. The lessons were removed in 2022 for some mysterious reason, and just exercises are left since then. Duolingo fans from the duome.eu preserved all these materials on a single page. I didn't like that the page doesn't allow to track progress of learning, so I made my own pirated version with blackjack and bells and whistles.
It's mobile-friendly and can be added to the home screen as an app. You can mark chapters that you already learned, and they will become green. Overall progress is displayed in the Table of Contents on the top of the page. You can quickly scroll to your current chapter by using the "triangle down" button. Each chapter mentions section and unit where you can find related exercises on Duolingo today. Each unit on Duolingo corresponds to a chapter in the guidebook, and they go in the same order, so it's convenient to read the guidebook and do the exercises in parallel. Just bookmark the guidebook page and visit it whenever you move to a next unit on Duolingo to read the next portion of grammar. No more guessing what the green owl wants from you!
Learning any new language is always a long road and it's important to find something that would help you to keep up for a few years. Tracking progress of learning might help with keeping motivated. Sometimes you might not feel your progress (that is quite subjective and can be discouraging), but tracking your daily progress does the trick and makes it visible so you can actually see it. This is why I also track how much time I spent on learning Finnish. Each lesson makes me closer to my target of 1600 hours.
Keep in mind that Duolingo alone is not enough. It's a great intro into the language, but you'll eventually need to take quite a few more courses if your goal is actually to start speaking. The Duolingo course is just roughly first 100 hours of this journey.
Download: soundkeeper.7z (23KB). Project page →
Download: soundkeeper.7z (23KB). Project page →
When a program streams any audio (even silence), the system don't go into sleep mode automatically. Sometimes it is not desired (e.g. if you use Sound Keeper). You can try to use the powercfg to allow Windows go into sleep mode even when audio is streamed.
Download: soundkeeper.7z (17KB). Project page →
Download: hostscmd.zip (21KB). Project page →
Download: soundkeeper.7z (15KB). Project page →
Download: soundkeeper.zip (19KB). Project page →
Powerful command line hosts editor with support of batch operations, IDN and IPv6. Another piece of my software from 2013 has a minor update. It was rebuilt for .NET 4.0 instead of .NET 3.5, just because at this moment .NET 4 is the preinstalled on modern Windows (8 and 10), and standalone installer of the .NET 4 is a few times smaller than standalone installer of the .NET 3.5 (48MB vs. 232MB).
Download: hostscmd.zip (21KB). Project page →
This tiny utility allows you to run elevated commands from Windows Command Prompt. Unlike runas
command, where you should enter your password, su
just shows UAC dialog instead, and it is much more convenient. Another feature is that it preserves current directory.
Actually, it was written in 2013. Previous version 1.2.0 was published on my other website. Today I rebuilt it with support of 64-bit systems, and publish it here as version 1.2.1.
Download: sucmd.zip (7KB). Project page →
I have a directory with old images which I collected in the noughties. I move it with all my other files from one computer to another on every upgrade. Every now and then, when I feel a bit nostalgic, I open it and look through the pictures. There are a few GIF files with animation, and every time I notice that the default image viewer from Windows 7 does not support it. I remembered, that the image viewer from Windows XP was able to play GIF animation properly. So, I spent a bit of time to overcome a few obstacles and to run the old image viewer on modern Windows, a small launcher was created for this purpose. Now I can watch these old images in authentic interface of the old image viewer from Windows XP.
Download: shimgvw_xp32.7z (includes a binary and source code of the launcher, and the shimgvw.dll from English Windows XP SP3).
An updated version of the NES demo based on the pirate multicart with a romantic storyline and the Unchained Melody in the menu.
Download: unchained_nostalgia.zip (20KB). Project page →
Download: soundkeeper.zip (19KB). Project page →
This month I updated all my Firefox extensions. So, if you a Firefox user, maybe you will find some of them useful.
Advanced Locationbar
Linkifies URL segments in your Location bar. Fork of Locationbar² with bugfixes. Includes support of Internationalized Domain Names and separate linkification of domain and subdomain.
Omnibar Lite
Adds default search engine icon to the location bar with an ability to change it quickly. Original Omnibar doesn't work in Firefox 49+. Onmibar Lite supports Firefox 50+. It utilizes built-in Firefox search. Don't forget to remove original Omnibar!
Pure URL
This add-on automatically removes all garbage like "utm_source=*" from URLs. These fields are provided for the Google Analytics and they are not a necessity.
System Menu Ex
Extends system menu of the main window. Adds an ability to create a new window (private or general), open the About window and restart the browser. Don't forget to enable the title bar! The menu can be opened using left click on the application icon.
Projects like the Need For Seed III Modern Patch require enormous amount of time for developing and support. It is not possible to do such things spending only an hour or two in the evenings. It requires days and weeks of hard work without huge gaps, 8-10 hours per day. Please donate if you like my projects and would like to get some new updates. It is the best motivator to continue working on them.
NES demo based on the pirate multicart with a romantic storyline and the Unchained Melody in the menu.
Download: unchained_nostalgia.zip (20KB). Project page →
I have published initial version of the NFS4 Modern Patch. Currently, it has a small amount of fixes. Unfortunately, I had spent more than 150 days during last year on developing of the NFS3 Modern Patch, it is too much, and now I can't afford to spend enough time for porting main useful changes to the NFS4. I recommend you to try the NFS3 Modern Patch to understand how big and useful this NFS4 version of the patch could be.
This kind of work needs much time. It is not possible to do such things spending only an hour or two in the evenings. It requires days and weeks of hard work without huge gaps, 8-10 hours per day. I had started NFS3 Modern Patch a year ago, and little by little this project absorbed all my time and had taken the place of my paid work (freelance). Now I can't continue in the same spirit because I'm almost out of money. It's time to choose what I will do next.
The first release of my patch for the Need For Speed 4: High Stakes. It is a side project of the Need For Speed III Modern Patch. Currently, it has a small amount of fixes. The key features of this patch are portability (no more registry!) and high poly cars support (it is useful for modding). There is still no widescreen resolutions support.
Download: nfs4_modern_patch.7z (1.2MB). Project page →
Download: nfs3_modern_patch.7z (1.5MB). Project page →
A software MIDI synthesizer for Windows, which functions as a VSTi plugin. Supports both the Yamaha XG and the Roland GS extensions, which is a unique feature of the S-YXG50. The VSTi was a part of the Yamaha SOL2 package. Yamaha discontinued support of this software synthesizer in 2003. As it is abandonware now, a portable version of the VSTi was created (installation and registry keys are not required). It uses embedded (into DLL resources) official 4MB wavetable files, which is the best version of wavetable files for the S-YXG50.
Download: yamaha_syxg50_vsti.7z (3.0MB). Project page →
Yamaha S-YXG50 was released in 1997. First versions were shipped with the simplified 2MB version of the wavetable, and the full 4MB version was published only in 2001. It seems that the cause of this is low amount of RAM in the computers of 90s. Both versions of the wavetable files were created in 1996 (4MB in February, simplified 2MB in July). Possibly, the full 4MB version is a dump of the WAVE ROM of the Yamaha MU80 / MU50 / QS300 / DB50XG / DB60XG / SW60XG / MU10, because the Yamaha S-YXG50 soft synthesizer is very similar to this series of hardware of 1994-1996.
Download: nfs3_modern_patch.7z (1.5MB). Project page →