- Added reverse stereo flag for stereo samples, and reverse playback for the pattern. Not sure if I’ll keep them in, but it would be amusing to support both as effects or order features. I had in mind some parts of the Streets of Rage 3 soundtrack where a melody will play, and then play back in reverse.
- Added a pitch setting for notes.
- Tested adding linear interpolation to the mixer function. I would like for interpolation to be configurable, either on a per-channel or per-instrument basis, maybe with a full environment override as well. In Milky, it’s an application-wide setting as far as I can tell. Interpolation helps with longer samples, but it can also remove the bite from square waves and other short period samples, especially at lower frequencies.
- Added a (very simple) low-pass filter based on this example by Kirit Chatterjee.
- When I added linear interpolation earlier, I only tested it with mono samples. The stereo sample playback broke very badly along the way, and I didn’t notice the problem until this evening. This is the first time I’ve really gotten a lot of screeching audio of the “opening the gates of hell” variety.
- Added support for mixing 8-bit unsigned WAV samples.
- Added something like the Key Scaling Level feature in AdLib Tracker II, where the volume of a channel can be reduced by a certain factor with every octave. I think my implementation isn’t quite correct, but should be OK for now as a prototype. Testing it out with a sine wave sample, I do find myself preferring the volume to be a bit lower on higher notes.
- Added the ability to cross-fade when cutting over to a new sample when changing rows. Triggering new samples no longer causes a loud click or pop to occur. This is the last big missing piece of the mixer, I think. If you listen carefully, you can still hear a small ‘blep’ when the samples cut over, but it’s nowhere near as loud now. Woo!
- As suspected, Audacity’s Pitch Detect confirms that my playback is out of tune. Upon further investigation, long samples report the correct playback pitch, but short periodic samples are a little high. My first thought was there is a problem with re-positioning the sample after looping. Turns out it’s just a problem with my samples, and a lack of frequency correction. The sample length for a 440 Hz A4 note playing at 44100 Hz is 100.227272727, and samples can’t have fractions, so … a 100 sample-point sample won’t cut it on its own. Oops. I’ll look into frequency correction once I have more of an interface to work with.
The mixing function itself has become a bit long and could probably stand to be chopped up into a few smaller functions. While I’ve done no real optimization work, performance at four channels seems OK so far. Interface is still read-only, I’ll have to start working on that because entering note data in the source code is a pain.