Wednesday, March 5, 2025

Introduction to WorldWeaver

A New Iteration 
I've been working on the second manifestation of my Interactive Fiction engine - WorldWeaver - for about a year now. I originally built it in Java. Since I'm able to code on C# (.NET Core) on Linux, I decided to start from scratch.

I learned a lot in my first iteration of the project, so I knew some of the gotchas that I would be facing in this version. Order of game element operations was a big challenge in the Java version so for this one I wanted a lot of that logic to be configurable. As this project has grown I've also learned a lot about better ways to define games as well.

The Sample Game
So far the biggest tool I've come up with is the Sample Game. It actually serves as sort of unit tests. So I'm no longer trying to build an actual game for testing. Now I can just create rooms in the Sample Game each one tests a different feature that the engine handles. This has made coding and debugging so much easier. This game will ship with the game engine when it's actually ready to go live.

Admin Documentation 
Another major change is how I'm handling the documentation for game authors. I'm using Tiddlywiki for it (I'm pretty obsessed with TW). I may also create some documentation for people who may want to actually work on the engine's code itself. There certainly is plenty of room for improvement. I should have probably harnessed the power of Interfaces etc, and may look into where they might improve the code's readability and future maintenance. Building games and initially playing them (Just the first time they are played) I need to do some optimization.

I'll likely do a bunch of followup articles on this engine, going over some of its details and discussing its code base.

The Future
I'm probably going to embark on a third iteration of it. I want to try building it in C++. This will mainly be a learning project. I've built one application in C++ but want to learn it far better than what I know currently. I would also like to look into porting it to mobile OSs. That would open it up to a much larger potential player base.

Here is the GIT repo:

Sunday, December 1, 2024

From Shotcut to Kdenlive

So I've been using Shotcut for a while now, for my YouTube videos... and music videos. I love the application. Slicing clips, doing fades and transitions are very fast and easy. That's the big thing for me. I do a LOT of slices in each video I do. If these tasks are cumbersome then video editing quickly becomes painful and unpleasant.

A bit ago I started using Xdotool to make slicing even quicker and easier. But in Shotcut I had to do pauses between each action in Xdotool, the app couldn't keep up. Some actions required more than one second's pause. This got me wanting to try out other editors to see if maybe there was a better option for me.

I really wanted to use Davinci Resolve but I THINK it doesn't like my hardware. I tried so many installation methods. The best ones I saw were the Distrobox options like Davincibox. Those seemed to get me the closest. But never all the way. I actually got it to run once, but it still didn't like my audio card or configuration. And I would prefer an open source editor, but I wanted to see what the editor of choice was like.

Reluctantly I gave up on DR. I ended up seeing a suggested video on YouTube about Kdenlive. I had actually tried that app way back when I knew absolutely nothing about video editing. I didn't know about proxy clips so everything was laggy. I believe the UI was kind of clunky back in those days. So I've never given Kdenlive any serious consideration. However after seeing this recent video on it I decided to give it another try.

It's really good

My first day using it, I had my xdotool script updated, and I no longer needed the pauses, the app was able to keep up. And one day later I was editing at nearly the same pace as Shotcut. It doesn't have preset zoom in's/out's etc. BUT it's key framing interface is so easy to use I actually don't miss the preset fx and tramsitions. I can manually set keyframes just as quick and easily.

There are some other incredibly useful tools in Kdenlive that Shortcut doesn't have. In future articles I'll discuss these, going into detail. So far I'm really loving nearly everything about Kdenlive, the gripes that I have are pretty minor, and I may be able to overcome them using xdotool, we'll see.

Wednesday, December 2, 2020

5 VST Effects I Use in Every Song

VSTs are so great. I have a massive collection of free instruments and FX that I've tracked down. There are SOO many to choose from...

But I notice it every time I'm working on a new song. I always use the same VST FX. At times I use others as well, but these five FX are used in, literally, every song I make. Here they are and why I use them so much.

Classic Compressor / Chorus
I've grouped these together, so I could get an extra VST in this list :) . Every drum sample I use gets the Classic Compressor - usually the default preset. It adds punch and just really brings the drums to life. Some of my synths get this treatment also.
The Classic Chorus gets significantly les use - but for any sound I want to be 'three dimensional' the default preset on this FX is perfect.

EasyQ
Nearly every single track in every single song I do gets the EasyQ. My only criticism is you can't automate the nodes you create. This may be a limitation in the VST guts since they are dynamically added/removed. But still. I just love this EQ. It is lightweight, I have other parametric EQs that are such resource hogs they are nearly unusable.
Now that I'm writing this, I'm thinking it may be time to see what else is out there, it has been a while since I've tried out EQs.

ReaComp
The ReaComp compressor is shipped with Reaper and it handles sidechain compression. So that is what I use it for. There is typically a need for at least one instance of this in every song. I really should explore what the plugin is really capable of but so far it's just a sidechainer for me.


TriDirt
This little beast is amazing. It is 1/2 three band distortion pedal, 1/2 two band filter. And it sounds sick! The filter on it is one of my favorites and sounds really good when you automate it. Some of the filthiest neuro-bass I've ever made utilized automated TriDirt filtering. Each band can be set to one of - I believe 5 - types of distortion and the overall output is filtered by a treble and bass value.

Classic Delay
Like the other Classic FX the delay is just so solid. I've used other delay FX that are great. One of them does super analogue style feedback (If you set it to high it begins squealing, just like a meatspace delay pedal). but just like coffee when I've tried to switch to tea, I always come back to the Classic FX.

Wednesday, November 25, 2020

I'm All In

Well it turns out I love video recording and editing. Having never seriously thought about trying it, I never knew. I love hearing about the artistry and super subtle nuances of editing video. I watch not only YouTube editing tips (My chosen medium) but actual movie editing insights and advice.

I've been circling between making music then making videos for the music then producing videos for my new watch nerd channel. The music videos are still patchworked clips of movies and other YouTube videos but they are a great learning arena.

I then apply what I learn there to my watch nerd videos. Although my videos are just vlog style, I want to find ways of telling stories or evoking emotions, thoughts, excitement simply by way of how I've edited my clips.

I need to improve my filming skills as well. I think part of that is equipment due to the dark setting I film in. My Pixel seems to take grainy footage in such scenarios.

I'm already feeling more comfortable in front of the camera, and getting more proficient in Blender's video editor.

We'll see how it goes.

Thursday, November 5, 2020

Strobe Hack

I am definitely still a Blender video editing noob. I am working on another video clip collage for the latest Neutrient song I've made. To give the video energy and movement I wanted to add a strobe effect. In Blender's video editor the Transform blocks have a strobe option along with a setting to get it to fire every X frame. So I gave this option a try.

No matter what settings I used it appeared to have no affect at all. When I tried hitting the internet I didn't see any conversations on this feature. I decided to think of a hacky way I could pull it off using the tricks I've learned so far.

I do a lot of layering in my videos. Adding one clip on top of the other and setting the top one's alpha over to < 1. So I hopped on YouTube and found a video that was just black flashing to white and back. Just the strobe I needed.

I dropped that clip over some of my other clips and turned down its alpha. Perfect. I now have a cool strobe effect I can add wherever I want.

Tuesday, November 3, 2020

FPS Mismatch Pain

I am dipping my toes into video production. I began with some collage-style music videos now I am starting a YouTube channel about wrist watch nerdery. One pain has become immediately apparent is the trouble of frame rate. I made the mistake of adding audio as the first component to my video, so the frame rate wasn't set to my video's FPS. To my surprise the audio was out of sync with the video. I had never encountered this, my collage videos all used an audio track and video only clips.

I tried going into VLC and saving each clip's audio as a separate file, then importing it into Blender but I wasn't aware of exactly what was going on. It was still out of sync.

I next tried manually getting the FPS to match my video but then it refused to render (I later found some other settings I could have tried that may have helped).

My projects were still set to 30FPS so I had to keep all my clips short so that the mismatch was unnoticeable. I then learned how to set my phone camera to 60FPS and figured while I'm struggling with this, I may as well get a higher frame rate.

Bad Idea.

The only camera on my phone that is capable of 60FPS is the back camera. The front camera is still 30FPS. So I ended up with some clips at 60FPS and some at 30FPS. So I went through every 60FPS clip and converted it to 30FPS using FFMPEG.

Tonight I'll be starting a new video. I'm hoping it goes smoothly. By dragging my clip into the timeline first thing I believe the project will automatically set the the FPS.

After working on the video tonight, it did indeed set a custom FPS, however there is still a little bit of drift. This will be a problem when I get better and can create longer takes but for now it works well enough.

Thursday, September 3, 2020

CI/CD'ing Music

I've changed how I use Soundcloud lately. It used to be that I would work on a song, listen to it on various sound systems, do the 'car check' an so on. Then I would go back and make corrections and re-check. After many such iterations I would post it to Soundcloud and consider it done. A finished sculpture, never to be altered again.

Lately, however, I have been doing my usual iterations and posting to Soundcloud, with one major difference. I no longer view the song as a form chiseled into stone, rather it is like a software application to me. I continue to listen to it after I've posted it. If I hear something that needs improved (A 'bug' in the song), I make the tweak and replace the song on Soundcloud.

I like it. I just listened to an older song and heard all kinds of improvements I need to make. In the past I would just grumble and never listen to it again. But now, it's time to fix the bug and push out another iteration of the song.

Thursday, August 20, 2020

How We've Given Up On Tomorrow

Whenever I fly, or see public transportation, Or traffic in general, the same question inevitably comes to mind.

Why have we given up on the future?

There was a time when we looked to the future with excitement and imagination. We envisioned a world full of endless possibilities. Then we just kind of gave up. I'm not talking about flying cars or cities in giant glass domes I'm talking about everyday things. Take flying. We pile into an airplane, seats packed so tightly everyone in your row has to get up if you need to leave your seat. And if you have to use the bathroom while the food cart is working its way down the walkway, too bad (And you're not allowed to use the restroom in first class).

Why have we decided that this is what air travel is, and will be forever? Where did innovation go? Yeah sure - costs. But still. What constitutes improvement in air travel? Plugins for your laptop or phone? Rentable notepads to play movies on? How about we find a way to have more room? How about we are allowed to move about, and have like minibars etc. Why is that only for private jets? Wouldn't it be worth some extra money to be able to hang out, more like a cruise ship than a crappy city bus? Surely there's some way to make such a thing accessible. We used to think outside the box. We used to be excited for the future. Now we're just cynical and complacent.

We need to find optimism again. Fun needs to be reborn. What's wrong with doing something just because it's fun and makes tasks like air travel actually enjoyable? Why can't art or books or movies exist simply to inspire and entertain? Why does there have to be some hidden agenda or politics?

We need some Neo-Futurism to make its way into meatspace!

Wednesday, July 8, 2020

A Great and Lacking Java-based File Manager

For a long time my go-to file manager has been Double Commander. It is quick and powerful and I can configure it super minimal - even hiding the tabs. The search feature works so much better than the native Windows search tool, so when I'm on a 'dohs' box it is especially handy (Although lately I've been using grep within the GIT bash).

Every now and then I get bored and change it up. I've explored VIFM and other console-based file managers. They are cool and a lot of fun but I usually end up missing Double Commander's features.

I have recently returned to muCommander. Now that I've spent a lot of time working in Java it's cool to use a Java-based file manager. And I've grabbed the source code. I may see if I can get it to always hide the tab bar. I've returned to it purely for fun. Sadly it is lacking one major feature... searching. Yes the latest version has a file search dialog you can pull up, but it's more of a placeholder than an actual tool. I navigated to a temp directory and searched for 'category' which I knew was in an XML file in that directory. 0 results. Even the Windows search tool would have found that. I tried case insensitive (Even though the case was the same) and I tried the Regex option. Nothing - in fact it wouldn't even search with the Regex set. And when you launch the dialog the options are always set to their defaults, not what you set them to last - huuge headache. And shouldn't the search results show in a new tab versus commandeering your current tab? It is just unusable. I feel like searching should have been a goal early on in the project. How useful is a file manager if you can't search your files?

Also lacking... you can't create a new file (I couldn't figure out how at least). So to do so you have to pull up a different file manager - or text editor. If you have to leave a file manager to create... a file, you've failed.

If I have to rely on other file managers to do basic things then the file manager in question isn't a viable option.

I do like muCommander and would love to use it as my primary tool for dealing with files, but sadly after all these years it is still not ready to do basic file-related tasks. I'm going to poke around in the code and see if I can somehow make it usable enough for me.

I'm sure I'll have more to say about muCommander in the near future. Maybe I'll do like I did with Jreepad and create a 'murdered out' version.

Wednesday, July 1, 2020

Clipboard Project

I've been coding in Java (Late at night) for a few years now. Most of my projects are console applications or arcade-style video games. Being hobby efforts, they usually require very little intense research. If it makes my head hurt, I do something else. It is my free time after all.

As a consequence I haven't done much with Swing and GUI development. Nor have I done much with the clipboard. But now I have reason. I am unable to use my all-time favorite clipboard manager so I need to write one. I am amazed at how easy it has been so far. True, I've done an obscene amount of web searching, and there is some funk in Java I've uncovered.

The benefit is I get to add even more VIM nerdiness to my project than CopyQ has. Also I've coded it to store everything encrypted. I have it minimizing to the tray and clips can be edited or deleted.

Still to do...

- Add a global hot key to display the window.

- Add 'permanent' bookmarks that can be arranged into categories or similar.

- Debug why it randomly doesn't load the stored clips when launching the application.

- Maaybe pop the window up at the mouse.

- Add options to the application.

Thursday, June 11, 2020

Never Say Always

I am FAR from a guru... or anything resembling one. I am self taught so often I know things, but am unfamiliar with their terminology. I may be unfamiliar with commonly taught problems or patterns. So don't give my thoughts too much weight.

I just watched yet another "Why <Insert Name> programming is horrible" video. In this case it was OOP (Which I personally like). I've seen a few of these. It is always fun to hear the criticisms of various languages or programming patterns or editors etc. The arguments typically go:

1. <Insert Name> is terrible. You should never use it (Gotta get the clicks).

2. Here's some arguments why it sucks.

3. But... sometimes it's useful.

4. Use <Insert Name> but not all the time.


I say use whichever paradigm works - when it works. It's like Kung Fu. If you are sparring and you are a 'kickarian' when you opponent has moved in past your kicking range, into elbow range let's say. Forcing a kick to happen is ridiculous. You need to throw some 'bows. Forcing everything into an object is just as bad... so is forcing everything to be procedural, or 100% CSS, or whatever the extreme proposition is. If it works best in a situation, use it.

Monday, May 25, 2020

Everything Sucks

I have just decided that I am going to expand my knowledge by reading about how sucky everything is.

I was going on another mental tirade about how HTML and CSS sucks. How it SHOULDN'T be so difficult to lay out front end elements. And there shouldn't be so many dang brackets and other code elements. So tedious. Anyway. I decided to search the webs to see if this sentiment is shared by anyone or if I just don't know what I'm talking about. Turns out it's the latter.

In my searching I found some really great articles that taught me a lot through other people's gripes. What a fun and entertaining way to learn more about topics I'm already somewhat familiar with. By calling out pain points and bad practices I can learn not only what to avoid and what to do instead, but why.

Tuesday, May 12, 2020

Gutting WP

I'm working on a website designed to show off my designs as well as the designs of others. I can promote designers I admire and share cool art, resources, architecture, anything cool I find online. My goal is to build traffic through networking.

I began the site as a fully hand coded website, from scratch. To deal with dynamic elements I was going to create a WordPress blog and read the posts as JSON. I got it working perfectly... until I uploaded it. Then I hit the dreaded cross domain limitation. After wrestling with this for a while I decided to bite the bullet and make my site fully WP. BUT I grabbed a completely bare bones theme as a starting point. It was pretty much style-less. So it was a perfect choice.

I've gutted the templates and ported over what I had coded. Then I used WP methods to populate portions of my site from pages or specific category posts. It still has issues, and the look is weak, but the back end is nearly complete.

http://norman.atwebpages.com/

Monday, May 4, 2020

Design

I am obsessing over design lately. I would love to design watches, furniture, architecture. Sad that my interest in it came 20+ years after art school. But I'm thinking about exploring it any way. My plan is to put together a site. Its objective is to get exposure for my designs. To do so I'll try networking by highlighting other peoples' work and designs I like.

Even if it does nothing for my design ambitions it will be a good place to showcase my various creative projects.

Due to the power of the platform I think I'll start out using WordPress. Later I want to move it over to something I've built from the ground up but for now WP will be fine.

Thursday, April 16, 2020

I've Done It

Well I've done it! I've created a relative path method that can walk up into another folder and back down until it finds the file! So it can generate relative paths even if the song files are not within a directory within the playlist. The task was easier than I expected. I use two strings one for walking up the path and another for walking back down to the specified sibling directory. Then I add the file name.

I've begun moving over my mp3s and setting their tags and adding them to playlists in my playlist manager. So far everything is working well.

I do have to rename my application. It manages playlists, not mp3s. We'll see how tough a change that will be.

Monday, April 13, 2020

The MP3 Problem

I have years of collected MP3s. They are arranged in directories, some by band name, others by genre, and still others by 'playlist' (New Years, Birthday, etc). The trouble is I have numerous duplicates of many of my song files. I want to have one single source of MP3s added to various playlists. However I need those playlists copied to different directories so I can copy them to my phone. There are a few apps out there that do this but so far I have not found a tool to meet my needs.

I decided to build a simple playlist manager with my specific scenario in mind. Then I would cleanup file names and get all the ID3 tags set on ALL my song files and copy them into one directory. A massive 'nosql database' of songs. No duplicates. Any duplication would occur in the playlists, not in mp3 files themselves. I would then create playlists for whatever I want. These would be used to export their songs to whatever directory I want for copying to my phone etc.

I set to work. Creating a console app with super basic 'file browse' methods etc. It kept everything in a database and would copy files out to wherever. However it wasn't very friendly to use (Even for a console app lol), it was time consuming and I kept see weird bugs and odd behavior.

So I gave up.

Then I thought of a different tack to take. I would build it as a GUI app that essentially creates standard .pls files. However, even though it is basically a text editor, it is used more like a playlist manager. You create, or open a playlist and add songs to it. You can delete songs just by highlighting the text and deleting it. When you save the file it goes through and fixes the relative paths and rebuilds the entries for each file present in the text editor.

Then you can export the currently open playlist's files to another directory. This is all working so far! However I really need to update the relative path code to be able to walk up and into sibling directories etc. It currently can only handle child directories.

In the future I may update it to a more logical control like a grid or list, but the text field works fine for now.
I am currently cleaning up all my song file names and setting their ID3 tags. This is going to take a LONG time.

Monday, April 6, 2020

RDP Fail

Remote Desktop in Linux remains elusive. I have tried time and again. I've tried a couple different servers, a couple different clients. I've tried tweaking the firewall rules, did chmod changes. And still nothing. The client prompts me for my login then it just gives up.

Now I'm unable to even smb to my tower. So I'll need to uninstall the firewall I installed per an RDB tutorial. This is all very frustrating. I understand security but this is all within my home network, surely it shouldn't be this difficult. I can SSH into the machine, not sure why I can't get RDP to work.

I'll post an update when I finally succeed.

Saturday, March 21, 2020

Slick Help

I have added more features to the markdown parser I wrote the other day. I added tables, and the ability to set column widths. So it isn't really a standard Markdown. The tables feature ended up working better than I thought it was going to.

I added the ability to link to other topics within the help system. This task was actually pretty tricky. Every time a help system is compiled the topics get new GUIDs, so I couldn't rely on those - and even if I could, how would the author know what the GUIDs are? I decided to add an alias property to the topics in the DB. This property can be used to link to other topics - and - display a 'back' link if a second alias is in the markdown. It worked smoothly.

Next I tackled images. I created two types of image definitions, one that uses a relative path to an Images directory, and the other a full URL. It is limited, but the idea of Markdown is to quickly define a readable document, formatting syntax should be fairly unobtrusive. I may allow for centered or text wrapped images though. It would be good to at least allow that much formatting.

I'm surprised at how fun and powerful this help engine is, now that I added markdown ability to the authoring of topics!

Monday, March 2, 2020

Neon Arches of Chaos

What a roller coaster ride. I decided to try an Arch Linux install again, in a VirtualBox instance. I got close, but it still wasn't booting correctly. I think my Grub installation wasn't done correctly. But this got me wanting to update my laptop OS. It has been a while. I decided to run Mint with a KDE desktop installed.

I installed it but wasn't able to get to the Grub menu so my laptop kept freezing. I needed to do the Nvidia fix and it wouldn't let me so I was stuck.

On MSI machines (Maybe all machines, I'm not sure) the Shift key, held down after the logo, brings up the Grub menu. This wasn't working on my machine - I don't know why. I was able to hit F11 to get to the boot device selection list. I hit enter to launch my Mint system and immediately hit 'E' a bunch of times. It worked! It brought up the Grub editor. I made my changes and all was copacetic.

Until it wasn't.

I couldn't get the KDE desktop to install, and really wanted a clean start. So I decided to rebuild and just get used to XFCE. But I couldn't get into the Grub editor, not even with my F11 trick.
I decided to edit it via the live image. This was educational! I learned you have to mount certain system drives etc, install Grub and edit the .cfg. However I was doing something wrong, it never worked.

I decided to try KaOS. I grabbed an image and 'dd'd it onto my USB. Nope. It failed to install. I later read that its installer is somewhat unstable.

I did some more searching and came upon KDE neon. I decided to give it a try. It apparently is more up to date than Kubuntu. I downloaded it and installed it. To my surprise it ran without any issues! No need to do the NVDIA fix. I think I have a new favorite distro! So far I've had ZERO issues with it.

Tuesday, February 4, 2020

Stitching

Happy 02022020 (Well at the time I started writing this)!
I have good news to report on the space mining rererewrite: It's going really well so far. I have changed the core class structure from previous rewrites.

This time I have spread out the tasks so that the GamePanel isn't doing all the work. Keypresses etc are handed off to the Level class, and it has specific level type classes under it - for space, surface, etc. And later I'll make these totally generic, so you can define any amount of sublevels, of any kind, via config files. The goal is to make the game totally moddable - so much so, the game actually becomes more of a game engine that builds randomly generated top down arcade games.

I have coded the seamless loading of level sectors and just need to code the reloading of the stored sector data. I have that piece done but need to restore the last saved position.

Introduction to WorldWeaver

A New Iteration  I've been working on the second manifestation of my Interactive Fiction engine - WorldWeaver - for about a year now. I ...