Archive for the Uncategorized Category

Scaling the input frequency

Posted in Uncategorized on November 11, 2015 by pcedev

So.. I’m writing this wave file converter, adding all kinds of support and options, when I came across the issue of storing multiple samples of the same origin but different octaves. This is an optimization technique to help retain frequency ranges within an instrument.

So to visualize this; the main driver always outputs 7khz. It doesn’t matter what the input frequency is, the output frequency is fixed. Now, to scale a frequency on the fly – the fastest way is to do nearest neighbor scaling. If you think of it as in terms of graphics, a waveform is just a single scanline. That’s it. One scanline. The brightness of a pixel is the amplitude of the waveform. And how does nearest neighbor scaling work on a fixed resolution scanline? You either repeat pixels or skip pixels, all depending if you want to shrink or inflate that image on that single scanline.

Anybody who’s worked in photo editing software, has seen this effect first hand. But it’s even simpler than that; the SNES mode 7. We’re all aware what happens when the snes scales up – it gets blocky. But pay attention to when the image is at a point that is smaller than 1:1. I.e. in shrunken state. The pixels become distorted. This is because the pixels in the shrunken image cannot appear in between the real pixels of 256 resolution. One option, is to increase the horizontal resolution so the steps become finer. The snes obviously doesn’t have this option. But there still comes a point where the image shimmers, as it moves in and out of zoom. That’s where other fancy techniques come into play and interpolate the distance between pixels, and distributes that.. etc.

Audio works much in the same way, but our brain is more forgiving when it comes to sounds than visual data anomalies. So what’s the issue here? How can we solve this?

First, the issue is this: the output frequency of the PCE TIMER driver is 7mhz MAX. If you scale a waveform to play at a frequency below 7khz, then it’ll play just fine with all the data intact (no missing samples). But here’s the catch, you get no resolution benefit for those repeated samples. In other words, you are not working with the optimal frequency band of 7khz. If I scaled a waveform that has a 1:1 rate of 7khz, to 1:2 rate of 3.5khz.. that 7khz main driver gives it zero benefit. Quite the opposite; I’m losing potential frequency resolution output.

Now, this needs to be understood in a larger context. The idea is to avoid issue when the input frequency is higher than the output frequency – anything greater than 1:1 (like 2:1, 4:1, etc). When this happens, you get all sorts of frequency anomalies as well as unintended reflections back into the output (nyquist frequency artifacts). So one approach is to store an instrument sample in multiple octaves. When you move out of that octave range, you switch to a different sample in that group. It cleans up the sound and removes this audio artifacts from the scaling routine. There’s also the added benefit that scaling with nearest neighbor, takes nothing into account. You can be destroying potential frequency ranges simply by skipping <n> amount of samples. If you properly resample, with an external app, you can get those frequency ranges back. Well, to a point – but it’s soo much better than simply skipping samples. Think of this as mip-mapping of textures for 3D graphics. It’s much the same application, although for different reasons.

Ok. So we have this approach that fixes upward scaling (shrinking) by mip-mapping our octave range for a given instrument. The second issue arises now. If all samples in a mip-map range are 1:1, then the difference from (octave+1) to (octave) is the frequency divided by 2. So you work with 7khz from the top and as you go down in notes (notes that approach the octave one step below the current one), the input frequency falls below 7khz. Normally, if the output driver is of high enough frequency, then this wouldn’t be so big of an issue. But 7khz is pretty low as it is, and you definitely want to keep every single HZ of that driver output at such a low rate. Linear interpolation is the derivative of the main function; the distance between two points. [f(x+a)-f(a)]\(x-a). It’s the slope formula. The change in Y over the change in X. In this case, the change in X is one – so (x-a) is redundant. Using the delta symbol, [f(Δx)-f(x)]\Δx.

Doing linear interpolation on the PCE isn’t difficult, but doing it real time is still requires some additional steps. If a sound engine is approaching 20%,30%,.. 50% cpu resource, then you want to save as many cycles as you can. The idea instead, is to encode this one sample interpolation into the wave form itself. Where would you put it? In between two samples that it’s derived from. This automatically doubles the waveform in size, but more importantly double the waveform in size played back on a fixed frequency is the original waveform played back one octave lower (or half its speed). The doesn’t help us directly, but what if the input drive (the frequency scaler) always skipped two samples – regardless of the waveform? Or rather, if you want 1:1 playback of a waveform, you set the input driver to 2:1. Since the frequency of the waveform is double, and the input driver is now default to 2:1 for the top frequency, the original waveform plays back without any artifacts – even though we’re above the nyquist limit (the output driver).

The benefit here, is realized that if the top limit of the input driver is n:1, with n=2, then as n approaches 1… the interpolated samples get played back instead of repeated samples. At 5bit resolution depth, it might not have a huge impact in the output range. But as you approach 8bit resolution, this becomes more significant. 6bit is twice the resolution of 5bit in audio output. That’s a lot.

So anyway, this approach maximizes the output quality of an instrument sample as you work your way through the mip-map set. The only question here now is, what’s better than linear interpolation? What would make a smoother transition from one mip-map sample to another? Maybe if you actually embedded the sample below it into gaps in the sample above it? Of course, those individual samples would have to be resampled separately by themselves, before being inserted back into the “gaps” – else it just because the original again. I’m not sure which method is better. Maybe a blend of the sample below it with the linear interpolation, and have the weight of that blend as it approaches the lower octave. I’d have to do some tests to see if there’s an audio benefit.

This is one of the features I’m working on adding to my wave converter. I was going to do the resampling myself, on the input waveform, but Cool Edit Pro does such a nice job for me. It wins out in sheer lazy-ness factor. I just added the option for linear interpolation or embedded two input wave files.

Advertisements

PCM engines

Posted in Uncategorized on November 9, 2015 by pcedev

I’ve already stated that I’m redoing the 4 channel XM engine, and it’s up and running with a few looped notes until I finish parsing a particular mod file for simple demonstration, but I also have another engine I threw it together over a couple of hours on the weekend; an 8 channel static PCM player. 8 PCM channels at 6bit (higher than the native 5bit) and still leaves 4 normal PCE channels. Yeah, a total of 12 channels.

The second engine required more support though. The first engine only required a small 384 word table. This second engine, because all the PCM channels are mixed in software, requires volume tables because multiplying each sample is waaayy out of the scope of the PCE – tables do the work even faster. The PCM format also needs to be in 2’s complemented numbers. The PCM data might be 6bit, but it’s in 8bit format as signed numbers. Maybe this is overkill, but it just feels cleaner than adding any possible side effect because it’s not centered (a relative centerline). I’ve done mixing in software before with unsigned samples, but the center line moves around (the waveforms still accumulate the same). It just doesn’t sit well with me, so 2’s complement signed format it is. But that means the volume table has to include all 256 entries even it only uses 6bit resolution/values. At 32 levels of volume control, that’s an 8k table. Doesn’t need to be ram; fits anywhere in rom.

But yeah, so it needs more support/tools surrounding it. I had to make a wave file converter in C. I needed to make one anyway, so this isn’t a total waste of time. So what does this engine eat up cpu wise? about 21-22% cpu resource. I kid you not. 8 PCM channels, at 6bit vs 5bit, and still have 4 PCE channels left over – all faster than Air Zonk does to play a single PCM channel. Yeah, Air Zonk has a horrible PCM routine that eats up 30-33% cpu resource. I couldn’t believe it, but I checked it about 20 times over, and each time was 30 to 33% (33% when it has to fetch a new sample to bit shift, 30% when it’s just playing that sample).

Keep in mind, none of these 8 channels in the second engine scale in frequency like the first engine. It’s actually nothing super special or radical. 8 channels are soft mixed, with volume control for each channel, into a single buffer. That buffer is played using two PCE DDA channels to output 10bit audio. That’s it. The other downside is that it’s mono. If you want stereo, you have to take away another two PCE channels for a second 10bit paired output. Not enough channels you say? Want stereo you say? Well, bump up that number up to 37.3% cpu resource and get 16 PCM channels – stereo. You still have 2 regular PCE channels left over. For an extra 5% cpu resource on top of that, I can make 4 of those stereo channels frequency scale XM style. So many options…

That’s ridiculous! What the hell would someone do with 16 PCM 6bit stereo channels!?  But hey, 18 channels on the PCE would make a great demo – no? Brag rights and all that sort of thing, I guess. Does the PCE have enough power to do more than 18 channels? Don’t ask. But yes. It does.

Email and server is back up..

Posted in Uncategorized on October 30, 2015 by pcedev

I’m currently reconciling all the stuff between my laptop and new desktop setup. I don’t think my laptop is going to survive much longer.

SamIam and I talked about the possibility of a dub for Spriggan Mark 2. That’s all I’ll mention at the moment on that.

I finished my final for one my classes, so things I’ve got more free time, which is one of the reasons why I’m setting up my desktop system; pce dev stuffs. In an attempt to get more organized, I’m going through and trying to make a list of all the wonderful things and possibilities of PCE stuffs that I want to do. I have a terrible time trying to keep track of all these things, so I need to organize them into a system. I tend to forget about things. It’s not that I lose interest, but I forget and pick up other interesting stuffs.

Anyway, just an update. Also, if you come across anything that appears damaged (file wise) for my links, let me know.

Moved in

Posted in Uncategorized on September 7, 2015 by pcedev

I got my new place and starting moving stuff out of storage. PCE and SGX+SCD are setup. Just need to setup my dev PC.

PCE Chiptunes

Posted in Uncategorized on August 21, 2015 by pcedev

Check out the other videos (more PCE chiptunes).

Reporting in…

Posted in Uncategorized on July 24, 2015 by pcedev

Wow, it’s been a crazy year for me. I apologize for the lack of updates, but one of the keys to a successful semester is for me to remove all distractions. I have a 4.0 for these past three semesters (took a full summer semester; that nearly kicked my arse!) and have worked hard to achieve that GPA. Anyway, I’m just trying to catch up to see what’s happening in the scene and such. I’ve read the comments you guys have posted over the past few months (and approved them) – thanks! If you’ve been approved once, to have your comment show up, then you can post as many as you like without having to have them approved each time afterwards.

My Mom is doing a lot better now – the medication is working (though she has to take it for the rest of her life). She’s feeling sooo much better too. My older son had some serious trouble this past year and had to be hospitalized. He’s been diagnosed with crohn’s disease, which basically is where your own body/immune system attacks your digestive track/intestines. They became so inflamed that they weren’t pulling any nutrients/calories from his food; he was basically starving to death. He lost 60lbs, and all his blood work was dangerously off (had to be hospitalized), and could barely stand or walk. They were going to do surgery (to remove parts of his intestines), but the medication they have him on is currently working and he’s starting to gain back the weight (as of this past month). If you’re a parent, then I don’t need to begin to explain how it feels to watch your child go through this (he’s 19 year old, but he’s still my child). Once he gets his health back up, I’m gonna try to convince him to start on his computer science degree.

My younger son, 13 years old, just finished his first college class. He met the legal age for community college and so for his birthday I paid for him to take a math course over the summer at the same campus I’m attending. He just completed 7th grade, and he amazingly passed all the assessment tests into college level reading, writing, and math. He’s never had an algebra class, but I’ve taught him algebra stuffs since he was little. He tested right under college algebra, and so he took an Algebra-II class and passed it with an A; his first college class. If he took one math class each semester in college while attending regular school, he’d be done with all three calculus classes (Calc I, II, III) by the time he starts his 2nd year in high school. Crazy. I took trig this summer so I can start calc this fall, and so he learned a little trig this summer too. He definitely has a brain for math – lol.

Life sure is a roller coaster. And the best you can do, sometimes, is just hold on as tight as you can. Anyway, I have 20 days of “vacation” from school this August, so I need to catch up on some PCE related stuffs.

Update: November

Posted in Uncategorized on November 15, 2014 by pcedev

I’ve completely underestimated college. I’ve got some free time from one class finished up, but I’ve since filled that with work (trying to save cash like crazy). I’ve ran some numbers and at the going rate, I won’t have enough loan money and financial aid/grants to finish getting my degree (and I qualify for the max amount). I’ll run out around the last year or so. Working federal study (20 hours a week) only provides minimum wage and I’ve included that into the numbers and analysis as well. This means I need to maintain a highest GPA possible to hopefully qualify for yearly scholarships. Pima College (state community college) is only $1,700 year for 28 credits, but the U of A, where I plan to get my undergrad in Computer Science, is $11,000 a year. Neither of those numbers include books or obviously cost of living. On top of that, all math classes (Calc I,II,III, Linear Alg, Diff Equ) and *any* supporting science class all ~need~ to be have a ‘B’ or higher in grade completion, else I won’t be accepted in the last major part of the program; they aren’t messing around ;>_> That was an eye opener.

Anyway, point being – I won’t have as much free time as I would like or had originally thought. That doesn’t mean I plan to abandon PCE coding (I’m not), but my progress in college is the highest priority, and the free time I do get for do PCE stuff – will be highly selective. That means those projects that I have on going, like nes2pce stuff, will probably not see much action or attention (if any). I have winter break coming up, and I have summer break later on. Those are the times where I’ll probably be the most productive. Looking back now, I’ve clearly wasted time that could have easily been put to PCE stuffs. But hindsight is 20/20, as they say…